14.24: Ctrl or Meta with a middle drag zooms
This commit is contained in:
6 files changed
+97
-5
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user