diff --git a/share/qtcreator/welcomescreen/components/ScrollBar.qml b/share/qtcreator/welcomescreen/components/ScrollBar.qml index fcd16450ed9ca04d7bdfd7e3ef921751d5d6508a..18ed13bd54f6a181341b3148638cff79f76720e8 100644 --- a/share/qtcreator/welcomescreen/components/ScrollBar.qml +++ b/share/qtcreator/welcomescreen/components/ScrollBar.qml @@ -32,31 +32,36 @@ import QtQuick 1.0 import "custom" as Components +import "plugin" Item { id: scrollbar - property bool upPressed - property bool downPressed property int orientation : Qt.Horizontal property alias minimumValue: slider.minimumValue property alias maximumValue: slider.maximumValue + property int pageStep: styleitem.horizontal ? width : height + property int singleStep: 20 property alias value: slider.value + property bool scrollToClickposition: styleitem.styleHint("scrollToClickPosition") width: orientation == Qt.Horizontal ? 200 : internal.scrollbarExtent height: orientation == Qt.Horizontal ? internal.scrollbarExtent : 200 onValueChanged: internal.updateHandle() - // onMaximumValueChanged: internal.updateHandle() - // onMinimumValueChanged: internal.updateHandle() MouseArea { id: internal anchors.fill: parent + property bool upPressed + property bool downPressed + property bool pageUpPressed + property bool pageDownPressed property bool autoincrement: false property int scrollbarExtent : styleitem.pixelMetric("scrollbarExtent"); + property bool handlePressed // Update hover item onEntered: styleitem.activeControl = styleitem.hitTest(mouseX, mouseY) @@ -64,8 +69,14 @@ Item { onMouseXChanged: styleitem.activeControl = styleitem.hitTest(mouseX, mouseY) hoverEnabled: true + property variant control + property variant pressedX + property variant pressedY + property int oldPosition + property int grooveSize + Timer { - running: upPressed || downPressed + running: internal.upPressed || internal.downPressed || internal.pageUpPressed || internal.pageDownPressed interval: 350 onTriggered: internal.autoincrement = true } @@ -74,37 +85,81 @@ Item { running: internal.autoincrement interval: 60 repeat: true - onTriggered: upPressed ? internal.decrement() : internal.increment() + onTriggered: internal.upPressed ? internal.decrement() : internal.downPressed ? internal.increment() : + internal.pageUpPressed ? internal.decrementPage() : + internal.incrementPage() + } + + onMousePositionChanged: { + if (pressed && control === "handle") { + //slider.positionAtMaximum = grooveSize + if (!styleitem.horizontal) + slider.position = oldPosition + (mouseY - pressedY) + else + slider.position = oldPosition + (mouseX - pressedX) + } } onPressed: { - var control = styleitem.hitTest(mouseX,mouseY) - if (control == "up") { + control = styleitem.hitTest(mouseX,mouseY) + scrollToClickposition = styleitem.styleHint("scrollToClickPosition") + grooveSize = styleitem.horizontal? styleitem.subControlRect("groove").width - + styleitem.subControlRect("handle").width: + styleitem.subControlRect("groove").height - + styleitem.subControlRect("handle").height; + if (control == "handle") { + pressedX = mouseX + pressedY = mouseY + oldPosition = slider.position + } else if (control == "up") { + decrement(); upPressed = true } else if (control == "down") { + increment(); downPressed = true + } else if (!scrollToClickposition){ + if (control == "upPage") { + decrementPage(); + pageUpPressed = true + } else if (control == "downPage") { + incrementPage(); + pageDownPressed = true + } + } else { + slider.position = styleitem.horizontal ? mouseX - handleRect.width/2 + : mouseY - handleRect.height/2 } } onReleased: { autoincrement = false; - if (upPressed) { - upPressed = false; - decrement() - } else if (downPressed) { - increment() - downPressed = false; - } + upPressed = false; + downPressed = false; + pageUpPressed = false + pageDownPressed = false + control = "" + } + + function incrementPage() { + value += pageStep + if (value > maximumValue) + value = maximumValue + } + + function decrementPage() { + value -= pageStep + if (value < minimumValue) + value = minimumValue } function increment() { - value += 30 + value += singleStep if (value > maximumValue) value = maximumValue } function decrement() { - value -= 30 + value -= singleStep if (value < minimumValue) value = minimumValue } @@ -115,7 +170,7 @@ Item { elementType: "scrollbar" hover: activeControl != "none" activeControl: "none" - sunken: upPressed | downPressed + sunken: internal.upPressed | internal.downPressed minimum: slider.minimumValue maximum: slider.maximumValue value: slider.value @@ -124,35 +179,20 @@ Item { } property variant handleRect: Qt.rect(0,0,0,0) + property variant grooveRect: Qt.rect(0,0,0,0) function updateHandle() { internal.handleRect = styleitem.subControlRect("handle") - var grooveRect = styleitem.subControlRect("groove"); - var extra = 0 - if (orientation == Qt.Vertical) { - slider.anchors.topMargin = grooveRect.y + extra - slider.anchors.bottomMargin = height - grooveRect.y - grooveRect.height + extra - } else { - slider.anchors.leftMargin = grooveRect.x + extra - slider.anchors.rightMargin = width - grooveRect.x - grooveRect.width + extra - } + grooveRect = styleitem.subControlRect("groove"); } - - Components.Slider { + RangeModel { id: slider - hoverEnabled: false // Handled by the scrollbar background - orientation: scrollbar.orientation - anchors.fill: parent - leftMargin: (orientation === Qt.Horizontal) ? internal.handleRect.width / 2 : internal.handleRect.height / 2 - rightMargin: leftMargin - handle: Item { - width: orientation == Qt.Vertical ? internal.handleRect.height : internal.handleRect.width; - height: orientation == Qt.Vertical ? internal.handleRect.width : internal.handleRect.height - } - groove:null - containsMouse: false - valueIndicator:null - inverted:orientation != Qt.Horizontal + minimumValue: 0.0 + maximumValue: 1.0 + value: 0 + stepSize: 0.0 + inverted: false + positionAtMaximum: internal.grooveSize } } } diff --git a/share/qtcreator/welcomescreen/components/styleitem/qstyleitem.cpp b/share/qtcreator/welcomescreen/components/styleitem/qstyleitem.cpp index fecffe7b22fb2850392fd947f0ef95fb248a3d48..466f983f761f83be449af267aa72e5bc2c81974a 100644 --- a/share/qtcreator/welcomescreen/components/styleitem/qstyleitem.cpp +++ b/share/qtcreator/welcomescreen/components/styleitem/qstyleitem.cpp @@ -2,7 +2,7 @@ ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (info@qt.nokia.com) +** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** @@ -302,7 +302,21 @@ void QStyleItem::initStyleOption() opt->maximum = maximum(); // ### fixme - workaround for KDE inverted dial opt->sliderPosition = value(); - opt->tickInterval = opt->maximum != opt->minimum ? 1200 / (opt->maximum - opt->minimum) : 0; + opt->singleStep = step(); + + if (opt->singleStep) + { + qreal numOfSteps = (opt->maximum - opt->minimum) / opt->singleStep; + + // at least 5 pixels between tick marks + if (numOfSteps && (width() / numOfSteps < 5)) + opt->tickInterval = qRound((5*numOfSteps / width()) + 0.5)*step(); + else + opt->tickInterval = opt->singleStep; + } + else // default Qt-components implementation + opt->tickInterval = opt->maximum != opt->minimum ? 1200 / (opt->maximum - opt->minimum) : 0; + if (style() == QLatin1String("oxygen") && type == QLatin1String("dial")) opt->sliderValue = maximum() - value(); else @@ -487,19 +501,21 @@ QString QStyleItem::hitTest(int px, int py) } break; case ScrollBar: { - subcontrol = qApp->style()->hitTestComplexControl(QStyle::CC_ScrollBar, - qstyleoption_cast<QStyleOptionComplex*>(m_styleoption), - QPoint(px,py), 0); - if (subcontrol == QStyle::SC_ScrollBarSlider) - return "handle"; - - if (subcontrol == QStyle::SC_ScrollBarSubLine - || subcontrol == QStyle::SC_ScrollBarSubPage) - return "up"; - - if (subcontrol == QStyle::SC_ScrollBarAddLine - || subcontrol == QStyle::SC_ScrollBarAddPage) - return "down"; + subcontrol = qApp->style()->hitTestComplexControl(QStyle::CC_ScrollBar, + qstyleoption_cast<QStyleOptionComplex*>(m_styleoption), + QPoint(px,py), 0); + if (subcontrol == QStyle::SC_ScrollBarSlider) + return "handle"; + + if (subcontrol == QStyle::SC_ScrollBarSubLine) + return "up"; + else if (subcontrol == QStyle::SC_ScrollBarSubPage) + return "upPage"; + + if (subcontrol == QStyle::SC_ScrollBarAddLine) + return "down"; + else if (subcontrol == QStyle::SC_ScrollBarAddPage) + return "downPage"; } break; default: @@ -621,15 +637,15 @@ QVariant QStyleItem::styleHint(const QString &metric) return qApp->palette().text().color().name(); } else if (metric == "focuswidget") { return qApp->style()->styleHint(QStyle::SH_FocusFrame_AboveWidget); - } else if (metric == "tabbaralignment") { int result = qApp->style()->styleHint(QStyle::SH_TabBar_Alignment); if (result == Qt::AlignCenter) return "center"; return "left"; - - } else if (metric == "framearoundcontents") + } else if (metric == "framearoundcontents") { return qApp->style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents); + } else if (metric == "scrollToClickPosition") + return qApp->style()->styleHint(QStyle::SH_ScrollBar_LeftClickAbsolutePosition); return 0; } diff --git a/share/qtcreator/welcomescreen/components/styleitem/qstyleitem.h b/share/qtcreator/welcomescreen/components/styleitem/qstyleitem.h index 4a1da099fc9ad9da61b71f859f4291d4063770e4..166b39fa00ef28833a4aef5ad20ed300cda9d46b 100644 --- a/share/qtcreator/welcomescreen/components/styleitem/qstyleitem.h +++ b/share/qtcreator/welcomescreen/components/styleitem/qstyleitem.h @@ -2,7 +2,7 @@ ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. -** Contact: Nokia Corporation (info@qt.nokia.com) +** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** @@ -70,6 +70,7 @@ class QStyleItem: public QDeclarativeItem Q_PROPERTY( int minimum READ minimum WRITE setMinimum NOTIFY minimumChanged) Q_PROPERTY( int maximum READ maximum WRITE setMaximum NOTIFY maximumChanged) Q_PROPERTY( int value READ value WRITE setValue NOTIFY valueChanged) + Q_PROPERTY( int step READ step WRITE setStep NOTIFY stepChanged) Q_PROPERTY( int paintMargins READ paintMargins WRITE setPaintMargins NOTIFY paintMarginsChanged) Q_PROPERTY( QString fontFamily READ fontFamily) @@ -122,6 +123,7 @@ public: int minimum() const { return m_minimum; } int maximum() const { return m_maximum; } + int step() const { return m_step; } int value() const { return m_value; } int paintMargins() const { return m_paintMargins; } @@ -144,6 +146,7 @@ public: void setMinimum(int minimum) { if (m_minimum!= minimum) {m_minimum = minimum; emit minimumChanged();}} void setMaximum(int maximum) { if (m_maximum != maximum) {m_maximum = maximum; emit maximumChanged();}} void setValue(int value) { if (m_value!= value) {m_value = value; emit valueChanged();}} + void setStep(int step) { if (m_step != step) { m_step = step; emit stepChanged(); }} void setPaintMargins(int value) { Q_UNUSED(value) #ifdef Q_WS_WIN //only vista style needs this hack @@ -189,6 +192,7 @@ Q_SIGNALS: void horizontalChanged(); void minimumChanged(); void maximumChanged(); + void stepChanged(); void valueChanged(); void activeControlChanged(); void infoChanged(); @@ -223,6 +227,7 @@ protected: int m_minimum; int m_maximum; int m_value; + int m_step; int m_paintMargins; };