private ReloadingDatabaseDialog(ModuleManager parent) { bool startedReload = false; this.parent = parent; UISkinDef skinDef = HighLogic.UISkin; UIStyle centeredTextStyle = new UIStyle() // FIXME: There must be a smarter way to do that on Unity5, right? { name = skinDef.label.name, normal = skinDef.label.normal, highlight = skinDef.label.highlight, disabled = skinDef.label.disabled, font = skinDef.label.font, fontSize = skinDef.label.fontSize, fontStyle = skinDef.label.fontStyle, wordWrap = skinDef.label.wordWrap, richText = skinDef.label.richText, alignment = TextAnchor.UpperCenter, clipping = skinDef.label.clipping, lineHeight = skinDef.label.lineHeight, stretchHeight = skinDef.label.stretchHeight, stretchWidth = skinDef.label.stretchWidth, fixedHeight = skinDef.label.fixedHeight, fixedWidth = skinDef.label.fixedWidth }; float totalLoadWeight = GameDatabase.Instance.LoadWeight() + PartLoader.Instance.LoadWeight(); PopupDialog reloadingDialog = PopupDialog.SpawnPopupDialog( new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new MultiOptionDialog( "ModuleManagerReloading", "", "ModuleManager - Reloading Database", skinDef, new Rect(0.5f, 0.5f, 600f, 60f), new DialogGUIFlexibleSpace(), new DialogGUIVerticalLayout( new DialogGUIFlexibleSpace(), new DialogGUILabel(delegate() { float progressFraction; if (!startedReload) { progressFraction = 0f; startedReload = true; } else if (!GameDatabase.Instance.IsReady() || !PostPatchLoader.Instance.IsReady()) { progressFraction = GameDatabase.Instance.ProgressFraction() * GameDatabase.Instance.LoadWeight(); progressFraction /= totalLoadWeight; } else if (!PartLoader.Instance.IsReady()) { progressFraction = GameDatabase.Instance.LoadWeight() + (PartLoader.Instance.ProgressFraction() * GameDatabase.Instance.LoadWeight()); progressFraction /= totalLoadWeight; } else { progressFraction = 1f; } return($"Overall progress: {progressFraction:P0}"); }, centeredTextStyle, expandW : true), new DialogGUILabel(delegate() { if (!startedReload) { return("Starting"); } else if (!GameDatabase.Instance.IsReady()) { return(GameDatabase.Instance.ProgressTitle()); } else if (!PostPatchLoader.Instance.IsReady()) { return(PostPatchLoader.Instance.ProgressTitle()); } else if (!PartLoader.Instance.IsReady()) { return(PartLoader.Instance.ProgressTitle()); } else { return(""); } }), new DialogGUISpace(5f), new DialogGUILabel(() => this.parent.patchRunner.Status) ) ), false, skinDef); }
/* Not required anymore. At least * public static bool IsABadIdea() * { * return (intPtr.ToInt64() == long.MaxValue) && (Environment.OSVersion.Platform == PlatformID.Win32NT); * } */ private IEnumerator DataBaseReloadWithMM(bool dump = false) { QualitySettings.vSyncCount = 0; Application.targetFrameRate = -1; patchRunner = new MMPatchRunner(new PrefixLogger("ModuleManager", new UnityLogger(Debug.unityLogger))); float totalLoadWeight = GameDatabase.Instance.LoadWeight() + PartLoader.Instance.LoadWeight(); bool startedReload = false; UISkinDef skinDef = HighLogic.UISkin; UIStyle centeredTextStyle = new UIStyle(skinDef.label) { alignment = TextAnchor.UpperCenter }; PopupDialog reloadingDialog = PopupDialog.SpawnPopupDialog(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new MultiOptionDialog( "ModuleManagerReloading", "", "ModuleManager - Reloading Database", skinDef, new Rect(0.5f, 0.5f, 600f, 60f), new DialogGUIFlexibleSpace(), new DialogGUIVerticalLayout( new DialogGUIFlexibleSpace(), new DialogGUILabel(delegate() { float progressFraction; if (!startedReload) { progressFraction = 0f; } else if (!GameDatabase.Instance.IsReady() || !PostPatchLoader.Instance.IsReady()) { progressFraction = GameDatabase.Instance.ProgressFraction() * GameDatabase.Instance.LoadWeight(); progressFraction /= totalLoadWeight; } else if (!PartLoader.Instance.IsReady()) { progressFraction = GameDatabase.Instance.LoadWeight() + (PartLoader.Instance.ProgressFraction() * GameDatabase.Instance.LoadWeight()); progressFraction /= totalLoadWeight; } else { progressFraction = 1f; } return($"Overall progress: {progressFraction:P0}"); }, centeredTextStyle, expandW : true), new DialogGUILabel(delegate() { if (!startedReload) { return("Starting"); } else if (!GameDatabase.Instance.IsReady()) { return(GameDatabase.Instance.ProgressTitle()); } else if (!PostPatchLoader.Instance.IsReady()) { return(PostPatchLoader.Instance.ProgressTitle()); } else if (!PartLoader.Instance.IsReady()) { return(PartLoader.Instance.ProgressTitle()); } else { return(""); } }), new DialogGUISpace(5f), new DialogGUILabel(() => patchRunner.Status) ) ), false, skinDef); yield return(null); GameDatabase.Instance.Recompile = true; GameDatabase.Instance.StartLoad(); startedReload = true; yield return(null); StartCoroutine(patchRunner.Run()); // wait for it to finish while (!GameDatabase.Instance.IsReady()) { yield return(null); } PostPatchLoader.Instance.StartLoad(); while (!PostPatchLoader.Instance.IsReady()) { yield return(null); } if (dump) { OutputAllConfigs(); } PartLoader.Instance.StartLoad(); while (!PartLoader.Instance.IsReady()) { yield return(null); } // Needs more work. //ConfigNode game = HighLogic.CurrentGame.config.GetNode("GAME"); //if (game != null && ResearchAndDevelopment.Instance != null) //{ // ScreenMessages.PostScreenMessage("GAME found"); // ConfigNode scenario = game.GetNodes("SCENARIO").FirstOrDefault((ConfigNode n) => n.name == "ResearchAndDevelopment"); // if (scenario != null) // { // ScreenMessages.PostScreenMessage("SCENARIO found"); // ResearchAndDevelopment.Instance.OnLoad(scenario); // } //} QualitySettings.vSyncCount = GameSettings.SYNC_VBL; Application.targetFrameRate = GameSettings.FRAMERATE_LIMIT; reloadingDialog.Dismiss(); }
private void OpenMainWindow() { if (mainWindow != null) { Destroy(mainWindow); mainWindow = null; } if (appButton?.toggleButton?.CurrentState == KSP.UI.UIRadioButton.State.False) { return; } UISkinDef skin = UISkinManager.defaultSkin; // main window mainWindow = new GameObject("AdjustableModPanelWindow"); mainWindow.AddComponent <CanvasRenderer> (); var transform = mainWindow.AddComponent <RectTransform> (); var image = mainWindow.AddComponent <UnityEngine.UI.Image> (); image.sprite = skin.window.normal.background; image.type = UnityEngine.UI.Image.Type.Sliced; // put in the center of the screen transform.anchorMin = new Vector2(0.5f, 0.5f); transform.anchorMax = new Vector2(0.5f, 0.5f); transform.pivot = new Vector2(0.5f, 0.5f); var vert = mainWindow.AddComponent <UnityEngine.UI.VerticalLayoutGroup> (); vert.spacing = 3; vert.padding = new RectOffset(5, 5, 5, 5); var horzfitter = mainWindow.AddComponent <UnityEngine.UI.ContentSizeFitter> (); horzfitter.verticalFit = UnityEngine.UI.ContentSizeFitter.FitMode.PreferredSize; horzfitter.horizontalFit = UnityEngine.UI.ContentSizeFitter.FitMode.PreferredSize; // header var line = new GameObject(); line.AddComponent <RectTransform> (); var horlayout = line.AddComponent <UnityEngine.UI.HorizontalLayoutGroup> (); horlayout.spacing = 5; // header spacing var elem = new GameObject(); elem.AddComponent <RectTransform> (); var layout = elem.AddComponent <UnityEngine.UI.LayoutElement> (); layout.preferredHeight = 30; layout.preferredWidth = 255 + 55; elem.transform.SetParent(line.transform); // header elements foreach (var scene in appScenesNames) { elem = new GameObject(); elem.AddComponent <CanvasRenderer> (); elem.AddComponent <RectTransform> (); layout = elem.AddComponent <UnityEngine.UI.LayoutElement> (); var text = elem.AddComponent <TMPro.TextMeshProUGUI> (); text.text = scene.Value; text.font = UISkinManager.TMPFont; text.fontSize = 14; text.color = Color.white; text.fontStyle = TMPro.FontStyles.Bold; text.alignment = TMPro.TextAlignmentOptions.Center; layout.preferredHeight = 30; layout.preferredWidth = 70; elem.transform.SetParent(line.transform); } line.transform.SetParent(mainWindow.transform); int num = 0; foreach (var mod in descriptors) { if (!mod.unmanageable && mod.defaultScenes != ApplicationLauncher.AppScenes.NEVER && mod.modIcon != null) { num++; } } Transform contentTransform = null; if (num < 11) { contentTransform = mainWindow.transform; } else { // scroller var scrollobj = new GameObject(); transform = scrollobj.AddComponent <RectTransform> (); layout = scrollobj.AddComponent <UnityEngine.UI.LayoutElement> (); layout.preferredHeight = 500; layout.preferredWidth = 630; scrollobj.transform.SetParent(mainWindow.transform); var scroll = scrollobj.AddComponent <UnityEngine.UI.ScrollRect> (); scroll.horizontal = false; scroll.vertical = true; scroll.scrollSensitivity = 10f; var viewport = new GameObject(); viewport.AddComponent <CanvasRenderer> (); transform = viewport.AddComponent <RectTransform> (); viewport.AddComponent <UnityEngine.UI.Image> (); viewport.AddComponent <UnityEngine.UI.Mask> ().showMaskGraphic = false; viewport.transform.SetParent(scrollobj.transform); transform.anchorMin = Vector2.zero; transform.anchorMax = Vector2.one; transform.pivot = new Vector2(0.5f, 0.5f); transform.sizeDelta = Vector2.zero; scroll.viewport = transform; var content = new GameObject(); transform = content.AddComponent <RectTransform> (); content.AddComponent <UnityEngine.UI.VerticalLayoutGroup> (); var fitter = content.AddComponent <UnityEngine.UI.ContentSizeFitter> (); fitter.verticalFit = UnityEngine.UI.ContentSizeFitter.FitMode.PreferredSize; fitter.horizontalFit = UnityEngine.UI.ContentSizeFitter.FitMode.PreferredSize; content.transform.SetParent(viewport.transform); scroll.content = transform; transform.anchorMin = new Vector2(0f, 1f); transform.anchorMax = new Vector2(0f, 1f); transform.pivot = new Vector2(0f, 1f); transform.sizeDelta = Vector2.zero; // scrollbar var scrollbar = new GameObject(); scrollbar.AddComponent <CanvasRenderer> (); transform = scrollbar.AddComponent <RectTransform> (); image = scrollbar.AddComponent <UnityEngine.UI.Image> (); image.sprite = skin.verticalScrollbar.normal.background; image.type = UnityEngine.UI.Image.Type.Sliced; var scrollbarcomp = scrollbar.AddComponent <UnityEngine.UI.Scrollbar> (); scrollbarcomp.direction = UnityEngine.UI.Scrollbar.Direction.BottomToTop; scrollbar.transform.SetParent(scrollobj.transform); transform.anchorMin = new Vector2(1f, 0f); transform.anchorMax = Vector2.one; transform.pivot = Vector2.one; transform.sizeDelta = new Vector2(20, 0); // scrollbar handle var handle = new GameObject(); handle.AddComponent <CanvasRenderer> (); transform = handle.AddComponent <RectTransform> (); image = handle.AddComponent <UnityEngine.UI.Image> (); image.sprite = skin.verticalScrollbarThumb.normal.background; image.type = UnityEngine.UI.Image.Type.Sliced; scrollbarcomp.targetGraphic = image; scrollbarcomp.transition = UnityEngine.UI.Selectable.Transition.SpriteSwap; var spritestate = scrollbarcomp.spriteState; spritestate.highlightedSprite = skin.verticalScrollbarThumb.highlight.background; spritestate.pressedSprite = skin.verticalScrollbarThumb.active.background; spritestate.disabledSprite = skin.verticalScrollbarThumb.disabled.background; scrollbarcomp.spriteState = spritestate; handle.transform.SetParent(scrollbar.transform); scrollbarcomp.handleRect = transform; scroll.verticalScrollbar = scrollbarcomp; contentTransform = content.transform; // reset config to fix some weirdness scrollbar.SetActive(false); scrollbar.SetActive(true); scrollobj.SetActive(false); scrollobj.SetActive(true); transform.offsetMin = Vector2.zero; transform.offsetMax = Vector2.zero; } foreach (var mod in descriptors) { if (mod.unmanageable || mod.modIcon == null || mod.defaultScenes == ApplicationLauncher.AppScenes.NEVER) { continue; } // mod lines line = new GameObject(); line.AddComponent <RectTransform> (); horlayout = line.AddComponent <UnityEngine.UI.HorizontalLayoutGroup> (); horlayout.spacing = 5; // pinned toggle element elem = new GameObject(); elem.AddComponent <RectTransform> (); layout = elem.AddComponent <UnityEngine.UI.LayoutElement> (); layout.preferredHeight = 50; layout.preferredWidth = 50; if (!GetType().Module.Name.StartsWith(mod.module)) { // toggle var toggle = new GameObject(); toggle.AddComponent <CanvasRenderer> (); transform = toggle.AddComponent <RectTransform> (); transform.anchorMin = new Vector2(0.5f, 0.5f); transform.anchorMax = new Vector2(0.5f, 0.5f); transform.pivot = new Vector2(0.5f, 0.5f); transform.sizeDelta = new Vector2(50, 50); image = toggle.AddComponent <UnityEngine.UI.Image> (); image.sprite = normalPin; image.type = UnityEngine.UI.Image.Type.Sliced; var togglecomp = toggle.AddComponent <UnityEngine.UI.Toggle> (); togglecomp.targetGraphic = image; togglecomp.image.sprite = normalPin; togglecomp.image.type = UnityEngine.UI.Image.Type.Sliced; togglecomp.transition = UnityEngine.UI.Selectable.Transition.SpriteSwap; var spritestatet = togglecomp.spriteState; spritestatet.highlightedSprite = highlightedPin; spritestatet.pressedSprite = activePin; spritestatet.disabledSprite = normalPin; togglecomp.spriteState = spritestatet; // checkbox for toggle var check = new GameObject(); check.AddComponent <CanvasRenderer> (); transform = check.AddComponent <RectTransform> (); check.transform.SetParent(toggle.transform); transform.anchorMin = new Vector2(0f, 0f); transform.anchorMax = new Vector2(1f, 1f); transform.pivot = new Vector2(0.5f, 0.5f); transform.sizeDelta = Vector2.zero; image = check.AddComponent <UnityEngine.UI.Image> (); togglecomp.graphic = image; image.sprite = activePin; image.type = UnityEngine.UI.Image.Type.Sliced; // toggle setup togglecomp.interactable = true; togglecomp.isOn = pinnedMods[mod]; togglecomp.onValueChanged.AddListener((value) => { pinnedMods[mod] = value; Debug.Log("[Adjustable Mod Panel] New pinned value for " + mod.module + ": " + value); forceUpdateCount += 1; }); var navigation = togglecomp.navigation; navigation.mode = UnityEngine.UI.Navigation.Mode.None; togglecomp.navigation = navigation; toggle.transform.SetParent(elem.transform); } elem.transform.SetParent(line.transform); // mod icon elem = new GameObject(); elem.AddComponent <CanvasRenderer> (); elem.AddComponent <RectTransform> (); var rimage = elem.AddComponent <UnityEngine.UI.RawImage> (); rimage.texture = mod.modIcon; layout = elem.AddComponent <UnityEngine.UI.LayoutElement> (); layout.preferredHeight = 50; layout.preferredWidth = 50; elem.transform.SetParent(line.transform); // mod name elem = new GameObject(); elem.AddComponent <CanvasRenderer> (); elem.AddComponent <RectTransform> (); layout = elem.AddComponent <UnityEngine.UI.LayoutElement> (); var text = elem.AddComponent <TMPro.TextMeshProUGUI> (); text.text = mod.module; text.font = UISkinManager.TMPFont; text.fontSize = 14; text.color = Color.white; text.fontStyle = TMPro.FontStyles.Bold; text.alignment = TMPro.TextAlignmentOptions.MidlineLeft; layout.preferredHeight = 50; layout.preferredWidth = 200; elem.transform.SetParent(line.transform); foreach (var scene in appScenesNames) { // mod line elements elem = new GameObject(); elem.AddComponent <RectTransform> (); layout = elem.AddComponent <UnityEngine.UI.LayoutElement> (); layout.preferredHeight = 50; layout.preferredWidth = 70; // toggle var toggle = new GameObject(); toggle.AddComponent <CanvasRenderer> (); transform = toggle.AddComponent <RectTransform> (); transform.anchorMin = new Vector2(0.5f, 0.5f); transform.anchorMax = new Vector2(0.5f, 0.5f); transform.pivot = new Vector2(0.5f, 0.5f); transform.sizeDelta = new Vector2(50, 50); image = toggle.AddComponent <UnityEngine.UI.Image> (); image.sprite = skin.toggle.normal.background; image.type = UnityEngine.UI.Image.Type.Sliced; var togglecomp = toggle.AddComponent <UnityEngine.UI.Toggle> (); togglecomp.targetGraphic = image; togglecomp.image.sprite = skin.toggle.normal.background; togglecomp.image.type = UnityEngine.UI.Image.Type.Sliced; togglecomp.transition = UnityEngine.UI.Selectable.Transition.SpriteSwap; var spritestate = togglecomp.spriteState; spritestate.highlightedSprite = skin.toggle.highlight.background; spritestate.pressedSprite = skin.toggle.active.background; spritestate.disabledSprite = skin.toggle.disabled.background; togglecomp.spriteState = spritestate; // checkbox for toggle var check = new GameObject(); check.AddComponent <CanvasRenderer> (); transform = check.AddComponent <RectTransform> (); check.transform.SetParent(toggle.transform); transform.anchorMin = new Vector2(0f, 0f); transform.anchorMax = new Vector2(1f, 1f); transform.pivot = new Vector2(0.5f, 0.5f); transform.sizeDelta = Vector2.zero; image = check.AddComponent <UnityEngine.UI.Image> (); togglecomp.graphic = image; image.sprite = skin.toggle.active.background; image.type = UnityEngine.UI.Image.Type.Sliced; // parameters var parameters = toggle.AddComponent <ToggleParameters> (); parameters.currentModKey = mod; parameters.toggleModScenes = scene.Key; // checkbox state bool allowed = (mod.defaultScenes & scene.Key) != ApplicationLauncher.AppScenes.NEVER; ApplicationLauncher.AppScenes curvalue = currentScenes[mod]; if (pendingChanges.ContainsKey(mod)) { curvalue = pendingChanges[mod]; } bool enabled = (curvalue & (scene.Key & (~mod.requiredScenes))) != ApplicationLauncher.AppScenes.NEVER; togglecomp.interactable = allowed; togglecomp.isOn = allowed & enabled; if (!allowed) { togglecomp.GetComponent <UnityEngine.UI.Image> ().color = new Color(0f, 0f, 0f, 0.25f); } // special case for "always on" if ((parameters.toggleModScenes & (~mod.requiredScenes)) == ApplicationLauncher.AppScenes.NEVER) { image.color = Color.gray; togglecomp.isOn = true; // just keep it always on togglecomp.onValueChanged.AddListener((value) => { if (!value) { togglecomp.isOn = true; } }); } else { // checkbox callback togglecomp.onValueChanged.AddListener((value) => { ApplicationLauncher.AppScenes currentvalue = currentScenes[mod]; if (pendingChanges.ContainsKey(mod)) { currentvalue = pendingChanges[mod]; } if (value != ((currentvalue & (parameters.toggleModScenes & (~mod.requiredScenes))) != ApplicationLauncher.AppScenes.NEVER)) { if (value) { pendingChanges[mod] = currentvalue | (parameters.toggleModScenes & mod.defaultScenes); } else { pendingChanges[mod] = (currentvalue & (~parameters.toggleModScenes)) | mod.requiredScenes; } Debug.Log("[Adjustable Mod Panel] New value for " + parameters.currentModKey.module + ": " + pendingChanges[mod]); forceUpdateCount += 1; UpdateToggles(); } }); } var navigation = togglecomp.navigation; navigation.mode = UnityEngine.UI.Navigation.Mode.None; togglecomp.navigation = navigation; toggle.transform.SetParent(elem.transform); elem.transform.SetParent(line.transform); } line.transform.SetParent(contentTransform); } // input locks mainWindow.transform.SetParent(MainCanvasUtil.MainCanvas.transform); var trigger = mainWindow.AddComponent <UnityEngine.EventSystems.EventTrigger> (); var onMouseEnter = new UnityEngine.EventSystems.EventTrigger.Entry() { eventID = UnityEngine.EventSystems.EventTriggerType.PointerEnter }; onMouseEnter.callback.AddListener((data) => InputLockManager.SetControlLock(ControlTypes.ALLBUTCAMERAS, "adjustablemodpanellock")); trigger.triggers.Add(onMouseEnter); var onMouseExit = new UnityEngine.EventSystems.EventTrigger.Entry() { eventID = UnityEngine.EventSystems.EventTriggerType.PointerExit }; onMouseExit.callback.AddListener((data) => InputLockManager.RemoveControlLock("adjustablemodpanellock")); trigger.triggers.Add(onMouseExit); mainWindow.SetActive(true); }