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

List:       kde-commits
Subject:    [calligra] krita: Fix the checkbox behavior of the composite op
From:       Silvio Heinrich <plassy () web ! de>
Date:       2011-09-14 13:42:15
Message-ID: 20110914134215.1E379A607A () git ! kde ! org
[Download RAW message or body]

Git commit 8d7c720adfed69ec93b8440b8d1448397910af53 by Silvio Heinrich.
Committed on 14/09/2011 at 15:40.
Pushed by heinrich into branch 'master'.

Fix the checkbox behavior of the composite op combobox.

M  +1    -1    krita/plugins/paintops/libpaintop/kis_paintop_options_widget.cpp
M  +33   -22   krita/ui/kis_categorized_item_delegate.cpp
M  +4    -5    krita/ui/kis_categorized_item_delegate.h
M  +2    -0    krita/ui/kis_categorized_list_model.h
M  +21   -3    krita/ui/widgets/kis_categorized_list_view.cpp
M  +6    -1    krita/ui/widgets/kis_categorized_list_view.h
M  +20   -3    krita/ui/widgets/kis_cmb_composite.cc
M  +4    -0    krita/ui/widgets/kis_cmb_composite.h
M  +1    -1    krita/ui/widgets/kis_paintop_list_widget.cpp

http://commits.kde.org/calligra/8d7c720adfed69ec93b8440b8d1448397910af53

diff --git a/krita/plugins/paintops/libpaintop/kis_paintop_options_widget.cpp \
b/krita/plugins/paintops/libpaintop/kis_paintop_options_widget.cpp index \
                a15543b..5c18451 100644
--- a/krita/plugins/paintops/libpaintop/kis_paintop_options_widget.cpp
+++ b/krita/plugins/paintops/libpaintop/kis_paintop_options_widget.cpp
@@ -47,7 +47,7 @@ KisPaintOpOptionsWidget::KisPaintOpOptionsWidget(QWidget * parent)
     setObjectName("KisPaintOpPresetsWidget");
     
     m_d->model       = new KisPaintOpOptionListModel();
-    m_d->delegate    = new KisCategorizedItemDelegate(m_d->model, false);
+    m_d->delegate    = new KisCategorizedItemDelegate(false);
     m_d->optionsList = new KisCategorizedListView();
     m_d->optionsList->setModel(m_d->model);
     m_d->optionsList->setItemDelegate(m_d->delegate);
diff --git a/krita/ui/kis_categorized_item_delegate.cpp \
b/krita/ui/kis_categorized_item_delegate.cpp index f1185b1..764acd4 100644
--- a/krita/ui/kis_categorized_item_delegate.cpp
+++ b/krita/ui/kis_categorized_item_delegate.cpp
@@ -19,37 +19,48 @@
 
 #include "kis_categorized_item_delegate.h"
 #include "kis_categorized_list_model.h"
+
+// #include <kicon.h>
+// #include <kstandardguiitem.h>
+
 #include <QPainter>
+#include <QStyle>
+#include <QStyleOptionMenuItem>
+#include <QApplication>
 
-KisCategorizedItemDelegate::KisCategorizedItemDelegate(QAbstractListModel* model, \
                bool indicateError):
-    m_model(model),
+KisCategorizedItemDelegate::KisCategorizedItemDelegate(bool indicateError):
     m_indicateError(indicateError),
     m_minimumItemHeight(0)
 {
+//     m_errorIcon = \
KStandardGuiItem::cancel().icon();//KIcon("dialog-warning");//QIcon::fromTheme("dialog-warning");
  m_errorIcon = QIcon::fromTheme("dialog-warning");
 }
 
 void KisCategorizedItemDelegate::paint(QPainter* painter, const \
QStyleOptionViewItem& option, const QModelIndex& index) const  {
-    qint32 border = 0;//4;
-    qint32 xpos   = border + option.rect.x() + option.rect.height();
-    qint32 ypos   = option.rect.y();
-    qint32 size   = option.rect.height();
-    QRect  rect(xpos, ypos, option.rect.width()-xpos, option.rect.height());
-    
     painter->resetTransform();
     
-    if(!m_model->data(index, IsHeaderRole).toBool()) {
-// 		QStyledItemDelegate::paint(painter, option, index);
-        QStyleOptionViewItem sovi = option;
-        
-        if(m_indicateError)
-            sovi.rect = rect;
-        
-        QStyledItemDelegate::paint(painter, sovi, index);
-        
-        if(m_indicateError && !(m_model->flags(index) & Qt::ItemIsEnabled))
-            m_errorIcon.paint(painter, 0, ypos, size, size, Qt::AlignCenter, \
QIcon::Normal, QIcon::On); +    if(!index.data(IsHeaderRole).toBool()) {
+		if(m_indicateError) {
+			QStyleOptionMenuItem item;
+			item.text        = index.data().toString();
+			item.rect        = option.rect;
+			item.font        = option.font;
+			item.state       = option.state;
+			item.palette     = option.palette;
+			item.fontMetrics = option.fontMetrics;
+			
+			if(!(index.flags() & Qt::ItemIsEnabled))
+				item.icon = m_errorIcon;
+			
+			if(index.flags() & Qt::ItemIsUserCheckable) {
+				item.checked   = (index.data(Qt::CheckStateRole).toInt() == Qt::Checked);
+				item.checkType = QStyleOptionMenuItem::NonExclusive;
+			}
+			
+			QApplication::style()->drawControl(QStyle::CE_MenuItem, &item, painter);
+		}
+		else QStyledItemDelegate::paint(painter, option, index);
     }
     else {
         if(option.state & QStyle::State_MouseOver)
@@ -57,14 +68,14 @@ void KisCategorizedItemDelegate::paint(QPainter* painter, const \
QStyleOptionView  else
             painter->fillRect(option.rect, Qt::lightGray);
         
-        painter->drawText(option.rect, m_model->data(index).toString(), \
QTextOption(Qt::AlignVCenter|Qt::AlignHCenter)); +        \
painter->drawText(option.rect, index.data().toString(), \
QTextOption(Qt::AlignVCenter|Qt::AlignHCenter));  
         paintTriangle(
             painter,
             option.rect.x(),
             option.rect.y(),
-            size,
-            !m_model->data(index, ExpandCategoryRole).toBool()
+            option.rect.height(),
+            !index.data(ExpandCategoryRole).toBool()
         );
     }
     
diff --git a/krita/ui/kis_categorized_item_delegate.h \
b/krita/ui/kis_categorized_item_delegate.h index f4efecf..c3bb2b9 100644
--- a/krita/ui/kis_categorized_item_delegate.h
+++ b/krita/ui/kis_categorized_item_delegate.h
@@ -30,7 +30,7 @@
 class KRITAUI_EXPORT KisCategorizedItemDelegate: public QStyledItemDelegate
 {
 public:
-    KisCategorizedItemDelegate(QAbstractListModel* model, bool indicateError);
+    KisCategorizedItemDelegate(bool indicateError);
     virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const \
                QModelIndex& index) const;
     virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& \
index) const;  
@@ -38,10 +38,9 @@ private:
     void paintTriangle(QPainter* painter, qint32 x, qint32 y, qint32 size, bool \
rotate) const;  
 private:
-    QAbstractListModel* m_model;
-    QIcon               m_errorIcon;
-    bool                m_indicateError;
-    mutable qint32      m_minimumItemHeight;
+    QIcon          m_errorIcon;
+    bool           m_indicateError;
+    mutable qint32 m_minimumItemHeight;
 };
 
 #endif // _KIS_CATEGORIZED_ITEM_DELEGATE_H_
diff --git a/krita/ui/kis_categorized_list_model.h \
b/krita/ui/kis_categorized_list_model.h index 3b125a2..fbd15c8 100644
--- a/krita/ui/kis_categorized_list_model.h
+++ b/krita/ui/kis_categorized_list_model.h
@@ -312,6 +312,7 @@ public:
         if(isHeader(index)) {
             switch(role)
             {
+			case Qt::ToolTipRole:
             case Qt::DisplayRole:
                 return categoryToString(m_categories[index.first].data);
             case IsHeaderRole:
@@ -321,6 +322,7 @@ public:
         else {
             switch(role)
             {
+			case Qt::ToolTipRole:
             case Qt::DisplayRole:
                 return \
entryToString(m_categories[index.first].entries[index.second].data);  case \
                IsHeaderRole:
diff --git a/krita/ui/widgets/kis_categorized_list_view.cpp \
b/krita/ui/widgets/kis_categorized_list_view.cpp index aacc58d..730acf5 100644
--- a/krita/ui/widgets/kis_categorized_list_view.cpp
+++ b/krita/ui/widgets/kis_categorized_list_view.cpp
@@ -18,6 +18,7 @@
 
 #include "kis_categorized_list_view.h"
 #include "../kis_categorized_list_model.h"
+#include <QMouseEvent>
 
 KisCategorizedListView::KisCategorizedListView(QWidget* parent):
     QListView(parent)
@@ -61,6 +62,23 @@ void KisCategorizedListView::rowsInserted(const QModelIndex& \
parent, int start,  QListView::rowsInserted(parent, start, end);
 	updateRows(0, model()->rowCount());
 }
-// void KisCategorizedListView::mousePressEvent(QMouseEvent* event)
-// {
-// }
+
+void KisCategorizedListView::mousePressEvent(QMouseEvent* event)
+{
+	QModelIndex index = QListView::indexAt(event->pos());
+	
+    if(index.isValid() && (event->pos().x() < 25) && (model()->flags(index) & \
Qt::ItemIsUserCheckable)) { +		int role = model()->data(index, \
Qt::CheckStateRole).toInt(); +		
+		if(role == Qt::Checked) { model()->setData(index, Qt::Unchecked, \
Qt::CheckStateRole); } +		else                    { model()->setData(index, \
Qt::Checked  , Qt::CheckStateRole); } +		
+		emit sigEntryChecked(index);
+	}
+	else QListView::mousePressEvent(event);
+}
+
+void KisCategorizedListView::mouseReleaseEvent(QMouseEvent* event)
+{
+	QListView::mouseReleaseEvent(event);
+}
\ No newline at end of file
diff --git a/krita/ui/widgets/kis_categorized_list_view.h \
b/krita/ui/widgets/kis_categorized_list_view.h index 9bd8ed8..dd9e9c2 100644
--- a/krita/ui/widgets/kis_categorized_list_view.h
+++ b/krita/ui/widgets/kis_categorized_list_view.h
@@ -35,12 +35,17 @@ public:
     
 signals:
     void sigCategoryToggled(const QModelIndex& index, bool toggled);
+    void sigEntryChecked(const QModelIndex& index);
     
 protected slots:
     void slotIndexChanged(const QModelIndex& index);
     virtual void dataChanged(const QModelIndex& topLeft, const QModelIndex& \
bottomRight);  virtual void rowsInserted(const QModelIndex& parent, int start, int \
                end);
-// 	virtual void mousePressEvent(QMouseEvent* event);
+	virtual void mousePressEvent(QMouseEvent* event);
+	virtual void mouseReleaseEvent(QMouseEvent* event);
+	
+private:
+	bool m_EntryWasChecked;
 };
 
 
diff --git a/krita/ui/widgets/kis_cmb_composite.cc \
b/krita/ui/widgets/kis_cmb_composite.cc index 4be0b7d..34d4cdd 100644
--- a/krita/ui/widgets/kis_cmb_composite.cc
+++ b/krita/ui/widgets/kis_cmb_composite.cc
@@ -25,6 +25,8 @@
 #include "kis_categorized_list_model.h"
 #include "../kis_categorized_item_delegate.h"
 
+#include <QMouseEvent>
+
 //////////////////////////////////////////////////////////////////////////////////////////
  // ---- KisCompositeOpListWidget \
------------------------------------------------------ //  
@@ -32,7 +34,7 @@ KisCompositeOpListWidget::KisCompositeOpListWidget(QWidget* \
parent):  KisCategorizedListView(parent)
 {
     m_model    = KisCompositeOpListModel::sharedInstance();
-    m_delegate = new KisCategorizedItemDelegate(m_model, true);
+    m_delegate = new KisCategorizedItemDelegate(true);
     
     setModel(m_model);
     setItemDelegate(m_delegate);
@@ -49,11 +51,11 @@ KisCompositeOpListWidget::~KisCompositeOpListWidget()
 // ---- KisCompositeOpComboBox \
-------------------------------------------------------- //  
 KisCompositeOpComboBox::KisCompositeOpComboBox(QWidget* parent):
-    QComboBox(parent)
+    QComboBox(parent), m_allowToHidePopup(true)
 {
     m_model    = KisCompositeOpListModel::sharedInstance();
     m_view     = new KisCategorizedListView();
-    m_delegate = new KisCategorizedItemDelegate(m_model, true);
+    m_delegate = new KisCategorizedItemDelegate(true);
     
     setMaxVisibleItems(100);
     setSizeAdjustPolicy(AdjustToContents);
@@ -64,6 +66,7 @@ KisCompositeOpComboBox::KisCompositeOpComboBox(QWidget* parent):
     setItemDelegate(m_delegate);
     
     connect(m_view, SIGNAL(sigCategoryToggled(const QModelIndex&, bool)), \
SLOT(slotCategoryToggled(const QModelIndex&, bool))); +    connect(m_view, \
SIGNAL(sigEntryChecked(const QModelIndex&))         , SLOT(slotEntryChecked(const \
QModelIndex&)));  }
 
 KisCompositeOpComboBox::~KisCompositeOpComboBox()
@@ -84,3 +87,17 @@ void KisCompositeOpComboBox::slotCategoryToggled(const \
QModelIndex& index, bool  //      Thre is nothing written about this in the docs.
     showPopup();
 }
+
+void KisCompositeOpComboBox::slotEntryChecked(const QModelIndex& index)
+{
+    Q_UNUSED(index);
+    m_allowToHidePopup = false;
+}
+
+void KisCompositeOpComboBox::hidePopup()
+{
+    if(m_allowToHidePopup) { QComboBox::hidePopup(); }
+    else                   { QComboBox::showPopup(); }
+    
+    m_allowToHidePopup = true;
+}
diff --git a/krita/ui/widgets/kis_cmb_composite.h \
b/krita/ui/widgets/kis_cmb_composite.h index d18e69b..4df0d1f 100644
--- a/krita/ui/widgets/kis_cmb_composite.h
+++ b/krita/ui/widgets/kis_cmb_composite.h
@@ -44,11 +44,15 @@ public:
      KisCompositeOpComboBox(QWidget* parent=0);
     ~KisCompositeOpComboBox();
     
+    virtual void hidePopup();
+    
 private slots:
     void slotCategoryToggled(const QModelIndex& index, bool toggled);
+    void slotEntryChecked(const QModelIndex& index);
     
 private:
     KisCategorizedListView* m_view;
+    bool                    m_allowToHidePopup;
 };
 
 #endif // KIS_COMPOSITEOP_WIDGETS_H_
diff --git a/krita/ui/widgets/kis_paintop_list_widget.cpp \
b/krita/ui/widgets/kis_paintop_list_widget.cpp index f09ec06..4d4d3f5 100644
--- a/krita/ui/widgets/kis_paintop_list_widget.cpp
+++ b/krita/ui/widgets/kis_paintop_list_widget.cpp
@@ -33,7 +33,7 @@ KisPaintOpListWidget::KisPaintOpListWidget(QWidget* parent, const \
                char* name):
     connect(this, SIGNAL(activated(QModelIndex)), this, \
SLOT(slotOpActivated(QModelIndex)));  
     m_model    = new KisPaintOpListModel();
-    m_delegate = new KisCategorizedItemDelegate(m_model, false);
+    m_delegate = new KisCategorizedItemDelegate(false);
     setModel(m_model);
     setItemDelegate(m_delegate);
 }


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

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