private void SortSpawnsetFilesButton_Click(object sender, RoutedEventArgs e)
        {
            Button button = sender as Button;

            foreach (Image image in spawnsetSortingImages)
            {
                if (image == button.Content as Image)
                {
                    image.Source          = new BitmapImage(ContentUtils.MakeUri(System.IO.Path.Combine("Content", "Images", "Buttons", "SpawnsetSortActive.png")));
                    image.RenderTransform = new ScaleTransform
                    {
                        ScaleY = -(image.RenderTransform as ScaleTransform).ScaleY
                    };
                }
                else
                {
                    image.Source = new BitmapImage(ContentUtils.MakeUri(System.IO.Path.Combine("Content", "Images", "Buttons", "SpawnsetSort.png")));
                }
            }

            SpawnsetListSorting <SpawnsetListEntry> sorting = button.Tag as SpawnsetListSorting <SpawnsetListEntry>;

            SpawnsetListHandler.Instance.ActiveSpawnsetSorting           = sorting;
            SpawnsetListHandler.Instance.ActiveSpawnsetSorting.Ascending = !SpawnsetListHandler.Instance.ActiveSpawnsetSorting.Ascending;

            SortSpawnsets(sorting);
        }
        private void SortSpawnsets(SpawnsetListSorting <SpawnsetListEntry> sorting)
        {
            List <SpawnsetListEntry> sorted = sorting.Ascending ? NetworkHandler.Instance.Spawnsets.OrderBy(sorting.SortingFunction).ToList() : NetworkHandler.Instance.Spawnsets.OrderByDescending(sorting.SortingFunction).ToList();

            for (int i = 0; i < SpawnsetsList.Children.Count; i++)
            {
                Grid grid = SpawnsetsList.Children.OfType <Grid>().Where(g => g.Tag as SpawnsetListEntry == sorted[i]).FirstOrDefault();
                SpawnsetsList.Children.Remove(grid);
                SpawnsetsList.Children.Insert(i, grid);
                SetBackgroundColor(grid);
            }
        }
        private void SortAuthors(SpawnsetListSorting <AuthorListEntry> sorting)
        {
            List <AuthorListEntry> sorted = sorting.Ascending ? NetworkHandler.Instance.Authors.OrderBy(sorting.SortingFunction).ToList() : NetworkHandler.Instance.Authors.OrderByDescending(sorting.SortingFunction).ToList();

            for (int i = 0; i < AuthorsListBox.Items.Count; i++)
            {
                ListBoxItem lbi = AuthorsListBox.Items.OfType <ListBoxItem>().Where(g => (g.Content as Grid).Tag as AuthorListEntry == sorted[i]).FirstOrDefault();
                AuthorsListBox.Items.Remove(lbi);
                AuthorsListBox.Items.Insert(i, lbi);

                (AuthorsListBox.Items[i] as ListBoxItem).IsSelected = sorted[i] == authorSelection;
            }
        }
        private StackPanel CreateHeaderStackPanel <T>(int index, List <Image> sortingImages, SpawnsetListSorting <T> sorting, SpawnsetListSorting <T> activeSorting, Action <object, RoutedEventArgs> buttonClick) where T : AbstractListEntry
        {
            Label label = new Label
            {
                FontWeight = FontWeights.Bold,
                Content    = sorting.DisplayName
            };

            Image image = new Image
            {
                Source  = new BitmapImage(ContentUtils.MakeUri(System.IO.Path.Combine("Content", "Images", "Buttons", sorting == activeSorting ? "SpawnsetSortActive.png" : "SpawnsetSort.png"))),
                Stretch = Stretch.None,
                RenderTransformOrigin = new Point(0.5, 0.5),
                RenderTransform       = new ScaleTransform
                {
                    ScaleY = sorting.IsAscendingDefault ? sorting.Ascending ? 1 : -1 : sorting.Ascending ? -1 : 1
                }
            };

            sortingImages.Add(image);

            Button button = new Button
            {
                ToolTip = $"Sort by \"{sorting.FullName}\"",
                Width   = 18,
                Content = image,
                Tag     = sorting
            };

            button.Click += (sender, e) => buttonClick(sender, e);

            StackPanel stackPanel = new StackPanel {
                Orientation = Orientation.Horizontal
            };

            stackPanel.Children.Add(label);
            stackPanel.Children.Add(button);
            Grid.SetColumn(stackPanel, index++);
            return(stackPanel);
        }