mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-07-19 17:49:14 +00:00
UI: Avoid excessive config reads when drawing preview
This commit is contained in:
parent
213ce75328
commit
5bdf492f8a
|
@ -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())
|
||||
|
|
|
@ -643,6 +643,8 @@ private:
|
|||
std::string lastScreenshot;
|
||||
std::string lastReplay;
|
||||
|
||||
void UpdatePreviewOverflowSettings();
|
||||
|
||||
public slots:
|
||||
void DeferSaveBegin();
|
||||
void DeferSaveEnd();
|
||||
|
|
|
@ -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<OBSBasicPreview *>(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<OBSBasicPreview *>(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");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue