Browse Source

Flags controlled by bool parameters.

Miklos Espak 13 years ago
parent
commit
75c575cd1c

+ 19 - 16
Libs/Widgets/Testing/Cpp/ctkCheckablePushButtonTest1.cpp

@@ -45,12 +45,12 @@ int ctkCheckablePushButtonTest1(int argc, char * argv [] )
   ctkCheckablePushButton button5(QObject::tr("Button5"));
   ctkCheckablePushButton button6(QObject::tr("Button6"));
   ctkCheckablePushButton button7(QObject::tr("Checkable PushButton"));
-  ctkCheckablePushButton button8(QObject::tr("Checkbox Not User Checkable (On)"));
-  ctkCheckablePushButton button9(QObject::tr("CheckBox Not User Checkable (Off)"));
-  ctkCheckablePushButton button10(QObject::tr("User Checkable Bi-state"));
-  ctkCheckablePushButton button11(QObject::tr("User Checkable Tri-state"));
+  ctkCheckablePushButton button8(QObject::tr("Connected, Not User Checkable"));
+  ctkCheckablePushButton button9(QObject::tr("Connected, Not User Checkable"));
+  ctkCheckablePushButton button10(QObject::tr("Not Connected, User Checkable"));
+  ctkCheckablePushButton button11(QObject::tr("Not Connected, User Checkable"));
   ctkCheckablePushButton button12(QObject::tr("Checkbox Not User Checkable\nButton Checkable"));
-  ctkCheckablePushButton button13(QObject::tr("Checkbox and Buttun User Checkable"));
+  ctkCheckablePushButton button13(QObject::tr("Checkbox and Button User Checkable"));
 
   QVBoxLayout *layout= new QVBoxLayout;
   layout->addWidget(&button1);
@@ -101,25 +101,28 @@ int ctkCheckablePushButtonTest1(int argc, char * argv [] )
   button7.setButtonTextAlignment(Qt::AlignCenter);
   button7.setIndicatorAlignment(Qt::AlignLeft);
   
-  button8.setCheckBoxFlags(button8.checkBoxFlags() | Qt::ItemIsEnabled);
-  button8.setCheckBoxFlags(button8.checkBoxFlags() & ~Qt::ItemIsUserCheckable);
+  // Connected to button, not user checkable:
+  button8.setCheckBoxUserCheckable(false);
   button8.setCheckState(Qt::Checked);
-  button9.setCheckBoxFlags(button9.checkBoxFlags() | Qt::ItemIsEnabled);
-  button9.setCheckBoxFlags(button9.checkBoxFlags() & ~Qt::ItemIsUserCheckable);
+  button9.setCheckBoxUserCheckable(false);
   button9.setCheckState(Qt::Unchecked);
-  button10.setCheckBoxFlags(button10.checkBoxFlags() | Qt::ItemIsEnabled);
-  button11.setCheckBoxFlags(button11.checkBoxFlags() | Qt::ItemIsEnabled);
-  button11.setCheckBoxFlags(button11.checkBoxFlags() | Qt::ItemIsTristate);
+
+  // Not connected to button, user checkable:
+  button10.setCheckBoxControlsButton(false);
+  button10.setCheckState(Qt::Checked);
+  button11.setCheckBoxControlsButton(false);
   button11.setCheckState(Qt::PartiallyChecked);
-  button12.setCheckBoxFlags(button12.checkBoxFlags() | Qt::ItemIsEnabled);
-  button12.setCheckBoxFlags(button12.checkBoxFlags() & ~Qt::ItemIsUserCheckable);
+
+  button12.setCheckBoxControlsButton(false);
+  button12.setCheckBoxUserCheckable(false);
   button12.setCheckable(true);
-  button13.setCheckBoxFlags(button13.checkBoxFlags() | Qt::ItemIsEnabled);
+  button13.setCheckBoxControlsButton(false);
+  button13.setCheckBoxUserCheckable(true);
   button13.setCheckable(true);
 
   if (argc < 2 || QString(argv[1]) != "-I" )
     {
-    QTimer::singleShot(200, &app, SLOT(quit()));
+//    QTimer::singleShot(200, &app, SLOT(quit()));
     }
 
   return app.exec();

+ 49 - 18
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::ItemIsUserCheckable;
+  this->CheckBoxFlags = Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
   this->CheckState = Qt::Unchecked;
 }
 
@@ -226,11 +226,13 @@ void ctkCheckablePushButton::setCheckState(Qt::CheckState checkState)
 {
   Q_D(ctkCheckablePushButton);
   Qt::CheckState oldCheckState = d->CheckState;
-  if (checkState != oldCheckState &&
-      (checkState != Qt::PartiallyChecked ||
-       (d->CheckBoxFlags & Qt::ItemIsTristate)))
+  if (checkState != oldCheckState)
     {
     d->CheckState = checkState;
+    if (d->CheckBoxFlags & Qt::ItemIsEnabled)
+      {
+      setCheckable(checkState == Qt::Checked);
+      }
     this->update();
     emit checkStateChanged(checkState);
     }
@@ -244,18 +246,47 @@ Qt::CheckState ctkCheckablePushButton::checkState()const
 }
 
 //-----------------------------------------------------------------------------
-void ctkCheckablePushButton::setCheckBoxFlags(const Qt::ItemFlags& checkBoxFlags)
+void ctkCheckablePushButton::setCheckBoxControlsButton(bool b)
+{
+  Q_D(ctkCheckablePushButton);
+  if (b)
+    {
+    d->CheckBoxFlags |= Qt::ItemIsEnabled;
+    }
+  else
+    {
+    d->CheckBoxFlags &= ~Qt::ItemIsEnabled;
+    }
+  this->update();
+}
+
+//-----------------------------------------------------------------------------
+bool ctkCheckablePushButton::checkBoxControlsButton()const
+{
+  Q_D(const ctkCheckablePushButton);
+  return d->CheckBoxFlags & Qt::ItemIsEnabled;
+}
+
+//-----------------------------------------------------------------------------
+void ctkCheckablePushButton::setCheckBoxUserCheckable(bool b)
 {
   Q_D(ctkCheckablePushButton);
-  d->CheckBoxFlags = checkBoxFlags;
+  if (b)
+    {
+    d->CheckBoxFlags |= Qt::ItemIsUserCheckable;
+    }
+  else
+    {
+    d->CheckBoxFlags &= ~Qt::ItemIsUserCheckable;
+    }
   this->update();
 }
 
 //-----------------------------------------------------------------------------
-const Qt::ItemFlags& ctkCheckablePushButton::checkBoxFlags()const
+bool ctkCheckablePushButton::isCheckBoxUserCheckable()const
 {
   Q_D(const ctkCheckablePushButton);
-  return d->CheckBoxFlags;
+  return d->CheckBoxFlags & Qt::ItemIsUserCheckable;
 }
 
 //-----------------------------------------------------------------------------
@@ -302,13 +333,17 @@ void ctkCheckablePushButton::paintEvent(QPaintEvent * _event)
     tf |= Qt::TextHideMnemonic;
     }
   int textWidth = opt.fontMetrics.boundingRect(opt.rect, tf, opt.text).width();
-  // Spacing betweent the text and the checkbox
+  // Spacing between the text and the checkbox
   int indicatorSpacing = this->style()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing, &opt, this);
   int buttonMargin = this->style()->pixelMetric(QStyle::PM_ButtonMargin, &opt, this);
   // Draw Indicator
   QStyleOption indicatorOpt;
   indicatorOpt.init(this);
-  if (!(d->CheckBoxFlags & Qt::ItemIsEnabled))
+  if (!(d->CheckBoxFlags & Qt::ItemIsUserCheckable))
+    {
+    indicatorOpt.state &= ~QStyle::State_Enabled;
+    }
+  if (d->CheckBoxFlags & Qt::ItemIsEnabled)
     {
     if (this->isCheckable())
       {
@@ -321,10 +356,6 @@ void ctkCheckablePushButton::paintEvent(QPaintEvent * _event)
     }
   else
     {
-    if (!(d->CheckBoxFlags & Qt::ItemIsUserCheckable))
-      {
-      indicatorOpt.state &= ~QStyle::State_Enabled;
-      }
     if (d->CheckState == Qt::Checked)
       {
       indicatorOpt.state |= QStyle::State_On;
@@ -411,15 +442,15 @@ void ctkCheckablePushButton::mousePressEvent(QMouseEvent *e)
     {
     return;
     }
-  if (d->checkboxRect().contains(e->pos()))
+  if (d->checkboxRect().contains(e->pos()) &&
+      (d->CheckBoxFlags & Qt::ItemIsUserCheckable))
     {
-    Qt::ItemFlags cbf = d->CheckBoxFlags;
-    if (!(cbf & Qt::ItemIsEnabled))
+    if (d->CheckBoxFlags & Qt::ItemIsEnabled)
       {
       //check the checkbox
       this->setCheckable(!this->isCheckable());
       }
-    else if (d->CheckBoxFlags & Qt::ItemIsUserCheckable)
+    else
       {
       switch (d->CheckState)
         {

+ 14 - 12
Libs/Widgets/ctkCheckablePushButton.h

@@ -32,21 +32,20 @@
 class ctkCheckablePushButtonPrivate;
 
 /// Description
-/// ctkCheckablePushButton is a QPushButton with a checkbox that controls the
-/// checkable property of the button.
-/// You can change this behavior by assigning flags to the checkbox by the
-/// setCheckBoxFlags function. The Qt::ItemIsEnabled flag causes that the
-/// checkbox can be used
-/// 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.
+/// ctkCheckablePushButton is a QPushButton with a checkbox. By default
+/// the checkbox is connected to the checkable property of the push button.
+/// You can change this behaviour by clearing the "checkBoxControlsButton"
+/// property.
+/// The checkBoxUserCheckable property determines if the state of the
+/// checkbox can be changed interactively.
 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 NOTIFY checkStateChanged)
+  Q_PROPERTY(bool checkBoxControlsButton READ checkBoxControlsButton WRITE setCheckBoxControlsButton)
+  Q_PROPERTY(bool checkBoxUserCheckable READ isCheckBoxUserCheckable WRITE setCheckBoxUserCheckable)
 
 public:
   ctkCheckablePushButton(QWidget *parent = 0);
@@ -68,12 +67,15 @@ public:
   virtual QSize minimumSizeHint()const;
   virtual QSize sizeHint()const;
 
-  virtual const Qt::ItemFlags& checkBoxFlags()const;
-  virtual void setCheckBoxFlags(const Qt::ItemFlags& checkBoxFlags);
-
   virtual Qt::CheckState checkState()const;
   virtual void setCheckState(Qt::CheckState checkState);
 
+  virtual bool checkBoxControlsButton()const;
+  virtual void setCheckBoxControlsButton(bool b);
+
+  virtual bool isCheckBoxUserCheckable()const;
+  virtual void setCheckBoxUserCheckable(bool b);
+
 signals:
   void checkStateChanged(Qt::CheckState newCheckState);