[calligra/calligra/2.9] krita/ui: [FEATURE] Add on-canvas preview of current color

Dmitry Kazakov dimula73 at gmail.com
Sun May 10 13:23:15 UTC 2015


Git commit 55d7eaebed3923da01150a38654df8a4fe3b199d by Dmitry Kazakov.
Committed on 10/05/2015 at 13:23.
Pushed by dkazakov into branch 'calligra/2.9'.

[FEATURE] Add on-canvas preview of current color

1) Now when activating color picker in the brush tool
   with Ctrl or any other shortcut, currently selected color
   will be displayed near the cursor on screen.

2) If you start actual color-picking, the two colors will be
   compared side-by-side.

BUG:338128
Fixes task T206
CC:kimageshop at kde.org

M  +10   -0    krita/ui/kis_config.cc
M  +3    -0    krita/ui/kis_config.h
M  +111  -8    krita/ui/tool/kis_tool_paint.cc
M  +14   -1    krita/ui/tool/kis_tool_paint.h

http://commits.kde.org/calligra/55d7eaebed3923da01150a38654df8a4fe3b199d

diff --git a/krita/ui/kis_config.cc b/krita/ui/kis_config.cc
index f9f96c7..b409a3f 100644
--- a/krita/ui/kis_config.cc
+++ b/krita/ui/kis_config.cc
@@ -324,6 +324,16 @@ void KisConfig::setNewOutlineStyle(OutlineStyle style)
     m_cfg.writeEntry("newOutlineStyle", (int)style);
 }
 
+QRect KisConfig::colorPreviewRect() const
+{
+    return m_cfg.readEntry("colorPreviewRect", QVariant(QRect(32, 32, 48, 48))).toRect();
+}
+
+void KisConfig::setColorPreviewRect(const QRect &rect)
+{
+    m_cfg.writeEntry("colorPreviewRect", QVariant(rect));
+}
+
 bool KisConfig::useDirtyPresets(bool defaultValue) const
 {
    return (defaultValue ? false : m_cfg.readEntry("useDirtyPresets",false));
diff --git a/krita/ui/kis_config.h b/krita/ui/kis_config.h
index f68f881..43f52f8 100644
--- a/krita/ui/kis_config.h
+++ b/krita/ui/kis_config.h
@@ -105,6 +105,9 @@ public:
     OutlineStyle newOutlineStyle(bool defaultValue = false) const;
     void setNewOutlineStyle(OutlineStyle style);
 
+    QRect colorPreviewRect() const;
+    void setColorPreviewRect(const QRect &rect);
+
     /// get the profile the user has selected for the given screen
     QString monitorProfile(int screen) const;
     void setMonitorProfile(int screen, const QString & monitorProfile, bool override) const;
diff --git a/krita/ui/tool/kis_tool_paint.cc b/krita/ui/tool/kis_tool_paint.cc
index 00aa2a1..0c6b528 100644
--- a/krita/ui/tool/kis_tool_paint.cc
+++ b/krita/ui/tool/kis_tool_paint.cc
@@ -60,6 +60,7 @@
 #include <KisViewManager.h>
 #include <kis_canvas2.h>
 #include <kis_cubic_curve.h>
+#include "kis_display_color_converter.h"
 
 #include "kis_config.h"
 #include "kis_config_notifier.h"
@@ -74,7 +75,8 @@
 
 KisToolPaint::KisToolPaint(KoCanvasBase * canvas, const QCursor & cursor)
     : KisTool(canvas, cursor),
-      m_isOutlineEnabled(false)
+      m_showColorPreview(false),
+      m_colorPreviewShowComparePlate(false)
 {
     m_specialHoverModifier = false;
     m_optionsWidgetLayout = 0;
@@ -208,6 +210,16 @@ void KisToolPaint::paint(QPainter &gc, const KoViewConverter &converter)
 
     QPainterPath path = tryFixBrushOutline(pixelToView(m_currentOutline));
     paintToolOutline(&gc, path);
+
+    if (m_showColorPreview) {
+        QRectF viewRect = converter.documentToView(m_oldColorPreviewRect);
+        gc.fillRect(viewRect, m_colorPreviewCurrentColor);
+
+        if (m_colorPreviewShowComparePlate) {
+            QRectF baseColorRect = viewRect.translated(viewRect.width(), 0);
+            gc.fillRect(baseColorRect, m_colorPreviewBaseColor);
+        }
+    }
 }
 
 void KisToolPaint::setMode(ToolMode mode)
@@ -222,22 +234,62 @@ void KisToolPaint::setMode(ToolMode mode)
     KisTool::setMode(mode);
 }
 
+void KisToolPaint::activatePickColor(AlternateAction action)
+{
+    m_showColorPreview = true;
+
+    requestUpdateOutline(m_outlineDocPoint, 0);
+
+    int resource = colorPreviewResourceId(action);
+    KoColor color = canvas()->resourceManager()->koColorResource(resource);
+
+    KisCanvas2 * kisCanvas = dynamic_cast<KisCanvas2*>(canvas());
+    KIS_ASSERT_RECOVER_RETURN(kisCanvas);
+
+    m_colorPreviewCurrentColor = kisCanvas->displayColorConverter()->toQColor(color);
+
+    if (!m_colorPreviewBaseColor.isValid()) {
+        m_colorPreviewBaseColor = m_colorPreviewCurrentColor;
+    }
+}
+
+void KisToolPaint::deactivatePickColor(AlternateAction action)
+{
+    Q_UNUSED(action);
+
+    m_showColorPreview = false;
+    m_oldColorPreviewRect = QRect();
+    m_oldColorPreviewUpdateRect = QRect();
+    m_colorPreviewCurrentColor = QColor();
+}
+
+void KisToolPaint::pickColorWasOverridden()
+{
+    m_colorPreviewShowComparePlate = false;
+    m_colorPreviewBaseColor = QColor();
+}
+
 void KisToolPaint::activateAlternateAction(AlternateAction action)
 {
     switch (action) {
     case PickFgNode:
         useCursor(KisCursor::pickerLayerForegroundCursor());
+        activatePickColor(action);
         break;
     case PickBgNode:
         useCursor(KisCursor::pickerLayerBackgroundCursor());
+        activatePickColor(action);
         break;
     case PickFgImage:
         useCursor(KisCursor::pickerImageForegroundCursor());
+        activatePickColor(action);
         break;
     case PickBgImage:
         useCursor(KisCursor::pickerImageBackgroundCursor());
+        activatePickColor(action);
         break;
     default:
+        pickColorWasOverridden();
         KisTool::activateAlternateAction(action);
     };
 }
@@ -254,6 +306,7 @@ void KisToolPaint::deactivateAlternateAction(AlternateAction action)
     }
 
     resetCursorStyle();
+    deactivatePickColor(action);
 }
 
 void KisToolPaint::beginAlternateAction(KoPointerEvent *event, AlternateAction action)
@@ -271,6 +324,8 @@ void KisToolPaint::continueAlternateAction(KoPointerEvent *event, AlternateActio
 {
     if (!pickColor(event->point, action)) {
         KisTool::continueAlternateAction(event, action);
+    } else {
+        requestUpdateOutline(event->point, event);
     }
 }
 
@@ -284,6 +339,15 @@ void KisToolPaint::endAlternateAction(KoPointerEvent *event, AlternateAction act
     }
 }
 
+int KisToolPaint::colorPreviewResourceId(AlternateAction action)
+{
+    bool toForegroundColor = action == PickFgNode || action == PickFgImage;
+    int resource = toForegroundColor ?
+        KoCanvasResourceManager::ForegroundColor : KoCanvasResourceManager::BackgroundColor;
+
+    return resource;
+}
+
 bool KisToolPaint::pickColor(const QPointF &documentPixel,
                              AlternateAction action)
 {
@@ -295,11 +359,9 @@ bool KisToolPaint::pickColor(const QPointF &documentPixel,
         return false;
     }
 
-    bool toForegroundColor = action == PickFgNode || action == PickFgImage;
     bool fromCurrentNode = action == PickFgNode || action == PickBgNode;
 
-    int resource = toForegroundColor ?
-        KoCanvasResourceManager::ForegroundColor : KoCanvasResourceManager::BackgroundColor;
+    int resource = colorPreviewResourceId(action);
 
     KisPaintDeviceSP device = fromCurrentNode ?
         currentNode()->projection() : image()->projection();
@@ -307,10 +369,19 @@ bool KisToolPaint::pickColor(const QPointF &documentPixel,
     QPoint imagePoint = image()->documentToIntPixel(documentPixel);
 
     KoColor color;
+    QColor previewColor;
+
     if (KisToolUtils::pick(device, imagePoint, &color)) {
         canvas()->resourceManager()->setResource(resource, color);
+
+        KisCanvas2 * kisCanvas = dynamic_cast<KisCanvas2*>(canvas());
+        KIS_ASSERT_RECOVER(kisCanvas) { return true; }
+        previewColor = kisCanvas->displayColorConverter()->toQColor(color);
     }
 
+    m_colorPreviewCurrentColor = previewColor;
+    m_colorPreviewShowComparePlate = true;
+
     return true;
 }
 
@@ -496,6 +567,7 @@ KisToolPaint::NodePaintAbility KisToolPaint::nodePaintAbility()
 
 void KisToolPaint::activatePrimaryAction()
 {
+    pickColorWasOverridden();
     setOutlineEnabled(true);
 }
 
@@ -549,6 +621,18 @@ void KisToolPaint::decreaseBrushSize()
     requestUpdateOutline(m_outlineDocPoint, 0);
 }
 
+QRectF KisToolPaint::colorPreviewDocRect(const QPointF &outlineDocPoint)
+{
+    if (!m_showColorPreview) return QRect();
+
+    KisConfig cfg;
+
+    const QRectF colorPreviewViewRect = cfg.colorPreviewRect();
+    const QRectF colorPreviewDocumentRect = canvas()->viewConverter()->viewToDocument(colorPreviewViewRect);
+
+    return colorPreviewDocumentRect.translated(outlineDocPoint);
+}
+
 void KisToolPaint::requestUpdateOutline(const QPointF &outlineDocPoint, const KoPointerEvent *event)
 {
     if (!m_supportOutline) return;
@@ -583,17 +667,36 @@ void KisToolPaint::requestUpdateOutline(const QPointF &outlineDocPoint, const Ko
     canvas()->viewConverter()->zoom(&zoomX, &zoomY);
     qreal xoffset = 2.0/zoomX;
     qreal yoffset = 2.0/zoomY;
-    QRectF newOutlineRect = outlineDocRect.adjusted(-xoffset,-yoffset,xoffset,yoffset);
+
+    if (!outlineDocRect.isEmpty()) {
+        outlineDocRect.adjust(-xoffset,-yoffset,xoffset,yoffset);
+    }
+
+    QRectF colorPreviewDocRect = this->colorPreviewDocRect(m_outlineDocPoint);
+    QRectF colorPreviewDocUpdateRect;
+    if (!colorPreviewDocRect.isEmpty()) {
+        colorPreviewDocUpdateRect.adjust(-xoffset,-yoffset,xoffset,yoffset);
+    }
+
+    if (!m_oldColorPreviewUpdateRect.isEmpty()) {
+        canvas()->updateCanvas(m_oldColorPreviewUpdateRect);
+    }
 
     if (!m_oldOutlineRect.isEmpty()) {
         canvas()->updateCanvas(m_oldOutlineRect);
     }
 
-    if (!newOutlineRect.isEmpty()) {
-        canvas()->updateCanvas(newOutlineRect);
+    if (!outlineDocRect.isEmpty()) {
+        canvas()->updateCanvas(outlineDocRect);
+    }
+
+    if (!colorPreviewDocUpdateRect.isEmpty()) {
+        canvas()->updateCanvas(colorPreviewDocUpdateRect);
     }
 
-    m_oldOutlineRect = newOutlineRect;
+    m_oldOutlineRect = outlineDocRect;
+    m_oldColorPreviewRect = colorPreviewDocRect;
+    m_oldColorPreviewUpdateRect = colorPreviewDocUpdateRect;
 }
 
 QPainterPath KisToolPaint::getOutlinePath(const QPointF &documentPos,
diff --git a/krita/ui/tool/kis_tool_paint.h b/krita/ui/tool/kis_tool_paint.h
index b1c25da..48c1f35 100644
--- a/krita/ui/tool/kis_tool_paint.h
+++ b/krita/ui/tool/kis_tool_paint.h
@@ -169,12 +169,25 @@ protected:
     QPointF m_outlineDocPoint;
     QPainterPath m_currentOutline;
     QRectF m_oldOutlineRect;
-    bool m_toForegroundColor;
+
+    bool m_showColorPreview;
+    QRectF m_oldColorPreviewRect;
+    QRectF m_oldColorPreviewUpdateRect;
+    QColor m_colorPreviewCurrentColor;
+    bool m_colorPreviewShowComparePlate;
+    QColor m_colorPreviewBaseColor;
 
 private:
     QPainterPath tryFixBrushOutline(const QPainterPath &originalOutline);
     void setOpacity(qreal opacity);
 
+    void activatePickColor(AlternateAction action);
+    void deactivatePickColor(AlternateAction action);
+    void pickColorWasOverridden();
+
+    int colorPreviewResourceId(AlternateAction action);
+    QRectF colorPreviewDocRect(const QPointF &outlineDocPoint);
+
 private:
 
     bool m_specialHoverModifier;


More information about the kimageshop mailing list