private void RemoveItem(PathTuple <TConfigType> itemTuple)
 {
     ItemsByPath.Remove(itemTuple.Path);
     ItemsByFolder.Remove(Path.GetDirectoryName(itemTuple.Path));
     Items.Remove(itemTuple);
     OnRemoveItem?.Invoke(itemTuple);
 }
    /// <summary>
    /// Populates the mod list governed by <see cref="Items"/>.
    /// </summary>
    private void GetItems(bool executeImmediately, CancellationToken cancellationToken = default)
    {
        try
        {
            var itemTuples = _getAllConfigs();

            // Set new collection of mods by path.
            ItemsByPath.Clear();
            ItemsByFolder.Clear();
            foreach (var item in itemTuples)
            {
                ItemsByPath[item.Path] = item;
                ItemsByFolder[Path.GetDirectoryName(item.Path)] = item;
            }

            if (executeImmediately)
            {
                Collections.ModifyObservableCollection(Items, itemTuples);
            }
            else
            {
                _context.Send((x) =>
                {
                    Collections.ModifyObservableCollection(Items, itemTuples);
                }, null);
            }
        }
        catch (Exception)
        {
            // ignored
        }
    }
 private void OnDeleteDirectory(object sender, FileSystemEventArgs e)
 {
     if (ItemsByFolder.TryGetValue(e.FullPath, out var deletedMod))
     {
         _context.Post(() =>
         {
             RemoveItem(deletedMod);
         });
     }
 }