forked from qt-creator/qt-creator
		
	Change-Id: Ic6a9ff0359625021ebc061d22db6811814534205 Reviewed-by: Kai Koehne <kai.koehne@digia.com>
		
			
				
	
	
		
			142 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			QML
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			QML
		
	
	
	
	
	
/****************************************************************************
 | 
						|
**
 | 
						|
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
 | 
						|
** Contact: http://www.qt-project.org/legal
 | 
						|
**
 | 
						|
** This file is part of Qt Creator.
 | 
						|
**
 | 
						|
** 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 Digia.  For licensing terms and
 | 
						|
** conditions see http://qt.digia.com/licensing.  For further information
 | 
						|
** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
 | 
						|
** Foundation and appearing in the file LICENSE.LGPL included in the
 | 
						|
** packaging of this file.  Please review the following information to
 | 
						|
** ensure the GNU Lesser General Public License version 2.1 requirements
 | 
						|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
						|
**
 | 
						|
** In addition, as a special exception, Digia gives you certain additional
 | 
						|
** rights.  These rights are described in the Digia Qt LGPL Exception
 | 
						|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 | 
						|
**
 | 
						|
****************************************************************************/
 | 
						|
 | 
						|
import QtQuick 1.0
 | 
						|
import "custom" as Components
 | 
						|
 | 
						|
// jens: ContainsMouse breaks drag functionality
 | 
						|
 | 
						|
QStyleItem {
 | 
						|
    id: dial
 | 
						|
 | 
						|
    width:100
 | 
						|
    height:100
 | 
						|
 | 
						|
    property alias maximumValue: range.maximumValue
 | 
						|
    property alias minimumValue: range.minimumValue
 | 
						|
    property alias containsMouse: mouseArea.containsMouse
 | 
						|
    property alias value: range.value
 | 
						|
 | 
						|
    property bool wrapping: false
 | 
						|
    property bool tickmarks: true // not implemented
 | 
						|
 | 
						|
    RangeModel {
 | 
						|
        id: range
 | 
						|
        minimumValue: 0.0
 | 
						|
        maximumValue: 1.0
 | 
						|
        stepSize: 0.0
 | 
						|
        value: 0
 | 
						|
    }
 | 
						|
 | 
						|
    MouseArea {
 | 
						|
        id: mouseArea
 | 
						|
        anchors.fill:parent
 | 
						|
        property bool inDrag
 | 
						|
        hoverEnabled:true
 | 
						|
 | 
						|
        onPositionChanged: {
 | 
						|
            if (pressed) {
 | 
						|
                value = valueFromPoint(mouseX, mouseY)
 | 
						|
                inDrag = true
 | 
						|
            }
 | 
						|
        }
 | 
						|
        onPressed: {
 | 
						|
            value = valueFromPoint(mouseX, mouseY)
 | 
						|
            dial.focus = true
 | 
						|
        }
 | 
						|
 | 
						|
        onReleased:inDrag = false;
 | 
						|
        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 a = (xx || yy) ? Math.atan2(yy, xx) : 0;
 | 
						|
 | 
						|
            if (a < Math.PI/ -2)
 | 
						|
                a = a + Math.PI * 2;
 | 
						|
 | 
						|
            var dist = 0;
 | 
						|
            var minv = minimumValue*100, maxv = maximumValue*100;
 | 
						|
 | 
						|
            if (minimumValue < 0) {
 | 
						|
                dist = -minimumValue;
 | 
						|
                minv = 0;
 | 
						|
                maxv = maximumValue + dist;
 | 
						|
            }
 | 
						|
 | 
						|
            var r = maxv - minv;
 | 
						|
            var v;
 | 
						|
            if (wrapping)
 | 
						|
                v =  (0.5 + minv + r * (Math.PI * 3 / 2 - a) / (2 * Math.PI));
 | 
						|
            else
 | 
						|
                v =  (0.5 + minv + r* (Math.PI * 4 / 3 - a) / (Math.PI * 10 / 6));
 | 
						|
 | 
						|
            if (dist > 0)
 | 
						|
                v -= dist;
 | 
						|
            return maximumValue - bound(v/100)
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    WheelArea {
 | 
						|
        id: wheelarea
 | 
						|
        anchors.fill: parent
 | 
						|
        horizontalMinimumValue: dial.minimumValue
 | 
						|
        horizontalMaximumValue: dial.maximumValue
 | 
						|
        verticalMinimumValue: dial.minimumValue
 | 
						|
        verticalMaximumValue: dial.maximumValue
 | 
						|
        property double step: (dial.maximumValue - dial.minimumValue)/100
 | 
						|
 | 
						|
        onVerticalWheelMoved: {
 | 
						|
            value += verticalDelta/4*step
 | 
						|
        }
 | 
						|
 | 
						|
        onHorizontalWheelMoved: {
 | 
						|
            value += horizontalDelta/4*step
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    elementType:"dial"
 | 
						|
    sunken: mouseArea.pressed
 | 
						|
    maximum: range.maximumValue*90
 | 
						|
    minimum: range.minimumValue*90
 | 
						|
    focus:dial.focus
 | 
						|
    value: visualPos*90
 | 
						|
    enabled: dial.enabled
 | 
						|
    property double visualPos : range.value
 | 
						|
    Behavior on visualPos {
 | 
						|
        enabled: !mouseArea.inDrag
 | 
						|
        NumberAnimation {
 | 
						|
            duration: 300
 | 
						|
            easing.type: Easing.OutSine
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |