summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/controls/ComboBox.qml8
-rw-r--r--src/controls/Private/ScrollViewHelper.qml18
-rw-r--r--src/controls/Private/StackViewSlideDelegate.qml2
-rw-r--r--src/controls/Styles/Android/plugin.cpp9
-rw-r--r--src/controls/Styles/WinRT/plugin.cpp6
-rw-r--r--src/controls/plugin.cpp9
-rw-r--r--src/controls/qquickmenu.cpp75
-rw-r--r--src/controls/qquickmenu_p.h2
-rw-r--r--src/dialogs/DefaultDialogWrapper.qml66
-rw-r--r--src/dialogs/Private/dialogsprivateplugin.cpp9
-rw-r--r--src/dialogs/plugin.cpp9
-rw-r--r--src/dialogs/qquickdialog.cpp25
-rw-r--r--src/extras/Styles/Flat/flatstyleplugin.cpp11
-rw-r--r--src/widgets/qquickqfiledialog_p.h6
-rw-r--r--src/widgets/widgetsplugin.cpp9
15 files changed, 154 insertions, 110 deletions
diff --git a/src/controls/ComboBox.qml b/src/controls/ComboBox.qml
index bd42f76b..7c6f93a7 100644
--- a/src/controls/ComboBox.qml
+++ b/src/controls/ComboBox.qml
@@ -570,11 +570,16 @@ Control {
onSelectedTextChanged: popup.currentText = selectedText
property string selectedText
+ property int triggeredIndex: -1
on__SelectedIndexChanged: {
if (__selectedIndex === -1)
popup.currentText = ""
else
updateSelectedText()
+ if (triggeredIndex >= 0 && triggeredIndex == __selectedIndex) {
+ activated(currentIndex)
+ triggeredIndex = -1
+ }
}
property string textRole: ""
@@ -611,8 +616,7 @@ Control {
modelData :
((popup.modelIsArray ? modelData[popup.textRole] : model[popup.textRole]) || '')
onTriggered: {
- if (index !== currentIndex)
- activated(index)
+ popup.triggeredIndex = index
comboBox.editText = text
}
onTextChanged: if (index === currentIndex) popup.updateSelectedText();
diff --git a/src/controls/Private/ScrollViewHelper.qml b/src/controls/Private/ScrollViewHelper.qml
index 810de91d..53050108 100644
--- a/src/controls/Private/ScrollViewHelper.qml
+++ b/src/controls/Private/ScrollViewHelper.qml
@@ -68,31 +68,29 @@ Item {
anchors.fill: parent
- property bool recursionGuard: false
-
- function doLayout() {
- if (!recursionGuard) {
- recursionGuard = true
+ Timer {
+ id: layoutTimer
+ interval: 0;
+ onTriggered: {
blockUpdates = true;
scrollHelper.contentWidth = flickableItem !== null ? flickableItem.contentWidth : 0
scrollHelper.contentHeight = flickableItem !== null ? flickableItem.contentHeight : 0
scrollHelper.availableWidth = viewport.width
scrollHelper.availableHeight = viewport.height
blockUpdates = false;
- recursionGuard = false
}
}
Connections {
target: viewport
- onWidthChanged: doLayout()
- onHeightChanged: doLayout()
+ onWidthChanged: layoutTimer.running = true
+ onHeightChanged: layoutTimer.running = true
}
Connections {
target: flickableItem
- onContentWidthChanged: doLayout()
- onContentHeightChanged: doLayout()
+ onContentWidthChanged: layoutTimer.running = true
+ onContentHeightChanged: layoutTimer.running = true
onContentXChanged: {
hscrollbar.flash()
vscrollbar.flash()
diff --git a/src/controls/Private/StackViewSlideDelegate.qml b/src/controls/Private/StackViewSlideDelegate.qml
index e64bc38b..dcc14448 100644
--- a/src/controls/Private/StackViewSlideDelegate.qml
+++ b/src/controls/Private/StackViewSlideDelegate.qml
@@ -135,7 +135,7 @@ StackViewDelegate {
to: target.height
duration: 300
}
- property Component replaceTransition: pushTransition
}
+ property Component replaceTransition: pushTransition
}
}
diff --git a/src/controls/Styles/Android/plugin.cpp b/src/controls/Styles/Android/plugin.cpp
index 646fff36..7a09bb9c 100644
--- a/src/controls/Styles/Android/plugin.cpp
+++ b/src/controls/Styles/Android/plugin.cpp
@@ -44,13 +44,6 @@
#include "qquickandroidstyle_p.h"
#include "qquickandroid9patch_p.h"
-static void initResources()
-{
-#ifdef QT_STATIC
- Q_INIT_RESOURCE(qmake_QtQuick_Controls_Styles_Android);
-#endif
-}
-
QT_BEGIN_NAMESPACE
class QtQuickControls1AndroidStylePlugin: public QQmlExtensionPlugin
@@ -59,7 +52,7 @@ class QtQuickControls1AndroidStylePlugin: public QQmlExtensionPlugin
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
- QtQuickControls1AndroidStylePlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); }
+ QtQuickControls1AndroidStylePlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { }
void registerTypes(const char *uri);
};
diff --git a/src/controls/Styles/WinRT/plugin.cpp b/src/controls/Styles/WinRT/plugin.cpp
index e6d0adfe..b205d75e 100644
--- a/src/controls/Styles/WinRT/plugin.cpp
+++ b/src/controls/Styles/WinRT/plugin.cpp
@@ -39,15 +39,9 @@
#include <QtCore/qglobal.h>
-static void initResources()
-{
- Q_INIT_RESOURCE(WinRT);
-}
-
extern "C" {
Q_DECL_EXPORT bool qt_quick_controls_style_init()
{
- initResources();
return true;
}
diff --git a/src/controls/plugin.cpp b/src/controls/plugin.cpp
index 4eb6c466..8aca0c49 100644
--- a/src/controls/plugin.cpp
+++ b/src/controls/plugin.cpp
@@ -71,14 +71,6 @@
#include <QtCore/qlocale.h>
#endif
-static void initResources()
-{
-#ifdef QT_STATIC
- Q_INIT_RESOURCE(qmake_QtQuick_Controls);
- Q_INIT_RESOURCE(qmake_controls);
-#endif
-}
-
QT_BEGIN_NAMESPACE
static const struct {
@@ -129,7 +121,6 @@ static const struct {
QtQuickControls1Plugin::QtQuickControls1Plugin(QObject *parent) : QQmlExtensionPlugin(parent)
{
- initResources();
}
void QtQuickControls1Plugin::registerTypes(const char *uri)
diff --git a/src/controls/qquickmenu.cpp b/src/controls/qquickmenu.cpp
index 3c6d91ef..bfa0f673 100644
--- a/src/controls/qquickmenu.cpp
+++ b/src/controls/qquickmenu.cpp
@@ -789,33 +789,41 @@ void QQuickMenu1::insertItem(int index, QQuickMenuBase1 *menuItem)
void QQuickMenu1::removeItem(QQuickMenuBase1 *menuItem)
{
- if (!menuItem)
- return;
- menuItem->setParentMenu(0);
-
- QQuickMenuItemContainer1 *container = menuItem->parent() != this ? m_containers[menuItem->parent()] : 0;
- if (container)
- container->removeItem(menuItem);
- else
- m_menuItems.removeOne(menuItem);
-
- --m_itemsCount;
- emit itemsChanged();
+ // Removes the item, but if it's a container, the container is kept
+ if (menuItem) {
+ unparentItem(menuItem);
+ emit itemsChanged();
+ }
}
void QQuickMenu1::clear()
{
- m_containers.clear();
- m_containersCount = 0;
+ if (m_itemsCount > 0) {
+ while (m_itemsCount > 0)
+ unparentItem(menuItemAtIndex(0));
- // QTBUG-48927: a proxy menu (ApplicationWindowStyle.qml) must not
- // delete its items, because they are owned by the menubar
- if (m_proxy)
+ // We can delete the containers now, as there cannot be any further items in them.
+ qDeleteAll(m_containers);
+ m_containers.clear();
+ m_containersCount = 0;
+
+ // The containers are also kept in m_menuItems, so we have to clear explicitly.
m_menuItems.clear();
- while (!m_menuItems.empty())
- delete m_menuItems.takeFirst();
- m_itemsCount = 0;
+ emit itemsChanged();
+ }
+}
+
+void QQuickMenu1::unparentItem(QQuickMenuBase1 *menuItem)
+{
+ menuItem->setParentMenu(nullptr);
+ QQuickMenuItemContainer1 *container = (menuItem->parent() != this)
+ ? m_containers[menuItem->parent()] : nullptr;
+ if (container)
+ container->removeItem(menuItem);
+ else
+ m_menuItems.removeOne(menuItem);
+ --m_itemsCount;
}
void QQuickMenu1::setupMenuItem(QQuickMenuBase1 *item, int platformIndex)
@@ -871,8 +879,31 @@ QObject *QQuickMenu1::at_menuItems(QQuickMenuItems *list, int index)
void QQuickMenu1::clear_menuItems(QQuickMenuItems *list)
{
- if (QQuickMenu1 *menu = qobject_cast<QQuickMenu1 *>(list->object))
- menu->clear();
+ if (QQuickMenu1 *menu = qobject_cast<QQuickMenu1 *>(list->object)) {
+ // There may be stray containers that don't appear in m_menuItems. This is because we may
+ // remove a container with removeItem(), which will only remove it from m_menuItems.
+ // Therefore, make sure that all containers are removed from m_menuItems first.
+ for (QQuickMenuItemContainer1 *container : menu->m_containers)
+ menu->m_menuItems.removeOne(container);
+
+ // Delete or unparent the items first. They may have references to the containers.
+ // QTBUG-48927: a proxy menu (ApplicationWindowStyle.qml) must not
+ // delete its items, because they are owned by the menubar
+ // We still do own the containers, though. We create them on append_menuItems, after all.
+ while (!menu->m_menuItems.empty()) {
+ if (menu->m_proxy)
+ menu->unparentItem(menu->m_menuItems[0]);
+ else
+ delete menu->m_menuItems.takeFirst();
+ }
+ menu->m_menuItems.clear();
+
+ qDeleteAll(menu->m_containers);
+ menu->m_containers.clear();
+ menu->m_containersCount = 0;
+
+ menu->m_itemsCount = 0;
+ }
}
QT_END_NAMESPACE
diff --git a/src/controls/qquickmenu_p.h b/src/controls/qquickmenu_p.h
index 800981dd..0594f391 100644
--- a/src/controls/qquickmenu_p.h
+++ b/src/controls/qquickmenu_p.h
@@ -190,6 +190,8 @@ private:
static int count_menuItems(QQuickMenuItems *list);
static QObject *at_menuItems(QQuickMenuItems *list, int index);
static void clear_menuItems(QQuickMenuItems *list);
+
+ void unparentItem(QQuickMenuBase1 *menuItem);
void setupMenuItem(QQuickMenuBase1 *item, int platformIndex = -1);
QPlatformMenu *m_platformMenu;
diff --git a/src/dialogs/DefaultDialogWrapper.qml b/src/dialogs/DefaultDialogWrapper.qml
index b446c316..3ca030c4 100644
--- a/src/dialogs/DefaultDialogWrapper.qml
+++ b/src/dialogs/DefaultDialogWrapper.qml
@@ -47,6 +47,9 @@ import "qml"
AbstractDialog {
id: root
default property alias data: defaultContentItem.data
+
+ signal actionChosen(var action)
+
onVisibilityChanged: if (visible && contentItem) contentItem.forceActiveFocus()
Rectangle {
@@ -63,19 +66,7 @@ AbstractDialog {
defaultContentItem.implicitWidth, buttonsRowImplicitWidth, Screen.pixelDensity * 50) + outerSpacing * 2)
color: palette.window
Keys.onPressed: {
- event.accepted = true
- switch (event.key) {
- case Qt.Key_Escape:
- case Qt.Key_Back:
- reject()
- break
- case Qt.Key_Enter:
- case Qt.Key_Return:
- accept()
- break
- default:
- event.accepted = false
- }
+ event.accepted = handleKey(event.key)
}
SystemPalette { id: palette }
@@ -109,7 +100,7 @@ AbstractDialog {
id: buttonsLeftRepeater
Button {
text: (buttonsLeftRepeater.model && buttonsLeftRepeater.model[index] ? buttonsLeftRepeater.model[index].text : index)
- onClicked: root.click(buttonsLeftRepeater.model[index].standardButton)
+ onClicked: content.handleButton(buttonsLeftRepeater.model[index].standardButton)
}
}
@@ -136,9 +127,54 @@ AbstractDialog {
// TODO maybe: insert gaps if the button requires it (destructive buttons only)
Button {
text: (buttonsRightRepeater.model && buttonsRightRepeater.model[index] ? buttonsRightRepeater.model[index].text : index)
- onClicked: root.click(buttonsRightRepeater.model[index].standardButton)
+ onClicked: content.handleButton(buttonsRightRepeater.model[index].standardButton)
+ }
+ }
+ }
+
+ function handleButton(button) {
+ var action = {
+ "button": button,
+ "key": 0,
+ "accepted": true,
+ }
+ root.actionChosen(action)
+ if (action.accepted) {
+ click(button)
+ }
+ }
+
+ function handleKey(key) {
+ var button = 0
+ switch (key) {
+ case Qt.Key_Escape:
+ case Qt.Key_Back:
+ button = StandardButton.Cancel
+ break
+ case Qt.Key_Enter:
+ case Qt.Key_Return:
+ button = StandardButton.Ok
+ break
+ default:
+ return false
+ }
+ var action = {
+ "button": button,
+ "key": key,
+ "accepted": true,
+ }
+ root.actionChosen(action)
+ if (action.accepted) {
+ switch (button) {
+ case StandardButton.Cancel:
+ reject()
+ break
+ case StandardButton.Ok:
+ accept()
+ break
}
}
+ return true
}
}
function setupButtons() {
diff --git a/src/dialogs/Private/dialogsprivateplugin.cpp b/src/dialogs/Private/dialogsprivateplugin.cpp
index ba8aabe3..a785f388 100644
--- a/src/dialogs/Private/dialogsprivateplugin.cpp
+++ b/src/dialogs/Private/dialogsprivateplugin.cpp
@@ -42,13 +42,6 @@
#include "qquickwritingsystemlistmodel_p.h"
#include "qquickfontlistmodel_p.h"
-static void initResources()
-{
-#ifdef QT_STATIC
- Q_INIT_RESOURCE(qmake_QtQuick_Dialogs_Private);
-#endif
-}
-
QT_BEGIN_NAMESPACE
class QtQuick2DialogsPrivatePlugin : public QQmlExtensionPlugin
@@ -57,7 +50,7 @@ class QtQuick2DialogsPrivatePlugin : public QQmlExtensionPlugin
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
- QtQuick2DialogsPrivatePlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); }
+ QtQuick2DialogsPrivatePlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { }
virtual void registerTypes(const char *uri)
{
Q_ASSERT(QLatin1String(uri) == QLatin1String("QtQuick.Dialogs.Private"));
diff --git a/src/dialogs/plugin.cpp b/src/dialogs/plugin.cpp
index 1e6740d5..8c10786f 100644
--- a/src/dialogs/plugin.cpp
+++ b/src/dialogs/plugin.cpp
@@ -62,13 +62,6 @@
Q_LOGGING_CATEGORY(lcRegistration, "qt.quick.dialogs.registration")
-static void initResources()
-{
-#ifdef QT_STATIC
- Q_INIT_RESOURCE(qmake_QtQuick_Dialogs);
-#endif
-}
-
QT_BEGIN_NAMESPACE
/*!
@@ -92,7 +85,7 @@ class QtQuick2DialogsPlugin : public QQmlExtensionPlugin
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
- QtQuick2DialogsPlugin() : QQmlExtensionPlugin(), m_useResources(true) { initResources(); }
+ QtQuick2DialogsPlugin() : QQmlExtensionPlugin(), m_useResources(true) { }
virtual void initializeEngine(QQmlEngine *engine, const char * uri) {
qCDebug(lcRegistration) << uri << m_decorationComponentUrl;
diff --git a/src/dialogs/qquickdialog.cpp b/src/dialogs/qquickdialog.cpp
index 485eeb43..ef6a9a1f 100644
--- a/src/dialogs/qquickdialog.cpp
+++ b/src/dialogs/qquickdialog.cpp
@@ -154,6 +154,31 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \qmlsignal Dialog::actionChosen(var action)
+
+ This signal is emitted when the user has pressed any button or a key
+ associated with some role (such as the Enter or Escape keys). The \a
+ action parameter carries information about the event:
+
+ \list
+ \li StandardButton button - The role of the button which was pressed. If a
+ key was pressed instead, this will be \c StandardButton.Ok if accepted
+ and \c StandardButton.Cancel if rejected.
+ \li Qt.Key key - The key which was pressed, or \c 0 if none
+ \li bool accepted - Set this to \c false to stop the event from triggering
+ its predefined action
+ \endlist
+
+ By handling this signal and setting the \c action.accepted field to \c
+ false, it's possible to implement some validation on the dialog contents
+ before accepting it, for example.
+
+ The corresponding handler is \c onActionChosen.
+
+ \since QtQuick.Controls 1.8
+*/
+
+/*!
\qmlproperty bool Dialog::visible
This property holds whether the dialog is visible. By default this is
diff --git a/src/extras/Styles/Flat/flatstyleplugin.cpp b/src/extras/Styles/Flat/flatstyleplugin.cpp
index 5d88134b..7efbb16c 100644
--- a/src/extras/Styles/Flat/flatstyleplugin.cpp
+++ b/src/extras/Styles/Flat/flatstyleplugin.cpp
@@ -45,20 +45,10 @@
#include "qquicktexthandle.h"
-static void initResources()
-{
-#ifndef QT_STATIC
- Q_INIT_RESOURCE(flatstyle);
-#else
- Q_INIT_RESOURCE(qmake_QtQuick_Controls_Styles_Flat);
-#endif
-}
-
#ifndef QT_STATIC
extern "C" {
Q_DECL_EXPORT bool qt_quick_controls_style_init()
{
- initResources();
return true;
}
@@ -74,7 +64,6 @@ QT_BEGIN_NAMESPACE
QtQuickExtrasStylesPlugin::QtQuickExtrasStylesPlugin(QObject *parent) :
QQmlExtensionPlugin(parent)
{
- initResources();
}
void QtQuickExtrasStylesPlugin::registerTypes(const char *uri)
diff --git a/src/widgets/qquickqfiledialog_p.h b/src/widgets/qquickqfiledialog_p.h
index d977e345..4988c1e0 100644
--- a/src/widgets/qquickqfiledialog_p.h
+++ b/src/widgets/qquickqfiledialog_p.h
@@ -51,11 +51,13 @@
// We mean it.
//
-#include <QFileDialog>
-#include "../dialogs/qquickabstractfiledialog_p.h"
+#include <QtWidgets/qtwidgetsglobal.h>
#if QT_CONFIG(filedialog)
+#include <QFileDialog>
+#include "../dialogs/qquickabstractfiledialog_p.h"
+
QT_BEGIN_NAMESPACE
class QQuickQFileDialog : public QQuickAbstractFileDialog
diff --git a/src/widgets/widgetsplugin.cpp b/src/widgets/widgetsplugin.cpp
index 65233756..3289e6fd 100644
--- a/src/widgets/widgetsplugin.cpp
+++ b/src/widgets/widgetsplugin.cpp
@@ -44,13 +44,6 @@
#include "qquickqcolordialog_p.h"
#include "qquickqfontdialog_p.h"
-static void initResources()
-{
-#ifdef QT_STATIC
- Q_INIT_RESOURCE(qmake_QtQuick_PrivateWidgets);
-#endif
-}
-
QT_BEGIN_NAMESPACE
/*!
@@ -78,7 +71,7 @@ class QtQuick2PrivateWidgetsPlugin : public QQmlExtensionPlugin
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
- QtQuick2PrivateWidgetsPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); }
+ QtQuick2PrivateWidgetsPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { }
virtual void registerTypes(const char *uri)
{
Q_ASSERT(QLatin1String(uri) == QLatin1String("QtQuick.PrivateWidgets"));