Browse Source

Gray out checkbox, send signal on state modification

Miklos Espak 13 years ago
parent
commit
5e39573558

+ 11 - 7
Libs/Widgets/Testing/Cpp/ctkCheckablePushButtonTest1.cpp

@@ -101,16 +101,20 @@ int ctkCheckablePushButtonTest1(int argc, char * argv [] )
   button7.setButtonTextAlignment(Qt::AlignCenter);
   button7.setIndicatorAlignment(Qt::AlignLeft);
   
-  button8.setCheckBoxFlags(Qt::ItemIsEnabled);
+  button8.setCheckBoxFlags(button8.checkBoxFlags() | Qt::ItemIsEnabled);
+  button8.setCheckBoxFlags(button8.checkBoxFlags() & ~Qt::ItemIsUserCheckable);
   button8.setCheckState(Qt::Checked);
-  button9.setCheckBoxFlags(Qt::ItemIsEnabled);
+  button9.setCheckBoxFlags(button9.checkBoxFlags() | Qt::ItemIsEnabled);
+  button9.setCheckBoxFlags(button9.checkBoxFlags() & ~Qt::ItemIsUserCheckable);
   button9.setCheckState(Qt::Unchecked);
-  button10.setCheckBoxFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable);
-  button11.setCheckBoxFlags(Qt::ItemIsEnabled |
-      Qt::ItemIsUserCheckable | Qt::ItemIsTristate);
-  button12.setCheckBoxFlags(Qt::ItemIsEnabled);
+  button10.setCheckBoxFlags(button10.checkBoxFlags() | Qt::ItemIsEnabled);
+  button11.setCheckBoxFlags(button11.checkBoxFlags() | Qt::ItemIsEnabled);
+  button11.setCheckBoxFlags(button11.checkBoxFlags() | Qt::ItemIsTristate);
+  button11.setCheckState(Qt::PartiallyChecked);
+  button12.setCheckBoxFlags(button12.checkBoxFlags() | Qt::ItemIsEnabled);
+  button12.setCheckBoxFlags(button12.checkBoxFlags() & ~Qt::ItemIsUserCheckable);
   button12.setCheckable(true);
-  button13.setCheckBoxFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable);
+  button13.setCheckBoxFlags(button13.checkBoxFlags() | Qt::ItemIsEnabled);
   button13.setCheckable(true);
 
   if (argc < 2 || QString(argv[1]) != "-I" )

+ 19 - 13
Libs/Widgets/ctkCheckablePushButton.cpp

@@ -63,7 +63,7 @@ ctkCheckablePushButtonPrivate::ctkCheckablePushButtonPrivate(ctkCheckablePushBut
 {
   this->TextAlignment = Qt::AlignLeft | Qt::AlignVCenter;
   this->IndicatorAlignment = Qt::AlignLeft | Qt::AlignVCenter;
-  this->CheckBoxFlags = Qt::NoItemFlags;
+  this->CheckBoxFlags = Qt::ItemIsUserCheckable;
   this->CheckState = Qt::Unchecked;
 }
 
@@ -225,8 +225,15 @@ Qt::Alignment ctkCheckablePushButton::indicatorAlignment()const
 void ctkCheckablePushButton::setCheckState(Qt::CheckState checkState)
 {
   Q_D(ctkCheckablePushButton);
-  d->CheckState = checkState;
-  this->update();
+  Qt::CheckState oldCheckState = d->CheckState;
+  if (checkState != oldCheckState &&
+      (checkState != Qt::PartiallyChecked ||
+       (d->CheckBoxFlags & Qt::ItemIsTristate)))
+    {
+    d->CheckState = checkState;
+    this->update();
+    emit checkStateChanged(checkState);
+    }
 }
 
 //-----------------------------------------------------------------------------
@@ -237,7 +244,7 @@ Qt::CheckState ctkCheckablePushButton::checkState()const
 }
 
 //-----------------------------------------------------------------------------
-void ctkCheckablePushButton::setCheckBoxFlags(Qt::ItemFlags checkBoxFlags)
+void ctkCheckablePushButton::setCheckBoxFlags(const Qt::ItemFlags& checkBoxFlags)
 {
   Q_D(ctkCheckablePushButton);
   d->CheckBoxFlags = checkBoxFlags;
@@ -245,7 +252,7 @@ void ctkCheckablePushButton::setCheckBoxFlags(Qt::ItemFlags checkBoxFlags)
 }
 
 //-----------------------------------------------------------------------------
-Qt::ItemFlags ctkCheckablePushButton::checkBoxFlags()const
+const Qt::ItemFlags& ctkCheckablePushButton::checkBoxFlags()const
 {
   Q_D(const ctkCheckablePushButton);
   return d->CheckBoxFlags;
@@ -301,7 +308,7 @@ void ctkCheckablePushButton::paintEvent(QPaintEvent * _event)
   // Draw Indicator
   QStyleOption indicatorOpt;
   indicatorOpt.init(this);
-  if (d->CheckBoxFlags == Qt::NoItemFlags)
+  if (!(d->CheckBoxFlags & Qt::ItemIsEnabled))
     {
     if (this->isCheckable())
       {
@@ -312,8 +319,12 @@ void ctkCheckablePushButton::paintEvent(QPaintEvent * _event)
       indicatorOpt.state |= QStyle::State_Off;
       }
     }
-  else if (d->CheckBoxFlags & Qt::ItemIsEnabled)
+  else
     {
+    if (!(d->CheckBoxFlags & Qt::ItemIsUserCheckable))
+      {
+      indicatorOpt.state &= ~QStyle::State_Enabled;
+      }
     if (d->CheckState == Qt::Checked)
       {
       indicatorOpt.state |= QStyle::State_On;
@@ -403,7 +414,7 @@ void ctkCheckablePushButton::mousePressEvent(QMouseEvent *e)
   if (d->checkboxRect().contains(e->pos()))
     {
     Qt::ItemFlags cbf = d->CheckBoxFlags;
-    if (cbf == Qt::NoItemFlags)
+    if (!(cbf & Qt::ItemIsEnabled))
       {
       //check the checkbox
       this->setCheckable(!this->isCheckable());
@@ -413,11 +424,6 @@ void ctkCheckablePushButton::mousePressEvent(QMouseEvent *e)
       switch (d->CheckState)
         {
         case Qt::Unchecked:
-          d->CheckState =
-              d->CheckBoxFlags & Qt::ItemIsTristate
-              ? Qt::PartiallyChecked
-              : Qt::Checked;
-          break;
         case Qt::PartiallyChecked:
           d->CheckState = Qt::Checked;
           break;

+ 6 - 4
Libs/Widgets/ctkCheckablePushButton.h

@@ -40,14 +40,13 @@ class ctkCheckablePushButtonPrivate;
 /// independently from the containing button. (It will not control the checkable
 /// property of the button.) The following flags are supported:
 /// Qt::ItemIsEnabled, Qt::ItemIsUserCheckable, Qt::ItemIsTriState.
-/// In default, no flags are set (Qt::NoItemFlags) that means the original behavior.
 class CTK_WIDGETS_EXPORT ctkCheckablePushButton : public QPushButton
 {
   Q_OBJECT
   Q_PROPERTY(Qt::Alignment buttonTextAlignment READ buttonTextAlignment WRITE setButtonTextAlignment)
   Q_PROPERTY(Qt::Alignment indicatorAlignment READ indicatorAlignment WRITE setIndicatorAlignment)
   Q_PROPERTY(Qt::ItemFlags checkBoxFlags READ checkBoxFlags WRITE setCheckBoxFlags)
-  Q_PROPERTY(Qt::CheckState checkState READ checkState WRITE setCheckState)
+  Q_PROPERTY(Qt::CheckState checkState READ checkState WRITE setCheckState NOTIFY checkStateChanged)
 
 public:
   ctkCheckablePushButton(QWidget *parent = 0);
@@ -69,12 +68,15 @@ public:
   virtual QSize minimumSizeHint()const;
   virtual QSize sizeHint()const;
 
-  virtual Qt::ItemFlags checkBoxFlags()const;
-  virtual void setCheckBoxFlags(Qt::ItemFlags checkBoxFlags);
+  virtual const Qt::ItemFlags& checkBoxFlags()const;
+  virtual void setCheckBoxFlags(const Qt::ItemFlags& checkBoxFlags);
 
   virtual Qt::CheckState checkState()const;
   virtual void setCheckState(Qt::CheckState checkState);
 
+signals:
+  void checkStateChanged(Qt::CheckState newCheckState);
+
 protected:
   /// Reimplemented for internal reasons
   virtual void paintEvent(QPaintEvent*);