/// <summary> /// Sort this plan /// </summary> /// <param name="sort"></param> /// <param name="reverseOrder"></param> /// <param name="groupByPriority"></param> private void Sort(PlanEntrySort sort, bool reverseOrder, bool groupByPriority) { // Perform the sort IEnumerable <PlanEntry> entries = new PlanEntrySorter(Character, Items, sort, reverseOrder, groupByPriority).Sort(); // Update plan RebuildPlanFrom(entries); }
/// <summary> /// Sorts a plan according to the given settings. /// </summary> /// <param name="settings">The settings.</param> /// <exception cref="System.ArgumentNullException">settings</exception> public void Sort(PlanSorting settings) { settings.ThrowIfNull(nameof(settings)); PlanEntrySort criteria = settings.Order == ThreeStateSortOrder.None ? PlanEntrySort.None : settings.Criteria; Sort(criteria, settings.Order == ThreeStateSortOrder.Descending, settings.GroupByPriority); }
/// <summary> /// Constructor. /// </summary> /// <param name="character"></param> /// <param name="entries"></param> /// <param name="sort"></param> /// <param name="reverseOrder"></param> /// <param name="groupByPriority"></param> internal PlanSorter(BaseCharacter character, IEnumerable<PlanEntry> entries, PlanEntrySort sort, bool reverseOrder, bool groupByPriority) { m_sort = sort; m_entries = entries; m_reverseOrder = reverseOrder; m_groupByPriority = groupByPriority; m_character = character; }
/// <summary> /// Constructor. /// </summary> /// <param name="character"></param> /// <param name="entries"></param> /// <param name="sort"></param> /// <param name="reverseOrder"></param> /// <param name="groupByPriority"></param> internal PlanSorter(BaseCharacter character, IEnumerable <PlanEntry> entries, PlanEntrySort sort, bool reverseOrder, bool groupByPriority) { m_sort = sort; m_entries = entries; m_reverseOrder = reverseOrder; m_groupByPriority = groupByPriority; m_character = character; }
/// <summary> /// Sort this plan /// </summary> /// <param name="sort"></param> /// <param name="reverseOrder"></param> /// <param name="groupByPriority"></param> public void Sort(PlanEntrySort sort, bool reverseOrder, bool groupByPriority) { var sorter = new PlanSorter(m_character, m_items, sort, reverseOrder, groupByPriority); // Perform the sort var entries = sorter.Sort(); // Update plan this.RebuildPlanFrom(entries); }
/// <summary> /// Performs a simple ordering by the given sort criteria, based on the latest statistics. /// </summary> /// <param name="sort"></param> /// <param name="reverseOrder"></param> internal void SimpleSort(PlanEntrySort sort, bool reverseOrder) { // Apply simple sort operators switch (sort) { case PlanEntrySort.Name: m_items.StableSort(PlanSorter.CompareByName); break; case PlanEntrySort.Cost: m_items.StableSort(PlanSorter.CompareByCost); break; case PlanEntrySort.PrimaryAttribute: m_items.StableSort(PlanSorter.CompareByPrimaryAttribute); break; case PlanEntrySort.SecondaryAttribute: m_items.StableSort(PlanSorter.CompareBySecondaryAttribute); break; case PlanEntrySort.Priority: m_items.StableSort(PlanSorter.CompareByPriority); break; case PlanEntrySort.PlanGroup: m_items.StableSort(PlanSorter.CompareByPlanGroup); break; case PlanEntrySort.PercentCompleted: m_items.StableSort(PlanSorter.CompareByPercentCompleted); break; case PlanEntrySort.Rank: m_items.StableSort(PlanSorter.CompareByRank); break; case PlanEntrySort.Notes: m_items.StableSort(PlanSorter.CompareByNotes); break; case PlanEntrySort.PlanType: m_items.StableSort(PlanSorter.CompareByPlanType); break; case PlanEntrySort.TimeDifference: m_items.StableSort(PlanSorter.CompareByTimeDifference); break; case PlanEntrySort.TrainingTime: m_items.StableSort(PlanSorter.CompareByTrainingTime); break; case PlanEntrySort.TrainingTimeNatural: m_items.StableSort(PlanSorter.CompareByTrainingTimeNatural); break; case PlanEntrySort.SkillGroupDuration: var skillGroupsDurations = new Dictionary<StaticSkillGroup, TimeSpan>(); m_items.StableSort((x, y) => PlanSorter.CompareBySkillGroupDuration(x, y, m_items, skillGroupsDurations)); break; case PlanEntrySort.SPPerHour: m_items.StableSort(PlanSorter.CompareBySPPerHour); break; case PlanEntrySort.SkillPointsRequired: m_items.StableSort(PlanSorter.CompareBySkillPointsRequired); break; default: break; } // Reverse order if (reverseOrder) m_items.Reverse(); }
/// <summary> /// Performs a simple ordering by the given sort criteria, based on the latest statistics. /// </summary> /// <param name="sort"></param> /// <param name="reverseOrder"></param> internal void SimpleSort(PlanEntrySort sort, bool reverseOrder) { // Apply simple sort operators switch (sort) { case PlanEntrySort.None: break; case PlanEntrySort.Name: Items.StableSort(PlanEntrySorter.CompareByName); break; case PlanEntrySort.Cost: Items.StableSort(PlanEntrySorter.CompareByCost); break; case PlanEntrySort.PrimaryAttribute: Items.StableSort(PlanEntrySorter.CompareByPrimaryAttribute); break; case PlanEntrySort.SecondaryAttribute: Items.StableSort(PlanEntrySorter.CompareBySecondaryAttribute); break; case PlanEntrySort.Priority: Items.StableSort(PlanEntrySorter.CompareByPriority); break; case PlanEntrySort.PlanGroup: Items.StableSort(PlanEntrySorter.CompareByPlanGroup); break; case PlanEntrySort.PercentCompleted: Items.StableSort(PlanEntrySorter.CompareByPercentCompleted); break; case PlanEntrySort.Rank: Items.StableSort(PlanEntrySorter.CompareByRank); break; case PlanEntrySort.Notes: Items.StableSort(PlanEntrySorter.CompareByNotes); break; case PlanEntrySort.PlanType: Items.StableSort(PlanEntrySorter.CompareByPlanType); break; case PlanEntrySort.TimeDifference: Items.StableSort(PlanEntrySorter.CompareByTimeDifference); break; case PlanEntrySort.TrainingTime: Items.StableSort(PlanEntrySorter.CompareByTrainingTime); break; case PlanEntrySort.TrainingTimeNatural: Items.StableSort(PlanEntrySorter.CompareByTrainingTimeNatural); break; case PlanEntrySort.SkillGroupDuration: Dictionary <StaticSkillGroup, TimeSpan> skillGroupsDurations = new Dictionary <StaticSkillGroup, TimeSpan>(); Items.StableSort((x, y) => PlanEntrySorter.CompareBySkillGroupDuration(x, y, Items, skillGroupsDurations)); break; case PlanEntrySort.SPPerHour: Items.StableSort(PlanEntrySorter.CompareBySPPerHour); break; case PlanEntrySort.SkillPointsRequired: Items.StableSort(PlanEntrySorter.CompareBySkillPointsRequired); break; default: throw new NotImplementedException(); } // Reverse order if (reverseOrder) { Items.Reverse(); } }
/// <summary> /// Gets a column by the given sort key. Null if not found or "none". /// </summary> /// <param name="criteria"></param> /// <returns></returns> private ColumnHeader GetColumn(PlanEntrySort criteria) => criteria == PlanEntrySort.None ? null : lvSkills.Columns.Cast<ColumnHeader>().FirstOrDefault(header => GetPlanSort(header) == criteria);
/// <summary> /// Gets a column by the given sort key. Null if not found or "none". /// </summary> /// <param name="sortKey"></param> /// <returns></returns> private ColumnHeader GetColumn(PlanEntrySort criteria) { if (criteria == PlanEntrySort.None) return null; foreach (ColumnHeader header in lvSkills.Columns) { if (GetPlanSort(header) == criteria) return header; } return null; }
/// <summary> /// Updates the sort visual feedback for the specified column. /// </summary> /// <remarks> /// The ColumnHeader.ImageIndex has a bug under Vista that /// causes the value to be set to 0 if you set it to -1, /// resulting in the wrong icon being selected for the sort: /// https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=395739 /// </remarks> private void UpdateSortVisualFeedback() { // Updates the menu icons on the left toolbar tsSortPriorities.Checked = m_plan.SortingPreferences.GroupByPriority; // Removes the icon from the old column var lastColumn = GetColumn(m_columnWithSortFeedback); if (lastColumn != null) lastColumn.ImageIndex = 6; // see xml comments m_columnWithSortFeedback = m_plan.SortingPreferences.Criteria; // Adds the icon on the new column if (m_plan.SortingPreferences.Criteria != PlanEntrySort.None && m_plan.SortingPreferences.Order != ThreeStateSortOrder.None) { var column = GetColumn(m_plan.SortingPreferences.Criteria); if (column != null) column.ImageIndex = (m_plan.SortingPreferences.Order == ThreeStateSortOrder.Ascending ? ArrowUpIndex : ArrowDownIndex); } }