private void SortThumbnails()
        {
            thumbnailFlowPanel.SortChildren(delegate(Panel x, Panel y)
            {
                var favMarkerX = (Blish_HUD.Controls.Image)x.Children.FirstOrDefault(m =>
                                                                                     m.BasicTooltipText != null && (m.BasicTooltipText.Equals(FavoriteMarkerTooltip) ||
                                                                                                                    m.BasicTooltipText.Equals(UnfavoriteMarkerTooltip)));
                var favMarkerY = (Blish_HUD.Controls.Image)y.Children.FirstOrDefault(m =>
                                                                                     m.BasicTooltipText != null && (m.BasicTooltipText.Equals(FavoriteMarkerTooltip) ||
                                                                                                                    m.BasicTooltipText.Equals(UnfavoriteMarkerTooltip)));
                if (favMarkerX != null && favMarkerY != null)
                {
                    var favorite = string.Compare(favMarkerY.BasicTooltipText, favMarkerX.BasicTooltipText,
                                                  StringComparison.InvariantCultureIgnoreCase);
                    if (favorite != 0)
                    {
                        return(favorite);
                    }
                }

                return(string.Compare(Path.GetFileNameWithoutExtension(x.BasicTooltipText),
                                      Path.GetFileNameWithoutExtension(y.BasicTooltipText),
                                      StringComparison.InvariantCultureIgnoreCase));
            });
        }
        private Panel BuildSettingPanel(Rectangle panelBounds)
        {
            var etPanel = new Panel()
            {
                CanScroll = false,
                Size      = panelBounds.Size
            };

            var ddSortMethod = new Dropdown()
            {
                Location = new Point(etPanel.Right - 150 - Dropdown.Standard.ControlOffset.X, Dropdown.Standard.ControlOffset.Y),
                Width    = 150,
                Parent   = etPanel,
            };

            int topOffset = ddSortMethod.Bottom + Panel.MenuStandard.ControlOffset.Y;

            var menuSection = new Panel {
                Title      = "Event Categories",
                ShowBorder = true,
                Size       = Panel.MenuStandard.Size - new Point(0, topOffset + Panel.MenuStandard.ControlOffset.Y),
                Location   = new Point(Panel.MenuStandard.PanelOffset.X, topOffset),
                Parent     = etPanel
            };

            var eventPanel = new FlowPanel()
            {
                FlowDirection  = ControlFlowDirection.LeftToRight,
                ControlPadding = new Vector2(8, 8),
                Location       = new Point(menuSection.Right + Panel.MenuStandard.ControlOffset.X, menuSection.Top),
                Size           = new Point(ddSortMethod.Right - menuSection.Right - Control.ControlStandard.ControlOffset.X, menuSection.Height),
                CanScroll      = true,
                Parent         = etPanel
            };

            GameService.Overlay.QueueMainThreadUpdate((gameTime) => {
                var searchBox = new TextBox()
                {
                    PlaceholderText = "Event Search",
                    Width           = menuSection.Width,
                    Location        = new Point(ddSortMethod.Top, menuSection.Left),
                    Parent          = etPanel
                };

                searchBox.TextChanged += delegate(object sender, EventArgs args) {
                    eventPanel.FilterChildren <DetailsButton>(db => db.Text.ToLower().Contains(searchBox.Text.ToLower()));
                };
            });

            foreach (var meta in Meta.Events)
            {
                var setting = _watchCollection.DefineSetting("watchEvent:" + meta.Name, true);

                meta.IsWatched = setting.Value;

                var es2 = new DetailsButton {
                    Parent           = eventPanel,
                    BasicTooltipText = meta.Category,
                    Text             = meta.Name,
                    IconSize         = DetailsIconSize.Small,
                    ShowVignette     = false,
                    HighlightType    = DetailsHighlightType.LightHighlight,
                    ShowToggleButton = true
                };

                if (meta.Texture.HasTexture)
                {
                    es2.Icon = meta.Texture;
                }

                var nextTimeLabel = new Label()
                {
                    Size                = new Point(65, es2.ContentRegion.Height),
                    Text                = meta.NextTime.ToShortTimeString(),
                    BasicTooltipText    = GetTimeDetails(meta),
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment   = VerticalAlignment.Middle,
                    Parent              = es2,
                };

                Adhesive.Binding.CreateOneWayBinding(() => nextTimeLabel.Height, () => es2.ContentRegion, (rectangle => rectangle.Height), true);

                if (!string.IsNullOrEmpty(meta.Wiki))
                {
                    var glowWikiBttn = new GlowButton {
                        Icon             = GameService.Content.GetTexture("102530"),
                        ActiveIcon       = GameService.Content.GetTexture("glow-wiki"),
                        BasicTooltipText = "Read about this event on the wiki.",
                        Parent           = es2,
                        GlowColor        = Color.White * 0.1f
                    };

                    glowWikiBttn.Click += delegate {
                        if (UrlIsValid(meta.Wiki))
                        {
                            Process.Start(meta.Wiki);
                        }
                    };
                }

                if (!string.IsNullOrEmpty(meta.Waypoint))
                {
                    var glowWaypointBttn = new GlowButton {
                        Icon             = GameService.Content.GetTexture("waypoint"),
                        ActiveIcon       = GameService.Content.GetTexture("glow-waypoint"),
                        BasicTooltipText = $"Nearby waypoint: {meta.Waypoint}",
                        Parent           = es2,
                        GlowColor        = Color.White * 0.1f
                    };

                    glowWaypointBttn.Click += delegate {
                        System.Windows.Forms.Clipboard.SetText(meta.Waypoint);

                        ScreenNotification.ShowNotification("Waypoint copied to clipboard.");
                    };
                }

                var toggleFollowBttn = new GlowButton()
                {
                    Icon             = _textureWatch,
                    ActiveIcon       = _textureWatchActive,
                    BasicTooltipText = "Click to toggle tracking for this event.",
                    ToggleGlow       = true,
                    Checked          = meta.IsWatched,
                    Parent           = es2,
                };

                toggleFollowBttn.Click += delegate {
                    meta.IsWatched = toggleFollowBttn.Checked;
                    setting.Value  = toggleFollowBttn.Checked;
                };

                meta.OnNextRunTimeChanged += delegate {
                    UpdateSort(ddSortMethod, EventArgs.Empty);

                    nextTimeLabel.Text             = meta.NextTime.ToShortTimeString();
                    nextTimeLabel.BasicTooltipText = GetTimeDetails(meta);
                };

                _displayedEvents.Add(es2);
            }

            // Add menu items for each category (and built-in categories)
            var eventCategories = new Menu {
                Size           = menuSection.ContentRegion.Size,
                MenuItemHeight = 40,
                Parent         = menuSection,
                CanSelect      = true
            };

            List <IGrouping <string, Meta> > submetas = Meta.Events.GroupBy(e => e.Category).ToList();

            var evAll = eventCategories.AddMenuItem(EC_ALLEVENTS);

            evAll.Select();
            evAll.Click += delegate {
                eventPanel.FilterChildren <DetailsButton>(db => true);
            };

            foreach (IGrouping <string, Meta> e in submetas)
            {
                var ev = eventCategories.AddMenuItem(e.Key);
                ev.Click += delegate {
                    eventPanel.FilterChildren <DetailsButton>(db => string.Equals(db.BasicTooltipText, e.Key));
                };
            }

            // TODO: Hidden events/timers to be added later
            //eventCategories.AddMenuItem(EC_HIDDEN);

            // Add dropdown for sorting events
            ddSortMethod.Items.Add(DD_ALPHABETICAL);
            ddSortMethod.Items.Add(DD_NEXTUP);

            ddSortMethod.ValueChanged += delegate(object sender, ValueChangedEventArgs args) {
                switch (args.CurrentValue)
                {
                case DD_ALPHABETICAL:
                    eventPanel.SortChildren <DetailsButton>((db1, db2) => string.Compare(db1.Text, db2.Text, StringComparison.CurrentCultureIgnoreCase));
                    break;

                case DD_NEXTUP:
                    break;
                }
            };

            ddSortMethod.SelectedItem = DD_NEXTUP;
            //UpdateSort(ddSortMethod, EventArgs.Empty);

            return(etPanel);
        }
        private Panel BuildModulePanel(WindowBase wnd)
        {
            var homePanel = new Panel
            {
                Parent = wnd,
                Size   = new Point(WindowWidth, WindowHeight)
            };

            thumbnailFlowPanel = new FlowPanel
            {
                Parent         = homePanel,
                Size           = new Point(homePanel.ContentRegion.Size.X - 70, homePanel.ContentRegion.Size.Y - 130),
                Location       = new Point(35, 50),
                FlowDirection  = ControlFlowDirection.LeftToRight,
                ControlPadding = new Vector2(5, 5),
                CanCollapse    = false,
                CanScroll      = true,
                Collapsed      = false,
                ShowTint       = true,
                ShowBorder     = true
            };
            var searchBox = new TextBox
            {
                Parent          = homePanel,
                Location        = new Point(thumbnailFlowPanel.Location.X, thumbnailFlowPanel.Location.Y - 40),
                Size            = new Point(200, 40),
                PlaceholderText = SearchBoxPlaceHolder
            };
            var deleteSearchBoxContentButton = new Blish_HUD.Controls.Image
            {
                Parent   = homePanel,
                Location = new Point(searchBox.Right - 20 - PanelMargin, searchBox.Location.Y + PanelMargin),
                Size     = new Point(20, 20),
                Texture  = _deleteSearchBoxContentIcon,
                Visible  = false
            };

            deleteSearchBoxContentButton.Click += delegate
            {
                searchBox.Text = "";
                deleteSearchBoxContentButton.Hide();
            };
            deleteSearchBoxContentButton.MouseEntered += delegate
            {
                if (deleteSearchBoxContentButton.Visible)
                {
                    GameService.Animation.Tweener.Tween(deleteSearchBoxContentButton, new { Opacity = 1.0f }, 0.2f);
                }
            };
            deleteSearchBoxContentButton.MouseLeft += delegate
            {
                if (deleteSearchBoxContentButton.Visible)
                {
                    GameService.Animation.Tweener.Tween(deleteSearchBoxContentButton, new { Opacity = 0.8f }, 0.2f);
                }

                deleteSearchBoxContentButton.Size     = new Point(20, 20);
                deleteSearchBoxContentButton.Location = new Point(searchBox.Right - 20 - PanelMargin,
                                                                  searchBox.Location.Y + PanelMargin);
            };
            deleteSearchBoxContentButton.LeftMouseButtonPressed += delegate
            {
                deleteSearchBoxContentButton.Width   -= 2;
                deleteSearchBoxContentButton.Height  -= 2;
                deleteSearchBoxContentButton.Location = new Point(deleteSearchBoxContentButton.Location.X + 2,
                                                                  deleteSearchBoxContentButton.Location.Y + 2);
            };
            searchBox.InputFocusChanged += delegate { SortThumbnails(); };
            searchBox.TextChanged       += delegate
            {
                deleteSearchBoxContentButton.Visible = !searchBox.Text.Equals(string.Empty);
                thumbnailFlowPanel.SortChildren(delegate(Panel x, Panel y)
                {
                    var fileNameX  = Path.GetFileNameWithoutExtension(x.BasicTooltipText);
                    var fileNameY  = Path.GetFileNameWithoutExtension(y.BasicTooltipText);
                    x.Visible      = fileNameX.Contains(searchBox.Text);
                    y.Visible      = fileNameY.Contains(searchBox.Text);
                    var favMarkerX = (Blish_HUD.Controls.Image)x.Children.FirstOrDefault(m =>
                                                                                         m.BasicTooltipText != null && (m.BasicTooltipText.Equals(FavoriteMarkerTooltip) ||
                                                                                                                        m.BasicTooltipText.Equals(UnfavoriteMarkerTooltip)));
                    var favMarkerY = (Blish_HUD.Controls.Image)y.Children.FirstOrDefault(m =>
                                                                                         m.BasicTooltipText != null && (m.BasicTooltipText.Equals(FavoriteMarkerTooltip) ||
                                                                                                                        m.BasicTooltipText.Equals(UnfavoriteMarkerTooltip)));
                    if (favMarkerX != null && favMarkerY != null)
                    {
                        var favorite = string.Compare(favMarkerY.BasicTooltipText, favMarkerX.BasicTooltipText,
                                                      StringComparison.InvariantCultureIgnoreCase);
                        if (favorite != 0)
                        {
                            return(favorite);
                        }
                    }

                    return(string.Compare(fileNameX, fileNameY, StringComparison.InvariantCultureIgnoreCase));
                });
            };
            homePanel.Hidden += ToggleFileSystemWatchers;
            homePanel.Hidden += ToggleFileSystemWatchers;
            homePanel.Shown  += LoadImages;
            homePanel.Hidden += DisposeDisplayedThumbnails;
            return(homePanel);
        }