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

List:       kde-commits
Subject:    [krita] libs/ui: Better pop-up palette thumbnails
From:       Sven Langkamp <sven.langkamp () gmail ! com>
Date:       2016-01-31 11:41:13
Message-ID: E1aPqNV-0005bV-26 () scm ! kde ! org
[Download RAW message or body]

Git commit c2706b36038383da9415bb366207d20acada094d by Sven Langkamp.
Committed on 31/01/2016 at 11:40.
Pushed by langkamp into branch 'master'.

Better pop-up palette thumbnails

Maniphest Tasks: T1428

M  +62   -78   libs/ui/kis_popup_palette.cpp

http://commits.kde.org/krita/c2706b36038383da9415bb366207d20acada094d

diff --git a/libs/ui/kis_popup_palette.cpp b/libs/ui/kis_popup_palette.cpp
index 651fd35..1d27b58e0 100644
--- a/libs/ui/kis_popup_palette.cpp
+++ b/libs/ui/kis_popup_palette.cpp
@@ -38,11 +38,11 @@
 #include "kis_signal_compressor.h"
 #include <QApplication>
 
-#define brushInnerRadius 94.0
-#define brushOuterRadius 145.0
+
 #define colorInnerRadius 72.0
 #define colorOuterRadius 92.0
-#define brushRadius (brushInnerRadius+brushOuterRadius)/2
+#define maxbrushRadius 42.0
+#define widgetSize (colorOuterRadius*2+maxbrushRadius*4)
 
 class PopupColorTriangle : public KoTriangleColorSelector
 {
@@ -95,12 +95,14 @@ KisPopupPalette::KisPopupPalette(KisFavoriteResourceManager* \
manager, const KoCo  , m_displayRenderer(displayRenderer)
     , m_colorChangeCompressor(new KisSignalCompressor(50, \
KisSignalCompressor::POSTPONE))  {
+    
+    const int borderWidth = 3;
     m_triangleColorSelector  = new PopupColorTriangle(displayRenderer, this);
-    m_triangleColorSelector->move(77, 77);
-    m_triangleColorSelector->resize(136, 136);
+    m_triangleColorSelector->move(widgetSize/2-colorInnerRadius+borderWidth, \
widgetSize/2-colorInnerRadius+borderWidth); +    \
m_triangleColorSelector->resize(colorInnerRadius*2-borderWidth*2, \
colorInnerRadius*2-borderWidth*2);  m_triangleColorSelector->setVisible(true);
 
-    QRegion maskedRegion(0, 0, 136, 136, QRegion::Ellipse );
+    QRegion maskedRegion(0, 0, m_triangleColorSelector->width(), \
m_triangleColorSelector->height(), QRegion::Ellipse );  \
m_triangleColorSelector->setMask(maskedRegion);  
     setAttribute(Qt::WA_ContentsPropagated, true);
@@ -241,7 +243,7 @@ void KisPopupPalette::setVisible(bool b)
 
 QSize KisPopupPalette::sizeHint() const
 {
-    return QSize(290, 290);
+    return QSize(widgetSize, widgetSize);
 }
 
 void KisPopupPalette::resizeEvent(QResizeEvent*)
@@ -274,12 +276,8 @@ void KisPopupPalette::paintEvent(QPaintEvent* e)
     // create an ellipse for the background that is slightly
     // smaller than the clipping mask. This will prevent aliasing
     QPainterPath backgroundContainer;
-
-    qreal backgroundWidth = (qreal)(e->rect().width() );
-    qreal backgroundHeight = (qreal)(e->rect().height() );
-
-    backgroundContainer.addEllipse( (-backgroundWidth/2 +1), (-backgroundHeight/2 \
                +1),
-                                          backgroundWidth - 3 , backgroundHeight - 3 \
); +    backgroundContainer.addEllipse( -colorOuterRadius, -colorOuterRadius,
+                                    colorOuterRadius*2, colorOuterRadius*2 );
     painter.fillPath(backgroundContainer,palette().brush(QPalette::Window));
     painter.drawPath(backgroundContainer);
 
@@ -300,6 +298,8 @@ void KisPopupPalette::paintEvent(QPaintEvent* e)
 
         QRect bounds = path.boundingRect().toAlignedRect();
         painter.drawImage(bounds.topLeft() , images.at(pos).scaled(bounds.size() , \
Qt::KeepAspectRatioByExpanding)); +        painter.drawPath(path);
+        
         painter.restore();
     }
     if (hoveredPreset() > -1) {
@@ -409,22 +409,21 @@ void KisPopupPalette::mouseMoveEvent(QMouseEvent* event)
     QPointF point = event->posF();
     event->accept();
 
-    QPainterPath pathBrush(drawDonutPathFull(width() / 2, height() / 2, \
                brushInnerRadius, brushOuterRadius));
     QPainterPath pathColor(drawDonutPathFull(width() / 2, height() / 2, \
colorInnerRadius, colorOuterRadius));  
     setToolTip("");
     setHoveredPreset(-1);
     setHoveredColor(-1);
 
-    if (pathBrush.contains(point)) {
-        //in favorite brushes area
+    {
         int pos = calculatePresetIndex(point, \
m_resourceManager->numFavoritePresets());  
         if (pos >= 0 && pos < m_resourceManager->numFavoritePresets()) {
             setToolTip(m_resourceManager->favoritePresetList().at(pos).data()->name());
  setHoveredPreset(pos);
         }
-    } else if (pathColor.contains(point)) {
+    }
+    if (pathColor.contains(point)) {
         int pos = calculateIndex(point, m_resourceManager->recentColorsTotal());
 
         if (pos >= 0 && pos < m_resourceManager->recentColorsTotal()) {
@@ -440,38 +439,35 @@ void KisPopupPalette::mousePressEvent(QMouseEvent* event)
     event->accept();
 
     if (event->button() == Qt::LeftButton) {
-        QPainterPath pathBrush(drawDonutPathFull(width() / 2, height() / 2, \
                brushInnerRadius, brushOuterRadius));
-
-        if (pathBrush.contains(point)) {
-            //in favorite brushes area
-            int pos = calculateIndex(point, \
                m_resourceManager->numFavoritePresets());
-            if (pos >= 0 && pos < m_resourceManager->numFavoritePresets()
-                    && isPointInPixmap(point, pos)) {
-                //setSelectedBrush(pos);
-                update();
-            }
-        } else {
-            int side = qMin(width(), height());
-            QPainterPath settingCircle;
-            settingCircle.addEllipse(width() / 2 + side / 2 - 40, height() / 2 + \
                side / 2 - 40, 40, 40);
-            if (settingCircle.contains(point)) {                
-                KisPaintOpPresetResourceServer* rServer = \
                KisResourceServerProvider::instance()->paintOpPresetServer();
-                QStringList tags = rServer->tagNamesList();
-                qSort(tags);
-
-                if (!tags.isEmpty()) {
-                    QMenu menu;
-                    Q_FOREACH (const QString& tag, tags) {
-                        menu.addAction(tag);
-                    }
-                    QAction* action = menu.exec(event->globalPos());
-                    if (action) {
-                        m_resourceManager->setCurrentTag(action->text());
-                    }
-                } else {
-                    QWhatsThis::showText(event->globalPos(), 
-                                         i18n("There are no tags available to show \
in this popup. To add presets, you need to tag them and then select the tag here.")); \
+ +        //in favorite brushes area
+        int pos = calculateIndex(point, m_resourceManager->numFavoritePresets());
+        if (pos >= 0 && pos < m_resourceManager->numFavoritePresets()
+                && isPointInPixmap(point, pos)) {
+            //setSelectedBrush(pos);
+            update();
+        }
+
+        int side = qMin(width(), height());
+        QPainterPath settingCircle;
+        settingCircle.addEllipse(width() / 2 + side / 2 - 40, height() / 2 + side / \
2 - 40, 40, 40); +        if (settingCircle.contains(point)) {                
+            KisPaintOpPresetResourceServer* rServer = \
KisResourceServerProvider::instance()->paintOpPresetServer(); +            \
QStringList tags = rServer->tagNamesList(); +            qSort(tags);
+
+            if (!tags.isEmpty()) {
+                QMenu menu;
+                Q_FOREACH (const QString& tag, tags) {
+                    menu.addAction(tag);
+                }
+                QAction* action = menu.exec(event->globalPos());
+                if (action) {
+                    m_resourceManager->setCurrentTag(action->text());
                 }
+            } else {
+                QWhatsThis::showText(event->globalPos(), 
+                                        i18n("There are no tags available to show in \
this popup. To add presets, you need to tag them and then select the tag here."));  }
         }
     }
@@ -489,16 +485,14 @@ void KisPopupPalette::mouseReleaseEvent(QMouseEvent * event)
     event->accept();
 
     if (event->button() == Qt::LeftButton || event->button() == Qt::RightButton) {
-        QPainterPath pathBrush(drawDonutPathFull(width() / 2, height() / 2, \
                brushInnerRadius, brushOuterRadius));
         QPainterPath pathColor(drawDonutPathFull(width() / 2, height() / 2, \
colorInnerRadius, colorOuterRadius));  
-        if (pathBrush.contains(point)) {
-            //in favorite brushes area
-            if (hoveredPreset() > -1) {
-                //setSelectedBrush(hoveredBrush());
-                emit sigChangeActivePaintop(hoveredPreset());
-            }
-        } else if (pathColor.contains(point)) {
+        //in favorite brushes area
+        if (hoveredPreset() > -1) {
+            //setSelectedBrush(hoveredBrush());
+            emit sigChangeActivePaintop(hoveredPreset());
+        }
+        if (pathColor.contains(point)) {
             int pos = calculateIndex(point, m_resourceManager->recentColorsTotal());
 
             if (pos >= 0 && pos < m_resourceManager->recentColorsTotal()) {
@@ -542,38 +536,28 @@ KisPopupPalette::~KisPopupPalette()
 
 QPainterPath KisPopupPalette::pathFromPresetIndex(int index)
 {
-    QRect outerRect(-width() / 2, -height() / 2, width(), height());
-    outerRect.adjust(3, 3, -3, -3);
-    int ringSize = brushOuterRadius - colorOuterRadius - 6;
-    QRect innerRect = outerRect.adjusted(ringSize, ringSize, -ringSize, -ringSize);
-
-    qreal angleLength = 360.0 / numSlots();
+    qreal angleLength = 360.0 / numSlots() / 180 * M_PI;
     qreal angle = index * angleLength;
 
+    qreal r = colorOuterRadius * sin(angleLength/2) / ( 1 - sin(angleLength/2));
+    
     QPainterPath path;
-    path.moveTo(brushOuterRadius * cos(angle / 180 * M_PI), -brushOuterRadius * \
                sin(angle / 180 * M_PI));
-    path.arcTo(outerRect, angle, angleLength);
-    path.arcTo(innerRect, angle + angleLength, -angleLength);
+    path.addEllipse((colorOuterRadius+r) * cos(angle)-r, -(colorOuterRadius+r) * \
sin(angle)-r, 2*r, 2*r);  path.closeSubpath();
     return path;
 }
 
 int KisPopupPalette::calculatePresetIndex(QPointF point, int /*n*/)
 {
-    int x = point.x() - width() / 2;
-    int y = point.y() - height() / 2;
-
-    qreal radius = sqrt((qreal) x * x + y * y);
-
-    qreal angle;
-    // y coordinate is the reverse of the cartesian one
-    if (y < 0) {
-        angle = acos(x / radius);
-    } else {
-        angle = 2 * M_PI - acos(x / radius);
+    for(int i = 0; i < numSlots(); i++)
+    {
+        QPointF adujustedPoint = point - QPointF(width()/2, height()/2);
+        if(pathFromPresetIndex(i).contains(adujustedPoint))
+        {
+            return i;
+        }
     }
-    int pos = floor(angle / (2 * M_PI / numSlots()));
-    return pos;
+    return -1;
 }
 
 int KisPopupPalette::numSlots()


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

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