Skip to content

Commit 56e570d

Browse files
authored
[BETA] Automatic DPI-aware UI scaling (#748)
1 parent fa329e0 commit 56e570d

18 files changed

Lines changed: 215 additions & 126 deletions

File tree

Sources/OvEditor/include/OvEditor/Core/EditorActions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#define EDITOR_EVENT(target) OvCore::Global::ServiceLocator::Get<OvEditor::Core::EditorActions>().target
2020
#define EDITOR_CONTEXT(instance) OvCore::Global::ServiceLocator::Get<OvEditor::Core::EditorActions>().GetContext().instance
2121
#define EDITOR_PANEL(type, id) OvCore::Global::ServiceLocator::Get<OvEditor::Core::EditorActions>().GetPanelsManager().GetPanelAs<type>(id)
22+
#define EDITOR_UI_SCALE EDITOR_CONTEXT(uiManager)->GetScale()
2223

2324
namespace tinyxml2
2425
{

Sources/OvEditor/include/OvEditor/Settings/EFontSize.h

Lines changed: 0 additions & 30 deletions
This file was deleted.

Sources/OvEditor/include/OvEditor/Settings/EditorSettings.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
#include <string>
1010

11-
#include <OvEditor/Settings/EFontSize.h>
1211
#include <OvTools/Eventing/Event.h>
1312
#include <OvUI/Styling/EStyle.h>
1413

@@ -99,7 +98,8 @@ namespace OvEditor::Settings
9998
inline static Property<float> ScalingSnapUnit = { 1.0f };
10099
inline static Property<int> ColorTheme = { static_cast<int>(OvUI::Styling::EStyle::DEFAULT_DARK) };
101100
inline static Property<int> ConsoleMaxLogs = { 500 };
102-
inline static Property<int> FontSize = { static_cast<int>(EFontSize::DEFAULT) };
101+
inline static Property<int> UIScale = { 100 };
102+
inline static Property<bool> BetaDpiAwarenessDialogPresented = { false };
103103
inline static Property<std::string> CodeEditorCommand = { "code {workdir} --goto {path}" };
104104
inline static Property<bool> RegenerateScriptingProjectFilesOnStartup = { true };
105105
};

Sources/OvEditor/src/OvEditor/Core/Context.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <OvEditor/Settings/EditorSettings.h>
1616
#include <OvRendering/Entities/Light.h>
1717
#include <OvTools/Utils/SystemCalls.h>
18+
#include <optional>
1819

1920
using namespace OvCore::Global;
2021
using namespace OvCore::ResourceManagement;
@@ -117,25 +118,22 @@ OvEditor::Core::Context::Context(const std::filesystem::path& p_projectFolder) :
117118

118119
std::filesystem::create_directories(Utils::FileSystem::kEditorDataPath);
119120

120-
uiManager = std::make_unique<OvUI::Core::UIManager>(window->GetGlfwWindow(),
121+
uiManager = std::make_unique<OvUI::Core::UIManager>(
122+
*window,
121123
static_cast<OvUI::Styling::EStyle>(OvEditor::Settings::EditorSettings::ColorTheme.Get())
122124
);
123125

124-
const auto fontPath = editorAssetsPath / "Fonts" / "Ruda-Bold.ttf";
125-
126126
if (!std::filesystem::exists(OvEditor::Utils::FileSystem::kLayoutFilePath))
127127
{
128128
const auto defaultLayoutPath = std::filesystem::current_path() / "Config" / "layout.ini";
129129
uiManager->ResetLayout(defaultLayoutPath.string());
130130
}
131131

132-
uiManager->LoadFont(std::string{ Settings::GetFontID(Settings::EFontSize::BIG) }, fontPath.string(), 18);
133-
uiManager->LoadFont(std::string{ Settings::GetFontID(Settings::EFontSize::MEDIUM) }, fontPath.string(), 15);
134-
uiManager->LoadFont(std::string{ Settings::GetFontID(Settings::EFontSize::SMALL) }, fontPath.string(), 12);
135-
uiManager->UseFont(std::string{ Settings::GetFontID(
136-
static_cast<Settings::EFontSize>(Settings::EditorSettings::FontSize.Get())
137-
) });
138-
132+
const auto fontPath = editorAssetsPath / "Fonts" / "Ruda-Bold.ttf";
133+
uiManager->LoadFont("Ruda-Bold", fontPath.string(), 15);
134+
uiManager->UseFont("Ruda-Bold");
135+
const int uiScale = Settings::EditorSettings::UIScale.Get();
136+
uiManager->SetScale(uiScale == 0 ? std::nullopt : std::make_optional(uiScale / 100.0f));
139137
uiManager->SetEditorLayoutSaveFilename(OvEditor::Utils::FileSystem::kLayoutFilePath.string());
140138
uiManager->SetEditorLayoutAutosaveFrequency(60.0f);
141139
uiManager->EnableEditorLayoutSave(true);

Sources/OvEditor/src/OvEditor/Core/ProjectHub.cpp

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,14 @@ namespace OvEditor::Core
4545
SetSize({ 1000, 580 });
4646
SetPosition({ 0.f, 0.f });
4747

48-
auto& openProjectButton = CreateWidget<OvUI::Widgets::Buttons::Button>("Open Project");
49-
auto& newProjectButton = CreateWidget<OvUI::Widgets::Buttons::Button>("New Project");
50-
auto& pathField = CreateWidget<OvUI::Widgets::InputFields::InputText>("");
51-
m_goButton = &CreateWidget<OvUI::Widgets::Buttons::Button>("GO");
48+
auto& actionBar = CreateWidget<OvUI::Widgets::Layout::Group>();
49+
actionBar.horizontal = true;
50+
actionBar.stretchWidget = 2;
51+
52+
auto& openProjectButton = actionBar.CreateWidget<OvUI::Widgets::Buttons::Button>("Open Project");
53+
auto& newProjectButton = actionBar.CreateWidget<OvUI::Widgets::Buttons::Button>("New Project");
54+
auto& pathField = actionBar.CreateWidget<OvUI::Widgets::InputFields::InputText>("");
55+
m_goButton = &actionBar.CreateWidget<OvUI::Widgets::Buttons::Button>("GO");
5256

5357
pathField.ContentChangedEvent += [this, &pathField](std::string p_content) {
5458
pathField.content = std::filesystem::path{
@@ -118,7 +122,7 @@ namespace OvEditor::Core
118122

119123
auto& columns = CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
120124

121-
columns.widths = { 750, 500 };
125+
columns.widths = { -1, 0 };
122126

123127
// Sanitize the project registry before displaying it, so we avoid showing
124128
// corrupted/deleted projects.
@@ -162,11 +166,8 @@ namespace OvEditor::Core
162166
void Draw() override
163167
{
164168
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 50.f, 50.f });
165-
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.f);
166-
167169
OvUI::Panels::PanelWindow::Draw();
168-
169-
ImGui::PopStyleVar(2);
170+
ImGui::PopStyleVar(1);
170171
}
171172

172173
private:
@@ -281,19 +282,43 @@ void OvEditor::Core::ProjectHub::SetupContext()
281282
/* Graphics context creation */
282283
m_driver = std::make_unique<OvRendering::Context::Driver>(OvRendering::Settings::DriverSettings{ false });
283284

284-
m_uiManager = std::make_unique<OvUI::Core::UIManager>(m_window->GetGlfwWindow(),
285+
// DPI awareness BETA option
286+
const auto windowContentScale = m_window->GetContentScale();
287+
const auto unifiedWindowContentScale = std::max(windowContentScale.first, windowContentScale.second);
288+
289+
if (!Settings::EditorSettings::BetaDpiAwarenessDialogPresented.Get() && unifiedWindowContentScale > 1.0f)
290+
{
291+
Settings::EditorSettings::BetaDpiAwarenessDialogPresented.Set(true);
292+
const auto dpiAwarenessDialog = OvWindowing::Dialogs::MessageBox(
293+
"High DPI Monitor Detected",
294+
"Overload has detected that you might be running the editor from a high DPI monitor.\n\n"
295+
"Support for automatic DPI-scaling is currently in BETA and might result in weird spacings, "
296+
"icon sizes, layouts, and window sizes.\n\n"
297+
"Do you want to enable automatic DPI scaling anyway?\n\n"
298+
"(You can change this setting anytime from the menu bar: Settings > Appearance)",
299+
OvWindowing::Dialogs::MessageBox::EMessageType::QUESTION,
300+
OvWindowing::Dialogs::MessageBox::EButtonLayout::YES_NO
301+
);
302+
switch (dpiAwarenessDialog.GetUserAction())
303+
{
304+
case OvWindowing::Dialogs::MessageBox::EUserAction::YES:
305+
Settings::EditorSettings::UIScale.Set(0);
306+
default: break;
307+
}
308+
}
309+
310+
m_uiManager = std::make_unique<OvUI::Core::UIManager>(
311+
*m_window,
285312
static_cast<OvUI::Styling::EStyle>(OvEditor::Settings::EditorSettings::ColorTheme.Get())
286313
);
287314

288315
const auto fontPath = std::filesystem::current_path() / "Data" / "Editor" / "Fonts" / "Ruda-Bold.ttf";
289316

290-
m_uiManager->LoadFont(std::string{ Settings::GetFontID(Settings::EFontSize::BIG) }, fontPath.string(), 20);
291-
m_uiManager->LoadFont(std::string{ Settings::GetFontID(Settings::EFontSize::MEDIUM) }, fontPath.string(), 18);
292-
m_uiManager->LoadFont(std::string{ Settings::GetFontID(Settings::EFontSize::SMALL) }, fontPath.string(), 16);
293-
m_uiManager->UseFont(std::string{ Settings::GetFontID(
294-
static_cast<Settings::EFontSize>(Settings::EditorSettings::FontSize.Get())
295-
) });
296-
317+
m_uiManager->LoadFont("Ruda-Bold", fontPath.string(), 18);
318+
m_uiManager->UseFont("Ruda-Bold");
319+
const int uiScale = Settings::EditorSettings::UIScale.Get();
320+
m_uiManager->SetScale(uiScale == 0 ? std::nullopt : std::make_optional(uiScale / 100.0f));
297321
m_uiManager->EnableEditorLayoutSave(false);
298322
m_uiManager->EnableDocking(false);
299323
}
324+

Sources/OvEditor/src/OvEditor/Panels/AssetProperties.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ OvEditor::Panels::AssetProperties::AssetProperties
5656
m_settings = &CreateWidget<OvUI::Widgets::Layout::GroupCollapsable>("Settings");
5757
m_settings->neverDisabled = true;
5858
m_settingsColumns = &m_settings->CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
59-
m_settingsColumns->widths[0] = 150;
59+
m_settingsColumns->widths[0] = 150 * EDITOR_UI_SCALE;
6060

6161
m_info = &CreateWidget<OvUI::Widgets::Layout::GroupCollapsable>("Info");
6262
m_info->neverDisabled = true;
6363
m_infoColumns = &m_info->CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
64-
m_infoColumns->widths[0] = 150;
64+
m_infoColumns->widths[0] = 150 * EDITOR_UI_SCALE;
6565

6666
m_settings->enabled = m_info->enabled = false;
6767
}
@@ -178,7 +178,7 @@ void OvEditor::Panels::AssetProperties::CreateHeaderButtons()
178178
void OvEditor::Panels::AssetProperties::CreateAssetSelector()
179179
{
180180
auto& columns = CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
181-
columns.widths[0] = 150;
181+
columns.widths[0] = 150 * EDITOR_UI_SCALE;
182182
m_assetSelector = &OvCore::Helpers::GUIDrawer::DrawAsset(columns, "Target", m_resource, &m_targetChanged);
183183
const auto& widgets = columns.GetWidgets();
184184
widgets[widgets.size() - 1].first->neverDisabled = true;

Sources/OvEditor/src/OvEditor/Panels/Console.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ OvEditor::Panels::Console::Console
5656
allowHorizontalScrollbar = true;
5757

5858
auto& clearButton = CreateWidget<Buttons::Button>("Clear");
59-
clearButton.size = { 50.f, 0.f };
6059
clearButton.idleBackgroundColor = { 0.5f, 0.f, 0.f };
6160
clearButton.ClickedEvent += std::bind(&Console::Clear, this);
6261
clearButton.lineBreak = false;

Sources/OvEditor/src/OvEditor/Panels/Inspector.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ void OvEditor::Panels::Inspector::_DrawComponent(AComponent& p_component, int p_
346346

347347
auto& columns = header.CreateWidget<Layout::Columns<2>>();
348348
columns.SetID("comp_" + p_component.GetName());
349-
columns.widths[0] = 200;
349+
columns.widths[0] = 200 * EDITOR_UI_SCALE;
350350
p_component.OnInspector(columns);
351351
}
352352

@@ -379,7 +379,7 @@ void OvEditor::Panels::Inspector::_DrawBehaviour(Behaviour& p_behaviour, int p_i
379379

380380
auto& columns = header.CreateWidget<Layout::Columns<2>>();
381381
columns.SetID("bhv_" + p_behaviour.name);
382-
columns.widths[0] = 200;
382+
columns.widths[0] = 200 * EDITOR_UI_SCALE;
383383
p_behaviour.OnInspector(columns);
384384
}
385385

Sources/OvEditor/src/OvEditor/Panels/MaterialEditor.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ void OvEditor::Panels::MaterialEditor::CreateHeaderButtons()
263263
void OvEditor::Panels::MaterialEditor::CreateMaterialSelector()
264264
{
265265
auto& columns = CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
266-
columns.widths[0] = 150;
266+
columns.widths[0] = 150 * EDITOR_UI_SCALE;
267267
m_targetMaterialText = &GUIDrawer::DrawMaterial(columns, "Material", m_target, &m_materialDroppedEvent);
268268
const auto& widgets = columns.GetWidgets();
269269
widgets[widgets.size() - 1].first->neverDisabled = true;
@@ -273,7 +273,7 @@ void OvEditor::Panels::MaterialEditor::CreateMaterialSelector()
273273
void OvEditor::Panels::MaterialEditor::CreateShaderSelector()
274274
{
275275
auto& columns = m_settings->CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
276-
columns.widths[0] = 150;
276+
columns.widths[0] = 150 * EDITOR_UI_SCALE;
277277
m_shaderText = &GUIDrawer::DrawShader(columns, "Shader", m_shader, &m_shaderDroppedEvent);
278278
}
279279

@@ -282,28 +282,28 @@ void OvEditor::Panels::MaterialEditor::CreateMaterialSettings()
282282
m_materialPipelineState = &m_settings->CreateWidget<Layout::GroupCollapsable>("Pipeline State");
283283
m_materialPipelineState->neverDisabled = true;
284284
m_materialPipelineStateColumns = &m_materialPipelineState->CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
285-
m_materialPipelineStateColumns->widths[0] = 150;
285+
m_materialPipelineStateColumns->widths[0] = 150 * EDITOR_UI_SCALE;
286286

287287
m_materialSettings = &m_settings->CreateWidget<Layout::GroupCollapsable>("Settings");
288288
m_materialSettings->neverDisabled = true;
289289
m_materialSettingsColumns = &m_materialSettings->CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
290-
m_materialSettingsColumns->widths[0] = 150;
290+
m_materialSettingsColumns->widths[0] = 150 * EDITOR_UI_SCALE;
291291
}
292292

293293
void OvEditor::Panels::MaterialEditor::CreateMaterialFeatures()
294294
{
295295
m_materialFeatures = &m_settings->CreateWidget<Layout::GroupCollapsable>("Features");
296296
m_materialFeatures->neverDisabled = true;
297297
m_materialFeaturesColumns = &m_materialFeatures->CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
298-
m_materialFeaturesColumns->widths[0] = 150;
298+
m_materialFeaturesColumns->widths[0] = 150 * EDITOR_UI_SCALE;
299299
}
300300

301301
void OvEditor::Panels::MaterialEditor::CreateMaterialProperties()
302302
{
303303
m_materialProperties = &m_settings->CreateWidget<Layout::GroupCollapsable>("Properties");
304304
m_materialProperties->neverDisabled = true;
305305
m_materialPropertiesColumns = &m_materialProperties->CreateWidget<OvUI::Widgets::Layout::Columns<2>>();
306-
m_materialPropertiesColumns->widths[0] = 150;
306+
m_materialPropertiesColumns->widths[0] = 150 * EDITOR_UI_SCALE;
307307
}
308308

309309
void OvEditor::Panels::MaterialEditor::GenerateMaterialSettingsContent()

Sources/OvEditor/src/OvEditor/Panels/MenuBar.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <OvUI/Widgets/Selection/ColorEdit.h>
2727
#include <OvUI/Widgets/Selection/ComboBox.h>
2828
#include <filesystem>
29+
#include <optional>
2930

3031
#include "OvEditor/Core/EditorActions.h"
3132
#include "OvEditor/Panels/AssetView.h"
@@ -34,6 +35,7 @@
3435
#include "OvEditor/Panels/SceneView.h"
3536
#include "OvEditor/Settings/EditorSettings.h"
3637
#include "OvEditor/Utils/ActorCreationMenu.h"
38+
#include "OvUI/Widgets/Selection/CheckBox.h"
3739

3840
using namespace OvUI::Panels;
3941
using namespace OvUI::Widgets;
@@ -74,10 +76,10 @@ void OvEditor::Panels::MenuBar::HandleShortcuts(float p_deltaTime)
7476

7577
void OvEditor::Panels::MenuBar::InitializeSettingsMenu()
7678
{
77-
auto& themeButton = m_settingsMenu->CreateWidget<MenuList>("Editor Theme");
78-
themeButton.CreateWidget<Texts::Text>("Some themes may require a restart");
79+
auto& appearanceButton = m_settingsMenu->CreateWidget<MenuList>("Appearance");
80+
appearanceButton.CreateWidget<Texts::Text>("Some themes may require a restart");
7981

80-
auto& colorTheme = themeButton.CreateWidget<Selection::ComboBox>(static_cast<int>(Settings::EditorSettings::ColorTheme.Get()));
82+
auto& colorTheme = appearanceButton.CreateWidget<Selection::ComboBox>(static_cast<int>(Settings::EditorSettings::ColorTheme.Get()));
8183
colorTheme.choices = {
8284
{ static_cast<int>(OvUI::Styling::EStyle::IM_CLASSIC_STYLE), "ImGui Classic"},
8385
{ static_cast<int>(OvUI::Styling::EStyle::IM_DARK_STYLE), "ImGui Dark"},
@@ -92,17 +94,16 @@ void OvEditor::Panels::MenuBar::InitializeSettingsMenu()
9294
EDITOR_CONTEXT(uiManager)->ApplyStyle(static_cast<OvUI::Styling::EStyle>(p_value));
9395
};
9496

95-
auto& fontSizeMenu = m_settingsMenu->CreateWidget<MenuList>("Font Size");
96-
auto& fontSizeSelector = fontSizeMenu.CreateWidget<Selection::ComboBox>(static_cast<int>(Settings::EditorSettings::FontSize.Get()));
97-
fontSizeSelector.choices = {
98-
{ static_cast<int>(Settings::EFontSize::SMALL), "Small"},
99-
{ static_cast<int>(Settings::EFontSize::MEDIUM), "Medium"},
100-
{ static_cast<int>(Settings::EFontSize::BIG), "Big"}
97+
auto& uiScale = appearanceButton.CreateWidget<Selection::ComboBox>(static_cast<int>(Settings::EditorSettings::UIScale.Get()));
98+
uiScale.choices = {
99+
{ 0, "[BETA] Automatic (DPI Aware)"},
100+
{ 100, "100%"},
101+
{ 150, "150%"},
102+
{ 200, "200%"},
101103
};
102-
fontSizeSelector.ValueChangedEvent += [this](int p_value) {
103-
Settings::EditorSettings::FontSize = p_value;
104-
const auto fontID = std::string{ Settings::GetFontID(static_cast<Settings::EFontSize>(p_value)) };
105-
EDITOR_CONTEXT(uiManager)->UseFont(fontID);
104+
uiScale.ValueChangedEvent += [this](int p_value) {
105+
Settings::EditorSettings::UIScale = p_value;
106+
EDITOR_CONTEXT(uiManager)->SetScale(p_value == 0 ? std::nullopt : std::make_optional(p_value / 100.0f));
106107
};
107108

108109
m_settingsMenu->CreateWidget<MenuItem>("Spawn actors at origin", "", true, true).ValueChangedEvent += EDITOR_BIND(SetActorSpawnAtOrigin, std::placeholders::_1);
@@ -204,7 +205,6 @@ void OvEditor::Panels::MenuBar::InitializeSettingsMenu()
204205
{
205206
Settings::EditorSettings::CodeEditorCommand = p_value;
206207
};
207-
208208
}
209209

210210
void OvEditor::Panels::MenuBar::CreateFileMenu()

0 commit comments

Comments
 (0)