diff options
Diffstat (limited to 'src/imports/platform')
66 files changed, 9392 insertions, 0 deletions
diff --git a/src/imports/platform/doc/images/qtlabsplatform-colordialog-gtk.png b/src/imports/platform/doc/images/qtlabsplatform-colordialog-gtk.png Binary files differnew file mode 100644 index 00000000..e0785a05 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-colordialog-gtk.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-filedialog-gtk.png b/src/imports/platform/doc/images/qtlabsplatform-filedialog-gtk.png Binary files differnew file mode 100644 index 00000000..3bc963d0 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-filedialog-gtk.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-folderdialog-gtk.png b/src/imports/platform/doc/images/qtlabsplatform-folderdialog-gtk.png Binary files differnew file mode 100644 index 00000000..ea4d929d --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-folderdialog-gtk.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-fontdialog-gtk.png b/src/imports/platform/doc/images/qtlabsplatform-fontdialog-gtk.png Binary files differnew file mode 100644 index 00000000..9f3dc2e7 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-fontdialog-gtk.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-menu.png b/src/imports/platform/doc/images/qtlabsplatform-menu.png Binary files differnew file mode 100644 index 00000000..120d263b --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-menu.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-menubar.png b/src/imports/platform/doc/images/qtlabsplatform-menubar.png Binary files differnew file mode 100644 index 00000000..685d03b3 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-menubar.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-messagedialog-android.png b/src/imports/platform/doc/images/qtlabsplatform-messagedialog-android.png Binary files differnew file mode 100644 index 00000000..a1de1806 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-messagedialog-android.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-messagedialog-informative-android.png b/src/imports/platform/doc/images/qtlabsplatform-messagedialog-informative-android.png Binary files differnew file mode 100644 index 00000000..7062ed90 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-messagedialog-informative-android.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-menu.png b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-menu.png Binary files differnew file mode 100644 index 00000000..0d0ecfab --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-menu.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-message.png b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-message.png Binary files differnew file mode 100644 index 00000000..d929ca97 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-message.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon.png b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon.png Binary files differnew file mode 100644 index 00000000..58c40d73 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon.png diff --git a/src/imports/platform/doc/qtlabsplatform.qdocconf b/src/imports/platform/doc/qtlabsplatform.qdocconf new file mode 100644 index 00000000..e78a9644 --- /dev/null +++ b/src/imports/platform/doc/qtlabsplatform.qdocconf @@ -0,0 +1,37 @@ +include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) + +project = QtLabsPlatform +description = Qt Labs Platform Reference Documentation +version = $QT_VERSION + +qhp.projects = QtLabsPlatform + +qhp.QtLabsPlatform.file = qtlabsplatform.qhp +qhp.QtLabsPlatform.namespace = org.qt-project.qtlabsplatform.$QT_VERSION_TAG +qhp.QtLabsPlatform.virtualFolder = qtlabsplatform +qhp.QtLabsPlatform.indexTitle = Qt Labs Platform +qhp.QtLabsPlatform.indexRoot = + +qhp.QtLabsPlatform.filterAttributes = qtlabsplatform $QT_VERSION qtrefdoc +qhp.QtLabsPlatform.customFilters.Qt.name = QtLabsPlatform $QT_VERSION +qhp.QtLabsPlatform.customFilters.Qt.filterAttributes = qtlabsplatform $QT_VERSION + +qhp.QtLabsPlatform.subprojects = qmltypes +qhp.QtLabsPlatform.subprojects.qmltypes.title = QML Types +qhp.QtLabsPlatform.subprojects.qmltypes.indexTitle = Qt Labs Platform QML Types +qhp.QtLabsPlatform.subprojects.qmltypes.selectors = qmlclass +qhp.QtLabsPlatform.subprojects.qmltypes.sortPages = true + +depends = qtcore qtgui qtdoc qtqml qtquick qtquickcontrols2 qtwidgets + +headerdirs += ../ +sourcedirs += ../ + +imagedirs += images + +navigation.landingpage = "Qt Labs Platform" +navigation.qmltypespage = "Qt Labs Platform QML Types" + +tagfile = qtlabsplatform.tags + +macro.labs = "\\note \\e{Types in Qt.labs modules are not guaranteed to remain compatible in future versions.}" diff --git a/src/imports/platform/doc/src/includes/widgets.qdocinc b/src/imports/platform/doc/src/includes/widgets.qdocinc new file mode 100644 index 00000000..c89c3ca0 --- /dev/null +++ b/src/imports/platform/doc/src/includes/widgets.qdocinc @@ -0,0 +1,29 @@ +//! [1] +The Qt Labs Platform module uses Qt Widgets as a fallback on platforms that +do not have a native implementation available. Therefore, applications that +use types from the Qt Labs Platform module should link to QtWidgets and use +\l QApplication instead of \l QGuiApplication. + +To link against the QtWidgets library, add the following to your qmake project +file: + +\code +QT += widgets +\endcode + +Create an instance of \l QApplication in \c main(): + +\code +#include <QApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication app(argc, argv); + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + return app.exec(); +} +\endcode +//! [1] diff --git a/src/imports/platform/doc/src/qtlabsplatform-index.qdoc b/src/imports/platform/doc/src/qtlabsplatform-index.qdoc new file mode 100644 index 00000000..aec2a923 --- /dev/null +++ b/src/imports/platform/doc/src/qtlabsplatform-index.qdoc @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page qtlabsplatform-index.html + \title Qt Labs Platform + + \brief The experimental Qt Labs Platform module provides QML types for + native platform extensions. + + The experimental Qt Labs Platform module provides QML types for native + platform extensions. The module was introduced in Qt 5.8. + + \section1 QML Types + + \generatelist {qmltypesbymodule Qt.labs.platform} + + \labs + + \section1 Related Information + + \list + \li \l{Qt Quick} + \li \l{Qt Quick Controls 2} + \endlist +*/ diff --git a/src/imports/platform/doc/src/qtlabsplatform-qmltypes.qdoc b/src/imports/platform/doc/src/qtlabsplatform-qmltypes.qdoc new file mode 100644 index 00000000..470b93c4 --- /dev/null +++ b/src/imports/platform/doc/src/qtlabsplatform-qmltypes.qdoc @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \qmlmodule Qt.labs.platform 1.0 + \title Qt Labs Platform QML Types + \ingroup qmlmodules + \brief Provides QML types for native platform extensions. + + The experimental \l{Qt Labs Platform} module provides QML types for native + platform extensions. These QML types work in conjunction with \l{Qt Quick} + and \l{Qt Quick Controls 2}. + + The QML types can be imported into your application using the + following import statement in your .qml file: + + \badcode + import Qt.labs.platform 1.0 + \endcode + + \section1 QML Types + + \generatelist {qmltypesbymodule Qt.labs.platform} + + \labs + + \section1 Related Information + + \list + \li \l {Qt Quick Controls 2 QML Types} + \endlist + + \noautolist +*/ diff --git a/src/imports/platform/platform.pri b/src/imports/platform/platform.pri new file mode 100644 index 00000000..1e300251 --- /dev/null +++ b/src/imports/platform/platform.pri @@ -0,0 +1,31 @@ +HEADERS += \ + $$PWD/qquickplatformcolordialog_p.h \ + $$PWD/qquickplatformdialog_p.h \ + $$PWD/qquickplatformfiledialog_p.h \ + $$PWD/qquickplatformfolderdialog_p.h \ + $$PWD/qquickplatformfontdialog_p.h \ + $$PWD/qquickplatformiconloader_p.h \ + $$PWD/qquickplatformmenu_p.h \ + $$PWD/qquickplatformmenubar_p.h \ + $$PWD/qquickplatformmenuitem_p.h \ + $$PWD/qquickplatformmenuitemgroup_p.h \ + $$PWD/qquickplatformmenuseparator_p.h \ + $$PWD/qquickplatformmessagedialog_p.h \ + $$PWD/qquickplatformstandardpaths_p.h \ + $$PWD/qquickplatformsystemtrayicon_p.h + +SOURCES += \ + $$PWD/qquickplatformcolordialog.cpp \ + $$PWD/qquickplatformdialog.cpp \ + $$PWD/qquickplatformfiledialog.cpp \ + $$PWD/qquickplatformfolderdialog.cpp \ + $$PWD/qquickplatformfontdialog.cpp \ + $$PWD/qquickplatformiconloader.cpp \ + $$PWD/qquickplatformmenu.cpp \ + $$PWD/qquickplatformmenubar.cpp \ + $$PWD/qquickplatformmenuitem.cpp \ + $$PWD/qquickplatformmenuitemgroup.cpp \ + $$PWD/qquickplatformmenuseparator.cpp \ + $$PWD/qquickplatformmessagedialog.cpp \ + $$PWD/qquickplatformstandardpaths.cpp \ + $$PWD/qquickplatformsystemtrayicon.cpp diff --git a/src/imports/platform/platform.pro b/src/imports/platform/platform.pro new file mode 100644 index 00000000..043b0172 --- /dev/null +++ b/src/imports/platform/platform.pro @@ -0,0 +1,22 @@ +TARGET = qtlabsplatformplugin +TARGETPATH = Qt/labs/platform +IMPORT_VERSION = 1.0 + +QT += qml quick +QT_PRIVATE += core-private gui-private qml-private quick-private + +DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII + +QMAKE_DOCS = $$PWD/doc/qtlabsplatform.qdocconf + +OTHER_FILES += \ + qmldir + +SOURCES += \ + $$PWD/qtlabsplatformplugin.cpp + +include(platform.pri) +qtHaveModule(widgets): include(widgets/widgets.pri) + +CONFIG += no_cxx_module +load(qml_plugin) diff --git a/src/imports/platform/plugins.qmltypes b/src/imports/platform/plugins.qmltypes new file mode 100644 index 00000000..6913405b --- /dev/null +++ b/src/imports/platform/plugins.qmltypes @@ -0,0 +1,460 @@ +import QtQuick.tooling 1.2 + +// This file describes the plugin-supplied types contained in the library. +// It is used for QML tooling purposes only. +// +// This file was auto-generated by: +// 'qmlplugindump -nonrelocatable Qt.labs.platform 1.0' + +Module { + dependencies: ["QtQuick 2.8"] + Component { + name: "QPlatformDialogHelper" + prototype: "QObject" + exports: ["Qt.labs.platform/StandardButton 1.0"] + isCreatable: false + exportMetaObjectRevisions: [0] + Enum { + name: "StandardButtons" + values: { + "NoButton": 0, + "Ok": 1024, + "Save": 2048, + "SaveAll": 4096, + "Open": 8192, + "Yes": 16384, + "YesToAll": 32768, + "No": 65536, + "NoToAll": 131072, + "Abort": 262144, + "Retry": 524288, + "Ignore": 1048576, + "Close": 2097152, + "Cancel": 4194304, + "Discard": 8388608, + "Help": 16777216, + "Apply": 33554432, + "Reset": 67108864, + "RestoreDefaults": 134217728, + "FirstButton": 1024, + "LastButton": 134217728, + "LowestBit": 10, + "HighestBit": 27 + } + } + Enum { + name: "ButtonRole" + values: { + "InvalidRole": -1, + "AcceptRole": 0, + "RejectRole": 1, + "DestructiveRole": 2, + "ActionRole": 3, + "HelpRole": 4, + "YesRole": 5, + "NoRole": 6, + "ResetRole": 7, + "ApplyRole": 8, + "NRoles": 9, + "RoleMask": 268435455, + "AlternateRole": 268435456, + "Stretch": 536870912, + "Reverse": 1073741824, + "EOL": -1 + } + } + Signal { name: "accept" } + Signal { name: "reject" } + } + Component { + name: "QQuickPlatformColorDialog" + defaultProperty: "data" + prototype: "QQuickPlatformDialog" + exports: ["Qt.labs.platform/ColorDialog 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "color"; type: "QColor" } + Property { name: "currentColor"; type: "QColor" } + Property { name: "options"; type: "QColorDialogOptions::ColorDialogOptions" } + } + Component { + name: "QQuickPlatformDialog" + defaultProperty: "data" + prototype: "QObject" + exports: ["Qt.labs.platform/Dialog 1.0"] + isCreatable: false + exportMetaObjectRevisions: [0] + Enum { + name: "StandardCode" + values: { + "Rejected": 0, + "Accepted": 1 + } + } + Property { name: "data"; type: "QObject"; isList: true; isReadonly: true } + Property { name: "parentWindow"; type: "QWindow"; isPointer: true } + Property { name: "title"; type: "string" } + Property { name: "flags"; type: "Qt::WindowFlags" } + Property { name: "modality"; type: "Qt::WindowModality" } + Property { name: "visible"; type: "bool" } + Property { name: "result"; type: "int" } + Signal { name: "accepted" } + Signal { name: "rejected" } + Method { name: "open" } + Method { name: "close" } + Method { name: "accept" } + Method { name: "reject" } + Method { + name: "done" + Parameter { name: "result"; type: "int" } + } + } + Component { + name: "QQuickPlatformFileDialog" + defaultProperty: "data" + prototype: "QQuickPlatformDialog" + exports: ["Qt.labs.platform/FileDialog 1.0"] + exportMetaObjectRevisions: [0] + Enum { + name: "FileMode" + values: { + "OpenFile": 0, + "OpenFiles": 1, + "SaveFile": 2 + } + } + Property { name: "fileMode"; type: "FileMode" } + Property { name: "file"; type: "QUrl" } + Property { name: "files"; type: "QList<QUrl>" } + Property { name: "currentFile"; type: "QUrl" } + Property { name: "currentFiles"; type: "QList<QUrl>" } + Property { name: "folder"; type: "QUrl" } + Property { name: "options"; type: "QFileDialogOptions::FileDialogOptions" } + Property { name: "nameFilters"; type: "QStringList" } + Property { + name: "selectedNameFilter" + type: "QQuickPlatformFileNameFilter" + isReadonly: true + isPointer: true + } + Property { name: "defaultSuffix"; type: "string" } + Property { name: "acceptLabel"; type: "string" } + Property { name: "rejectLabel"; type: "string" } + } + Component { + name: "QQuickPlatformFileNameFilter" + prototype: "QObject" + Property { name: "index"; type: "int" } + Property { name: "name"; type: "string"; isReadonly: true } + Property { name: "extensions"; type: "QStringList"; isReadonly: true } + Signal { + name: "indexChanged" + Parameter { name: "index"; type: "int" } + } + Signal { + name: "nameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "extensionsChanged" + Parameter { name: "extensions"; type: "QStringList" } + } + } + Component { + name: "QQuickPlatformFolderDialog" + defaultProperty: "data" + prototype: "QQuickPlatformDialog" + exports: ["Qt.labs.platform/FolderDialog 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "folder"; type: "QUrl" } + Property { name: "currentFolder"; type: "QUrl" } + Property { name: "options"; type: "QFileDialogOptions::FileDialogOptions" } + Property { name: "acceptLabel"; type: "string" } + Property { name: "rejectLabel"; type: "string" } + } + Component { + name: "QQuickPlatformFontDialog" + defaultProperty: "data" + prototype: "QQuickPlatformDialog" + exports: ["Qt.labs.platform/FontDialog 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "font"; type: "QFont" } + Property { name: "currentFont"; type: "QFont" } + Property { name: "options"; type: "QFontDialogOptions::FontDialogOptions" } + } + Component { + name: "QQuickPlatformMenu" + defaultProperty: "data" + prototype: "QObject" + exports: ["Qt.labs.platform/Menu 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "data"; type: "QObject"; isList: true; isReadonly: true } + Property { name: "items"; type: "QQuickPlatformMenuItem"; isList: true; isReadonly: true } + Property { name: "menuBar"; type: "QQuickPlatformMenuBar"; isReadonly: true; isPointer: true } + Property { name: "parentMenu"; type: "QQuickPlatformMenu"; isReadonly: true; isPointer: true } + Property { + name: "systemTrayIcon" + type: "QQuickPlatformSystemTrayIcon" + isReadonly: true + isPointer: true + } + Property { name: "menuItem"; type: "QQuickPlatformMenuItem"; isReadonly: true; isPointer: true } + Property { name: "enabled"; type: "bool" } + Property { name: "visible"; type: "bool" } + Property { name: "minimumWidth"; type: "int" } + Property { name: "type"; type: "QPlatformMenu::MenuType" } + Property { name: "title"; type: "string" } + Property { name: "iconSource"; type: "QUrl" } + Property { name: "iconName"; type: "string" } + Property { name: "font"; type: "QFont" } + Signal { name: "aboutToShow" } + Signal { name: "aboutToHide" } + Method { + name: "open" + Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true } + } + Method { name: "close" } + Method { + name: "addItem" + Parameter { name: "item"; type: "QQuickPlatformMenuItem"; isPointer: true } + } + Method { + name: "insertItem" + Parameter { name: "index"; type: "int" } + Parameter { name: "item"; type: "QQuickPlatformMenuItem"; isPointer: true } + } + Method { + name: "removeItem" + Parameter { name: "item"; type: "QQuickPlatformMenuItem"; isPointer: true } + } + Method { + name: "addMenu" + Parameter { name: "menu"; type: "QQuickPlatformMenu"; isPointer: true } + } + Method { + name: "insertMenu" + Parameter { name: "index"; type: "int" } + Parameter { name: "menu"; type: "QQuickPlatformMenu"; isPointer: true } + } + Method { + name: "removeMenu" + Parameter { name: "menu"; type: "QQuickPlatformMenu"; isPointer: true } + } + Method { name: "clear" } + } + Component { + name: "QQuickPlatformMenuBar" + defaultProperty: "data" + prototype: "QObject" + exports: ["Qt.labs.platform/MenuBar 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "data"; type: "QObject"; isList: true; isReadonly: true } + Property { name: "menus"; type: "QQuickPlatformMenu"; isList: true; isReadonly: true } + Property { name: "window"; type: "QWindow"; isPointer: true } + Method { + name: "addMenu" + Parameter { name: "menu"; type: "QQuickPlatformMenu"; isPointer: true } + } + Method { + name: "insertMenu" + Parameter { name: "index"; type: "int" } + Parameter { name: "menu"; type: "QQuickPlatformMenu"; isPointer: true } + } + Method { + name: "removeMenu" + Parameter { name: "menu"; type: "QQuickPlatformMenu"; isPointer: true } + } + Method { name: "clear" } + } + Component { + name: "QQuickPlatformMenuItem" + prototype: "QObject" + exports: ["Qt.labs.platform/MenuItem 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "menu"; type: "QQuickPlatformMenu"; isReadonly: true; isPointer: true } + Property { name: "subMenu"; type: "QQuickPlatformMenu"; isReadonly: true; isPointer: true } + Property { name: "group"; type: "QQuickPlatformMenuItemGroup"; isPointer: true } + Property { name: "enabled"; type: "bool" } + Property { name: "visible"; type: "bool" } + Property { name: "separator"; type: "bool" } + Property { name: "checkable"; type: "bool" } + Property { name: "checked"; type: "bool" } + Property { name: "role"; type: "QPlatformMenuItem::MenuRole" } + Property { name: "text"; type: "string" } + Property { name: "iconSource"; type: "QUrl" } + Property { name: "iconName"; type: "string" } + Property { name: "shortcut"; type: "QVariant" } + Property { name: "font"; type: "QFont" } + Signal { name: "triggered" } + Signal { name: "hovered" } + Method { name: "toggle" } + } + Component { + name: "QQuickPlatformMenuItemGroup" + prototype: "QObject" + exports: ["Qt.labs.platform/MenuItemGroup 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "enabled"; type: "bool" } + Property { name: "visible"; type: "bool" } + Property { name: "exclusive"; type: "bool" } + Property { name: "checkedItem"; type: "QQuickPlatformMenuItem"; isPointer: true } + Property { name: "items"; type: "QQuickPlatformMenuItem"; isList: true; isReadonly: true } + Signal { + name: "triggered" + Parameter { name: "item"; type: "QQuickPlatformMenuItem"; isPointer: true } + } + Signal { + name: "hovered" + Parameter { name: "item"; type: "QQuickPlatformMenuItem"; isPointer: true } + } + Method { + name: "addItem" + Parameter { name: "item"; type: "QQuickPlatformMenuItem"; isPointer: true } + } + Method { + name: "removeItem" + Parameter { name: "item"; type: "QQuickPlatformMenuItem"; isPointer: true } + } + Method { name: "clear" } + } + Component { + name: "QQuickPlatformMenuSeparator" + prototype: "QQuickPlatformMenuItem" + exports: ["Qt.labs.platform/MenuSeparator 1.0"] + exportMetaObjectRevisions: [0] + } + Component { + name: "QQuickPlatformMessageDialog" + defaultProperty: "data" + prototype: "QQuickPlatformDialog" + exports: ["Qt.labs.platform/MessageDialog 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "text"; type: "string" } + Property { name: "informativeText"; type: "string" } + Property { name: "detailedText"; type: "string" } + Property { name: "buttons"; type: "QPlatformDialogHelper::StandardButtons" } + Signal { + name: "clicked" + Parameter { name: "button"; type: "QPlatformDialogHelper::StandardButton" } + } + Signal { name: "okClicked" } + Signal { name: "saveClicked" } + Signal { name: "saveAllClicked" } + Signal { name: "openClicked" } + Signal { name: "yesClicked" } + Signal { name: "yesToAllClicked" } + Signal { name: "noClicked" } + Signal { name: "noToAllClicked" } + Signal { name: "abortClicked" } + Signal { name: "retryClicked" } + Signal { name: "ignoreClicked" } + Signal { name: "closeClicked" } + Signal { name: "cancelClicked" } + Signal { name: "discardClicked" } + Signal { name: "helpClicked" } + Signal { name: "applyClicked" } + Signal { name: "resetClicked" } + Signal { name: "restoreDefaultsClicked" } + } + Component { + name: "QQuickPlatformStandardPaths" + prototype: "QObject" + exports: ["Qt.labs.platform/StandardPaths 1.0"] + isCreatable: false + isSingleton: true + exportMetaObjectRevisions: [0] + Method { + name: "displayName" + type: "string" + Parameter { name: "type"; type: "QStandardPaths::StandardLocation" } + } + Method { + name: "findExecutable" + type: "QUrl" + Parameter { name: "executableName"; type: "string" } + Parameter { name: "paths"; type: "QStringList" } + } + Method { + name: "findExecutable" + type: "QUrl" + Parameter { name: "executableName"; type: "string" } + } + Method { + name: "locate" + type: "QUrl" + Parameter { name: "type"; type: "QStandardPaths::StandardLocation" } + Parameter { name: "fileName"; type: "string" } + Parameter { name: "options"; type: "QStandardPaths::LocateOptions" } + } + Method { + name: "locate" + type: "QUrl" + Parameter { name: "type"; type: "QStandardPaths::StandardLocation" } + Parameter { name: "fileName"; type: "string" } + } + Method { + name: "locateAll" + type: "QList<QUrl>" + Parameter { name: "type"; type: "QStandardPaths::StandardLocation" } + Parameter { name: "fileName"; type: "string" } + Parameter { name: "options"; type: "QStandardPaths::LocateOptions" } + } + Method { + name: "locateAll" + type: "QList<QUrl>" + Parameter { name: "type"; type: "QStandardPaths::StandardLocation" } + Parameter { name: "fileName"; type: "string" } + } + Method { + name: "setTestModeEnabled" + Parameter { name: "testMode"; type: "bool" } + } + Method { + name: "standardLocations" + type: "QList<QUrl>" + Parameter { name: "type"; type: "QStandardPaths::StandardLocation" } + } + Method { + name: "writableLocation" + type: "QUrl" + Parameter { name: "type"; type: "QStandardPaths::StandardLocation" } + } + } + Component { + name: "QQuickPlatformSystemTrayIcon" + prototype: "QObject" + exports: ["Qt.labs.platform/SystemTrayIcon 1.0"] + exportMetaObjectRevisions: [0] + Property { name: "available"; type: "bool"; isReadonly: true } + Property { name: "supportsMessages"; type: "bool"; isReadonly: true } + Property { name: "visible"; type: "bool" } + Property { name: "iconSource"; type: "QUrl" } + Property { name: "iconName"; type: "string" } + Property { name: "tooltip"; type: "string" } + Property { name: "menu"; type: "QQuickPlatformMenu"; isPointer: true } + Signal { + name: "activated" + Parameter { name: "reason"; type: "QPlatformSystemTrayIcon::ActivationReason" } + } + Signal { name: "messageClicked" } + Method { name: "show" } + Method { name: "hide" } + Method { + name: "showMessage" + Parameter { name: "title"; type: "string" } + Parameter { name: "message"; type: "string" } + Parameter { name: "iconType"; type: "QPlatformSystemTrayIcon::MessageIcon" } + Parameter { name: "msecs"; type: "int" } + } + Method { + name: "showMessage" + Parameter { name: "title"; type: "string" } + Parameter { name: "message"; type: "string" } + Parameter { name: "iconType"; type: "QPlatformSystemTrayIcon::MessageIcon" } + } + Method { + name: "showMessage" + Parameter { name: "title"; type: "string" } + Parameter { name: "message"; type: "string" } + } + } +} diff --git a/src/imports/platform/qmldir b/src/imports/platform/qmldir new file mode 100644 index 00000000..9653b7d3 --- /dev/null +++ b/src/imports/platform/qmldir @@ -0,0 +1,3 @@ +module Qt.labs.platform +plugin qtlabsplatformplugin +classname QtLabsPlatformPlugin diff --git a/src/imports/platform/qquickplatformcolordialog.cpp b/src/imports/platform/qquickplatformcolordialog.cpp new file mode 100644 index 00000000..36bb7d69 --- /dev/null +++ b/src/imports/platform/qquickplatformcolordialog.cpp @@ -0,0 +1,205 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformcolordialog_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype ColorDialog + \inherits Dialog + \instantiates QQuickPlatformColorDialog + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A native color dialog. + + The ColorDialog type provides a QML API for native platform color dialogs. + + \image qtlabsplatform-colordialog-gtk.png + + To show a color dialog, construct an instance of ColorDialog, set the + desired properties, and call \l {Dialog::}{open()}. The \l currentColor + property can be used to determine the currently selected color in the + dialog. The \l color property is updated only after the final selection + has been made by accepting the dialog. + + \code + MenuItem { + text: "Color" + onTriggered: colorDialog.open() + } + + ColorDialog { + id: colorDialog + currentColor: document.color + } + + MyDocument { + id: document + color: colorDialog.color + } + \endcode + + \section2 Availability + + A native platform color dialog is currently available on the following platforms: + + \list + \li macOS + \li Linux (when running with the GTK+ platform theme) + \endlist + + \input includes/widgets.qdocinc 1 + + \labs +*/ + +QQuickPlatformColorDialog::QQuickPlatformColorDialog(QObject *parent) + : QQuickPlatformDialog(QPlatformTheme::ColorDialog, parent), + m_options(QColorDialogOptions::create()) +{ +} + +/*! + \qmlproperty color Qt.labs.platform::ColorDialog::color + + This property holds the final accepted color. + + Unlike the \l currentColor property, the \c color property is not updated + while the user is selecting colors in the dialog, but only after the final + selection has been made. That is, when the user has clicked \uicontrol OK + to accept a color. Alternatively, the \l {Dialog::}{accepted()} signal + can be handled to get the final selection. + + \sa currentColor, {Dialog::}{accepted()} +*/ +QColor QQuickPlatformColorDialog::color() const +{ + return m_color; +} + +void QQuickPlatformColorDialog::setColor(const QColor &color) +{ + if (m_color == color) + return; + + m_color = color; + setCurrentColor(color); + emit colorChanged(); +} + +/*! + \qmlproperty color Qt.labs.platform::ColorDialog::currentColor + + This property holds the currently selected color in the dialog. + + Unlike the \l color property, the \c currentColor property is updated + while the user is selecting colors in the dialog, even before the final + selection has been made. + + \sa color +*/ +QColor QQuickPlatformColorDialog::currentColor() const +{ + if (QPlatformColorDialogHelper *colorDialog = qobject_cast<QPlatformColorDialogHelper *>(handle())) + return colorDialog->currentColor(); + return m_currentColor; +} + +void QQuickPlatformColorDialog::setCurrentColor(const QColor &color) +{ + if (QPlatformColorDialogHelper *colorDialog = qobject_cast<QPlatformColorDialogHelper *>(handle())) + colorDialog->setCurrentColor(color); + m_currentColor = color; +} + +/*! + \qmlproperty flags Qt.labs.platform::ColorDialog::options + + This property holds the various options that affect the look and feel of the dialog. + + By default, all options are disabled. + + Options should be set before showing the dialog. Setting them while the dialog is + visible is not guaranteed to have an immediate effect on the dialog (depending on + the option and on the platform). + + Available options: + \value ColorDialog.ShowAlphaChannel Allow the user to select the alpha component of a color. + \value ColorDialog.NoButtons Don't display \uicontrol OK and \uicontrol Cancel buttons (useful for "live dialogs"). +*/ +QColorDialogOptions::ColorDialogOptions QQuickPlatformColorDialog::options() const +{ + return m_options->options(); +} + +void QQuickPlatformColorDialog::setOptions(QColorDialogOptions::ColorDialogOptions options) +{ + if (options == m_options->options()) + return; + + m_options->setOptions(options); + emit optionsChanged(); +} + +bool QQuickPlatformColorDialog::useNativeDialog() const +{ + return QQuickPlatformDialog::useNativeDialog() + && !m_options->testOption(QColorDialogOptions::DontUseNativeDialog); +} + +void QQuickPlatformColorDialog::onCreate(QPlatformDialogHelper *dialog) +{ + if (QPlatformColorDialogHelper *colorDialog = qobject_cast<QPlatformColorDialogHelper *>(dialog)) { + connect(colorDialog, &QPlatformColorDialogHelper::currentColorChanged, this, &QQuickPlatformColorDialog::currentColorChanged); + colorDialog->setOptions(m_options); + } +} + +void QQuickPlatformColorDialog::onShow(QPlatformDialogHelper *dialog) +{ + m_options->setWindowTitle(title()); + if (QPlatformColorDialogHelper *colorDialog = qobject_cast<QPlatformColorDialogHelper *>(dialog)) + colorDialog->setOptions(m_options); +} + +void QQuickPlatformColorDialog::accept() +{ + setColor(currentColor()); + QQuickPlatformDialog::accept(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformcolordialog_p.h b/src/imports/platform/qquickplatformcolordialog_p.h new file mode 100644 index 00000000..33d6f0e8 --- /dev/null +++ b/src/imports/platform/qquickplatformcolordialog_p.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMCOLORDIALOG_P_H +#define QQUICKPLATFORMCOLORDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qquickplatformdialog_p.h" +#include <QtGui/qcolor.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQuickPlatformColorDialog : public QQuickPlatformDialog +{ + Q_OBJECT + Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged FINAL) + Q_PROPERTY(QColor currentColor READ currentColor WRITE setCurrentColor NOTIFY currentColorChanged FINAL) + Q_PROPERTY(QColorDialogOptions::ColorDialogOptions options READ options WRITE setOptions NOTIFY optionsChanged FINAL) + Q_FLAGS(QColorDialogOptions::ColorDialogOptions) + +public: + explicit QQuickPlatformColorDialog(QObject *parent = nullptr); + + QColor color() const; + void setColor(const QColor &color); + + QColor currentColor() const; + void setCurrentColor(const QColor &color); + + QColorDialogOptions::ColorDialogOptions options() const; + void setOptions(QColorDialogOptions::ColorDialogOptions options); + +Q_SIGNALS: + void colorChanged(); + void currentColorChanged(); + void optionsChanged(); + +protected: + bool useNativeDialog() const override; + void onCreate(QPlatformDialogHelper *dialog) override; + void onShow(QPlatformDialogHelper *dialog) override; + void accept() override; + +private: + QColor m_color; + QColor m_currentColor; // TODO: QColorDialogOptions::initialColor + QSharedPointer<QColorDialogOptions> m_options; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformColorDialog) + +#endif // QQUICKPLATFORMCOLORDIALOG_P_H diff --git a/src/imports/platform/qquickplatformdialog.cpp b/src/imports/platform/qquickplatformdialog.cpp new file mode 100644 index 00000000..95bc6426 --- /dev/null +++ b/src/imports/platform/qquickplatformdialog.cpp @@ -0,0 +1,409 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformdialog_p.h" + +#include <QtCore/qloggingcategory.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtQuick/qquickitem.h> +#include <QtQuick/qquickwindow.h> + +#include "widgets/qwidgetplatform_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Dialog + \inherits QtObject + \instantiates QQuickPlatformDialog + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief The base class of native dialogs. + + The Dialog type provides common QML API for native platform dialogs. + + To show a native dialog, construct an instance of one of the concrete + Dialog implementations, set the desired properties, and call \l open(). + Dialog emits \l accepted() or \l rejected() when the user is done with + the dialog. + + \labs +*/ + +/*! + \qmlsignal void Qt.labs.platform::Dialog::accepted() + + This signal is emitted when the dialog has been accepted either + interactively or by calling \l accept(). + + \note This signal is \e not emitted when closing the dialog with \l close(). + + \sa rejected() +*/ + +/*! + \qmlsignal void Qt.labs.platform::Dialog::rejected() + + This signal is emitted when the dialog has been rejected either + interactively or by calling \l reject(). + + \note This signal is \e not emitted when closing the dialog with \l close(). + + \sa accepted() +*/ + +Q_DECLARE_LOGGING_CATEGORY(qtLabsPlatformDialogs) + +QQuickPlatformDialog::QQuickPlatformDialog(QPlatformTheme::DialogType type, QObject *parent) + : QObject(parent), + m_visible(false), + m_complete(false), + m_result(0), + m_parentWindow(nullptr), + m_flags(Qt::Dialog), + m_modality(Qt::WindowModal), + m_type(type), + m_handle(nullptr) +{ +} + +QQuickPlatformDialog::~QQuickPlatformDialog() +{ + destroy(); +} + +QPlatformDialogHelper *QQuickPlatformDialog::handle() const +{ + return m_handle; +} + +/*! + \default + \qmlproperty list<Object> Qt.labs.platform::Dialog::data + + This default property holds the list of all objects declared as children of + the dialog. +*/ +QQmlListProperty<QObject> QQuickPlatformDialog::data() +{ + return QQmlListProperty<QObject>(this, m_data); +} + +/*! + \qmlproperty Window Qt.labs.platform::Dialog::parentWindow + + This property holds the parent window of the dialog. + + Unless explicitly set, the window is automatically resolved by iterating + the QML parent objects until a \l Window or an \l Item that has a window + is found. +*/ +QWindow *QQuickPlatformDialog::parentWindow() const +{ + return m_parentWindow; +} + +void QQuickPlatformDialog::setParentWindow(QWindow *window) +{ + if (m_parentWindow == window) + return; + + m_parentWindow = window; + emit parentWindowChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::Dialog::title + + This property holds the title of the dialog. +*/ +QString QQuickPlatformDialog::title() const +{ + return m_title; +} + +void QQuickPlatformDialog::setTitle(const QString &title) +{ + if (m_title == title) + return; + + m_title = title; + emit titleChanged(); +} + +/*! + \qmlproperty Qt::WindowFlags Qt.labs.platform::Dialog::flags + + This property holds the window flags of the dialog. The default value is \c Qt.Dialog. +*/ +Qt::WindowFlags QQuickPlatformDialog::flags() const +{ + return m_flags; +} + +void QQuickPlatformDialog::setFlags(Qt::WindowFlags flags) +{ + if (m_flags == flags) + return; + + m_flags = flags; + emit flagsChanged(); +} + +/*! + \qmlproperty Qt::WindowModality Qt.labs.platform::Dialog::modality + + This property holds the modality of the dialog. The default value is \c Qt.WindowModal. + + Available values: + \value Qt.NonModal The dialog is not modal and does not block input to other windows. + \value Qt.WindowModal The dialog is modal to a single window hierarchy and blocks input to its parent window, all grandparent windows, and all siblings of its parent and grandparent windows. + \value Qt.ApplicationModal The dialog is modal to the application and blocks input to all windows. +*/ +Qt::WindowModality QQuickPlatformDialog::modality() const +{ + return m_modality; +} + +void QQuickPlatformDialog::setModality(Qt::WindowModality modality) +{ + if (m_modality == modality) + return; + + m_modality = modality; + emit modalityChanged(); +} + +/*! + \qmlproperty bool Qt.labs.platform::Dialog::visible + + This property holds the visibility of the dialog. The default value is \c false. + + \sa open(), close() +*/ +bool QQuickPlatformDialog::isVisible() const +{ + return m_handle && m_visible; +} + +void QQuickPlatformDialog::setVisible(bool visible) +{ + if (visible) + open(); + else + close(); +} + +/*! + \qmlproperty int Qt.labs.platform::Dialog::result + + This property holds the result code. + + Standard result codes: + \value Dialog.Accepted + \value Dialog.Rejected + + \note MessageDialog sets the result to the value of the clicked standard + button instead of using the standard result codes. +*/ +int QQuickPlatformDialog::result() const +{ + return m_result; +} + +void QQuickPlatformDialog::setResult(int result) +{ + if (m_result == result) + return; + + m_result = result; + emit resultChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::Dialog::open() + + Opens the dialog. + + \sa visible, close() +*/ +void QQuickPlatformDialog::open() +{ + if (m_visible || !create()) + return; + + onShow(m_handle); + m_visible = m_handle->show(m_flags, m_modality, m_parentWindow); + if (m_visible) + emit visibleChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::Dialog::close() + + Closes the dialog. + + \sa visible, open() +*/ +void QQuickPlatformDialog::close() +{ + if (!m_handle || !m_visible) + return; + + onHide(m_handle); + m_handle->hide(); + m_visible = false; + emit visibleChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::Dialog::accept() + + Closes the dialog and emits the \l accepted() signal. + + \sa reject() +*/ +void QQuickPlatformDialog::accept() +{ + done(Accepted); +} + +/*! + \qmlmethod void Qt.labs.platform::Dialog::reject() + + Closes the dialog and emits the \l rejected() signal. + + \sa accept() +*/ +void QQuickPlatformDialog::reject() +{ + done(Rejected); +} + +/*! + \qmlmethod void Qt.labs.platform::Dialog::done(int result) + + Closes the dialog and sets the \a result. + + \sa accept(), reject(), result +*/ +void QQuickPlatformDialog::done(int result) +{ + close(); + setResult(result); + + if (result == Accepted) + emit accepted(); + else if (result == Rejected) + emit rejected(); +} + +void QQuickPlatformDialog::classBegin() +{ +} + +void QQuickPlatformDialog::componentComplete() +{ + m_complete = true; + if (!m_parentWindow) + setParentWindow(findParentWindow()); +} + +static const char *qmlTypeName(const QObject *object) +{ + return object->metaObject()->className() + qstrlen("QQuickPlatform"); +} + +bool QQuickPlatformDialog::create() +{ + if (!m_handle) { + if (useNativeDialog()) + m_handle = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(m_type); + if (!m_handle) + m_handle = QWidgetPlatform::createDialog(m_type, this); + qCDebug(qtLabsPlatformDialogs) << qmlTypeName(this) << "->" << m_handle; + if (m_handle) { + onCreate(m_handle); + connect(m_handle, &QPlatformDialogHelper::accept, this, &QQuickPlatformDialog::accept); + connect(m_handle, &QPlatformDialogHelper::reject, this, &QQuickPlatformDialog::reject); + } + } + return m_handle; +} + +void QQuickPlatformDialog::destroy() +{ + delete m_handle; + m_handle = nullptr; +} + +bool QQuickPlatformDialog::useNativeDialog() const +{ + return !QCoreApplication::testAttribute(Qt::AA_DontUseNativeDialogs) + && QGuiApplicationPrivate::platformTheme()->usePlatformNativeDialog(m_type); +} + +void QQuickPlatformDialog::onCreate(QPlatformDialogHelper *dialog) +{ + Q_UNUSED(dialog); +} + +void QQuickPlatformDialog::onShow(QPlatformDialogHelper *dialog) +{ + Q_UNUSED(dialog); +} + +void QQuickPlatformDialog::onHide(QPlatformDialogHelper *dialog) +{ + Q_UNUSED(dialog); +} + +QWindow *QQuickPlatformDialog::findParentWindow() const +{ + QObject *obj = parent(); + while (obj) { + QWindow *window = qobject_cast<QWindow *>(obj); + if (window) + return window; + QQuickItem *item = qobject_cast<QQuickItem *>(obj); + if (item && item->window()) + return item->window(); + obj = obj->parent(); + } + return nullptr; +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformdialog_p.h b/src/imports/platform/qquickplatformdialog_p.h new file mode 100644 index 00000000..a9797c1d --- /dev/null +++ b/src/imports/platform/qquickplatformdialog_p.h @@ -0,0 +1,153 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMDIALOG_P_H +#define QQUICKPLATFORMDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qobject.h> +#include <QtGui/qpa/qplatformtheme.h> +#include <QtGui/qpa/qplatformdialoghelper.h> +#include <QtQml/qqmlparserstatus.h> +#include <QtQml/qqmllist.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QWindow; +class QPlatformDialogHelper; + +class QQuickPlatformDialog : public QObject, public QQmlParserStatus +{ + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + Q_PROPERTY(QQmlListProperty<QObject> data READ data FINAL) + Q_PROPERTY(QWindow *parentWindow READ parentWindow WRITE setParentWindow NOTIFY parentWindowChanged FINAL) + Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged FINAL) + Q_PROPERTY(Qt::WindowFlags flags READ flags WRITE setFlags NOTIFY flagsChanged FINAL) + Q_PROPERTY(Qt::WindowModality modality READ modality WRITE setModality NOTIFY modalityChanged FINAL) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL) + Q_PROPERTY(int result READ result WRITE setResult NOTIFY resultChanged FINAL) + Q_CLASSINFO("DefaultProperty", "data") + Q_ENUMS(StandardCode) + +public: + explicit QQuickPlatformDialog(QPlatformTheme::DialogType type, QObject *parent = nullptr); + ~QQuickPlatformDialog(); + + QPlatformDialogHelper *handle() const; + + QQmlListProperty<QObject> data(); + + QWindow *parentWindow() const; + void setParentWindow(QWindow *window); + + QString title() const; + void setTitle(const QString &title); + + Qt::WindowFlags flags() const; + void setFlags(Qt::WindowFlags flags); + + Qt::WindowModality modality() const; + void setModality(Qt::WindowModality modality); + + bool isVisible() const; + void setVisible(bool visible); + + enum StandardCode { Rejected, Accepted }; + + int result() const; + void setResult(int result); + +public Q_SLOTS: + void open(); + void close(); + virtual void accept(); + virtual void reject(); + virtual void done(int result); + +Q_SIGNALS: + void accepted(); + void rejected(); + void parentWindowChanged(); + void titleChanged(); + void flagsChanged(); + void modalityChanged(); + void visibleChanged(); + void resultChanged(); + +protected: + void classBegin() override; + void componentComplete() override; + + bool create(); + void destroy(); + + virtual bool useNativeDialog() const; + virtual void onCreate(QPlatformDialogHelper *dialog); + virtual void onShow(QPlatformDialogHelper *dialog); + virtual void onHide(QPlatformDialogHelper *dialog); + + QWindow *findParentWindow() const; + +private: + bool m_visible; + bool m_complete; + int m_result; + QWindow *m_parentWindow; + QString m_title; + Qt::WindowFlags m_flags; + Qt::WindowModality m_modality; + QPlatformTheme::DialogType m_type; + QList<QObject *> m_data; + QPlatformDialogHelper *m_handle; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformDialog) + +#endif // QQUICKPLATFORMDIALOG_P_H diff --git a/src/imports/platform/qquickplatformfiledialog.cpp b/src/imports/platform/qquickplatformfiledialog.cpp new file mode 100644 index 00000000..6a0f4e13 --- /dev/null +++ b/src/imports/platform/qquickplatformfiledialog.cpp @@ -0,0 +1,660 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformfiledialog_p.h" + +#include <QtCore/qvector.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype FileDialog + \inherits Dialog + \instantiates QQuickPlatformFileDialog + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A native file dialog. + + The FileDialog type provides a QML API for native platform file dialogs. + + \image qtlabsplatform-filedialog-gtk.png + + To show a file dialog, construct an instance of FileDialog, set the + desired properties, and call \l {Dialog::}{open()}. The \l currentFile + or \l currentFiles properties can be used to determine the currently + selected file(s) in the dialog. The \l file and \l files properties + are updated only after the final selection has been made by accepting + the dialog. + + \code + MenuItem { + text: "Open..." + onTriggered: fileDialog.open() + } + + FileDialog { + id: fileDialog + currentFile: document.source + folder: StandardPaths.writableLocation(StandardPaths.DocumentsLocation) + } + + MyDocument { + id: document + source: fileDialog.file + } + \endcode + + \section2 Availability + + A native platform file dialog is currently available on the following platforms: + + \list + \li iOS + \li Linux (when running with the GTK+ platform theme) + \li macOS + \li Windows + \li WinRT + \endlist + + \input includes/widgets.qdocinc 1 + + \labs + + \sa FolderDialog, StandardPaths +*/ + +QQuickPlatformFileDialog::QQuickPlatformFileDialog(QObject *parent) + : QQuickPlatformDialog(QPlatformTheme::FileDialog, parent), + m_fileMode(OpenFile), + m_options(QFileDialogOptions::create()), + m_selectedNameFilter(nullptr) +{ + m_options->setFileMode(QFileDialogOptions::ExistingFile); + m_options->setAcceptMode(QFileDialogOptions::AcceptOpen); +} + +/*! + \qmlproperty enumeration Qt.labs.platform::FileDialog::fileMode + + This property holds the mode of the dialog. + + Available values: + \value FileDialog.OpenFile The dialog is used to select an existing file (default). + \value FileDialog.OpenFiles The dialog is used to select multiple existing files. + \value FileDialog.SaveFile The dialog is used to select any file. The file does not have to exist. +*/ +QQuickPlatformFileDialog::FileMode QQuickPlatformFileDialog::fileMode() const +{ + return m_fileMode; +} + +void QQuickPlatformFileDialog::setFileMode(FileMode mode) +{ + if (mode == m_fileMode) + return; + + switch (mode) { + case OpenFile: + m_options->setFileMode(QFileDialogOptions::ExistingFile); + m_options->setAcceptMode(QFileDialogOptions::AcceptOpen); + break; + case OpenFiles: + m_options->setFileMode(QFileDialogOptions::ExistingFiles); + m_options->setAcceptMode(QFileDialogOptions::AcceptOpen); + break; + case SaveFile: + m_options->setFileMode(QFileDialogOptions::AnyFile); + m_options->setAcceptMode(QFileDialogOptions::AcceptSave); + break; + default: + break; + } + + m_fileMode = mode; + emit fileModeChanged(); +} + +/*! + \qmlproperty url Qt.labs.platform::FileDialog::file + + This property holds the final accepted file. + + Unlike the \l currentFile property, the \c file property is not updated + while the user is selecting files in the dialog, but only after the final + selection has been made. That is, when the user has clicked \uicontrol OK + to accept a file. Alternatively, the \l {Dialog::}{accepted()} signal + can be handled to get the final selection. + + \sa currentFile, {Dialog::}{accepted()} +*/ +QUrl QQuickPlatformFileDialog::file() const +{ + return addDefaultSuffix(m_files.value(0)); +} + +void QQuickPlatformFileDialog::setFile(const QUrl &file) +{ + setFiles(QList<QUrl>() << file); +} + +/*! + \qmlproperty list<url> Qt.labs.platform::FileDialog::files + + This property holds the final accepted files. + + Unlike the \l currentFiles property, the \c files property is not updated + while the user is selecting files in the dialog, but only after the final + selection has been made. That is, when the user has clicked \uicontrol OK + to accept files. Alternatively, the \l {Dialog::}{accepted()} signal + can be handled to get the final selection. + + \sa currentFiles, {Dialog::}{accepted()} +*/ +QList<QUrl> QQuickPlatformFileDialog::files() const +{ + return addDefaultSuffixes(m_files); +} + +void QQuickPlatformFileDialog::setFiles(const QList<QUrl> &files) +{ + if (m_files == files) + return; + + bool firstChanged = m_files.value(0) != files.value(0); + m_files = files; + if (firstChanged) + emit fileChanged(); + emit filesChanged(); +} + +/*! + \qmlproperty url Qt.labs.platform::FileDialog::currentFile + + This property holds the currently selected file in the dialog. + + Unlike the \l file property, the \c currentFile property is updated + while the user is selecting files in the dialog, even before the final + selection has been made. + + \sa file, currentFiles +*/ +QUrl QQuickPlatformFileDialog::currentFile() const +{ + return currentFiles().value(0); +} + +void QQuickPlatformFileDialog::setCurrentFile(const QUrl &file) +{ + setCurrentFiles(QList<QUrl>() << file); +} + +/*! + \qmlproperty list<url> Qt.labs.platform::FileDialog::currentFiles + + This property holds the currently selected files in the dialog. + + Unlike the \l files property, the \c currentFiles property is updated + while the user is selecting files in the dialog, even before the final + selection has been made. + + \sa files, currentFile +*/ +QList<QUrl> QQuickPlatformFileDialog::currentFiles() const +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) + return fileDialog->selectedFiles(); + return m_options->initiallySelectedFiles(); +} + +void QQuickPlatformFileDialog::setCurrentFiles(const QList<QUrl> &files) +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) { + for (const QUrl &file : files) + fileDialog->selectFile(file); + } + m_options->setInitiallySelectedFiles(files); +} + +/*! + \qmlproperty url Qt.labs.platform::FileDialog::folder + + This property holds the folder where files are selected. + For selecting a folder, use FolderDialog instead. + + \sa FolderDialog +*/ +QUrl QQuickPlatformFileDialog::folder() const +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) + return fileDialog->directory(); + return m_options->initialDirectory(); +} + +void QQuickPlatformFileDialog::setFolder(const QUrl &folder) +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) + fileDialog->setDirectory(folder); + m_options->setInitialDirectory(folder); +} + +/*! + \qmlproperty flags Qt.labs.platform::FileDialog::options + + This property holds the various options that affect the look and feel of the dialog. + + By default, all options are disabled. + + Options should be set before showing the dialog. Setting them while the dialog is + visible is not guaranteed to have an immediate effect on the dialog (depending on + the option and on the platform). + + Available options: + \value FileDialog.DontResolveSymlinks Don't resolve symlinks in the file dialog. By default symlinks are resolved. + \value FileDialog.DontConfirmOverwrite Don't ask for confirmation if an existing file is selected. By default confirmation is requested. + \value FileDialog.ReadOnly Indicates that the dialog doesn't allow creating directories. + \value FileDialog.HideNameFilterDetails Indicates if the file name filter details are hidden or not. +*/ +QFileDialogOptions::FileDialogOptions QQuickPlatformFileDialog::options() const +{ + return m_options->options(); +} + +void QQuickPlatformFileDialog::setOptions(QFileDialogOptions::FileDialogOptions options) +{ + if (options == m_options->options()) + return; + + m_options->setOptions(options); + emit optionsChanged(); +} + +void QQuickPlatformFileDialog::resetOptions() +{ + setOptions(0); +} + +/*! + \qmlproperty list<string> Qt.labs.platform::FileDialog::nameFilters + + This property holds the filters that restrict the types of files that + can be selected. + + \code + FileDialog { + nameFilters: ["Text files (*.txt)", "HTML files (*.html *.htm)"] + } + \endcode + + \note \b{*.*} is not a portable filter, because the historical assumption + that the file extension determines the file type is not consistent on every + operating system. It is possible to have a file with no dot in its name (for + example, \c Makefile). In a native Windows file dialog, \b{*.*} will match + such files, while in other types of file dialogs it may not. So it is better + to use \b{*} if you mean to select any file. + + \sa selectedNameFilter +*/ +QStringList QQuickPlatformFileDialog::nameFilters() const +{ + return m_options->nameFilters(); +} + +void QQuickPlatformFileDialog::setNameFilters(const QStringList &filters) +{ + if (filters == m_options->nameFilters()) + return; + + m_options->setNameFilters(filters); + if (m_selectedNameFilter) { + int index = m_selectedNameFilter->index(); + if (index < 0 || index >= filters.count()) + index = 0; + m_selectedNameFilter->update(filters.value(index)); + } + emit nameFiltersChanged(); +} + +void QQuickPlatformFileDialog::resetNameFilters() +{ + setNameFilters(QStringList()); +} + +/*! + \qmlpropertygroup Qt.labs.platform::FileDialog::selectedNameFilter + \qmlproperty int Qt.labs.platform::FileDialog::selectedNameFilter.index + \qmlproperty string Qt.labs.platform::FileDialog::selectedNameFilter.name + \qmlproperty list<string> Qt.labs.platform::FileDialog::selectedNameFilter.extensions + + These properties hold the currently selected name filter. + + \table + \header + \li Name + \li Description + \row + \li \b index : int + \li This property determines which \l {nameFilters}{name filter} is selected. + The specified filter is selected when the dialog is opened. The value is + updated when the user selects another filter. + \row + \li [read-only] \b name : string + \li This property holds the name of the selected filter. In the + example below, the name of the first filter is \c {"Text files"} + and the second is \c {"HTML files"}. + \row + \li [read-only] \b extensions : list<string> + \li This property holds the list of extensions of the selected filter. + In the example below, the list of extensions of the first filter is + \c {["txt"]} and the second is \c {["html", "htm"]}. + \endtable + + \code + FileDialog { + id: fileDialog + selectedNameFilter.index: 1 + nameFilters: ["Text files (*.txt)", "HTML files (*.html *.htm)"] + } + + MyDocument { + id: document + fileType: fileDialog.selectedNameFilter.extensions[0] + } + \endcode + + \sa nameFilters +*/ +QQuickPlatformFileNameFilter *QQuickPlatformFileDialog::selectedNameFilter() const +{ + if (!m_selectedNameFilter) { + QQuickPlatformFileDialog *that = const_cast<QQuickPlatformFileDialog *>(this); + m_selectedNameFilter = new QQuickPlatformFileNameFilter(that); + m_selectedNameFilter->setOptions(m_options); + } + return m_selectedNameFilter; +} + +/*! + \qmlproperty string Qt.labs.platform::FileDialog::defaultSuffix + + This property holds a suffix that is added to selected files that have + no suffix specified. The suffix is typically used to indicate the file + type (e.g. "txt" indicates a text file). + + If the first character is a dot ('.'), it is removed. +*/ +QString QQuickPlatformFileDialog::defaultSuffix() const +{ + return m_options->defaultSuffix(); +} + +void QQuickPlatformFileDialog::setDefaultSuffix(const QString &suffix) +{ + if (suffix == m_options->defaultSuffix()) + return; + + m_options->setDefaultSuffix(suffix); + emit defaultSuffixChanged(); +} + +void QQuickPlatformFileDialog::resetDefaultSuffix() +{ + setDefaultSuffix(QString()); +} + +/*! + \qmlproperty string Qt.labs.platform::FileDialog::acceptLabel + + This property holds the label text shown on the button that accepts the dialog. + + When set to an empty string, the default label of the underlying platform is used. + The default label is typically \uicontrol Open or \uicontrol Save depending on which + \l fileMode the dialog is used in. + + The default value is an empty string. + + \sa rejectLabel +*/ +QString QQuickPlatformFileDialog::acceptLabel() const +{ + return m_options->labelText(QFileDialogOptions::Accept); +} + +void QQuickPlatformFileDialog::setAcceptLabel(const QString &label) +{ + if (label == m_options->labelText(QFileDialogOptions::Accept)) + return; + + m_options->setLabelText(QFileDialogOptions::Accept, label); + emit acceptLabelChanged(); +} + +void QQuickPlatformFileDialog::resetAcceptLabel() +{ + setAcceptLabel(QString()); +} + +/*! + \qmlproperty string Qt.labs.platform::FileDialog::rejectLabel + + This property holds the label text shown on the button that rejects the dialog. + + When set to an empty string, the default label of the underlying platform is used. + The default label is typically \uicontrol Cancel. + + The default value is an empty string. + + \sa acceptLabel +*/ +QString QQuickPlatformFileDialog::rejectLabel() const +{ + return m_options->labelText(QFileDialogOptions::Reject); +} + +void QQuickPlatformFileDialog::setRejectLabel(const QString &label) +{ + if (label == m_options->labelText(QFileDialogOptions::Reject)) + return; + + m_options->setLabelText(QFileDialogOptions::Reject, label); + emit rejectLabelChanged(); +} + +void QQuickPlatformFileDialog::resetRejectLabel() +{ + setRejectLabel(QString()); +} + +bool QQuickPlatformFileDialog::useNativeDialog() const +{ + return QQuickPlatformDialog::useNativeDialog() + && !m_options->testOption(QFileDialogOptions::DontUseNativeDialog); +} + +void QQuickPlatformFileDialog::onCreate(QPlatformDialogHelper *dialog) +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) { + // TODO: emit currentFileChanged only when the first entry in currentFiles changes + connect(fileDialog, &QPlatformFileDialogHelper::currentChanged, this, &QQuickPlatformFileDialog::currentFileChanged); + connect(fileDialog, &QPlatformFileDialogHelper::currentChanged, this, &QQuickPlatformFileDialog::currentFilesChanged); + connect(fileDialog, &QPlatformFileDialogHelper::directoryEntered, this, &QQuickPlatformFileDialog::folderChanged); + fileDialog->setOptions(m_options); + } +} + +void QQuickPlatformFileDialog::onShow(QPlatformDialogHelper *dialog) +{ + m_options->setWindowTitle(title()); + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) { + fileDialog->setOptions(m_options); + if (m_selectedNameFilter) { + const int index = m_selectedNameFilter->index(); + const QString filter = m_options->nameFilters().value(index); + m_options->setInitiallySelectedNameFilter(filter); + fileDialog->selectNameFilter(filter); + connect(fileDialog, &QPlatformFileDialogHelper::filterSelected, m_selectedNameFilter, &QQuickPlatformFileNameFilter::update); + } + } +} + +void QQuickPlatformFileDialog::onHide(QPlatformDialogHelper *dialog) +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) { + if (m_selectedNameFilter) + disconnect(fileDialog, &QPlatformFileDialogHelper::filterSelected, m_selectedNameFilter, &QQuickPlatformFileNameFilter::update); + } +} + +void QQuickPlatformFileDialog::accept() +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) + setFiles(fileDialog->selectedFiles()); + QQuickPlatformDialog::accept(); +} + +QUrl QQuickPlatformFileDialog::addDefaultSuffix(const QUrl &file) const +{ + QUrl url = file; + const QString path = url.path(); + const QString suffix = m_options->defaultSuffix(); + if (!suffix.isEmpty() && !path.endsWith(QLatin1Char('/')) && path.lastIndexOf(QLatin1Char('.')) == -1) + url.setPath(path + QLatin1Char('.') + suffix); + return url; +} + +QList<QUrl> QQuickPlatformFileDialog::addDefaultSuffixes(const QList<QUrl> &files) const +{ + QList<QUrl> urls; + urls.reserve(files.size()); + for (const QUrl &file : files) + urls += addDefaultSuffix(file); + return urls; +} + +QQuickPlatformFileNameFilter::QQuickPlatformFileNameFilter(QObject *parent) + : QObject(parent), m_index(-1) +{ +} + +int QQuickPlatformFileNameFilter::index() const +{ + return m_index; +} + +void QQuickPlatformFileNameFilter::setIndex(int index) +{ + if (m_index == index) + return; + + m_index = index; + emit indexChanged(index); +} + +QString QQuickPlatformFileNameFilter::name() const +{ + return m_name; +} + +QStringList QQuickPlatformFileNameFilter::extensions() const +{ + return m_extensions; +} + +QSharedPointer<QFileDialogOptions> QQuickPlatformFileNameFilter::options() const +{ + return m_options; +} + +void QQuickPlatformFileNameFilter::setOptions(const QSharedPointer<QFileDialogOptions> &options) +{ + m_options = options; +} + +static QString extractName(const QString &filter) +{ + return filter.left(filter.indexOf(QLatin1Char('(')) - 1); +} + +static QString extractExtension(const QString &filter) +{ + return filter.mid(filter.indexOf(QLatin1Char('.')) + 1); +} + +static QStringList extractExtensions(const QString &filter) +{ + QStringList extensions; + const int from = filter.indexOf(QLatin1Char('(')); + const int to = filter.lastIndexOf(QLatin1Char(')')) - 1; + if (from >= 0 && from < to) { + const QStringRef ref = filter.midRef(from + 1, to - from); + const QVector<QStringRef> exts = ref.split(QLatin1Char(' '), QString::SkipEmptyParts); + for (const QStringRef &ref : exts) + extensions += extractExtension(ref.toString()); + } + + return extensions; +} + +void QQuickPlatformFileNameFilter::update(const QString &filter) +{ + const QStringList filters = nameFilters(); + + const int oldIndex = m_index; + const QString oldName = m_name; + const QStringList oldExtensions = m_extensions; + + m_index = filters.indexOf(filter); + m_name = extractName(filter); + m_extensions = extractExtensions(filter); + + if (oldIndex != m_index) + emit indexChanged(m_index); + if (oldName != m_name) + emit nameChanged(m_name); + if (oldExtensions != m_extensions) + emit extensionsChanged(m_extensions); +} + +QStringList QQuickPlatformFileNameFilter::nameFilters() const +{ + return m_options ? m_options->nameFilters() : QStringList(); +} + +QString QQuickPlatformFileNameFilter::nameFilter(int index) const +{ + return m_options ? m_options->nameFilters().value(index) : QString(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformfiledialog_p.h b/src/imports/platform/qquickplatformfiledialog_p.h new file mode 100644 index 00000000..51f88d46 --- /dev/null +++ b/src/imports/platform/qquickplatformfiledialog_p.h @@ -0,0 +1,196 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMFILEDIALOG_P_H +#define QQUICKPLATFORMFILEDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qquickplatformdialog_p.h" +#include <QtCore/qurl.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQuickPlatformFileNameFilter; + +class QQuickPlatformFileDialog : public QQuickPlatformDialog +{ + Q_OBJECT + Q_PROPERTY(FileMode fileMode READ fileMode WRITE setFileMode NOTIFY fileModeChanged FINAL) + Q_PROPERTY(QUrl file READ file WRITE setFile NOTIFY fileChanged FINAL) + Q_PROPERTY(QList<QUrl> files READ files WRITE setFiles NOTIFY filesChanged FINAL) + Q_PROPERTY(QUrl currentFile READ currentFile WRITE setCurrentFile NOTIFY currentFileChanged FINAL) + Q_PROPERTY(QList<QUrl> currentFiles READ currentFiles WRITE setCurrentFiles NOTIFY currentFilesChanged FINAL) + Q_PROPERTY(QUrl folder READ folder WRITE setFolder NOTIFY folderChanged FINAL) + Q_PROPERTY(QFileDialogOptions::FileDialogOptions options READ options WRITE setOptions RESET resetOptions NOTIFY optionsChanged FINAL) + Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters RESET resetNameFilters NOTIFY nameFiltersChanged FINAL) + Q_PROPERTY(QQuickPlatformFileNameFilter *selectedNameFilter READ selectedNameFilter CONSTANT) + Q_PROPERTY(QString defaultSuffix READ defaultSuffix WRITE setDefaultSuffix RESET resetDefaultSuffix NOTIFY defaultSuffixChanged FINAL) + Q_PROPERTY(QString acceptLabel READ acceptLabel WRITE setAcceptLabel RESET resetAcceptLabel NOTIFY acceptLabelChanged FINAL) + Q_PROPERTY(QString rejectLabel READ rejectLabel WRITE setRejectLabel RESET resetRejectLabel NOTIFY rejectLabelChanged FINAL) + Q_FLAGS(QFileDialogOptions::FileDialogOptions) + +public: + explicit QQuickPlatformFileDialog(QObject *parent = nullptr); + + enum FileMode { + OpenFile, + OpenFiles, + SaveFile + }; + Q_ENUM(FileMode) + + FileMode fileMode() const; + void setFileMode(FileMode fileMode); + + QUrl file() const; + void setFile(const QUrl &file); + + QList<QUrl> files() const; + void setFiles(const QList<QUrl> &files); + + QUrl currentFile() const; + void setCurrentFile(const QUrl &file); + + QList<QUrl> currentFiles() const; + void setCurrentFiles(const QList<QUrl> &files); + + QUrl folder() const; + void setFolder(const QUrl &folder); + + QFileDialogOptions::FileDialogOptions options() const; + void setOptions(QFileDialogOptions::FileDialogOptions options); + void resetOptions(); + + QStringList nameFilters() const; + void setNameFilters(const QStringList &filters); + void resetNameFilters(); + + QQuickPlatformFileNameFilter *selectedNameFilter() const; + + QString defaultSuffix() const; + void setDefaultSuffix(const QString &suffix); + void resetDefaultSuffix(); + + QString acceptLabel() const; + void setAcceptLabel(const QString &label); + void resetAcceptLabel(); + + QString rejectLabel() const; + void setRejectLabel(const QString &label); + void resetRejectLabel(); + +Q_SIGNALS: + void fileModeChanged(); + void fileChanged(); + void filesChanged(); + void currentFileChanged(); + void currentFilesChanged(); + void folderChanged(); + void optionsChanged(); + void nameFiltersChanged(); + void defaultSuffixChanged(); + void acceptLabelChanged(); + void rejectLabelChanged(); + +protected: + bool useNativeDialog() const override; + void onCreate(QPlatformDialogHelper *dialog) override; + void onShow(QPlatformDialogHelper *dialog) override; + void onHide(QPlatformDialogHelper *dialog) override; + void accept() override; + +private: + QUrl addDefaultSuffix(const QUrl &file) const; + QList<QUrl> addDefaultSuffixes(const QList<QUrl> &files) const; + + FileMode m_fileMode; + QList<QUrl> m_files; + QSharedPointer<QFileDialogOptions> m_options; + mutable QQuickPlatformFileNameFilter *m_selectedNameFilter; +}; + +class QQuickPlatformFileNameFilter : public QObject +{ + Q_OBJECT + Q_PROPERTY(int index READ index WRITE setIndex NOTIFY indexChanged FINAL) + Q_PROPERTY(QString name READ name NOTIFY nameChanged FINAL) + Q_PROPERTY(QStringList extensions READ extensions NOTIFY extensionsChanged FINAL) + +public: + explicit QQuickPlatformFileNameFilter(QObject *parent = nullptr); + + int index() const; + void setIndex(int index); + + QString name() const; + QStringList extensions() const; + + QSharedPointer<QFileDialogOptions> options() const; + void setOptions(const QSharedPointer<QFileDialogOptions> &options); + + void update(const QString &filter); + +Q_SIGNALS: + void indexChanged(int index); + void nameChanged(const QString &name); + void extensionsChanged(const QStringList &extensions); + +private: + QStringList nameFilters() const; + QString nameFilter(int index) const; + + int m_index; + QString m_name; + QStringList m_extensions; + QSharedPointer<QFileDialogOptions> m_options; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformFileDialog) + +#endif // QQUICKPLATFORMFILEDIALOG_P_H diff --git a/src/imports/platform/qquickplatformfolderdialog.cpp b/src/imports/platform/qquickplatformfolderdialog.cpp new file mode 100644 index 00000000..c56658c4 --- /dev/null +++ b/src/imports/platform/qquickplatformfolderdialog.cpp @@ -0,0 +1,281 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformfolderdialog_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype FolderDialog + \inherits Dialog + \instantiates QQuickPlatformFolderDialog + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A native folder dialog. + + The FolderDialog type provides a QML API for native platform folder dialogs. + + \image qtlabsplatform-folderdialog-gtk.png + + To show a folder dialog, construct an instance of FolderDialog, set the + desired properties, and call \l {Dialog::}{open()}. The \l currentFolder + property can be used to determine the currently selected folder in the + dialog. The \l folder property is updated only after the final selection + has been made by accepting the dialog. + + \code + MenuItem { + text: "Open..." + onTriggered: folderDialog.open() + } + + FolderDialog { + id: folderDialog + currentFolder: viewer.folder + folder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0] + } + + MyViewer { + id: viewer + folder: folderDialog.folder + } + \endcode + + \section2 Availability + + A native platform folder dialog is currently available on the following platforms: + + \list + \li iOS + \li Linux (when running with the GTK+ platform theme) + \li macOS + \li Windows + \li WinRT + \endlist + + \input includes/widgets.qdocinc 1 + + \labs + + \sa FileDialog, StandardPaths +*/ + +QQuickPlatformFolderDialog::QQuickPlatformFolderDialog(QObject *parent) + : QQuickPlatformDialog(QPlatformTheme::FileDialog, parent), + m_options(QFileDialogOptions::create()) +{ + m_options->setFileMode(QFileDialogOptions::Directory); + m_options->setAcceptMode(QFileDialogOptions::AcceptOpen); +} + +/*! + \qmlproperty url Qt.labs.platform::FolderDialog::folder + + This property holds the final accepted folder. + + Unlike the \l currentFolder property, the \c folder property is not updated + while the user is selecting folders in the dialog, but only after the final + selection has been made. That is, when the user has clicked \uicontrol OK + to accept a folder. Alternatively, the \l {Dialog::}{accepted()} signal + can be handled to get the final selection. + + \sa currentFolder, {Dialog::}{accepted()} +*/ +QUrl QQuickPlatformFolderDialog::folder() const +{ + return m_folder; +} + +void QQuickPlatformFolderDialog::setFolder(const QUrl &folder) +{ + if (m_folder == folder) + return; + + m_folder = folder; + setCurrentFolder(folder); + emit folderChanged(); +} + +/*! + \qmlproperty url Qt.labs.platform::FolderDialog::currentFolder + + This property holds the currently selected folder in the dialog. + + Unlike the \l folder property, the \c currentFolder property is updated + while the user is selecting folders in the dialog, even before the final + selection has been made. + + \sa folder +*/ +QUrl QQuickPlatformFolderDialog::currentFolder() const +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) + return fileDialog->directory(); + return m_options->initialDirectory(); +} + +void QQuickPlatformFolderDialog::setCurrentFolder(const QUrl &folder) +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) + fileDialog->setDirectory(folder); + m_options->setInitialDirectory(folder); +} + +/*! + \qmlproperty flags Qt.labs.platform::FolderDialog::options + + This property holds the various options that affect the look and feel of the dialog. + + By default, all options are disabled. + + Options should be set before showing the dialog. Setting them while the dialog is + visible is not guaranteed to have an immediate effect on the dialog (depending on + the option and on the platform). + + Available options: + \value FolderDialog.ShowDirsOnly Only show directories in the folder dialog. By default both folders and directories are shown. + \value FolderDialog.DontResolveSymlinks Don't resolve symlinks in the folder dialog. By default symlinks are resolved. + \value FolderDialog.ReadOnly Indicates that the dialog doesn't allow creating directories. +*/ +QFileDialogOptions::FileDialogOptions QQuickPlatformFolderDialog::options() const +{ + return m_options->options(); +} + +void QQuickPlatformFolderDialog::setOptions(QFileDialogOptions::FileDialogOptions options) +{ + if (options == m_options->options()) + return; + + m_options->setOptions(options); + emit optionsChanged(); +} + +void QQuickPlatformFolderDialog::resetOptions() +{ + setOptions(0); +} + +/*! + \qmlproperty string Qt.labs.platform::FolderDialog::acceptLabel + + This property holds the label text shown on the button that accepts the dialog. + + When set to an empty string, the default label of the underlying platform is used. + The default label is typically \uicontrol Open. + + The default value is an empty string. + + \sa rejectLabel +*/ +QString QQuickPlatformFolderDialog::acceptLabel() const +{ + return m_options->labelText(QFileDialogOptions::Accept); +} + +void QQuickPlatformFolderDialog::setAcceptLabel(const QString &label) +{ + if (label == m_options->labelText(QFileDialogOptions::Accept)) + return; + + m_options->setLabelText(QFileDialogOptions::Accept, label); + emit acceptLabelChanged(); +} + +void QQuickPlatformFolderDialog::resetAcceptLabel() +{ + setAcceptLabel(QString()); +} + +/*! + \qmlproperty string Qt.labs.platform::FolderDialog::rejectLabel + + This property holds the label text shown on the button that rejects the dialog. + + When set to an empty string, the default label of the underlying platform is used. + The default label is typically \uicontrol Cancel. + + The default value is an empty string. + + \sa acceptLabel +*/ +QString QQuickPlatformFolderDialog::rejectLabel() const +{ + return m_options->labelText(QFileDialogOptions::Reject); +} + +void QQuickPlatformFolderDialog::setRejectLabel(const QString &label) +{ + if (label == m_options->labelText(QFileDialogOptions::Reject)) + return; + + m_options->setLabelText(QFileDialogOptions::Reject, label); + emit rejectLabelChanged(); +} + +void QQuickPlatformFolderDialog::resetRejectLabel() +{ + setRejectLabel(QString()); +} + +bool QQuickPlatformFolderDialog::useNativeDialog() const +{ + return QQuickPlatformDialog::useNativeDialog() + && !m_options->testOption(QFileDialogOptions::DontUseNativeDialog); +} + +void QQuickPlatformFolderDialog::onCreate(QPlatformDialogHelper *dialog) +{ + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) { + connect(fileDialog, &QPlatformFileDialogHelper::directoryEntered, this, &QQuickPlatformFolderDialog::currentFolderChanged); + fileDialog->setOptions(m_options); + } +} + +void QQuickPlatformFolderDialog::onShow(QPlatformDialogHelper *dialog) +{ + m_options->setWindowTitle(title()); + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) + fileDialog->setOptions(m_options); +} + +void QQuickPlatformFolderDialog::accept() +{ + setFolder(currentFolder()); + QQuickPlatformDialog::accept(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformfolderdialog_p.h b/src/imports/platform/qquickplatformfolderdialog_p.h new file mode 100644 index 00000000..d9ecd1fb --- /dev/null +++ b/src/imports/platform/qquickplatformfolderdialog_p.h @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMFOLDERDIALOG_P_H +#define QQUICKPLATFORMFOLDERDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This folder is not part of the Qt API. It exists purely as an +// implementation detail. This header folder may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qquickplatformdialog_p.h" +#include <QtCore/qurl.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQuickPlatformFolderDialog : public QQuickPlatformDialog +{ + Q_OBJECT + Q_PROPERTY(QUrl folder READ folder WRITE setFolder NOTIFY folderChanged FINAL) + Q_PROPERTY(QUrl currentFolder READ currentFolder WRITE setCurrentFolder NOTIFY currentFolderChanged FINAL) + Q_PROPERTY(QFileDialogOptions::FileDialogOptions options READ options WRITE setOptions RESET resetOptions NOTIFY optionsChanged FINAL) + Q_PROPERTY(QString acceptLabel READ acceptLabel WRITE setAcceptLabel RESET resetAcceptLabel NOTIFY acceptLabelChanged FINAL) + Q_PROPERTY(QString rejectLabel READ rejectLabel WRITE setRejectLabel RESET resetRejectLabel NOTIFY rejectLabelChanged FINAL) + Q_FLAGS(QFileDialogOptions::FileDialogOptions) + +public: + explicit QQuickPlatformFolderDialog(QObject *parent = nullptr); + + QUrl folder() const; + void setFolder(const QUrl &folder); + + QUrl currentFolder() const; + void setCurrentFolder(const QUrl &folder); + + QFileDialogOptions::FileDialogOptions options() const; + void setOptions(QFileDialogOptions::FileDialogOptions options); + void resetOptions(); + + QString acceptLabel() const; + void setAcceptLabel(const QString &label); + void resetAcceptLabel(); + + QString rejectLabel() const; + void setRejectLabel(const QString &label); + void resetRejectLabel(); + +Q_SIGNALS: + void folderChanged(); + void currentFolderChanged(); + void optionsChanged(); + void acceptLabelChanged(); + void rejectLabelChanged(); + +protected: + bool useNativeDialog() const override; + void onCreate(QPlatformDialogHelper *dialog) override; + void onShow(QPlatformDialogHelper *dialog) override; + void accept() override; + +private: + QUrl m_folder; + QSharedPointer<QFileDialogOptions> m_options; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformFolderDialog) + +#endif // QQUICKPLATFORMFOLDERDIALOG_P_H diff --git a/src/imports/platform/qquickplatformfontdialog.cpp b/src/imports/platform/qquickplatformfontdialog.cpp new file mode 100644 index 00000000..edefe645 --- /dev/null +++ b/src/imports/platform/qquickplatformfontdialog.cpp @@ -0,0 +1,208 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformfontdialog_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype FontDialog + \inherits Dialog + \instantiates QQuickPlatformFontDialog + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A native font dialog. + + The FontDialog type provides a QML API for native platform font dialogs. + + \image qtlabsplatform-fontdialog-gtk.png + + To show a font dialog, construct an instance of FontDialog, set the + desired properties, and call \l {Dialog::}{open()}. The \l currentFont + property can be used to determine the currently selected font in the + dialog. The \l font property is updated only after the final selection + has been made by accepting the dialog. + + \code + MenuItem { + text: "Font" + onTriggered: fontDialog.open() + } + + FontDialog { + id: fontDialog + currentFont.family: document.font + } + + MyDocument { + id: document + font: fontDialog.font + } + \endcode + + \section2 Availability + + A native platform font dialog is currently available on the following platforms: + + \list + \li macOS + \li Linux (when running with the GTK+ platform theme) + \endlist + + \input includes/widgets.qdocinc 1 + + \labs +*/ + +QQuickPlatformFontDialog::QQuickPlatformFontDialog(QObject *parent) + : QQuickPlatformDialog(QPlatformTheme::FontDialog, parent), + m_options(QFontDialogOptions::create()) +{ +} + +/*! + \qmlproperty font Qt.labs.platform::FontDialog::font + + This property holds the final accepted font. + + Unlike the \l currentFont property, the \c font property is not updated + while the user is selecting fonts in the dialog, but only after the final + selection has been made. That is, when the user has clicked \uicontrol OK + to accept a font. Alternatively, the \l {Dialog::}{accepted()} signal + can be handled to get the final selection. + + \sa currentFont, {Dialog::}{accepted()} +*/ +QFont QQuickPlatformFontDialog::font() const +{ + return m_font; +} + +void QQuickPlatformFontDialog::setFont(const QFont &font) +{ + if (m_font == font) + return; + + m_font = font; + setCurrentFont(font); + emit fontChanged(); +} + +/*! + \qmlproperty font Qt.labs.platform::FontDialog::currentFont + + This property holds the currently selected font in the dialog. + + Unlike the \l font property, the \c currentFont property is updated + while the user is selecting fonts in the dialog, even before the final + selection has been made. + + \sa font +*/ +QFont QQuickPlatformFontDialog::currentFont() const +{ + if (QPlatformFontDialogHelper *fontDialog = qobject_cast<QPlatformFontDialogHelper *>(handle())) + return fontDialog->currentFont(); + return m_currentFont; +} + +void QQuickPlatformFontDialog::setCurrentFont(const QFont &font) +{ + if (QPlatformFontDialogHelper *fontDialog = qobject_cast<QPlatformFontDialogHelper *>(handle())) + fontDialog->setCurrentFont(font); + m_currentFont = font; +} + +/*! + \qmlproperty flags Qt.labs.platform::FontDialog::options + + This property holds the various options that affect the look and feel of the dialog. + + By default, all options are disabled. + + Options should be set before showing the dialog. Setting them while the dialog is + visible is not guaranteed to have an immediate effect on the dialog (depending on + the option and on the platform). + + Available options: + \value FontDialog.ScalableFonts Show scalable fonts. + \value FontDialog.NonScalableFonts Show non-scalable fonts. + \value FontDialog.MonospacedFonts Show monospaced fonts. + \value FontDialog.ProportionalFonts Show proportional fonts. + \value FontDialog.NoButtons Don't display \uicontrol OK and \uicontrol Cancel buttons (useful for "live dialogs"). +*/ +QFontDialogOptions::FontDialogOptions QQuickPlatformFontDialog::options() const +{ + return m_options->options(); +} + +void QQuickPlatformFontDialog::setOptions(QFontDialogOptions::FontDialogOptions options) +{ + if (options == m_options->options()) + return; + + m_options->setOptions(options); + emit optionsChanged(); +} + +bool QQuickPlatformFontDialog::useNativeDialog() const +{ + return QQuickPlatformDialog::useNativeDialog() + && !m_options->testOption(QFontDialogOptions::DontUseNativeDialog); +} + +void QQuickPlatformFontDialog::onCreate(QPlatformDialogHelper *dialog) +{ + if (QPlatformFontDialogHelper *fontDialog = qobject_cast<QPlatformFontDialogHelper *>(dialog)) { + connect(fontDialog, &QPlatformFontDialogHelper::currentFontChanged, this, &QQuickPlatformFontDialog::currentFontChanged); + fontDialog->setOptions(m_options); + } +} + +void QQuickPlatformFontDialog::onShow(QPlatformDialogHelper *dialog) +{ + m_options->setWindowTitle(title()); + if (QPlatformFontDialogHelper *fontDialog = qobject_cast<QPlatformFontDialogHelper *>(dialog)) + fontDialog->setOptions(m_options); +} + +void QQuickPlatformFontDialog::accept() +{ + setFont(currentFont()); + QQuickPlatformDialog::accept(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformfontdialog_p.h b/src/imports/platform/qquickplatformfontdialog_p.h new file mode 100644 index 00000000..c0704610 --- /dev/null +++ b/src/imports/platform/qquickplatformfontdialog_p.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMFONTDIALOG_P_H +#define QQUICKPLATFORMFONTDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qquickplatformdialog_p.h" +#include <QtGui/qfont.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQuickPlatformFontDialog : public QQuickPlatformDialog +{ + Q_OBJECT + Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged FINAL) + Q_PROPERTY(QFont currentFont READ currentFont WRITE setCurrentFont NOTIFY currentFontChanged FINAL) + Q_PROPERTY(QFontDialogOptions::FontDialogOptions options READ options WRITE setOptions NOTIFY optionsChanged FINAL) + Q_FLAGS(QFontDialogOptions::FontDialogOptions) + +public: + explicit QQuickPlatformFontDialog(QObject *parent = nullptr); + + QFont font() const; + void setFont(const QFont &font); + + QFont currentFont() const; + void setCurrentFont(const QFont &font); + + QFontDialogOptions::FontDialogOptions options() const; + void setOptions(QFontDialogOptions::FontDialogOptions options); + +Q_SIGNALS: + void fontChanged(); + void currentFontChanged(); + void optionsChanged(); + +protected: + bool useNativeDialog() const override; + void onCreate(QPlatformDialogHelper *dialog) override; + void onShow(QPlatformDialogHelper *dialog) override; + void accept() override; + +private: + QFont m_font; + QFont m_currentFont; // TODO: QFontDialogOptions::initialFont + QSharedPointer<QFontDialogOptions> m_options; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformFontDialog) + +#endif // QQUICKPLATFORMFONTDIALOG_P_H diff --git a/src/imports/platform/qquickplatformiconloader.cpp b/src/imports/platform/qquickplatformiconloader.cpp new file mode 100644 index 00000000..08df44d9 --- /dev/null +++ b/src/imports/platform/qquickplatformiconloader.cpp @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformiconloader_p.h" + +#include <QtCore/qobject.h> +#include <QtCore/qmetaobject.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +QQuickPlatformIconLoader::QQuickPlatformIconLoader(int slot, QObject *parent) + : m_parent(parent), + m_slot(slot), + m_enabled(false) +{ + Q_ASSERT(slot != -1 && parent); +} + +bool QQuickPlatformIconLoader::isEnabled() const +{ + return m_enabled; +} + +void QQuickPlatformIconLoader::setEnabled(bool enabled) +{ + m_enabled = enabled; + if (m_enabled) + loadIcon(); +} + +QIcon QQuickPlatformIconLoader::icon() const +{ + QIcon fallback = QPixmap::fromImage(image()); + return QIcon::fromTheme(m_iconName, fallback); +} + +QUrl QQuickPlatformIconLoader::iconSource() const +{ + return m_iconSource; +} + +void QQuickPlatformIconLoader::setIconSource(const QUrl& source) +{ + m_iconSource = source; + if (m_enabled) + loadIcon(); +} + +QString QQuickPlatformIconLoader::iconName() const +{ + return m_iconName; +} + +void QQuickPlatformIconLoader::setIconName(const QString& name) +{ + m_iconName = name; + if (m_enabled) + loadIcon(); +} + +void QQuickPlatformIconLoader::loadIcon() +{ + if (m_iconSource.isEmpty()) { + clear(m_parent); + } else { + load(qmlEngine(m_parent), m_iconSource); + if (m_slot != -1 && isLoading()) { + connectFinished(m_parent, m_slot); + m_slot = -1; + } + } + + if (!isLoading()) + m_parent->metaObject()->method(m_slot).invoke(m_parent); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformiconloader_p.h b/src/imports/platform/qquickplatformiconloader_p.h new file mode 100644 index 00000000..5ddb625f --- /dev/null +++ b/src/imports/platform/qquickplatformiconloader_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMICONLOADER_P_H +#define QQUICKPLATFORMICONLOADER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qurl.h> +#include <QtCore/qstring.h> +#include <QtGui/qicon.h> +#include <QtQuick/private/qquickpixmapcache_p.h> + +QT_BEGIN_NAMESPACE + +class QObject; + +class QQuickPlatformIconLoader : public QQuickPixmap +{ +public: + QQuickPlatformIconLoader(int slot, QObject *parent); + + bool isEnabled() const; + void setEnabled(bool enabled); + + QIcon icon() const; + + QUrl iconSource() const; + void setIconSource(const QUrl &source); + + QString iconName() const; + void setIconName(const QString &name); + +private: + void loadIcon(); + + QObject *m_parent; + int m_slot; + bool m_enabled; + QIcon m_icon; + QUrl m_iconSource; + QString m_iconName; +}; + +QT_END_NAMESPACE + +#endif // QQUICKPLATFORMICONLOADER_P_H diff --git a/src/imports/platform/qquickplatformmenu.cpp b/src/imports/platform/qquickplatformmenu.cpp new file mode 100644 index 00000000..17d3b2ce --- /dev/null +++ b/src/imports/platform/qquickplatformmenu.cpp @@ -0,0 +1,835 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformmenu_p.h" +#include "qquickplatformmenubar_p.h" +#include "qquickplatformmenuitem_p.h" +#include "qquickplatformiconloader_p.h" +#include "qquickplatformsystemtrayicon_p.h" + +#include <QtCore/qloggingcategory.h> +#include <QtGui/qicon.h> +#include <QtGui/qcursor.h> +#include <QtGui/qpa/qplatformtheme.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtQml/private/qqmlengine_p.h> +#include <QtQml/private/qv4scopedvalue_p.h> +#include <QtQml/private/qv4qobjectwrapper_p.h> +#include <QtQuick/qquickrendercontrol.h> +#include <QtQuick/qquickwindow.h> +#include <QtQuick/qquickitem.h> + +#include "widgets/qwidgetplatform_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Menu + \inherits QtObject + \instantiates QQuickPlatformMenu + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A native menu. + + The Menu type provides a QML API for native platform menu popups. + + \image qtlabsplatform-menu.png + + Menu can be used in a \l MenuBar, or as a stand-alone context menu. + The following example shows how to open a context menu on right mouse + click: + + \code + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.RightButton + onClicked: zoomMenu.open() + } + + Menu { + id: zoomMenu + + MenuItem { + text: qsTr("Zoom In") + shortcut: StandardKey.ZoomIn + onTriggered: zoomIn() + } + + MenuItem { + text: qsTr("Zoom Out") + shortcut: StandardKey.ZoomOut + onTriggered: zoomOut() + } + } + \endcode + + \section2 Availability + + A native platform menu is currently available on the following platforms: + + \list + \li macOS + \li iOS + \li Android + \li Linux (only available as a stand-alone context menu when running with the GTK+ platform theme) + \endlist + + \input includes/widgets.qdocinc 1 + + \labs + + \sa MenuItem, MenuSeparator, MenuBar +*/ + +/*! + \qmlsignal Qt.labs.platform::Menu::aboutToShow() + + This signal is emitted when the menu is about to be shown to the user. +*/ + +/*! + \qmlsignal Qt.labs.platform::Menu::aboutToHide() + + This signal is emitted when the menu is about to be hidden from the user. +*/ + +Q_DECLARE_LOGGING_CATEGORY(qtLabsPlatformMenus) + +QQuickPlatformMenu::QQuickPlatformMenu(QObject *parent) + : QObject(parent), + m_complete(false), + m_enabled(true), + m_visible(true), + m_minimumWidth(-1), + m_type(QPlatformMenu::DefaultMenu), + m_menuBar(nullptr), + m_parentMenu(nullptr), + m_systemTrayIcon(nullptr), + m_menuItem(nullptr), + m_iconLoader(nullptr), + m_handle(nullptr) +{ +} + +QQuickPlatformMenu::~QQuickPlatformMenu() +{ + if (m_menuBar) + m_menuBar->removeMenu(this); + if (m_parentMenu) + m_parentMenu->removeMenu(this); + for (QQuickPlatformMenuItem *item : m_items) { + if (QQuickPlatformMenu *subMenu = item->subMenu()) + subMenu->setParentMenu(nullptr); + item->setMenu(nullptr); + } + delete m_iconLoader; + m_iconLoader = nullptr; + delete m_handle; + m_handle = nullptr; +} + +QPlatformMenu *QQuickPlatformMenu::handle() const +{ + return m_handle; +} + +QPlatformMenu * QQuickPlatformMenu::create() +{ + if (!m_handle) { + if (m_menuBar && m_menuBar->handle()) + m_handle = m_menuBar->handle()->createMenu(); + else if (m_parentMenu && m_parentMenu->handle()) + m_handle = m_parentMenu->handle()->createSubMenu(); + else if (m_systemTrayIcon && m_systemTrayIcon->handle()) + m_handle = m_systemTrayIcon->handle()->createMenu(); + + // TODO: implement ^ + // - QCocoaMenuBar::createMenu() + // - QCocoaMenu::createSubMenu() + // - QCocoaSystemTrayIcon::createMenu() + if (!m_handle) + m_handle = QGuiApplicationPrivate::platformTheme()->createPlatformMenu(); + + if (!m_handle) + m_handle = QWidgetPlatform::createMenu(); + + qCDebug(qtLabsPlatformMenus) << "Menu ->" << m_handle; + + if (m_handle) { + connect(m_handle, &QPlatformMenu::aboutToShow, this, &QQuickPlatformMenu::aboutToShow); + connect(m_handle, &QPlatformMenu::aboutToHide, this, &QQuickPlatformMenu::aboutToHide); + + for (QQuickPlatformMenuItem *item : m_items) + m_handle->insertMenuItem(item->create(), nullptr); + + if (m_menuItem) { + if (QPlatformMenuItem *handle = m_menuItem->create()) + handle->setMenu(m_handle); + } + } + } + return m_handle; +} + +void QQuickPlatformMenu::destroy() +{ + if (!m_handle) + return; + + delete m_handle; + m_handle = nullptr; +} + +void QQuickPlatformMenu::sync() +{ + if (!m_complete || !create()) + return; + + m_handle->setText(m_title); + m_handle->setEnabled(m_enabled); + m_handle->setVisible(m_visible); + m_handle->setMinimumWidth(m_minimumWidth); + m_handle->setMenuType(m_type); + m_handle->setFont(m_font); + + if (m_menuBar && m_menuBar->handle()) + m_menuBar->handle()->syncMenu(m_handle); + else if (m_systemTrayIcon && m_systemTrayIcon->handle()) + m_systemTrayIcon->handle()->updateMenu(m_handle); + + for (QQuickPlatformMenuItem *item : m_items) + item->sync(); +} + +/*! + \default + \qmlproperty list<Object> Qt.labs.platform::Menu::data + + This default property holds the list of all objects declared as children of + the menu. The data property includes objects that are not \l MenuItem instances, + such as \l Timer and \l QtObject. + + \sa items +*/ +QQmlListProperty<QObject> QQuickPlatformMenu::data() +{ + return QQmlListProperty<QObject>(this, nullptr, data_append, data_count, data_at, data_clear); +} + +/*! + \qmlproperty list<MenuItem> Qt.labs.platform::Menu::items + + This property holds the list of items in the menu. +*/ +QQmlListProperty<QQuickPlatformMenuItem> QQuickPlatformMenu::items() +{ + return QQmlListProperty<QQuickPlatformMenuItem>(this, nullptr, items_append, items_count, items_at, items_clear); +} + +/*! + \readonly + \qmlproperty MenuBar Qt.labs.platform::Menu::menuBar + + This property holds the menubar that the menu belongs to, or \c null if the + menu is not in a menubar. +*/ +QQuickPlatformMenuBar *QQuickPlatformMenu::menuBar() const +{ + return m_menuBar; +} + +void QQuickPlatformMenu::setMenuBar(QQuickPlatformMenuBar *menuBar) +{ + if (m_menuBar == menuBar) + return; + + m_menuBar = menuBar; + destroy(); + emit menuBarChanged(); +} + +/*! + \readonly + \qmlproperty Menu Qt.labs.platform::Menu::parentMenu + + This property holds the parent menu that the menu belongs to, or \c null if the + menu is not a sub-menu. +*/ +QQuickPlatformMenu *QQuickPlatformMenu::parentMenu() const +{ + return m_parentMenu; +} + +void QQuickPlatformMenu::setParentMenu(QQuickPlatformMenu *menu) +{ + if (m_parentMenu == menu) + return; + + m_parentMenu = menu; + destroy(); + emit parentMenuChanged(); +} + +/*! + \readonly + \qmlproperty SystemTrayIcon Qt.labs.platform::Menu::systemTrayIcon + + This property holds the system tray icon that the menu belongs to, or \c null + if the menu is not in a system tray icon. +*/ +QQuickPlatformSystemTrayIcon *QQuickPlatformMenu::systemTrayIcon() const +{ + return m_systemTrayIcon; +} + +void QQuickPlatformMenu::setSystemTrayIcon(QQuickPlatformSystemTrayIcon *icon) +{ + if (m_systemTrayIcon == icon) + return; + + m_systemTrayIcon = icon; + destroy(); + emit systemTrayIconChanged(); +} + +/*! + \readonly + \qmlproperty MenuItem Qt.labs.platform::Menu::menuItem + + This property holds the item that presents the menu (in a parent menu). +*/ +QQuickPlatformMenuItem *QQuickPlatformMenu::menuItem() const +{ + if (!m_menuItem) { + QQuickPlatformMenu *that = const_cast<QQuickPlatformMenu *>(this); + m_menuItem = new QQuickPlatformMenuItem(that); + m_menuItem->setSubMenu(that); + m_menuItem->setText(m_title); + m_menuItem->setIconName(iconName()); + m_menuItem->setIconSource(iconSource()); + m_menuItem->setVisible(m_visible); + m_menuItem->setEnabled(m_enabled); + m_menuItem->componentComplete(); + } + return m_menuItem; +} + +/*! + \qmlproperty bool Qt.labs.platform::Menu::enabled + + This property holds whether the menu is enabled. The default value is \c true. +*/ +bool QQuickPlatformMenu::isEnabled() const +{ + return m_enabled; +} + +void QQuickPlatformMenu::setEnabled(bool enabled) +{ + if (m_enabled == enabled) + return; + + if (m_menuItem) + m_menuItem->setEnabled(enabled); + + m_enabled = enabled; + sync(); + emit enabledChanged(); +} + +/*! + \qmlproperty bool Qt.labs.platform::Menu::visible + + This property holds whether the menu is visible. The default value is \c true. +*/ +bool QQuickPlatformMenu::isVisible() const +{ + return m_visible; +} + +void QQuickPlatformMenu::setVisible(bool visible) +{ + if (m_visible == visible) + return; + + if (m_menuItem) + m_menuItem->setVisible(visible); + + m_visible = visible; + sync(); + emit visibleChanged(); +} + +/*! + \qmlproperty int Qt.labs.platform::Menu::minimumWidth + + This property holds the minimum width of the menu. The default value is \c -1 (no minimum width). +*/ +int QQuickPlatformMenu::minimumWidth() const +{ + return m_minimumWidth; +} + +void QQuickPlatformMenu::setMinimumWidth(int width) +{ + if (m_minimumWidth == width) + return; + + m_minimumWidth = width; + sync(); + emit minimumWidthChanged(); +} + +/*! + \qmlproperty enumeration Qt.labs.platform::Menu::type + + This property holds the type of the menu. + + Available values: + \value Menu.DefaultMenu A normal menu (default). + \value Menu.EditMenu An edit menu with pre-populated cut, copy and paste items. +*/ +QPlatformMenu::MenuType QQuickPlatformMenu::type() const +{ + return m_type; +} + +void QQuickPlatformMenu::setType(QPlatformMenu::MenuType type) +{ + if (m_type == type) + return; + + m_type = type; + sync(); + emit typeChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::Menu::title + + This property holds the menu's title. +*/ +QString QQuickPlatformMenu::title() const +{ + return m_title; +} + +void QQuickPlatformMenu::setTitle(const QString &title) +{ + if (m_title == title) + return; + + m_title = title; + sync(); + emit titleChanged(); +} + +/*! + \qmlproperty url Qt.labs.platform::Menu::iconSource + + This property holds the url of the menu's icon. + + \sa iconName +*/ +QUrl QQuickPlatformMenu::iconSource() const +{ + if (!m_iconLoader) + return QUrl(); + + return m_iconLoader->iconSource(); +} + +void QQuickPlatformMenu::setIconSource(const QUrl& source) +{ + if (source == iconSource()) + return; + + if (m_menuItem) + m_menuItem->setIconSource(source); + + iconLoader()->setIconSource(source); + emit iconSourceChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::Menu::iconName + + This property holds the theme name of the menu's icon. + + \sa iconSource, QIcon::fromTheme() +*/ +QString QQuickPlatformMenu::iconName() const +{ + if (!m_iconLoader) + return QString(); + + return m_iconLoader->iconName(); +} + +void QQuickPlatformMenu::setIconName(const QString& name) +{ + if (name == iconName()) + return; + + if (m_menuItem) + m_menuItem->setIconName(name); + + iconLoader()->setIconName(name); + emit iconNameChanged(); +} + +/*! + \qmlproperty font Qt.labs.platform::Menu::font + + This property holds the menu's font. + + \sa text +*/ +QFont QQuickPlatformMenu::font() const +{ + return m_font; +} + +void QQuickPlatformMenu::setFont(const QFont& font) +{ + if (m_font == font) + return; + + m_font = font; + sync(); + emit fontChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::Menu::addItem(MenuItem item) + + Adds an \a item to the end of the menu. +*/ +void QQuickPlatformMenu::addItem(QQuickPlatformMenuItem *item) +{ + insertItem(m_items.count(), item); +} + +/*! + \qmlmethod void Qt.labs.platform::Menu::insertItem(int index, MenuItem item) + + Inserts an \a item at the specified \a index in the menu. +*/ +void QQuickPlatformMenu::insertItem(int index, QQuickPlatformMenuItem *item) +{ + if (!item || m_items.contains(item)) + return; + + m_items.insert(index, item); + m_data.append(item); + item->setMenu(this); + if (m_handle && item->create()) { + QQuickPlatformMenuItem *before = m_items.value(index + 1); + m_handle->insertMenuItem(item->handle(), before ? before->create() : nullptr); + } + sync(); + emit itemsChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::Menu::removeItem(MenuItem item) + + Removes an \a item from the menu. +*/ +void QQuickPlatformMenu::removeItem(QQuickPlatformMenuItem *item) +{ + if (!item || !m_items.removeOne(item)) + return; + + m_data.removeOne(item); + if (m_handle) + m_handle->removeMenuItem(item->handle()); + item->setMenu(nullptr); + sync(); + emit itemsChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::Menu::addMenu(Menu submenu) + + Adds a \a submenu to the end of the menu. +*/ +void QQuickPlatformMenu::addMenu(QQuickPlatformMenu *menu) +{ + insertMenu(m_items.count(), menu); +} + +/*! + \qmlmethod void Qt.labs.platform::Menu::insertMenu(int index, Menu submenu) + + Inserts a \a submenu at the specified \a index in the menu. +*/ +void QQuickPlatformMenu::insertMenu(int index, QQuickPlatformMenu *menu) +{ + if (!menu) + return; + + menu->setParentMenu(this); + insertItem(index, menu->menuItem()); +} + +/*! + \qmlmethod void Qt.labs.platform::Menu::removeMenu(Menu submenu) + + Removes a \a submenu from the menu. +*/ +void QQuickPlatformMenu::removeMenu(QQuickPlatformMenu *menu) +{ + if (!menu) + return; + + menu->setParentMenu(nullptr); + removeItem(menu->menuItem()); +} + +/*! + \qmlmethod void Qt.labs.platform::Menu::clear() + + Removes all items from the menu. +*/ +void QQuickPlatformMenu::clear() +{ + if (m_items.isEmpty()) + return; + + for (QQuickPlatformMenuItem *item : m_items) { + m_data.removeOne(item); + if (m_handle) + m_handle->removeMenuItem(item->handle()); + item->setMenu(nullptr); + delete item; + } + + m_items.clear(); + sync(); + emit itemsChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::Menu::open(MenuItem item) + + Opens the menu at the current mouse position, optionally aligned to a menu \a item. +*/ + +/*! + \qmlmethod void Qt.labs.platform::Menu::open(Item target, MenuItem item) + + Opens the menu at the specified \a target item, optionally aligned to a menu \a item. +*/ +void QQuickPlatformMenu::open(QQmlV4Function *args) +{ + if (!m_handle) + return; + + if (args->length() > 2) { + args->v4engine()->throwTypeError(); + return; + } + + QV4::ExecutionEngine *v4 = args->v4engine(); + QV4::Scope scope(v4); + + QQuickItem *targetItem = nullptr; + if (args->length() > 0) { + QV4::ScopedValue value(scope, (*args)[0]); + QV4::Scoped<QV4::QObjectWrapper> object(scope, value->as<QV4::QObjectWrapper>()); + if (object) + targetItem = qobject_cast<QQuickItem *>(object->object()); + } + + QQuickPlatformMenuItem *menuItem = nullptr; + if (args->length() > 1) { + QV4::ScopedValue value(scope, (*args)[1]); + QV4::Scoped<QV4::QObjectWrapper> object(scope, value->as<QV4::QObjectWrapper>()); + if (object) + menuItem = qobject_cast<QQuickPlatformMenuItem *>(object->object()); + } + + QPoint offset; + QWindow *window = findWindow(targetItem, &offset); + + QRect targetRect; + if (targetItem) { + QRectF sceneBounds = targetItem->mapRectToScene(targetItem->boundingRect()); + targetRect = sceneBounds.toAlignedRect().translated(offset); + } else { +#ifndef QT_NO_CURSOR + QPoint pos = QCursor::pos(); + if (window) + pos = window->mapFromGlobal(pos); + targetRect.moveTo(pos); +#endif + } + + m_handle->showPopup(window, targetRect, menuItem ? menuItem->handle() : nullptr); +} + +/*! + \qmlmethod void Qt.labs.platform::Menu::close() + + Closes the menu. +*/ +void QQuickPlatformMenu::close() +{ + if (m_handle) + m_handle->dismiss(); +} + +void QQuickPlatformMenu::classBegin() +{ +} + +void QQuickPlatformMenu::componentComplete() +{ + m_complete = true; + if (m_handle && m_iconLoader) + m_iconLoader->setEnabled(true); + sync(); +} + +QQuickPlatformIconLoader *QQuickPlatformMenu::iconLoader() const +{ + if (!m_iconLoader) { + QQuickPlatformMenu *that = const_cast<QQuickPlatformMenu *>(this); + static int slot = staticMetaObject.indexOfSlot("updateIcon()"); + m_iconLoader = new QQuickPlatformIconLoader(slot, that); + m_iconLoader->setEnabled(m_complete); + } + return m_iconLoader; +} + +static QWindow *effectiveWindow(QWindow *window, QPoint *offset) +{ + QQuickWindow *quickWindow = qobject_cast<QQuickWindow *>(window); + if (quickWindow) { + QWindow *renderWindow = QQuickRenderControl::renderWindowFor(quickWindow, offset); + if (renderWindow) + return renderWindow; + } + return window; +} + +QWindow *QQuickPlatformMenu::findWindow(QQuickItem *target, QPoint *offset) const +{ + if (target) + return effectiveWindow(target->window(), offset); + + if (m_menuBar && m_menuBar->window()) + return effectiveWindow(m_menuBar->window(), offset); + + QObject *obj = parent(); + while (obj) { + QWindow *window = qobject_cast<QWindow *>(obj); + if (window) + return effectiveWindow(window, offset); + + QQuickItem *item = qobject_cast<QQuickItem *>(obj); + if (item && item->window()) + return effectiveWindow(item->window(), offset); + + obj = obj->parent(); + } + return nullptr; +} + +void QQuickPlatformMenu::data_append(QQmlListProperty<QObject> *property, QObject *object) +{ + QQuickPlatformMenu *menu = static_cast<QQuickPlatformMenu *>(property->object); + if (QQuickPlatformMenuItem *item = qobject_cast<QQuickPlatformMenuItem *>(object)) + menu->addItem(item); + else if (QQuickPlatformMenu *subMenu = qobject_cast<QQuickPlatformMenu *>(object)) + menu->addMenu(subMenu); + else + menu->m_data.append(object); +} + +int QQuickPlatformMenu::data_count(QQmlListProperty<QObject> *property) +{ + QQuickPlatformMenu *menu = static_cast<QQuickPlatformMenu *>(property->object); + return menu->m_data.count(); +} + +QObject *QQuickPlatformMenu::data_at(QQmlListProperty<QObject> *property, int index) +{ + QQuickPlatformMenu *menu = static_cast<QQuickPlatformMenu *>(property->object); + return menu->m_data.value(index); +} + +void QQuickPlatformMenu::data_clear(QQmlListProperty<QObject> *property) +{ + QQuickPlatformMenu *menu = static_cast<QQuickPlatformMenu *>(property->object); + menu->m_data.clear(); +} + +void QQuickPlatformMenu::items_append(QQmlListProperty<QQuickPlatformMenuItem> *property, QQuickPlatformMenuItem *item) +{ + QQuickPlatformMenu *menu = static_cast<QQuickPlatformMenu *>(property->object); + menu->addItem(item); +} + +int QQuickPlatformMenu::items_count(QQmlListProperty<QQuickPlatformMenuItem> *property) +{ + QQuickPlatformMenu *menu = static_cast<QQuickPlatformMenu *>(property->object); + return menu->m_items.count(); +} + +QQuickPlatformMenuItem *QQuickPlatformMenu::items_at(QQmlListProperty<QQuickPlatformMenuItem> *property, int index) +{ + QQuickPlatformMenu *menu = static_cast<QQuickPlatformMenu *>(property->object); + return menu->m_items.value(index); +} + +void QQuickPlatformMenu::items_clear(QQmlListProperty<QQuickPlatformMenuItem> *property) +{ + QQuickPlatformMenu *menu = static_cast<QQuickPlatformMenu *>(property->object); + menu->clear(); +} + +void QQuickPlatformMenu::updateIcon() +{ + if (!m_handle || !m_iconLoader) + return; + + m_handle->setIcon(m_iconLoader->icon()); + sync(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformmenu_p.h b/src/imports/platform/qquickplatformmenu_p.h new file mode 100644 index 00000000..587fae99 --- /dev/null +++ b/src/imports/platform/qquickplatformmenu_p.h @@ -0,0 +1,213 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMMENU_P_H +#define QQUICKPLATFORMMENU_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qobject.h> +#include <QtCore/qurl.h> +#include <QtGui/qfont.h> +#include <QtGui/qpa/qplatformmenu.h> +#include <QtQml/qqmlparserstatus.h> +#include <QtQml/qqmllist.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QIcon; +class QWindow; +class QQuickItem; +class QPlatformMenu; +class QQmlV4Function; +class QQuickPlatformMenuBar; +class QQuickPlatformMenuItem; +class QQuickPlatformIconLoader; +class QQuickPlatformSystemTrayIcon; + +class QQuickPlatformMenu : public QObject, public QQmlParserStatus +{ + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + Q_PROPERTY(QQmlListProperty<QObject> data READ data FINAL) + Q_PROPERTY(QQmlListProperty<QQuickPlatformMenuItem> items READ items NOTIFY itemsChanged FINAL) + Q_PROPERTY(QQuickPlatformMenuBar *menuBar READ menuBar NOTIFY menuBarChanged FINAL) + Q_PROPERTY(QQuickPlatformMenu *parentMenu READ parentMenu NOTIFY parentMenuChanged FINAL) + Q_PROPERTY(QQuickPlatformSystemTrayIcon *systemTrayIcon READ systemTrayIcon NOTIFY systemTrayIconChanged FINAL) + Q_PROPERTY(QQuickPlatformMenuItem *menuItem READ menuItem CONSTANT FINAL) + Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged FINAL) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL) + Q_PROPERTY(int minimumWidth READ minimumWidth WRITE setMinimumWidth NOTIFY minimumWidthChanged FINAL) + Q_PROPERTY(QPlatformMenu::MenuType type READ type WRITE setType NOTIFY typeChanged FINAL) + Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged FINAL) + Q_PROPERTY(QUrl iconSource READ iconSource WRITE setIconSource NOTIFY iconSourceChanged FINAL) + Q_PROPERTY(QString iconName READ iconName WRITE setIconName NOTIFY iconNameChanged FINAL) + Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged FINAL) + Q_ENUMS(QPlatformMenu::MenuType) + Q_CLASSINFO("DefaultProperty", "data") + +public: + explicit QQuickPlatformMenu(QObject *parent = nullptr); + ~QQuickPlatformMenu(); + + QPlatformMenu *handle() const; + QPlatformMenu *create(); + void destroy(); + void sync(); + + QQmlListProperty<QObject> data(); + QQmlListProperty<QQuickPlatformMenuItem> items(); + + QQuickPlatformMenuBar *menuBar() const; + void setMenuBar(QQuickPlatformMenuBar *menuBar); + + QQuickPlatformMenu *parentMenu() const; + void setParentMenu(QQuickPlatformMenu *menu); + + QQuickPlatformSystemTrayIcon *systemTrayIcon() const; + void setSystemTrayIcon(QQuickPlatformSystemTrayIcon *icon); + + QQuickPlatformMenuItem *menuItem() const; + + bool isEnabled() const; + void setEnabled(bool enabled); + + bool isVisible() const; + void setVisible(bool visible); + + int minimumWidth() const; + void setMinimumWidth(int width); + + QPlatformMenu::MenuType type() const; + void setType(QPlatformMenu::MenuType type); + + QString title() const; + void setTitle(const QString &title); + + QUrl iconSource() const; + void setIconSource(const QUrl &source); + + QString iconName() const; + void setIconName(const QString &name); + + QFont font() const; + void setFont(const QFont &font); + + Q_INVOKABLE void addItem(QQuickPlatformMenuItem *item); + Q_INVOKABLE void insertItem(int index, QQuickPlatformMenuItem *item); + Q_INVOKABLE void removeItem(QQuickPlatformMenuItem *item); + + Q_INVOKABLE void addMenu(QQuickPlatformMenu *menu); + Q_INVOKABLE void insertMenu(int index, QQuickPlatformMenu *menu); + Q_INVOKABLE void removeMenu(QQuickPlatformMenu *menu); + + Q_INVOKABLE void clear(); + +public Q_SLOTS: + void open(QQmlV4Function *args); + void close(); + +Q_SIGNALS: + void aboutToShow(); + void aboutToHide(); + + void itemsChanged(); + void menuBarChanged(); + void parentMenuChanged(); + void systemTrayIconChanged(); + void titleChanged(); + void iconSourceChanged(); + void iconNameChanged(); + void enabledChanged(); + void visibleChanged(); + void minimumWidthChanged(); + void fontChanged(); + void typeChanged(); + +protected: + void classBegin() override; + void componentComplete() override; + + QQuickPlatformIconLoader *iconLoader() const; + + QWindow *findWindow(QQuickItem *target, QPoint *offset) const; + + static void data_append(QQmlListProperty<QObject> *property, QObject *object); + static int data_count(QQmlListProperty<QObject> *property); + static QObject *data_at(QQmlListProperty<QObject> *property, int index); + static void data_clear(QQmlListProperty<QObject> *property); + + static void items_append(QQmlListProperty<QQuickPlatformMenuItem> *property, QQuickPlatformMenuItem *item); + static int items_count(QQmlListProperty<QQuickPlatformMenuItem> *property); + static QQuickPlatformMenuItem *items_at(QQmlListProperty<QQuickPlatformMenuItem> *property, int index); + static void items_clear(QQmlListProperty<QQuickPlatformMenuItem> *property); + +private Q_SLOTS: + void updateIcon(); + +private: + bool m_complete; + bool m_enabled; + bool m_visible; + int m_minimumWidth; + QPlatformMenu::MenuType m_type; + QString m_title; + QFont m_font; + QList<QObject *> m_data; + QList<QQuickPlatformMenuItem *> m_items; + QQuickPlatformMenuBar *m_menuBar; + QQuickPlatformMenu *m_parentMenu; + QQuickPlatformSystemTrayIcon *m_systemTrayIcon; + mutable QQuickPlatformMenuItem *m_menuItem; + mutable QQuickPlatformIconLoader *m_iconLoader; + QPlatformMenu *m_handle; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformMenu) + +#endif // QQUICKPLATFORMMENU_P_H diff --git a/src/imports/platform/qquickplatformmenubar.cpp b/src/imports/platform/qquickplatformmenubar.cpp new file mode 100644 index 00000000..00630a84 --- /dev/null +++ b/src/imports/platform/qquickplatformmenubar.cpp @@ -0,0 +1,330 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformmenubar_p.h" +#include "qquickplatformmenu_p.h" + +#include <QtCore/qloggingcategory.h> +#include <QtGui/qpa/qplatformmenu.h> +#include <QtGui/qpa/qplatformtheme.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtQuick/qquickwindow.h> +#include <QtQuick/qquickitem.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype MenuBar + \inherits QtObject + \instantiates QQuickPlatformMenuBar + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A native menubar. + + The MenuBar type provides a QML API for native platform menubars. + + \image qtlabsplatform-menubar.png + + A menubar consists of a list of drop-down menus. + + \code + MenuBar { + id: menuBar + + Menu { + id: fileMenu + title: qsTr("File") + // ... + } + + Menu { + id: editMenu + title: qsTr("&Edit") + // ... + } + + Menu { + id: viewMenu + title: qsTr("&View") + // ... + } + + Menu { + id: helpMenu + title: qsTr("&Help") + // ... + } + } + \endcode + + MenuBar is currently available on the following platforms: + + \list + \li macOS + \li Android + \li Linux (only available on desktop environments that provide a global D-Bus menu bar) + \endlist + + \labs + + \sa Menu +*/ + +Q_DECLARE_LOGGING_CATEGORY(qtLabsPlatformMenus) + +QQuickPlatformMenuBar::QQuickPlatformMenuBar(QObject *parent) + : QObject(parent), + m_complete(false), + m_window(nullptr), + m_handle(nullptr) +{ + m_handle = QGuiApplicationPrivate::platformTheme()->createPlatformMenuBar(); + qCDebug(qtLabsPlatformMenus) << "MenuBar ->" << m_handle; +} + +QQuickPlatformMenuBar::~QQuickPlatformMenuBar() +{ + for (QQuickPlatformMenu *menu : m_menus) + menu->setMenuBar(nullptr); + delete m_handle; + m_handle = nullptr; +} + +QPlatformMenuBar *QQuickPlatformMenuBar::handle() const +{ + return m_handle; +} + +/*! + \default + \qmlproperty list<Object> Qt.labs.platform::MenuBar::data + + This default property holds the list of all objects declared as children of + the menubar. The data property includes objects that are not \l Menu instances, + such as \l Timer and \l QtObject. + + \sa menus +*/ +QQmlListProperty<QObject> QQuickPlatformMenuBar::data() +{ + return QQmlListProperty<QObject>(this, nullptr, data_append, data_count, data_at, data_clear); +} + +/*! + \qmlproperty list<Menu> Qt.labs.platform::MenuBar::menus + + This property holds the list of menus in the menubar. +*/ +QQmlListProperty<QQuickPlatformMenu> QQuickPlatformMenuBar::menus() +{ + return QQmlListProperty<QQuickPlatformMenu>(this, nullptr, menus_append, menus_count, menus_at, menus_clear); +} + +/*! + \qmlproperty Window Qt.labs.platform::MenuBar::window + + This property holds the menubar's window. + + Unless explicitly set, the window is automatically resolved by iterating + the QML parent objects until a \l Window or an \l Item that has a window + is found. +*/ +QWindow *QQuickPlatformMenuBar::window() const +{ + return m_window; +} + +void QQuickPlatformMenuBar::setWindow(QWindow *window) +{ + if (m_window == window) + return; + + if (m_handle) + m_handle->handleReparent(window); + + m_window = window; + emit windowChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::MenuBar::addMenu(Menu menu) + + Adds a \a menu to end of the menubar. +*/ +void QQuickPlatformMenuBar::addMenu(QQuickPlatformMenu *menu) +{ + insertMenu(m_menus.count(), menu); +} + +/*! + \qmlmethod void Qt.labs.platform::MenuBar::insertMenu(int index, Menu menu) + + Inserts a \a menu at the specified \a index in the menubar. +*/ +void QQuickPlatformMenuBar::insertMenu(int index, QQuickPlatformMenu *menu) +{ + if (!menu || m_menus.contains(menu)) + return; + + QQuickPlatformMenu *before = m_menus.value(index); + m_menus.insert(index, menu); + m_data.append(menu); + menu->setMenuBar(this); + if (m_handle) + m_handle->insertMenu(menu->create(), before ? before->handle() : nullptr); + emit menusChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::MenuBar::removeMenu(Menu menu) + + Removes a \a menu from the menubar. +*/ +void QQuickPlatformMenuBar::removeMenu(QQuickPlatformMenu *menu) +{ + if (!menu || !m_menus.removeOne(menu)) + return; + + m_data.removeOne(menu); + if (m_handle) + m_handle->removeMenu(menu->handle()); + menu->setMenuBar(nullptr); + emit menusChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::MenuBar::clear() + + Removes all menus from the menubar. +*/ +void QQuickPlatformMenuBar::clear() +{ + if (m_menus.isEmpty()) + return; + + for (QQuickPlatformMenu *menu : m_menus) { + m_data.removeOne(menu); + if (m_handle) + m_handle->removeMenu(menu->handle()); + menu->setMenuBar(nullptr); + delete menu; + } + + m_menus.clear(); + emit menusChanged(); +} + +void QQuickPlatformMenuBar::classBegin() +{ +} + +void QQuickPlatformMenuBar::componentComplete() +{ + m_complete = true; + for (QQuickPlatformMenu *menu : m_menus) + menu->sync(); + if (!m_window) + setWindow(findWindow()); +} + +QWindow *QQuickPlatformMenuBar::findWindow() const +{ + QObject *obj = parent(); + while (obj) { + QWindow *window = qobject_cast<QWindow *>(obj); + if (window) + return window; + QQuickItem *item = qobject_cast<QQuickItem *>(obj); + if (item && item->window()) + return item->window(); + obj = obj->parent(); + } + return nullptr; +} + +void QQuickPlatformMenuBar::data_append(QQmlListProperty<QObject> *property, QObject *object) +{ + QQuickPlatformMenuBar *menuBar = static_cast<QQuickPlatformMenuBar *>(property->object); + QQuickPlatformMenu *menu = qobject_cast<QQuickPlatformMenu *>(object); + if (menu) + menuBar->addMenu(menu); + else + menuBar->m_data.append(object); +} + +int QQuickPlatformMenuBar::data_count(QQmlListProperty<QObject> *property) +{ + QQuickPlatformMenuBar *menuBar = static_cast<QQuickPlatformMenuBar *>(property->object); + return menuBar->m_data.count(); +} + +QObject *QQuickPlatformMenuBar::data_at(QQmlListProperty<QObject> *property, int index) +{ + QQuickPlatformMenuBar *menuBar = static_cast<QQuickPlatformMenuBar *>(property->object); + return menuBar->m_data.value(index); +} + +void QQuickPlatformMenuBar::data_clear(QQmlListProperty<QObject> *property) +{ + QQuickPlatformMenuBar *menuBar = static_cast<QQuickPlatformMenuBar *>(property->object); + menuBar->m_data.clear(); +} + +void QQuickPlatformMenuBar::menus_append(QQmlListProperty<QQuickPlatformMenu> *property, QQuickPlatformMenu *menu) +{ + QQuickPlatformMenuBar *menuBar = static_cast<QQuickPlatformMenuBar *>(property->object); + menuBar->addMenu(menu); +} + +int QQuickPlatformMenuBar::menus_count(QQmlListProperty<QQuickPlatformMenu> *property) +{ + QQuickPlatformMenuBar *menuBar = static_cast<QQuickPlatformMenuBar *>(property->object); + return menuBar->m_menus.count(); +} + +QQuickPlatformMenu *QQuickPlatformMenuBar::menus_at(QQmlListProperty<QQuickPlatformMenu> *property, int index) +{ + QQuickPlatformMenuBar *menuBar = static_cast<QQuickPlatformMenuBar *>(property->object); + return menuBar->m_menus.value(index); +} + +void QQuickPlatformMenuBar::menus_clear(QQmlListProperty<QQuickPlatformMenu> *property) +{ + QQuickPlatformMenuBar *menuBar = static_cast<QQuickPlatformMenuBar *>(property->object); + menuBar->clear(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformmenubar_p.h b/src/imports/platform/qquickplatformmenubar_p.h new file mode 100644 index 00000000..059acfe6 --- /dev/null +++ b/src/imports/platform/qquickplatformmenubar_p.h @@ -0,0 +1,120 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMMENUBAR_P_H +#define QQUICKPLATFORMMENUBAR_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qobject.h> +#include <QtQml/qqmlparserstatus.h> +#include <QtQml/qqmllist.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QWindow; +class QPlatformMenuBar; +class QQuickPlatformMenu; + +class QQuickPlatformMenuBar : public QObject, public QQmlParserStatus +{ + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + Q_PROPERTY(QQmlListProperty<QObject> data READ data FINAL) + Q_PROPERTY(QQmlListProperty<QQuickPlatformMenu> menus READ menus NOTIFY menusChanged FINAL) + Q_PROPERTY(QWindow *window READ window WRITE setWindow NOTIFY windowChanged FINAL) + Q_CLASSINFO("DefaultProperty", "data") + +public: + explicit QQuickPlatformMenuBar(QObject *parent = nullptr); + ~QQuickPlatformMenuBar(); + + QPlatformMenuBar *handle() const; + + QQmlListProperty<QObject> data(); + QQmlListProperty<QQuickPlatformMenu> menus(); + + QWindow *window() const; + void setWindow(QWindow *window); + + Q_INVOKABLE void addMenu(QQuickPlatformMenu *menu); + Q_INVOKABLE void insertMenu(int index, QQuickPlatformMenu *menu); + Q_INVOKABLE void removeMenu(QQuickPlatformMenu *menu); + Q_INVOKABLE void clear(); + +Q_SIGNALS: + void menusChanged(); + void windowChanged(); + +protected: + void classBegin() override; + void componentComplete() override; + + QWindow *findWindow() const; + + static void data_append(QQmlListProperty<QObject> *property, QObject *object); + static int data_count(QQmlListProperty<QObject> *property); + static QObject *data_at(QQmlListProperty<QObject> *property, int index); + static void data_clear(QQmlListProperty<QObject> *property); + + static void menus_append(QQmlListProperty<QQuickPlatformMenu> *property, QQuickPlatformMenu *menu); + static int menus_count(QQmlListProperty<QQuickPlatformMenu> *property); + static QQuickPlatformMenu *menus_at(QQmlListProperty<QQuickPlatformMenu> *property, int index); + static void menus_clear(QQmlListProperty<QQuickPlatformMenu> *property); + +private: + bool m_complete; + QWindow *m_window; + QList<QObject *> m_data; + QList<QQuickPlatformMenu *> m_menus; + QPlatformMenuBar *m_handle; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformMenuBar) + +#endif // QQUICKPLATFORMMENUBAR_P_H diff --git a/src/imports/platform/qquickplatformmenuitem.cpp b/src/imports/platform/qquickplatformmenuitem.cpp new file mode 100644 index 00000000..9f261d24 --- /dev/null +++ b/src/imports/platform/qquickplatformmenuitem.cpp @@ -0,0 +1,612 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformmenuitem_p.h" +#include "qquickplatformmenu_p.h" +#include "qquickplatformmenuitemgroup_p.h" +#include "qquickplatformiconloader_p.h" + +#include <QtGui/qicon.h> +#include <QtGui/qkeysequence.h> +#include <QtGui/qpa/qplatformtheme.h> +#include <QtGui/private/qguiapplication_p.h> + +#include "widgets/qwidgetplatform_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype MenuItem + \inherits QtObject + \instantiates QQuickPlatformMenuItem + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A native menu item. + + The MenuItem type provides a QML API for native platform menu items. + + \image qtlabsplatform-menu.png + + A menu item consists of an \l {iconSource}{icon}, \l text, and \l shortcut. + + \code + Menu { + id: zoomMenu + + MenuItem { + text: qsTr("Zoom In") + shortcut: StandardKey.ZoomIn + onTriggered: zoomIn() + } + + MenuItem { + text: qsTr("Zoom Out") + shortcut: StandardKey.ZoomOut + onTriggered: zoomOut() + } + } + \endcode + + \labs + + \sa Menu, MenuItemGroup +*/ + +/*! + \qmlsignal Qt.labs.platform::MenuItem::triggered() + + This signal is emitted when the menu item is triggered by the user. +*/ + +/*! + \qmlsignal Qt.labs.platform::MenuItem::hovered() + + This signal is emitted when the menu item is hovered by the user. +*/ + +QQuickPlatformMenuItem::QQuickPlatformMenuItem(QObject *parent) + : QObject(parent), + m_complete(false), + m_enabled(true), + m_visible(true), + m_separator(false), + m_checkable(false), + m_checked(false), + m_role(QPlatformMenuItem::TextHeuristicRole), + m_menu(nullptr), + m_subMenu(nullptr), + m_group(nullptr), + m_iconLoader(nullptr), + m_handle(nullptr) +{ +} + +QQuickPlatformMenuItem::~QQuickPlatformMenuItem() +{ + if (m_menu) + m_menu->removeItem(this); + if (m_group) + m_group->removeItem(this); + delete m_iconLoader; + m_iconLoader = nullptr; + delete m_handle; + m_handle = nullptr; +} + +QPlatformMenuItem *QQuickPlatformMenuItem::handle() const +{ + return m_handle; +} + +QPlatformMenuItem *QQuickPlatformMenuItem::create() +{ + if (!m_handle && m_menu && m_menu->handle()) { + m_handle = m_menu->handle()->createMenuItem(); + + // TODO: implement QCocoaMenu::createMenuItem() + if (!m_handle) + m_handle = QGuiApplicationPrivate::platformTheme()->createPlatformMenuItem(); + + if (!m_handle) + m_handle = QWidgetPlatform::createMenuItem(); + + if (m_handle) { + connect(m_handle, &QPlatformMenuItem::activated, this, &QQuickPlatformMenuItem::triggered); + connect(m_handle, &QPlatformMenuItem::hovered, this, &QQuickPlatformMenuItem::hovered); + if (m_checkable) + connect(m_handle, &QPlatformMenuItem::activated, this, &QQuickPlatformMenuItem::toggle); + } + } + return m_handle; +} + +void QQuickPlatformMenuItem::sync() +{ + if (!m_complete || !create()) + return; + + m_handle->setEnabled(isEnabled()); + m_handle->setVisible(isVisible()); + m_handle->setIsSeparator(m_separator); + m_handle->setCheckable(m_checkable); + m_handle->setChecked(m_checked); + m_handle->setRole(m_role); + m_handle->setText(m_text); + m_handle->setFont(m_font); + m_handle->setHasExclusiveGroup(m_group && m_group->isExclusive()); + if (m_subMenu && m_subMenu->handle()) + m_handle->setMenu(m_subMenu->handle()); + + QKeySequence sequence; + if (m_shortcut.type() == QVariant::Int) + sequence = QKeySequence(static_cast<QKeySequence::StandardKey>(m_shortcut.toInt())); + else + sequence = QKeySequence::fromString(m_shortcut.toString()); + m_handle->setShortcut(sequence.toString()); + + if (m_menu && m_menu->handle()) + m_menu->handle()->syncMenuItem(m_handle); +} + +/*! + \readonly + \qmlproperty Menu Qt.labs.platform::MenuItem::menu + + This property holds the menu that the item belongs to, or \c null if the + item is not in a menu. +*/ +QQuickPlatformMenu *QQuickPlatformMenuItem::menu() const +{ + return m_menu; +} + +void QQuickPlatformMenuItem::setMenu(QQuickPlatformMenu *menu) +{ + if (m_menu == menu) + return; + + m_menu = menu; + emit menuChanged(); +} + +/*! + \readonly + \qmlproperty Menu Qt.labs.platform::MenuItem::subMenu + + This property holds the sub-menu that the item contains, or \c null if + the item is not a sub-menu item. +*/ +QQuickPlatformMenu *QQuickPlatformMenuItem::subMenu() const +{ + return m_subMenu; +} + +void QQuickPlatformMenuItem::setSubMenu(QQuickPlatformMenu *menu) +{ + if (m_subMenu == menu) + return; + + m_subMenu = menu; + sync(); + emit subMenuChanged(); +} + +/*! + \qmlproperty MenuItemGroup Qt.labs.platform::MenuItem::group + + This property holds the group that the item belongs to, or \c null if the + item is not in a group. +*/ +QQuickPlatformMenuItemGroup *QQuickPlatformMenuItem::group() const +{ + return m_group; +} + +void QQuickPlatformMenuItem::setGroup(QQuickPlatformMenuItemGroup *group) +{ + if (m_group == group) + return; + + bool wasEnabled = isEnabled(); + bool wasVisible = isVisible(); + + if (group) + group->addItem(this); + + m_group = group; + sync(); + emit groupChanged(); + + if (isEnabled() != wasEnabled) + emit enabledChanged(); + if (isVisible() != wasVisible) + emit visibleChanged(); +} + +/*! + \qmlproperty bool Qt.labs.platform::MenuItem::enabled + + This property holds whether the item is enabled. The default value is \c true. + + Disabled items cannot be triggered by the user. They do not disappear from menus, + but they are displayed in a way which indicates that they are unavailable. For + example, they might be displayed using only shades of gray. + + When an item is disabled, it is not possible to trigger it through its \l shortcut. +*/ +bool QQuickPlatformMenuItem::isEnabled() const +{ + return m_enabled && (!m_group || m_group->isEnabled()); +} + +void QQuickPlatformMenuItem::setEnabled(bool enabled) +{ + if (m_enabled == enabled) + return; + + bool wasEnabled = isEnabled(); + m_enabled = enabled; + sync(); + if (isEnabled() != wasEnabled) + emit enabledChanged(); +} + +/*! + \qmlproperty bool Qt.labs.platform::MenuItem::visible + + This property holds whether the item is visible. The default value is \c true. +*/ +bool QQuickPlatformMenuItem::isVisible() const +{ + return m_visible && (!m_group || m_group->isVisible()); +} + +void QQuickPlatformMenuItem::setVisible(bool visible) +{ + if (m_visible == visible) + return; + + bool wasVisible = isVisible(); + m_visible = visible; + sync(); + if (isVisible() != wasVisible) + emit visibleChanged(); +} + +/*! + \qmlproperty bool Qt.labs.platform::MenuItem::separator + + This property holds whether the item is a separator line. The default value + is \c false. + + \sa MenuSeparator +*/ +bool QQuickPlatformMenuItem::isSeparator() const +{ + return m_separator; +} + +void QQuickPlatformMenuItem::setSeparator(bool separator) +{ + if (m_separator == separator) + return; + + m_separator = separator; + sync(); + emit separatorChanged(); +} + +/*! + \qmlproperty bool Qt.labs.platform::MenuItem::checkable + + This property holds whether the item is checkable. + + A checkable menu item has an on/off state. For example, in a word processor, + a "Bold" menu item may be either on or off. A menu item that is not checkable + is a command item that is simply executed, e.g. file save. + + The default value is \c false. + + \sa checked, MenuItemGroup +*/ +bool QQuickPlatformMenuItem::isCheckable() const +{ + return m_checkable; +} + +void QQuickPlatformMenuItem::setCheckable(bool checkable) +{ + if (m_checkable == checkable) + return; + + if (m_handle) { + if (checkable) + connect(m_handle, &QPlatformMenuItem::activated, this, &QQuickPlatformMenuItem::toggle); + else + disconnect(m_handle, &QPlatformMenuItem::activated, this, &QQuickPlatformMenuItem::toggle); + } + + m_checkable = checkable; + sync(); + emit checkableChanged(); +} + +/*! + \qmlproperty bool Qt.labs.platform::MenuItem::checked + + This property holds whether the item is checked (on) or unchecked (off). + The default value is \c false. + + \sa checkable, MenuItemGroup +*/ +bool QQuickPlatformMenuItem::isChecked() const +{ + return m_checked; +} + +void QQuickPlatformMenuItem::setChecked(bool checked) +{ + if (m_checked == checked) + return; + + if (checked && !m_checkable) + setCheckable(true); + + m_checked = checked; + sync(); + emit checkedChanged(); +} + +/*! + \qmlproperty enumeration Qt.labs.platform::MenuItem::role + + This property holds the role of the item. The role determines whether + the item should be placed into the application menu on macOS. + + Available values: + \value MenuItem.NoRole The item should not be put into the application menu + \value MenuItem.TextHeuristicRole The item should be put in the application menu based on the action's text (default) + \value MenuItem.ApplicationSpecificRole The item should be put in the application menu with an application-specific role + \value MenuItem.AboutQtRole The item handles the "About Qt" menu item. + \value MenuItem.AboutRole The item should be placed where the "About" menu item is in the application menu. The text of + the menu item will be set to "About <application name>". The application name is fetched from the + \c{Info.plist} file in the application's bundle (See \l{Qt for OS X - Deployment}). + \value MenuItem.PreferencesRole The item should be placed where the "Preferences..." menu item is in the application menu. + \value MenuItem.QuitRole The item should be placed where the Quit menu item is in the application menu. + + Specifying the role only has effect on items that are in the immediate + menus of a menubar, not in the submenus of those menus. For example, if + you have a "File" menu in your menubar and the "File" menu has a submenu, + specifying a role for the items in that submenu has no effect. They will + never be moved to the application menu. +*/ +QPlatformMenuItem::MenuRole QQuickPlatformMenuItem::role() const +{ + return m_role; +} + +void QQuickPlatformMenuItem::setRole(QPlatformMenuItem::MenuRole role) +{ + if (m_role == role) + return; + + m_role = role; + sync(); + emit roleChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::MenuItem::text + + This property holds the menu item's text. +*/ +QString QQuickPlatformMenuItem::text() const +{ + return m_text; +} + +void QQuickPlatformMenuItem::setText(const QString &text) +{ + if (m_text == text) + return; + + m_text = text; + sync(); + emit textChanged(); +} + +/*! + \qmlproperty url Qt.labs.platform::MenuItem::iconSource + + This property holds the url of the menu item's icon. + + \code + MenuItem { + iconName: "edit-undo" + iconSource: "qrc:/images/undo.png" + } + \endcode + + \sa iconName +*/ +QUrl QQuickPlatformMenuItem::iconSource() const +{ + if (!m_iconLoader) + return QUrl(); + + return m_iconLoader->iconSource(); +} + +void QQuickPlatformMenuItem::setIconSource(const QUrl& source) +{ + if (source == iconSource()) + return; + + iconLoader()->setIconSource(source); + emit iconSourceChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::MenuItem::iconName + + This property holds the theme name of the menu item's icon. + + \code + MenuItem { + iconName: "edit-undo" + iconSource: "qrc:/images/undo.png" + } + \endcode + + \sa iconSource, QIcon::fromTheme() +*/ +QString QQuickPlatformMenuItem::iconName() const +{ + if (!m_iconLoader) + return QString(); + + return m_iconLoader->iconName(); +} + +void QQuickPlatformMenuItem::setIconName(const QString& name) +{ + if (name == iconName()) + return; + + iconLoader()->setIconName(name); + emit iconNameChanged(); +} + +/*! + \qmlproperty keysequence Qt.labs.platform::MenuItem::shortcut + + This property holds the menu item's shortcut. + + The shortcut key sequence can be set to one of the + \l{QKeySequence::StandardKey}{standard keyboard shortcuts}, or it can be + specified by a string containing a sequence of up to four key presses + that are needed to \l{triggered}{trigger} the shortcut. + + The default value is an empty key sequence. + + \code + MenuItem { + shortcut: "Ctrl+E,Ctrl+W" + onTriggered: edit.wrapMode = TextEdit.Wrap + } + \endcode +*/ +QVariant QQuickPlatformMenuItem::shortcut() const +{ + return m_shortcut; +} + +void QQuickPlatformMenuItem::setShortcut(const QVariant& shortcut) +{ + if (m_shortcut == shortcut) + return; + + m_shortcut = shortcut; + sync(); + emit shortcutChanged(); +} + +/*! + \qmlproperty font Qt.labs.platform::MenuItem::font + + This property holds the menu item's font. + + \sa text +*/ +QFont QQuickPlatformMenuItem::font() const +{ + return m_font; +} + +void QQuickPlatformMenuItem::setFont(const QFont& font) +{ + if (m_font == font) + return; + + m_font = font; + sync(); + emit fontChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::MenuItem::toggle() + + Toggles the \l checked state to its opposite state. +*/ +void QQuickPlatformMenuItem::toggle() +{ + if (m_checkable) + setChecked(!m_checked); +} + +void QQuickPlatformMenuItem::classBegin() +{ +} + +void QQuickPlatformMenuItem::componentComplete() +{ + if (m_handle && m_iconLoader) + m_iconLoader->setEnabled(true); + m_complete = true; + sync(); +} + +QQuickPlatformIconLoader *QQuickPlatformMenuItem::iconLoader() const +{ + if (!m_iconLoader) { + QQuickPlatformMenuItem *that = const_cast<QQuickPlatformMenuItem *>(this); + static int slot = staticMetaObject.indexOfSlot("updateIcon()"); + m_iconLoader = new QQuickPlatformIconLoader(slot, that); + m_iconLoader->setEnabled(m_complete); + } + return m_iconLoader; +} + +void QQuickPlatformMenuItem::updateIcon() +{ + if (!m_handle || !m_iconLoader) + return; + + m_handle->setIcon(m_iconLoader->icon()); + sync(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformmenuitem_p.h b/src/imports/platform/qquickplatformmenuitem_p.h new file mode 100644 index 00000000..48a5603e --- /dev/null +++ b/src/imports/platform/qquickplatformmenuitem_p.h @@ -0,0 +1,191 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMMENUITEM_P_H +#define QQUICKPLATFORMMENUITEM_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qobject.h> +#include <QtCore/qurl.h> +#include <QtGui/qfont.h> +#include <QtGui/qpa/qplatformmenu.h> +#include <QtQml/qqmlparserstatus.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QPlatformMenuItem; +class QQuickPlatformMenu; +class QQuickPlatformIconLoader; +class QQuickPlatformMenuItemGroup; + +class QQuickPlatformMenuItem : public QObject, public QQmlParserStatus +{ + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + Q_PROPERTY(QQuickPlatformMenu *menu READ menu NOTIFY menuChanged FINAL) + Q_PROPERTY(QQuickPlatformMenu *subMenu READ subMenu NOTIFY subMenuChanged FINAL) + Q_PROPERTY(QQuickPlatformMenuItemGroup *group READ group WRITE setGroup NOTIFY groupChanged FINAL) + Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged FINAL) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL) + Q_PROPERTY(bool separator READ isSeparator WRITE setSeparator NOTIFY separatorChanged FINAL) + Q_PROPERTY(bool checkable READ isCheckable WRITE setCheckable NOTIFY checkableChanged FINAL) + Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY checkedChanged FINAL) + Q_PROPERTY(QPlatformMenuItem::MenuRole role READ role WRITE setRole NOTIFY roleChanged FINAL) + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged FINAL) + Q_PROPERTY(QUrl iconSource READ iconSource WRITE setIconSource NOTIFY iconSourceChanged FINAL) + Q_PROPERTY(QString iconName READ iconName WRITE setIconName NOTIFY iconNameChanged FINAL) + Q_PROPERTY(QVariant shortcut READ shortcut WRITE setShortcut NOTIFY shortcutChanged FINAL) + Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged FINAL) + Q_ENUMS(QPlatformMenuItem::MenuRole) + +public: + explicit QQuickPlatformMenuItem(QObject *parent = nullptr); + ~QQuickPlatformMenuItem(); + + QPlatformMenuItem *handle() const; + QPlatformMenuItem *create(); + void sync(); + + QQuickPlatformMenu *menu() const; + void setMenu(QQuickPlatformMenu* menu); + + QQuickPlatformMenu *subMenu() const; + void setSubMenu(QQuickPlatformMenu *menu); + + QQuickPlatformMenuItemGroup *group() const; + void setGroup(QQuickPlatformMenuItemGroup *group); + + bool isEnabled() const; + void setEnabled(bool enabled); + + bool isVisible() const; + void setVisible(bool visible); + + bool isSeparator() const; + void setSeparator(bool separator); + + bool isCheckable() const; + void setCheckable(bool checkable); + + bool isChecked() const; + void setChecked(bool checked); + + QPlatformMenuItem::MenuRole role() const; + void setRole(QPlatformMenuItem::MenuRole role); + + QString text() const; + void setText(const QString &text); + + QUrl iconSource() const; + void setIconSource(const QUrl &source); + + QString iconName() const; + void setIconName(const QString &name); + + QVariant shortcut() const; + void setShortcut(const QVariant& shortcut); + + QFont font() const; + void setFont(const QFont &font); + +public Q_SLOTS: + void toggle(); + +Q_SIGNALS: + void triggered(); + void hovered(); + + void menuChanged(); + void subMenuChanged(); + void groupChanged(); + void enabledChanged(); + void visibleChanged(); + void separatorChanged(); + void checkableChanged(); + void checkedChanged(); + void roleChanged(); + void textChanged(); + void iconSourceChanged(); + void iconNameChanged(); + void shortcutChanged(); + void fontChanged(); + +protected: + void classBegin() override; + void componentComplete() override; + + QQuickPlatformIconLoader *iconLoader() const; + +private Q_SLOTS: + void updateIcon(); + +private: + bool m_complete; + bool m_enabled; + bool m_visible; + bool m_separator; + bool m_checkable; + bool m_checked; + QPlatformMenuItem::MenuRole m_role; + QString m_text; + QVariant m_shortcut; + QFont m_font; + QQuickPlatformMenu *m_menu; + QQuickPlatformMenu *m_subMenu; + QQuickPlatformMenuItemGroup *m_group; + mutable QQuickPlatformIconLoader *m_iconLoader; + QPlatformMenuItem *m_handle; + + friend class QQuickPlatformMenu; + friend class QQuickPlatformMenuItemGroup; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformMenuItem) + +#endif // QQUICKPLATFORMMENUITEM_P_H diff --git a/src/imports/platform/qquickplatformmenuitemgroup.cpp b/src/imports/platform/qquickplatformmenuitemgroup.cpp new file mode 100644 index 00000000..1f4dda3c --- /dev/null +++ b/src/imports/platform/qquickplatformmenuitemgroup.cpp @@ -0,0 +1,390 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Templates module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformmenuitemgroup_p.h" +#include "qquickplatformmenuitem_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype MenuItemGroup + \inherits QtObject + \instantiates QQuickPlatformMenuItemGroup + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A group for managing native menu items. + + The MenuItemGroup groups native menu items together. + + MenuItemGroup is exclusive by default. In an exclusive menu item + group, only one item can be checked at any time; checking another + item automatically unchecks the previously checked one. MenuItemGroup + can be configured as non-exclusive, which is particularly useful for + showing, hiding, enabling and disabling items together as a group. + + The most straight-forward way to use MenuItemGroup is to assign + a list of items. + + \code + Menu { + id: verticalMenu + title: qsTr("Vertical") + + MenuItemGroup { + id: verticalGroup + items: verticalMenu.items + } + + MenuItem { text: qsTr("Top"); checkable: true } + MenuItem { text: qsTr("Center"); checked: true } + MenuItem { text: qsTr("Bottom"); checkable: true } + } + \endcode + + The same menu may sometimes contain items that should not be included + in the same exclusive group. Such cases are best handled using the + \l {MenuItem::group}{group} property. + + \code + Menu { + id: horizontalMenu + title: qsTr("Horizontal") + + MenuItemGroup { + id: horizontalGroup + } + + MenuItem { + checked: true + text: qsTr("Left") + group: horizontalGroup + } + MenuItem { + checkable: true + text: qsTr("Center") + group: horizontalGroup + } + MenuItem { + text: qsTr("Right") + checkable: true + group: horizontalGroup + } + + MenuItem { separator: true } + MenuItem { text: qsTr("Justify"); checkable: true } + MenuItem { text: qsTr("Absolute"); checkable: true } + } + \endcode + + More advanced use cases can be handled using the addItem() and + removeItem() methods. + + \labs + + \sa MenuItem +*/ + +/*! + \qmlsignal Qt.labs.platform::MenuItemGroup::triggered(MenuItem item) + + This signal is emitted when an \a item in the group is triggered by the user. + + \sa MenuItem::triggered() +*/ + +/*! + \qmlsignal Qt.labs.platform::MenuItemGroup::hovered(MenuItem item) + + This signal is emitted when an \a item in the group is hovered by the user. + + \sa MenuItem::hovered() +*/ + +QQuickPlatformMenuItemGroup::QQuickPlatformMenuItemGroup(QObject *parent) + : QObject(parent), m_enabled(true), m_visible(true), m_exclusive(true), m_checkedItem(nullptr) +{ +} + +QQuickPlatformMenuItemGroup::~QQuickPlatformMenuItemGroup() +{ + clear(); +} + +/*! + \qmlproperty bool Qt.labs.platform::MenuItemGroup::enabled + + This property holds whether the group is enabled. The default value is \c true. + + The enabled state of the group affects the enabled state of each item in the group, + except that explicitly disabled items are not enabled even if the group is enabled. +*/ +bool QQuickPlatformMenuItemGroup::isEnabled() const +{ + return m_enabled; +} + +void QQuickPlatformMenuItemGroup::setEnabled(bool enabled) +{ + if (m_enabled == enabled) + return; + + m_enabled = enabled; + emit enabledChanged(); + + for (QQuickPlatformMenuItem *item : m_items) { + if (item->m_enabled) { + item->sync(); + emit item->enabledChanged(); + } + } +} + +/*! + \qmlproperty bool Qt.labs.platform::MenuItemGroup::visible + + This property holds whether the group is visible. The default value is \c true. + + The visibility of the group affects the visibility of each item in the group, + except that explicitly hidden items are not visible even if the group is visible. +*/ +bool QQuickPlatformMenuItemGroup::isVisible() const +{ + return m_visible; +} + +void QQuickPlatformMenuItemGroup::setVisible(bool visible) +{ + if (m_visible == visible) + return; + + m_visible = visible; + emit visibleChanged(); + + for (QQuickPlatformMenuItem *item : m_items) { + if (item->m_visible) { + item->sync(); + emit item->visibleChanged(); + } + } +} + +/*! + \qmlproperty bool Qt.labs.platform::MenuItemGroup::exclusive + + This property holds whether the group is exclusive. The default value is \c true. + + In an exclusive menu item group, only one item can be checked at any time; + checking another item automatically unchecks the previously checked one. +*/ +bool QQuickPlatformMenuItemGroup::isExclusive() const +{ + return m_exclusive; +} + +void QQuickPlatformMenuItemGroup::setExclusive(bool exclusive) +{ + if (m_exclusive == exclusive) + return; + + m_exclusive = exclusive; + emit exclusiveChanged(); + + for (QQuickPlatformMenuItem *item : m_items) + item->sync(); +} + +/*! + \qmlproperty MenuItem Qt.labs.platform::MenuItemGroup::checkedItem + + This property holds the currently checked item in the group, or \c null if no item is checked. +*/ +QQuickPlatformMenuItem *QQuickPlatformMenuItemGroup::checkedItem() const +{ + return m_checkedItem; +} + +void QQuickPlatformMenuItemGroup::setCheckedItem(QQuickPlatformMenuItem *item) +{ + if (m_checkedItem == item) + return; + + if (m_checkedItem) + m_checkedItem->setChecked(false); + + m_checkedItem = item; + emit checkedItemChanged(); + + if (item) + item->setChecked(true); +} + +/*! + \qmlproperty list<MenuItem> Qt.labs.platform::MenuItemGroup::items + + This property holds the list of items in the group. +*/ +QQmlListProperty<QQuickPlatformMenuItem> QQuickPlatformMenuItemGroup::items() +{ + return QQmlListProperty<QQuickPlatformMenuItem>(this, nullptr, items_append, items_count, items_at, items_clear); +} + +/*! + \qmlmethod void Qt.labs.platform::MenuItemGroup::addItem(MenuItem item) + + Adds an \a item to the group. +*/ +void QQuickPlatformMenuItemGroup::addItem(QQuickPlatformMenuItem *item) +{ + if (!item || m_items.contains(item)) + return; + + m_items.append(item); + item->setGroup(this); + + connect(item, &QQuickPlatformMenuItem::checkedChanged, this, &QQuickPlatformMenuItemGroup::updateCurrent); + connect(item, &QQuickPlatformMenuItem::triggered, this, &QQuickPlatformMenuItemGroup::activateItem); + connect(item, &QQuickPlatformMenuItem::hovered, this, &QQuickPlatformMenuItemGroup::hoverItem); + + if (m_exclusive && item->isChecked()) + setCheckedItem(item); + + emit itemsChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::MenuItemGroup::removeItem(MenuItem item) + + Removes an \a item from the group. +*/ +void QQuickPlatformMenuItemGroup::removeItem(QQuickPlatformMenuItem *item) +{ + if (!item || !m_items.contains(item)) + return; + + m_items.removeOne(item); + item->setGroup(nullptr); + + disconnect(item, &QQuickPlatformMenuItem::checkedChanged, this, &QQuickPlatformMenuItemGroup::updateCurrent); + disconnect(item, &QQuickPlatformMenuItem::triggered, this, &QQuickPlatformMenuItemGroup::activateItem); + disconnect(item, &QQuickPlatformMenuItem::hovered, this, &QQuickPlatformMenuItemGroup::hoverItem); + + if (m_checkedItem == item) + setCheckedItem(nullptr); + + emit itemsChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::MenuItemGroup::clear() + + Removes all items from the group. +*/ +void QQuickPlatformMenuItemGroup::clear() +{ + if (m_items.isEmpty()) + return; + + for (QQuickPlatformMenuItem *item : m_items) { + item->setGroup(nullptr); + disconnect(item, &QQuickPlatformMenuItem::checkedChanged, this, &QQuickPlatformMenuItemGroup::updateCurrent); + disconnect(item, &QQuickPlatformMenuItem::triggered, this, &QQuickPlatformMenuItemGroup::activateItem); + disconnect(item, &QQuickPlatformMenuItem::hovered, this, &QQuickPlatformMenuItemGroup::hoverItem); + } + + setCheckedItem(nullptr); + + m_items.clear(); + emit itemsChanged(); +} + +QQuickPlatformMenuItem *QQuickPlatformMenuItemGroup::findCurrent() const +{ + for (QQuickPlatformMenuItem *item : m_items) { + if (item->isChecked()) + return item; + } + return nullptr; +} + +void QQuickPlatformMenuItemGroup::updateCurrent() +{ + if (!m_exclusive) + return; + + QQuickPlatformMenuItem *item = qobject_cast<QQuickPlatformMenuItem*>(sender()); + if (item && item->isChecked()) + setCheckedItem(item); +} + +void QQuickPlatformMenuItemGroup::activateItem() +{ + QQuickPlatformMenuItem *item = qobject_cast<QQuickPlatformMenuItem*>(sender()); + if (item) + emit triggered(item); +} + +void QQuickPlatformMenuItemGroup::hoverItem() +{ + QQuickPlatformMenuItem *item = qobject_cast<QQuickPlatformMenuItem*>(sender()); + if (item) + emit hovered(item); +} + +void QQuickPlatformMenuItemGroup::items_append(QQmlListProperty<QQuickPlatformMenuItem> *prop, QQuickPlatformMenuItem *item) +{ + QQuickPlatformMenuItemGroup *group = static_cast<QQuickPlatformMenuItemGroup *>(prop->object); + group->addItem(item); +} + +int QQuickPlatformMenuItemGroup::items_count(QQmlListProperty<QQuickPlatformMenuItem> *prop) +{ + QQuickPlatformMenuItemGroup *group = static_cast<QQuickPlatformMenuItemGroup *>(prop->object); + return group->m_items.count(); +} + +QQuickPlatformMenuItem *QQuickPlatformMenuItemGroup::items_at(QQmlListProperty<QQuickPlatformMenuItem> *prop, int index) +{ + QQuickPlatformMenuItemGroup *group = static_cast<QQuickPlatformMenuItemGroup *>(prop->object); + return group->m_items.value(index); +} + +void QQuickPlatformMenuItemGroup::items_clear(QQmlListProperty<QQuickPlatformMenuItem> *prop) +{ + QQuickPlatformMenuItemGroup *group = static_cast<QQuickPlatformMenuItemGroup *>(prop->object); + group->clear(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformmenuitemgroup_p.h b/src/imports/platform/qquickplatformmenuitemgroup_p.h new file mode 100644 index 00000000..f5797eff --- /dev/null +++ b/src/imports/platform/qquickplatformmenuitemgroup_p.h @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Templates module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMMENUITEMGROUP_P_H +#define QQUICKPLATFORMMENUITEMGROUP_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qobject.h> +#include <QtCore/qvector.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQuickPlatformMenuItem; +class QQuickPlatformMenuItemGroupPrivate; + +class QQuickPlatformMenuItemGroup : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged FINAL) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL) + Q_PROPERTY(bool exclusive READ isExclusive WRITE setExclusive NOTIFY exclusiveChanged FINAL) + Q_PROPERTY(QQuickPlatformMenuItem *checkedItem READ checkedItem WRITE setCheckedItem NOTIFY checkedItemChanged FINAL) + Q_PROPERTY(QQmlListProperty<QQuickPlatformMenuItem> items READ items NOTIFY itemsChanged FINAL) + +public: + explicit QQuickPlatformMenuItemGroup(QObject *parent = nullptr); + ~QQuickPlatformMenuItemGroup(); + + bool isEnabled() const; + void setEnabled(bool enabled); + + bool isVisible() const; + void setVisible(bool visible); + + bool isExclusive() const; + void setExclusive(bool exclusive); + + QQuickPlatformMenuItem *checkedItem() const; + void setCheckedItem(QQuickPlatformMenuItem *item); + + QQmlListProperty<QQuickPlatformMenuItem> items(); + + Q_INVOKABLE void addItem(QQuickPlatformMenuItem *item); + Q_INVOKABLE void removeItem(QQuickPlatformMenuItem *item); + Q_INVOKABLE void clear(); + +Q_SIGNALS: + void triggered(QQuickPlatformMenuItem *item); + void hovered(QQuickPlatformMenuItem *item); + + void enabledChanged(); + void visibleChanged(); + void exclusiveChanged(); + void checkedItemChanged(); + void itemsChanged(); + +private: + QQuickPlatformMenuItem *findCurrent() const; + void updateCurrent(); + void activateItem(); + void hoverItem(); + + static void items_append(QQmlListProperty<QQuickPlatformMenuItem> *prop, QQuickPlatformMenuItem *obj); + static int items_count(QQmlListProperty<QQuickPlatformMenuItem> *prop); + static QQuickPlatformMenuItem *items_at(QQmlListProperty<QQuickPlatformMenuItem> *prop, int index); + static void items_clear(QQmlListProperty<QQuickPlatformMenuItem> *prop); + + bool m_enabled; + bool m_visible; + bool m_exclusive; + QQuickPlatformMenuItem *m_checkedItem; + QVector<QQuickPlatformMenuItem*> m_items; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformMenuItemGroup) + +#endif // QQUICKPLATFORMMENUITEMGROUP_P_H diff --git a/src/imports/platform/qquickplatformmenuseparator.cpp b/src/imports/platform/qquickplatformmenuseparator.cpp new file mode 100644 index 00000000..908ea075 --- /dev/null +++ b/src/imports/platform/qquickplatformmenuseparator.cpp @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformmenuseparator_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype MenuSeparator + \inherits MenuItem + \instantiates QQuickPlatformMenuSeparator + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A native menu separator. + + The MenuSeparator type is provided for convenience. It is a MenuItem + that has the \l {MenuItem::}{separator} property set to \c true by default. + + \image qtlabsplatform-menubar.png + + \labs + + \sa Menu, MenuItem +*/ + +QQuickPlatformMenuSeparator::QQuickPlatformMenuSeparator(QObject *parent) + : QQuickPlatformMenuItem(parent) +{ + setSeparator(true); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformmenuseparator_p.h b/src/imports/platform/qquickplatformmenuseparator_p.h new file mode 100644 index 00000000..ce5ed391 --- /dev/null +++ b/src/imports/platform/qquickplatformmenuseparator_p.h @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMMENUSEPARATOR_P_H +#define QQUICKPLATFORMMENUSEPARATOR_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qquickplatformmenuitem_p.h" + +QT_BEGIN_NAMESPACE + +class QQuickPlatformMenuSeparator : public QQuickPlatformMenuItem +{ + Q_OBJECT + +public: + explicit QQuickPlatformMenuSeparator(QObject *parent = nullptr); +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformMenuSeparator) + +#endif // QQUICKPLATFORMMENUSEPARATOR_P_H diff --git a/src/imports/platform/qquickplatformmessagedialog.cpp b/src/imports/platform/qquickplatformmessagedialog.cpp new file mode 100644 index 00000000..20216e9b --- /dev/null +++ b/src/imports/platform/qquickplatformmessagedialog.cpp @@ -0,0 +1,383 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformmessagedialog_p.h" + +#include <QtQml/qqmlinfo.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype MessageDialog + \inherits Dialog + \instantiates QQuickPlatformMessageDialog + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A native message dialog. + + The MessageDialog type provides a QML API for native platform message dialogs. + + \image qtlabsplatform-messagedialog-android.png + + A message dialog is used to inform the user, or ask the user a question. + A message dialog displays a primary \l text to alert the user to a situation, + an \l {informativeText}{informative text} to further explain the alert or to + ask the user a question, and an optional \l {detailedText}{detailed text} to + provide even more data if the user requests it. A message box can also display + a configurable set of \l buttons for accepting a user response. + + To show a message dialog, construct an instance of MessageDialog, set the + desired properties, and call \l {Dialog::}{open()}. + + \code + MessageDialog { + buttons: MessageDialog.Ok + text: "The document has been modified." + } + \endcode + + The user must click the \uicontrol OK button to dismiss the message dialog. + A modal message dialog blocks the rest of the GUI until the message is + dismissed. + + A more elaborate approach than just alerting the user to an event is to + also ask the user what to do about it. Store the question in the + \l {informativeText}{informative text} property, and specify the \l buttons + property to the set of buttons you want as the set of user responses. The + buttons are specified by combining values using the bitwise OR operator. The + display order for the buttons is platform dependent. + + \code + MessageDialog { + text: "The document has been modified." + informativeText: "Do you want to save your changes?" + buttons: MessageDialog.Ok | MessageDialog.Cancel + + onAccepted: document.save() + } + \endcode + + \image qtlabsplatform-messagedialog-informative-android.png + + The \l clicked() signal passes the information of which button was clicked. + + A native platform message dialog is currently available on the following platforms: + + \list + \li iOS + \li Android + \li WinRT + \endlist + + \input includes/widgets.qdocinc 1 + + \labs +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::clicked(button) + + This signal is emitted when a dialog \a button is clicked. + + \sa buttons +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::okClicked() + + This signal is emitted when \uicontrol Ok is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::saveClicked() + + This signal is emitted when \uicontrol Save is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::saveAllClicked() + + This signal is emitted when \uicontrol {Save All} is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::openClicked() + + This signal is emitted when \uicontrol Open is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::yesClicked() + + This signal is emitted when \uicontrol Yes is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::yesToAllClicked() + + This signal is emitted when \uicontrol {Yes To All} is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::noClicked() + + This signal is emitted when \uicontrol No is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::noToAllClicked() + + This signal is emitted when \uicontrol {No To All} is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::abortClicked() + + This signal is emitted when \uicontrol Abort is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::retryClicked() + + This signal is emitted when \uicontrol Retry is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::ignoreClicked() + + This signal is emitted when \uicontrol Ignore is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::closeClicked() + + This signal is emitted when \uicontrol Close is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::cancelClicked() + + This signal is emitted when \uicontrol Cancel is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::discardClicked() + + This signal is emitted when \uicontrol Discard is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::helpClicked() + + This signal is emitted when \uicontrol Help is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::applyClicked() + + This signal is emitted when \uicontrol Apply is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::resetClicked() + + This signal is emitted when \uicontrol Reset is clicked. +*/ + +/*! + \qmlsignal Qt.labs.platform::MessageDialog::restoreDefaultsClicked() + + This signal is emitted when \uicontrol {Restore Defaults} is clicked. +*/ + +QQuickPlatformMessageDialog::QQuickPlatformMessageDialog(QObject *parent) + : QQuickPlatformDialog(QPlatformTheme::MessageDialog, parent), + m_options(QMessageDialogOptions::create()) +{ +} + +/*! + \qmlproperty string Qt.labs.platform::MessageDialog::text + + This property holds the text to be displayed on the message dialog. + + \sa informativeText, detailedText +*/ +QString QQuickPlatformMessageDialog::text() const +{ + return m_options->text(); +} + +void QQuickPlatformMessageDialog::setText(const QString &text) +{ + if (m_options->text() == text) + return; + + m_options->setText(text); + emit textChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::MessageDialog::informativeText + + This property holds the informative text that provides a fuller description for the message. + + Informative text can be used to expand upon the \l text to give more information to the user. + + \sa text, detailedText +*/ +QString QQuickPlatformMessageDialog::informativeText() const +{ + return m_options->informativeText(); +} + +void QQuickPlatformMessageDialog::setInformativeText(const QString &text) +{ + if (m_options->informativeText() == text) + return; + + m_options->setInformativeText(text); + emit informativeTextChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::MessageDialog::detailedText + + This property holds the text to be displayed in the details area. + + \sa text, informativeText +*/ +QString QQuickPlatformMessageDialog::detailedText() const +{ + return m_options->detailedText(); +} + +void QQuickPlatformMessageDialog::setDetailedText(const QString &text) +{ + if (m_options->detailedText() == text) + return; + + m_options->setDetailedText(text); + emit detailedTextChanged(); +} + +/*! + \qmlproperty flags Qt.labs.platform::MessageDialog::buttons + + This property holds a combination of buttons that are used by the message dialog. + The default value is \c MessageDialog.NoButton. + + Possible flags: + \value MessageDialog.Ok An "OK" button defined with the \c AcceptRole. + \value MessageDialog.Open An "Open" button defined with the \c AcceptRole. + \value MessageDialog.Save A "Save" button defined with the \c AcceptRole. + \value MessageDialog.Cancel A "Cancel" button defined with the \c RejectRole. + \value MessageDialog.Close A "Close" button defined with the \c RejectRole. + \value MessageDialog.Discard A "Discard" or "Don't Save" button, depending on the platform, defined with the \c DestructiveRole. + \value MessageDialog.Apply An "Apply" button defined with the \c ApplyRole. + \value MessageDialog.Reset A "Reset" button defined with the \c ResetRole. + \value MessageDialog.RestoreDefaults A "Restore Defaults" button defined with the \c ResetRole. + \value MessageDialog.Help A "Help" button defined with the \c HelpRole. + \value MessageDialog.SaveAll A "Save All" button defined with the \c AcceptRole. + \value MessageDialog.Yes A "Yes" button defined with the \c YesRole. + \value MessageDialog.YesToAll A "Yes to All" button defined with the \c YesRole. + \value MessageDialog.No A "No" button defined with the \c NoRole. + \value MessageDialog.NoToAll A "No to All" button defined with the \c NoRole. + \value MessageDialog.Abort An "Abort" button defined with the \c RejectRole. + \value MessageDialog.Retry A "Retry" button defined with the \c AcceptRole. + \value MessageDialog.Ignore An "Ignore" button defined with the \c AcceptRole. + \value MessageDialog.NoButton The dialog has no buttons. + + \sa clicked() +*/ +QPlatformDialogHelper::StandardButtons QQuickPlatformMessageDialog::buttons() const +{ + return m_options->standardButtons(); +} + +void QQuickPlatformMessageDialog::setButtons(QPlatformDialogHelper::StandardButtons buttons) +{ + if (m_options->standardButtons() == buttons) + return; + + m_options->setStandardButtons(buttons); + emit buttonsChanged(); +} + +void QQuickPlatformMessageDialog::onCreate(QPlatformDialogHelper *dialog) +{ + if (QPlatformMessageDialogHelper *messageDialog = qobject_cast<QPlatformMessageDialogHelper *>(dialog)) { + connect(messageDialog, &QPlatformMessageDialogHelper::clicked, this, &QQuickPlatformMessageDialog::handleClick); + messageDialog->setOptions(m_options); + } +} + +void QQuickPlatformMessageDialog::onShow(QPlatformDialogHelper *dialog) +{ + m_options->setWindowTitle(title()); + if (QPlatformMessageDialogHelper *messageDialog = qobject_cast<QPlatformMessageDialogHelper *>(dialog)) + messageDialog->setOptions(m_options); +} + +void QQuickPlatformMessageDialog::handleClick(QPlatformDialogHelper::StandardButton button) +{ + done(button); + emit clicked(button); + + switch (button) { + case QPlatformDialogHelper::Ok: emit okClicked(); break; + case QPlatformDialogHelper::Save: emit saveClicked(); break; + case QPlatformDialogHelper::SaveAll: emit saveAllClicked(); break; + case QPlatformDialogHelper::Open: emit openClicked(); break; + case QPlatformDialogHelper::Yes: emit yesClicked(); break; + case QPlatformDialogHelper::YesToAll: emit yesToAllClicked(); break; + case QPlatformDialogHelper::No: emit noClicked(); break; + case QPlatformDialogHelper::NoToAll: emit noToAllClicked(); break; + case QPlatformDialogHelper::Abort: emit abortClicked(); break; + case QPlatformDialogHelper::Retry: emit retryClicked(); break; + case QPlatformDialogHelper::Ignore: emit ignoreClicked(); break; + case QPlatformDialogHelper::Close: emit closeClicked(); break; + case QPlatformDialogHelper::Cancel: emit cancelClicked(); break; + case QPlatformDialogHelper::Discard: emit discardClicked(); break; + case QPlatformDialogHelper::Help: emit helpClicked(); break; + case QPlatformDialogHelper::Apply: emit applyClicked(); break; + case QPlatformDialogHelper::Reset: emit resetClicked(); break; + case QPlatformDialogHelper::RestoreDefaults: emit restoreDefaultsClicked(); break; + default: qmlInfo(this) << "unknown button" << button; break; + } +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformmessagedialog_p.h b/src/imports/platform/qquickplatformmessagedialog_p.h new file mode 100644 index 00000000..e8355932 --- /dev/null +++ b/src/imports/platform/qquickplatformmessagedialog_p.h @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMMESSAGEDIALOG_P_H +#define QQUICKPLATFORMMESSAGEDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qquickplatformdialog_p.h" +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQuickPlatformMessageDialog : public QQuickPlatformDialog +{ + Q_OBJECT + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged FINAL) + Q_PROPERTY(QString informativeText READ informativeText WRITE setInformativeText NOTIFY informativeTextChanged FINAL) + Q_PROPERTY(QString detailedText READ detailedText WRITE setDetailedText NOTIFY detailedTextChanged FINAL) + Q_PROPERTY(QPlatformDialogHelper::StandardButtons buttons READ buttons WRITE setButtons NOTIFY buttonsChanged FINAL) + Q_FLAGS(QPlatformDialogHelper::StandardButtons) + +public: + explicit QQuickPlatformMessageDialog(QObject *parent = nullptr); + + QString text() const; + void setText(const QString &text); + + QString informativeText() const; + void setInformativeText(const QString &text); + + QString detailedText() const; + void setDetailedText(const QString &text); + + QPlatformDialogHelper::StandardButtons buttons() const; + void setButtons(QPlatformDialogHelper::StandardButtons buttons); + +Q_SIGNALS: + void textChanged(); + void informativeTextChanged(); + void detailedTextChanged(); + void buttonsChanged(); + void clicked(QPlatformDialogHelper::StandardButton button); + + void okClicked(); + void saveClicked(); + void saveAllClicked(); + void openClicked(); + void yesClicked(); + void yesToAllClicked(); + void noClicked(); + void noToAllClicked(); + void abortClicked(); + void retryClicked(); + void ignoreClicked(); + void closeClicked(); + void cancelClicked(); + void discardClicked(); + void helpClicked(); + void applyClicked(); + void resetClicked(); + void restoreDefaultsClicked(); + +protected: + void onCreate(QPlatformDialogHelper *dialog) override; + void onShow(QPlatformDialogHelper *dialog) override; + +private Q_SLOTS: + void handleClick(QPlatformDialogHelper::StandardButton button); + +private: + QSharedPointer<QMessageDialogOptions> m_options; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformMessageDialog) + +#endif // QQUICKPLATFORMMESSAGEDIALOG_P_H diff --git a/src/imports/platform/qquickplatformstandardpaths.cpp b/src/imports/platform/qquickplatformstandardpaths.cpp new file mode 100644 index 00000000..004d3c86 --- /dev/null +++ b/src/imports/platform/qquickplatformstandardpaths.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformstandardpaths_p.h" + +#include <QtQml/qqmlengine.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype StandardPaths + \inherits QtObject + \instantiates QQuickPlatformStandardPaths + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief Provides access to the standard system paths. + + The StandardPaths singleton type provides methods for querying the standard + system paths. The standard paths are mostly useful in conjunction with the + FileDialog and FolderDialog types. + + \qml + FileDialog { + folder: StandardPaths.writableLocation(StandardPaths.DocumentsLocation) + } + \endqml + + \labs + + \sa FileDialog, FolderDialog, QStandardPaths +*/ + +static QList<QUrl> toUrlList(const QStringList &paths) +{ + QList<QUrl> urls; + urls.reserve(paths.size()); + for (const QString &path : paths) + urls += QUrl::fromLocalFile(path); + return urls; +} + +QQuickPlatformStandardPaths::QQuickPlatformStandardPaths(QObject *parent) + : QObject(parent) +{ +} + +QObject *QQuickPlatformStandardPaths::create(QQmlEngine *engine, QJSEngine *scriptEngine) +{ + Q_UNUSED(scriptEngine); + return new QQuickPlatformStandardPaths(engine); +} + +/*! + \qmlmethod string Qt.labs.platform::StandardPaths::displayName(StandardLocation type) + + \sa QStandardPaths::displayName() +*/ +QString QQuickPlatformStandardPaths::displayName(QStandardPaths::StandardLocation type) +{ + return QStandardPaths::displayName(type); +} + +/*! + \qmlmethod url Qt.labs.platform::StandardPaths::findExecutable(string executableName, list<string> paths) + + \sa QStandardPaths::findExecutable() +*/ +QUrl QQuickPlatformStandardPaths::findExecutable(const QString &executableName, const QStringList &paths) +{ + return QUrl::fromLocalFile(QStandardPaths::findExecutable(executableName, paths)); +} + +/*! + \qmlmethod url Qt.labs.platform::StandardPaths::locate(StandardLocation type, string fileName, LocateOptions options = LocateFile) + + \sa QStandardPaths::locate() +*/ +QUrl QQuickPlatformStandardPaths::locate(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options) +{ + return QUrl::fromLocalFile(QStandardPaths::locate(type, fileName, options)); +} + +/*! + \qmlmethod list<url> Qt.labs.platform::StandardPaths::locateAll(StandardLocation type, string fileName, LocateOptions options = LocateFile) + + \sa QStandardPaths::locateAll() +*/ +QList<QUrl> QQuickPlatformStandardPaths::locateAll(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options) +{ + return toUrlList(QStandardPaths::locateAll(type, fileName, options)); +} + +/*! + \qmlmethod void Qt.labs.platform::StandardPaths::setTestModeEnabled(bool testMode) + + \sa QStandardPaths::setTestModeEnabled() +*/ +void QQuickPlatformStandardPaths::setTestModeEnabled(bool testMode) +{ + QStandardPaths::setTestModeEnabled(testMode); +} + +/*! + \qmlmethod list<url> Qt.labs.platform::StandardPaths::standardLocations(StandardLocation type) + + \sa QStandardPaths::standardLocations() +*/ +QList<QUrl> QQuickPlatformStandardPaths::standardLocations(QStandardPaths::StandardLocation type) +{ + return toUrlList(QStandardPaths::standardLocations(type)); +} + +/*! + \qmlmethod url Qt.labs.platform::StandardPaths::writableLocation(StandardLocation type) + + \sa QStandardPaths::writableLocation() +*/ +QUrl QQuickPlatformStandardPaths::writableLocation(QStandardPaths::StandardLocation type) +{ + return QUrl::fromLocalFile(QStandardPaths::writableLocation(type)); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformstandardpaths_p.h b/src/imports/platform/qquickplatformstandardpaths_p.h new file mode 100644 index 00000000..b6504e70 --- /dev/null +++ b/src/imports/platform/qquickplatformstandardpaths_p.h @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMSTANDARDPATHS_P_H +#define QQUICKPLATFORMSTANDARDPATHS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qobject.h> +#include <QtCore/qstandardpaths.h> +#include <QtCore/qurl.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQmlEngine; +class QJSEngine; + +class QQuickPlatformStandardPaths : public QObject +{ + Q_OBJECT + Q_ENUMS(QStandardPaths::StandardLocation QStandardPaths::LocateOptions) + +public: + explicit QQuickPlatformStandardPaths(QObject *parent = nullptr); + + static QObject *create(QQmlEngine *engine, QJSEngine *scriptEngine); + + Q_INVOKABLE static QString displayName(QStandardPaths::StandardLocation type); + Q_INVOKABLE static QUrl findExecutable(const QString &executableName, const QStringList &paths = QStringList()); + Q_INVOKABLE static QUrl locate(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = QStandardPaths::LocateFile); + Q_INVOKABLE static QList<QUrl> locateAll(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = QStandardPaths::LocateFile); + Q_INVOKABLE static void setTestModeEnabled(bool testMode); + Q_INVOKABLE static QList<QUrl> standardLocations(QStandardPaths::StandardLocation type); + Q_INVOKABLE static QUrl writableLocation(QStandardPaths::StandardLocation type); + +private: + Q_DISABLE_COPY(QQuickPlatformStandardPaths) +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformStandardPaths) + +#endif // QQUICKPLATFORMSTANDARDPATHS_P_H diff --git a/src/imports/platform/qquickplatformsystemtrayicon.cpp b/src/imports/platform/qquickplatformsystemtrayicon.cpp new file mode 100644 index 00000000..70393c41 --- /dev/null +++ b/src/imports/platform/qquickplatformsystemtrayicon.cpp @@ -0,0 +1,441 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformsystemtrayicon_p.h" +#include "qquickplatformmenu_p.h" +#include "qquickplatformiconloader_p.h" + +#include <QtCore/qloggingcategory.h> +#include <QtGui/qpa/qplatformtheme.h> +#include <QtGui/private/qguiapplication_p.h> + +#include "widgets/qwidgetplatform_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype SystemTrayIcon + \inherits QtObject + \instantiates QQuickPlatformSystemTrayIcon + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A system tray icon. + + The SystemTrayIcon type provides an icon for an application in the system tray. + + Many desktop platforms provide a special system tray or notification area, + where applications can display icons and notification messages. + + \image qtlabsplatform-systemtrayicon.png + + The following example shows how to create a system tray icon, and how to make + use of the \l activated() signal: + + \code + SystemTrayIcon { + visible: true + iconSource: "qrc:/images/tray-icon.png" + + onActivated: { + window.show() + window.raise() + window.requestActivate() + } + } + \endcode + + \section2 Tray menu + + SystemTrayIcon can have a menu that opens when the icon is activated. + + \image qtlabsplatform-systemtrayicon-menu.png + + The following example illustrates how to assign a \l Menu to a system tray icon: + + \code + SystemTrayIcon { + visible: true + iconSource: "qrc:/images/tray-icon.png" + + menu: Menu { + MenuItem { + text: qsTr("Quit") + onActivated: Qt.quit() + } + } + } + \endcode + + \section2 Notification messages + + SystemTrayIcon can display notification messages. + + \image qtlabsplatform-systemtrayicon-message.png + + The following example presents how to show a notification message using + \l showMessage(), and how to make use of the \l messageClicked() signal: + + \code + SystemTrayIcon { + visible: true + iconSource: "qrc:/images/tray-icon.png" + + onMessageClicked: console.log("Message clicked") + Component.onCompleted: showMessage("Message title", "Something important came up. Click this to know more.") + } + \endcode + + \section2 Availability + + A native system tray icon is currently \l available on the following platforms: + + \list + \li All window managers and independent tray implementations for X11 that implement the + \l{http://standards.freedesktop.org/systemtray-spec/systemtray-spec-0.2.html} + {freedesktop.org XEmbed system tray specification}. + \li All desktop environments that implement the + \l{http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem} + {freedesktop.org D-Bus StatusNotifierItem specification}, including recent versions of KDE and Unity. + \li All supported versions of macOS. Note that the Growl notification system must be installed + for showMessage() to display messages on OS X prior to 10.8 (Mountain Lion). + \endlist + + \input includes/widgets.qdocinc 1 + + \labs + + \sa Menu +*/ + +/*! + \qmlsignal Qt.labs.platform::SystemTrayIcon::activated(ActivationReason reason) + + This signal is emitted when the system tray icon is activated by the user. The + \a reason argument specifies how the system tray icon was activated. + + Available reasons: + + \value SystemTrayIcon.Unknown Unknown reason + \value SystemTrayIcon.Context The context menu for the system tray icon was requested + \value SystemTrayIcon.DoubleClick The system tray icon was double clicked + \value SystemTrayIcon.Trigger The system tray icon was clicked + \value SystemTrayIcon.MiddleClick The system tray icon was clicked with the middle mouse button +*/ + +/*! + \qmlsignal Qt.labs.platform::SystemTrayIcon::messageClicked() + + This signal is emitted when a notification message is clicked by the user. + + \sa showMessage() +*/ + +Q_DECLARE_LOGGING_CATEGORY(qtLabsPlatformTray) + +QQuickPlatformSystemTrayIcon::QQuickPlatformSystemTrayIcon(QObject *parent) + : QObject(parent), + m_complete(false), + m_visible(false), + m_menu(nullptr), + m_iconLoader(nullptr), + m_handle(nullptr) +{ + m_handle = QGuiApplicationPrivate::platformTheme()->createPlatformSystemTrayIcon(); + if (!m_handle) + m_handle = QWidgetPlatform::createSystemTrayIcon(this); + qCDebug(qtLabsPlatformTray) << "SystemTrayIcon ->" << m_handle; + + if (m_handle) { + connect(m_handle, &QPlatformSystemTrayIcon::activated, this, &QQuickPlatformSystemTrayIcon::activated); + connect(m_handle, &QPlatformSystemTrayIcon::messageClicked, this, &QQuickPlatformSystemTrayIcon::messageClicked); + } +} + +QQuickPlatformSystemTrayIcon::~QQuickPlatformSystemTrayIcon() +{ + if (m_menu) + m_menu->setSystemTrayIcon(nullptr); + cleanup(); + delete m_iconLoader; + m_iconLoader = nullptr; + delete m_handle; + m_handle = nullptr; +} + +QPlatformSystemTrayIcon *QQuickPlatformSystemTrayIcon::handle() const +{ + return m_handle; +} + +/*! + \readonly + \qmlproperty bool Qt.labs.platform::SystemTrayIcon::available + + This property holds whether the system tray is available. +*/ +bool QQuickPlatformSystemTrayIcon::isAvailable() const +{ + return m_handle && m_handle->isSystemTrayAvailable(); +} + +/*! + \readonly + \qmlproperty bool Qt.labs.platform::SystemTrayIcon::supportsMessages + + This property holds whether the system tray icon supports notification messages. + + \sa showMessage() +*/ +bool QQuickPlatformSystemTrayIcon::supportsMessages() const +{ + return m_handle && m_handle->supportsMessages(); +} + +/*! + \qmlproperty bool Qt.labs.platform::SystemTrayIcon::visible + + This property holds whether the system tray icon is visible. + + The default value is \c false. +*/ +bool QQuickPlatformSystemTrayIcon::isVisible() const +{ + return m_visible; +} + +void QQuickPlatformSystemTrayIcon::setVisible(bool visible) +{ + if (m_visible == visible) + return; + + if (m_handle && m_complete) { + if (visible) + init(); + else + cleanup(); + } + + m_visible = visible; + emit visibleChanged(); +} + +/*! + \qmlproperty url Qt.labs.platform::SystemTrayIcon::iconSource + + This property holds the url of the system tray icon. + + \sa iconName +*/ +QUrl QQuickPlatformSystemTrayIcon::iconSource() const +{ + if (!m_iconLoader) + return QUrl(); + + return m_iconLoader->iconSource(); +} + +void QQuickPlatformSystemTrayIcon::setIconSource(const QUrl& source) +{ + if (source == iconSource()) + return; + + iconLoader()->setIconSource(source); + emit iconSourceChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::SystemTrayIcon::iconName + + This property holds the theme name of the system tray icon. + + \sa iconSource, QIcon::fromTheme() +*/ +QString QQuickPlatformSystemTrayIcon::iconName() const +{ + if (!m_iconLoader) + return QString(); + + return m_iconLoader->iconName(); +} + +void QQuickPlatformSystemTrayIcon::setIconName(const QString& name) +{ + if (name == iconName()) + return; + + iconLoader()->setIconName(name); + emit iconNameChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::SystemTrayIcon::tooltip + + This property holds the tooltip of the system tray icon. +*/ +QString QQuickPlatformSystemTrayIcon::tooltip() const +{ + return m_tooltip; +} + +void QQuickPlatformSystemTrayIcon::setTooltip(const QString &tooltip) +{ + if (m_tooltip == tooltip) + return; + + if (m_handle && m_complete) + m_handle->updateToolTip(tooltip); + + m_tooltip = tooltip; + emit tooltipChanged(); +} + +/*! + \qmlproperty Menu Qt.labs.platform::SystemTrayIcon::menu + + This property holds a menu for the system tray icon. +*/ +QQuickPlatformMenu *QQuickPlatformSystemTrayIcon::menu() const +{ + return m_menu; +} + +void QQuickPlatformSystemTrayIcon::setMenu(QQuickPlatformMenu *menu) +{ + if (m_menu == menu) + return; + + if (m_menu) + m_menu->setSystemTrayIcon(nullptr); + if (menu) { + menu->setSystemTrayIcon(this); + if (m_handle && m_complete && menu->create()) + m_handle->updateMenu(menu->handle()); + } + + m_menu = menu; + emit menuChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::SystemTrayIcon::show() + + Shows the system tray icon. +*/ +void QQuickPlatformSystemTrayIcon::show() +{ + setVisible(true); +} + +/*! + \qmlmethod void Qt.labs.platform::SystemTrayIcon::hide() + + Hides the system tray icon. +*/ +void QQuickPlatformSystemTrayIcon::hide() +{ + setVisible(false); +} + +/*! + \qmlmethod void Qt.labs.platform::SystemTrayIcon::showMessage(string title, string message, MessageIcon icon, int msecs) + + Shows a system tray message with the given \a title, \a message and \a icon + for the time specified in \a msecs. + + \note System tray messages are dependent on the system configuration and user preferences, + and may not appear at all. Therefore, it should not be relied upon as the sole means for providing + critical information. + + \sa supportsMessages, messageClicked() +*/ +void QQuickPlatformSystemTrayIcon::showMessage(const QString &title, const QString &msg, QPlatformSystemTrayIcon::MessageIcon icon, int msecs) +{ + if (m_handle) + m_handle->showMessage(title, msg, QIcon(), icon, msecs); +} + +void QQuickPlatformSystemTrayIcon::init() +{ + if (!m_handle) + return; + + m_handle->init(); + if (m_menu && m_menu->create()) + m_handle->updateMenu(m_menu->handle()); + m_handle->updateToolTip(m_tooltip); + if (m_iconLoader) + m_iconLoader->setEnabled(true); +} + +void QQuickPlatformSystemTrayIcon::cleanup() +{ + if (m_handle) + m_handle->cleanup(); + if (m_iconLoader) + m_iconLoader->setEnabled(false); +} + +void QQuickPlatformSystemTrayIcon::classBegin() +{ +} + +void QQuickPlatformSystemTrayIcon::componentComplete() +{ + m_complete = true; + if (m_visible) + init(); +} + +QQuickPlatformIconLoader *QQuickPlatformSystemTrayIcon::iconLoader() const +{ + if (!m_iconLoader) { + QQuickPlatformSystemTrayIcon *that = const_cast<QQuickPlatformSystemTrayIcon *>(this); + static int slot = staticMetaObject.indexOfSlot("updateIcon()"); + m_iconLoader = new QQuickPlatformIconLoader(slot, that); + m_iconLoader->setEnabled(m_complete); + } + return m_iconLoader; +} + +void QQuickPlatformSystemTrayIcon::updateIcon() +{ + if (!m_handle || !m_iconLoader) + return; + + m_handle->updateIcon(m_iconLoader->icon()); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformsystemtrayicon_p.h b/src/imports/platform/qquickplatformsystemtrayicon_p.h new file mode 100644 index 00000000..12597c72 --- /dev/null +++ b/src/imports/platform/qquickplatformsystemtrayicon_p.h @@ -0,0 +1,139 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMSYSTEMTRAYICON_P_H +#define QQUICKPLATFORMSYSTEMTRAYICON_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qurl.h> +#include <QtGui/qpa/qplatformsystemtrayicon.h> +#include <QtQml/qqmlparserstatus.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQuickPlatformMenu; +class QQuickPlatformIconLoader; + +class QQuickPlatformSystemTrayIcon : public QObject, public QQmlParserStatus +{ + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + Q_PROPERTY(bool available READ isAvailable CONSTANT FINAL) + Q_PROPERTY(bool supportsMessages READ supportsMessages CONSTANT FINAL) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL) + Q_PROPERTY(QUrl iconSource READ iconSource WRITE setIconSource NOTIFY iconSourceChanged FINAL) + Q_PROPERTY(QString iconName READ iconName WRITE setIconName NOTIFY iconNameChanged FINAL) + Q_PROPERTY(QString tooltip READ tooltip WRITE setTooltip NOTIFY tooltipChanged FINAL) + Q_PROPERTY(QQuickPlatformMenu *menu READ menu WRITE setMenu NOTIFY menuChanged FINAL) + Q_ENUMS(QPlatformSystemTrayIcon::ActivationReason QPlatformSystemTrayIcon::MessageIcon) + +public: + explicit QQuickPlatformSystemTrayIcon(QObject *parent = nullptr); + ~QQuickPlatformSystemTrayIcon(); + + QPlatformSystemTrayIcon *handle() const; + + bool isAvailable() const; + bool supportsMessages() const; + + bool isVisible() const; + void setVisible(bool visible); + + QUrl iconSource() const; + void setIconSource(const QUrl &source); + + QString iconName() const; + void setIconName(const QString &name); + + QString tooltip() const; + void setTooltip(const QString &tooltip); + + QQuickPlatformMenu *menu() const; + void setMenu(QQuickPlatformMenu *menu); + +public Q_SLOTS: + void show(); + void hide(); + + void showMessage(const QString &title, const QString &message, + QPlatformSystemTrayIcon::MessageIcon iconType = QPlatformSystemTrayIcon::Information, int msecs = 10000); + +Q_SIGNALS: + void activated(QPlatformSystemTrayIcon::ActivationReason reason); + void messageClicked(); + void visibleChanged(); + void iconSourceChanged(); + void iconNameChanged(); + void tooltipChanged(); + void menuChanged(); + +protected: + void init(); + void cleanup(); + + void classBegin() override; + void componentComplete() override; + + QQuickPlatformIconLoader *iconLoader() const; + +private Q_SLOTS: + void updateIcon(); + +private: + bool m_complete; + bool m_visible; + QString m_tooltip; + QQuickPlatformMenu *m_menu; + mutable QQuickPlatformIconLoader *m_iconLoader; + QPlatformSystemTrayIcon *m_handle; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformSystemTrayIcon) + +#endif // QQUICKPLATFORMSYSTEMTRAYICON_P_H diff --git a/src/imports/platform/qtlabsplatformplugin.cpp b/src/imports/platform/qtlabsplatformplugin.cpp new file mode 100644 index 00000000..f73b04e8 --- /dev/null +++ b/src/imports/platform/qtlabsplatformplugin.cpp @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Templates module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtQml/qqmlextensionplugin.h> +#include <QtQml/qqml.h> +#include <QtCore/qloggingcategory.h> + +#include "qquickplatformdialog_p.h" +#include "qquickplatformcolordialog_p.h" +#include "qquickplatformfiledialog_p.h" +#include "qquickplatformfolderdialog_p.h" +#include "qquickplatformfontdialog_p.h" +#include "qquickplatformmessagedialog_p.h" + +#include "qquickplatformmenu_p.h" +#include "qquickplatformmenubar_p.h" +#include "qquickplatformmenuitem_p.h" +#include "qquickplatformmenuitemgroup_p.h" +#include "qquickplatformmenuseparator_p.h" + +#include "qquickplatformstandardpaths_p.h" + +#include "qquickplatformsystemtrayicon_p.h" + +Q_DECLARE_METATYPE(QStandardPaths::StandardLocation) +Q_DECLARE_METATYPE(QStandardPaths::LocateOptions) + +static inline void initResources() +{ +#ifdef QT_STATIC + Q_INIT_RESOURCE(qmake_Qt_labs_platform); +#endif +} + +QT_BEGIN_NAMESPACE + +Q_LOGGING_CATEGORY(qtLabsPlatformDialogs, "qt.labs.platform.dialogs") +Q_LOGGING_CATEGORY(qtLabsPlatformMenus, "qt.labs.platform.menus") +Q_LOGGING_CATEGORY(qtLabsPlatformTray, "qt.labs.platform.tray") + +class QtLabsPlatformPlugin: public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) + +public: + QtLabsPlatformPlugin(QObject *parent = nullptr); + void registerTypes(const char *uri) override; +}; + +QtLabsPlatformPlugin::QtLabsPlatformPlugin(QObject *parent) : QQmlExtensionPlugin(parent) +{ + initResources(); +} + +void QtLabsPlatformPlugin::registerTypes(const char *uri) +{ + qmlRegisterUncreatableType<QQuickPlatformDialog>(uri, 1, 0, "Dialog", QQuickPlatformDialog::tr("Dialog is an abstract base class")); + qmlRegisterType<QQuickPlatformColorDialog>(uri, 1, 0, "ColorDialog"); + qmlRegisterType<QQuickPlatformFileDialog>(uri, 1, 0, "FileDialog"); + qmlRegisterType<QQuickPlatformFileNameFilter>(); + qmlRegisterType<QQuickPlatformFolderDialog>(uri, 1, 0, "FolderDialog"); + qmlRegisterType<QQuickPlatformFontDialog>(uri, 1, 0, "FontDialog"); + qmlRegisterType<QQuickPlatformMessageDialog>(uri, 1, 0, "MessageDialog"); + + qmlRegisterType<QQuickPlatformMenu>(uri, 1, 0, "Menu"); + qmlRegisterType<QQuickPlatformMenuBar>(uri, 1, 0, "MenuBar"); + qmlRegisterType<QQuickPlatformMenuItem>(uri, 1, 0, "MenuItem"); + qmlRegisterType<QQuickPlatformMenuItemGroup>(uri, 1, 0, "MenuItemGroup"); + qmlRegisterType<QQuickPlatformMenuSeparator>(uri, 1, 0, "MenuSeparator"); + + qmlRegisterUncreatableType<QPlatformDialogHelper>(uri, 1, 0, "StandardButton", QQuickPlatformDialog::tr("Cannot create an instance of StandardButton")); + qmlRegisterSingletonType<QQuickPlatformStandardPaths>(uri, 1, 0, "StandardPaths", QQuickPlatformStandardPaths::create); + qRegisterMetaType<QStandardPaths::StandardLocation>(); + qRegisterMetaType<QStandardPaths::LocateOptions>(); + + qmlRegisterType<QQuickPlatformSystemTrayIcon>(uri, 1, 0, "SystemTrayIcon"); +} + +QT_END_NAMESPACE + +#include "qtlabsplatformplugin.moc" diff --git a/src/imports/platform/widgets/qwidgetplatform_p.h b/src/imports/platform/widgets/qwidgetplatform_p.h new file mode 100644 index 00000000..06dcc9d3 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatform_p.h @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIDGETPLATFORM_P_H +#define QWIDGETPLATFORM_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qdebug.h> +#include <QtCore/qcoreapplication.h> +#include <QtGui/qpa/qplatformtheme.h> +#include <QtGui/qpa/qplatformdialoghelper.h> +#include <QtGui/qpa/qplatformsystemtrayicon.h> +#include <QtGui/qpa/qplatformmenu.h> + +#ifdef QT_WIDGETS_LIB +#include "qwidgetplatformcolordialog_p.h" +#include "qwidgetplatformfiledialog_p.h" +#include "qwidgetplatformfontdialog_p.h" +#include "qwidgetplatformmessagedialog_p.h" +#include "qwidgetplatformmenu_p.h" +#include "qwidgetplatformmenuitem_p.h" +#include "qwidgetplatformsystemtrayicon_p.h" +#endif + +QT_BEGIN_NAMESPACE + +#ifndef QT_WIDGETS_LIB +typedef QPlatformMenu QWidgetPlatformMenu; +typedef QPlatformMenuItem QWidgetPlatformMenuItem; +typedef QPlatformColorDialogHelper QWidgetPlatformColorDialog; +typedef QPlatformFileDialogHelper QWidgetPlatformFileDialog; +typedef QPlatformFontDialogHelper QWidgetPlatformFontDialog; +typedef QPlatformMessageDialogHelper QWidgetPlatformMessageDialog; +typedef QPlatformSystemTrayIcon QWidgetPlatformSystemTrayIcon; +#endif + +namespace QWidgetPlatform +{ + static inline bool isAvailable(const char *type) + { + if (!qApp->inherits("QApplication")) { + qCritical("\nERROR: No native %s implementation available." + "\nQt Labs Platform requires Qt Widgets on this setup." + "\nAdd 'QT += widgets' to .pro and create QApplication in main().\n", type); + return false; + } + return true; + } + + template<typename T> + static inline T *createWidget(const char *name, QObject *parent) + { + static bool available = isAvailable(name); +#ifdef QT_WIDGETS_LIB + if (available) + return new T(parent); +#else + Q_UNUSED(parent) + Q_UNUSED(available) +#endif + return nullptr; + } + + static inline QPlatformMenu *createMenu(QObject *parent = nullptr) { return createWidget<QWidgetPlatformMenu>("Menu", parent); } + static inline QPlatformMenuItem *createMenuItem(QObject *parent = nullptr) { return createWidget<QWidgetPlatformMenuItem>("MenuItem", parent); } + static inline QPlatformSystemTrayIcon *createSystemTrayIcon(QObject *parent = nullptr) { return createWidget<QWidgetPlatformSystemTrayIcon>("SystemTrayIcon", parent); } + static inline QPlatformDialogHelper *createDialog(QPlatformTheme::DialogType type, QObject *parent = nullptr) + { + switch (type) { + case QPlatformTheme::ColorDialog: return createWidget<QWidgetPlatformColorDialog>("ColorDialog", parent); + case QPlatformTheme::FileDialog: return createWidget<QWidgetPlatformFileDialog>("FileDialog", parent); + case QPlatformTheme::FontDialog: return createWidget<QWidgetPlatformFontDialog>("FontDialog", parent); + case QPlatformTheme::MessageDialog: return createWidget<QWidgetPlatformMessageDialog>("MessageDialog", parent); + default: Q_UNREACHABLE(); break; + return nullptr; + } + } +} + +QT_END_NAMESPACE + +#endif // QWIDGETPLATFORM_P_H diff --git a/src/imports/platform/widgets/qwidgetplatformcolordialog.cpp b/src/imports/platform/widgets/qwidgetplatformcolordialog.cpp new file mode 100644 index 00000000..69a76eb2 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformcolordialog.cpp @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwidgetplatformcolordialog_p.h" +#include "qwidgetplatformdialog_p.h" + +#include <QtWidgets/qcolordialog.h> + +QT_BEGIN_NAMESPACE + +QWidgetPlatformColorDialog::QWidgetPlatformColorDialog(QObject *parent) + : m_dialog(new QColorDialog) +{ + setParent(parent); + + connect(m_dialog.data(), &QColorDialog::accepted, this, &QPlatformDialogHelper::accept); + connect(m_dialog.data(), &QColorDialog::rejected, this, &QPlatformDialogHelper::reject); + connect(m_dialog.data(), &QColorDialog::currentColorChanged, this, &QPlatformColorDialogHelper::currentColorChanged); +} + +QWidgetPlatformColorDialog::~QWidgetPlatformColorDialog() +{ +} + +QColor QWidgetPlatformColorDialog::currentColor() const +{ + return m_dialog->currentColor(); +} + +void QWidgetPlatformColorDialog::setCurrentColor(const QColor &color) +{ + m_dialog->setCurrentColor(color); +} + +void QWidgetPlatformColorDialog::exec() +{ + m_dialog->exec(); +} + +bool QWidgetPlatformColorDialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) +{ + QSharedPointer<QColorDialogOptions> options = QPlatformColorDialogHelper::options(); + m_dialog->setWindowTitle(options->windowTitle()); + m_dialog->setOptions(static_cast<QColorDialog::ColorDialogOptions>(int(options->options())) | QColorDialog::DontUseNativeDialog); + + return QWidgetPlatformDialog::show(m_dialog.data(), flags, modality, parent); +} + +void QWidgetPlatformColorDialog::hide() +{ + m_dialog->hide(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/widgets/qwidgetplatformcolordialog_p.h b/src/imports/platform/widgets/qwidgetplatformcolordialog_p.h new file mode 100644 index 00000000..14bbcd1f --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformcolordialog_p.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIDGETPLATFORMCOLORDIALOG_P_H +#define QWIDGETPLATFORMCOLORDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtGui/qpa/qplatformdialoghelper.h> + +QT_BEGIN_NAMESPACE + +class QColorDialog; + +class QWidgetPlatformColorDialog : public QPlatformColorDialogHelper +{ + Q_OBJECT + +public: + explicit QWidgetPlatformColorDialog(QObject *parent = nullptr); + ~QWidgetPlatformColorDialog(); + + QColor currentColor() const override; + void setCurrentColor(const QColor &color) override; + + void exec() override; + bool show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) override; + void hide() override; + +private: + QScopedPointer<QColorDialog> m_dialog; +}; + +QT_END_NAMESPACE + +#endif // QWIDGETPLATFORMCOLORDIALOG_P_H diff --git a/src/imports/platform/widgets/qwidgetplatformdialog.cpp b/src/imports/platform/widgets/qwidgetplatformdialog.cpp new file mode 100644 index 00000000..ebca7ea8 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformdialog.cpp @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwidgetplatformdialog_p.h" + +#include <QtGui/qwindow.h> +#include <QtWidgets/qdialog.h> + +QT_BEGIN_NAMESPACE + +bool QWidgetPlatformDialog::show(QDialog *dialog, Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) +{ + dialog->setWindowFlags(flags); + dialog->setWindowModality(modality); + + dialog->createWinId(); + QWindow *handle = dialog->windowHandle(); + Q_ASSERT(handle); + handle->setTransientParent(const_cast<QWindow *>(parent)); + + dialog->show(); + return true; +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/widgets/qwidgetplatformdialog_p.h b/src/imports/platform/widgets/qwidgetplatformdialog_p.h new file mode 100644 index 00000000..efc99b85 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformdialog_p.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIDGETPLATFORMDIALOG_P_H +#define QWIDGETPLATFORMDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qnamespace.h> + +QT_BEGIN_NAMESPACE + +class QDialog; +class QWindow; + +class QWidgetPlatformDialog +{ +public: + static bool show(QDialog *dialog, Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent); +}; + +QT_END_NAMESPACE + +#endif // QWIDGETPLATFORMDIALOG_P_H diff --git a/src/imports/platform/widgets/qwidgetplatformfiledialog.cpp b/src/imports/platform/widgets/qwidgetplatformfiledialog.cpp new file mode 100644 index 00000000..772443a5 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformfiledialog.cpp @@ -0,0 +1,140 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwidgetplatformfiledialog_p.h" +#include "qwidgetplatformdialog_p.h" + +#include <QtWidgets/qfiledialog.h> + +QT_BEGIN_NAMESPACE + +QWidgetPlatformFileDialog::QWidgetPlatformFileDialog(QObject *parent) + : m_dialog(new QFileDialog) +{ + setParent(parent); + + connect(m_dialog.data(), &QDialog::accepted, this, &QPlatformDialogHelper::accept); + connect(m_dialog.data(), &QDialog::rejected, this, &QPlatformDialogHelper::reject); + + connect(m_dialog.data(), &QFileDialog::fileSelected, [this](const QString &file) { + emit fileSelected(QUrl::fromLocalFile(file)); + }); + connect(m_dialog.data(), &QFileDialog::filesSelected, [this](const QList<QString> &files) { + QList<QUrl> urls; + urls.reserve(files.count()); + for (const QString &file : files) + urls += QUrl::fromLocalFile(file); + emit filesSelected(urls); + }); + connect(m_dialog.data(), &QFileDialog::currentChanged, [this](const QString &path) { + emit currentChanged(QUrl::fromLocalFile(path)); + }); + connect(m_dialog.data(), &QFileDialog::directoryEntered, this, &QWidgetPlatformFileDialog::directoryEntered); + connect(m_dialog.data(), &QFileDialog::filterSelected, this, &QWidgetPlatformFileDialog::filterSelected); +} + +QWidgetPlatformFileDialog::~QWidgetPlatformFileDialog() +{ +} + +bool QWidgetPlatformFileDialog::defaultNameFilterDisables() const +{ + return false; // TODO: ? +} + +void QWidgetPlatformFileDialog::setDirectory(const QUrl &directory) +{ + m_dialog->setDirectory(directory.toLocalFile()); +} + +QUrl QWidgetPlatformFileDialog::directory() const +{ + return m_dialog->directoryUrl(); +} + +void QWidgetPlatformFileDialog::selectFile(const QUrl &filename) +{ + m_dialog->selectUrl(filename); +} + +QList<QUrl> QWidgetPlatformFileDialog::selectedFiles() const +{ + return m_dialog->selectedUrls(); +} + +void QWidgetPlatformFileDialog::setFilter() +{ + // TODO: ? +} + +void QWidgetPlatformFileDialog::selectNameFilter(const QString &filter) +{ + m_dialog->selectNameFilter(filter); +} + +QString QWidgetPlatformFileDialog::selectedNameFilter() const +{ + return m_dialog->selectedNameFilter(); +} + +void QWidgetPlatformFileDialog::exec() +{ + m_dialog->exec(); +} + +bool QWidgetPlatformFileDialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) +{ + QSharedPointer<QFileDialogOptions> options = QPlatformFileDialogHelper::options(); + m_dialog->setWindowTitle(options->windowTitle()); + m_dialog->setAcceptMode(static_cast<QFileDialog::AcceptMode>(options->acceptMode())); + m_dialog->setFileMode(static_cast<QFileDialog::FileMode>(options->fileMode())); + m_dialog->setOptions(static_cast<QFileDialog::Options>(int(options->options())) | QFileDialog::DontUseNativeDialog); + m_dialog->setNameFilters(options->nameFilters()); + m_dialog->setDefaultSuffix(options->defaultSuffix()); + if (options->isLabelExplicitlySet(QFileDialogOptions::Accept)) + m_dialog->setLabelText(QFileDialog::Accept, options->labelText(QFileDialogOptions::Accept)); + if (options->isLabelExplicitlySet(QFileDialogOptions::Reject)) + m_dialog->setLabelText(QFileDialog::Reject, options->labelText(QFileDialogOptions::Reject)); + + return QWidgetPlatformDialog::show(m_dialog.data(), flags, modality, parent); +} + +void QWidgetPlatformFileDialog::hide() +{ + m_dialog->hide(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/widgets/qwidgetplatformfiledialog_p.h b/src/imports/platform/widgets/qwidgetplatformfiledialog_p.h new file mode 100644 index 00000000..743bc571 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformfiledialog_p.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIDGETPLATFORMFILEDIALOG_P_H +#define QWIDGETPLATFORMFILEDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtGui/qpa/qplatformdialoghelper.h> + +QT_BEGIN_NAMESPACE + +class QFileDialog; + +class QWidgetPlatformFileDialog : public QPlatformFileDialogHelper +{ + Q_OBJECT + +public: + explicit QWidgetPlatformFileDialog(QObject *parent = nullptr); + ~QWidgetPlatformFileDialog(); + + bool defaultNameFilterDisables() const override; + void setDirectory(const QUrl &directory) override; + QUrl directory() const override; + void selectFile(const QUrl &filename) override; + QList<QUrl> selectedFiles() const override; + void setFilter() override; + void selectNameFilter(const QString &filter) override; + QString selectedNameFilter() const override; + + void exec() override; + bool show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) override; + void hide() override; + +private: + QScopedPointer<QFileDialog> m_dialog; +}; + +QT_END_NAMESPACE + +#endif // QWIDGETPLATFORMFILEDIALOG_P_H diff --git a/src/imports/platform/widgets/qwidgetplatformfontdialog.cpp b/src/imports/platform/widgets/qwidgetplatformfontdialog.cpp new file mode 100644 index 00000000..d2b6c539 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformfontdialog.cpp @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwidgetplatformfontdialog_p.h" +#include "qwidgetplatformdialog_p.h" + +#include <QtWidgets/qfontdialog.h> + +QT_BEGIN_NAMESPACE + +QWidgetPlatformFontDialog::QWidgetPlatformFontDialog(QObject *parent) + : m_dialog(new QFontDialog) +{ + setParent(parent); + + connect(m_dialog.data(), &QFontDialog::accepted, this, &QPlatformDialogHelper::accept); + connect(m_dialog.data(), &QFontDialog::rejected, this, &QPlatformDialogHelper::reject); + connect(m_dialog.data(), &QFontDialog::currentFontChanged, this, &QPlatformFontDialogHelper::currentFontChanged); +} + +QWidgetPlatformFontDialog::~QWidgetPlatformFontDialog() +{ +} + +QFont QWidgetPlatformFontDialog::currentFont() const +{ + return m_dialog->currentFont(); +} + +void QWidgetPlatformFontDialog::setCurrentFont(const QFont &font) +{ + m_dialog->setCurrentFont(font); +} + +void QWidgetPlatformFontDialog::exec() +{ + m_dialog->exec(); +} + +bool QWidgetPlatformFontDialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) +{ + QSharedPointer<QFontDialogOptions> options = QPlatformFontDialogHelper::options(); + m_dialog->setWindowTitle(options->windowTitle()); + m_dialog->setOptions(static_cast<QFontDialog::FontDialogOptions>(int(options->options())) | QFontDialog::DontUseNativeDialog); + + return QWidgetPlatformDialog::show(m_dialog.data(), flags, modality, parent); +} + +void QWidgetPlatformFontDialog::hide() +{ + m_dialog->hide(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/widgets/qwidgetplatformfontdialog_p.h b/src/imports/platform/widgets/qwidgetplatformfontdialog_p.h new file mode 100644 index 00000000..97d5463d --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformfontdialog_p.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIDGETPLATFORMFONTDIALOG_P_H +#define QWIDGETPLATFORMFONTDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtGui/qpa/qplatformdialoghelper.h> + +QT_BEGIN_NAMESPACE + +class QFontDialog; + +class QWidgetPlatformFontDialog : public QPlatformFontDialogHelper +{ + Q_OBJECT + +public: + explicit QWidgetPlatformFontDialog(QObject *parent = nullptr); + ~QWidgetPlatformFontDialog(); + + QFont currentFont() const override; + void setCurrentFont(const QFont &font) override; + + void exec() override; + bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent) override; + void hide() override; + +private: + QScopedPointer<QFontDialog> m_dialog; +}; + +QT_END_NAMESPACE + +#endif // QWIDGETPLATFORMFONTDIALOG_P_H diff --git a/src/imports/platform/widgets/qwidgetplatformmenu.cpp b/src/imports/platform/widgets/qwidgetplatformmenu.cpp new file mode 100644 index 00000000..d9ecb16f --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformmenu.cpp @@ -0,0 +1,186 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwidgetplatformmenu_p.h" +#include "qwidgetplatformmenuitem_p.h" + +#include <QtGui/qwindow.h> +#include <QtWidgets/qmenu.h> +#include <QtWidgets/qaction.h> + +QT_BEGIN_NAMESPACE + +QWidgetPlatformMenu::QWidgetPlatformMenu(QObject *parent) + : m_menu(new QMenu) +{ + setParent(parent); + + connect(m_menu.data(), &QMenu::aboutToShow, this, &QPlatformMenu::aboutToShow); + connect(m_menu.data(), &QMenu::aboutToHide, this, &QPlatformMenu::aboutToHide); +} + +QWidgetPlatformMenu::~QWidgetPlatformMenu() +{ +} + +QMenu *QWidgetPlatformMenu::menu() const +{ + return m_menu.data(); +} + +void QWidgetPlatformMenu::insertMenuItem(QPlatformMenuItem *item, QPlatformMenuItem *before) +{ + QWidgetPlatformMenuItem *widgetItem = qobject_cast<QWidgetPlatformMenuItem *>(item); + if (!widgetItem) + return; + + QWidgetPlatformMenuItem *widgetBefore = qobject_cast<QWidgetPlatformMenuItem *>(before); + m_menu->insertAction(widgetBefore ? widgetBefore->action() : nullptr, widgetItem->action()); +} + +void QWidgetPlatformMenu::removeMenuItem(QPlatformMenuItem *item) +{ + QWidgetPlatformMenuItem *widgetItem = qobject_cast<QWidgetPlatformMenuItem *>(item); + if (!widgetItem) + return; + + m_menu->removeAction(widgetItem->action()); +} + +void QWidgetPlatformMenu::syncMenuItem(QPlatformMenuItem *item) +{ + Q_UNUSED(item); +} + +void QWidgetPlatformMenu::syncSeparatorsCollapsible(bool enable) +{ + Q_UNUSED(enable); +} + +quintptr QWidgetPlatformMenu::tag() const +{ + return 0; +} + +void QWidgetPlatformMenu::setTag(quintptr tag) +{ + Q_UNUSED(tag); +} + +void QWidgetPlatformMenu::setText(const QString &text) +{ + m_menu->setTitle(text); +} + +void QWidgetPlatformMenu::setIcon(const QIcon &icon) +{ + m_menu->setIcon(icon); +} + +void QWidgetPlatformMenu::setEnabled(bool enabled) +{ + m_menu->menuAction()->setEnabled(enabled); +} + +bool QWidgetPlatformMenu::isEnabled() const +{ + return m_menu->menuAction()->isEnabled(); +} + +void QWidgetPlatformMenu::setVisible(bool visible) +{ + m_menu->menuAction()->setVisible(visible); +} + +void QWidgetPlatformMenu::setMinimumWidth(int width) +{ + if (width > 0) + m_menu->setMinimumWidth(width); +} + +void QWidgetPlatformMenu::setFont(const QFont &font) +{ + m_menu->setFont(font); +} + +void QWidgetPlatformMenu::setMenuType(MenuType type) +{ + Q_UNUSED(type); +} + +void QWidgetPlatformMenu::showPopup(const QWindow *window, const QRect &targetRect, const QPlatformMenuItem *item) +{ + m_menu->createWinId(); + QWindow *handle = m_menu->windowHandle(); + Q_ASSERT(handle); + handle->setTransientParent(const_cast<QWindow *>(window)); + + QPoint targetPos = targetRect.bottomLeft(); + if (window) + targetPos = window->mapToGlobal(targetPos); + + const QWidgetPlatformMenuItem *widgetItem = qobject_cast<const QWidgetPlatformMenuItem *>(item); + m_menu->popup(targetPos, widgetItem ? widgetItem->action() : nullptr); +} + +void QWidgetPlatformMenu::dismiss() +{ + m_menu->close(); +} + +QPlatformMenuItem *QWidgetPlatformMenu::menuItemAt(int position) const +{ + Q_UNUSED(position); + return nullptr; +} + +QPlatformMenuItem *QWidgetPlatformMenu::menuItemForTag(quintptr tag) const +{ + Q_UNUSED(tag); + return nullptr; +} + +QPlatformMenuItem *QWidgetPlatformMenu::createMenuItem() const +{ + return nullptr; +} + +QPlatformMenu *QWidgetPlatformMenu::createSubMenu() const +{ + return nullptr; +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/widgets/qwidgetplatformmenu_p.h b/src/imports/platform/widgets/qwidgetplatformmenu_p.h new file mode 100644 index 00000000..56ea7a45 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformmenu_p.h @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIDGETPLATFORMMENU_P_H +#define QWIDGETPLATFORMMENU_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtGui/qpa/qplatformmenu.h> + +QT_BEGIN_NAMESPACE + +class QMenu; + +class QWidgetPlatformMenu : public QPlatformMenu +{ + Q_OBJECT + +public: + explicit QWidgetPlatformMenu(QObject *parent = nullptr); + ~QWidgetPlatformMenu(); + + QMenu *menu() const; + + void insertMenuItem(QPlatformMenuItem *item, QPlatformMenuItem *before) override; + void removeMenuItem(QPlatformMenuItem *item) override; + void syncMenuItem(QPlatformMenuItem *item) override; + void syncSeparatorsCollapsible(bool enable) override; + + quintptr tag()const override; + void setTag(quintptr tag) override; + + void setText(const QString &text) override; + void setIcon(const QIcon &icon) override; + void setEnabled(bool enabled) override; + bool isEnabled() const override; + void setVisible(bool visible) override; + void setMinimumWidth(int width) override; + void setFont(const QFont &font) override; + void setMenuType(MenuType type) override; + + void showPopup(const QWindow *window, const QRect &targetRect, const QPlatformMenuItem *item) override; + void dismiss() override; + + QPlatformMenuItem *menuItemAt(int position) const override; + QPlatformMenuItem *menuItemForTag(quintptr tag) const override; + + QPlatformMenuItem *createMenuItem() const override; + QPlatformMenu *createSubMenu() const override; + +private: + QScopedPointer<QMenu> m_menu; +}; + +QT_END_NAMESPACE + +#endif // QWIDGETPLATFORMMENU_P_H diff --git a/src/imports/platform/widgets/qwidgetplatformmenuitem.cpp b/src/imports/platform/widgets/qwidgetplatformmenuitem.cpp new file mode 100644 index 00000000..4d168f7a --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformmenuitem.cpp @@ -0,0 +1,131 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwidgetplatformmenuitem_p.h" + +#include <QtWidgets/qmenu.h> +#include <QtWidgets/qaction.h> + +QT_BEGIN_NAMESPACE + +QWidgetPlatformMenuItem::QWidgetPlatformMenuItem(QObject *parent) + : m_action(new QAction) +{ + setParent(parent); + connect(m_action.data(), &QAction::hovered, this, &QPlatformMenuItem::hovered); + connect(m_action.data(), &QAction::triggered, this, &QPlatformMenuItem::activated); +} + +QWidgetPlatformMenuItem::~QWidgetPlatformMenuItem() +{ +} + +QAction *QWidgetPlatformMenuItem::action() const +{ + return m_action.data(); +} + +quintptr QWidgetPlatformMenuItem::tag() const +{ + return 0; +} + +void QWidgetPlatformMenuItem::setTag(quintptr tag) +{ + Q_UNUSED(tag); +} + +void QWidgetPlatformMenuItem::setText(const QString &text) +{ + m_action->setText(text); +} + +void QWidgetPlatformMenuItem::setIcon(const QIcon &icon) +{ + m_action->setIcon(icon); +} + +void QWidgetPlatformMenuItem::setMenu(QPlatformMenu *menu) +{ + m_action->setMenu(qobject_cast<QMenu *>(menu)); +} + +void QWidgetPlatformMenuItem::setVisible(bool visible) +{ + m_action->setVisible(visible); +} + +void QWidgetPlatformMenuItem::setIsSeparator(bool separator) +{ + m_action->setSeparator(separator); +} + +void QWidgetPlatformMenuItem::setFont(const QFont &font) +{ + m_action->setFont(font); +} + +void QWidgetPlatformMenuItem::setRole(MenuRole role) +{ + m_action->setMenuRole(static_cast<QAction::MenuRole>(role)); +} + +void QWidgetPlatformMenuItem::setCheckable(bool checkable) +{ + m_action->setCheckable(checkable); +} + +void QWidgetPlatformMenuItem::setChecked(bool checked) +{ + m_action->setChecked(checked); +} + +void QWidgetPlatformMenuItem::setShortcut(const QKeySequence &shortcut) +{ + m_action->setShortcut(shortcut); +} + +void QWidgetPlatformMenuItem::setEnabled(bool enabled) +{ + m_action->setEnabled(enabled); +} + +void QWidgetPlatformMenuItem::setIconSize(int size) +{ + Q_UNUSED(size); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/widgets/qwidgetplatformmenuitem_p.h b/src/imports/platform/widgets/qwidgetplatformmenuitem_p.h new file mode 100644 index 00000000..d1a08187 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformmenuitem_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIDGETPLATFORMMENUITEM_P_H +#define QWIDGETPLATFORMMENUITEM_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtGui/qpa/qplatformmenu.h> + +QT_BEGIN_NAMESPACE + +class QAction; + +class QWidgetPlatformMenuItem : public QPlatformMenuItem +{ + Q_OBJECT + +public: + explicit QWidgetPlatformMenuItem(QObject *parent = nullptr); + ~QWidgetPlatformMenuItem(); + + QAction *action() const; + + quintptr tag()const override; + void setTag(quintptr tag) override; + + void setText(const QString &text) override; + void setIcon(const QIcon &icon) override; + void setMenu(QPlatformMenu *menu) override; + void setVisible(bool visible) override; + void setIsSeparator(bool separator) override; + void setFont(const QFont &font) override; + void setRole(MenuRole role) override; + void setCheckable(bool checkable) override; + void setChecked(bool checked) override; + void setShortcut(const QKeySequence& shortcut) override; + void setEnabled(bool enabled) override; + void setIconSize(int size) override; + +private: + QScopedPointer<QAction> m_action; +}; + +QT_END_NAMESPACE + +#endif // QWIDGETPLATFORMMENUITEM_P_H diff --git a/src/imports/platform/widgets/qwidgetplatformmessagedialog.cpp b/src/imports/platform/widgets/qwidgetplatformmessagedialog.cpp new file mode 100644 index 00000000..b546e534 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformmessagedialog.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwidgetplatformmessagedialog_p.h" +#include "qwidgetplatformdialog_p.h" + +#include <QtWidgets/qmessagebox.h> +#include <QtWidgets/qabstractbutton.h> + +QT_BEGIN_NAMESPACE + +QWidgetPlatformMessageDialog::QWidgetPlatformMessageDialog(QObject *parent) + : m_dialog(new QMessageBox) +{ + setParent(parent); + + connect(m_dialog.data(), &QMessageBox::accepted, this, &QPlatformDialogHelper::accept); + connect(m_dialog.data(), &QMessageBox::rejected, this, &QPlatformDialogHelper::reject); + connect(m_dialog.data(), &QMessageBox::buttonClicked, [this](QAbstractButton *button) { + QMessageBox::ButtonRole role = m_dialog->buttonRole(button); + QMessageBox::StandardButton standardButton = m_dialog->standardButton(button); + emit clicked(static_cast<StandardButton>(standardButton), static_cast<ButtonRole>(role)); + }); +} + +QWidgetPlatformMessageDialog::~QWidgetPlatformMessageDialog() +{ +} +void QWidgetPlatformMessageDialog::exec() +{ + m_dialog->exec(); +} + +bool QWidgetPlatformMessageDialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) +{ + QSharedPointer<QMessageDialogOptions> options = QPlatformMessageDialogHelper::options(); + m_dialog->setWindowTitle(options->windowTitle()); + m_dialog->setIcon(static_cast<QMessageBox::Icon>(options->icon())); + m_dialog->setText(options->text()); + m_dialog->setInformativeText(options->informativeText()); + m_dialog->setDetailedText(options->detailedText()); + m_dialog->setStandardButtons(static_cast<QMessageBox::StandardButtons>(int(options->standardButtons()))); + + return QWidgetPlatformDialog::show(m_dialog.data(), flags, modality, parent); +} + +void QWidgetPlatformMessageDialog::hide() +{ + m_dialog->hide(); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/widgets/qwidgetplatformmessagedialog_p.h b/src/imports/platform/widgets/qwidgetplatformmessagedialog_p.h new file mode 100644 index 00000000..319bb34d --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformmessagedialog_p.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIDGETPLATFORMMESSAGEDIALOG_P_H +#define QWIDGETPLATFORMMESSAGEDIALOG_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtGui/qpa/qplatformdialoghelper.h> + +QT_BEGIN_NAMESPACE + +class QMessageBox; + +class QWidgetPlatformMessageDialog : public QPlatformMessageDialogHelper +{ + Q_OBJECT + +public: + explicit QWidgetPlatformMessageDialog(QObject *parent = nullptr); + ~QWidgetPlatformMessageDialog(); + + void exec() override; + bool show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) override; + void hide() override; + +private: + QScopedPointer<QMessageBox> m_dialog; +}; + +QT_END_NAMESPACE + +#endif // QWIDGETPLATFORMMESSAGEDIALOG_P_H diff --git a/src/imports/platform/widgets/qwidgetplatformsystemtrayicon.cpp b/src/imports/platform/widgets/qwidgetplatformsystemtrayicon.cpp new file mode 100644 index 00000000..cfee02aa --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformsystemtrayicon.cpp @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwidgetplatformsystemtrayicon_p.h" +#include "qwidgetplatformmenu_p.h" + +#include <QtWidgets/qsystemtrayicon.h> + +QT_BEGIN_NAMESPACE + +QWidgetPlatformSystemTrayIcon::QWidgetPlatformSystemTrayIcon(QObject *parent) + : m_systray(new QSystemTrayIcon) +{ + setParent(parent); + + connect(m_systray.data(), &QSystemTrayIcon::messageClicked, this, &QPlatformSystemTrayIcon::messageClicked); + connect(m_systray.data(), &QSystemTrayIcon::activated, [this](QSystemTrayIcon::ActivationReason reason) { + emit activated(static_cast<ActivationReason>(reason)); + }); +} + +QWidgetPlatformSystemTrayIcon::~QWidgetPlatformSystemTrayIcon() +{ +} + +void QWidgetPlatformSystemTrayIcon::init() +{ + m_systray->show(); +} + +void QWidgetPlatformSystemTrayIcon::cleanup() +{ + m_systray->hide(); +} + +void QWidgetPlatformSystemTrayIcon::updateIcon(const QIcon &icon) +{ + m_systray->setIcon(icon); +} + +void QWidgetPlatformSystemTrayIcon::updateToolTip(const QString &tooltip) +{ + m_systray->setToolTip(tooltip); +} + +void QWidgetPlatformSystemTrayIcon::updateMenu(QPlatformMenu *menu) +{ + QWidgetPlatformMenu *widgetMenu = qobject_cast<QWidgetPlatformMenu *>(menu); + if (!widgetMenu) + return; + + m_systray->setContextMenu(widgetMenu->menu()); +} + +QRect QWidgetPlatformSystemTrayIcon::geometry() const +{ + return m_systray->geometry(); +} + +void QWidgetPlatformSystemTrayIcon::showMessage(const QString &title, const QString &msg, const QIcon &icon, MessageIcon iconType, int msecs) +{ + Q_UNUSED(icon); + m_systray->showMessage(title, msg, static_cast<QSystemTrayIcon::MessageIcon>(iconType), msecs); +} + +bool QWidgetPlatformSystemTrayIcon::isSystemTrayAvailable() const +{ + return QSystemTrayIcon::isSystemTrayAvailable(); +} + +bool QWidgetPlatformSystemTrayIcon::supportsMessages() const +{ + return QSystemTrayIcon::supportsMessages(); +} + +QPlatformMenu *QWidgetPlatformSystemTrayIcon::createMenu() const +{ + return new QWidgetPlatformMenu; +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/widgets/qwidgetplatformsystemtrayicon_p.h b/src/imports/platform/widgets/qwidgetplatformsystemtrayicon_p.h new file mode 100644 index 00000000..f48430a4 --- /dev/null +++ b/src/imports/platform/widgets/qwidgetplatformsystemtrayicon_p.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWIDGETPLATFORMSYSTEMTRAYICON_P_H +#define QWIDGETPLATFORMSYSTEMTRAYICON_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtGui/qpa/qplatformsystemtrayicon.h> + +QT_BEGIN_NAMESPACE + +class QSystemTrayIcon; + +class QWidgetPlatformSystemTrayIcon : public QPlatformSystemTrayIcon +{ + Q_OBJECT + +public: + explicit QWidgetPlatformSystemTrayIcon(QObject *parent = nullptr); + ~QWidgetPlatformSystemTrayIcon(); + + void init() override; + void cleanup() override; + void updateIcon(const QIcon &icon) override; + void updateToolTip(const QString &tooltip) override; + void updateMenu(QPlatformMenu *menu) override; + QRect geometry() const override; + void showMessage(const QString &title, const QString &msg, + const QIcon &icon, MessageIcon iconType, int msecs) override; + + bool isSystemTrayAvailable() const override; + bool supportsMessages() const override; + + QPlatformMenu *createMenu() const override; + +private: + QScopedPointer<QSystemTrayIcon> m_systray; +}; + +QT_END_NAMESPACE + +#endif // QWIDGETPLATFORMSYSTEMTRAYICON_P_H diff --git a/src/imports/platform/widgets/widgets.pri b/src/imports/platform/widgets/widgets.pri new file mode 100644 index 00000000..c904e924 --- /dev/null +++ b/src/imports/platform/widgets/widgets.pri @@ -0,0 +1,23 @@ +QT += widgets +DEPENDPATH += $$PWD + +HEADERS += \ + $$PWD/qwidgetplatform_p.h \ + $$PWD/qwidgetplatformcolordialog_p.h \ + $$PWD/qwidgetplatformdialog_p.h \ + $$PWD/qwidgetplatformfiledialog_p.h \ + $$PWD/qwidgetplatformfontdialog_p.h \ + $$PWD/qwidgetplatformmenu_p.h \ + $$PWD/qwidgetplatformmenuitem_p.h \ + $$PWD/qwidgetplatformmessagedialog_p.h \ + $$PWD/qwidgetplatformsystemtrayicon_p.h + +SOURCES += \ + $$PWD/qwidgetplatformcolordialog.cpp \ + $$PWD/qwidgetplatformdialog.cpp \ + $$PWD/qwidgetplatformfiledialog.cpp \ + $$PWD/qwidgetplatformfontdialog.cpp \ + $$PWD/qwidgetplatformmenu.cpp \ + $$PWD/qwidgetplatformmenuitem.cpp \ + $$PWD/qwidgetplatformmessagedialog.cpp \ + $$PWD/qwidgetplatformsystemtrayicon.cpp |