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.
This commit is contained in:
gxalpha 2021-10-13 13:23:11 +02:00 committed by Jim
parent c085ae025f
commit f2fda20572
3 changed files with 135 additions and 67 deletions

View file

@ -205,7 +205,7 @@
</property>
<property name="minimumSize">
<size>
<width>740</width>
<width>0</width>
<height>30</height>
</size>
</property>

View file

@ -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<SourceToolbar *>(
la->widget())) {
if (toolbar->GetSource() == source)
updateNeeded = false;
} else if (MediaControls *toolbar =
dynamic_cast<MediaControls *>(
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)

View file

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