123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- /****************************************************************************
- **
- ** Copyright (C) 2016 The Qt Company Ltd.
- ** Contact: https://www.qt.io/licensing/
- **
- ** This file is part of the Qt Quick Extras module of the Qt Toolkit.
- **
- ** $QT_BEGIN_LICENSE:LGPL$
- ** Commercial License Usage
- ** Licensees holding valid commercial Qt licenses may use this file in
- ** accordance with the commercial license agreement provided with the
- ** Software or, alternatively, in accordance with the terms contained in
- ** a written agreement between you and The Qt Company. For licensing terms
- ** and conditions see https://www.qt.io/terms-conditions. For further
- ** information use the contact form at https://www.qt.io/contact-us.
- **
- ** GNU Lesser General Public License Usage
- ** Alternatively, this file may be used under the terms of the GNU Lesser
- ** General Public License version 3 as published by the Free Software
- ** Foundation and appearing in the file LICENSE.LGPL3 included in the
- ** packaging of this file. Please review the following information to
- ** ensure the GNU Lesser General Public License version 3 requirements
- ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
- **
- ** GNU General Public License Usage
- ** Alternatively, this file may be used under the terms of the GNU
- ** General Public License version 2.0 or (at your option) the GNU General
- ** Public license version 3 or any later version approved by the KDE Free
- ** Qt Foundation. The licenses are as published by the Free Software
- ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
- ** included in the packaging of this file. Please review the following
- ** information to ensure the GNU General Public License requirements will
- ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
- ** https://www.gnu.org/licenses/gpl-3.0.html.
- **
- ** $QT_END_LICENSE$
- **
- ****************************************************************************/
- import QtQuick 2.2
- import QtQuick.Controls 1.4
- import QtQuick.Controls.Styles 1.4
- import QtQuick.Controls.Private 1.0
- import QtQuick.Extras 1.4
- import QtQuick.Extras.Private 1.0
- /*!
- \qmltype Dial
- \inqmlmodule QtQuick.Extras
- \since 5.5
- \ingroup extras
- \ingroup extras-interactive
- \brief A circular dial that is rotated to set a value.
- \image dial.png A Dial
- The Dial is similar to a traditional dial knob that is found on devices
- such as stereos or industrial equipment. It allows the user to specify a
- value within a range.
- Like CircularGauge, Dial can display tickmarks to give an indication of
- the current value. When a suitable stepSize is combined with
- \l {DialStyle::}{tickmarkStepSize},
- the dial "snaps" to each tickmark.
- You can create a custom appearance for a Dial by assigning a
- \l {DialStyle}.
- */
- Control {
- id: dial
- activeFocusOnTab: true
- style: Settings.styleComponent(Settings.style, "DialStyle.qml", dial)
- /*!
- \qmlproperty real Dial::value
- The angle of the handle along the dial, in the range of
- \c 0.0 to \c 1.0.
- The default value is \c{0.0}.
- */
- property alias value: range.value
- /*!
- \qmlproperty real Dial::minimumValue
- The smallest value allowed by the dial.
- The default value is \c{0.0}.
- \sa value, maximumValue
- */
- property alias minimumValue: range.minimumValue
- /*!
- \qmlproperty real Dial::maximumValue
- The largest value allowed by the dial.
- The default value is \c{1.0}.
- \sa value, minimumValue
- */
- property alias maximumValue: range.maximumValue
- /*!
- \qmlproperty real Dial::hovered
- This property holds whether the button is being hovered.
- */
- readonly property alias hovered: mouseArea.containsMouse
- /*!
- \qmlproperty real Dial::stepSize
- The default value is \c{0.0}.
- */
- property alias stepSize: range.stepSize
- /*!
- \internal
- Determines whether the dial can be freely rotated past the zero marker.
- The default value is \c false.
- */
- property bool __wrap: false
- /*!
- This property specifies whether the dial should gain active focus when
- pressed.
- The default value is \c false.
- \sa pressed
- */
- property bool activeFocusOnPress: false
- /*!
- \qmlproperty bool Dial::pressed
- Returns \c true if the dial is pressed.
- \sa activeFocusOnPress
- */
- readonly property alias pressed: mouseArea.pressed
- /*!
- This property determines whether or not the dial displays tickmarks,
- minor tickmarks, and labels.
- For more fine-grained control over what is displayed, the following
- style components of
- \l {DialStyle} can be used:
- \list
- \li \l {DialStyle::}{tickmark}
- \li \l {DialStyle::}{minorTickmark}
- \li \l {DialStyle::}{tickmarkLabel}
- \endlist
- The default value is \c true.
- */
- property bool tickmarksVisible: true
- Keys.onLeftPressed: value -= stepSize
- Keys.onDownPressed: value -= stepSize
- Keys.onRightPressed: value += stepSize
- Keys.onUpPressed: value += stepSize
- Keys.onPressed: {
- if (event.key === Qt.Key_Home) {
- value = minimumValue;
- event.accepted = true;
- } else if (event.key === Qt.Key_End) {
- value = maximumValue;
- event.accepted = true;
- }
- }
- RangeModel {
- id: range
- minimumValue: 0.0
- maximumValue: 1.0
- stepSize: 0
- value: 0
- }
- MouseArea {
- id: mouseArea
- hoverEnabled: true
- parent: __panel.background.parent
- anchors.fill: parent
- onPositionChanged: {
- if (pressed) {
- value = valueFromPoint(mouseX, mouseY);
- }
- }
- onPressed: {
- if (!__style.__dragToSet)
- value = valueFromPoint(mouseX, mouseY);
- if (activeFocusOnPress)
- dial.forceActiveFocus();
- }
- function bound(val) { return Math.max(minimumValue, Math.min(maximumValue, val)); }
- function valueFromPoint(x, y)
- {
- var yy = height / 2.0 - y;
- var xx = x - width / 2.0;
- var angle = (xx || yy) ? Math.atan2(yy, xx) : 0;
- if (angle < Math.PI/ -2)
- angle = angle + Math.PI * 2;
- var range = maximumValue - minimumValue;
- var value;
- if (__wrap)
- value = (minimumValue + range * (Math.PI * 3 / 2 - angle) / (2 * Math.PI));
- else
- value = (minimumValue + range * (Math.PI * 4 / 3 - angle) / (Math.PI * 10 / 6));
- return bound(value)
- }
- }
- }
|