diff --git a/GameData/VABOrganizer/Assets/vaborganizer.dat b/GameData/VABOrganizer/Assets/vaborganizer.dat index b11a0d1..a535971 100644 Binary files a/GameData/VABOrganizer/Assets/vaborganizer.dat and b/GameData/VABOrganizer/Assets/vaborganizer.dat differ diff --git a/GameData/VABOrganizer/Localization/en-us.cfg b/GameData/VABOrganizer/Localization/en-us.cfg index 6d5b2eb..f55c3fb 100644 --- a/GameData/VABOrganizer/Localization/en-us.cfg +++ b/GameData/VABOrganizer/Localization/en-us.cfg @@ -3,6 +3,8 @@ Localization en-us { #LOC_VABOrganizer_BulkheadSortTooltip = Sort By Profile + #LOC_VABOrganizer_AdvancedSortTooltip = Advanced Sorting + // Bulkhead codes // --------------- // Stock and cylinders @@ -157,5 +159,42 @@ Localization #LOC_VABOrganizer_Subcategory_crewHabitation = Habitation #LOC_VABOrganizer_Subcategory_airlocks = Airlocks + // Sorters + // --------------- + + #LOC_VABOrganizer_Sorter_CrewCapacity = Crew Capacity + #LOC_VABOrganizer_Sorter_SASLevel = SAS Level + #LOC_VABOrganizer_Sorter_ReactionWheelTorque = Reaction Wheel Torque + + #LOC_VABOrganizer_Sorter_AntennaPower = Antenna Strength + #LOC_VABOrganizer_Sorter_AntennaRate = Transmit Rate + #LOC_VABOrganizer_Sorter_AntennaCost = Transmit Cost + + #LOC_VABOrganizer_Sorter_RCSIspVac = RCS Isp (Vac.) + #LOC_VABOrganizer_Sorter_RCSThrustVac = RCS Thrust (Vac.) + + #LOC_VABOrganizer_Sorter_EngineThrustVac = Thrust (Vac.) + #LOC_VABOrganizer_Sorter_EngineThrustSL = Thrust (1 atm) + #LOC_VABOrganizer_Sorter_EngineTWRVac = TWR (Vac.) + #LOC_VABOrganizer_Sorter_EngineTWRSL = TWR (1 atm) + #LOC_VABOrganizer_Sorter_EngineISPVac = Isp (Vac.) + #LOC_VABOrganizer_Sorter_EngineISPSL = Isp (1 atm) + #LOC_VABOrganizer_Sorter_EngineGimbalRange = Gimbal Range + + #LOC_VABOrganizer_Sorter_InventorySlots = Inventory Slots + #LOC_VABOrganizer_Sorter_InventoryVolume = Inventory Capacity + + #LOC_VABOrganizer_Sorter_ExperimentValue = Experiment Value + #LOC_VABOrganizer_Sorter_Experiment = Experiment Type + + #LOC_VABOrganizer_Sorter_PowerConsumption = Electricity Consumed + #LOC_VABOrganizer_Sorter_PowerGeneration = Electricity Generated + + #LOC_VABOrganizer_Sorter_HeatConsumption = Heat Removed + #LOC_VABOrganizer_Sorter_HeatGeneration = Heat Generated + + #LOC_VABOrganizer_Sorter_PowerMax = Electricity Capacity + #LOC_VABOrganizer_Sorter_MonopropMax = Monopropellant Capacity + } } \ No newline at end of file diff --git a/GameData/VABOrganizer/Plugins/VABOrganizer.dll b/GameData/VABOrganizer/Plugins/VABOrganizer.dll index 28c93cf..39b31d4 100644 Binary files a/GameData/VABOrganizer/Plugins/VABOrganizer.dll and b/GameData/VABOrganizer/Plugins/VABOrganizer.dll differ diff --git a/GameData/VABOrganizer/Settings.cfg b/GameData/VABOrganizer/Settings.cfg index e69de29..66292e6 100644 --- a/GameData/VABOrganizer/Settings.cfg +++ b/GameData/VABOrganizer/Settings.cfg @@ -0,0 +1,13 @@ +ORGANIZERSETTINGS +{ + /// Log debug messages + DebugMode = true + /// If True, Noto Sans, if False, Liberation Sans + KSPDefaultFont = true + /// Size of the font on tags + LabelFontSize = 9 + /// Size of the font on tags in R&D + RDLabelFontSize = 9 + /// Transparency of tags + LabelAlpha = 0.4 +} \ No newline at end of file diff --git a/GameData/VABOrganizer/Sorting/advancedSorters.cfg b/GameData/VABOrganizer/Sorting/advancedSorters.cfg new file mode 100644 index 0000000..3b75490 --- /dev/null +++ b/GameData/VABOrganizer/Sorting/advancedSorters.cfg @@ -0,0 +1,281 @@ +/// ORGANIZERSORTERTYPE +/// { +/// // Internal unique name of the sorter +/// name = sortReactionWheel +/// // Label for the UI +/// Label = Reaction Wheel Torque +/// // The variable to use for this sorter +/// SortVariable = ModuleReactionWheel_AverageTorque +/// // The VAB categories where this sorter will appear +/// VisibleCategories +/// { +/// category = Function_Pods +/// category = Function_Control +/// } +/// } +ORGANIZERSORTERS +{ + ORGANIZERSORTERTYPE + { + name = sortReactionWheel + Label = #LOC_VABOrganizer_Sorter_ReactionWheelTorque + SortVariable = ModuleVar_ReactionWheelAverageTorque + VisibleCategories + { + category = Function_Pods + category = Function_Control + } + } + ORGANIZERSORTERTYPE + { + name = sortResourcePower + Label = #LOC_VABOrganizer_Sorter_PowerMax + SortVariable = ResourceVar_Power + VisibleCategories + { + category = Function_Pods + } + } + ORGANIZERSORTERTYPE + { + name = sortResourceMonoprop + Label = #LOC_VABOrganizer_Sorter_MonopropMax + SortVariable = ResourceVar_Monoprop + VisibleCategories + { + category = Function_Pods + } + } + ORGANIZERSORTERTYPE + { + name = sortCrewCapacity + Label = #LOC_VABOrganizer_Sorter_CrewCapacity + SortVariable = PartVar_CrewCapacity + VisibleCategories + { + category = Function_Pods + category = Function_Utility + category = Function_Science + } + } + ORGANIZERSORTERTYPE + { + name = sortEngineISPASL + Label = #LOC_VABOrganizer_Sorter_EngineISPSL + SortVariable = ModuleVar_EngineIspASL + VisibleCategories + { + category = Function_Engine + } + } + ORGANIZERSORTERTYPE + { + name = sortEngineISP + Label = #LOC_VABOrganizer_Sorter_EngineISPVac + SortVariable = ModuleVar_EngineIspVacuum + VisibleCategories + { + category = Function_Engine + } + } + ORGANIZERSORTERTYPE + { + name = sortEngineTWRASL + Label = #LOC_VABOrganizer_Sorter_EngineTWRSL + SortVariable = ModuleVar_EngineTWRASL + VisibleCategories + { + category = Function_Engine + } + } + ORGANIZERSORTERTYPE + { + name = sortEngineTWR + Label = #LOC_VABOrganizer_Sorter_EngineTWRVac + SortVariable = ModuleVar_EngineTWRVacuum + VisibleCategories + { + category = Function_Engine + } + } + ORGANIZERSORTERTYPE + { + name = sortEngineThrustASL + Label = #LOC_VABOrganizer_Sorter_EngineThrustSL + SortVariable = ModuleVar_EngineThrustASL + VisibleCategories + { + category = Function_Engine + } + } + ORGANIZERSORTERTYPE + { + name = sortEngineThrust + Label = #LOC_VABOrganizer_Sorter_EngineThrustVac + SortVariable = ModuleVar_EngineThrustVacuum + VisibleCategories + { + category = Function_Engine + } + } + ORGANIZERSORTERTYPE + { + name = sortEngineGimbal + Label = #LOC_VABOrganizer_Sorter_EngineGimbalRange + SortVariable = ModuleVar_EngineGimbal + VisibleCategories + { + category = Function_Engine + } + } + ORGANIZERSORTERTYPE + { + name = sortRCSThrust + Label = #LOC_VABOrganizer_Sorter_RCSThrustVac + SortVariable = ModuleVar_RCSThrustVacuum + VisibleCategories + { + category = Function_Control + category = Function_Pods + } + } + ORGANIZERSORTERTYPE + { + name = sortRCSISP + Label = #LOC_VABOrganizer_Sorter_RCSIspVac + SortVariable = ModuleVar_RCSIspVacuum + VisibleCategories + { + category = Function_Control + category = Function_Pods + } + } + ORGANIZERSORTERTYPE + { + name = sortAntennaPower + Label = #LOC_VABOrganizer_Sorter_AntennaPower + SortVariable = ModuleVar_AntennaPower + VisibleCategories + { + category = Function_Communication + category = Function_Pods + } + } + ORGANIZERSORTERTYPE + { + name = sortAntennaCost + Label = #LOC_VABOrganizer_Sorter_AntennaCost + SortVariable = ModuleVar_AntennaCost + VisibleCategories + { + category = Function_Communication + } + } + ORGANIZERSORTERTYPE + { + name = sortAntennaRate + Label = #LOC_VABOrganizer_Sorter_AntennaRate + SortVariable = ModuleVar_AntennaRate + VisibleCategories + { + category = Function_Communication + } + } + ORGANIZERSORTERTYPE + { + name = sortSASLevel + Label = #LOC_VABOrganizer_Sorter_SASLevel + SortVariable = ModuleVar_SASLevel + VisibleCategories + { + category = Function_Control + category = Function_Pods + } + } + ORGANIZERSORTERTYPE + { + name = sortPowerGeneration + Label = #LOC_VABOrganizer_Sorter_PowerGeneration + SortVariable = ModuleVar_PowerGenerated + VisibleCategories + { + category = Function_Electrical + } + } + ORGANIZERSORTERTYPE + { + name = sortPowerConsumption + Label = #LOC_VABOrganizer_Sorter_PowerConsumption + SortVariable = ModuleVar_PowerConsumed + VisibleCategories + { + category = Function_Utility + } + } + ORGANIZERSORTERTYPE + { + name = sortExperiment + Label = #LOC_VABOrganizer_Sorter_Experiment + SortVariable = ModuleVar_Experiment + VisibleCategories + { + category = Function_Science + } + } + ORGANIZERSORTERTYPE + { + name = sortExperimentValue + Label = #LOC_VABOrganizer_Sorter_ExperimentValue + SortVariable = ModuleVar_ExperimentValue + VisibleCategories + { + category = Function_Science + } + } + ORGANIZERSORTERTYPE + { + name = sortInventory + Label = #LOC_VABOrganizer_Sorter_InventorySlots + SortVariable = ModuleVar_InventorySlots + VisibleCategories + { + category = Function_Utility + category = Function_Pods + category = Function_Cargo + } + } + ORGANIZERSORTERTYPE + { + name = sortInventoryVolume + Label = #LOC_VABOrganizer_Sorter_InventoryVolume + SortVariable = ModuleVar_InventoryVolume + VisibleCategories + { + category = Function_Utility + category = Function_Pods + category = Function_Cargo + } + } + ORGANIZERSORTERTYPE + { + name = sortHeatProduced + Label = #LOC_VABOrganizer_Sorter_HeatGeneration + SortVariable = ModuleVar_HeatGenerated + VisibleCategories + { + category = Function_Utility + category = Function_Engine + category = Function_Electrical + } + } + ORGANIZERSORTERTYPE + { + name = sortHeatConsumed + Label = #LOC_VABOrganizer_Sorter_HeatConsumption + SortVariable = ModuleVar_HeatRemoved + VisibleCategories + { + category = Function_Thermal + } + } +} \ No newline at end of file diff --git a/GameData/VABOrganizer/Sorting/sortVariablesStock.cfg b/GameData/VABOrganizer/Sorting/sortVariablesStock.cfg new file mode 100644 index 0000000..d00ec21 --- /dev/null +++ b/GameData/VABOrganizer/Sorting/sortVariablesStock.cfg @@ -0,0 +1,191 @@ +/// This file lists all the variables that are config-generated - e.g. can be simply parsed from a config file +/// ORGANIZERSORTVARIABLE +/// { +/// name = moduleDataTransmitter_antennaPower +/// /// The name of the variable to use to store the data. This is used in the actual sorter definition +/// /// Convention is that if it is Part-level use PartVar_myVarName, if Module-level use ModuleVar_myVarName +/// VariableName = ModuleVar_AntennaPower +/// /// What kind of node the data comes from: PART, RESOURCE, MODULE +/// NodeType = MODULE +/// /// What the name of the node is +/// NodeName = ModuleDataTransmitter +/// // The actual confignode value to parse from +/// FieldName = antennaPower +/// } +ORGANIZERVARIABLES +{ + //// PART-level + ORGANIZERSORTVARIABLE + { + name = part_crewCapacity + VariableName = PartVar_CrewCapacity + NodeType = PART + FieldName = CrewCapacity + } + /// RESOURCE-level + ORGANIZERSORTVARIABLE + { + name = resource_electricCharge + VariableName = ResourceVar_Power + NodeType = RESOURCE + NodeName = ElectricCharge + FieldName = maxAmount + } + ORGANIZERSORTVARIABLE + { + name = resource_monoProp + VariableName = ResourceVar_Monoprop + NodeType = RESOURCE + NodeName = MonoPropellant + FieldName = maxAmount + } + + /// MODULE-level + ORGANIZERSORTVARIABLE + { + name = moduleDataTransmitter_antennaPower + VariableName = ModuleVar_AntennaPower + NodeType = MODULE + NodeName = ModuleDataTransmitter + FieldName = antennaPower + } + ORGANIZERSORTVARIABLE + { + name = moduleGimbal_range + VariableName = ModuleVar_EngineGimbal + NodeType = MODULE + NodeName = ModuleGimbal + FieldName = gimbalRange + } + ORGANIZERSORTVARIABLE + { + name = moduleSAS_Level + VariableName = ModuleVar_SASLevel + NodeType = MODULE + NodeName = ModuleSAS + FieldName = SASServiceLevel + } + ORGANIZERSORTVARIABLE + { + name = moduleRadiator_capacity + VariableName = ModuleVar_RadiatorCapacity + NodeType = MODULE + NodeName = ModuleActiveRadiator + FieldName = maxEnergyTransfer + } + ORGANIZERSORTVARIABLE + { + name = moduleSolarPanel_powerProduced + VariableName = ModuleVar_PowerGenerated + NodeType = MODULE + NodeName = ModuleDeployableSolarPanel + FieldName = chargeRate + } + ORGANIZERSORTVARIABLE + { + name = moduleGenerator_powerProduced + VariableName = ModuleVar_PowerGenerated + NodeType = MODULE_DATA + NodeName = ModuleGenerator + DataNodeType = OUTPUT_RESOURCE + DataNodeName = ElectricCharge + FieldName = rate + } + ORGANIZERSORTVARIABLE + { + name = moduleResourceConverter_powerProduced + VariableName = ModuleVar_PowerGenerated + NodeType = MODULE_DATA + NodeName = ModuleResourceConverter + DataNodeType = OUTPUT_RESOURCE + DataNodeName = ElectricCharge + FieldName = Ratio + } + ORGANIZERSORTVARIABLE + { + name = moduleResourceConverter_powerConsumed + VariableName = ModuleVar_PowerConsumed + NodeType = MODULE_DATA + NodeName = ModuleResourceConverter + DataNodeType = INPUT_RESOURCE + DataNodeName = ElectricCharge + FieldName = Ratio + } + ORGANIZERSORTVARIABLE + { + name = moduleResourceHarvester_powerConsumed + VariableName = ModuleVar_PowerConsumed + NodeType = MODULE_DATA + NodeName = ModuleResourceHarvester + DataNodeType = INPUT_RESOURCE + DataNodeName = ElectricCharge + FieldName = Ratio + } + ORGANIZERSORTVARIABLE + { + name = moduleAsteroidDrill_powerConsumed + VariableName = ModuleVar_PowerConsumed + NodeType = MODULE_DATA + NodeName = ModuleAsteroidDrill + DataNodeType = INPUT_RESOURCE + DataNodeName = ElectricCharge + FieldName = Ratio + } + ORGANIZERSORTVARIABLE + { + name = moduleCometDrill_powerConsumed + VariableName = ModuleVar_PowerConsumed + NodeType = MODULE_DATA + NodeName = ModuleCometDrill + DataNodeType = INPUT_RESOURCE + DataNodeName = ElectricCharge + FieldName = Ratio + } + + ORGANIZERSORTVARIABLE + { + name = moduleSolarPanel_powerProduced + VariableName = ModuleVar_InventorySlots + NodeType = MODULE + NodeName = ModuleInventoryPart + FieldName = InventorySlots + } + ORGANIZERSORTVARIABLE + { + name = moduleSolarPanel_powerProduced + VariableName = ModuleVar_InventoryVolume + NodeType = MODULE + NodeName = ModuleInventoryPart + FieldName = packedVolumeLimit + } + ORGANIZERSORTVARIABLE + { + name = moduleActiveRadiator_heatRemoved + VariableName = ModuleVar_HeatRemoved + NodeType = MODULE + NodeName = ModuleActiveRadiator + FieldName = maxEnergyTransfer + } +} +/// For user reference, internal variables +/// - ModuleVar_ReactionWheelAverageTorque -> ModuleReactionWheel: Average torque from wheel axes +/// - ModuleVar_RCSThrustVacuum -> ModuleRCSFX: Single thruster thrust in vacuum +/// - ModuleRCS_RCSThrustASL -> ModuleRCSFX: Single thruster thrust at 1 atm +/// - ModuleVar_RCSIspASL -> ModuleRCSFX: Isp at 1 atm +/// - ModuleVar_RCSIspVacuum -> ModuleRCSFX: Isp in Vacuum +/// - ModuleVar_EngineThrustVacuum -> ModuleEnginesFX +/// - ModuleVar_EngineThrustASL -> ModuleEnginesFX +/// - ModuleVar_EngineTWRASL -> ModuleEnginesFX +/// - ModuleVar_EngineTWRVacuum -> ModuleEnginesFX +/// - ModuleVar_EngineIspASL -> ModuleEnginesFX: Isp at 1 atm +/// - ModuleVar_EngineIspVacuum -> ModuleEnginesFX: Isp in Vacuum +/// - ModuleVar_AntennaCost -> ModuleDataTransmitter: Cost per second of data transmission +/// - ModuleVar_AntennaRate -> ModuleDataTransmitter: Rate of data transmission +/// - ModuleVar_AntennaCombinability -> ModuleDataTransmitter: Antenna combineability +/// - ModuleVar_Experiment -> ModuleScienceExperiment: the hashed experiment ID +/// - ModuleVar_ExperimentValue -> ModuleScienceExperiment: the calculated value of the experiment +/// +/// +/// +/// +/// \ No newline at end of file diff --git a/GameData/VABOrganizer/Versioning/VABOrganizer.version b/GameData/VABOrganizer/Versioning/VABOrganizer.version index e6ceb76..b1bd2a4 100644 --- a/GameData/VABOrganizer/Versioning/VABOrganizer.version +++ b/GameData/VABOrganizer/Versioning/VABOrganizer.version @@ -5,8 +5,8 @@ "VERSION": { "MAJOR":1, - "MINOR":0, - "PATCH":1, + "MINOR":1, + "PATCH":0, "BUILD":0 }, "KSP_VERSION": diff --git a/Source/VABOrganizer/AdvancedSortType.cs b/Source/VABOrganizer/AdvancedSortType.cs new file mode 100644 index 0000000..f143ccc --- /dev/null +++ b/Source/VABOrganizer/AdvancedSortType.cs @@ -0,0 +1,75 @@ +using System.Collections.Generic; +using KSP.Localization; + +namespace VABOrganizer +{ + public class AdvancedSortType + { + public string Name + { + get { return name; } + private set { name = value; } + } + /// + /// Localized sorter name + /// + public string Label + { + get { return label; } + private set { label = value; } + } + /// + /// The sorter to use + /// + public string Sorter + { + get { return sorter; } + private set { sorter = value; } + } + /// + /// The VAB PartCategories where this sorter will be used + /// + public List AssociatedPartCategories + { + get { return partCategories; } + private set { partCategories = value; } + } + + protected const string NODE_NAME = "name"; + protected const string NODE_LABEL = "Label"; + protected const string NODE_SORTER = "SortVariable"; + protected const string NODE_ASSOCIATED_CATEGORY = "VisibleCategories"; + protected const string NODE_CATEGORY = "category"; + + private string name = "category"; + private string label = "label"; + private string sorter = "isp"; + private List partCategories; + + public AdvancedSortType() { } + + public AdvancedSortType(ConfigNode node) + { + Load(node); + } + + public void Load(ConfigNode node) + { + node.TryGetValue(NODE_NAME, ref name); + node.TryGetValue(NODE_LABEL, ref label); + node.TryGetValue(NODE_SORTER, ref sorter); + + partCategories = new List(); + ConfigNode categoryNode = new ConfigNode(); + if (node.TryGetNode(NODE_ASSOCIATED_CATEGORY, ref categoryNode)) + { + string[] categories = categoryNode.GetValues(NODE_CATEGORY); + foreach (string stringCat in categories) + { + partCategories.Add(stringCat); + } + } + label = Localizer.Format(label); + } + } +} diff --git a/Source/VABOrganizer/AdvancedSorting.cs b/Source/VABOrganizer/AdvancedSorting.cs new file mode 100644 index 0000000..68d4a3c --- /dev/null +++ b/Source/VABOrganizer/AdvancedSorting.cs @@ -0,0 +1,249 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using UnityEngine; +using UnityEngine.UI; +using UniLinq; +using TMPro; +using KSP.UI; +using KSP.UI.Screens; +using KSP.UI.TooltipTypes; +using KSP.Localization; + +namespace VABOrganizer +{ + /// + /// Creates and manages the advanced sorting stuff + /// + public static class AdvancedSorting + { + public static AdvancedSortType CurrentAdvancedSort = null; + + static UIAdvancedSorterWidget SortWidget; + static UIListSorter uiSorterBase; + static EditorPartList uiPartList; + static string cachedCategorySort = ""; + + const string BULKHEAD_SORT_KEY = "#LOC_VABOrganizer_BulkheadSortTooltip"; + const string ADVANCED_SORT_KEY = "#LOC_VABOrganizer_AdvancedSortTooltip"; + + /// + /// Creates the sorting UI + /// + public static void CreateVABSortUI() + { + uiSorterBase = GameObject.FindObjectOfType(); + uiPartList = GameObject.FindObjectOfType(); + GameObject sortByNameButton = uiSorterBase.gameObject.GetChild("StateButtonName"); + if (!uiSorterBase.gameObject.GetChild("StateButtonProfile")) + { + CreateSortButton(uiSorterBase, sortByNameButton, "Profile", 4, true, BULKHEAD_SORT_KEY); + CreateSortButton(uiSorterBase, sortByNameButton, "Custom", 5, false, ADVANCED_SORT_KEY); + + } + else + { + /// maybe throw warning later + } + RestyleButtons(uiSorterBase.transform); + CreateAdvancedButton(uiSorterBase.transform); + } + + /// + /// Create a new sorting button + /// + /// + /// + /// + /// + /// + public static void CreateSortButton(UIListSorter sorter, GameObject template, string sortName, int buttonIndex, bool startingSorter, string tooltipKey) + { + GameObject newSortButtonObj = GameObject.Instantiate(template); + newSortButtonObj.transform.SetParent(sorter.transform, false); + + Button sortingButton = newSortButtonObj.GetComponent