فهرست منبع

Added screen DPI awareness

Brian Fiete 5 سال پیش
والد
کامیت
9930ae8436
6فایلهای تغییر یافته به همراه52 افزوده شده و 3 حذف شده
  1. 8 0
      BeefLibs/Beefy2D/src/BFWindow.bf
  2. 2 1
      BeefySysLib/BFWindow.h
  3. 5 0
      BeefySysLib/BeefySysLib.cpp
  4. 1 0
      BeefySysLib/platform/win/WinBFApp.h
  5. 32 1
      IDE/src/IDEApp.bf
  6. 4 1
      IDE/src/Settings.bf

+ 8 - 0
BeefLibs/Beefy2D/src/BFWindow.bf

@@ -224,6 +224,9 @@ namespace Beefy
         [StdCall, CLink]
         static extern void* BFWindow_DeleteMenuItem(void* window, void* item);
 
+		[StdCall, CLink]
+		static extern int BFWindow_GetDPI(void* window);
+
         public static BFWindow GetBFWindow(void* window)
         {
             return sWindowDictionary[(int)window];
@@ -555,6 +558,11 @@ namespace Beefy
 			//TODO: REMOVE
             //Debug.WriteLine("LostFocus {0}", mTitle);
         }
+
+		public virtual int GetDPI()
+		{
+			return BFWindow_GetDPI(mNativeWindow);
+		}
         
         public virtual void KeyChar(char32 theChar)
         {

+ 2 - 1
BeefySysLib/BFWindow.h

@@ -124,9 +124,10 @@ public:
 	virtual void			SetAlpha(float alpha, uint32 destAlphaSrcMask, bool isMouseVisible) = 0;
 	virtual void			SetForeground() = 0;	
 	virtual void			SetNonExclusiveMouseCapture() { mNonExclusiveMouseCapture = true; }
-	virtual void			CaptureMouse() {}
+	virtual void			CaptureMouse() {}	
 	virtual bool			IsMouseCaptured() { return false; }
 	virtual void			LostFocus(BFWindow* newFocus) = 0;	
+	virtual int				GetDPI() { return 0; }
 
 	virtual BFMenu*			AddMenuItem(BFMenu* parent, int insertIdx, const char* text, const char* hotKey, BFSysBitmap* bitmap, bool enabled, int checkState, bool radioCheck) = 0;
 	virtual void			ModifyMenuItem(BFMenu* item, const char* text, const char* hotKey, BFSysBitmap* bitmap, bool enabled, int checkState, bool radioCheck) = 0;

+ 5 - 0
BeefySysLib/BeefySysLib.cpp

@@ -381,6 +381,11 @@ BF_EXPORT void BF_CALLTYPE BFWindow_Close(BFWindow* window, int force)
 		window->TryClose();
 }
 
+BF_EXPORT int BF_CALLTYPE BFWindow_GetDPI(BFWindow* window)
+{
+	return window->GetDPI();
+}
+
 ///
 
 BF_EXPORT TextureSegment* BF_CALLTYPE Gfx_CreateRenderTarget(int width, int height, int destAlpha)

+ 1 - 0
BeefySysLib/platform/win/WinBFApp.h

@@ -75,6 +75,7 @@ public:
 	virtual void			SetAlpha(float alpha, uint32 destAlphaSrcMask, bool isMouseVisible) override;
 	virtual void			CaptureMouse() override;
 	virtual bool			IsMouseCaptured() override;
+	virtual int				GetDPI() { return ::GetDpiForWindow(mHWnd); }
 
 	virtual BFMenu*			AddMenuItem(BFMenu* parent, int insertIdx, const char* text, const char* hotKey, BFSysBitmap* bitmap, bool enabled, int checkState, bool radioCheck) override;
 	virtual void			ModifyMenuItem(BFMenu* item, const char* text, const char* hotKey, BFSysBitmap* bitmap, bool enabled, int checkState, bool radioCheck) override;

+ 32 - 1
IDE/src/IDEApp.bf

@@ -121,6 +121,7 @@ namespace IDE
 		public String mDbgCompileDir ~ delete _;
 		public String mDbgVersionedCompileDir ~ delete _;
 		public DateTime mDbgHighestTime;
+		public bool mIsFirstRun;
 
 		//public ToolboxPanel mToolboxPanel;
 		public Monitor mMonitor = new Monitor() ~ delete _;
@@ -9596,6 +9597,7 @@ namespace IDE
 				// User setting can affect automated testing, so use default settings
 				mSettings.Load();
 				mSettings.Apply();
+				mIsFirstRun = !mSettings.mLoadedSettings;
 			}
 
             DarkTheme aTheme = new DarkTheme();
@@ -9677,11 +9679,29 @@ namespace IDE
 				LoadWorkspace(mVerb);
 			}
 
-            if ((mRunningTestScript) || (!LoadWorkspaceUserData()))
+			bool loadedWorkspaceUserData = false;
+
+            if ((!mRunningTestScript) && (LoadWorkspaceUserData()))
+			{
+				loadedWorkspaceUserData = true;
+			}
+			else
+			{
                 CreateDefaultLayout();
+			}
 
             WorkspaceLoaded();
 
+			if ((mIsFirstRun) && (!loadedWorkspaceUserData))
+			{
+				GetWorkspaceRect(var workX, var workY, var workWidth, var workHeight);
+
+				int32 height = (int32)(workHeight * 0.85f);
+				int32 width = Math.Min(4 * height / 3, (int32)(workWidth * 0.85f));
+
+				mRequestedWindowRect = .(workX + (workWidth - width)/2, workY + (workHeight - height)/2, width, height);
+			}
+
 			//
 			{
 				BFWindow.Flags flags = .Border | .ThickFrame | .Resizable | .SysMenu |
@@ -9694,6 +9714,17 @@ namespace IDE
 	                (int32)mRequestedWindowRect.mY, (int32)mRequestedWindowRect.mWidth, (int32)mRequestedWindowRect.mHeight,
 	                flags, mMainFrame);
 			}
+
+			if (mIsFirstRun)
+			{
+				// If this is our first time running, set up a scale based on DPI
+				int dpi = mMainWindow.GetDPI();
+				if (dpi >= 120)
+				{
+					mSettings.mEditorSettings.mUIScale = 100 * Math.Min(dpi / 96.0f, 4.0f);
+				}	
+			}
+
 			UpdateTitle();
             mMainWindow.SetMinimumSize(GS!(480), GS!(360));
             mMainWindow.mIsMainWindow = true;

+ 4 - 1
IDE/src/Settings.bf

@@ -631,6 +631,8 @@ namespace IDE
 			}
 		}
 
+		public bool mLoadedSettings;
+
 		public CompilerSettings mCompilerSettings = new .() ~ delete _;
 		public EditorSettings mEditorSettings = new .() ~ delete _;
 		public VSSettings mVSSettings = new .() ~ delete _;
@@ -712,6 +714,7 @@ namespace IDE
 			if (sd.Load(path) case .Err)
 				return;
 
+			mLoadedSettings = true;
 			using (sd.Open("Editor"))
 				mEditorSettings.Deserialize(sd);
 			using (sd.Open("Keys"))
@@ -750,7 +753,7 @@ namespace IDE
 
 		public void Apply()
 		{
-			gApp.mSettings.mEditorSettings.mUIScale = Math.Clamp(gApp.mSettings.mEditorSettings.mUIScale, 25, 400);
+			gApp.mSettings.mEditorSettings.mUIScale = Math.Clamp(gApp.mSettings.mEditorSettings.mUIScale, 50, 400);
 			gApp.mSettings.mEditorSettings.mFontSize = Math.Clamp(gApp.mSettings.mEditorSettings.mFontSize, 6.0f, 72.0f);
 
 			Font.ClearFontNameCache();