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

List:       kde-commits
Subject:    [krita/krita-testing-wolthera] libs/ui/widgets: Add triangle and elliptical visual selectors and set
From:       Wolthera van Hovell tot Westerflier <griffinvalley () gmail ! com>
Date:       2016-08-19 19:10:49
Message-ID: E1bapBp-0004qF-FX () code ! kde ! org
[Download RAW message or body]

Git commit 8737642881dc971e9b1469cae7dd5f9f283787fe by Wolthera van Hovell tot \
Westerflier. Committed on 18/08/2016 at 22:00.
Pushed by woltherav into branch 'krita-testing-wolthera'.

Add triangle and elliptical visual selectors and set default to ring+triangle

This is a bit finicky still. Also weird bugs with Qt cause flickering when changing \
widgets, due to having to force them to show. :/ Might need to think a bit longer \
about this...

Ref T2438

M  +293  -15   libs/ui/widgets/kis_visual_color_selector.cpp
M  +57   -1    libs/ui/widgets/kis_visual_color_selector.h

http://commits.kde.org/krita/8737642881dc971e9b1469cae7dd5f9f283787fe

diff --git a/libs/ui/widgets/kis_visual_color_selector.cpp \
b/libs/ui/widgets/kis_visual_color_selector.cpp index 506a990..8fe323a 100644
--- a/libs/ui/widgets/kis_visual_color_selector.cpp
+++ b/libs/ui/widgets/kis_visual_color_selector.cpp
@@ -27,6 +27,7 @@
 #include <QList>
 #include <QPolygon>
 #include <QRect>
+#include <QtMath>
 
 #include "KoColorConversions.h"
 #include "KoColorDisplayRendererInterface.h"
@@ -47,7 +48,7 @@ struct KisVisualColorSelector::Private
 
 KisVisualColorSelector::KisVisualColorSelector(QWidget *parent) : QWidget(parent), \
m_d(new Private)  {
-
+    this->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
     QVBoxLayout *layout = new QVBoxLayout;
     this->setLayout(layout);
     //m_d->updateSelf = new KisSignalCompressor(100 /* ms */, \
KisSignalCompressor::POSTPONE, this); @@ -74,11 +75,11 @@ void \
KisVisualColorSelector::slotsetColorSpace(const KoColorSpace *cs)  if (m_d->currentCS \
!= cs)  {
         m_d->currentCS = cs;
-        if (this->layout()) {
+        if (this->children().at(0)) {
             qDeleteAll(this->children());
         }
         m_d->widgetlist.clear();
-        QHBoxLayout *layout = new QHBoxLayout;
+        QLayout *layout = new QHBoxLayout;
         //redraw all the widgets.
         if (m_d->currentCS->colorChannelCount() == 1) {
             KisVisualRectangleSelectorShape *bar =  new \
KisVisualRectangleSelectorShape(this, \
KisVisualRectangleSelectorShape::onedimensional,KisVisualColorSelectorShape::Channel, \
cs, 0, 0); @@ -88,7 +89,7 @@ void KisVisualColorSelector::slotsetColorSpace(const \
KoColorSpace *cs)  layout->addWidget(bar);
             m_d->widgetlist.append(bar);
         } else if (m_d->currentCS->colorChannelCount() == 3) {
-            KisVisualRectangleSelectorShape *bar =  new \
KisVisualRectangleSelectorShape(this, +            /*KisVisualRectangleSelectorShape \
                *bar =  new KisVisualRectangleSelectorShape(this,
                                                                                      \
                KisVisualRectangleSelectorShape::onedimensional,
                                                                                      \
                KisVisualColorSelectorShape::HSL,
                                                                                      \
cs, 0, 0, @@ -96,19 +97,37 @@ void KisVisualColorSelector::slotsetColorSpace(const \
                KoColorSpace *cs)
             KisVisualRectangleSelectorShape *block =  new \
KisVisualRectangleSelectorShape(this, \
                KisVisualRectangleSelectorShape::twodimensional,
                                                                                      \
                KisVisualColorSelectorShape::HSL,
                                                                                      \
cs, 1, 2, +                                                                           \
m_d->displayRenderer);*/ +            int sizeValue = qMin(width(), height());
+            int borderWidth = qMax(sizeValue*0.1, 20.0);
+            KisVisualEllipticalSelectorShape *bar =  new \
KisVisualEllipticalSelectorShape(this, +                                              \
KisVisualColorSelectorShape::onedimensional, +                                        \
KisVisualColorSelectorShape::HSV, +                                                   \
cs, 0, 0, +                                                                           \
m_d->displayRenderer, borderWidth,KisVisualEllipticalSelectorShape::border); +        \
KisVisualTriangleSelectorShape *block =  new KisVisualTriangleSelectorShape(this, \
KisVisualColorSelectorShape::twodimensional, +                                        \
KisVisualColorSelectorShape::HSV, +                                                   \
                cs, 1, 2,
                                                                                      \
                m_d->displayRenderer);
-            bar->setMaximumWidth(width()*0.5);
-            bar->setMaximumHeight(height());
-            block->setMaximumWidth(width()*0.5);
-            block->setMaximumHeight(height());
+            bar->resize(sizeValue, sizeValue);
+            QLineF barInnerRadius(bar->geometry().center(), \
QPointF(bar->geometry().right()-borderWidth, bar->geometry().center().y())); +        \
QRect geom = block->setGeometryByRadius(barInnerRadius); +            \
block->setGeometry(geom); +            block->setTriangle();
+            //There's a really weird bug where touching the geometry makes the \
widget hide itself??? This didn't happen with layouts so, I am confused.// +          \
block->show(); +            bar->show();
+            qDebug()<<bar->geometry();
+            qDebug()<<bar->pos();
+            qDebug()<<block->geometry();
+            qDebug()<<this->geometry();
             bar->setColor(m_d->currentcolor);
             block->setColor(m_d->currentcolor);
             connect (bar, SIGNAL(sigNewColor(KoColor)), block, \
                SLOT(setColorFromSibling(KoColor)));
             connect (block, SIGNAL(sigNewColor(KoColor)), \
                SLOT(updateFromWidgets(KoColor)));
-            layout->addWidget(bar);
-            layout->addWidget(block);
             m_d->widgetlist.append(bar);
             m_d->widgetlist.append(block);
+            this->adjustSize();
         } else if (m_d->currentCS->colorChannelCount() == 4) {
             KisVisualRectangleSelectorShape *block =  new \
KisVisualRectangleSelectorShape(this, \
KisVisualRectangleSelectorShape::twodimensional,KisVisualColorSelectorShape::Channel, \
cs, 0, 1);  KisVisualRectangleSelectorShape *block2 =  new \
KisVisualRectangleSelectorShape(this, \
KisVisualRectangleSelectorShape::twodimensional,KisVisualColorSelectorShape::Channel, \
cs, 2, 3); @@ -561,11 +580,6 @@ void \
KisVisualColorSelectorShape::paintEvent(QPaintEvent*)  \
painter.drawPixmap(0,0,m_d->fullSelector);  }
 
-void KisVisualColorSelectorShape::resizeEvent(QResizeEvent *)
-{
-    m_d->pixmapsNeedUpdate = true;
-}
-
 KisVisualColorSelectorShape::Dimensions KisVisualColorSelectorShape::getDimensions()
 {
     return m_d->dimension;
@@ -882,3 +896,267 @@ void KisVisualRectangleSelectorShape::drawCursor()
     painter.end();
     setFullImage(fullSelector);
 }
+
+//----------------Elliptical--------------------------//
+KisVisualEllipticalSelectorShape::KisVisualEllipticalSelectorShape(QWidget *parent,
+                                                                 Dimensions \
dimension, +                                                                 \
ColorModel model, +                                                                 \
const KoColorSpace *cs, +                                                             \
int channel1, int channel2, +                                                         \
const KoColorDisplayRendererInterface *displayRenderer, +                             \
int borwidth, +                                                                 \
singelDTypes d) +    : KisVisualColorSelectorShape(parent, dimension, model, cs, \
channel1, channel2, displayRenderer) +{
+    m_type = d;
+    m_barWidth = borwidth;
+}
+
+KisVisualEllipticalSelectorShape::~KisVisualEllipticalSelectorShape()
+{
+
+}
+
+QSize KisVisualEllipticalSelectorShape::sizeHint() const
+{
+    return QSize(180,180);
+}
+void KisVisualEllipticalSelectorShape::setBarWidth(int width)
+{
+    m_barWidth = width;
+}
+
+QPointF KisVisualEllipticalSelectorShape::convertShapeCoordinateToWidgetCoordinate(QPointF \
coordinate) +{
+    qreal x = width()/2;
+    qreal y = height()/2;
+    QRect total(0, 0, width(), height());
+    qreal a = total.width()/2;
+    if (m_type!=KisVisualEllipticalSelectorShape::borderMirrored) {
+        QLineF line(total.center(), total.topLeft());
+        line.setAngle(coordinate.x()*360.0);
+        //qreal totalLength = ( (a*b) / qSqrt( qPow( b*qCos(line.angle()),2 ) + \
qPow(a*qSin(line.angle()),2 ) )); +        line.setLength(coordinate.y()*a);
+        if (getDimensions()==KisVisualColorSelectorShape::onedimensional) {
+            line.setLength(a-m_barWidth);
+        }
+        x = qRound(line.p2().x());
+        y = qRound(line.p2().y());
+
+    }
+    qDebug()<<QPoint(x,y);
+    return QPointF(x,y);
+}
+
+QPointF KisVisualEllipticalSelectorShape::convertWidgetCoordinateToShapeCoordinate(QPoint \
coordinate) +{
+    //default implementation:
+    qreal x = 0.5;
+    qreal y = 1.0;
+    if (mask().contains(coordinate)) {
+        QRect total(0, 0, width(), height());
+        QLineF line(total.center(), coordinate);
+        qreal a = total.width()/2;
+        //qreal b = qMin(total.width()/2,total.height()/2);
+        //qreal totalLength = ( (a*b) / qSqrt( qPow( b*qCos(line.angle()),2 ) + \
qPow(a*qSin(line.angle()),2 ) )); +        if \
(m_type!=KisVisualEllipticalSelectorShape::borderMirrored){ +            x = \
line.angle()/360.0; +            y = qBound(0.0,line.length()/a, 1.0);
+
+        } else {
+            x = (line.angle()/360.0)/2;
+            y = line.length()/a;
+        }
+
+    }
+    return QPointF(x, y);
+}
+
+QRegion KisVisualEllipticalSelectorShape::getMaskMap()
+{
+    QRegion mask = QRegion(0,0,width(),height(), QRegion::Ellipse);
+    if (getDimensions()==KisVisualColorSelectorShape::onedimensional) {
+        mask = mask.subtracted(QRegion(m_barWidth, m_barWidth, \
width()-(m_barWidth*2), height()-(m_barWidth*2), QRegion::Ellipse)); +    }
+    return mask;
+}
+
+void KisVisualEllipticalSelectorShape::drawCursor()
+{
+    QPointF cursorPoint = \
convertShapeCoordinateToWidgetCoordinate(getCursorPosition()); +    QPixmap \
fullSelector = getPixmap(); +    QColor col = \
getColorFromConverter(getCurrentColor()); +    QPainter painter;
+    painter.begin(&fullSelector);
+    painter.setRenderHint(QPainter::Antialiasing);
+    //QPainterPath path;
+    QBrush fill;
+    fill.setStyle(Qt::SolidPattern);
+
+    int cursorwidth = 5;
+    QRect innerRect(m_barWidth, m_barWidth, width()-(m_barWidth*2), \
height()-(m_barWidth*2)); +    \
if(m_type==KisVisualEllipticalSelectorShape::borderMirrored){ +        \
painter.setPen(Qt::white); +        fill.setColor(Qt::white);
+        painter.setBrush(fill);
+        painter.drawEllipse(cursorPoint, cursorwidth, cursorwidth);
+        QPoint mirror(innerRect.center().x()+(innerRect.center().x()-cursorPoint.x()),cursorPoint.y());
 +        painter.drawEllipse(mirror, cursorwidth, cursorwidth);
+        fill.setColor(col);
+        painter.setPen(Qt::black);
+        painter.setBrush(fill);
+        painter.drawEllipse(cursorPoint, cursorwidth-1, cursorwidth-1);
+        painter.drawEllipse(mirror, cursorwidth-1, cursorwidth-1);
+
+    } else {
+        painter.setPen(Qt::white);
+        fill.setColor(Qt::white);
+        painter.setBrush(fill);
+        painter.drawEllipse(cursorPoint, cursorwidth, cursorwidth);
+        fill.setColor(col);
+        painter.setPen(Qt::black);
+        painter.setBrush(fill);
+        painter.drawEllipse(cursorPoint, cursorwidth-1.0, cursorwidth-1.0);
+    }
+    painter.end();
+    setFullImage(fullSelector);
+}
+
+//----------------Elliptical--------------------------//
+KisVisualTriangleSelectorShape::KisVisualTriangleSelectorShape(QWidget *parent,
+                                                                 Dimensions \
dimension, +                                                                 \
ColorModel model, +                                                                 \
const KoColorSpace *cs, +                                                             \
int channel1, int channel2, +                                                         \
const KoColorDisplayRendererInterface *displayRenderer, +                             \
int borwidth) +    : KisVisualColorSelectorShape(parent, dimension, model, cs, \
channel1, channel2, displayRenderer) +{
+    m_barWidth = borwidth;
+    QRect total(0,0,width()*0.9,width()*0.9);
+    setTriangle();
+}
+
+KisVisualTriangleSelectorShape::~KisVisualTriangleSelectorShape()
+{
+
+}
+
+void KisVisualTriangleSelectorShape::setBarWidth(int width)
+{
+    m_barWidth = width;
+}
+
+void KisVisualTriangleSelectorShape::setTriangle()
+{
+    QPoint apex = QPoint (width(),height()/2);
+    QPolygon triangle;
+    triangle<< QPoint(0,0) << apex << QPoint(0,height()) << QPoint(0,0);
+    m_triangle = triangle;
+
+}
+
+QRect KisVisualTriangleSelectorShape::setGeometryByRadius(QLineF radius)
+{
+    QPolygon triangle;
+    radius.setAngle(120);//point at yellow :)
+    QPointF tl = radius.p2();
+    radius.setAngle(0);//point to cyan :)
+    QPointF mr = radius.p2();
+    radius.setAngle(240);//point to magenta :)
+    QPointF bl = radius.p2();
+    QPointF br = QPoint(mr.x(),bl.y());
+    QRect r(tl.toPoint(), br.toPoint());
+    return r;
+}
+
+QPointF KisVisualTriangleSelectorShape::convertShapeCoordinateToWidgetCoordinate(QPointF \
coordinate) +{
+    qreal x = width()/2;
+    qreal y = height()/2;
+    return QPointF(x,y);
+}
+
+QPointF KisVisualTriangleSelectorShape::convertWidgetCoordinateToShapeCoordinate(QPoint \
coordinate) +{
+    //default implementation: gotten from the kotrianglecolorselector.
+    qreal x = 0.5;
+    qreal y = 1.0;
+    /*qreal triangleRadius = (width()/2) * 0.9;
+    qreal triangleLength = 3.0 / sqrt(3.0) * triangleRadius;
+    qreal triangleHeight = triangleLength * sqrt(3.0) * 0.5;
+    qreal triangleTop = 0.5 * width() - triangleRadius;
+    qreal triangleBottom = triangleHeight + triangleTop;
+
+    qreal ynormalize = ( triangleTop - coordinate.y() ) / ( triangleTop - \
triangleBottom ); +    qreal ls_ = (ynormalize) * triangleLength;
+    qreal startx_ = center.x() - 0.5 * ls_;
+    */
+    QLineF valLine(m_triangle.at(2), m_triangle.at(1));
+    QLineF satLine(m_triangle.at(0), m_triangle.at(2));
+    QLineF coordinateLine(coordinate, m_triangle.at(0));
+    coordinateLine.setAngle(satLine.angle()+90);
+    QPointF intersect(0.0,0.0);
+    if (valLine.intersect(coordinateLine, &intersect)!=QLineF::NoIntersection) {
+        y = coordinateLine.length()/ QLineF(m_triangle.at(0),intersect).length();
+    }
+    coordinateLine.setP2(m_triangle.at(1));
+    coordinateLine.setAngle(valLine.angle()+90);
+    if (valLine.intersect(coordinateLine, &intersect)!=QLineF::NoIntersection) {
+        x = QLineF(valLine.p1(), intersect).length()/valLine.length();
+    }
+    //x = ((qreal)coordinate.x()/width() );
+
+    return QPointF(x, y);
+}
+
+QRegion KisVisualTriangleSelectorShape::getMaskMap()
+{
+    QRegion mask = QRegion(m_triangle);
+    //QRegion mask =  QRegion();
+    //if (getDimensions()==KisVisualColorSelectorShape::onedimensional) {
+    //    mask = mask.subtracted(QRegion(m_barWidth, m_barWidth, \
width()-(m_barWidth*2), height()-(m_barWidth*2))); +    //}
+    return mask;
+}
+
+void KisVisualTriangleSelectorShape::drawCursor()
+{
+    QPointF cursorPoint = \
convertShapeCoordinateToWidgetCoordinate(getCursorPosition()); +    QPixmap \
fullSelector = getPixmap(); +    QColor col = \
getColorFromConverter(getCurrentColor()); +    QPainter painter;
+    painter.begin(&fullSelector);
+    painter.setRenderHint(QPainter::Antialiasing);
+    //QPainterPath path;
+    QBrush fill;
+    fill.setStyle(Qt::SolidPattern);
+
+    int cursorwidth = 5;
+    QRect innerRect(m_barWidth, m_barWidth, width()-(m_barWidth*2), \
height()-(m_barWidth*2)); +    \
/*if(m_type==KisVisualTriangleSelectorShape::borderMirrored){ +        \
painter.setPen(Qt::white); +        fill.setColor(Qt::white);
+        painter.setBrush(fill);
+        painter.drawEllipse(cursorPoint, cursorwidth, cursorwidth);
+        QPoint mirror(innerRect.center().x()+(innerRect.center().x()-cursorPoint.x()),cursorPoint.y());
 +        painter.drawEllipse(mirror, cursorwidth, cursorwidth);
+        fill.setColor(col);
+        painter.setPen(Qt::black);
+        painter.setBrush(fill);
+        painter.drawEllipse(cursorPoint, cursorwidth-1, cursorwidth-1);
+        painter.drawEllipse(mirror, cursorwidth-1, cursorwidth-1);
+
+    } else {*/
+        painter.setPen(Qt::white);
+        fill.setColor(Qt::white);
+        painter.setBrush(fill);
+        painter.drawEllipse(cursorPoint, cursorwidth, cursorwidth);
+        fill.setColor(col);
+        painter.setPen(Qt::black);
+        painter.setBrush(fill);
+        painter.drawEllipse(cursorPoint, cursorwidth-1.0, cursorwidth-1.0);
+    //}
+    painter.end();
+    setFullImage(fullSelector);
+}
diff --git a/libs/ui/widgets/kis_visual_color_selector.h \
b/libs/ui/widgets/kis_visual_color_selector.h index 027778d..4627b7c 100644
--- a/libs/ui/widgets/kis_visual_color_selector.h
+++ b/libs/ui/widgets/kis_visual_color_selector.h
@@ -178,7 +178,6 @@ protected:
     void mouseMoveEvent(QMouseEvent *e);
     void mouseReleaseEvent(QMouseEvent *e);
     void paintEvent(QPaintEvent*);
-    void resizeEvent(QResizeEvent *);
 private:
     struct Private;
     const QScopedPointer<Private> m_d;
@@ -258,4 +257,61 @@ private:
     virtual void drawCursor();
 };
 
+class KisVisualEllipticalSelectorShape : public KisVisualColorSelectorShape
+{
+    Q_OBJECT
+public:
+    enum singelDTypes{border, borderMirrored};
+    explicit KisVisualEllipticalSelectorShape(QWidget *parent,
+                                         Dimensions dimension,
+                                         ColorModel model,
+                                         const KoColorSpace *cs,
+                                         int channel1, int channel2,
+                                         const KoColorDisplayRendererInterface \
*displayRenderer = KoDumbColorDisplayRenderer::instance(), int borwidth=20, +         \
KisVisualEllipticalSelectorShape::singelDTypes d = \
KisVisualEllipticalSelectorShape::border +                                         );
+    ~KisVisualEllipticalSelectorShape();
+
+    void setBarWidth(int width);
+
+private:
+    virtual QPointF convertShapeCoordinateToWidgetCoordinate(QPointF coordinate);
+    virtual QPointF convertWidgetCoordinateToShapeCoordinate(QPoint coordinate);
+
+    singelDTypes m_type;
+    int m_barWidth;
+    virtual QRegion getMaskMap();
+    virtual void drawCursor();
+    QSize sizeHint() const;
+};
+
+class KisVisualTriangleSelectorShape : public KisVisualColorSelectorShape
+{
+    Q_OBJECT
+public:
+    enum singelDTypes{border, borderMirrored};
+    explicit KisVisualTriangleSelectorShape(QWidget *parent,
+                                         Dimensions dimension,
+                                         ColorModel model,
+                                         const KoColorSpace *cs,
+                                         int channel1, int channel2,
+                                         const KoColorDisplayRendererInterface \
*displayRenderer = KoDumbColorDisplayRenderer::instance(), +                          \
int borwidth=20 +                                         );
+    ~KisVisualTriangleSelectorShape();
+
+    void setBarWidth(int width);
+    void setTriangle();
+    QRect setGeometryByRadius(QLineF radius);
+
+private:
+    virtual QPointF convertShapeCoordinateToWidgetCoordinate(QPointF coordinate);
+    virtual QPointF convertWidgetCoordinateToShapeCoordinate(QPoint coordinate);
+
+    singelDTypes m_type;
+    int m_barWidth;
+    QPolygon m_triangle;
+    virtual QRegion getMaskMap();
+    virtual void drawCursor();
+};
 #endif // KISVISUALCOLORSELECTOR_H


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

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