From 5bdf492f8ac17923092423895be35ec33b40b63a Mon Sep 17 00:00:00 2001 From: derrod Date: Fri, 10 Feb 2023 13:27:08 +0100 Subject: [PATCH] UI: Avoid excessive config reads when drawing preview --- UI/window-basic-main.cpp | 15 +++++++++++++++ UI/window-basic-main.hpp | 2 ++ UI/window-basic-preview.cpp | 17 ++++------------- UI/window-basic-preview.hpp | 22 ++++++++++++++++++++++ UI/window-basic-settings.cpp | 8 +++++--- 5 files changed, 48 insertions(+), 16 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 2a417017c..ffc8064f4 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -488,6 +488,7 @@ OBSBasic::OBSBasic(QWidget *parent) UpdatePreviewSafeAreas(); UpdatePreviewSpacingHelpers(); + UpdatePreviewOverflowSettings(); } static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent, @@ -10294,6 +10295,20 @@ void OBSBasic::UpdatePreviewSafeAreas() "ShowSafeAreas"); } +void OBSBasic::UpdatePreviewOverflowSettings() +{ + bool hidden = config_get_bool(App()->GlobalConfig(), "BasicWindow", + "OverflowHidden"); + bool select = config_get_bool(App()->GlobalConfig(), "BasicWindow", + "OverflowSelectionHidden"); + bool always = config_get_bool(App()->GlobalConfig(), "BasicWindow", + "OverflowAlwaysVisible"); + + ui->preview->SetOverflowHidden(hidden); + ui->preview->SetOverflowSelectionHidden(select); + ui->preview->SetOverflowAlwaysVisible(always); +} + void OBSBasic::SetDisplayAffinity(QWindow *window) { if (!SetDisplayAffinitySupported()) diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 6e78f07a8..a94e62a03 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -643,6 +643,8 @@ private: std::string lastScreenshot; std::string lastReplay; + void UpdatePreviewOverflowSettings(); + public slots: void DeferSaveBegin(); void DeferSaveEnd(); diff --git a/UI/window-basic-preview.cpp b/UI/window-basic-preview.cpp index c56e63d3a..7fb8bd556 100644 --- a/UI/window-basic-preview.cpp +++ b/UI/window-basic-preview.cpp @@ -1868,10 +1868,9 @@ bool OBSBasicPreview::DrawSelectedOverflow(obs_scene_t *scene, if (!SceneItemHasVideo(item)) return true; - bool select = config_get_bool(GetGlobalConfig(), "BasicWindow", - "OverflowSelectionHidden"); + OBSBasicPreview *prev = reinterpret_cast(param); - if (!select && !obs_sceneitem_visible(item)) + if (!prev->GetOverflowSelectionHidden() && !obs_sceneitem_visible(item)) return true; if (obs_sceneitem_is_group(item)) { @@ -1885,14 +1884,9 @@ bool OBSBasicPreview::DrawSelectedOverflow(obs_scene_t *scene, gs_matrix_pop(); } - bool always = config_get_bool(GetGlobalConfig(), "BasicWindow", - "OverflowAlwaysVisible"); - - if (!always && !obs_sceneitem_selected(item)) + if (!prev->GetOverflowAlwaysVisible() && !obs_sceneitem_selected(item)) return true; - OBSBasicPreview *prev = reinterpret_cast(param); - matrix4 boxTransform; matrix4 invBoxTransform; obs_sceneitem_get_box_transform(item, &boxTransform); @@ -2177,10 +2171,7 @@ void OBSBasicPreview::DrawOverflow() if (locked) return; - bool hidden = config_get_bool(GetGlobalConfig(), "BasicWindow", - "OverflowHidden"); - - if (hidden) + if (overflowHidden) return; GS_DEBUG_MARKER_BEGIN(GS_DEBUG_COLOR_DEFAULT, "DrawOverflow"); diff --git a/UI/window-basic-preview.hpp b/UI/window-basic-preview.hpp index 586f740a9..e6754179e 100644 --- a/UI/window-basic-preview.hpp +++ b/UI/window-basic-preview.hpp @@ -73,6 +73,9 @@ private: bool scrollMode = false; bool fixedScaling = false; bool selectionBox = false; + bool overflowHidden = false; + bool overflowSelectionHidden = false; + bool overflowAlwaysVisible = false; int32_t scalingLevel = 0; float scalingAmount = 1.0f; float groupRot = 0.0f; @@ -162,6 +165,25 @@ public: inline float GetScrollX() const { return scrollingOffset.x; } inline float GetScrollY() const { return scrollingOffset.y; } + inline void SetOverflowHidden(bool hidden) { overflowHidden = hidden; } + inline void SetOverflowSelectionHidden(bool hidden) + { + overflowSelectionHidden = hidden; + } + inline void SetOverflowAlwaysVisible(bool visible) + { + overflowAlwaysVisible = visible; + } + + inline bool GetOverflowSelectionHidden() const + { + return overflowSelectionHidden; + } + inline bool GetOverflowAlwaysVisible() const + { + return overflowAlwaysVisible; + } + /* use libobs allocator for alignment because the matrices itemToScreen * and screenToItem may contain SSE data, which will cause SSE * instructions to crash if the data is not aligned to at least a 16 diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index f2f22d755..98720b2c9 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -3170,18 +3170,20 @@ void OBSBasicSettings::SaveGeneralSettings() if (WidgetChanged(ui->snapDistance)) config_set_double(GetGlobalConfig(), "BasicWindow", "SnapDistance", ui->snapDistance->value()); - if (WidgetChanged(ui->overflowAlwaysVisible)) + if (WidgetChanged(ui->overflowAlwaysVisible) || + WidgetChanged(ui->overflowHide) || + WidgetChanged(ui->overflowSelectionHide)) { config_set_bool(GetGlobalConfig(), "BasicWindow", "OverflowAlwaysVisible", ui->overflowAlwaysVisible->isChecked()); - if (WidgetChanged(ui->overflowHide)) config_set_bool(GetGlobalConfig(), "BasicWindow", "OverflowHidden", ui->overflowHide->isChecked()); - if (WidgetChanged(ui->overflowSelectionHide)) config_set_bool(GetGlobalConfig(), "BasicWindow", "OverflowSelectionHidden", ui->overflowSelectionHide->isChecked()); + main->UpdatePreviewOverflowSettings(); + } if (WidgetChanged(ui->previewSafeAreas)) { config_set_bool(GetGlobalConfig(), "BasicWindow", "ShowSafeAreas",