/// <summary> /// Helper method to find the variant set for the input model definition. Will nullref/error if no variant set is found. Will NOT create a new set if not found. /// </summary> /// <param name="def"></param> /// <returns></returns> private ModelDefinitionVariantSet getVariantSet(ModelDefinitionLayoutOptions def) { //returns the first variant set out of all variants where the variants definitions contains the input definition return(variantSets.Values.Where((a, b) => { return a.definitions.Contains(def); }).First()); }
/// <summary> /// Initialize the UI controls, including default values, and specifying delegates for their 'onClick' methods.<para/> /// All UI based interaction code will be defined/run through these delegates. /// </summary> private void initializeUI() { Action <ROEModularSRB> modelChangedAction = (m) => { m.updateModulePositions(); m.updateDimensions(); m.updateMassAndCost(); m.updateAttachNodes(true); m.updateAvailableVariants(); m.updateDragCubes(); m.updateRCSModule(); m.updateEngineModule(); ROLModInterop.updateResourceVolume(m.part); }; //set up the core variant UI control string[] variantNames = ROLUtils.getNames(variantSets.Values, m => m.variantName); this.ROLupdateUIChooseOptionControl(nameof(currentVariant), variantNames, variantNames, true, currentVariant); Fields[nameof(currentVariant)].guiActiveEditor = variantSets.Count > 1; Fields[nameof(currentVariant)].uiControlEditor.onFieldChanged = (a, b) => { //TODO find variant set for the currently enabled core model //query the index from that variant set ModelDefinitionVariantSet prevMdvs = getVariantSet(coreModule.definition.name); //this is the index of the currently selected model within its variant set int previousIndex = prevMdvs.indexOf(coreModule.layoutOptions); //grab ref to the current/new variant set ModelDefinitionVariantSet mdvs = getVariantSet(currentVariant); //and a reference to the model from same index out of the new set ([] call does validation internally for IAOOBE) ModelDefinitionLayoutOptions newCoreDef = mdvs[previousIndex]; //now, call model-selected on the core model to update for the changes, including symmetry counterpart updating. this.ROLactionWithSymmetry(m => { m.currentVariant = currentVariant; m.coreModule.modelSelected(newCoreDef.definition.name); modelChangedAction(m); }); }; Fields[nameof(currentDiameter)].uiControlEditor.onFieldChanged = (a, b) => { this.ROLactionWithSymmetry(m => { if (m != this) { m.currentDiameter = this.currentDiameter; } modelChangedAction(m); m.prevDiameter = m.currentDiameter; }); ROLStockInterop.fireEditorUpdate(); }; Fields[nameof(currentVScale)].uiControlEditor.onFieldChanged = (a, b) => { this.ROLactionWithSymmetry(m => { if (m != this) { m.currentVScale = this.currentVScale; } modelChangedAction(m); }); ROLStockInterop.fireEditorUpdate(); }; Fields[nameof(currentNose)].uiControlEditor.onFieldChanged = (a, b) => { noseModule.modelSelected(a, b); this.ROLactionWithSymmetry(modelChangedAction); ROLStockInterop.fireEditorUpdate(); }; Fields[nameof(currentCore)].uiControlEditor.onFieldChanged = (a, b) => { coreModule.modelSelected(a, b); this.ROLactionWithSymmetry(modelChangedAction); ROLStockInterop.fireEditorUpdate(); }; Fields[nameof(currentMount)].uiControlEditor.onFieldChanged = (a, b) => { mountModule.modelSelected(a, b); this.ROLactionWithSymmetry(modelChangedAction); ROLStockInterop.fireEditorUpdate(); }; //------------------MODEL DIAMETER SWITCH UI INIT---------------------// if (maxDiameter == minDiameter) { Fields[nameof(currentDiameter)].guiActiveEditor = false; } else { this.ROLupdateUIFloatEditControl(nameof(currentDiameter), minDiameter, maxDiameter, diameterLargeStep, diameterSmallStep, diameterSlideStep, true, currentDiameter); } Fields[nameof(currentVScale)].guiActiveEditor = enableVScale; //------------------MODULE TEXTURE SWITCH UI INIT---------------------// Fields[nameof(currentNoseTexture)].uiControlEditor.onFieldChanged = noseModule.textureSetSelected; Fields[nameof(currentCoreTexture)].uiControlEditor.onFieldChanged = coreModule.textureSetSelected; Fields[nameof(currentMountTexture)].uiControlEditor.onFieldChanged = mountModule.textureSetSelected; Fields[nameof(currentLowerRCSTexture)].uiControlEditor.onFieldChanged = lowerRCSModule.textureSetSelected; if (HighLogic.LoadedSceneIsEditor) { GameEvents.onEditorShipModified.Add(new EventData <ShipConstruct> .OnEvent(onEditorVesselModified)); } // Force the Textures selection to show up to keep the PAW at the same size Fields[nameof(currentNoseTexture)].guiActiveEditor = true; Fields[nameof(currentCoreTexture)].guiActiveEditor = true; Fields[nameof(currentMountTexture)].guiActiveEditor = true; Fields[nameof(currentLowerRCSTexture)].guiActiveEditor = true; }
public int indexOf(ModelDefinitionLayoutOptions def) { return(definitions.IndexOf(def)); }