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/zh-cn.cfg b/GameData/VABOrganizer/Localization/zh-cn.cfg new file mode 100644 index 0000000..169c8ae --- /dev/null +++ b/GameData/VABOrganizer/Localization/zh-cn.cfg @@ -0,0 +1,161 @@ +Localization +{ + zh-cn + { + #LOC_VABOrganizer_BulkheadSortTooltip = 按截面排序 + // Bulkhead codes + // --------------- + // Stock and cylinders + #LOC_VABOrganizer_Bulkhead_srf = 贴附 + #LOC_VABOrganizer_Bulkhead_size00 = 0.3125m + #LOC_VABOrganizer_Bulkhead_size0 = 0.625m + #LOC_VABOrganizer_Bulkhead_size0p5 = 0.9375m + #LOC_VABOrganizer_Bulkhead_size1 = 1.25m + #LOC_VABOrganizer_Bulkhead_size1p5 = 1.875m + #LOC_VABOrganizer_Bulkhead_size2 = 2.5m + #LOC_VABOrganizer_Bulkhead_size2p5 = 3.125m + #LOC_VABOrganizer_Bulkhead_size3 = 3.75m + #LOC_VABOrganizer_Bulkhead_size3p5 = 4.375m + #LOC_VABOrganizer_Bulkhead_size4 = 5m + #LOC_VABOrganizer_Bulkhead_size4p5 = 5.625m + #LOC_VABOrganizer_Bulkhead_size5 = 6.25m + #LOC_VABOrganizer_Bulkhead_size5p5 = 6.875m + #LOC_VABOrganizer_Bulkhead_size6 = 7.5m + #LOC_VABOrganizer_Bulkhead_size6p5 = 8.125m + #LOC_VABOrganizer_Bulkhead_size7 = 8.75m + #LOC_VABOrganizer_Bulkhead_size7p5 = 9.375m + #LOC_VABOrganizer_Bulkhead_size8 = 10m + + #LOC_VABOrganizer_Bulkhead_mk1 = MK1 + #LOC_VABOrganizer_Bulkhead_mk2 = MK2 + #LOC_VABOrganizer_Bulkhead_mk3 = MK3 + + // Mods + #LOC_VABOrganizer_Bulkhead_size1p8 = 2.25m + #LOC_VABOrganizer_Bulkhead_size1p2 = 1.5m + #LOC_VABOrganizer_Bulkhead_hex = HEX + #LOC_VABOrganizer_Bulkhead_octo = OCT + #LOC_VABOrganizer_Bulkhead_spinal = SPI + #LOC_VABOrganizer_Bulkhead_mk4 = MK4 + + // Subcategory names + // --------------- + #LOC_VABOrganizer_Subcategory_misc = 杂项 + #LOC_VABOrganizer_Bulkhead_procedural = 程序化 + + // Aero + #LOC_VABOrganizer_Subcategory_wings = 机翼 + #LOC_VABOrganizer_Subcategory_controlSurfaces = 控制面 + #LOC_VABOrganizer_Subcategory_noses = 头锥 + #LOC_VABOrganizer_Subcategory_intakes = 进气口 + #LOC_VABOrganizer_Subcategory_deployableControlSurfaces = 可开展控制面 + #LOC_VABOrganizer_Subcategory_rotorBlades = 旋翼叶片 + #LOC_VABOrganizer_Subcategory_airAcessories = 引擎吊舱 + + // Cargo + #LOC_VABOrganizer_Subcategory_cargoStorage = 货物存储 + #LOC_VABOrganizer_Subcategory_deployable = 可部署 + + // Command + #LOC_VABOrganizer_Subcategory_landers = 登陆舱 + #LOC_VABOrganizer_Subcategory_probes = 探测器核心 + #LOC_VABOrganizer_Subcategory_cockpits = 座舱 + #LOC_VABOrganizer_Subcategory_pods = 指令舱 + #LOC_VABOrganizer_Subcategory_stationCores = 空间站核心 + #LOC_VABOrganizer_Subcategory_seats = 控制座椅 + + // Comms + #LOC_VABOrganizer_Subcategory_direct = 天线 + #LOC_VABOrganizer_Subcategory_relay = 中继天线 + #LOC_VABOrganizer_Subcategory_reflector = 反射面 + + // Control + #LOC_VABOrganizer_Subcategory_rcs = RCS + #LOC_VABOrganizer_Subcategory_reactionWheels = 动量轮 + #LOC_VABOrganizer_Subcategory_sas = SAS + + // Coupling + #LOC_VABOrganizer_Subcategory_decouplers = 分离器 + #LOC_VABOrganizer_Subcategory_separators = 切分器 + #LOC_VABOrganizer_Subcategory_dockingPorts = 对接口 + #LOC_VABOrganizer_Subcategory_grapples = 抓取单元 + + // Electrical + #LOC_VABOrganizer_Subcategory_solarPanels = 太阳能电池板 + #LOC_VABOrganizer_Subcategory_batteries = 电池 + #LOC_VABOrganizer_Subcategory_rtgs = 放射性同位素热电机 + #LOC_VABOrganizer_Subcategory_fuelcells = 燃料电池 + #LOC_VABOrganizer_Subcategory_fissionReactors = 裂变反应堆 + #LOC_VABOrganizer_Subcategory_fusionReactors = 聚变反应堆 + + // Engines + #LOC_VABOrganizer_Subcategory_lfoEngines = 液体燃料引擎 + #LOC_VABOrganizer_Subcategory_cryogenicEngines = 低温燃料引擎 + #LOC_VABOrganizer_Subcategory_solidEngines = 固体燃料引擎 + #LOC_VABOrganizer_Subcategory_nuclearEngines = 核能引擎 + #LOC_VABOrganizer_Subcategory_ionEngines = 离子引擎 + #LOC_VABOrganizer_Subcategory_jetEngines = 喷气式引擎 + #LOC_VABOrganizer_Subcategory_propEngines = 螺旋桨引擎 + #LOC_VABOrganizer_Subcategory_monoEngines = 单组元推进剂引擎 + + // Fuel + #LOC_VABOrganizer_Subcategory_lfo = 火箭燃料 + #LOC_VABOrganizer_Subcategory_lf = 航空燃料 + #LOC_VABOrganizer_Subcategory_monoprop = 单组元推进剂 + #LOC_VABOrganizer_Subcategory_xenon = 氙气 + #LOC_VABOrganizer_Subcategory_argon = 氩气 + #LOC_VABOrganizer_Subcategory_lithium = 锂 + #LOC_VABOrganizer_Subcategory_cryogenic = 低温燃料 + #LOC_VABOrganizer_Subcategory_nuclearFuel = 核燃料 + + // Ground + #LOC_VABOrganizer_Subcategory_legs = 着陆支架 + #LOC_VABOrganizer_Subcategory_wheels = 车轮 + #LOC_VABOrganizer_Subcategory_gear = 起落架 + + // Payload + #LOC_VABOrganizer_Subcategory_fairings = 整流罩 + #LOC_VABOrganizer_Subcategory_serviceBays = 服务舱 + #LOC_VABOrganizer_Subcategory_cargoBays = 货舱 + #LOC_VABOrganizer_Subcategory_cargoContainers = 货物集装箱 + + // Robotics + #LOC_VABOrganizer_Subcategory_rotors = 转子 + #LOC_VABOrganizer_Subcategory_hinges = 铰链 & 伺服电机 + #LOC_VABOrganizer_Subcategory_pistons = 活塞 + + // Science + #LOC_VABOrganizer_Subcategory_instruments = 实验仪器 + #LOC_VABOrganizer_Subcategory_labs = 实验室 + #LOC_VABOrganizer_Subcategory_scienceStorage = 科学数据存储 + #LOC_VABOrganizer_Subcategory_greenhouses = 温室 + #LOC_VABOrganizer_Subcategory_resourceScanners = 资源扫描器 + + // Structural + #LOC_VABOrganizer_Subcategory_truss = 桁架 + #LOC_VABOrganizer_Subcategory_trussAdapters = 桁架适配器 + #LOC_VABOrganizer_Subcategory_trussHubs = 桁架枢纽 + #LOC_VABOrganizer_Subcategory_adapters = 转接器 + #LOC_VABOrganizer_Subcategory_radialAdapters = 径向转接器 + #LOC_VABOrganizer_Subcategory_engineMounts = 引擎支架 + #LOC_VABOrganizer_Subcategory_girders = 钢梁 + #LOC_VABOrganizer_Subcategory_hubs = 枢纽 + #LOC_VABOrganizer_Subcategory_multicouplers = 多向转接器 + #LOC_VABOrganizer_Subcategory_tubes = 管道 + + // Thermal + #LOC_VABOrganizer_Subcategory_heatShields = 热防护罩 + #LOC_VABOrganizer_Subcategory_radiators = 散热器 + + // Utility + #LOC_VABOrganizer_Subcategory_parachutes = 降落伞 + #LOC_VABOrganizer_Subcategory_resources = 采矿 + #LOC_VABOrganizer_Subcategory_lights = 照明 + #LOC_VABOrganizer_Subcategory_ladders = 梯子 + #LOC_VABOrganizer_Subcategory_flags = 旗帜 + #LOC_VABOrganizer_Subcategory_crewTransport = 坎巴拉人运送 + #LOC_VABOrganizer_Subcategory_crewHabitation = 居住舱 + #LOC_VABOrganizer_Subcategory_airlocks = 气闸舱 + + } +} \ No newline at end of file diff --git a/GameData/VABOrganizer/Plugins/VABOrganizer.dll b/GameData/VABOrganizer/Plugins/VABOrganizer.dll index 28c93cf..d73ec5d 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/advancedSorters.cfg b/GameData/VABOrganizer/advancedSorters.cfg new file mode 100644 index 0000000..0c991ca --- /dev/null +++ b/GameData/VABOrganizer/advancedSorters.cfg @@ -0,0 +1,203 @@ +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortReactionWheel + // Label for the UI + Label = Reaction Wheel Torque + // The variable to sort against + Sorter = ModuleReactionWheel_AverageTorque + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Pods + category = Function_Control + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortCrewCapacity + // Label for the UI + Label = Crew Capacity + // The variable to sort against + Sorter = part_crewCapacity + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Pods + category = Function_Utility + category = Function_Science + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortEngineISPASL + // Label for the UI + Label = ISP (SL) + // The variable to sort against + Sorter = ModuleEngines_IspASL + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Engine + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortEngineISP + // Label for the UI + Label = ISP (Vacuum) + // The variable to sort against + Sorter = ModuleEngines_IspVacuum + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Engine + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortEngineTWRASL + // Label for the UI + Label = TWR (SL) + // The variable to sort against + Sorter = ModuleEngines_TWRASL + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Engine + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortEngineTWR + // Label for the UI + Label = TWR (Vacuum) + // The variable to sort against + Sorter = ModuleEngines_TWRVacuum + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Engine + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortEngineThrustASL + // Label for the UI + Label = Thrust (SL) + // The variable to sort against + Sorter = ModuleEngines_ThrustASL + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Engine + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortEngineThrust + // Label for the UI + Label = Thrust (Vacuum) + // The variable to sort against + Sorter = ModuleEngines_ThrustVacuum + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Engine + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortEngineGimbal + // Label for the UI + Label = Gimbal Range + // The variable to sort against + Sorter = ModuleGimbal_Range + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Engine + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortRCSThrust + // Label for the UI + Label = RCS Thrust + // The variable to sort against + Sorter = ModuleRCS_ThrustVacuum + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Control + category = Function_Pods + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortRCSISP + // Label for the UI + Label = RCS Isp + // The variable to sort against + Sorter = ModuleRCS_ThrustVacuum + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Control + category = Function_Pods + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortAntennaPower + // Label for the UI + Label = Antenna Power + // The variable to sort against + Sorter = ModuleDataTransmitter_Power + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Communication + category = Function_Pods + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortSASLevel + // Label for the UI + Label = SAS Level + // The variable to sort against + Sorter = ModuleSAS_ServiceLevel + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Control + category = Function_Pods + } +} +ORGANIZERSORTERTYPE +{ + // Internal unique name of the sorter + name = sortSolarCharge + // Label for the UI + Label = Power Production + // The variable to sort against + Sorter = ModuleSolarPanel_ChargeRate + // The VAB categories where this sorter will appear + VisibleCategories + { + category = Function_Electrical + } +} \ No newline at end of file diff --git a/Source/VABOrganizer/AdvancedSortType.cs b/Source/VABOrganizer/AdvancedSortType.cs new file mode 100644 index 0000000..de4202d --- /dev/null +++ b/Source/VABOrganizer/AdvancedSortType.cs @@ -0,0 +1,77 @@ +using System; +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 = "Sorter"; + 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..0056cd1 --- /dev/null +++ b/Source/VABOrganizer/AdvancedSorting.cs @@ -0,0 +1,245 @@ +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"; + + /// + /// 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); + CreateSortButton(uiSorterBase, sortByNameButton, "Custom", 5, false); + + } + 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) + { + GameObject newSortButtonObj = GameObject.Instantiate(template); + newSortButtonObj.transform.SetParent(sorter.transform, false); + + Button sortingButton = newSortButtonObj.GetComponent