VOID_Module: Changed ModuleWindow to abstract.
[VOID.git] / VOID_Module.cs
blob:a/VOID_Module.cs -> blob:b/VOID_Module.cs
--- a/VOID_Module.cs
+++ b/VOID_Module.cs
@@ -55,6 +55,11 @@
 		{
 			get
 			{
+				if (HighLogic.LoadedSceneIsEditor)
+				{
+					return VOID_EditorCore.Instance as VOID_Core;
+				}
+
 				return VOID_Core.Instance;
 			}
 		}
@@ -210,33 +215,94 @@
 	public abstract class VOID_WindowModule : VOID_Module
 	{
 		[AVOID_SaveValue("WindowPos")]
-		protected Rect WindowPos = new Rect(Screen.width / 2, Screen.height / 2, 250f, 50f);
-		protected float defWidth = 250f;
-		protected float defHeight = 50f;
+		protected Rect WindowPos;
+		protected float defWidth;
+		protected float defHeight;
+
+		protected string inputLockName;
+
+		public VOID_WindowModule() : base()
+		{
+			this.defWidth = 250f;
+			this.defHeight = 50f;
+
+			this.inputLockName = string.Concat(this.Name, "_edlock");
+
+			this.WindowPos = new Rect(Screen.width / 2, Screen.height / 2, this.defWidth, this.defHeight);
+		}
 
 		public abstract void ModuleWindow(int _);
 
 		public override void DrawGUI()
 		{
-			GUI.skin = VOID_Core.Instance.Skin;
+			GUI.skin = this.core.Skin;
 
 			Rect _Pos = this.WindowPos;
 
 			_Pos = GUILayout.Window(
-				VOID_Core.Instance.windowID,
+				this.core.windowID,
 				_Pos,
-				this.ModuleWindow,
+				VOID_Tools.GetWindowHandler(this.ModuleWindow),
 				this.Name,
 				GUILayout.Width(this.defWidth),
 				GUILayout.Height(this.defHeight)
 			);
 
-			_Pos = Tools.ClampRectToScreen (_Pos);
+			bool cursorInWindow = _Pos.Contains(Mouse.screenPos);
+
+			switch (HighLogic.LoadedScene)
+			{
+				case GameScenes.EDITOR:
+				case GameScenes.SPH:
+					if (cursorInWindow)
+					{
+						InputLockManager.SetControlLock(
+							ControlTypes.EDITOR_ICON_HOVER | ControlTypes.EDITOR_ICON_PICK |
+							ControlTypes.EDITOR_PAD_PICK_COPY | ControlTypes.EDITOR_PAD_PICK_COPY,
+							this.inputLockName
+						);
+						EditorLogic.fetch.Lock(false, false, false, this.inputLockName);
+					}
+					else
+					{
+						EditorLogic.fetch.Unlock(this.inputLockName);
+					}
+					break;
+				case GameScenes.FLIGHT:
+					if (cursorInWindow)
+					{
+						InputLockManager.SetControlLock(ControlTypes.CAMERACONTROLS, this.inputLockName);
+					}
+					else if (InputLockManager.GetControlLock(this.inputLockName) != ControlTypes.None)
+					{
+						InputLockManager.RemoveControlLock(this.inputLockName);
+					}
+					break;
+				case GameScenes.SPACECENTER:
+					if (cursorInWindow)
+					{
+						InputLockManager.SetControlLock(ControlTypes.KSC_FACILITIES, this.inputLockName);
+					}
+					else if (InputLockManager.GetControlLock(this.inputLockName) != ControlTypes.None)
+					{
+						InputLockManager.RemoveControlLock(this.inputLockName);
+					}
+					break;
+			}
+
+			if (HighLogic.LoadedSceneIsEditor)
+			{
+				_Pos = Tools.ClampRectToEditorPad(_Pos);
+			}
+			else
+			{
+				_Pos = Tools.ClampRectToScreen(_Pos);
+			}
 
 			if (_Pos != this.WindowPos)
 			{
 				this.WindowPos = _Pos;
-				VOID_Core.Instance.configDirty = true;
+				this.core.configDirty = true;
 			}
 		}
 	}