diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-03-24 16:14:56 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-03-24 16:14:56 +0100 |
commit | ff5d39f0a8f34cdb034df703e7b2a769c945e1ed (patch) | |
tree | 56ec1b5d03809653648e2f50d4ff88be4d7951bd /src | |
parent | 51156e412b2f91dbbf8c0b6055e6ab4c29370d8a (diff) | |
parent | b69eb02366ad6d8647238f4caf8edfdcaea1b526 (diff) | |
download | qtquickcontrols-ff5d39f0a8f34cdb034df703e7b2a769c945e1ed.tar.gz |
Merge remote-tracking branch 'origin/stable' into dev
Conflicts:
tests/auto/controls/data/tst_applicationwindow.qml
Change-Id: I2ba1f1ba9604f9417102ff076e4ab9ab4d37ab7a
Diffstat (limited to 'src')
77 files changed, 684 insertions, 165 deletions
diff --git a/src/controls/ApplicationWindow.qml b/src/controls/ApplicationWindow.qml index df29e5e2..c8e374ad 100644 --- a/src/controls/ApplicationWindow.qml +++ b/src/controls/ApplicationWindow.qml @@ -149,8 +149,24 @@ Window { */ readonly property real __qwindowsize_max: (1 << 24) - 1 - width: contentArea.__noImplicitWidthGiven ? 0 : Math.min(Math.max(minimumWidth, contentArea.implicitWidth), maximumWidth) - height: contentArea.__noImplicitHeightGiven ? 0 : Math.min(Math.max(minimumHeight, contentArea.implicitHeight + __topBottomMargins), maximumHeight) + /*! \internal */ + property real __width: 0 + Binding { + target: root + property: "__width" + when: root.minimumWidth <= root.maximumWidth + value: Math.max(Math.min(root.maximumWidth, contentArea.implicitWidth), root.minimumWidth) + } + /*! \internal */ + property real __height: 0 + Binding { + target: root + property: "__height" + when: root.minimumHeight <= root.maximumHeight + value: Math.max(Math.min(root.maximumHeight, contentArea.implicitHeight), root.minimumHeight) + } + width: contentArea.__noImplicitWidthGiven ? 0 : __width + height: contentArea.__noImplicitHeightGiven ? 0 : __height minimumWidth: contentArea.__noMinimumWidthGiven ? 0 : contentArea.minimumWidth minimumHeight: contentArea.__noMinimumHeightGiven ? 0 : (contentArea.minimumHeight + __topBottomMargins) diff --git a/src/controls/Calendar.qml b/src/controls/Calendar.qml index 07e9b4ad..5b56dc76 100644 --- a/src/controls/Calendar.qml +++ b/src/controls/Calendar.qml @@ -156,11 +156,12 @@ Control { } /*! - This property determines the visibility of the grid. + This property determines the visibility of the frame + surrounding the calendar. The default value is \c true. */ - property bool gridVisible: true + property bool frameVisible: true /*! This property determines the visibility of week numbers. @@ -216,6 +217,8 @@ Control { Emitted when the mouse hovers over a valid date in the calendar. \a date is the date that was hovered over. + + The corresponding handler is \c onHovered. */ signal hovered(date date) @@ -227,6 +230,8 @@ Control { This is also emitted when dragging the mouse to another date while it is pressed. \a date is the date that the mouse was pressed on. + + The corresponding handler is \c onPressed. */ signal pressed(date date) @@ -236,6 +241,8 @@ Control { Emitted when the mouse is released over a valid date in the calendar. \a date is the date that the mouse was released over. + + The corresponding handler is \c onReleased. */ signal released(date date) @@ -245,6 +252,8 @@ Control { Emitted when the mouse is clicked on a valid date in the calendar. \a date is the date that the mouse was clicked on. + + The corresponding handler is \c onClicked. */ signal clicked(date date) @@ -254,6 +263,8 @@ Control { Emitted when the mouse is double-clicked on a valid date in the calendar. \a date is the date that the mouse was double-clicked on. + + The corresponding handler is \c onDoubleClicked. */ signal doubleClicked(date date) diff --git a/src/controls/CheckBox.qml b/src/controls/CheckBox.qml index 00671755..e96e64fd 100644 --- a/src/controls/CheckBox.qml +++ b/src/controls/CheckBox.qml @@ -132,6 +132,13 @@ AbstractCheckable { */ property bool __ignoreChecked: false + /*! + \internal + True if onCheckedStateChanged should be ignored because we were reacting + to onCheckedChanged. + */ + property bool __ignoreCheckedState: false + style: Qt.createComponent(Settings.style + "/CheckBoxStyle.qml", checkBox) activeFocusOnTab: true @@ -142,8 +149,11 @@ AbstractCheckable { __cycleStatesHandler: __cycleCheckBoxStates onCheckedChanged: { - if (!__ignoreChecked) + if (!__ignoreChecked) { + __ignoreCheckedState = true; checkedState = checked ? Qt.Checked : Qt.Unchecked; + __ignoreCheckedState = false; + } } onCheckedStateChanged: { @@ -151,7 +161,7 @@ AbstractCheckable { if (checkedState === Qt.PartiallyChecked) { partiallyCheckedEnabled = true; checked = false; - } else { + } else if (!__ignoreCheckedState) { checked = checkedState === Qt.Checked; } __ignoreChecked = false; diff --git a/src/controls/ComboBox.qml b/src/controls/ComboBox.qml index f3cde537..5ce5bf07 100644 --- a/src/controls/ComboBox.qml +++ b/src/controls/ComboBox.qml @@ -245,6 +245,8 @@ Control { \note If there is a \l validator set on the combobox, the signal will only be emitted if the input is in an acceptable state. + + The corresponding handler is \c onAccepted. */ signal accepted @@ -257,6 +259,8 @@ Control { This signal is similar to currentIndex changed, but will only be emitted if the combo box index was changed by the user and not when set programatically. + + The corresponding handler is \c onActivated. */ signal activated(int index) diff --git a/src/controls/Label.qml b/src/controls/Label.qml index 8a102011..658772a8 100644 --- a/src/controls/Label.qml +++ b/src/controls/Label.qml @@ -81,7 +81,7 @@ Text { */ id: label - color: pal.text + color: pal.windowText activeFocusOnTab: false renderType: Text.NativeRendering SystemPalette { diff --git a/src/controls/Private/ColumnMenuContent.qml b/src/controls/Private/ColumnMenuContent.qml index 5a56b007..40fc907b 100644 --- a/src/controls/Private/ColumnMenuContent.qml +++ b/src/controls/Private/ColumnMenuContent.qml @@ -63,31 +63,96 @@ Item { readonly property int currentIndex: __menu.__currentIndex property Item currentItem: null - readonly property int itemHeight: (list.count > 0 && list.contentItem.children[0]) ? list.contentItem.children[0].height : 23 + property int itemHeight: 23 + + Component.onCompleted: { + var children = list.contentItem.children + for (var i = 0; i < list.count; i++) { + var child = children[i] + if (child.visible && child.styleData.type === MenuItemType.Item) { + itemHeight = children[i].height + break + } + } + } + readonly property int fittingItems: Math.floor((maxHeight - downScroller.height) / itemHeight) readonly property real fittedMaxHeight: itemHeight * fittingItems + downScroller.height readonly property bool shouldUseScrollers: scrollView.style === emptyScrollerStyle && itemsModel.length > fittingItems readonly property real upScrollerHeight: upScroller.visible ? upScroller.height : 0 readonly property real downScrollerHeight: downScroller.visible ? downScroller.height : 0 + property var oldMousePos: undefined + property var openedSubmenu: null function updateCurrentItem(mouse) { var pos = mapToItem(list.contentItem, mouse.x, mouse.y) + var dx = 0 + var dy = 0 + var dist = 0 + if (openedSubmenu && oldMousePos !== undefined) { + dx = mouse.x - oldMousePos.x + dy = mouse.y - oldMousePos.y + dist = Math.sqrt(dx * dx + dy * dy) + } + oldMousePos = mouse + if (openedSubmenu && dist > 5) { + var menuRect = __menu.__popupGeometry + var submenuRect = openedSubmenu.__popupGeometry + var angle = Math.atan2(dy, dx) + var ds = 0 + if (submenuRect.x > menuRect.x) { + ds = menuRect.width - oldMousePos.x + } else { + angle = Math.PI - angle + ds = oldMousePos.x + } + var above = submenuRect.y - menuRect.y - oldMousePos.y + var below = submenuRect.height - above + var minAngle = Math.atan2(above, ds) + var maxAngle = Math.atan2(below, ds) + // This tests that the current mouse position is in + // the triangle defined by the previous mouse position + // and the submenu's top-left and bottom-left corners. + if (minAngle < angle && angle < maxAngle) { + sloppyTimer.start() + return + } + } + if (!currentItem || !currentItem.contains(Qt.point(pos.x - currentItem.x, pos.y - currentItem.y))) { if (currentItem && !hoverArea.pressed - && currentItem.styleData.type === MenuItemType.Menu) + && currentItem.styleData.type === MenuItemType.Menu) { currentItem.__closeSubMenu() + openedSubmenu = null + } currentItem = list.itemAt(pos.x, pos.y) if (currentItem) { __menu.__currentIndex = currentItem.__menuItemIndex if (currentItem.styleData.type === MenuItemType.Menu - && !currentItem.__menuItem.__popupVisible) + && !currentItem.__menuItem.__popupVisible) { currentItem.__showSubMenu(false) + openedSubmenu = currentItem.__menuItem + } } else { __menu.__currentIndex = -1 } } } + Timer { + id: sloppyTimer + interval: 1000 + + // Stop timer as soon as we hover one of the submenu items + property int currentIndex: openedSubmenu ? openedSubmenu.__currentIndex : -1 + onCurrentIndexChanged: if (currentIndex !== -1) stop() + + onTriggered: { + if (openedSubmenu && openedSubmenu.__currentIndex === -1) + updateCurrentItem(oldMousePos) + } + } + Component { id: emptyScrollerStyle Style { @@ -130,7 +195,8 @@ Item { hoverEnabled: true acceptedButtons: Qt.AllButtons - onPositionChanged: updateCurrentItem(mouse) + onPositionChanged: updateCurrentItem({ "x": mouse.x, "y": mouse.y }) + onPressed: updateCurrentItem({ "x": mouse.x, "y": mouse.y }) onReleased: content.triggered(currentItem) onExited: { if (currentItem && !currentItem.__menuItem.__popupVisible) { diff --git a/src/controls/Private/ContentItem.qml b/src/controls/Private/ContentItem.qml index dbb4a50e..edfd309d 100644 --- a/src/controls/Private/ContentItem.qml +++ b/src/controls/Private/ContentItem.qml @@ -45,8 +45,8 @@ Item { id: contentItem property real minimumWidth: __calcMinimum('Width') property real minimumHeight: __calcMinimum('Height') - property real maximumWidth: __calcMaximum('Width') - property real maximumHeight: __calcMaximum('Height') + property real maximumWidth: Number.POSITIVE_INFINITY + property real maximumHeight: Number.POSITIVE_INFINITY implicitWidth: __calcImplicitWidth() implicitHeight: __calcImplicitHeight() diff --git a/src/controls/Private/HoverButton.qml b/src/controls/Private/HoverButton.qml new file mode 100644 index 00000000..1b79e087 --- /dev/null +++ b/src/controls/Private/HoverButton.qml @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 + +Item { + id: button + property alias source: image.source + signal clicked + + Rectangle { + id: fillRect + anchors.fill: parent + color: "black" + opacity: mouse.pressed ? 0.07 : mouse.containsMouse ? 0.02 : 0.0 + } + + Rectangle { + border.color: gridColor + anchors.fill: parent + anchors.margins: -1 + color: "transparent" + opacity: fillRect.opacity * 10 + } + + Image { + id: image + width: implicitWidth/2 + height: implicitHeight/2 + anchors.centerIn: parent + opacity: 0.6 + } + + MouseArea { + id: mouse + anchors.fill: parent + onClicked: button.clicked() + hoverEnabled: true + } +} diff --git a/src/controls/Private/MenuContentItem.qml b/src/controls/Private/MenuContentItem.qml index d5d6f69d..f55077a0 100644 --- a/src/controls/Private/MenuContentItem.qml +++ b/src/controls/Private/MenuContentItem.qml @@ -212,11 +212,16 @@ Loader { Timer { id: openMenuTimer - interval: 50 + interval: d.style.submenuPopupDelay onTriggered: menuItemLoader.__showSubMenu(true) } - function __closeSubMenu() { closeMenuTimer.start() } + function __closeSubMenu() { + if (openMenuTimer.running) + openMenuTimer.stop() + else if (__menuItem.__popupVisible) + closeMenuTimer.start() + } Timer { id: closeMenuTimer diff --git a/src/controls/Private/TabBar.qml b/src/controls/Private/TabBar.qml index 06bcc2be..6dc98d1a 100644 --- a/src/controls/Private/TabBar.qml +++ b/src/controls/Private/TabBar.qml @@ -222,6 +222,7 @@ FocusScope { readonly property alias enabled: tabitem.enabled readonly property bool activeFocus: tabbar.activeFocus readonly property real availableWidth: tabbar.availableWidth + readonly property real totalWidth: tabrow.contentWidth } sourceComponent: loader.item ? loader.item.tab : null diff --git a/src/controls/Private/private.pri b/src/controls/Private/private.pri index 49227c9d..f9446854 100644 --- a/src/controls/Private/private.pri +++ b/src/controls/Private/private.pri @@ -53,6 +53,7 @@ PRIVATE_QML_FILES += \ $$PWD/MenuContentItem.qml \ $$PWD/MenuContentScroller.qml \ $$PWD/ContentItem.qml \ + $$PWD/HoverButton.qml \ $$PWD/qmldir QML_FILES += $$PRIVATE_QML_FILES diff --git a/src/controls/Private/qmldir b/src/controls/Private/qmldir index 99740190..d31483e3 100644 --- a/src/controls/Private/qmldir +++ b/src/controls/Private/qmldir @@ -23,4 +23,5 @@ MenuContentItem 1.0 MenuContentItem.qml MenuContentScroller 1.0 MenuContentScroller.qml ColumnMenuContent 1.0 ColumnMenuContent.qml ContentItem 1.0 ContentItem.qml +HoverButton 1.0 HoverButton.qml singleton TextSingleton 1.0 TextSingleton.qml diff --git a/src/controls/Private/qquickcontrolsettings.cpp b/src/controls/Private/qquickcontrolsettings.cpp index d89ffc1e..e1d0cabb 100644 --- a/src/controls/Private/qquickcontrolsettings.cpp +++ b/src/controls/Private/qquickcontrolsettings.cpp @@ -45,6 +45,8 @@ #include <qqmlengine.h> #include <qdir.h> #include <QTouchDevice> +#include <QGuiApplication> +#include <QStyleHints> QT_BEGIN_NAMESPACE @@ -175,5 +177,10 @@ qreal QQuickControlSettings::dpiScaleFactor() const return 1.0; } +qreal QQuickControlSettings::dragThreshold() const +{ + return qApp->styleHints()->startDragDistance(); +} + QT_END_NAMESPACE diff --git a/src/controls/Private/qquickcontrolsettings_p.h b/src/controls/Private/qquickcontrolsettings_p.h index 2b36e662..0687e209 100644 --- a/src/controls/Private/qquickcontrolsettings_p.h +++ b/src/controls/Private/qquickcontrolsettings_p.h @@ -56,6 +56,7 @@ class QQuickControlSettings : public QObject Q_PROPERTY(QString styleName READ styleName WRITE setStyleName NOTIFY styleNameChanged) Q_PROPERTY(QString stylePath READ stylePath WRITE setStylePath NOTIFY stylePathChanged) Q_PROPERTY(qreal dpiScaleFactor READ dpiScaleFactor CONSTANT) + Q_PROPERTY(qreal dragThreshold READ dragThreshold CONSTANT) Q_PROPERTY(bool hasTouchScreen READ hasTouchScreen CONSTANT) public: @@ -70,6 +71,7 @@ public: void setStylePath(const QString &path); qreal dpiScaleFactor() const; + qreal dragThreshold() const; bool hasTouchScreen() const; diff --git a/src/controls/Private/qquickstyleitem.cpp b/src/controls/Private/qquickstyleitem.cpp index 958adbdd..49baa1fd 100644 --- a/src/controls/Private/qquickstyleitem.cpp +++ b/src/controls/Private/qquickstyleitem.cpp @@ -264,6 +264,8 @@ void QQuickStyleItem::initStyleOption() (sizeHint == "small") ? QPlatformTheme::SmallFont : QPlatformTheme::SystemFont; + bool needsResolvePalette = true; + switch (m_itemType) { case Button: { if (!m_styleoption) @@ -330,6 +332,8 @@ void QQuickStyleItem::initStyleOption() opt->features = QStyleOptionViewItem::HasDisplay; opt->text = text(); opt->textElideMode = Qt::ElideRight; + resolvePalette(); + needsResolvePalette = false; QPalette pal = m_styleoption->palette; pal.setBrush(QPalette::Base, Qt::NoBrush); m_styleoption->palette = pal; @@ -345,6 +349,7 @@ void QQuickStyleItem::initStyleOption() QStyleOptionHeader *opt = qstyleoption_cast<QStyleOptionHeader*>(m_styleoption); opt->text = text(); + opt->textAlignment = static_cast<Qt::AlignmentFlag>(m_properties.value("textalignment").toInt()); opt->sortIndicator = activeControl() == "down" ? QStyleOptionHeader::SortDown : activeControl() == "up" ? @@ -714,6 +719,9 @@ void QQuickStyleItem::initStyleOption() if (!m_styleoption) m_styleoption = new QStyleOption(); + if (needsResolvePalette) + resolvePalette(); + m_styleoption->styleObject = this; m_styleoption->direction = qApp->layoutDirection(); @@ -755,6 +763,62 @@ void QQuickStyleItem::initStyleOption() } +void QQuickStyleItem::resolvePalette() +{ + QPlatformTheme::Palette paletteType = QPlatformTheme::SystemPalette; + switch (m_itemType) { + case Button: + paletteType = QPlatformTheme::ButtonPalette; + break; + case RadioButton: + paletteType = QPlatformTheme::RadioButtonPalette; + break; + case CheckBox: + paletteType = QPlatformTheme::CheckBoxPalette; + break; + case ComboBox: + case ComboBoxItem: + paletteType = QPlatformTheme::ComboBoxPalette; + break; + case ToolBar: + case ToolButton: + paletteType = QPlatformTheme::ToolButtonPalette; + break; + case Tab: + case TabFrame: + paletteType = QPlatformTheme::TabBarPalette; + break; + case Edit: + paletteType = QPlatformTheme::TextEditPalette; + break; + case GroupBox: + paletteType = QPlatformTheme::GroupBoxPalette; + break; + case Header: + paletteType = QPlatformTheme::HeaderPalette; + break; + case Item: + case ItemRow: + paletteType = QPlatformTheme::ItemViewPalette; + break; + case Menu: + case MenuItem: + paletteType = QPlatformTheme::MenuPalette; + break; + case MenuBar: + case MenuBarItem: + paletteType = QPlatformTheme::MenuBarPalette; + break; + default: + break; + } + + const QPalette *platformPalette = QGuiApplicationPrivate::platformTheme()->palette(paletteType); + if (platformPalette) + m_styleoption->palette = *platformPalette; + // Defaults to SystemPalette otherwise +} + /* * Property style * @@ -1124,11 +1188,9 @@ QVariant QQuickStyleItem::styleHint(const QString &metric) if (metric == "comboboxpopup") { return qApp->style()->styleHint(QStyle::SH_ComboBox_Popup, m_styleoption); } else if (metric == "highlightedTextColor") { - QPalette pal = QApplication::palette("QAbstractItemView"); - pal.setCurrentColorGroup(m_styleoption->palette.currentColorGroup()); - return pal.highlightedText().color().name(); + return m_styleoption->palette.highlightedText().color().name(); } else if (metric == "textColor") { - QPalette pal = qApp->palette(); + QPalette pal = m_styleoption->palette; pal.setCurrentColorGroup(active()? QPalette::Active : QPalette::Inactive); return pal.text().color().name(); } else if (metric == "focuswidget") { @@ -1144,9 +1206,11 @@ QVariant QQuickStyleItem::styleHint(const QString &metric) return qApp->style()->styleHint(QStyle::SH_ScrollBar_LeftClickAbsolutePosition); else if (metric == "activateItemOnSingleClick") return qApp->style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick); + else if (metric == "submenupopupdelay") + return qApp->style()->styleHint(QStyle::SH_Menu_SubMenuPopupDelay, m_styleoption); return 0; - // Add SH_Menu_SpaceActivatesItem, SH_Menu_SubMenuPopupDelay + // Add SH_Menu_SpaceActivatesItem } void QQuickStyleItem::setHints(const QVariantMap &str) @@ -1533,6 +1597,15 @@ void QQuickStyleItem::paint(QPainter *painter) painter->setPen(pen); } break; case SpinBox: +#ifdef Q_OS_MAC + // macstyle depends on the embedded qlineedit to fill the editfield background + if (style() == "mac") { + QRect editRect = qApp->style()->subControlRect(QStyle::CC_SpinBox, + qstyleoption_cast<QStyleOptionComplex*>(m_styleoption), + QStyle::SC_SpinBoxEditField); + painter->fillRect(editRect.adjusted(-1, -1, 1, 1), m_styleoption->palette.base()); + } +#endif qApp->style()->drawComplexControl(QStyle::CC_SpinBox, qstyleoption_cast<QStyleOptionComplex*>(m_styleoption), painter); @@ -1596,6 +1669,7 @@ void QQuickStyleItem::paint(QPainter *painter) frame.midLineWidth = 0; frame.rect = m_styleoption->rect; frame.styleObject = this; + frame.palette = m_styleoption->palette; qApp->style()->drawPrimitive(QStyle::PE_FrameMenu, &frame, painter); } } diff --git a/src/controls/Private/qquickstyleitem_p.h b/src/controls/Private/qquickstyleitem_p.h index a13cd4cc..8d296f25 100644 --- a/src/controls/Private/qquickstyleitem_p.h +++ b/src/controls/Private/qquickstyleitem_p.h @@ -192,6 +192,7 @@ public: void setContentHeight(int arg); virtual void initStyleOption (); + void resolvePalette(); Q_INVOKABLE qreal textWidth(const QString &); Q_INVOKABLE qreal textHeight(const QString &); diff --git a/src/controls/ScrollView.qml b/src/controls/ScrollView.qml index 7e616392..af6a077e 100644 --- a/src/controls/ScrollView.qml +++ b/src/controls/ScrollView.qml @@ -237,7 +237,7 @@ FocusScope { anchors.fill: parent property int acceleration: 40 - property int flickThreshold: 20 + property int flickThreshold: Settings.dragThreshold property real speedThreshold: 3 property real ignored: 0.001 // ## flick() does not work with 0 yVelocity property int maxFlick: 400 diff --git a/src/controls/Slider.qml b/src/controls/Slider.qml index e09fa1e1..c2869563 100644 --- a/src/controls/Slider.qml +++ b/src/controls/Slider.qml @@ -216,15 +216,11 @@ Control { MouseArea { id: mouseArea + anchors.fill: parent hoverEnabled: true - anchors.centerIn: parent - - preventStealing: true - - width: parent.width - height: parent.height - property int clickOffset: 0 + property real pressX: 0 + property real pressY: 0 function clamp ( val ) { return Math.max(range.positionAtMinimum, Math.min(range.positionAtMaximum, val)) @@ -234,6 +230,8 @@ Control { if (pressed && __horizontal) { var pos = clamp (mouse.x + clickOffset - fakeHandle.width/2) fakeHandle.x = pos + if (Math.abs(mouse.x - pressX) >= Settings.dragThreshold) + preventStealing = true } } @@ -241,6 +239,8 @@ Control { if (pressed && !__horizontal) { var pos = clamp (mouse.y + clickOffset- fakeHandle.height/2) fakeHandle.y = pos + if (Math.abs(mouse.y - pressY) >= Settings.dragThreshold) + preventStealing = true } } @@ -252,6 +252,8 @@ Control { if (fakeHandle.contains(Qt.point(point.x, point.y))) { clickOffset = __horizontal ? fakeHandle.width/2 - point.x : fakeHandle.height/2 - point.y } + pressX = mouse.x + pressY = mouse.y } onReleased: { @@ -260,6 +262,7 @@ Control { if (!slider.updateValueWhileDragging) range.position = __horizontal ? fakeHandle.x : fakeHandle.y; clickOffset = 0 + preventStealing = false } } diff --git a/src/controls/SpinBox.qml b/src/controls/SpinBox.qml index 8fc964a0..26ba41b0 100644 --- a/src/controls/SpinBox.qml +++ b/src/controls/SpinBox.qml @@ -172,6 +172,8 @@ Control { the control loses focus. Note that if there is a validator set on the control and enter/return is pressed, this signal will only be emitted if the validator returns an acceptable state. + + The corresponding handler is \c onEditingFinished. */ signal editingFinished() @@ -194,6 +196,9 @@ Control { /*! \internal */ property alias __text: input.text + /*! \internal */ + property alias __baselineOffset: input.baselineOffset + __styleData: QtObject { readonly property bool upEnabled: value != maximumValue; readonly property alias upHovered: mouseUp.containsMouse @@ -256,6 +261,7 @@ Control { horizontalAlignment: spinbox.horizontalAlignment verticalAlignment: __panel ? __panel.verticalAlignment : Qt.AlignVCenter selectByMouse: activeFocus || activeFocusOnPress + inputMethodHints: Qt.ImhFormattedNumbersOnly validator: SpinBoxValidator { id: validator diff --git a/src/controls/StackView.qml b/src/controls/StackView.qml index 2397e5e4..11e2d182 100644 --- a/src/controls/StackView.qml +++ b/src/controls/StackView.qml @@ -819,7 +819,7 @@ Item { /*! \internal */ function __resolveComponent(unknownObjectType, element) { - // We need this extra resolve function since we dont really + // We need this extra resolve function since we don't really // know what kind of object the user pushed. So we try to // figure it out by inspecting the object: if (unknownObjectType.hasOwnProperty("createObject")) { diff --git a/src/controls/Styles/Base/ButtonStyle.qml b/src/controls/Styles/Base/ButtonStyle.qml index 237b0df0..35f6bd9b 100644 --- a/src/controls/Styles/Base/ButtonStyle.qml +++ b/src/controls/Styles/Base/ButtonStyle.qml @@ -149,7 +149,7 @@ Style { renderType: Text.NativeRendering anchors.verticalCenter: parent.verticalCenter text: control.text - color: __syspal.text + color: __syspal.buttonText } } } diff --git a/src/controls/Styles/Base/CalendarStyle.qml b/src/controls/Styles/Base/CalendarStyle.qml index 40d03636..34f6eb05 100644 --- a/src/controls/Styles/Base/CalendarStyle.qml +++ b/src/controls/Styles/Base/CalendarStyle.qml @@ -77,9 +77,9 @@ import QtQuick.Controls.Private 1.0 \qml Calendar { anchors.centerIn: parent - gridVisible: false style: CalendarStyle { + gridVisible: false dayDelegate: Rectangle { gradient: Gradient { GradientStop { @@ -132,7 +132,14 @@ Style { /*! The color of the grid lines. */ - property color gridColor: "#f0f0f0" + property color gridColor: "#d3d3d3" + + /*! + This property determines the visibility of the grid. + + The default value is \c true. + */ + property bool gridVisible: true /*! \internal @@ -165,18 +172,29 @@ Style { Styles the bar at the top of the calendar that contains the next month/previous month buttons and the selected date label. */ - property Component navigationBar: Item { - height: 50 + property Component navigationBar: Rectangle { + height: 41 + color: "#f9f9f9" + + Rectangle { + color: Qt.rgba(1,1,1,0.6) + height: 1 + width: parent.width + } - Button { + Rectangle { + anchors.bottom: parent.bottom + height: 1 + width: parent.width + color: "#ddd" + } + HoverButton { id: previousMonth - width: parent.height * 0.6 + width: parent.height height: width - anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: (parent.height - height) / 2 - iconSource: "images/arrow-left.png" - + anchors.left: parent.left + source: "images/leftanglearrow.png" onClicked: control.showPreviousMonth() } Label { @@ -184,7 +202,6 @@ Style { text: styleData.title elide: Text.ElideRight horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter font.pointSize: 14 anchors.verticalCenter: parent.verticalCenter anchors.left: previousMonth.right @@ -192,15 +209,13 @@ Style { anchors.right: nextMonth.left anchors.rightMargin: 2 } - Button { + HoverButton { id: nextMonth - width: parent.height * 0.6 + width: parent.height height: width - anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.rightMargin: (parent.height - height) / 2 - iconSource: "images/arrow-right.png" - + anchors.right: parent.right + source: "images/rightanglearrow.png" onClicked: control.showNextMonth() } } @@ -232,18 +247,20 @@ Style { \endtable */ property Component dayDelegate: Rectangle { - color: styleData.date !== undefined && styleData.selected ? selectedDateColor : "white"/*"transparent"*/ - readonly property color sameMonthDateTextColor: "black" - readonly property color selectedDateColor: __syspal.highlight + anchors.fill: parent + anchors.margins: styleData.selected ? -1 : 0 + color: styleData.date !== undefined && styleData.selected ? selectedDateColor : "transparent" + readonly property color sameMonthDateTextColor: "#444" + readonly property color selectedDateColor: Qt.platform.os === "osx" ? "#3778d0" : __syspal.highlight readonly property color selectedDateTextColor: "white" - readonly property color differentMonthDateTextColor: Qt.darker("darkgrey", 1.4); + readonly property color differentMonthDateTextColor: "#bbb" readonly property color invalidDateColor: "#dddddd" - Label { id: dayDelegateText text: styleData.date.getDate() anchors.centerIn: parent horizontalAlignment: Text.AlignRight + font.pixelSize: Math.min(parent.height/3, parent.width/3) color: { var theColor = invalidDateColor; if (styleData.valid) { @@ -261,7 +278,7 @@ Style { The delegate that styles each weekday. */ property Component dayOfWeekDelegate: Rectangle { - color: "white" + color: gridVisible ? "#fcfcfc" : "transparent" Label { text: control.__locale.dayName(styleData.dayOfWeek, control.dayOfWeekFormat) anchors.centerIn: parent @@ -272,10 +289,10 @@ Style { The delegate that styles each week number. */ property Component weekNumberDelegate: Rectangle { - color: "white" Label { text: styleData.weekNumber anchors.centerIn: parent + color: "#444" } } @@ -295,8 +312,8 @@ Style { readonly property int columns: CalendarUtils.daysInAWeek // The combined available width and height to be shared amongst each cell. - readonly property real availableWidth: (viewContainer.width - (control.gridVisible ? __gridLineWidth : 0)) - readonly property real availableHeight: (viewContainer.height - (control.gridVisible ? __gridLineWidth : 0)) + readonly property real availableWidth: (viewContainer.width - (control.frameVisible ? 2 * __gridLineWidth : 0)) + readonly property real availableHeight: (viewContainer.height - (control.frameVisible ? 2 * __gridLineWidth : 0)) property int hoveredCellIndex: -1 property int pressedCellIndex: -1 @@ -312,6 +329,7 @@ Style { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top + anchors.margins: control.frameVisible ? 1 : 0 sourceComponent: navigationBar property QtObject styleData: QtObject { @@ -322,10 +340,9 @@ Style { Row { id: dayOfWeekHeaderRow - spacing: (control.gridVisible ? __gridLineWidth : 0) anchors.top: navigationBarLoader.bottom anchors.left: parent.left - anchors.leftMargin: (control.weekNumbersVisible ? weekNumbersItem.width : 0) + (control.gridVisible ? __gridLineWidth : 0) + anchors.leftMargin: (control.weekNumbersVisible ? weekNumbersItem.width : 0) anchors.right: parent.right height: dayOfWeekHeaderRowHeight @@ -337,7 +354,7 @@ Style { Loader { id: dayOfWeekDelegateLoader sourceComponent: dayOfWeekDelegate - width: __cellRectAt(index).width - (control.gridVisible ? __gridLineWidth : 0) + width: __cellRectAt(index).width height: dayOfWeekHeaderRow.height readonly property var __dayOfWeek: dayOfWeek @@ -360,16 +377,15 @@ Style { visible: control.weekNumbersVisible width: 30 height: viewContainer.height - Repeater { id: weekNumberRepeater model: panelItem.weeksToShow Loader { id: weekNumberDelegateLoader - y: __cellRectAt(index * panelItem.columns).y + (control.gridVisible ? __gridLineWidth : 0) + y: __cellRectAt(index * panelItem.columns).y + (gridVisible ? __gridLineWidth : 0) width: weekNumbersItem.width - height: __cellRectAt(index * panelItem.columns).height - (control.gridVisible ? __gridLineWidth : 0) + height: __cellRectAt(index * panelItem.columns).height - (control.frameVisible ? __gridLineWidth : 0) sourceComponent: weekNumberDelegate readonly property int __index: index @@ -392,6 +408,17 @@ Style { } } } + Rectangle { + anchors.topMargin: - navigationBarLoader.height + anchors.top: parent.top + anchors.bottom: parent.bottom + + width: 1 + anchors.rightMargin: -1 + anchors.right: parent.right + color: gridColor + } + } // Contains the grid lines and the grid itself. @@ -402,23 +429,23 @@ Style { Repeater { id: verticalGridLineRepeater - model: panelItem.columns + 1 + model: panelItem.columns - 1 delegate: Rectangle { // The last line will be an invalid index, so we must handle it x: index < panelItem.columns - ? __cellRectAt(index).x - : __cellRectAt(panelItem.columns - 1).x + __cellRectAt(panelItem.columns - 1).width + ? __cellRectAt(index + 1).x + : __cellRectAt(panelItem.columns).x + __cellRectAt(panelItem.columns).width y: 0 width: __gridLineWidth height: viewContainer.height color: gridColor - visible: control.gridVisible + visible: gridVisible } } Repeater { id: horizontalGridLineRepeater - model: panelItem.rows + 1 + model: panelItem.rows delegate: Rectangle { x: 0 // The last line will be an invalid index, so we must handle it @@ -428,7 +455,7 @@ Style { width: viewContainer.width height: __gridLineWidth color: gridColor - visible: control.gridVisible + visible: gridVisible } } @@ -549,11 +576,11 @@ Style { delegate: Loader { id: delegateLoader - x: __cellRectAt(index).x + (control.gridVisible ? __gridLineWidth : 0) - y: __cellRectAt(index).y + (control.gridVisible ? __gridLineWidth : 0) - width: __cellRectAt(index).width - (control.gridVisible ? __gridLineWidth : 0) - height: __cellRectAt(index).height - (control.gridVisible ? __gridLineWidth : 0) - + x: __cellRectAt(index).x + (gridVisible ? __gridLineWidth : 0) + y: __cellRectAt(index).y + (gridVisible ? __gridLineWidth : 0) + width: __cellRectAt(index).width - (gridVisible ? __gridLineWidth : 0) + height: __cellRectAt(index).height - (gridVisible ? __gridLineWidth : 0) + z: styleData.selected ? 1 : 0 sourceComponent: dayDelegate readonly property int __index: index @@ -579,5 +606,12 @@ Style { } } } + Rectangle { + anchors.fill: parent + color: "transparent" + border.color: gridColor + visible: control.frameVisible + } + } } diff --git a/src/controls/Styles/Base/MenuStyle.qml b/src/controls/Styles/Base/MenuStyle.qml index bec8410b..67aed5e5 100644 --- a/src/controls/Styles/Base/MenuStyle.qml +++ b/src/controls/Styles/Base/MenuStyle.qml @@ -93,6 +93,9 @@ Style { /*! The amount of pixels by which a submenu popup overlaps horizontally its parent menu. */ property int submenuOverlap: 1 + /*! The number of milliseconds to wait before opening a submenu. */ + property int submenuPopupDelay: 200 + /*! Returns a rich-text string to render mnemonics for a given menu item. The mnemonic character is prefixed by an ampersand in the original string. diff --git a/src/controls/Styles/Base/ProgressBarStyle.qml b/src/controls/Styles/Base/ProgressBarStyle.qml index d8ff8140..d0fa9a35 100644 --- a/src/controls/Styles/Base/ProgressBarStyle.qml +++ b/src/controls/Styles/Base/ProgressBarStyle.qml @@ -70,6 +70,42 @@ import QtQuick.Controls.Private 1.0 } } \endqml + + Note that the example above is somewhat simplified and will not animate + an indeterminate progress bar. The following snippet demonstrates + how you can incorporate a custom animation for the indeterminate + state as well. + + \code + progress: Rectangle { + border.color: "steelblue" + color: "lightsteelblue" + + // Indeterminate animation by animating alternating stripes: + Item { + anchors.fill: parent + anchors.margins: 1 + visible: control.indeterminate + clip: true + Row { + Repeater { + Rectangle { + color: index % 2 ? "steelblue" : "lightsteelblue" + width: 20 ; height: control.height + } + model: control.width / 20 + 2 + } + XAnimator on x { + from: 0 ; to: -40 + loops: Animation.Infinite + running: control.indeterminate + } + } + } + } + \endcode + + */ Style { diff --git a/src/controls/Styles/Base/SpinBoxStyle.qml b/src/controls/Styles/Base/SpinBoxStyle.qml index 9cedf2b9..183b36b8 100644 --- a/src/controls/Styles/Base/SpinBoxStyle.qml +++ b/src/controls/Styles/Base/SpinBoxStyle.qml @@ -142,6 +142,7 @@ Style { property Component background: Item { implicitHeight: Math.max(25, Math.round(styleData.contentHeight * 1.2)) implicitWidth: styleData.contentWidth + padding.left + padding.right + baselineOffset: control.__baselineOffset Rectangle { anchors.fill: parent anchors.bottomMargin: -1 @@ -166,6 +167,7 @@ Style { id: styleitem implicitWidth: backgroundLoader.implicitWidth implicitHeight: backgroundLoader.implicitHeight + baselineOffset: backgroundLoader.item ? backgroundLoader.item.baselineOffset : 0 property color foregroundColor: spinboxStyle.textColor property color selectionColor: spinboxStyle.selectionColor diff --git a/src/controls/Styles/Base/SwitchStyle.qml b/src/controls/Styles/Base/SwitchStyle.qml index 68796645..94e86270 100644 --- a/src/controls/Styles/Base/SwitchStyle.qml +++ b/src/controls/Styles/Base/SwitchStyle.qml @@ -125,9 +125,9 @@ Style { implicitWidth: Math.round(grooveLoader.width + padding.left + padding.right) implicitHeight: grooveLoader.implicitHeight + padding.top + padding.bottom - property var __groove: grooveLoader property var __handle: handleLoader - property bool enableAnimation: false + property int min: padding.left + property int max: grooveLoader.width - handleLoader.width - padding.right Loader { id: grooveLoader @@ -142,6 +142,9 @@ Style { id: handleLoader z:1 + + x: control.checked ? max : min + anchors.top: grooveLoader.top anchors.bottom: grooveLoader.bottom anchors.topMargin: padding.top @@ -149,7 +152,7 @@ Style { Behavior on x { id: behavior - enabled: enableAnimation + enabled: handleLoader.status === Loader.Ready NumberAnimation { duration: 150 easing.type: Easing.OutCubic diff --git a/src/controls/Styles/Base/TabViewStyle.qml b/src/controls/Styles/Base/TabViewStyle.qml index ce00da5f..448a2feb 100644 --- a/src/controls/Styles/Base/TabViewStyle.qml +++ b/src/controls/Styles/Base/TabViewStyle.qml @@ -132,6 +132,7 @@ Style { \row \li readonly property bool \b styleData.enabled \li The tab is enabled. (since QtQuick.Controls.Styles 1.2) \row \li readonly property bool \b styleData.activeFocus \li The tab button has keyboard focus. \row \li readonly property bool \b styleData.availableWidth \li The available width for the tabs. + \row \li readonly property bool \b styleData.totalWidth \li The total width of the tabs. (since QtQuick.Controls.Styles 1.2) \endtable */ property Component tab: Item { diff --git a/src/controls/Styles/Base/TableViewStyle.qml b/src/controls/Styles/Base/TableViewStyle.qml index 512b0cfe..0c01cfee 100644 --- a/src/controls/Styles/Base/TableViewStyle.qml +++ b/src/controls/Styles/Base/TableViewStyle.qml @@ -87,7 +87,7 @@ ScrollViewStyle { id: textItem anchors.fill: parent verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignLeft + horizontalAlignment: styleData.textAlignment anchors.leftMargin: 12 text: styleData.value elide: Text.ElideRight diff --git a/src/controls/Styles/Base/TextFieldStyle.qml b/src/controls/Styles/Base/TextFieldStyle.qml index 4713130f..1b732cee 100644 --- a/src/controls/Styles/Base/TextFieldStyle.qml +++ b/src/controls/Styles/Base/TextFieldStyle.qml @@ -116,6 +116,7 @@ Style { property Component background: Item { implicitWidth: Math.round(control.__contentHeight * 8) implicitHeight: Math.max(25, Math.round(control.__contentHeight * 1.2)) + baselineOffset: control.__baselineOffset Rectangle { anchors.fill: parent anchors.bottomMargin: -1 @@ -150,6 +151,7 @@ Style { implicitWidth: backgroundLoader.implicitWidth ? backgroundLoader.implicitWidth : 100 implicitHeight: backgroundLoader.implicitHeight ? backgroundLoader.implicitHeight : 20 + baselineOffset: backgroundLoader.item ? padding.top + backgroundLoader.item.baselineOffset : 0 property color placeholderTextColor: style.placeholderTextColor property font font: style.font diff --git a/src/controls/Styles/Base/images/leftanglearrow.png b/src/controls/Styles/Base/images/leftanglearrow.png Binary files differnew file mode 100644 index 00000000..d4e85ae0 --- /dev/null +++ b/src/controls/Styles/Base/images/leftanglearrow.png diff --git a/src/controls/Styles/Base/images/rightanglearrow.png b/src/controls/Styles/Base/images/rightanglearrow.png Binary files differnew file mode 100644 index 00000000..a8157538 --- /dev/null +++ b/src/controls/Styles/Base/images/rightanglearrow.png diff --git a/src/controls/Styles/Desktop/ComboBoxStyle.qml b/src/controls/Styles/Desktop/ComboBoxStyle.qml index 613bba04..12376ff7 100644 --- a/src/controls/Styles/Desktop/ComboBoxStyle.qml +++ b/src/controls/Styles/Desktop/ComboBoxStyle.qml @@ -87,6 +87,7 @@ Style { property Component __dropDownStyle: Style { property int __maxPopupHeight: 600 property int submenuOverlap: 0 + property int submenuPopupDelay: 0 property Component frame: StyleItem { elementType: "frame" diff --git a/src/controls/Styles/Desktop/MenuBarStyle.qml b/src/controls/Styles/Desktop/MenuBarStyle.qml index c032a7c0..6135bbdb 100644 --- a/src/controls/Styles/Desktop/MenuBarStyle.qml +++ b/src/controls/Styles/Desktop/MenuBarStyle.qml @@ -44,30 +44,38 @@ import QtQuick.Controls.Private 1.0 import "." as Desktop Style { + id: styleRoot + property Component background: StyleItem { elementType: "menubar" - width: implicitWidth + 2 * (pixelMetric("menubarhmargin") + pixelMetric("menubarpanelwidth")) - height: implicitHeight + 2 * (pixelMetric("menubarvmargin") + pixelMetric("menubarpanelwidth")) - + pixelMetric("spacebelowmenubar") Accessible.role: Accessible.MenuBar + + Component.onCompleted: { + styleRoot.padding.left = pixelMetric("menubarhmargin") + pixelMetric("menubarpanelwidth") + styleRoot.padding.right = pixelMetric("menubarhmargin") + pixelMetric("menubarpanelwidth") + styleRoot.padding.top = pixelMetric("menubarvmargin") + pixelMetric("menubarpanelwidth") + styleRoot.padding.bottom = pixelMetric("menubarvmargin") + pixelMetric("menubarpanelwidth") + } } property Component itemDelegate: StyleItem { elementType: "menubaritem" text: styleData.text - contentWidth: textWidth(text) - contentHeight: textHeight(text) - width: implicitWidth + pixelMetric("menubaritemspacing") + property string plainText: StyleHelpers.removeMnemonics(text) + contentWidth: textWidth(plainText) + contentHeight: textHeight(plainText) + width: implicitWidth enabled: styleData.enabled sunken: styleData.open + selected: (parent && styleData.selected) || sunken hints: { "showUnderlined": styleData.underlineMnemonic } Accessible.role: Accessible.MenuItem - Accessible.name: StyleHelpers.removeMnemonics(text) + Accessible.name: plainText } property Component menuStyle: Desktop.MenuStyle { } diff --git a/src/controls/Styles/Desktop/MenuStyle.qml b/src/controls/Styles/Desktop/MenuStyle.qml index b44dd70d..6cf67b1c 100644 --- a/src/controls/Styles/Desktop/MenuStyle.qml +++ b/src/controls/Styles/Desktop/MenuStyle.qml @@ -49,15 +49,12 @@ Style { property string __menuItemType: "menuitem" property int submenuOverlap: 0 + property int submenuPopupDelay: 0 property int __maxPopupHeight: 0 property Component frame: StyleItem { elementType: "menu" - contentWidth: parent ? Math.round(parent.contentWidth) : 0 - contentHeight: parent ? Math.round(parent.contentHeight) : 0 - width: implicitWidth + 2 * (pixelMetric("menuhmargin") + pixelMetric("menupanelwidth")) - height: implicitHeight + 2 * (pixelMetric("menuvmargin") + pixelMetric("menupanelwidth")) Rectangle { visible: anchors.margins > 0 anchors { @@ -69,16 +66,16 @@ Style { Accessible.role: Accessible.PopupMenu - Binding { - target: styleRoot - property: "submenuOverlap" - value: 2 * pixelMetric("menupanelwidth") - } - - Binding { - target: styleRoot - property: "margin" - value: pixelMetric("menuvmargin") + pixelMetric("menupanelwidth") + Component.onCompleted: { + var menuHMargin = pixelMetric("menuhmargin") + var menuVMargin = pixelMetric("menuvmargin") + var menuPanelWidth = pixelMetric("menupanelwidth") + styleRoot.padding.left = menuHMargin + menuPanelWidth + styleRoot.padding.right = menuHMargin + menuPanelWidth + styleRoot.padding.top = menuVMargin + menuPanelWidth + styleRoot.padding.bottom = menuVMargin + menuPanelWidth + styleRoot.submenuOverlap = 2 * menuPanelWidth + styleRoot.submenuPopupDelay = styleHint("submenupopupdelay") } // ### The Screen attached property can only be set on an Item, diff --git a/src/controls/Styles/Desktop/TableViewStyle.qml b/src/controls/Styles/Desktop/TableViewStyle.qml index 88611ab5..b9891b31 100644 --- a/src/controls/Styles/Desktop/TableViewStyle.qml +++ b/src/controls/Styles/Desktop/TableViewStyle.qml @@ -75,7 +75,7 @@ ScrollViewStyle { text: styleData.value hover: styleData.containsMouse hints: control.styleHints - properties: {"headerpos": headerPosition} + properties: {"headerpos": headerPosition, "textalignment": styleData.textAlignment} property string itemSort: (control.sortIndicatorVisible && styleData.column === control.sortIndicatorColumn) ? (control.sortIndicatorOrder == Qt.AscendingOrder ? "up" : "down") : ""; property string headerPosition: control.columnCount === 1 ? "only" : styleData.column === control.columnCount-1 ? "end" : diff --git a/src/controls/Styles/styles.pri b/src/controls/Styles/styles.pri index 9199dfc5..ddc867a5 100644 --- a/src/controls/Styles/styles.pri +++ b/src/controls/Styles/styles.pri @@ -75,6 +75,8 @@ STYLES_QML_FILES += \ $$PWD/Base/images/arrow-left@2x.png \ $$PWD/Base/images/arrow-right.png \ $$PWD/Base/images/arrow-right@2x.png \ + $$PWD/Base/images/leftanglearrow.png \ + $$PWD/Base/images/rightanglearrow.png \ $$PWD/Base/images/spinner_small.png \ $$PWD/Base/images/spinner_medium.png \ $$PWD/Base/images/spinner_large.png \ diff --git a/src/controls/Switch.qml b/src/controls/Switch.qml index bed46a84..668ee22f 100644 --- a/src/controls/Switch.qml +++ b/src/controls/Switch.qml @@ -102,10 +102,9 @@ Control { MouseArea { id: internal - property Item handle: __panel ? __panel.__handle : null - property int min: __style ? __style.padding.left : 0 - property int max: handle.parent.width - (handle ? handle.width : 0) - - ( __style ? __style.padding.right : 0) + property Item handle: __panel.__handle + property int min: __panel.min + property int max: __panel.max focus: true anchors.fill: parent drag.threshold: 0 @@ -129,11 +128,6 @@ Control { } } - Component.onCompleted: { - internal.handle.x = checked ? internal.max : internal.min - __panel.enableAnimation = true - } - onCheckedChanged: { if (internal.handle) internal.handle.x = checked ? internal.max : internal.min diff --git a/src/controls/TableView.qml b/src/controls/TableView.qml index 4a1f6a62..3eb73cf6 100644 --- a/src/controls/TableView.qml +++ b/src/controls/TableView.qml @@ -255,6 +255,8 @@ ScrollView { \a row int provides access to the activated row index. \note This signal is only emitted for mouse interaction that is not blocked in the row or item delegate. + + The corresponding handler is \c onActivated. */ signal activated(int row) @@ -265,6 +267,8 @@ ScrollView { \a row int provides access to the clicked row index. \note This signal is only emitted if the row or item delegate does not accept mouse events. + + The corresponding handler is \c onClicked. */ signal clicked(int row) @@ -275,6 +279,8 @@ ScrollView { \a row int provides access to the clicked row index. \note This signal is only emitted if the row or item delegate does not accept mouse events. + + The corresponding handler is \c onDoubleClicked. */ signal doubleClicked(int row) @@ -536,7 +542,7 @@ ScrollView { ListView { id: listView focus: true - activeFocusOnTab: true + activeFocusOnTab: root.activeFocusOnTab anchors.topMargin: tableHeader.height anchors.fill: parent currentIndex: -1 @@ -873,7 +879,7 @@ ScrollView { sourceComponent: columnItem.delegate ? columnItem.delegate : itemDelegate // these properties are exposed to the item delegate - readonly property var model: listView.model + readonly property var model: itemModel readonly property var modelData: itemModelData property QtObject styleData: QtObject { @@ -929,6 +935,7 @@ ScrollView { model: columnModel delegate: Item { + id: headerRowDelegate z:-index width: columnCount === 1 ? viewport.width + __verticalScrollBar.width : modelData.width implicitWidth: headerStyle.implicitWidth @@ -974,7 +981,7 @@ ScrollView { onPositionChanged: { if (modelData.movable && pressed && columnCount > 1) { // only do this while dragging for (var h = columnCount-1 ; h >= 0 ; --h) { - if (drag.target.x > headerrow.children[h].x) { + if (drag.target.x + listView.contentX + headerRowDelegate.width/2 > headerrow.children[h].x) { repeater.targetIndex = h break } @@ -984,7 +991,6 @@ ScrollView { onPressed: { repeater.dragIndex = index - draghandle.x = parent.x } onReleased: { @@ -1012,8 +1018,8 @@ ScrollView { readonly property int column: index readonly property int textAlignment: modelData.horizontalAlignment } - parent: tableHeader + x: headerRowDelegate.x - listView.contentX width: modelData.width height: parent.height sourceComponent: root.headerDelegate diff --git a/src/controls/TextArea.qml b/src/controls/TextArea.qml index 751e7ce0..876a2270 100644 --- a/src/controls/TextArea.qml +++ b/src/controls/TextArea.qml @@ -383,6 +383,8 @@ ScrollView { This signal is emitted when the user clicks on a link embedded in the text. The link must be in rich text or HTML format and the \a link string provides access to the particular link. + + The corresponding handler is \c onLinkActivated. */ signal linkActivated(string link) @@ -395,6 +397,8 @@ ScrollView { \a link string provides access to the particular link. \sa hoveredLink + + The corresponding handler is \c onLinkHovered. */ signal linkHovered(string link) diff --git a/src/controls/TextField.qml b/src/controls/TextField.qml index b173c95d..7217caa2 100644 --- a/src/controls/TextField.qml +++ b/src/controls/TextField.qml @@ -401,6 +401,8 @@ Control { Note that if there is a \l validator or \l inputMask set on the text field, the signal will only be emitted if the input is in an acceptable state. + + The corresponding handler is \c onAccepted. */ signal accepted() @@ -413,6 +415,8 @@ Control { inputMask set on the text field and enter/return is pressed, this signal will only be emitted if the input follows the inputMask and the validator returns an acceptable state. + + The corresponding handler is \c onEditingFinished. */ signal editingFinished() @@ -549,6 +553,9 @@ Control { /*! \internal */ property alias __contentWidth: textInput.contentWidth + /*! \internal */ + property alias __baselineOffset: textInput.baselineOffset + style: Qt.createComponent(Settings.style + "/TextFieldStyle.qml", textInput) activeFocusOnTab: true diff --git a/src/controls/doc/src/qtquickcontrols.qdoc b/src/controls/doc/src/qtquickcontrols.qdoc index 05d9593a..bc18bbb8 100644 --- a/src/controls/doc/src/qtquickcontrols.qdoc +++ b/src/controls/doc/src/qtquickcontrols.qdoc @@ -26,7 +26,7 @@ ****************************************************************************/ /*! - \qmlmodule QtQuick.Controls 1.1 + \qmlmodule QtQuick.Controls 1.2 \title Qt Quick Controls QML Types \ingroup qmlmodules \brief Provides QML types for user interfaces. @@ -41,7 +41,7 @@ following import statement in your .qml file. \code - import QtQuick.Controls 1.1 + import QtQuick.Controls 1.2 \endcode */ diff --git a/src/controls/qquickaction.cpp b/src/controls/qquickaction.cpp index 3c4bfed6..541e9a5d 100644 --- a/src/controls/qquickaction.cpp +++ b/src/controls/qquickaction.cpp @@ -178,6 +178,8 @@ QT_BEGIN_NAMESPACE Emitted when either the menu item or its bound action have been activated. Includes the object that triggered the event if relevant (e.g. a Button or MenuItem). You shouldn't need to emit this signal, use \l trigger() instead. + + The corresponding handler is \c onTriggered. */ /*! \qmlmethod Action::trigger(QObject *source) @@ -191,6 +193,8 @@ QT_BEGIN_NAMESPACE Emitted whenever a action's \l checked property changes. This usually happens at the same time as \l triggered. + + The corresponding handler is \c onToggled. */ QQuickAction::QQuickAction(QObject *parent) diff --git a/src/controls/qquickmenu.cpp b/src/controls/qquickmenu.cpp index 7aa52d56..bb4c79b6 100644 --- a/src/controls/qquickmenu.cpp +++ b/src/controls/qquickmenu.cpp @@ -398,6 +398,7 @@ void QQuickMenu::__popup(qreal x, qreal y, int atItemIndex) m_popupWindow->setItemAt(atItem ? atItem->visualItem() : 0); connect(m_popupWindow, SIGNAL(visibleChanged(bool)), this, SLOT(windowVisibleChanged(bool))); + connect(m_popupWindow, SIGNAL(geometryChanged()), this, SIGNAL(__popupGeometryChanged())); m_popupWindow->setPosition(x + m_xOffset, y + m_yOffset); m_popupWindow->show(); @@ -420,6 +421,14 @@ void QQuickMenu::setPopupVisible(bool v) } } +QRect QQuickMenu::popupGeometry() const +{ + if (!m_popupWindow || !m_popupVisible) + return QRect(); + + return m_popupWindow->geometry(); +} + void QQuickMenu::__closeMenu() { setPopupVisible(false); diff --git a/src/controls/qquickmenu_p.h b/src/controls/qquickmenu_p.h index c6bf24e2..85cc0107 100644 --- a/src/controls/qquickmenu_p.h +++ b/src/controls/qquickmenu_p.h @@ -74,6 +74,7 @@ class QQuickMenu : public QQuickMenuText Q_PROPERTY(qreal __xOffset READ xOffset WRITE setXOffset) Q_PROPERTY(qreal __yOffset READ yOffset WRITE setYOffset) Q_PROPERTY(QQuickAction *__action READ action CONSTANT) + Q_PROPERTY(QRect __popupGeometry READ popupGeometry NOTIFY __popupGeometryChanged) public: Q_INVOKABLE void popup(); @@ -99,6 +100,7 @@ Q_SIGNALS: void __selectedIndexChanged(); void __menuClosed(); void popupVisibleChanged(); + void __popupGeometryChanged(); void menuContentItemChanged(); void minimumWidthChanged(); @@ -134,6 +136,8 @@ public: bool isNative() { return m_platformMenu != 0; } + QRect popupGeometry() const; + protected Q_SLOTS: void updateSelectedIndex(); diff --git a/src/controls/qquickmenuitem.cpp b/src/controls/qquickmenuitem.cpp index 2f2f578f..0167bebd 100644 --- a/src/controls/qquickmenuitem.cpp +++ b/src/controls/qquickmenuitem.cpp @@ -342,6 +342,8 @@ void QQuickMenuText::updateIcon() Emitted when either the menu item or its bound action have been activated. \sa trigger(), Action::triggered, Action::toggled + + The corresponding handler is \c onTriggered. */ /*! \qmlmethod MenuItem::trigger() @@ -404,6 +406,8 @@ void QQuickMenuText::updateIcon() This usually happens at the same time as \l triggered. \sa checked, triggered, Action::triggered, Action::toggled + + The corresponding handler is \c onToggled. */ /*! @@ -426,6 +430,7 @@ QQuickMenuItem::QQuickMenuItem(QObject *parent) connect(action(), SIGNAL(shortcutChanged(QVariant)), this, SLOT(updateShortcut())); connect(action(), SIGNAL(triggered()), this, SIGNAL(triggered())); + connect(action(), SIGNAL(checkableChanged()), this, SLOT(updateCheckable())); connect(action(), SIGNAL(toggled(bool)), this, SLOT(updateChecked())); if (platformItem()) connect(platformItem(), SIGNAL(activated()), this, SLOT(trigger()), Qt::QueuedConnection); @@ -457,7 +462,7 @@ void QQuickMenuItem::bindToAction(QQuickAction *action) connect(m_boundAction, SIGNAL(enabledChanged()), this, SLOT(updateEnabled())); connect(m_boundAction, SIGNAL(textChanged()), this, SLOT(updateText())); connect(m_boundAction, SIGNAL(shortcutChanged(QVariant)), this, SLOT(updateShortcut())); - connect(m_boundAction, SIGNAL(checkableChanged()), this, SIGNAL(checkableChanged())); + connect(m_boundAction, SIGNAL(checkableChanged()), this, SLOT(updateCheckable())); connect(m_boundAction, SIGNAL(iconNameChanged()), this, SLOT(updateIcon())); connect(m_boundAction, SIGNAL(iconNameChanged()), this, SIGNAL(iconNameChanged())); connect(m_boundAction, SIGNAL(iconSourceChanged()), this, SLOT(updateIcon())); @@ -493,7 +498,7 @@ void QQuickMenuItem::unbindFromAction(QObject *o) disconnect(action, SIGNAL(enabledChanged()), this, SLOT(updateEnabled())); disconnect(action, SIGNAL(textChanged()), this, SLOT(updateText())); disconnect(action, SIGNAL(shortcutChanged(QVariant)), this, SLOT(updateShortcut())); - disconnect(action, SIGNAL(checkableChanged()), this, SIGNAL(checkableChanged())); + disconnect(action, SIGNAL(checkableChanged()), this, SLOT(updateCheckable())); disconnect(action, SIGNAL(iconNameChanged()), this, SLOT(updateIcon())); disconnect(action, SIGNAL(iconNameChanged()), this, SIGNAL(iconNameChanged())); disconnect(action, SIGNAL(iconSourceChanged()), this, SLOT(updateIcon())); @@ -512,12 +517,7 @@ void QQuickMenuItem::setBoundAction(QQuickAction *a) if (a == m_boundAction) return; - if (m_boundAction) { - if (m_boundAction->parent() == this) - delete m_boundAction; - else - unbindFromAction(m_boundAction); - } + unbindFromAction(m_boundAction); bindToAction(a); emit actionChanged(); @@ -592,6 +592,16 @@ void QQuickMenuItem::setCheckable(bool checkable) action()->setCheckable(checkable); } +void QQuickMenuItem::updateCheckable() +{ + if (platformItem()) { + platformItem()->setCheckable(checkable()); + syncWithPlatformMenu(); + } + + emit checkableChanged(); +} + bool QQuickMenuItem::checked() const { return action()->isChecked(); diff --git a/src/controls/qquickmenuitem_p.h b/src/controls/qquickmenuitem_p.h index a2e74d7f..bb1686f7 100644 --- a/src/controls/qquickmenuitem_p.h +++ b/src/controls/qquickmenuitem_p.h @@ -225,6 +225,7 @@ public: protected Q_SLOTS: void updateShortcut(); + void updateCheckable(); void updateChecked(); void bindToAction(QQuickAction *action); void unbindFromAction(QObject *action); diff --git a/src/controls/qquickmenupopupwindow.cpp b/src/controls/qquickmenupopupwindow.cpp index 1c2ea15c..ec33b0c1 100644 --- a/src/controls/qquickmenupopupwindow.cpp +++ b/src/controls/qquickmenupopupwindow.cpp @@ -117,6 +117,7 @@ void QQuickMenuPopupWindow::setGeometry(int posx, int posy, int w, int h) posy = qBound(g.top(), posy, g.bottom() - h); QQuickWindow::setGeometry(posx, posy, w, h); + emit geometryChanged(); } void QQuickMenuPopupWindow::updateSize() diff --git a/src/controls/qquickpopupwindow.cpp b/src/controls/qquickpopupwindow.cpp index 02c50a85..27f4b34a 100644 --- a/src/controls/qquickpopupwindow.cpp +++ b/src/controls/qquickpopupwindow.cpp @@ -54,6 +54,14 @@ QQuickPopupWindow::QQuickPopupWindow() : { setFlags(Qt::Popup); setModality(Qt::ApplicationModal); + connect(qApp, SIGNAL(applicationStateChanged(Qt::ApplicationState)), + this, SLOT(applicationStateChanged(Qt::ApplicationState))); +} + +void QQuickPopupWindow::applicationStateChanged(Qt::ApplicationState state) +{ + if (state != Qt::ApplicationActive) + dismissPopup(); } void QQuickPopupWindow::show() @@ -86,6 +94,7 @@ void QQuickPopupWindow::show() } else { setPosition(posx, posy); } + emit geometryChanged(); if (!qobject_cast<QQuickPopupWindow *>(transientParent())) // No need for parent menu windows if (QQuickWindow *w = qobject_cast<QQuickWindow *>(transientParent())) @@ -119,6 +128,7 @@ void QQuickPopupWindow::updateSize() { QSize contentSize = popupContentItem()->childrenRect().size().toSize(); setGeometry(x(), y(), contentSize.width(), contentSize.height()); + emit geometryChanged(); } void QQuickPopupWindow::dismissPopup() diff --git a/src/controls/qquickpopupwindow_p.h b/src/controls/qquickpopupwindow_p.h index 65ce01a0..d48a375e 100644 --- a/src/controls/qquickpopupwindow_p.h +++ b/src/controls/qquickpopupwindow_p.h @@ -70,6 +70,7 @@ public Q_SLOTS: Q_SIGNALS: void popupDismissed(); + void geometryChanged(); protected: void mousePressEvent(QMouseEvent *); @@ -80,6 +81,7 @@ protected: protected Q_SLOTS: void updateSize(); + void applicationStateChanged(Qt::ApplicationState state); private: void forwardEventToTransientParent(QMouseEvent *); diff --git a/src/dialogs/DefaultDialogWrapper.qml b/src/dialogs/DefaultDialogWrapper.qml index 673ffd6f..2cf157ab 100644 --- a/src/dialogs/DefaultDialogWrapper.qml +++ b/src/dialogs/DefaultDialogWrapper.qml @@ -57,8 +57,7 @@ AbstractDialog { property bool buttonsInSingleRow: contentItem.width >= buttonsRowImplicitWidth property real minimumHeight: implicitHeight property real minimumWidth: Screen.pixelDensity * 50 - implicitHeight: contentItem.implicitHeight + spacing + outerSpacing * 2 + - (buttonsInSingleRow ? moreButton.implicitHeight : moreButton.implicitHeight * 2 + spacing) + implicitHeight: contentItem.implicitHeight + spacing + outerSpacing * 2 + buttonsRight.implicitHeight implicitWidth: Math.min(Screen.desktopAvailableWidth * 0.9, Math.max( contentItem.implicitWidth, buttonsRowImplicitWidth, Screen.pixelDensity * 50) + outerSpacing * 2); color: palette.window @@ -103,7 +102,6 @@ AbstractDialog { Repeater { model: standardButtonsLeftModel - onCountChanged: calculateImplicitWidth() Button { text: standardButtonsLeftModel[index].text onClicked: root.click(standardButtonsLeftModel[index].standardButton) @@ -130,7 +128,6 @@ AbstractDialog { Repeater { model: standardButtonsRightModel - onCountChanged: calculateImplicitWidth() // TODO maybe: insert gaps if the button requires it (destructive buttons only) Button { text: standardButtonsRightModel[index].text @@ -140,7 +137,7 @@ AbstractDialog { } } function calculateImplicitWidth() { - if (buttonsRight.visibleChildren.length < 2) + if (standardButtonsRightModel.length < 2) return; var calcWidth = 0; @@ -160,5 +157,6 @@ AbstractDialog { calculateForButton(i, buttonsLeft.visibleChildren[i]) content.buttonsRowImplicitWidth = calcWidth + content.spacing } + onStandardButtonsChanged: calculateImplicitWidth() Component.onCompleted: calculateImplicitWidth() } diff --git a/src/dialogs/DefaultFontDialog.qml b/src/dialogs/DefaultFontDialog.qml index 25d71e92..881bf664 100644 --- a/src/dialogs/DefaultFontDialog.qml +++ b/src/dialogs/DefaultFontDialog.qml @@ -58,7 +58,7 @@ AbstractFontDialog { SystemPalette { id: palette } property int maxSize: Math.min(Screen.desktopAvailableWidth, Screen.desktopAvailableHeight) - implicitWidth: Math.min(maxSize, Math.max(Screen.pixelDensity * 60, mainLayout.implicitWidth)) + implicitWidth: Math.min(maxSize, Math.max(Screen.pixelDensity * 60, mainLayout.implicitWidth + outerSpacing * 2)) implicitHeight: Math.min(maxSize, Math.max(Screen.pixelDensity * 40, mainLayout.implicitHeight + outerSpacing * 2)) property real spacing: 6 property real outerSpacing: 12 diff --git a/src/dialogs/DefaultMessageDialog.qml b/src/dialogs/DefaultMessageDialog.qml index 36ec507f..0b46f9f3 100644 --- a/src/dialogs/DefaultMessageDialog.qml +++ b/src/dialogs/DefaultMessageDialog.qml @@ -69,6 +69,10 @@ AbstractMessageDialog { case Qt.Key_C: detailedText.copy() break + case Qt.Key_Period: + if (Qt.platform.os === "osx") + reject() + break } else switch (event.key) { case Qt.Key_Escape: case Qt.Key_Back: diff --git a/src/dialogs/plugin.cpp b/src/dialogs/plugin.cpp index 7c8c6bea..74672f65 100644 --- a/src/dialogs/plugin.cpp +++ b/src/dialogs/plugin.cpp @@ -41,6 +41,7 @@ #include <QtQml/qqml.h> #include <QtQml/qqmlextensionplugin.h> +#include <QtQml/qqmlcomponent.h> #include "qquickmessagedialog_p.h" #include "qquickabstractmessagedialog_p.h" #include "qquickdialogassets_p.h" diff --git a/src/dialogs/qquickabstractcolordialog_p.h b/src/dialogs/qquickabstractcolordialog_p.h index ad2c7ce1..ca6a433c 100644 --- a/src/dialogs/qquickabstractcolordialog_p.h +++ b/src/dialogs/qquickabstractcolordialog_p.h @@ -53,7 +53,6 @@ // We mean it. // -#include <QtQml> #include <QQuickView> #include <QtGui/qpa/qplatformdialoghelper.h> #include <qpa/qplatformtheme.h> diff --git a/src/dialogs/qquickabstractdialog_p.h b/src/dialogs/qquickabstractdialog_p.h index 5a408530..79283c19 100644 --- a/src/dialogs/qquickabstractdialog_p.h +++ b/src/dialogs/qquickabstractdialog_p.h @@ -53,7 +53,7 @@ // We mean it. // -#include <QtQml> +#include <QtQml/qqml.h> #include <QQuickView> #include <QtGui/qpa/qplatformdialoghelper.h> #include <qpa/qplatformtheme.h> diff --git a/src/dialogs/qquickabstractfiledialog_p.h b/src/dialogs/qquickabstractfiledialog_p.h index 0860ce36..412f418a 100644 --- a/src/dialogs/qquickabstractfiledialog_p.h +++ b/src/dialogs/qquickabstractfiledialog_p.h @@ -53,7 +53,6 @@ // We mean it. // -#include <QtQml> #include <QQuickView> #include <QtGui/qpa/qplatformdialoghelper.h> #include <qpa/qplatformtheme.h> diff --git a/src/dialogs/qquickabstractfontdialog_p.h b/src/dialogs/qquickabstractfontdialog_p.h index 2156eb79..d7ab1d47 100644 --- a/src/dialogs/qquickabstractfontdialog_p.h +++ b/src/dialogs/qquickabstractfontdialog_p.h @@ -53,7 +53,6 @@ // We mean it. // -#include <QtQml> #include <QQuickView> #include <QtGui/qpa/qplatformdialoghelper.h> #include <QtGui/qfont.h> diff --git a/src/dialogs/qquickabstractmessagedialog.cpp b/src/dialogs/qquickabstractmessagedialog.cpp index ebaed414..b13c5338 100644 --- a/src/dialogs/qquickabstractmessagedialog.cpp +++ b/src/dialogs/qquickabstractmessagedialog.cpp @@ -141,10 +141,10 @@ void QQuickAbstractMessageDialog::click(QPlatformDialogHelper::StandardButton bu emit buttonClicked(); switch (role) { case QPlatformDialogHelper::AcceptRole: - emit accept(); + accept(); break; case QPlatformDialogHelper::RejectRole: - emit reject(); + reject(); break; case QPlatformDialogHelper::DestructiveRole: emit discard(); diff --git a/src/dialogs/qquickabstractmessagedialog_p.h b/src/dialogs/qquickabstractmessagedialog_p.h index 3cf8ee47..de18cbe5 100644 --- a/src/dialogs/qquickabstractmessagedialog_p.h +++ b/src/dialogs/qquickabstractmessagedialog_p.h @@ -53,7 +53,6 @@ // We mean it. // -#include <QtQml> #include <QQuickView> #include <QtGui/qpa/qplatformdialoghelper.h> #include <qpa/qplatformtheme.h> @@ -124,7 +123,7 @@ Q_SIGNALS: void apply(); void reset(); -protected: +protected Q_SLOTS: void click(QPlatformDialogHelper::StandardButton button, QPlatformDialogHelper::ButtonRole); protected: diff --git a/src/dialogs/qquickcolordialog.cpp b/src/dialogs/qquickcolordialog.cpp index 58e35720..48935767 100644 --- a/src/dialogs/qquickcolordialog.cpp +++ b/src/dialogs/qquickcolordialog.cpp @@ -65,12 +65,16 @@ QT_BEGIN_NAMESPACE \qmlsignal QtQuick::Dialogs::AbstractColorDialog::accepted This signal is emitted by \l accept(). + + The corresponding handler is \c onAccepted. */ /*! \qmlsignal QtQuick::Dialogs::AbstractColorDialog::rejected This signal is emitted by \l reject(). + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/dialogs/qquickdialog.cpp b/src/dialogs/qquickdialog.cpp index 2af1bdc5..9e726ccd 100644 --- a/src/dialogs/qquickdialog.cpp +++ b/src/dialogs/qquickdialog.cpp @@ -41,6 +41,8 @@ #include "qquickdialog_p.h" #include <QQuickItem> +#include <QQmlEngine> +#include <QStandardPaths> #include <private/qguiapplication_p.h> QT_BEGIN_NAMESPACE @@ -62,12 +64,16 @@ QT_BEGIN_NAMESPACE \qmlsignal QtQuick::Dialogs::Dialog::accepted This signal is emitted by \l accept(). + + The corresponding handler is \c onAccepted. */ /*! \qmlsignal QtQuick::Dialogs::Dialog::rejected This signal is emitted by \l reject(). + + The corresponding handler is \c onRejected. */ /*! @@ -212,7 +218,7 @@ void QQuickDialog::click(QPlatformDialogHelper::StandardButton button, QPlatform emit reset(); break; default: - qWarning("unhandled MessageDialog button %d with role %ld", button, role); + qWarning("unhandled MessageDialog button %d with role %d", (int)button, (int)role); } } diff --git a/src/dialogs/qquickdialog_p.h b/src/dialogs/qquickdialog_p.h index e9a96612..54718221 100644 --- a/src/dialogs/qquickdialog_p.h +++ b/src/dialogs/qquickdialog_p.h @@ -54,6 +54,7 @@ // #include "qquickabstractmessagedialog_p.h" +#include <QJSValue> QT_BEGIN_NAMESPACE diff --git a/src/dialogs/qquickfiledialog.cpp b/src/dialogs/qquickfiledialog.cpp index 3891308d..4704b5b8 100644 --- a/src/dialogs/qquickfiledialog.cpp +++ b/src/dialogs/qquickfiledialog.cpp @@ -41,6 +41,7 @@ #include "qquickfiledialog_p.h" #include <QQuickItem> +#include <QQmlEngine> #include <private/qguiapplication_p.h> #include <private/qv4object_p.h> @@ -68,12 +69,16 @@ using namespace QV4; \qmlsignal QtQuick::Dialogs::AbstractFileDialog::accepted This signal is emitted by \l accept(). + + The corresponding handler is \c onAccepted. */ /*! \qmlsignal QtQuick::Dialogs::AbstractFileDialog::rejected This signal is emitted by \l reject(). + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/dialogs/qquickfiledialog_p.h b/src/dialogs/qquickfiledialog_p.h index 19d8cac0..0cfef472 100644 --- a/src/dialogs/qquickfiledialog_p.h +++ b/src/dialogs/qquickfiledialog_p.h @@ -54,6 +54,8 @@ // #include "qquickabstractfiledialog_p.h" +#include <QJSValue> +#include <QStandardPaths> QT_BEGIN_NAMESPACE diff --git a/src/dialogs/qquickfontdialog.cpp b/src/dialogs/qquickfontdialog.cpp index d17ce986..802ab33c 100644 --- a/src/dialogs/qquickfontdialog.cpp +++ b/src/dialogs/qquickfontdialog.cpp @@ -66,12 +66,16 @@ QT_BEGIN_NAMESPACE \qmlsignal QtQuick::Dialogs::AbstractFontDialog::accepted The \a accepted signal is emitted by \l accept(). + + The corresponding handler is \c onAccepted. */ /*! \qmlsignal QtQuick::Dialogs::AbstractFontDialog::rejected The \a accepted signal is emitted by \l reject(). + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/dialogs/qquickmessagedialog.cpp b/src/dialogs/qquickmessagedialog.cpp index 43b6ca09..f5ff79af 100644 --- a/src/dialogs/qquickmessagedialog.cpp +++ b/src/dialogs/qquickmessagedialog.cpp @@ -65,12 +65,16 @@ QT_BEGIN_NAMESPACE \qmlsignal QtQuick::Dialogs::AbstractMessageDialog::accepted This signal is emitted by \l accept(). + + The corresponding handler is \c onAccepted. */ /*! \qmlsignal QtQuick::Dialogs::AbstractMessageDialog::rejected This signal is emitted by \l reject(). + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/dialogs/qquickplatformcolordialog.cpp b/src/dialogs/qquickplatformcolordialog.cpp index 11ddbfe6..9e4083c8 100644 --- a/src/dialogs/qquickplatformcolordialog.cpp +++ b/src/dialogs/qquickplatformcolordialog.cpp @@ -102,7 +102,7 @@ QT_BEGIN_NAMESPACE /*! \qmlsignal QtQuick::Dialogs::ColorDialog::accepted - This handler is called when the user has finished using the + This signal is emitted when the user has finished using the dialog. You can then inspect the \l color property to get the selection. Example: @@ -112,13 +112,17 @@ QT_BEGIN_NAMESPACE onAccepted: { console.log("Selected color: " + color) } } \endqml + + The corresponding handler is \c onAccepted. */ /*! \qmlsignal QtQuick::Dialogs::ColorDialog::rejected - This handler is called when the user has dismissed the dialog, + This signal is emitted when the user has dismissed the dialog, either by closing the dialog window or by pressing the Cancel button. + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/dialogs/qquickplatformfiledialog.cpp b/src/dialogs/qquickplatformfiledialog.cpp index 066aabe3..99bfc392 100644 --- a/src/dialogs/qquickplatformfiledialog.cpp +++ b/src/dialogs/qquickplatformfiledialog.cpp @@ -103,7 +103,7 @@ QT_BEGIN_NAMESPACE /*! \qmlsignal QtQuick::Dialogs::FileDialog::accepted - This handler is called when the user has finished using the + This signal is emitted when the user has finished using the dialog. You can then inspect the \l fileUrl or \l fileUrls properties to get the selection. @@ -114,13 +114,17 @@ QT_BEGIN_NAMESPACE onAccepted: { console.log("Selected file: " + fileUrl) } } \endqml + + The corresponding handler is \c onAccepted. */ /*! \qmlsignal QtQuick::Dialogs::FileDialog::rejected - This handler is called when the user has dismissed the dialog, + This signal is emitted when the user has dismissed the dialog, either by closing the dialog window or by pressing the Cancel button. + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/dialogs/qquickplatformfontdialog.cpp b/src/dialogs/qquickplatformfontdialog.cpp index 961d776d..04650a71 100644 --- a/src/dialogs/qquickplatformfontdialog.cpp +++ b/src/dialogs/qquickplatformfontdialog.cpp @@ -114,6 +114,8 @@ QT_BEGIN_NAMESPACE onAccepted: { console.log("Selected font: " + font) } } \endqml + + The corresponding handler is \c onAccepted. */ /*! @@ -121,6 +123,8 @@ QT_BEGIN_NAMESPACE The \a rejected signal is emitted when the user has dismissed the dialog, either by closing the dialog window or by pressing the Cancel button. + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/dialogs/qquickplatformmessagedialog.cpp b/src/dialogs/qquickplatformmessagedialog.cpp index 4dcb9335..42c32dcf 100644 --- a/src/dialogs/qquickplatformmessagedialog.cpp +++ b/src/dialogs/qquickplatformmessagedialog.cpp @@ -105,62 +105,78 @@ QT_BEGIN_NAMESPACE /*! \qmlsignal MessageDialog::accepted() - This handler is called when the user has pressed any button which has the + This signal is emitted when the user has pressed any button which has the \l {QMessageBox::AcceptRole} {AcceptRole}: \gui OK, \gui Open, \gui Save, \gui {Save All}, \gui Retry or \gui Ignore. + + The corresponding handler is \c onAccepted. */ /*! \qmlsignal MessageDialog::rejected() - This handler is called when the user has dismissed the dialog, by closing + This signal is emitted when the user has dismissed the dialog, by closing the dialog window, by pressing a \gui Cancel, \gui Close or \gui Abort button on the dialog, or by pressing the back button or the escape key. + + The corresponding handler is \c onRejected. */ /*! \qmlsignal MessageDialog::discard() - This handler is called when the user has pressed the \gui Discard button. + This signal is emitted when the user has pressed the \gui Discard button. + + The corresponding handler is \c onDiscard. */ /*! \qmlsignal MessageDialog::help() - This handler is called when the user has pressed the \gui Help button. + This signal is emitted when the user has pressed the \gui Help button. Depending on platform, the dialog may not be automatically dismissed because the help that your application provides may need to be relevant to the text shown in this dialog in order to assist the user in making a decision. However on other platforms it's not possible to show a dialog and a help window at the same time. If you want to be sure that the dialog will close, you can set \l visible to \c false in your handler. + + The corresponding handler is \c onHelp. */ /*! \qmlsignal MessageDialog::yes() - This handler is called when the user has pressed any button which has + This signal is emitted when the user has pressed any button which has the \l {QMessageBox::YesRole} {YesRole}: \gui Yes or \gui {Yes to All}. + + The corresponding handler is \c onYes. */ /*! \qmlsignal MessageDialog::no() - This handler is called when the user has pressed any button which has + This signal is emitted when the user has pressed any button which has the \l {QMessageBox::NoRole} {NoRole}: \gui No or \gui {No to All}. + + The corresponding handler is \c onNo. */ /*! \qmlsignal MessageDialog::apply() - This handler is called when the user has pressed the \gui Apply button. + This signal is emitted when the user has pressed the \gui Apply button. + + The corresponding handler is \c onApply. */ /*! \qmlsignal MessageDialog::reset() - This handler is called when the user has pressed any button which has + This signal is emitted when the user has pressed any button which has the \l {QMessageBox::ResetRole} {ResetRole}: \gui Reset or \gui {Restore Defaults}. + + The corresponding handler is \c onReset. */ /*! @@ -210,8 +226,8 @@ QPlatformMessageDialogHelper *QQuickPlatformMessageDialog::helper() // dismissed by closing the window rather than by one of its button widgets. connect(m_dlgHelper, SIGNAL(accept()), this, SLOT(accept())); connect(m_dlgHelper, SIGNAL(reject()), this, SLOT(reject())); - connect(m_dlgHelper, SIGNAL(clicked(QMessageDialogOptions::StandardButton,QMessageDialogOptions::ButtonRole)), - this, SLOT(click(QMessageDialogOptions::StandardButton,QMessageDialogOptions::ButtonRole))); + connect(m_dlgHelper, SIGNAL(clicked(QPlatformDialogHelper::StandardButton,QPlatformDialogHelper::ButtonRole)), + this, SLOT(click(QPlatformDialogHelper::StandardButton,QPlatformDialogHelper::ButtonRole))); } return m_dlgHelper; diff --git a/src/layouts/qquickgridlayoutengine.cpp b/src/layouts/qquickgridlayoutengine.cpp index 419a81df..09684b5d 100644 --- a/src/layouts/qquickgridlayoutengine.cpp +++ b/src/layouts/qquickgridlayoutengine.cpp @@ -142,6 +142,8 @@ static inline void combineImplicitHints(QQuickLayoutAttached *info, Qt::SizeHint explicitly or implicitly set with QQuickLayoutAttached::isExtentExplicitlySet(). This determines if it should be used as a USER or as a HINT value. + Fractional size hints will be ceiled to the closest integer. This is in order to give some + slack when the items are snapped to the pixel grid. | *Minimum* | *Preferred* | *Maximum* | +----------------+----------------------+-----------------------+--------------------------+ @@ -173,12 +175,12 @@ void QQuickGridLayoutItem::effectiveSizeHints_helper(QQuickItem *item, QSizeF *c Q_ASSERT(getter); if (info->isExtentExplicitlySet(Qt::Horizontal, (Qt::SizeHint)i)) - cachedSizeHints[i].setWidth((info->*getter)()); + cachedSizeHints[i].setWidth(qCeil((info->*getter)())); getter = verGetters.call[i]; Q_ASSERT(getter); if (info->isExtentExplicitlySet(Qt::Vertical, (Qt::SizeHint)i)) - cachedSizeHints[i].setHeight((info->*getter)()); + cachedSizeHints[i].setHeight(qCeil((info->*getter)())); } } @@ -213,9 +215,9 @@ void QQuickGridLayoutItem::effectiveSizeHints_helper(QQuickItem *item, QSizeF *c qreal &prefWidth = prefS.rwidth(); qreal &prefHeight = prefS.rheight(); if (prefWidth < 0 && item->implicitWidth() > 0) - prefWidth = item->implicitWidth(); + prefWidth = qCeil(item->implicitWidth()); if (prefHeight < 0 && item->implicitHeight() > 0) - prefHeight = item->implicitHeight(); + prefHeight = qCeil(item->implicitHeight()); // If that fails, make an ultimate fallback to width/height diff --git a/src/layouts/qquickgridlayoutengine_p.h b/src/layouts/qquickgridlayoutengine_p.h index 94b8677a..f1dba1e9 100644 --- a/src/layouts/qquickgridlayoutengine_p.h +++ b/src/layouts/qquickgridlayoutengine_p.h @@ -113,15 +113,15 @@ public: void setGeometry(const QRectF &rect) { - const QPoint innerTopLeft(qCeil(rect.left()), qCeil(rect.top())); - const QPoint innerBottomRight(qFloor(rect.right()), qFloor(rect.bottom())); - const QSize newSize(innerBottomRight.x() - innerTopLeft.x(), innerBottomRight.y() - innerTopLeft.y()); - m_item->setPosition(innerTopLeft); - QSizeF oldSize(m_item->width(), m_item->height()); + const QSizeF oldSize(m_item->width(), m_item->height()); + const QSizeF newSize = rect.size(); + const QPointF topLeft(qCeil(rect.x()), qCeil(rect.y())); + m_item->setPosition(topLeft); if (newSize == oldSize) { - if (QQuickLayout *lay = qobject_cast<QQuickLayout *>(m_item)) + if (QQuickLayout *lay = qobject_cast<QQuickLayout *>(m_item)) { if (lay->arrangementIsDirty()) lay->rearrange(newSize); + } } else { m_item->setSize(newSize); } diff --git a/src/widgets/qmessageboxhelper_p.h b/src/widgets/qmessageboxhelper_p.h index bf3eef32..cb02332b 100644 --- a/src/widgets/qmessageboxhelper_p.h +++ b/src/widgets/qmessageboxhelper_p.h @@ -58,6 +58,28 @@ QT_BEGIN_NAMESPACE +class QCloseableMessageBox : public QMessageBox +{ +public: + QCloseableMessageBox(QWidget *parent = 0) : QMessageBox(parent) { } + + void closeEvent(QCloseEvent *e) { + // QTBUG-36227: Bypass QMessageBox::closeEvent() + QDialog::closeEvent(e); + } + + void keyPressEvent(QKeyEvent *e) { + QMessageBox::keyPressEvent(e); + // QTBUG-36227: reject on escape or cmd-period even if there's no cancel button + if ((isVisible() && e->key() == Qt::Key_Escape) +#ifdef Q_OS_MAC + || (e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Period) +#endif + ) + reject(); + } +}; + class QMessageBoxHelper : public QPlatformMessageDialogHelper { Q_OBJECT @@ -93,7 +115,7 @@ public: virtual void hide() { m_dialog.hide(); } - QMessageBox m_dialog; + QCloseableMessageBox m_dialog; public Q_SLOTS: void buttonClicked(QAbstractButton* button) { diff --git a/src/widgets/qquickqcolordialog.cpp b/src/widgets/qquickqcolordialog.cpp index aa88aaeb..4359bc6d 100644 --- a/src/widgets/qquickqcolordialog.cpp +++ b/src/widgets/qquickqcolordialog.cpp @@ -118,6 +118,8 @@ private: onAccepted: { console.log("Selected color: " + color) } } \endqml + + The corresponding handler is \c onAccepted. */ /*! @@ -125,6 +127,8 @@ private: The \a rejected signal is emitted when the user has dismissed the dialog, either by closing the dialog window or by pressing the Cancel button. + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/widgets/qquickqfiledialog.cpp b/src/widgets/qquickqfiledialog.cpp index 9dc967dd..b37ec769 100644 --- a/src/widgets/qquickqfiledialog.cpp +++ b/src/widgets/qquickqfiledialog.cpp @@ -83,6 +83,8 @@ QT_BEGIN_NAMESPACE onAccepted: { console.log("Selected file: " + fileUrl) } } \endqml + + The corresponding handler is \c onAccepted. */ /*! @@ -90,6 +92,8 @@ QT_BEGIN_NAMESPACE The \a rejected signal is emitted when the user has dismissed the dialog, either by closing the dialog window or by pressing the Cancel button. + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/widgets/qquickqfontdialog.cpp b/src/widgets/qquickqfontdialog.cpp index 6936aff7..bc889e07 100644 --- a/src/widgets/qquickqfontdialog.cpp +++ b/src/widgets/qquickqfontdialog.cpp @@ -121,6 +121,8 @@ private: onAccepted: { console.log("Selected file: " + filePath) } } \endqml + + The corresponding handler is \c onAccepted. */ /*! @@ -128,6 +130,8 @@ private: The \a rejected signal is emitted when the user has dismissed the dialog, either by closing the dialog window or by pressing the Cancel button. + + The corresponding handler is \c onRejected. */ /*! diff --git a/src/widgets/qquickqmessagebox.cpp b/src/widgets/qquickqmessagebox.cpp index 5d734011..c959fd74 100644 --- a/src/widgets/qquickqmessagebox.cpp +++ b/src/widgets/qquickqmessagebox.cpp @@ -84,6 +84,8 @@ QT_BEGIN_NAMESPACE onAccepted: { console.log("accepted") } } \endqml + + The corresponding handler is \c onAccepted. */ /*! @@ -91,6 +93,8 @@ QT_BEGIN_NAMESPACE The \a rejected signal is emitted when the user has dismissed the dialog, either by closing the dialog window or by pressing the Cancel button. + + The corresponding handler is \c onRejected. */ /*! @@ -134,8 +138,8 @@ QPlatformDialogHelper *QQuickQMessageBox::helper() // dismissed by closing the window rather than by one of its button widgets. connect(helper, SIGNAL(accept()), this, SLOT(accept())); connect(helper, SIGNAL(reject()), this, SLOT(reject())); - connect(helper, SIGNAL(clicked(QMessageDialogOptions::StandardButton,QMessageDialogOptions::ButtonRole)), - this, SLOT(click(QMessageDialogOptions::StandardButton,QMessageDialogOptions::ButtonRole))); + connect(helper, SIGNAL(clicked(QPlatformDialogHelper::StandardButton,QPlatformDialogHelper::ButtonRole)), + this, SLOT(click(QPlatformDialogHelper::StandardButton,QPlatformDialogHelper::ButtonRole))); } return QQuickAbstractMessageDialog::m_dlgHelper; |