[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-kimageshop
Subject:    [calligra/calligra/2.9] krita/plugins/assistants/RulerAssistant: Allow 'shift'-modifer after draggin
From:       Wolthera van Hovell <griffinvalley () gmail ! com>
Date:       2015-08-25 16:14:28
Message-ID: E1ZUGrk-000636-Hq () scm ! kde ! org
[Download RAW message or body]

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@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:
_______________________________________________
Krita mailing list
kimageshop@kde.org
https://mail.kde.org/mailman/listinfo/kimageshop


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic