コード例 #1
0
        private void AddTagsButtons_Click(object sender, EventArgs e)
        {
            var o = OriginTreeView;

            if (o.SelectedNode == null)
            {
                return;
            }

            CatAndTagsList filteredTags =
                sender == AndButton ? TagsFilter.AndTags :
                sender == OrButton ? TagsFilter.OrTags :
                TagsFilter.NotTags;

            // Parent node = category, child node = tag
            bool   isCategory = o.SelectedNode.Parent == null;
            string cat        = isCategory ? o.SelectedNode.Text : o.SelectedNode.Parent !.Text;

            CatAndTags?match = null;

            for (int i = 0; i < filteredTags.Count; i++)
            {
                if (filteredTags[i].Category == cat)
                {
                    match = filteredTags[i];
                }
            }
            if (match == null)
            {
                filteredTags.Add(new CatAndTags {
                    Category = cat
                });
                if (!isCategory)
                {
                    CatAndTags last = filteredTags[filteredTags.Count - 1];
                    last.Tags.Add(o.SelectedNode.Text);
                }
            }
            else
            {
                if (isCategory)
                {
                    match.Tags.Clear();
                }
                else
                {
                    string tag = o.SelectedNode.Text;
                    if (!match.Tags.ContainsI(tag))
                    {
                        match.Tags.Add(tag);
                    }
                }
            }

            FillTreeView(filteredTags);
        }
コード例 #2
0
        private void RemoveAllButtons_Click(object sender, EventArgs e)
        {
            CatAndTagsList tags =
                sender == RemoveAllAndButton ? TagsFilter.AndTags :
                sender == RemoveAllOrButton ? TagsFilter.OrTags :
                TagsFilter.NotTags;

            tags.Clear();

            FillTreeView(tags);
        }
コード例 #3
0
        private void CheckTagInAny()
        {
            var o = OriginTreeView;

            if (o.SelectedNode == null)
            {
                return;
            }

            // Parent node = category, child node = tag
            bool   isCategory = o.SelectedNode.Parent == null;
            string cat        = isCategory ? o.SelectedNode.Text : o.SelectedNode.Parent !.Text;

            bool tagInAny = false;

            for (int t = 0; t < 3; t++)
            {
                CatAndTagsList filteredTags = t switch
                {
                    0 => TagsFilter.AndTags,
                    1 => TagsFilter.OrTags,
                    _ => TagsFilter.NotTags
                };


                CatAndTags?match = null;
                for (int i = 0; i < filteredTags.Count; i++)
                {
                    if (filteredTags[i].Category == cat)
                    {
                        match = filteredTags[i];
                    }
                }
                if (match != null)
                {
                    if (isCategory || match.Tags.ContainsI(o.SelectedNode.Text) ||
                        (match.Category == o.SelectedNode.Parent !.Text && match.Tags.Count == 0))
                    {
                        tagInAny = true;
                        break;
                    }
                }
            }

            AndButton.Enabled = !tagInAny;
            OrButton.Enabled  = !tagInAny;
            NotButton.Enabled = !tagInAny;
        }
コード例 #4
0
        private void RemoveSelectedButtons_Click(object sender, EventArgs e)
        {
            CatAndTagsList tags =
                sender == RemoveSelectedAndButton ? TagsFilter.AndTags :
                sender == RemoveSelectedOrButton ? TagsFilter.OrTags :
                TagsFilter.NotTags;

            var tv =
                sender == RemoveSelectedAndButton ? AndTreeView :
                sender == RemoveSelectedOrButton ? OrTreeView :
                NotTreeView;

            if (tv.SelectedNode == null)
            {
                return;
            }

            // Parent node (category)
            if (tv.SelectedNode.Parent == null)
            {
                CatAndTags?cat = tags.FirstOrDefault(x => x.Category == tv.SelectedNode.Text);
                if (cat != null)
                {
                    tags.Remove(cat);
                }
            }
            // Child node (tag)
            else
            {
                CatAndTags?cat = tags.FirstOrDefault(x => x.Category == tv.SelectedNode.Parent.Text);
                string?    tag = cat?.Tags.FirstOrDefault(x => x == tv.SelectedNode.Text);
                if (tag != null)
                {
                    cat !.Tags.Remove(tag);
                    if (cat.Tags.Count == 0)
                    {
                        tags.Remove(cat);
                    }
                }
            }

            FillTreeView(tags);
        }
コード例 #5
0
        private void FillTreeView(CatAndTagsList tags)
        {
            var tv =
                tags == TagsFilter.AndTags ? AndTreeView :
                tags == TagsFilter.OrTags ? OrTreeView :
                NotTreeView;

            tv.SuspendDrawing();
            tv.Nodes.Clear();
            foreach (CatAndTags catAndTags in tags)
            {
                tv.Nodes.Add(catAndTags.Category);
                var last = tv.Nodes[tv.Nodes.Count - 1];
                foreach (string tag in catAndTags.Tags)
                {
                    last.Nodes.Add(tag);
                }
            }

            tv.ExpandAll();
            tv.ResumeDrawing();

            CheckTagInAny();
        }
コード例 #6
0
        // Very awkward procedure that accesses global state in the name of only doing one iteration
        // TODO: Test perf when 1000+ FMs each have a bunch of tags
        internal static void AddTagsToFMAndGlobalList(string tagsToAdd, CatAndTagsList existingFMTags)
        {
            if (tagsToAdd.IsEmpty())
            {
                return;
            }

            string[] tagsArray = tagsToAdd.Split(CA_CommaSemicolon, StringSplitOptions.RemoveEmptyEntries);

            foreach (string item in tagsArray)
            {
                string cat, tag;

                int colonCount = item.CountCharsUpToAmount(':', 2);

                // No way josé
                if (colonCount > 1)
                {
                    continue;
                }

                if (colonCount == 1)
                {
                    int index = item.IndexOf(':');
                    cat = item.Substring(0, index).Trim().ToLowerInvariant();
                    tag = item.Substring(index + 1).Trim();
                    if (cat.IsEmpty() || tag.IsEmpty())
                    {
                        continue;
                    }
                }
                else
                {
                    cat = "misc";
                    tag = item.Trim();
                }

                // Note: We've already converted cat to lowercase, so we just do straight == to shave time off

                #region FM tags

                CatAndTags?match = null;
                for (int i = 0; i < existingFMTags.Count; i++)
                {
                    if (existingFMTags[i].Category == cat)
                    {
                        match = existingFMTags[i];
                        break;
                    }
                }
                if (match == null)
                {
                    existingFMTags.Add(new CatAndTags {
                        Category = cat
                    });
                    existingFMTags[existingFMTags.Count - 1].Tags.Add(tag);
                }
                else
                {
                    if (!match.Tags.ContainsI(tag))
                    {
                        match.Tags.Add(tag);
                    }
                }

                #endregion

                #region Global tags

                GlobalCatAndTags?globalMatch = null;
                for (int i = 0; i < GlobalTags.Count; i++)
                {
                    if (GlobalTags[i].Category.Name == cat)
                    {
                        globalMatch = GlobalTags[i];
                        break;
                    }
                }
                if (globalMatch == null)
                {
                    GlobalTags.Add(new GlobalCatAndTags {
                        Category = new GlobalCatOrTag {
                            Name = cat, UsedCount = 1
                        }
                    });
                    GlobalTags[GlobalTags.Count - 1].Tags.Add(new GlobalCatOrTag {
                        Name = tag, UsedCount = 1
                    });
                }
                else
                {
                    globalMatch.Category.UsedCount++;

                    GlobalCatOrTag?ft = null;
                    for (int i = 0; i < globalMatch.Tags.Count; i++)
                    {
                        if (globalMatch.Tags[i].Name.EqualsI(tag))
                        {
                            ft = globalMatch.Tags[i];
                            break;
                        }
                    }
                    if (ft == null)
                    {
                        globalMatch.Tags.Add(new GlobalCatOrTag {
                            Name = tag, UsedCount = 1
                        });
                    }
                    else
                    {
                        ft.UsedCount++;
                    }
                }

                #endregion
            }
        }