mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-01-22 05:08:37 -05:00
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:
committed by
Sebastian Beckmann
parent
71509ad00c
commit
81fa608cde
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user