UI: Update the filters window to be resizeable

Updates the filters window to use a QSplitter layout for the properties area.

The handle is disabled for audio filter windows. The handle and property area are hidden when there are no filters.
This commit is contained in:
Warchamp7
2021-12-17 06:52:35 -08:00
committed by Jim
parent 02f3495b72
commit f5947d9b9b
3 changed files with 173 additions and 35 deletions
+33 -4
View File
@@ -119,6 +119,7 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
if (audioOnly) {
ui->effectWidget->setVisible(false);
ui->separatorLine->setVisible(false);
UpdateSplitter(false);
}
if (async && !audioOnly && ui->asyncFilters->count() == 0 &&
@@ -129,6 +130,12 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
if (audioOnly || (audio && !async))
ui->asyncLabel->setText(QTStr("Basic.Filters.AudioFilters"));
if (async && audio && ui->asyncFilters->count() == 0) {
UpdateSplitter(false);
} else if (!audioOnly) {
UpdateSplitter();
}
auto addDrawCallback = [this]() {
obs_display_add_draw_callback(ui->preview->GetDisplay(),
OBSBasicFilters::DrawPreview,
@@ -147,7 +154,6 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
addDrawCallback);
} else {
ui->rightLayout->setContentsMargins(0, noPreviewMargin, 0, 0);
ui->rightContainerLayout->insertStretch(1);
ui->preview->hide();
}
@@ -255,7 +261,8 @@ void OBSBasicFilters::UpdatePropertiesView(int row, bool async)
{
if (view) {
updatePropertiesSignal.Disconnect();
ui->rightLayout->removeWidget(view);
ui->propertiesFrame->setVisible(false);
view->hide();
view->deleteLater();
view = nullptr;
}
@@ -284,9 +291,9 @@ void OBSBasicFilters::UpdatePropertiesView(int row, bool async)
"update_properties",
OBSBasicFilters::UpdateProperties, this);
view->setMaximumHeight(250);
view->setMinimumHeight(150);
ui->rightLayout->addWidget(view);
UpdateSplitter();
ui->propertiesLayout->addWidget(view);
view->show();
}
@@ -438,6 +445,28 @@ void OBSBasicFilters::UpdateFilters()
main->SaveProject();
}
void OBSBasicFilters::UpdateSplitter()
{
bool show_splitter_frame =
ui->asyncFilters->count() + ui->effectFilters->count() > 0;
UpdateSplitter(show_splitter_frame);
}
void OBSBasicFilters::UpdateSplitter(bool show_splitter_frame)
{
bool show_splitter_handle = show_splitter_frame;
uint32_t caps = obs_source_get_output_flags(source);
if ((caps & OBS_SOURCE_VIDEO) == 0)
show_splitter_handle = false;
for (int i = 0; i < ui->rightLayout->count(); i++) {
QSplitterHandle *hndl = ui->rightLayout->handle(i);
hndl->setEnabled(show_splitter_handle);
}
ui->propertiesFrame->setVisible(show_splitter_frame);
}
static bool filter_compatible(bool async, uint32_t sourceFlags,
uint32_t filterFlags)
{