From f2fda20572d979efc4c4466dc9876057d3d9e55f Mon Sep 17 00:00:00 2001 From: gxalpha Date: Wed, 13 Oct 2021 13:23:11 +0200 Subject: [PATCH] UI: Minimize context bar when too small This change removes the minimum total size from the context bar, instead removing certain elements when the size is too small. This means that users will still be able to make OBS smaller in width while keeping the context bar enabled. First, the properties, filter and interact buttons will get reduced to just the symbols, if it gets even smaller the source specific menus are hidden. --- UI/forms/OBSBasic.ui | 2 +- UI/window-basic-main.cpp | 192 +++++++++++++++++++++++++-------------- UI/window-basic-main.hpp | 8 ++ 3 files changed, 135 insertions(+), 67 deletions(-) diff --git a/UI/forms/OBSBasic.ui b/UI/forms/OBSBasic.ui index 54f3de104..de3e66111 100644 --- a/UI/forms/OBSBasic.ui +++ b/UI/forms/OBSBasic.ui @@ -205,7 +205,7 @@ - 740 + 0 30 diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 95b984b49..fff3a15a3 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -301,6 +301,8 @@ OBSBasic::OBSBasic(QWidget *parent) if (obs_get_video_info(&ovi)) ResizePreview(ovi.base_width, ovi.base_height); + + UpdateContextBarVisibility(); }; connect(windowHandle(), &QWindow::screenChanged, displayResize); @@ -3047,6 +3049,26 @@ void OBSBasic::ClearContextBar() } } +void OBSBasic::UpdateContextBarVisibility() +{ + int width = ui->centralwidget->size().width(); + + ContextBarSize contextBarSizeNew; + if (width >= 740) { + contextBarSizeNew = ContextBarSize_Normal; + } else if (width >= 600) { + contextBarSizeNew = ContextBarSize_Reduced; + } else { + contextBarSizeNew = ContextBarSize_Minimized; + } + + if (contextBarSize == contextBarSizeNew) + return; + + contextBarSize = contextBarSizeNew; + UpdateContextBarDeferred(); +} + static bool is_network_media_source(obs_source_t *source, const char *id) { if (strcmp(id, "ffmpeg_source") != 0) @@ -3072,82 +3094,109 @@ void OBSBasic::UpdateContextBar(bool force) OBSSceneItem item = GetCurrentSceneItem(); - ClearContextBar(); - if (item) { obs_source_t *source = obs_sceneitem_get_source(item); + + bool updateNeeded = true; + QLayoutItem *la = ui->emptySpace->layout()->itemAt(0); + if (la) { + if (SourceToolbar *toolbar = + dynamic_cast( + la->widget())) { + if (toolbar->GetSource() == source) + updateNeeded = false; + } else if (MediaControls *toolbar = + dynamic_cast( + la->widget())) { + if (toolbar->GetSource() == source) + updateNeeded = false; + } + } + const char *id = obs_source_get_unversioned_id(source); uint32_t flags = obs_source_get_output_flags(source); ui->sourceInteractButton->setVisible(flags & OBS_SOURCE_INTERACTION); - if (flags & OBS_SOURCE_CONTROLLABLE_MEDIA) { - if (!is_network_media_source(source, id)) { - MediaControls *mediaControls = - new MediaControls(ui->emptySpace); - mediaControls->SetSource(source); + if (contextBarSize >= ContextBarSize_Reduced && + (updateNeeded || force)) { + ClearContextBar(); + if (flags & OBS_SOURCE_CONTROLLABLE_MEDIA) { + if (!is_network_media_source(source, id)) { + MediaControls *mediaControls = + new MediaControls( + ui->emptySpace); + mediaControls->SetSource(source); - ui->emptySpace->layout()->addWidget( - mediaControls); + ui->emptySpace->layout()->addWidget( + mediaControls); + } + } else if (strcmp(id, "browser_source") == 0) { + BrowserToolbar *c = new BrowserToolbar( + ui->emptySpace, source); + ui->emptySpace->layout()->addWidget(c); + + } else if (strcmp(id, "wasapi_input_capture") == 0 || + strcmp(id, "wasapi_output_capture") == 0 || + strcmp(id, "coreaudio_input_capture") == 0 || + strcmp(id, "coreaudio_output_capture") == + 0 || + strcmp(id, "pulse_input_capture") == 0 || + strcmp(id, "pulse_output_capture") == 0 || + strcmp(id, "alsa_input_capture") == 0) { + AudioCaptureToolbar *c = + new AudioCaptureToolbar(ui->emptySpace, + source); + c->Init(); + ui->emptySpace->layout()->addWidget(c); + + } else if (strcmp(id, "window_capture") == 0 || + strcmp(id, "xcomposite_input") == 0) { + WindowCaptureToolbar *c = + new WindowCaptureToolbar(ui->emptySpace, + source); + c->Init(); + ui->emptySpace->layout()->addWidget(c); + + } else if (strcmp(id, "monitor_capture") == 0 || + strcmp(id, "display_capture") == 0 || + strcmp(id, "xshm_input") == 0) { + DisplayCaptureToolbar *c = + new DisplayCaptureToolbar( + ui->emptySpace, source); + c->Init(); + ui->emptySpace->layout()->addWidget(c); + + } else if (strcmp(id, "dshow_input") == 0) { + DeviceCaptureToolbar *c = + new DeviceCaptureToolbar(ui->emptySpace, + source); + ui->emptySpace->layout()->addWidget(c); + + } else if (strcmp(id, "game_capture") == 0) { + GameCaptureToolbar *c = new GameCaptureToolbar( + ui->emptySpace, source); + ui->emptySpace->layout()->addWidget(c); + + } else if (strcmp(id, "image_source") == 0) { + ImageSourceToolbar *c = new ImageSourceToolbar( + ui->emptySpace, source); + ui->emptySpace->layout()->addWidget(c); + + } else if (strcmp(id, "color_source") == 0) { + ColorSourceToolbar *c = new ColorSourceToolbar( + ui->emptySpace, source); + ui->emptySpace->layout()->addWidget(c); + + } else if (strcmp(id, "text_ft2_source") == 0 || + strcmp(id, "text_gdiplus") == 0) { + TextSourceToolbar *c = new TextSourceToolbar( + ui->emptySpace, source); + ui->emptySpace->layout()->addWidget(c); } - } else if (strcmp(id, "browser_source") == 0) { - BrowserToolbar *c = - new BrowserToolbar(ui->emptySpace, source); - ui->emptySpace->layout()->addWidget(c); - - } else if (strcmp(id, "wasapi_input_capture") == 0 || - strcmp(id, "wasapi_output_capture") == 0 || - strcmp(id, "coreaudio_input_capture") == 0 || - strcmp(id, "coreaudio_output_capture") == 0 || - strcmp(id, "pulse_input_capture") == 0 || - strcmp(id, "pulse_output_capture") == 0 || - strcmp(id, "alsa_input_capture") == 0) { - AudioCaptureToolbar *c = - new AudioCaptureToolbar(ui->emptySpace, source); - c->Init(); - ui->emptySpace->layout()->addWidget(c); - - } else if (strcmp(id, "window_capture") == 0 || - strcmp(id, "xcomposite_input") == 0) { - WindowCaptureToolbar *c = new WindowCaptureToolbar( - ui->emptySpace, source); - c->Init(); - ui->emptySpace->layout()->addWidget(c); - - } else if (strcmp(id, "monitor_capture") == 0 || - strcmp(id, "display_capture") == 0 || - strcmp(id, "xshm_input") == 0) { - DisplayCaptureToolbar *c = new DisplayCaptureToolbar( - ui->emptySpace, source); - c->Init(); - ui->emptySpace->layout()->addWidget(c); - - } else if (strcmp(id, "dshow_input") == 0) { - DeviceCaptureToolbar *c = new DeviceCaptureToolbar( - ui->emptySpace, source); - ui->emptySpace->layout()->addWidget(c); - - } else if (strcmp(id, "game_capture") == 0) { - GameCaptureToolbar *c = - new GameCaptureToolbar(ui->emptySpace, source); - ui->emptySpace->layout()->addWidget(c); - - } else if (strcmp(id, "image_source") == 0) { - ImageSourceToolbar *c = - new ImageSourceToolbar(ui->emptySpace, source); - ui->emptySpace->layout()->addWidget(c); - - } else if (strcmp(id, "color_source") == 0) { - ColorSourceToolbar *c = - new ColorSourceToolbar(ui->emptySpace, source); - ui->emptySpace->layout()->addWidget(c); - - } else if (strcmp(id, "text_ft2_source") == 0 || - strcmp(id, "text_gdiplus") == 0) { - TextSourceToolbar *c = - new TextSourceToolbar(ui->emptySpace, source); - ui->emptySpace->layout()->addWidget(c); + } else if (contextBarSize == ContextBarSize_Minimized) { + ClearContextBar(); } QIcon icon; @@ -3171,6 +3220,7 @@ void OBSBasic::UpdateContextBar(bool force) ui->sourcePropertiesButton->setEnabled( obs_source_configurable(source)); } else { + ClearContextBar(); ui->contextSourceIcon->hide(); ui->contextSourceIconSpacer->show(); ui->contextSourceLabel->setText( @@ -3180,6 +3230,16 @@ void OBSBasic::UpdateContextBar(bool force) ui->sourcePropertiesButton->setEnabled(false); ui->sourceInteractButton->setVisible(false); } + + if (contextBarSize == ContextBarSize_Normal) { + ui->sourcePropertiesButton->setText(QTStr("Properties")); + ui->sourceFiltersButton->setText(QTStr("Filters")); + ui->sourceInteractButton->setText(QTStr("Interact")); + } else { + ui->sourcePropertiesButton->setText(""); + ui->sourceFiltersButton->setText(""); + ui->sourceInteractButton->setText(""); + } } static inline bool SourceMixerHidden(obs_source_t *source) diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index a2fa02ada..c0d1ffc1a 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -195,6 +195,12 @@ class OBSBasic : public OBSMainWindow { DropType_Url, }; + enum ContextBarSize { + ContextBarSize_Minimized, + ContextBarSize_Reduced, + ContextBarSize_Normal + }; + private: obs_frontend_callbacks *api = nullptr; @@ -210,6 +216,7 @@ private: long disableSaving = 1; bool projectChanged = false; bool previewEnabled = true; + ContextBarSize contextBarSize = ContextBarSize_Normal; std::deque clipboard; OBSWeakSource copyFiltersSource; @@ -1118,6 +1125,7 @@ public slots: void ClearContextBar(); void UpdateContextBar(bool force = false); void UpdateContextBarDeferred(bool force = false); + void UpdateContextBarVisibility(); public: explicit OBSBasic(QWidget *parent = 0);