/// <summary> /// Compares by plan group. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByPlanGroup(PlanEntry x, PlanEntry y) => String.Compare(x.PlanGroupsDescription, y.PlanGroupsDescription, StringComparison.CurrentCulture);
/// <summary> /// Compares by plan type. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByPlanType(PlanEntry x, PlanEntry y) => (int)x.Type - (int)y.Type;
/// <summary> /// Compares by secondary attribute. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareBySecondaryAttribute(PlanEntry x, PlanEntry y) => (int)x.Skill.SecondaryAttribute - (int)y.Skill.SecondaryAttribute;
/// <summary> /// Compares by priority. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByPriority(PlanEntry x, PlanEntry y) => x.Priority - y.Priority;
/// <summary> /// Compares by skill points required. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareBySkillPointsRequired(PlanEntry x, PlanEntry y) => x.SkillPointsRequired.CompareTo(y.SkillPointsRequired);
/// <summary> /// Removes an item. /// </summary> /// <param name="entry">The entry.</param> /// <exception cref="System.ArgumentNullException">entry</exception> public void Remove(PlanEntry entry) { entry.ThrowIfNull(nameof(entry)); int index = IndexOf(entry.Skill, entry.Level); if (index != -1) RemoveCore(index); }
/// <summary> /// Compares by training time. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByTrainingTime(PlanEntry x, PlanEntry y) => x.TrainingTime.CompareTo(y.TrainingTime);
/// <summary> /// Compares by percent completed. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByPercentCompleted(PlanEntry x, PlanEntry y) { float xRatio = x.CharacterSkill.FractionCompleted; float yRatio = y.CharacterSkill.FractionCompleted; return xRatio.CompareTo(yRatio); }
/// <summary> /// Compares by name. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByName(PlanEntry x, PlanEntry y) { int nameDiff = String.CompareOrdinal(x.Skill.Name, y.Skill.Name); return nameDiff != 0 ? nameDiff : Convert.ToInt32(x.Level - y.Level); }
/// <summary> /// Compares by cost. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByCost(PlanEntry x, PlanEntry y) { long xCost = x.Level == 1 && !x.CharacterSkill.IsOwned ? x.Skill.Cost : 0; long yCost = y.Level == 1 && !x.CharacterSkill.IsOwned ? y.Skill.Cost : 0; return xCost.CompareTo(yCost); }
/// <summary> /// Adds the training time. /// </summary> /// <param name="settings">The settings.</param> /// <param name="shoppingListCandidate">if set to <c>true</c> [shopping list candidate].</param> /// <param name="entry">The entry.</param> /// <param name="builder">The builder.</param> private static void AddTrainingTime(PlanExportSettings settings, bool shoppingListCandidate, PlanEntry entry, StringBuilder builder) { if (!settings.EntryTrainingTimes && !settings.EntryStartDate && !settings.EntryFinishDate && (!settings.EntryCost || !shoppingListCandidate)) return; const DescriptiveTextOptions TimeFormat = DescriptiveTextOptions.FullText | DescriptiveTextOptions.IncludeCommas | DescriptiveTextOptions.SpaceText; builder.Append(" ("); bool needComma = false; // Training time if (settings.EntryTrainingTimes) { needComma = true; builder.Append(entry.TrainingTime.ToDescriptiveText(TimeFormat)); } // Training start date if (settings.EntryStartDate) { if (needComma) builder.Append("; "); needComma = true; builder.Append($"Start: {entry.StartTime.ToUniversalTime().DateTimeToTimeString()} UTC"); } // Training end date if (settings.EntryFinishDate) { if (needComma) builder.Append("; "); needComma = true; builder.Append($"Finish: {entry.EndTime.ToUniversalTime().DateTimeToTimeString()} UTC"); } // Skill cost if (settings.EntryCost && shoppingListCandidate) { if (needComma) builder.Append("; "); builder.Append(FormattableString.Invariant($"Cost: {entry.Skill.Cost:N0} ISK")); } builder.Append(')'); }
/// <summary> /// Creates a clone of this entry for the given plan. /// </summary> /// <param name="plan"></param> /// <returns></returns> internal PlanEntry Clone(BasePlan plan) { // We need a skill for the plan's character PlanEntry clone = new PlanEntry(plan, m_skill, m_level) { m_entryType = m_entryType, m_priority = m_priority, m_notes = m_notes, m_remapping = m_remapping?.Clone(), OldTrainingTime = OldTrainingTime, TrainingTime = TrainingTime }; clone.m_planGroups.AddRange(m_planGroups); return clone; }
/// <summary> /// Adds an item. /// </summary> /// <param name="entry"></param> public void Add(PlanEntry entry) { AddCore(entry); }
/// <summary> /// Compares by notes. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByNotes(PlanEntry x, PlanEntry y) => String.Compare(x.Notes, y.Notes, StringComparison.CurrentCulture);
/// <summary> /// Compares by training time natural. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByTrainingTimeNatural(PlanEntry x, PlanEntry y) => x.NaturalTrainingTime.CompareTo(y.NaturalTrainingTime);
/// <summary> /// Compares by time difference. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByTimeDifference(PlanEntry x, PlanEntry y) { TimeSpan xDuration = x.TrainingTime - x.OldTrainingTime; TimeSpan yDuration = y.TrainingTime - y.OldTrainingTime; return xDuration.CompareTo(yDuration); }
/// <summary> /// Compares by SP per hour. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareBySPPerHour(PlanEntry x, PlanEntry y) => x.SpPerHour - y.SpPerHour;
/// <summary> /// Compares by rank. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByRank(PlanEntry x, PlanEntry y) => Convert.ToInt32(x.Skill.Rank - y.Skill.Rank);
/// <summary> /// Compares by primary attribute. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <returns></returns> public static int CompareByPrimaryAttribute(PlanEntry x, PlanEntry y) => (int)x.Skill.PrimaryAttribute - (int)y.Skill.PrimaryAttribute;
/// <summary> /// Compares by skill group duration. /// </summary> /// <param name="x">The x.</param> /// <param name="y">The y.</param> /// <param name="entries">The entries.</param> /// <param name="skillGroupsDurations">The skill groups durations.</param> /// <returns></returns> public static int CompareBySkillGroupDuration(PlanEntry x, PlanEntry y, IEnumerable<PlanEntry> entries, Dictionary<StaticSkillGroup, TimeSpan> skillGroupsDurations) { TimeSpan xDuration = GetSkillGroupDuration(x.Skill.Group, entries, skillGroupsDurations); TimeSpan yDuration = GetSkillGroupDuration(y.Skill.Group, entries, skillGroupsDurations); return xDuration.CompareTo(yDuration); }
/// <summary> /// Prints a single entry /// </summary> /// <param name="g">The graphics canvas.</param> /// <param name="index">The index.</param> /// <param name="pe">The plan entry.</param> private void PrintEntry(Graphics g, int index, PlanEntry pe) { Size size; // Print entry index if (m_settings.EntryNumber) { size = Print(g, $"{index}: "); m_point.X += size.Width; } // Print skill name and level size = PrintBold(g, pe.ToString()); m_point.X += size.Width; // Print Notes ? if (m_settings.EntryNotes) { // Jump to next line m_point.Y += size.Height; m_point.X = 20; // Note size = Print(g, pe.Notes); m_point.X += size.Width; } // Print additional infos below if (m_settings.EntryTrainingTimes || m_settings.EntryStartDate || m_settings.EntryFinishDate) { // Jump to next line m_point.Y += size.Height; m_point.X = 20; // Open parenthesis size = Print(g, " ("); m_point.X += size.Width; // Training time ? bool needComma = false; if (m_settings.EntryTrainingTimes) { size = Print(g, pe.TrainingTime.ToDescriptiveText( DescriptiveTextOptions.FullText | DescriptiveTextOptions.IncludeCommas | DescriptiveTextOptions.SpaceText)); m_point.X += size.Width; needComma = true; } // Start date ? if (m_settings.EntryStartDate) { if (needComma) { size = Print(g, "; "); m_point.X += size.Width; } size = Print(g, "Start: "); m_point.X += size.Width; size = Print(g, pe.StartTime.ToString()); m_point.X += size.Width; needComma = true; } // End date ? if (m_settings.EntryFinishDate) { if (needComma) { size = Print(g, "; "); m_point.X += size.Width; } size = Print(g, "Finish: "); m_point.X += size.Width; size = Print(g, pe.EndTime.ToString()); m_point.X += size.Width; } // Close parenthesis size = Print(g, ")"); m_point.X += size.Width; } // Jump to next line m_point.X = 5; m_point.Y += size.Height; }