UI: Add preview scrollbars

This adds scrollbars to the preview, so users can move around the
preview without using the spacebar + clicking.

Co-Authored-By: Clayton Groeneveld <19962531+cg2121@users.noreply.github.com>
This commit is contained in:
Warchamp7
2024-07-31 10:53:59 -04:00
committed by Sebastian Beckmann
parent 71509ad00c
commit 81fa608cde
11 changed files with 638 additions and 53 deletions

View File

@@ -464,6 +464,7 @@ OBSBasic::OBSBasic(QWidget *parent)
ResizePreview(ovi.base_width, ovi.base_height);
UpdateContextBarVisibility();
UpdatePreviewScrollbars();
dpi = devicePixelRatioF();
};
dpi = devicePixelRatioF();
@@ -471,6 +472,30 @@ OBSBasic::OBSBasic(QWidget *parent)
connect(windowHandle(), &QWindow::screenChanged, displayResize);
connect(ui->preview, &OBSQTDisplay::DisplayResized, displayResize);
/* TODO: Move these into window-basic-preview */
/* Preview Scaling label */
connect(ui->preview, &OBSBasicPreview::scalingChanged,
ui->previewScalePercent,
&OBSPreviewScalingLabel::PreviewScaleChanged);
/* Preview Scaling dropdown */
connect(ui->preview, &OBSBasicPreview::scalingChanged,
ui->previewScalingMode,
&OBSPreviewScalingComboBox::PreviewScaleChanged);
connect(ui->preview, &OBSBasicPreview::fixedScalingChanged,
ui->previewScalingMode,
&OBSPreviewScalingComboBox::PreviewFixedScalingChanged);
connect(ui->previewScalingMode,
&OBSPreviewScalingComboBox::currentIndexChanged, this,
&OBSBasic::PreviewScalingModeChanged);
connect(this, &OBSBasic::CanvasResized, ui->previewScalingMode,
&OBSPreviewScalingComboBox::CanvasResized);
connect(this, &OBSBasic::OutputResized, ui->previewScalingMode,
&OBSPreviewScalingComboBox::OutputResized);
delete shortcutFilter;
shortcutFilter = CreateShortcutFilter();
installEventFilter(shortcutFilter);
@@ -1386,6 +1411,7 @@ retryScene:
ui->preview->SetScrollingOffset(scrollOffX, scrollOffY);
}
ui->preview->SetFixedScaling(fixedScaling);
emit ui->preview->DisplayResized();
if (vcamEnabled) {
@@ -2176,6 +2202,7 @@ void OBSBasic::OBSInit()
InitOBSCallbacks();
InitHotkeys();
ui->preview->Init();
/* hack to prevent elgato from loading its own QtNetwork that it tries
* to ship with */
@@ -4924,6 +4951,9 @@ int OBSBasic::ResetVideo()
obs_set_video_levels(sdr_white_level, hdr_nominal_peak_level);
OBSBasicStats::InitializeValues();
OBSProjector::UpdateMultiviewProjectors();
emit CanvasResized(ovi.base_width, ovi.base_height);
emit OutputResized(ovi.output_width, ovi.output_height);
}
return ret;
@@ -5013,8 +5043,10 @@ void OBSBasic::ResizePreview(uint32_t cx, uint32_t cy)
obs_get_video_info(&ovi);
if (isFixedScaling) {
ui->preview->ClampScrollingOffsets();
previewScale = ui->preview->GetScalingAmount();
ui->preview->ClampScrollingOffsets();
GetCenterPosFromFixedScale(
int(cx), int(cy),
targetSize.width() - PREVIEW_EDGE_SIZE * 2,
@@ -5031,6 +5063,8 @@ void OBSBasic::ResizePreview(uint32_t cx, uint32_t cy)
previewX, previewY, previewScale);
}
ui->preview->SetScalingAmount(previewScale);
previewX += float(PREVIEW_EDGE_SIZE);
previewY += float(PREVIEW_EDGE_SIZE);
}
@@ -9169,7 +9203,7 @@ void OBSBasic::on_actionHorizontalCenter_triggered()
void OBSBasic::EnablePreviewDisplay(bool enable)
{
obs_display_set_enabled(ui->preview->GetDisplay(), enable);
ui->preview->setVisible(enable);
ui->previewContainer->setVisible(enable);
ui->previewDisabledWidget->setVisible(!enable);
}
@@ -9765,6 +9799,7 @@ void OBSBasic::on_actionScaleWindow_triggered()
{
ui->preview->SetFixedScaling(false);
ui->preview->ResetScrollingOffset();
emit ui->preview->DisplayResized();
}
@@ -9772,6 +9807,7 @@ void OBSBasic::on_actionScaleCanvas_triggered()
{
ui->preview->SetFixedScaling(true);
ui->preview->SetScalingLevel(0);
emit ui->preview->DisplayResized();
}
@@ -9785,8 +9821,8 @@ void OBSBasic::on_actionScaleOutput_triggered()
// log base ZOOM_SENSITIVITY of x = log(x) / log(ZOOM_SENSITIVITY)
int32_t approxScalingLevel =
int32_t(round(log(scalingAmount) / log(ZOOM_SENSITIVITY)));
ui->preview->SetScalingLevel(approxScalingLevel);
ui->preview->SetScalingAmount(scalingAmount);
ui->preview->SetScalingLevelAndAmount(approxScalingLevel,
scalingAmount);
emit ui->preview->DisplayResized();
}
@@ -11093,3 +11129,36 @@ void OBSBasic::OnEvent(enum obs_frontend_event event)
if (api)
api->on_event(event);
}
void OBSBasic::UpdatePreviewScrollbars()
{
if (!ui->preview->IsFixedScaling()) {
ui->previewXScrollBar->setRange(0, 0);
ui->previewYScrollBar->setRange(0, 0);
}
}
void OBSBasic::on_previewXScrollBar_valueChanged(int value)
{
emit PreviewXScrollBarMoved(value);
}
void OBSBasic::on_previewYScrollBar_valueChanged(int value)
{
emit PreviewYScrollBarMoved(value);
}
void OBSBasic::PreviewScalingModeChanged(int value)
{
switch (value) {
case 0:
on_actionScaleWindow_triggered();
break;
case 1:
on_actionScaleCanvas_triggered();
break;
case 2:
on_actionScaleOutput_triggered();
break;
};
}