[Digikam-devel] extragear/graphics/digikam/digikam

Gilles Caulier caulier.gilles at gmail.com
Thu Jul 26 13:05:30 BST 2007


SVN commit 692835 by cgilles:

digiKam from trunk (KDE4) : Rating Pop-up menu is now fully suitable using pure QT4 port.

Marcel : still a little side effect about background color used to paint regular star pixamp on menu items.
I have used Qt:transparent color or palette().color(QPalette::Active, QPalette::Background) without success. 
Sound like QMenu play with the background color somewhere...

Screenshot : http://digikam3rdparty.free.fr/Screenshots/digikamKDE4_04.png

CCMAIL: digikam-devel at kde.org
CCMAIL: marcel.wiesweg at gmx.de



 M  +115 -37   ratingpopupmenu.cpp  
 M  +3 -1      ratingpopupmenu.h  


--- trunk/extragear/graphics/digikam/digikam/ratingpopupmenu.cpp #692834:692835
@@ -29,6 +29,11 @@
 #include <QPolygon>
 #include <QWidgetAction>
 #include <QLabel>
+#include <QMouseEvent>
+#include <QSize>
+#include <QPaintEvent>
+#include <QEvent>
+#include <QObject>
 
 // KDE includes.
 
@@ -45,50 +50,102 @@
 namespace Digikam
 {
 
-RatingPopupMenu::RatingPopupMenu(QWidget* parent)
-               : QMenu(parent)
+class RatingMenuItem : public QWidget
 {
-    QPolygon starPolygon;
 
-    // Pre-computed star polygon for a 15x15 pixmap.
-    starPolygon << QPoint(0,  6);
-    starPolygon << QPoint(5,  5);
-    starPolygon << QPoint(7,  0);
-    starPolygon << QPoint(9,  5);
-    starPolygon << QPoint(14, 6);
-    starPolygon << QPoint(10, 9);
-    starPolygon << QPoint(11, 14);
-    starPolygon << QPoint(7,  11);
-    starPolygon << QPoint(3,  14);
-    starPolygon << QPoint(4,  9);
+  public:
 
-    QPixmap starPix(15, 15);
-    starPix.fill(Qt::transparent);
-    QPainter p1(&starPix);
-    p1.setRenderHint(QPainter::Antialiasing, true);
-    p1.setBrush(ThemeEngine::componentData()->textSpecialRegColor());
-    p1.setPen(palette().color(QPalette::Active, QPalette::Foreground));
-    p1.drawPolygon(starPolygon, Qt::WindingFill);
-    p1.end();
-
-    for (int i = 0 ; i <= RatingMax ; i++)
+    RatingMenuItem(int star, QWidget *parent=0) : QWidget(parent)        
     {
-        QPixmap pix(starPix.width() * i, starPix.height());
-        pix.fill(Qt::transparent);
+        m_hightlighted = false;
+        m_star         = star;
 
-        QPainter p2(&pix);
-        p2.drawTiledPixmap(0, 0, i*starPix.width(), pix.height(), starPix);
+        QPolygon starPolygon;
+    
+        // Pre-computed star polygon for a 15x15 pixmap.
+        starPolygon << QPoint(0,  6);
+        starPolygon << QPoint(5,  5);
+        starPolygon << QPoint(7,  0);
+        starPolygon << QPoint(9,  5);
+        starPolygon << QPoint(14, 6);
+        starPolygon << QPoint(10, 9);
+        starPolygon << QPoint(11, 14);
+        starPolygon << QPoint(7,  11);
+        starPolygon << QPoint(3,  14);
+        starPolygon << QPoint(4,  9);
+    
+        // Template of one star.
+        QPixmap starPix(15, 15);
+        starPix.fill(Qt::transparent);
+        QPainter p1(&starPix);
+        p1.setRenderHint(QPainter::Antialiasing, true);
+        p1.setBrush(ThemeEngine::componentData()->textSpecialRegColor());
+        p1.setPen(palette().color(QPalette::Active, QPalette::Foreground));
+        p1.drawPolygon(starPolygon, Qt::WindingFill);
+        p1.end();
+
+        // Set widget properties.
+        setMouseTracking(true);
+        setAttribute(Qt::WA_DeleteOnClose);
+        setFixedSize(QSize(4 + starPix.width()*RatingMax, starPix.height()+4));
+
+        // Regular rating pixmap of m_star.
+        m_ratingPixReg = QPixmap(contentsRect().size());
+        m_ratingPixReg.fill(Qt::transparent);
+        QPainter p2(&m_ratingPixReg);
+        p2.drawTiledPixmap(2, 2, m_star*starPix.width(), starPix.height(), starPix);
         p2.end();
 
-        QWidgetAction *action = new QWidgetAction(this);
-        QLabel *label         = new QLabel();
-        if (i < 1) label->setText(i18n("None"));
-        else label->setPixmap(pix);
-        action->setDefaultWidget(label);
-        action->setData(i);
-        connect(action, SIGNAL(triggered()), this, SLOT(slotRatingTriggered()));
-        addAction(action);
+        // Selected rating pixmap of m_star.
+        m_ratingPixSel = QPixmap(contentsRect().size());
+        m_ratingPixSel.fill(palette().color(QPalette::Active, QPalette::Highlight));
+        QPainter p3(&m_ratingPixSel);
+        p3.drawTiledPixmap(2, 2, m_star*starPix.width(), starPix.height(), starPix);
+        p3.end();
     }
+
+    void setHightLighted(bool h)
+    {   
+        m_hightlighted = h;
+        update();
+    }
+
+  private:
+
+    void paintEvent(QPaintEvent *)
+    {
+        QPainter p(this);
+        p.drawPixmap(contentsRect(), m_hightlighted ? m_ratingPixSel : m_ratingPixReg);
+        p.end();
+    }
+
+  private:
+
+    bool     m_hightlighted;
+    int      m_star;
+
+    QPixmap  m_ratingPixReg;
+    QPixmap  m_ratingPixSel;
+};
+
+RatingPopupMenu::RatingPopupMenu(QWidget* parent)
+               : QMenu(parent)
+{
+    QAction *action = addAction(i18n("None"), this, SLOT(slotRatingTriggered()));
+    action->setData(0);
+
+    for (int i = 1 ; i <= RatingMax ; i++)
+    {
+        QWidgetAction *action2 = new QWidgetAction(this);
+        RatingMenuItem *item   = new RatingMenuItem(i);
+        action2->setDefaultWidget(item);
+        action2->setData(i);
+        connect(action2, SIGNAL(triggered()), this, SLOT(slotRatingTriggered()));
+        addAction(action2);
+    }
+
+    connect(this, SIGNAL(hovered(QAction *)), 
+            this, SLOT(slotHovered(QAction *)));
 }
 
 RatingPopupMenu::~RatingPopupMenu()
@@ -97,8 +154,29 @@
 
 void RatingPopupMenu::slotRatingTriggered()
 {
-    int r = qobject_cast<QWidgetAction*>(sender())->data().toInt();
+    int r = qobject_cast<QAction*>(sender())->data().toInt();
     emit signalRatingChanged(r);
 }
 
+void RatingPopupMenu::slotHovered(QAction *current)
+{
+    QList<QAction*> list = actions();
+    foreach(QAction *action, list)
+    {
+        if (action->data().toInt() > 0)
+        {
+            QWidget *w         = qobject_cast<QWidgetAction*>(action)->defaultWidget();
+            RatingMenuItem *mi = dynamic_cast<RatingMenuItem*>(w);
+            mi->setHightLighted(false);
+        }
+    }
+
+    if (current->data().toInt() > 0)
+    {
+        QWidget *w         = qobject_cast<QWidgetAction*>(current)->defaultWidget();
+        RatingMenuItem *mi = dynamic_cast<RatingMenuItem*>(w);
+        mi->setHightLighted(true);
+    }
+}
+
 }  // namespace Digikam
--- trunk/extragear/graphics/digikam/digikam/ratingpopupmenu.h #692834:692835
@@ -28,10 +28,11 @@
 
 #include <QMenu>
 
+class QAction;
+
 namespace Digikam
 {
 
-
 class RatingPopupMenu : public QMenu
 {
     Q_OBJECT
@@ -48,6 +49,7 @@
 private slots:
 
     void slotRatingTriggered();
+    void slotHovered(QAction *);
 };
 
 }  // namespace Digikam



More information about the Digikam-devel mailing list