Pārlūkot izejas kodu

ENH: Add spinBoxAlignment property to ctkRangeWidget.
The property describes the position of the spinboxes around the slider.
Qt:AlignTop, Qt:AlignVCenter and Qt:AlignBottom are the different values of spinBoxAlignment

Julien Finet 15 gadi atpakaļ
vecāks
revīzija
db9c72dbd9

+ 7 - 10
Libs/Widgets/Resources/UI/ctkRangeWidget.ui

@@ -6,31 +6,28 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>226</width>
-    <height>32</height>
+    <width>302</width>
+    <height>20</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>ctkSliderSpinBoxWidget</string>
   </property>
-  <layout class="QHBoxLayout" name="horizontalLayout">
-   <property name="spacing">
-    <number>2</number>
-   </property>
+  <layout class="QGridLayout" name="GridLayout">
    <property name="margin">
-    <number>2</number>
+    <number>0</number>
    </property>
-   <item>
+   <item row="0" column="0">
     <widget class="QDoubleSpinBox" name="MinimumSpinBox"/>
    </item>
-   <item>
+   <item row="0" column="1">
     <widget class="ctkDoubleRangeSlider" name="Slider">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
     </widget>
    </item>
-   <item>
+   <item row="0" column="2">
     <widget class="QDoubleSpinBox" name="MaximumSpinBox"/>
    </item>
   </layout>

+ 56 - 8
Libs/Widgets/ctkRangeWidget.cpp

@@ -36,13 +36,14 @@ public:
   int synchronizedSpinBoxWidth()const;
   void synchronizeSiblingSpinBox(int newWidth);
   static bool equal(double v1, double v2);
-
-
-  bool   Tracking;
-  bool   Changing;
-  double MinimumValueBeforeChange;
-  double MaximumValueBeforeChange;
-  bool   AutoSpinBoxWidth;
+  void relayout();
+
+  bool          Tracking;
+  bool          Changing;
+  double        MinimumValueBeforeChange;
+  double        MaximumValueBeforeChange;
+  bool          AutoSpinBoxWidth;
+  Qt::Alignment SpinBoxAlignment;
 };
 
 // --------------------------------------------------------------------------
@@ -59,6 +60,7 @@ ctkRangeWidgetPrivate::ctkRangeWidgetPrivate()
   this->MinimumValueBeforeChange = 0.;
   this->MaximumValueBeforeChange = 0.;
   this->AutoSpinBoxWidth = true;
+  this->SpinBoxAlignment = Qt::AlignVCenter;
 }
 
 // --------------------------------------------------------------------------
@@ -116,6 +118,33 @@ void ctkRangeWidgetPrivate::synchronizeSiblingSpinBox(int width)
 }
 
 // --------------------------------------------------------------------------
+void ctkRangeWidgetPrivate::relayout()
+{
+  CTK_P(ctkRangeWidget);
+  this->GridLayout->removeWidget(this->MinimumSpinBox);
+  this->GridLayout->removeWidget(this->MaximumSpinBox);
+  this->GridLayout->removeWidget(this->Slider);
+  if (this->SpinBoxAlignment & Qt::AlignTop)
+    {
+    this->GridLayout->addWidget(this->MinimumSpinBox,0,0);
+    this->GridLayout->addWidget(this->MaximumSpinBox,0,2);
+    this->GridLayout->addWidget(this->Slider,1,0,1,3);
+    }
+  else if (this->SpinBoxAlignment & Qt::AlignVCenter)
+    {
+    this->GridLayout->addWidget(this->MinimumSpinBox,0,0);
+    this->GridLayout->addWidget(this->Slider,0,1);
+    this->GridLayout->addWidget(this->MaximumSpinBox,0,2);
+    }
+  else if (this->SpinBoxAlignment & Qt::AlignBottom)
+    {
+    this->GridLayout->addWidget(this->MinimumSpinBox,1,0);
+    this->GridLayout->addWidget(this->MaximumSpinBox,1,2);
+    this->GridLayout->addWidget(this->Slider,0, 0, 1, 3);
+    }
+}
+
+// --------------------------------------------------------------------------
 ctkRangeWidget::ctkRangeWidget(QWidget* _parent) : Superclass(_parent)
 {
   CTK_INIT_PRIVATE(ctkRangeWidget);
@@ -482,12 +511,31 @@ void ctkRangeWidget::reset()
 void ctkRangeWidget::setSpinBoxAlignment(Qt::Alignment alignment)
 {
   CTK_D(ctkRangeWidget);
+  if (d->SpinBoxAlignment == alignment)
+    {
+    return;
+    }
+  d->SpinBoxAlignment = alignment;
+  d->relayout();
+}
+
+// -------------------------------------------------------------------------
+Qt::Alignment ctkRangeWidget::spinBoxAlignment()const
+{
+  CTK_D(const ctkRangeWidget);
+  return d->SpinBoxAlignment;
+}
+
+// -------------------------------------------------------------------------
+void ctkRangeWidget::setSpinBoxTextAlignment(Qt::Alignment alignment)
+{
+  CTK_D(ctkRangeWidget);
   d->MinimumSpinBox->setAlignment(alignment);
   d->MaximumSpinBox->setAlignment(alignment);
 }
 
 // -------------------------------------------------------------------------
-Qt::Alignment ctkRangeWidget::spinBoxAlignment()const
+Qt::Alignment ctkRangeWidget::spinBoxTextAlignment()const
 {
   CTK_D(const ctkRangeWidget);
   Q_ASSERT(d->MinimumSpinBox->alignment() == d->MaximumSpinBox->alignment());

+ 11 - 3
Libs/Widgets/ctkRangeWidget.h

@@ -44,6 +44,7 @@ class CTK_WIDGETS_EXPORT ctkRangeWidget : public QWidget
   Q_PROPERTY(QString suffix READ suffix WRITE setSuffix)
   Q_PROPERTY(double tickInterval READ tickInterval WRITE setTickInterval)
   Q_PROPERTY(bool autoSpinBoxWidth READ isAutoSpinBoxWidth WRITE setAutoSpinBoxWidth)
+  Q_PROPERTY(Qt::Alignment spinBoxTextAlignment READ spinBoxTextAlignment WRITE setSpinBoxTextAlignment)
   Q_PROPERTY(Qt::Alignment spinBoxAlignment READ spinBoxAlignment WRITE setSpinBoxAlignment)
   Q_PROPERTY(bool tracking READ hasTracking WRITE setTracking)
 
@@ -124,11 +125,18 @@ public:
   void setTickInterval(double ti);
 
   /// 
-  /// This property holds the alignment of the spin box.
-  /// Possible Values are Qt::AlignLeft, Qt::AlignRight, and Qt::AlignHCenter.
-  /// By default, the alignment is Qt::AlignLeft
+  /// This property holds the alignment of the spin boxes.
+  /// Possible Values are Qt::AlignTop, Qt::AlignBottom, and Qt::AlignVCenter.
+  /// By default, the alignment is Qt::AlignVCenter
   void setSpinBoxAlignment(Qt::Alignment alignment);
   Qt::Alignment spinBoxAlignment()const;
+  
+  /// 
+  /// This property holds the alignment of the text inside the spin boxes.
+  /// Possible Values are Qt::AlignLeft, Qt::AlignRight, and Qt::AlignHCenter.
+  /// By default, the alignment is Qt::AlignLeft
+  void setSpinBoxTextAlignment(Qt::Alignment alignment);
+  Qt::Alignment spinBoxTextAlignment()const;
 
   /// 
   /// This property holds whether slider tracking is enabled.