14.24: Ctrl or Meta with a middle drag zooms

This commit is contained in:
ZacharyZhang-NY committed 2026-10-11 12:34:44 -04:00
1 parent 1323315b0c
commit 4d70d37b30
6 files changed
+97 -5

No files matched your search

+1 -1
View File
@@ -114,7 +114,7 @@ void CanvasView::endBrushTipDrag(QPointF point)
// The circle at the pointer, a stroke's own size.
void CanvasView::updateBrushCursor()
{
const bool shows = isBrushTool(m_session.tool()) && !m_spaceHeld && !picking() && !m_middlePanPoint;
const bool shows = isBrushTool(m_session.tool()) && !m_spaceHeld && !picking() && !m_middlePanPoint && !m_middleZoom;
const double diameter = m_session.brushStroke() ? m_session.brushStroke()->settings.diameter : m_session.brushSettings().diameter;
// Clone Stamp marks its source; between strokes, previews a click.
std::optional<QPointF> sample;
+3 -1
View File
@@ -263,7 +263,9 @@ void CanvasView::updateCursor()
{
const NavigationTool tool = m_session.tool();
// A middle-button pan outranks every drag; another keeps its cursor.
if (m_middlePanPoint)
if (m_middleZoom)
setCursor(zoomCursor(m_middleZoom->out, devicePixelRatio()));
else if (m_middlePanPoint)
setCursor(Qt::ClosedHandCursor);
else if (m_dragCursor)
setCursor(*m_dragCursor);
+18 -3
View File
@@ -120,9 +120,12 @@ void CanvasView::mousePressEvent(QMouseEvent *event)
// Swift's mouseDown with its click count.
void CanvasView::press(QMouseEvent *event, int clicks)
{
// The middle button pans in any tool, beside the left.
// The middle button pans anywhere; Ctrl or Meta zooms.
if (event->button() == Qt::MiddleButton && m_session.document()) {
m_middlePanPoint = event->position();
if (event->modifiers() & (Qt::ControlModifier | Qt::MetaModifier))
m_middleZoom = MiddleZoom{event->position(), m_session.viewport.zoom()};
else
m_middlePanPoint = event->position();
updateBrushCursor();
updateCursor();
return;
@@ -226,6 +229,17 @@ void CanvasView::mouseMoveEvent(QMouseEvent *event)
// Swift's mouseMoved: the readout follows a hover alone.
if (!event->buttons() && m_session.document())
m_session.updateCameraRawReadout(m_session.viewport.documentPoint(point, m_session.document()->size()));
if (m_middleZoom && event->buttons().testFlag(Qt::MiddleButton)) {
// Up zooms in, doubling each 100 points, as Zoom drags.
const double factor = std::pow(2, (m_middleZoom->start.y() - point.y()) / 100);
m_middleZoom->out = factor < 1;
m_session.zoom(m_middleZoom->zoom * factor, m_middleZoom->start);
updateCursor();
if (!event->buttons().testFlag(Qt::LeftButton))
return;
} else if (m_middleZoom) {
endMiddlePan();
}
if (m_middlePanPoint && event->buttons().testFlag(Qt::MiddleButton)) {
m_session.viewport.translate(QSizeF(point.x() - m_middlePanPoint->x(), point.y() - m_middlePanPoint->y()));
m_middlePanPoint = point;
@@ -297,7 +311,7 @@ void CanvasView::mouseMoveEvent(QMouseEvent *event)
void CanvasView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::MiddleButton && m_middlePanPoint) {
if (event->button() == Qt::MiddleButton && (m_middlePanPoint || m_middleZoom)) {
endMiddlePan();
return;
}
@@ -394,6 +408,7 @@ void CanvasView::leaveEvent(QEvent *event)
void CanvasView::endMiddlePan()
{
m_middlePanPoint.reset();
m_middleZoom.reset();
updateCursor();
updateBrushCursor();
}
+8
View File
@@ -134,6 +134,12 @@ private:
double zoom;
bool moved;
};
// Swift's middleZoom: its start, the zoom then, the minus.
struct MiddleZoom {
QPointF start;
double zoom;
bool out = false;
};
using Center = std::function<QPointF(QPointF)>;
// What a press off the handles drags, picked or not.
struct PressTarget {
@@ -303,6 +309,8 @@ private:
std::optional<QPointF> m_lastDragPoint;
// Where a middle-button pan last was, its own drag point.
std::optional<QPointF> m_middlePanPoint;
// A middle drag with Ctrl or Meta: Blender's zoom.
std::optional<MiddleZoom> m_middleZoom;
std::optional<ZoomDrag> m_zoomDrag;
bool m_shiftHeld = false;
// Document point where a drag of the outline began.