[calligra/calligra/2.9] krita/plugins/assistants/RulerAssistant: Allow 'shift'-modifer after dragging an assistant handle to snap lines.

Wolthera van Hovell griffinvalley at gmail.com
Tue Aug 25 16:14:28 UTC 2015


Git commit b3af582293435373785167c2ccfbdece92e2ac71 by Wolthera van Hovell.
Committed on 25/08/2015 at 16:14.
Pushed by woltherav into branch 'calligra/2.9'.

Allow 'shift'-modifer after dragging an assistant handle to snap lines.

This gives horizontal snapping to most straight-line assistants.
The radial assistants will have the third handle snap to 'perfectly circular'.

Shift is a bit of an unfortunate choice given the dis-merge node function was
at one point also on shift, but shift-snap is similar to the other two tools
in krita(straight line and gradient tool), but that had been disabled anyway.

CCBUG: 332527
CCMAIL:kimageshop at kde.org

M  +71   -2    krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.cc
M  +4    -0    krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.h

http://commits.kde.org/calligra/b3af582293435373785167c2ccfbdece92e2ac71

diff --git a/krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.cc b/krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.cc
index 0a156b6..77bdc2d 100644
--- a/krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.cc
+++ b/krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.cc
@@ -141,6 +141,7 @@ void KisRulerAssistantTool::beginPrimaryAction(KoPointerEvent *event)
                 if (dist < minDist) {
                     minDist = dist;
                 }
+                m_dragStart = QPointF(assistant->topRight().data()->x(),assistant->topRight().data()->y());
                 m_internalMode = MODE_DRAGGING_NODE;
             } else if (m_handleDrag == assistant->topRight()) {
                 double dist = norm2(mousePos - m_canvas->viewConverter()->documentToView(*m_handleDrag));
@@ -148,20 +149,25 @@ void KisRulerAssistantTool::beginPrimaryAction(KoPointerEvent *event)
                     minDist = dist;
                 }
                 m_internalMode = MODE_DRAGGING_NODE;
+                m_dragStart = QPointF(assistant->topLeft().data()->x(),assistant->topLeft().data()->y());
             } else if (m_handleDrag == assistant->bottomLeft()) {
                 double dist = norm2(mousePos - m_canvas->viewConverter()->documentToView(*m_handleDrag));
                 if (dist < minDist) {
                     minDist = dist;
                 }
                 m_internalMode = MODE_DRAGGING_NODE;
+                m_dragStart = QPointF(assistant->bottomRight().data()->x(),assistant->bottomRight().data()->y());
             } else if (m_handleDrag == assistant->bottomRight()) {
                 double dist = norm2(mousePos - m_canvas->viewConverter()->documentToView(*m_handleDrag));
                 if (dist < minDist) {
                     minDist = dist;
                 }
                 m_internalMode = MODE_DRAGGING_NODE;
+                m_dragStart = QPointF(assistant->bottomLeft().data()->x(),assistant->bottomLeft().data()->y());
             } else if (m_handleDrag == assistant->leftMiddle()) {
                 m_internalMode = MODE_DRAGGING_TRANSLATING_TWONODES;
+                m_dragStart = QPointF((assistant->bottomLeft().data()->x()+assistant->topLeft().data()->x())*0.5,
+                                      (assistant->bottomLeft().data()->y()+assistant->topLeft().data()->y())*0.5);
                 m_selectedNode1 = new KisPaintingAssistantHandle(assistant->topLeft().data()->x(),assistant->topLeft().data()->y());
                 m_selectedNode2 = new KisPaintingAssistantHandle(assistant->bottomLeft().data()->x(),assistant->bottomLeft().data()->y());
                 m_newAssistant = KisPaintingAssistantFactoryRegistry::instance()->get("perspective")->createPaintingAssistant();
@@ -174,6 +180,8 @@ void KisRulerAssistantTool::beginPrimaryAction(KoPointerEvent *event)
                 m_canvas->updateCanvas(); // TODO update only the relevant part of the canvas
                 return;
             } else if (m_handleDrag == assistant->rightMiddle()) {
+                m_dragStart = QPointF((assistant->topRight().data()->x()+assistant->bottomRight().data()->x())*0.5,
+                                      (assistant->topRight().data()->y()+assistant->bottomRight().data()->y())*0.5);
                 m_internalMode = MODE_DRAGGING_TRANSLATING_TWONODES;
                 m_selectedNode1 = new KisPaintingAssistantHandle(assistant->topRight().data()->x(),assistant->topRight().data()->y());
                 m_selectedNode2 = new KisPaintingAssistantHandle(assistant->bottomRight().data()->x(),assistant->bottomRight().data()->y());
@@ -187,6 +195,8 @@ void KisRulerAssistantTool::beginPrimaryAction(KoPointerEvent *event)
                 m_canvas->updateCanvas(); // TODO update only the relevant part of the canvas
                 return;
             } else if (m_handleDrag == assistant->topMiddle()) {
+                m_dragStart = QPointF((assistant->topLeft().data()->x()+assistant->topRight().data()->x())*0.5,
+                                      (assistant->topLeft().data()->y()+assistant->topRight().data()->y())*0.5);
                 m_internalMode = MODE_DRAGGING_TRANSLATING_TWONODES;
                 m_selectedNode1 = new KisPaintingAssistantHandle(assistant->topLeft().data()->x(),assistant->topLeft().data()->y());
                 m_selectedNode2 = new KisPaintingAssistantHandle(assistant->topRight().data()->x(),assistant->topRight().data()->y());
@@ -200,6 +210,8 @@ void KisRulerAssistantTool::beginPrimaryAction(KoPointerEvent *event)
                 m_canvas->updateCanvas(); // TODO update only the relevant part of the canvas
                 return;
             } else if (m_handleDrag == assistant->bottomMiddle()) {
+                m_dragStart = QPointF((assistant->bottomLeft().data()->x()+assistant->bottomRight().data()->x())*0.5,
+                                      (assistant->bottomLeft().data()->y()+assistant->bottomRight().data()->y())*0.5);
                 m_internalMode = MODE_DRAGGING_TRANSLATING_TWONODES;
                 m_selectedNode1 = new KisPaintingAssistantHandle(assistant->bottomLeft().data()->x(),assistant->bottomLeft().data()->y());
                 m_selectedNode2 = new KisPaintingAssistantHandle(assistant->bottomRight().data()->x(),assistant->bottomRight().data()->y());
@@ -213,8 +225,39 @@ void KisRulerAssistantTool::beginPrimaryAction(KoPointerEvent *event)
                 m_canvas->updateCanvas(); // TODO update only the relevant part of the canvas
                 return;
             }
+            m_snapIsRadial = false;
+        } else if (m_handleDrag && assistant->handles().size()>1 && (assistant->id() == "ruler" ||
+                                    assistant->id() == "parallel ruler" ||
+                                    assistant->id() == "infinite ruler" ||
+                                    assistant->id() == "spline")){
+            if (m_handleDrag == assistant->handles()[0]) {
+                m_dragStart = *assistant->handles()[1];
+            } else if (m_handleDrag == assistant->handles()[1]) {
+                m_dragStart = *assistant->handles()[0];
+            } else if (m_handleDrag == assistant->handles()[2]) {
+                m_dragStart = *assistant->handles()[0];
+            } else if (m_handleDrag == assistant->handles()[3]) {
+                m_dragStart = *assistant->handles()[1];
+            }
+            m_snapIsRadial = false;
+        } else if (m_handleDrag && assistant->handles().size()>2 && (assistant->id() == "ellipse" ||
+                                    assistant->id() == "concentric ellipse" ||
+                                    assistant->id() == "fisheye-point")){
+            m_snapIsRadial = false;
+            if (m_handleDrag == assistant->handles()[0]) {
+                m_dragStart = *assistant->handles()[1];
+            } else if (m_handleDrag == assistant->handles()[1]) {
+                m_dragStart = *assistant->handles()[0];
+            } else if (m_handleDrag == assistant->handles()[2]) {
+                m_dragStart = assistant->buttonPosition();
+                m_radius = QLineF(m_dragStart, *assistant->handles()[0]);
+                m_snapIsRadial = true;
+            }
+            
+        } else {
+            m_dragStart = assistant->buttonPosition();
+            m_snapIsRadial = false;
         }
-        
     }
 
     if (m_handleDrag) {
@@ -289,6 +332,16 @@ void KisRulerAssistantTool::continuePrimaryAction(KoPointerEvent *event)
 {
     if (m_handleDrag) {
         *m_handleDrag = event->point;
+        //ported from the gradient tool... we need to think about this more in the future.
+        if (event->modifiers() == Qt::ShiftModifier && m_snapIsRadial) {
+            QLineF dragRadius = QLineF(m_dragStart, event->point);
+            dragRadius.setLength(m_radius.length()); 
+            *m_handleDrag = dragRadius.p2();
+        } else if (event->modifiers() == Qt::ShiftModifier ) {
+            *m_handleDrag = straightLine(event->point, m_dragStart);
+        } else {
+            *m_handleDrag = event->point;
+        }
         m_handleDrag->uncache();
 
         m_handleCombine = 0;
@@ -464,7 +517,7 @@ void KisRulerAssistantTool::mouseMoveEvent(KoPointerEvent *event)
         *m_newAssistant->handles().back() = event->point;
         m_canvas->updateCanvas();
     } else if (m_newAssistant && m_internalMode == MODE_DRAGGING_TRANSLATING_TWONODES) {
-        QPointF translate = event->point - m_dragEnd;
+        QPointF translate = event->point - m_dragEnd;;
         m_dragEnd = event->point;
         m_selectedNode1.data()->operator =(QPointF(m_selectedNode1.data()->x(),m_selectedNode1.data()->y()) + translate);
         m_selectedNode2.data()->operator = (QPointF(m_selectedNode2.data()->x(),m_selectedNode2.data()->y()) + translate);
@@ -472,6 +525,22 @@ void KisRulerAssistantTool::mouseMoveEvent(KoPointerEvent *event)
     }
 }
 
+QPointF KisRulerAssistantTool::straightLine(QPointF point, QPointF compare)
+{
+    QPointF comparison = point - compare;
+    QPointF result;
+
+    if (fabs(comparison.x()) > fabs(comparison.y())) {
+        result.setX(point.x());
+        result.setY(compare.y());
+    } else {
+        result.setX(compare.x());
+        result.setY(point.y());
+    }
+
+    return result;
+}
+
 void KisRulerAssistantTool::paint(QPainter& _gc, const KoViewConverter &_converter)
 {
     QColor handlesColor(0, 0, 0, 125);
diff --git a/krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.h b/krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.h
index f4dc154..0ff02c9 100644
--- a/krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.h
+++ b/krita/plugins/assistants/RulerAssistant/kis_ruler_assistant_tool.h
@@ -59,6 +59,7 @@ private:
     void outlineOn(KisPaintingAssistant* assistant);
     void outlineOff(KisPaintingAssistant* assistant);
     bool mouseNear(const QPointF& mousep, const QPointF& point);
+    QPointF straightLine(QPointF point, QPointF compare);
     KisPaintingAssistantHandleSP nodeNearPoint(KisPaintingAssistant* grid, QPointF point);
 
 public Q_SLOTS:
@@ -84,6 +85,9 @@ protected:
     QPointF m_mousePosition;
     Ui::AssistantsToolOptions m_options;
     QWidget* m_optionsWidget;
+    QPointF m_dragStart;
+    QLineF m_radius;
+    bool m_snapIsRadial;
     QPointF m_dragEnd;
 
 private:


More information about the kimageshop mailing list