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

@@ -39,6 +39,15 @@ OBSBasicPreview::~OBSBasicPreview()
obs_leave_graphics();
}
void OBSBasicPreview::Init()
{
OBSBasic *main = OBSBasic::Get();
connect(main, &OBSBasic::PreviewXScrollBarMoved, this,
&OBSBasicPreview::XScrollBarMoved);
connect(main, &OBSBasic::PreviewYScrollBarMoved, this,
&OBSBasicPreview::YScrollBarMoved);
}
vec2 OBSBasicPreview::GetMouseEventPos(QMouseEvent *event)
{
OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
@@ -2327,7 +2336,21 @@ void OBSBasicPreview::SetScalingAmount(float newScalingAmountVal)
{
scrollingOffset.x *= newScalingAmountVal / scalingAmount;
scrollingOffset.y *= newScalingAmountVal / scalingAmount;
if (scalingAmount == newScalingAmountVal)
return;
scalingAmount = newScalingAmountVal;
emit scalingChanged(scalingAmount);
}
void OBSBasicPreview::SetScalingLevelAndAmount(int32_t newScalingLevelVal,
float newScalingAmountVal)
{
newScalingLevelVal = std::clamp(newScalingLevelVal, -MAX_SCALING_LEVEL,
MAX_SCALING_LEVEL);
scalingLevel = newScalingLevelVal;
SetScalingAmount(newScalingAmountVal);
}
OBSBasicPreview *OBSBasicPreview::Get()
@@ -2689,4 +2712,65 @@ void OBSBasicPreview::ClampScrollingOffsets()
scrollingOffset.x = std::clamp(scrollingOffset.x, -offset.x, offset.x);
scrollingOffset.y = std::clamp(scrollingOffset.y, -offset.y, offset.y);
UpdateXScrollBar(offset.x);
UpdateYScrollBar(offset.y);
}
void OBSBasicPreview::XScrollBarMoved(int value)
{
updatingXScrollBar = true;
scrollingOffset.x = float(-value);
emit DisplayResized();
updatingXScrollBar = false;
}
void OBSBasicPreview::YScrollBarMoved(int value)
{
updatingYScrollBar = true;
scrollingOffset.y = float(-value);
emit DisplayResized();
updatingYScrollBar = false;
}
void OBSBasicPreview::UpdateXScrollBar(float cx)
{
if (updatingXScrollBar)
return;
OBSBasic *main = OBSBasic::Get();
if (!main->ui->previewXScrollBar->isVisible())
return;
main->ui->previewXScrollBar->setRange(int(-cx), int(cx));
QSize targetSize = GetPixelSize(this);
main->ui->previewXScrollBar->setPageStep(targetSize.width() /
std::min(scalingAmount, 1.0f));
QSignalBlocker sig(main->ui->previewXScrollBar);
main->ui->previewXScrollBar->setValue(int(-scrollingOffset.x));
}
void OBSBasicPreview::UpdateYScrollBar(float cy)
{
if (updatingYScrollBar)
return;
OBSBasic *main = OBSBasic::Get();
if (!main->ui->previewYScrollBar->isVisible())
return;
main->ui->previewYScrollBar->setRange(int(-cy), int(cy));
QSize targetSize = GetPixelSize(this);
main->ui->previewYScrollBar->setPageStep(targetSize.height() /
std::min(scalingAmount, 1.0f));
QSignalBlocker sig(main->ui->previewYScrollBar);
main->ui->previewYScrollBar->setValue(int(-scrollingOffset.y));
}