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);