123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- /*=========================================================================
- Library: CTK
- Copyright (c) Kitware Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0.txt
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- =========================================================================*/
- #ifndef __ctkDoubleSpinBox_h
- #define __ctkDoubleSpinBox_h
- // Qt includes
- #include <QMetaType>
- #include <QString>
- #include <QWidget>
- class QDoubleSpinBox;
- class QEvent;
- class QKeyEvent;
- class QLineEdit;
- class QObject;
- // CTK includes
- #include "ctkWidgetsExport.h"
- class ctkDoubleSpinBoxPrivate;
- class ctkValueProxy;
- /// \brief Custom SpinBox
- /// The ctkDoubleSpinBox internaly uses a QDoubleSpinBox while it retain controls
- /// over it.
- /// \sa ctkDoubleSlider, ctkSliderWidget, ctkRangeSlider
- class CTK_WIDGETS_EXPORT ctkDoubleSpinBox : public QWidget
- {
- Q_OBJECT
- Q_ENUMS(SetMode)
- Q_FLAGS(DecimalsOption DecimalsOptions)
- Q_ENUMS(SizeHintPolicy)
- Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment)
- Q_PROPERTY(bool frame READ hasFrame WRITE setFrame)
- Q_PROPERTY(QString prefix READ prefix WRITE setPrefix)
- Q_PROPERTY(QString suffix READ suffix WRITE setSuffix)
- Q_PROPERTY(QString cleanText READ cleanText)
- /// This property holds the precision of the spin box, in decimals.
- /// Sets how many decimals the spinbox will use for displaying and
- /// interpreting doubles.
- /// If the flag DecimalsByShortcuts is set, decimals can be increased/decreased by
- /// Ctrl+/Ctrl-, Ctrl0 restores the original decimals value.
- /// If the flag DecimalsAsMax and/or DecimalsAsMin are set, decimals behave also
- /// as the max and/or min number of decimals settable by DecimalsByShortcuts,
- /// DecimalsByKey and DecimalsByValue.
- /// 2 by default.
- /// \sa decimalsOption, decimals(), setDecimals(), decimalsChanged
- Q_PROPERTY(int decimals READ decimals WRITE setDecimals NOTIFY decimalsChanged)
- /// This property provides more controls over the decimals.
- /// The default (DecimalsByShortcuts|InsertDecimals) behaves as a QDoubleSpinbox
- /// with an explicit control of decimals via shortcuts.
- /// \sa DecimalsOptions, decimals
- Q_PROPERTY(DecimalsOptions decimalsOption READ decimalsOption WRITE setDecimalsOption)
- Q_PROPERTY(double minimum READ minimum WRITE setMinimum)
- Q_PROPERTY(double maximum READ maximum WRITE setMaximum)
- Q_PROPERTY(double singleStep READ singleStep WRITE setSingleStep)
- /// \sa setMode, decimals
- Q_PROPERTY(double value READ value WRITE setValue NOTIFY valueChanged USER true)
- /// This property controls how setValue behaves.
- /// \sa SetMode, setMode(), setSetMode(), value
- Q_PROPERTY(SetMode setMode READ setMode WRITE setSetMode)
- /// This property controls whether decreasing the value by the mouse
- /// button or mouse wheel increases the value of the widget, and inverts the
- /// control similarly in the other way round or not. The property is switched off by
- /// default.
- /// \sa invertedControls(), setInvertedControls()
- Q_PROPERTY(bool invertedControls READ invertedControls WRITE setInvertedControls)
- /// This property controls the size hint of the spinbox.
- /// SizeHintByMinMax by default
- /// SizeHintPolicy, sizeHintPolicy(), setSizeHintPolicy()
- Q_PROPERTY(SizeHintPolicy sizeHintPolicy READ sizeHintPolicy WRITE setSizeHintPolicy)
- public:
- /// SetMode enums for the spinbox behavior.
- /// SetAlways:
- /// No check is made and the given parameters is directly set
- /// on the internal QDoubleSpinBox.
- /// SetIfDifferent:
- /// Default mode, the given parameter is checked agains the
- /// current internal value and only set if they are different.
- /// For double, the comparison is based on the input parameters rounded
- /// with the current number of decimals (see round()).
- /// \sa setMode(), setSetMode(), round()
- enum SetMode
- {
- SetAlways,
- SetIfDifferent,
- };
- /// DecimalsOption enums the input style of the spinbox decimals.
- /// Default option is DecimalsByShortcuts.
- /// \sa decimals(), currentDecimals()
- enum DecimalsOption
- {
- /// Behaves just like a QDoubleSpinBox. The maximum number of decimals
- /// allowed is given by decimals().
- FixedDecimals = 0x000,
- /// When the spinbox has focus, entering the shortcut "CTRL +"
- /// adds decimals to the current number of decimals. "CTRL -" decreases the
- /// number of decimals and "CTRL 0" returns it to its original decimals()
- /// value.
- DecimalsByShortcuts = 0x001,
- /// Allow the number of decimals to be controlled by adding/removing digits
- /// with key strokes.
- /// \sa InsertDecimals, ReplaceDecimals
- DecimalsByKey = 0x002,
- /// Allow the number of decimals to be controlled by the value set by
- /// setValue().
- DecimalsByValue = 0x004,
- /// This flag controls whether inserted intermediate decimals increase the
- /// number of decimals (on) or not (off).
- /// It is incompatible with the ReplaceDecimals flag.
- /// \sa DecimalsByKey.
- InsertDecimals = 0x008,
- /// This flag controls whether inserted intermediate decimals replace the
- /// existing decimals (on) or not (off). This is similar to Insert but just
- /// for decimal digits.
- /// It is incompatible with the InsertDecimals flag.
- /// \sa DecimalsByKey, InsertDecimals
- ReplaceDecimals = 0x010,
- /// Use the "decimals" property as a maximum limit for the number of
- /// decimals.
- DecimalsAsMax = 0x020,
- /// Use the "decimals" property as a minimum limit for the number of
- /// decimals.
- DecimalsAsMin = 0x040,
- /// Even if the number of decimals is 0, it enforces the decimal to be visible
- /// (e.g. "0." )
- /// \sa decimals
- DecimalPointAlwaysVisible = 0x080
- };
- Q_DECLARE_FLAGS(DecimalsOptions, DecimalsOption)
- enum SizeHintPolicy
- {
- SizeHintByMinMax,
- SizeHintByValue
- };
- typedef QWidget Superclass;
- /// Constructor, creates a ctkDoubleSpinBox. The look and feel
- /// are the same as of a QDoubleSpinBox
- ctkDoubleSpinBox(QWidget* parent = 0);
- ctkDoubleSpinBox(ctkDoubleSpinBox::SetMode mode, QWidget* parent = 0);
- /// Get the spinbox current value
- /// \sa setValue(), cleanText()
- double value() const;
- /// Get the spinbox current displayed value
- /// \sa value(), cleanText(), setValue(), displayedValue()
- double displayedValue() const;
- /// Set the displayed value if there is no proxy installed.
- /// If there is a proxy installed, then it allows to modify the proxy value.
- /// If there is no value proxy installed, then it's just a setter to the
- /// value property.
- /// \sa displayedValue(), setValue(), value(), setValueProxy()
- void setDisplayedValue(double displayValue);
- /// Get the spinbox current text. This includes any prefix or suffix.
- /// \sa prefix(), suffix()
- QString text() const;
- /// Get the spinbox current text. This excludes any prefix or suffix.
- /// \sa value()
- QString cleanText() const;
- /// Set/Get the spinbox alignement
- Qt::Alignment alignment () const;
- void setAlignment (Qt::Alignment flag);
- /// Set/Get the frame
- void setFrame(bool frame);
- bool hasFrame() const;
- /// Add/Get a prefix to the displayed value. For example, one might want to
- /// add the $ sign.
- /// \sa suffix(), text()
- QString prefix() const;
- void setPrefix(const QString &prefix);
- /// Add/Get a suffix to the displayed value. For example, one might want to
- /// add the F (fahrenheit) sign.
- /// \sa prefix(), text()
- QString suffix() const;
- void setSuffix(const QString &suffix);
- /// Set/Get the single step. This represents by how much the value will
- /// decrease or increase when clicking the spinbox arrow or using stepUp or
- /// stepDown(). Default is 1.0.
- /// \sa setUp(), stepDown(), setDecimals().
- double singleStep() const;
- void setSingleStep(double value);
- /// Set/Get the range of the spinbox. Default range is [0.0, 9.9].
- double minimum() const;
- void setMinimum(double min);
- double maximum() const;
- void setMaximum(double max);
- void setRange(double min, double max);
- /// Set/Get number of displayed decimals.
- /// For a spinbox dealing only with integers, set this to 0.
- /// \sa ctkDoubleSpinBox::DecimalsOption
- int decimals() const;
- /// Returns the rounded value according to the number of decimals of
- /// the spinbox.
- /// \sa decimals()
- double round(double value) const;
- /// Get a pointer on the spinbox used internally. It can be useful to
- /// change display properties for example. To use with caution.
- /// \sa QDoubleSpinBox, lineEdit()
- QDoubleSpinBox* spinBox() const;
- /// Get a pointer on the line edit of the spinbox.
- /// \sa QLineEdit, spinBox()
- QLineEdit* lineEdit()const;
- /// Set the spinbox mode when using a set*() method.
- //// \sa round(), setValue(), setValueIfDifferent(), setValueAlways()
- ctkDoubleSpinBox::SetMode setMode() const;
- void setSetMode(SetMode mode);
- /// Set/Get the option used to input the decimals.
- /// \sa ctkDoubleSpinBox::DecimalsOption
- ctkDoubleSpinBox::DecimalsOptions decimalsOption();
- void setDecimalsOption(ctkDoubleSpinBox::DecimalsOptions option);
- /// This property holds whether or not the spin box inverts its wheel and key
- /// events.
- /// If this property is false, scrolling the mouse wheel "up" and using keys
- /// like page up will increase the spinbox's value towards its maximum.
- /// Otherwise pressing page up will move value towards the slider's minimum.
- void setInvertedControls(bool invertedControls);
- bool invertedControls() const;
- /// Set the sizeHintPolicy property value.
- /// \sa sizeHintPolicy
- void setSizeHintPolicy(SizeHintPolicy newSizeHintPolicy);
- /// Return the sizeHintPolicy property value.
- /// \sa sizeHintPolicy
- SizeHintPolicy sizeHintPolicy()const;
- /// Install or remove a value proxy filter. The value proxy decouples the
- /// displayed value from the value retrieved by the value property.
- /// For example, the value proxy can allow one to display celsius in the
- /// spinbox while the value retrieved from the value property and signals
- /// are in farenheit.
- /// To remove the proxy, simply install a new empty proxy. The proxy
- /// installation/removal is silent.
- /// \sa installValueProxy(), valueProxy()
- void setValueProxy(ctkValueProxy* proxy);
- ctkValueProxy* valueProxy() const;
- /// Reimplemented to respect the sizeHintPolicy property value.
- /// \sa sizeHintPolicy
- virtual QSize sizeHint()const;
- /// Reimplemented to respect the sizeHintPolicy property value.
- /// \sa sizeHintPolicy
- virtual QSize minimumSizeHint()const;
- public Q_SLOTS:
- /// Set the value of the spinbox following the current mode.
- /// \sa setMode(), value(), setValueIfDifferent(), setValueAlways()
- void setValue(double value);
- /// Set the value of the spinbox followin the SetIfDifferent mode.
- /// \sa value(), setValue(), setMode(), setValueAlways()
- void setValueIfDifferent(double value);
- /// Set the value of the spinbox following the SetAlways mode.
- /// \sa value(), setValue(), setMode(), setValueIfDifferent()
- void setValueAlways(double value);
- /// Increase/Decrease the current value by a single step.
- /// \sa value(), singleStep()
- void stepUp();
- void stepDown();
- /// Set the decimals property value.
- /// \sa decimals
- void setDecimals(int decimal);
- Q_SIGNALS:
- /// Emitted everytime the spinbox value is modified
- /// \sa QDoubleSpinBox::valueChanged()
- void valueChanged(double);
- void valueChanged(const QString &);
- /// Simple broadcast of the QAbstractSpinbox::editingFinished
- /// \sa QAbstractSpinbox::editingFinished
- void editingFinished();
- /// Signal emitted when the decimals of the displayed are changed.
- void decimalsChanged(int);
- protected:
- ctkDoubleSpinBoxPrivate* const d_ptr;
- /// Reimplemented to support shortcuts.
- virtual void keyPressEvent(QKeyEvent* event);
- /// Reimplemented to support shortcuts on the double spinbox.
- virtual bool eventFilter(QObject *obj, QEvent *event);
- friend class ctkCoordinatesWidgetPrivate;
- private:
- Q_DECLARE_PRIVATE(ctkDoubleSpinBox);
- Q_DISABLE_COPY(ctkDoubleSpinBox);
- };
- Q_DECLARE_METATYPE(ctkDoubleSpinBox::SetMode)
- Q_DECLARE_OPERATORS_FOR_FLAGS(ctkDoubleSpinBox::DecimalsOptions)
- #endif //__ctkDoubleSpinBox_h
|