public void InitObjectListView()
        {
            //modlist_objectlistview?.Dispose();

            var categoryGroupingDelegate = new GroupKeyGetterDelegate(o => Mods.GetCategory(o as ModEntry));

            var categoryFormatterDelegate = new GroupFormatterDelegate((@group, parameters) =>
            {
                var groupName = group.Key as string;
                if (groupName == null)
                {
                    return;
                }

                // Restore collapsed state
                group.Collapsed = Mods.Entries[groupName].Collapsed;

                // Sort Categories
                parameters.GroupComparer = Comparer <OLVGroup> .Create((a, b) => Mods.Entries[(string)a.Key].Index.CompareTo(Mods.Entries[(string)b.Key].Index));
            });

            olvcActive.GroupKeyGetter = categoryGroupingDelegate;
            olvcActive.GroupFormatter = categoryFormatterDelegate;

            olvcName.GroupKeyGetter = categoryGroupingDelegate;
            olvcName.GroupFormatter = categoryFormatterDelegate;

            olvcID.GroupKeyGetter = categoryGroupingDelegate;
            olvcID.GroupFormatter = categoryFormatterDelegate;

            olvcOrder.GroupKeyGetter = categoryGroupingDelegate;
            olvcOrder.GroupFormatter = categoryFormatterDelegate;

            olvcCategory.AspectGetter = o => Mods.GetCategory((ModEntry)o);

            olvcTags.Renderer     = new TagRenderer(modlist_ListObjectListView, AvailableTags);
            olvcTags.AspectPutter = (rowObject, value) =>
            {
                var tags = ((string)value).Split(';');

                tags.All(t => AddTag((ModEntry)rowObject, t.Trim()));
            };
            olvcTags.SearchValueGetter = rowObject => ((ModEntry)rowObject).Tags.Select(s => s.ToLower()).ToArray();
            olvcTags.AspectGetter      = rowObject => "";


            olvcState.AspectGetter = o =>
            {
                var mod = (ModEntry)o;

                if (mod.State.HasFlag(ModState.NotLoaded))
                {
                    return("Not Loaded");
                }

                if (mod.State.HasFlag(ModState.NotInstalled))
                {
                    return("Not Installed");
                }

                if (mod.State.HasFlag(ModState.ModConflict))
                {
                    return("Conflict");
                }

                if (mod.State.HasFlag(ModState.DuplicateID))
                {
                    return("Duplicate ID");
                }

                if (mod.State.HasFlag(ModState.New))
                {
                    return("New");
                }

                if (mod.State.HasFlag(ModState.UpdateAvailable))
                {
                    return("Update Available");
                }

                return("OK");
            };

            olvcSize.AspectToStringConverter = size => ((long)size).FormatAsFileSize();

            olvcLastUpdated.DataType = typeof(DateTime?);
            olvcDateAdded.DataType   = typeof(DateTime?);
            olvcDateCreated.DataType = typeof(DateTime?);

            olvcPath.GroupKeyGetter = o => Path.GetDirectoryName((o as ModEntry)?.Path);


            // size groupies
            var columns = modlist_ListObjectListView.AllColumns.ToArray();

            columns.Single(c => c.AspectName == "Size").MakeGroupies(
                new[] { 1024, 1024 * 1024, (long)50 * 1024 * 1024, (long)100 * 1024 * 1024 },
                new[] { "< 1 KB", "< 1MB", "< 50 MB", "< 100 MB", "> 100 MB" }
                );
            columns.Single(c => c.AspectName == "isHidden").MakeGroupies(
                new [] { false, true },
                new [] { "wut?", "Not Hidden", "Hidden" });
            columns.Single(c => c.AspectName == "isActive").MakeGroupies(
                new[] { false, true },
                new[] { "wut?", "Disabled", "Enabled" });

            olvcActive.AspectToStringConverter = active => "";
            olvcActive.GroupFormatter          = (g, param) => { param.GroupComparer = Comparer <OLVGroup> .Create((a, b) => (param.GroupByOrder == SortOrder.Descending ? 1 : -1) *a.Header.CompareTo(b.Header)); };

            olvcName.AutoCompleteEditor = false;

            // Sort by Order or WorkshopID column removes groups
            modlist_ListObjectListView.BeforeSorting += (sender, args) =>
            {
                modlist_ListObjectListView.ShowGroups =
                    !(args.ColumnToSort.Equals(olvcOrder) || args.ColumnToSort.Equals(olvcWorkshopID));
            };

            // Init DateTime columns
            foreach (var column in columns.Where(c => c.DataType == typeof(DateTime?)))
            {
                column.AspectToStringConverter = d => (d as DateTime?)?.ToLocalTime().ToString(CultureInfo.CurrentCulture);
                column.MakeGroupies(
                    new[] { DateTime.Now.Subtract(TimeSpan.FromHours(24 * 30)), DateTime.Now.Subtract(TimeSpan.FromHours(24 * 7)), DateTime.Now.Date },
                    new[] { "Older Than One Month", "This Month", "This Week", "Today" });

                // Sord Desc
                column.GroupFormatter = (g, param) => { param.GroupComparer = Comparer <OLVGroup> .Create((a, b) => (param.GroupByOrder == SortOrder.Descending ? -1 : 1) *a.Header.CompareTo(b.Header)); };
            }


            // Wrapper
            ModList = new TypedObjectListView <ModEntry>(modlist_ListObjectListView);

            // Events
            //modlist_objectlistview.SelectionChanged += ModListSelectionChanged;
            //modlist_objectlistview.ItemChecked += ModListItemChecked;
            //modlist_objectlistview.CellRightClick += ModListCellRightClick;
            //modlist_objectlistview.CellEditFinished += ModListEditFinished;
            //modlist_objectlistview.CellToolTipShowing += ModListCellToolTipShowing;
            //modlist_objectlistview.FormatRow += ModListFormatRow;
            //modlist_objectlistview.GroupExpandingCollapsing += ModListGroupExpandingCollapsing;
            //modlist_objectlistview.KeyUp += ModListKeyUp;
            //modlist_objectlistview.KeyDown += ModListKeyDown;

            // Restore State
            if (Settings.Windows.ContainsKey("main") && Settings.Windows["main"].Data != null)
            {
                modlist_ListObjectListView.RestoreState(Settings.Windows["main"].Data);
            }

            RefreshModList();

            // Start out sorted by name
            modlist_ListObjectListView.Sort(olvcName, SortOrder.Ascending);
        }
Exemple #2
0
        public void InitObjectListView()
        {
            modlist_objectlistview?.Dispose();

            modlist_objectlistview = new ObjectListView
            {
                // General
                Name     = "modlist_objectlistview",
                Size     = new Size(886, 222),
                Location = new Point(0, 0),
                Dock     = DockStyle.Fill,
                TabIndex = 0,

                // Behavior
                FullRowSelect      = true,
                CellEditActivation = ObjectListView.CellEditActivateMode.DoubleClick,
                AllowColumnReorder = true,
                //ShowItemToolTips = true,

                // Sorting
                ShowSortIndicators            = true,
                TintSortColumn                = true,
                IsSearchOnSortColumn          = false,
                SortGroupItemsByPrimaryColumn = false,
                AlwaysGroupBySortOrder        = SortOrder.None,

                // Checkbox
                CheckBoxes        = true,
                CheckedAspectName = "isActive"
            };

            horizontal_splitcontainer.Panel1.Controls.Add(modlist_objectlistview);
            //modlist_objectlistview.Update();

            var categoryGroupingDelegate = new GroupKeyGetterDelegate(o => Mods.GetCategory(o as ModEntry));

            var categoryFormatterDelegate = new GroupFormatterDelegate((@group, parameters) =>
            {
                var groupName = group.Key as string;
                if (groupName == null)
                {
                    return;
                }

                // Restore collapsed state
                group.Collapsed = Mods.Entries[groupName].Collapsed;

                // Sort Categories
                parameters.GroupComparer = Comparer <OLVGroup> .Create((a, b) => Mods.Entries[(string)a.Key].Index.CompareTo(Mods.Entries[(string)b.Key].Index));
            });

            var columns = new[]
            {
                // first column is marked as primary column
                new OLVColumn
                {
                    Text           = "Name",
                    AspectName     = "Name",
                    Width          = 500,
                    GroupKeyGetter = categoryGroupingDelegate,
                    GroupFormatter = categoryFormatterDelegate,
                    IsEditable     = true
                },
                new OLVColumn
                {
                    Name           = "ID",
                    Text           = "ID",
                    AspectName     = "ID",
                    Width          = 200,
                    GroupKeyGetter = categoryGroupingDelegate,
                    GroupFormatter = categoryFormatterDelegate,
                    IsEditable     = false
                },

                // State
                new OLVColumn
                {
                    Text         = "State",
                    IsEditable   = false,
                    Width        = 40,
                    AspectGetter = o =>
                    {
                        var mod = (ModEntry)o;

                        if (mod.State.HasFlag(ModState.NotLoaded))
                        {
                            return("Not Loaded");
                        }

                        if (mod.State.HasFlag(ModState.ModConflict))
                        {
                            return("Conflict");
                        }

                        if (mod.State.HasFlag(ModState.DuplicateID))
                        {
                            return("Duplicate ID");
                        }

                        if (mod.State.HasFlag(ModState.New))
                        {
                            return("New");
                        }

                        if (mod.State.HasFlag(ModState.UpdateAvailable))
                        {
                            return("Update Available");
                        }

                        return("OK");
                    }
                },
                new OLVColumn
                {
                    Text                 = "Order",
                    AspectName           = "Index",
                    TextAlign            = HorizontalAlignment.Right,
                    HeaderTextAlign      = HorizontalAlignment.Center,
                    Width                = 60,
                    MinimumWidth         = 40,
                    GroupKeyGetter       = categoryGroupingDelegate,
                    GroupFormatter       = categoryFormatterDelegate,
                    IsEditable           = true,
                    CellEditUseWholeCell = true
                },
                new OLVColumn
                {
                    Text       = "Size",
                    AspectName = "Size",
                    AspectToStringConverter = size => ((long)size).FormatAsFileSize(),
                    TextAlign  = HorizontalAlignment.Right,
                    Width      = 100,
                    IsEditable = false
                },
                new OLVColumn
                {
                    Text       = "Last Update",
                    AspectName = "DateUpdated",
                    DataType   = typeof(DateTime?),
                    Width      = 120,
                    TextAlign  = HorizontalAlignment.Right,
                    IsEditable = false
                },
                new OLVColumn
                {
                    Text       = "Date Added",
                    AspectName = "DateAdded",
                    DataType   = typeof(DateTime?),
                    Width      = 120,
                    TextAlign  = HorizontalAlignment.Right,
                    IsEditable = false,
                    IsVisible  = false
                },
                new OLVColumn
                {
                    Text       = "Date Created",
                    AspectName = "DateCreated",
                    DataType   = typeof(DateTime?),
                    Width      = 120,
                    TextAlign  = HorizontalAlignment.Right,
                    IsEditable = false,
                    IsVisible  = false
                },
                new OLVColumn
                {
                    Text           = "Path",
                    AspectName     = "Path",
                    Width          = 160,
                    IsEditable     = false,
                    IsVisible      = false,
                    GroupKeyGetter = o => Path.GetDirectoryName((o as ModEntry)?.Path)
                }
            };

            // size groupies
            columns.Single(c => c.AspectName == "Size").MakeGroupies(
                new[] { 1024, 1024 * 1024, (long)50 * 1024 * 1024, (long)100 * 1024 * 1024 },
                new[] { "< 1 KB", "< 1MB", "< 50 MB", "< 100 MB", "> 100 MB" }
                );

            // Init DateTime columns
            foreach (var column in columns.Where(c => c.DataType == typeof(DateTime?)))
            {
                column.AspectToStringConverter = d => (d as DateTime?)?.ToLocalTime().ToString(CultureInfo.CurrentCulture);
                column.MakeGroupies(
                    new[] { DateTime.Now.Subtract(TimeSpan.FromHours(24 * 30)), DateTime.Now.Subtract(TimeSpan.FromHours(24 * 7)), DateTime.Now.Date },
                    new[] { "Older than one month", "Last Month", "This Week", "Today" }
                    );

                // Sord Desc
                column.GroupFormatter =
                    (g, param) => { param.GroupComparer = Comparer <OLVGroup> .Create((a, b) => (param.GroupByOrder == SortOrder.Descending ? 1 : -1) *a.Id.CompareTo(b.Id)); };
            }


            // Wrapper
            ModList = new TypedObjectListView <ModEntry>(modlist_objectlistview);

            // Events
            modlist_objectlistview.SelectionChanged         += ModListSelectionChanged;
            modlist_objectlistview.ItemChecked              += ModListItemChecked;
            modlist_objectlistview.CellRightClick           += ModListCellRightClick;
            modlist_objectlistview.CellEditFinished         += ModListEditFinished;
            modlist_objectlistview.CellToolTipShowing       += ModListCellToolTipShowing;
            modlist_objectlistview.FormatRow                += ModListFormatRow;
            modlist_objectlistview.GroupExpandingCollapsing += ModListGroupExpandingCollapsing;
            modlist_objectlistview.KeyUp   += ModListKeyUp;
            modlist_objectlistview.KeyDown += ModListKeyDown;

            // Content
            modlist_objectlistview.AllColumns.AddRange(columns);
            modlist_objectlistview.RebuildColumns();

            // move state to the beginning
            columns.Single(c => c.Text == "State").DisplayIndex = 0;

            // Restore State
            if (Settings.Windows.ContainsKey("main") && Settings.Windows["main"].Data != null)
            {
                modlist_objectlistview.RestoreState(Settings.Windows["main"].Data);
            }

            RefreshModList();
        }
Exemple #3
0
        public void InitModListView()
        {
            var categoryGroupingDelegate = new GroupKeyGetterDelegate(o => Mods.GetCategory(o as ModEntry));

            var categoryFormatterDelegate = new GroupFormatterDelegate((@group, parameters) =>
            {
                var groupName = group.Key as string;
                if (groupName == null)
                {
                    return;
                }

                // Restore collapsed state
                group.Collapsed = Mods.Entries[groupName].Collapsed;

                // Sort Categories
                parameters.GroupComparer = Comparer <OLVGroup> .Create((a, b) => Mods.Entries[(string)a.Key].Index.CompareTo(Mods.Entries[(string)b.Key].Index));
            });

            modlist_ListObjectListView.GroupStateChanged += delegate(object o, GroupStateChangedEventArgs args)
            {
                // Remember group expanded/collapsed state when grouping by category (name or id column)
                if (modlist_ListObjectListView.PrimarySortColumn == olvcName || modlist_ListObjectListView.PrimarySortColumn == olvcID)
                {
                    if (args.Group.Key is string key)
                    {
                        if (Mods.Entries.ContainsKey(key))
                        {
                            Mods.Entries[key].Collapsed = args.Group.Collapsed;
                        }
                    }
                }
            };

            olvcActive.GroupKeyGetter = categoryGroupingDelegate;
            olvcActive.GroupFormatter = categoryFormatterDelegate;

            olvcName.GroupKeyGetter = categoryGroupingDelegate;
            olvcName.GroupFormatter = categoryFormatterDelegate;

            olvcID.GroupKeyGetter = categoryGroupingDelegate;
            olvcID.GroupFormatter = categoryFormatterDelegate;

            olvcOrder.GroupKeyGetter = categoryGroupingDelegate;
            olvcOrder.GroupFormatter = categoryFormatterDelegate;

            olvcCategory.AspectGetter = o => Mods.GetCategory((ModEntry)o);

            olvcTags.Renderer     = new TagRenderer(modlist_ListObjectListView, AvailableTags);
            olvcTags.AspectPutter = (rowObject, value) =>
            {
                var tags = ((string)value).Split(';');

                tags.ToList().ForEach(t => AddTag((ModEntry)rowObject, t.Trim()));
            };
            olvcTags.SearchValueGetter = rowObject => ((ModEntry)rowObject).Tags.Select(s => s.ToLower()).ToArray();
            olvcTags.AspectGetter      = rowObject => "";

            olvcState.AspectGetter           = StateAspectGetter;
            olvcSize.AspectToStringConverter = size => ((long)size).FormatAsFileSize();

            olvcLastUpdated.DataType = typeof(DateTime?);
            olvcDateAdded.DataType   = typeof(DateTime?);
            olvcDateCreated.DataType = typeof(DateTime?);

            olvcPath.GroupKeyGetter = o => Path.GetDirectoryName((o as ModEntry)?.Path);

            olvcSource.AspectGetter = rowObject =>
            {
                if (rowObject is ModEntry mod)
                {
                    switch (mod.Source)
                    {
                    case ModSource.Unknown:
                        return("Unknown");

                    case ModSource.SteamWorkshop:
                        return("Steam");

                    case ModSource.Manual:
                        return("Local");

                    default:
                        throw new ArgumentOutOfRangeException(nameof(mod.Source), "Unhandled ModSource");
                    }
                }

                return("");
            };

            // size groupies
            var columns = modlist_ListObjectListView.AllColumns.ToArray();

            columns.Single(c => c.AspectName == "Size").MakeGroupies(
                new[] { 1024, 1024 * 1024, (long)50 * 1024 * 1024, (long)100 * 1024 * 1024 },
                new[] { "< 1 KB", "< 1MB", "< 50 MB", "< 100 MB", "> 100 MB" }
                );
            columns.Single(c => c.AspectName == "isHidden").MakeGroupies(
                new [] { false, true },
                new [] { "wut?", "Not Hidden", "Hidden" });
            columns.Single(c => c.AspectName == "isActive").MakeGroupies(
                new[] { false, true },
                new[] { "wut?", "Disabled", "Enabled" });

            olvcActive.AspectToStringConverter = active => "";
            olvcActive.GroupFormatter          = (g, param) => { param.GroupComparer = Comparer <OLVGroup> .Create((a, b) => (param.GroupByOrder == SortOrder.Descending ? 1 : -1) *a.Header.CompareTo(b.Header)); };

            olvcName.AutoCompleteEditor = false;

            // Sort by Order or WorkshopID column removes groups
            modlist_ListObjectListView.BeforeSorting += (sender, args) =>
            {
                bool isGroupableColumn = CheckIfGroupableColumn(args.ColumnToSort);
                bool useGrouping       = cEnableGrouping.Checked && isGroupableColumn;
                modlist_ListObjectListView.ShowGroups = useGrouping;
                modlist_toggleGroupsButton.Enabled    = useGrouping;
                cEnableGrouping.Enabled = isGroupableColumn;
            };

            modlist_ListObjectListView.BooleanCheckStatePutter = ModListBooleanCheckStatePutter;

            // Init DateTime columns
            foreach (var column in columns.Where(c => c.DataType == typeof(DateTime?)))
            {
                column.AspectToStringConverter = d => (d as DateTime?)?.ToLocalTime().ToString(CultureInfo.CurrentCulture);
                column.MakeGroupies(
                    new[] { DateTime.Now.Subtract(TimeSpan.FromHours(24 * 30)), DateTime.Now.Subtract(TimeSpan.FromHours(24 * 7)), DateTime.Now.Date },
                    new[] { "Older Than One Month", "This Month", "This Week", "Today" });

                // Sord Desc
                column.GroupFormatter = (g, param) => { param.GroupComparer = Comparer <OLVGroup> .Create((a, b) => (param.GroupByOrder == SortOrder.Descending ? -1 : 1) *a.Header.CompareTo(b.Header)); };
            }

            // Wrapper
            ModList = new TypedObjectListView <ModEntry>(modlist_ListObjectListView);

            // Restore State
            if (Settings.Windows.ContainsKey("main") && Settings.Windows["main"].Data != null)
            {
                modlist_ListObjectListView.RestoreState(Settings.Windows["main"].Data);
            }

            RefreshModList();

            // Start out sorted by name
            modlist_ListObjectListView.Sort(olvcName, SortOrder.Ascending);
        }