From ba1e8db34ac8e9a992abc062a5fb534ea90dda92 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 8 Mar 2016 13:51:13 +1300 Subject: [PATCH 01/13] Add QML UI test dialogs for creating and deleting bookmarks --- tests/ui/qml/main.qml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/ui/qml/main.qml b/tests/ui/qml/main.qml index 97f6224670..a3b6114c11 100644 --- a/tests/ui/qml/main.qml +++ b/tests/ui/qml/main.qml @@ -137,6 +137,25 @@ ApplicationWindow { }); } } + Button { + text: "Bookmark Location" + onClicked: { + desktop.inputDialog({ + title: "Bookmark Location", + label: "Name" + }); + } + } + Button { + text: "Delete Bookmark" + onClicked: { + desktop.inputDialog({ + title: "Delete Bookmark", + label: "Select the bookmark to delete", + items: ["Bookmark A", "Bookmark B", "Bookmark C"] + }); + } + } /* // There is no such desktop.queryBox() function; may need to update test to cover QueryDialog.qml? Button { From d893b2e3b1affc6fd178a2d2fde459f820656692 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 8 Mar 2016 13:52:24 +1300 Subject: [PATCH 02/13] Handle no icon in modal dialogs --- interface/resources/qml/windows-uit/ModalFrame.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/windows-uit/ModalFrame.qml b/interface/resources/qml/windows-uit/ModalFrame.qml index d6c05c8f91..57298ccb1a 100644 --- a/interface/resources/qml/windows-uit/ModalFrame.qml +++ b/interface/resources/qml/windows-uit/ModalFrame.qml @@ -47,12 +47,12 @@ Frame { } Item { - width: title.width + (window.iconText !== "" ? icon.width + hifi.dimensions.contentSpacing.x : 0) + width: title.width + (icon.text !== "" ? icon.width + hifi.dimensions.contentSpacing.x : 0) x: (parent.width - width) / 2 FontAwesome { id: icon - text: window.iconText + text: window.iconText ? window.iconText : "" size: 30 color: hifi.colors.lightGrayText visible: text != "" From b7fd5467ba1c141ba3404a14ef09df9ae9e45866 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 8 Mar 2016 13:53:05 +1300 Subject: [PATCH 03/13] Restyle query dialogs --- .../resources/qml/dialogs/QueryDialog.qml | 82 ++++++++++++------- 1 file changed, 53 insertions(+), 29 deletions(-) diff --git a/interface/resources/qml/dialogs/QueryDialog.qml b/interface/resources/qml/dialogs/QueryDialog.qml index 948bbb1295..f13c738bb0 100644 --- a/interface/resources/qml/dialogs/QueryDialog.qml +++ b/interface/resources/qml/dialogs/QueryDialog.qml @@ -1,10 +1,20 @@ +// +// QueryDialog.qml +// +// Created by Bradley Austin Davis on 22 Jan 2016 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + import QtQuick 2.5 -import QtQuick.Controls 1.2 +import QtQuick.Controls 1.4 import QtQuick.Dialogs 1.2 as OriginalDialogs -import "../controls" as VrControls -import "../styles" -import "../windows" +import "../controls-uit" +import "../styles-uit" +import "../windows-uit" ModalWindow { id: root @@ -17,7 +27,7 @@ ModalWindow { signal canceled(); property var items; - property alias label: mainTextContainer.text + property string label property var result; // FIXME not current honored property var current; @@ -28,64 +38,76 @@ ModalWindow { // For combo boxes property bool editable: true; - Rectangle { + Item { clip: true - anchors.fill: parent - radius: 4 - color: "white" + width: pane.width + height: pane.height + anchors.margins: 0 QtObject { id: d - readonly property real spacing: hifi.layout.spacing - readonly property real outerSpacing: hifi.layout.spacing * 2 readonly property int minWidth: 480 readonly property int maxWdith: 1280 readonly property int minHeight: 120 readonly property int maxHeight: 720 function resize() { - var targetWidth = mainTextContainer.width + d.spacing * 6 - var targetHeight = mainTextContainer.implicitHeight + textResult.height + d.spacing + buttons.height + var targetWidth = pane.width + var targetHeight = (items ? comboBox.controlHeight : textResult.controlHeight) + 5 * hifi.dimensions.contentSpacing.y + buttons.height root.width = (targetWidth < d.minWidth) ? d.minWidth : ((targetWidth > d.maxWdith) ? d.maxWidth : targetWidth) root.height = (targetHeight < d.minHeight) ? d.minHeight: ((targetHeight > d.maxHeight) ? d.maxHeight : targetHeight) } } - Text { - id: mainTextContainer - onHeightChanged: d.resize(); onWidthChanged: d.resize(); - wrapMode: Text.WordWrap - font { pointSize: 14; weight: Font.Bold } - anchors { left: parent.left; top: parent.top; margins: d.spacing } - } - Item { - anchors { top: mainTextContainer.bottom; bottom: buttons.top; left: parent.left; right: parent.right; margins: d.spacing } + anchors { + top: parent.top + bottom: buttons.top; + left: parent.left; + right: parent.right; + margins: 0 + bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + // FIXME make a text field type that can be bound to a history for autocompletion - VrControls.TextField { + TextField { id: textResult + label: root.label focus: items ? false : true visible: items ? false : true - anchors { left: parent.left; right: parent.right; verticalCenter: parent.verticalCenter } + anchors { + left: parent.left; + right: parent.right; + bottom: parent.bottom + } } - VrControls.ComboBox { + ComboBox { id: comboBox + label: root.label focus: true visible: items ? true : false - anchors { left: parent.left; right: parent.right; verticalCenter: parent.verticalCenter } + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } model: items ? items : [] } - } Flow { id: buttons focus: true - spacing: d.spacing + spacing: hifi.dimensions.contentSpacing.x onHeightChanged: d.resize(); onWidthChanged: d.resize(); layoutDirection: Qt.RightToLeft - anchors { bottom: parent.bottom; right: parent.right; margins: d.spacing; } + anchors { + bottom: parent.bottom + right: parent.right + margins: 0 + bottomMargin: hifi.dimensions.contentSpacing.y + } Button { action: acceptAction } Button { action: cancelAction } } @@ -130,4 +152,6 @@ ModalWindow { break; } } + + Component.onCompleted: d.resize() } From 7f2938c53fb8fdc7cbcef7396814bd282024f518 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 8 Mar 2016 13:56:25 +1300 Subject: [PATCH 04/13] Tidy message dialog code --- .../resources/qml/dialogs/MessageDialog.qml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/interface/resources/qml/dialogs/MessageDialog.qml b/interface/resources/qml/dialogs/MessageDialog.qml index 26ed406b02..e3c0f96968 100644 --- a/interface/resources/qml/dialogs/MessageDialog.qml +++ b/interface/resources/qml/dialogs/MessageDialog.qml @@ -1,8 +1,8 @@ // -// Desktop.qml +// MessageDialog.qml // -// Created by Bradley Austin Davis on 25 Apr 2015 -// Copyright 2015 High Fidelity, Inc. +// Created by Bradley Austin Davis on 15 Jan 2016 +// Copyright 2016 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -80,8 +80,6 @@ ModalWindow { QtObject { id: d - readonly property real spacing: hifi.dimensions.contentSpacing.x - readonly property real outerSpacing: hifi.dimensions.contentSpacing.y readonly property int minWidth: 480 readonly property int maxWdith: 1280 readonly property int minHeight: 120 @@ -132,7 +130,7 @@ ModalWindow { Flow { id: buttons focus: true - spacing: d.spacing + spacing: hifi.dimensions.contentSpacing.x onHeightChanged: d.resize(); onWidthChanged: d.resize(); layoutDirection: Qt.RightToLeft anchors { @@ -186,8 +184,8 @@ ModalWindow { id: flickable contentHeight: detailedText.height anchors.fill: parent - anchors.topMargin: root.spacing - anchors.bottomMargin: root.outerSpacing + anchors.topMargin: hifi.dimensions.contentSpacing.x + anchors.bottomMargin: hifi.dimensions.contentSpacing.y TextEdit { id: detailedText size: hifi.fontSizes.menuItem @@ -210,7 +208,7 @@ ModalWindow { } ] - Component.onCompleted: updateIcon(); + Component.onCompleted: updateIcon() onStateChanged: d.resize() } From b71a512a6ff0c333e37ebff175dd65ebd1036005 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 8 Mar 2016 13:58:20 +1300 Subject: [PATCH 05/13] Reorder OK and Cancel buttons --- interface/resources/qml/dialogs/QueryDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/dialogs/QueryDialog.qml b/interface/resources/qml/dialogs/QueryDialog.qml index f13c738bb0..008e3f4bcd 100644 --- a/interface/resources/qml/dialogs/QueryDialog.qml +++ b/interface/resources/qml/dialogs/QueryDialog.qml @@ -108,8 +108,8 @@ ModalWindow { margins: 0 bottomMargin: hifi.dimensions.contentSpacing.y } - Button { action: acceptAction } Button { action: cancelAction } + Button { action: acceptAction } } Action { From 09390ffffd4289beeb8f034b33a6cf0e6841843a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 8 Mar 2016 14:00:49 +1300 Subject: [PATCH 06/13] Remove colon from dialog label --- interface/src/Bookmarks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 0a885493e3..c37e7cde87 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -107,7 +107,7 @@ void Bookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { void Bookmarks::bookmarkLocation() { bool ok = false; - auto bookmarkName = OffscreenUi::getText(nullptr, "Bookmark Location", "Name:", QLineEdit::Normal, QString(), &ok); + auto bookmarkName = OffscreenUi::getText(nullptr, "Bookmark Location", "Name", QLineEdit::Normal, QString(), &ok); if (!ok) { return; } From 2f91b29c062eb00f66547bdeb74b110efe10d66e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 8 Mar 2016 14:03:54 +1300 Subject: [PATCH 07/13] Set default focus --- interface/resources/qml/dialogs/QueryDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/dialogs/QueryDialog.qml b/interface/resources/qml/dialogs/QueryDialog.qml index 008e3f4bcd..9420801500 100644 --- a/interface/resources/qml/dialogs/QueryDialog.qml +++ b/interface/resources/qml/dialogs/QueryDialog.qml @@ -153,5 +153,5 @@ ModalWindow { } } - Component.onCompleted: d.resize() + Component.onCompleted: { d.resize(); textResult.forceActiveFocus(); } } From e5188108a16ebc326097cf70a4b0ec6345abf7f0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 8 Mar 2016 15:21:15 +1300 Subject: [PATCH 08/13] Fix width of delete bookmark drop-down --- interface/resources/qml/controls-uit/ComboBox.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/resources/qml/controls-uit/ComboBox.qml b/interface/resources/qml/controls-uit/ComboBox.qml index 392d5534c8..888e8ccbc1 100644 --- a/interface/resources/qml/controls-uit/ComboBox.qml +++ b/interface/resources/qml/controls-uit/ComboBox.qml @@ -160,6 +160,7 @@ FocusScope { ScrollView { id: scrollView height: 480 + width: root.width + 4 ListView { id: listView From 2aaf9ff0d050fd80083a0964750892a61ba9edf5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 8 Mar 2016 17:13:05 +1300 Subject: [PATCH 09/13] Update message dialogs to use HiFi-Glyphs icons --- interface/resources/qml/dialogs/MessageDialog.qml | 12 ++++++------ interface/resources/qml/styles-uit/HifiConstants.qml | 5 +++++ interface/resources/qml/windows-uit/ModalFrame.qml | 8 ++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/interface/resources/qml/dialogs/MessageDialog.qml b/interface/resources/qml/dialogs/MessageDialog.qml index e3c0f96968..2d83c512e4 100644 --- a/interface/resources/qml/dialogs/MessageDialog.qml +++ b/interface/resources/qml/dialogs/MessageDialog.qml @@ -42,10 +42,10 @@ ModalWindow { property alias detailedText: detailedText.text property alias text: mainTextContainer.text property alias informativeText: informativeTextContainer.text - onIconChanged: updateIcon(); property int buttons: OriginalDialogs.StandardButton.Ok property int icon: OriginalDialogs.StandardIcon.NoIcon property string iconText: "" + onIconChanged: updateIcon(); property int defaultButton: OriginalDialogs.StandardButton.NoButton; property int clickedButton: OriginalDialogs.StandardButton.NoButton; focus: defaultButton === OriginalDialogs.StandardButton.NoButton @@ -56,19 +56,19 @@ ModalWindow { } switch (root.icon) { case OriginalDialogs.StandardIcon.Information: - iconText = "\uF05A"; + iconText = hifi.glyphs.informatonIcon; break; case OriginalDialogs.StandardIcon.Question: - iconText = "\uF059" + iconText = hifi.glyphs.questionIcon; break; case OriginalDialogs.StandardIcon.Warning: - iconText = "\uF071" + iconText = hifi.glyphs.warningIcon; break; case OriginalDialogs.StandardIcon.Critical: - iconText = "\uF057" + iconText = hifi.glyphs.criticalIcon; break; default: - iconText = "" + iconText = hifi.glyphs.noIcon; } } diff --git a/interface/resources/qml/styles-uit/HifiConstants.qml b/interface/resources/qml/styles-uit/HifiConstants.qml index 108cf8a221..de65cb4ecb 100644 --- a/interface/resources/qml/styles-uit/HifiConstants.qml +++ b/interface/resources/qml/styles-uit/HifiConstants.qml @@ -141,15 +141,20 @@ Item { readonly property string close: "w" readonly property string closeInverted: "x" readonly property string closeSmall: "C" + readonly property string criticalIcon: "=" readonly property string disclosureButtonCollapse: "M" readonly property string disclosureButtonExpand: "L" readonly property string disclosureCollapse: "Z" readonly property string disclosureExpand: "B" readonly property string forward: "D" + readonly property string informatonIcon: "[" + readonly property string noIcon: "" readonly property string pin: "y" readonly property string pinInverted: "z" + readonly property string questionIcon: "]" readonly property string reloadSmall: "a" readonly property string resizeHandle: "A" + readonly property string warningIcon: "+" } Item { diff --git a/interface/resources/qml/windows-uit/ModalFrame.qml b/interface/resources/qml/windows-uit/ModalFrame.qml index 57298ccb1a..902fdda4b5 100644 --- a/interface/resources/qml/windows-uit/ModalFrame.qml +++ b/interface/resources/qml/windows-uit/ModalFrame.qml @@ -50,13 +50,13 @@ Frame { width: title.width + (icon.text !== "" ? icon.width + hifi.dimensions.contentSpacing.x : 0) x: (parent.width - width) / 2 - FontAwesome { + HiFiGlyphs { id: icon text: window.iconText ? window.iconText : "" - size: 30 - color: hifi.colors.lightGrayText + size: 50 + color: hifi.colors.lightGray visible: text != "" - y: -hifi.dimensions.modalDialogTitleHeight - 5 + anchors.verticalCenter: title.verticalCenter anchors.left: parent.left } RalewayRegular { From 03fb6b1444fab8f0944a98e8e9091746df55a0b7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 9 Mar 2016 10:45:14 +1300 Subject: [PATCH 10/13] Add ability to have icons in query dialogs Add icon to bookmark dialogs' titles. --- .../resources/qml/dialogs/MessageDialog.qml | 9 ++++--- .../resources/qml/dialogs/QueryDialog.qml | 25 ++++++++++++++++++- .../qml/styles-uit/HifiConstants.qml | 17 ++++++++++--- .../resources/qml/windows-uit/ModalFrame.qml | 2 +- interface/src/Bookmarks.cpp | 4 +-- libraries/ui/src/OffscreenUi.cpp | 22 +++++++++------- libraries/ui/src/OffscreenUi.h | 24 ++++++++++++++---- tests/ui/qml/main.qml | 5 ++++ 8 files changed, 82 insertions(+), 26 deletions(-) diff --git a/interface/resources/qml/dialogs/MessageDialog.qml b/interface/resources/qml/dialogs/MessageDialog.qml index 2d83c512e4..77056ec893 100644 --- a/interface/resources/qml/dialogs/MessageDialog.qml +++ b/interface/resources/qml/dialogs/MessageDialog.qml @@ -45,6 +45,7 @@ ModalWindow { property int buttons: OriginalDialogs.StandardButton.Ok property int icon: OriginalDialogs.StandardIcon.NoIcon property string iconText: "" + property int iconSize: 50 onIconChanged: updateIcon(); property int defaultButton: OriginalDialogs.StandardButton.NoButton; property int clickedButton: OriginalDialogs.StandardButton.NoButton; @@ -56,16 +57,16 @@ ModalWindow { } switch (root.icon) { case OriginalDialogs.StandardIcon.Information: - iconText = hifi.glyphs.informatonIcon; + iconText = hifi.glyphs.info; break; case OriginalDialogs.StandardIcon.Question: - iconText = hifi.glyphs.questionIcon; + iconText = hifi.glyphs.question; break; case OriginalDialogs.StandardIcon.Warning: - iconText = hifi.glyphs.warningIcon; + iconText = hifi.glyphs.alert; break; case OriginalDialogs.StandardIcon.Critical: - iconText = hifi.glyphs.criticalIcon; + iconText = hifi.glyphs.critical; break; default: iconText = hifi.glyphs.noIcon; diff --git a/interface/resources/qml/dialogs/QueryDialog.qml b/interface/resources/qml/dialogs/QueryDialog.qml index 9420801500..48adeaf074 100644 --- a/interface/resources/qml/dialogs/QueryDialog.qml +++ b/interface/resources/qml/dialogs/QueryDialog.qml @@ -26,6 +26,11 @@ ModalWindow { signal selected(var result); signal canceled(); + property int icon: hifi.icons.none + property string iconText: "" + property int iconSize: 35 + onIconChanged: updateIcon(); + property var items; property string label property var result; @@ -38,6 +43,20 @@ ModalWindow { // For combo boxes property bool editable: true; + function updateIcon() { + if (!root) { + return; + } + + switch (root.icon) { + case hifi.icons.placemark: + iconText = hifi.glyphs.placemark; + break; + default: + iconText = ""; + } + } + Item { clip: true width: pane.width @@ -153,5 +172,9 @@ ModalWindow { } } - Component.onCompleted: { d.resize(); textResult.forceActiveFocus(); } + Component.onCompleted: { + updateIcon(); + d.resize(); + textResult.forceActiveFocus(); + } } diff --git a/interface/resources/qml/styles-uit/HifiConstants.qml b/interface/resources/qml/styles-uit/HifiConstants.qml index de65cb4ecb..e0b6061833 100644 --- a/interface/resources/qml/styles-uit/HifiConstants.qml +++ b/interface/resources/qml/styles-uit/HifiConstants.qml @@ -17,6 +17,7 @@ Item { readonly property alias dimensions: dimensions readonly property alias fontSizes: fontSizes readonly property alias glyphs: glyphs + readonly property alias icons: icons readonly property alias buttons: buttons readonly property alias effects: effects @@ -134,6 +135,7 @@ Item { Item { id: glyphs + readonly property string alert: "+" readonly property string backward: "E" readonly property string caratDn: "5" readonly property string caratR: "3" @@ -141,20 +143,27 @@ Item { readonly property string close: "w" readonly property string closeInverted: "x" readonly property string closeSmall: "C" - readonly property string criticalIcon: "=" + readonly property string critical: "=" readonly property string disclosureButtonCollapse: "M" readonly property string disclosureButtonExpand: "L" readonly property string disclosureCollapse: "Z" readonly property string disclosureExpand: "B" readonly property string forward: "D" - readonly property string informatonIcon: "[" + readonly property string info: "[" readonly property string noIcon: "" readonly property string pin: "y" readonly property string pinInverted: "z" - readonly property string questionIcon: "]" + readonly property string placemark: "U" + readonly property string question: "]" readonly property string reloadSmall: "a" readonly property string resizeHandle: "A" - readonly property string warningIcon: "+" + } + + Item { + id: icons + // Values per OffscreenUi::Icon + readonly property int none: 0 + readonly property int placemark: 1 } Item { diff --git a/interface/resources/qml/windows-uit/ModalFrame.qml b/interface/resources/qml/windows-uit/ModalFrame.qml index 902fdda4b5..5c6556021e 100644 --- a/interface/resources/qml/windows-uit/ModalFrame.qml +++ b/interface/resources/qml/windows-uit/ModalFrame.qml @@ -53,7 +53,7 @@ Frame { HiFiGlyphs { id: icon text: window.iconText ? window.iconText : "" - size: 50 + size: window.iconSize ? window.iconSize : 30 color: hifi.colors.lightGray visible: text != "" anchors.verticalCenter: title.verticalCenter diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index c37e7cde87..479c21538b 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -107,7 +107,7 @@ void Bookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { void Bookmarks::bookmarkLocation() { bool ok = false; - auto bookmarkName = OffscreenUi::getText(nullptr, "Bookmark Location", "Name", QLineEdit::Normal, QString(), &ok); + auto bookmarkName = OffscreenUi::getText(OffscreenUi::ICON_PLACEMARK, "Bookmark Location", "Name", QString(), &ok); if (!ok) { return; } @@ -156,7 +156,7 @@ void Bookmarks::deleteBookmark() { } bool ok = false; - auto bookmarkName = OffscreenUi::getItem(nullptr, "Delete Bookmark", "Select the bookmark to delete", bookmarkList, 0, false, &ok); + auto bookmarkName = OffscreenUi::getItem(OffscreenUi::ICON_PLACEMARK, "Delete Bookmark", "Select the bookmark to delete", bookmarkList, 0, false, &ok); if (!ok) { return; } diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index 999f9ef2f7..8412ac7f6d 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -286,24 +286,24 @@ private slots: } }; -// FIXME many input parameters currently ignored -QString OffscreenUi::getText(void* ignored, const QString & title, const QString & label, QLineEdit::EchoMode mode, const QString & text, bool * ok, Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints) { +QString OffscreenUi::getText(const Icon icon, const QString& title, const QString& label, const QString& text, bool* ok) { if (ok) { *ok = false; } - QVariant result = DependencyManager::get()->inputDialog(title, label, text).toString(); + QVariant result = DependencyManager::get()->inputDialog(icon, title, label, text).toString(); if (ok && result.isValid()) { *ok = true; } return result.toString(); } -// FIXME many input parameters currently ignored -QString OffscreenUi::getItem(void *ignored, const QString & title, const QString & label, const QStringList & items, int current, bool editable, bool * ok, Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints) { +QString OffscreenUi::getItem(const Icon icon, const QString& title, const QString& label, const QStringList& items, + int current, bool editable, bool* ok) { + if (ok) { *ok = false; } auto offscreenUi = DependencyManager::get(); - auto inputDialog = offscreenUi->createInputDialog(title, label, current); + auto inputDialog = offscreenUi->createInputDialog(icon, title, label, current); if (!inputDialog) { return QString(); } @@ -321,24 +321,28 @@ QString OffscreenUi::getItem(void *ignored, const QString & title, const QString return result.toString(); } -QVariant OffscreenUi::inputDialog(const QString& title, const QString& label, const QVariant& current) { +QVariant OffscreenUi::inputDialog(const Icon icon, const QString& title, const QString& label, const QVariant& current) { if (QThread::currentThread() != thread()) { QVariant result; QMetaObject::invokeMethod(this, "inputDialog", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, result), Q_ARG(QString, title), + Q_ARG(Icon, icon), Q_ARG(QString, label), Q_ARG(QVariant, current)); return result; } - return waitForInputDialogResult(createInputDialog(title, label, current)); + return waitForInputDialogResult(createInputDialog(icon, title, label, current)); } -QQuickItem* OffscreenUi::createInputDialog(const QString& title, const QString& label, const QVariant& current) { +QQuickItem* OffscreenUi::createInputDialog(const Icon icon, const QString& title, const QString& label, + const QVariant& current) { + QVariantMap map; map.insert("title", title); + map.insert("icon", icon); map.insert("label", label); map.insert("current", current); QVariant result; diff --git a/libraries/ui/src/OffscreenUi.h b/libraries/ui/src/OffscreenUi.h index 32f7a31d17..7ccbe7b687 100644 --- a/libraries/ui/src/OffscreenUi.h +++ b/libraries/ui/src/OffscreenUi.h @@ -95,16 +95,30 @@ public: // Compatibility with QFileDialog::getSaveFileName static QString getSaveFileName(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0); + enum Icon { + ICON_NONE = 0, + ICON_PLACEMARK + }; - // input dialog compatibility - Q_INVOKABLE QVariant inputDialog(const QString& title, const QString& label = QString(), const QVariant& current = QVariant()); - QQuickItem* createInputDialog(const QString& title, const QString& label, const QVariant& current); + Q_INVOKABLE QVariant inputDialog(const Icon icon, const QString& title, const QString& label = QString(), const QVariant& current = QVariant()); + QQuickItem* createInputDialog(const Icon icon, const QString& title, const QString& label, const QVariant& current); QVariant waitForInputDialogResult(QQuickItem* inputDialog); // Compatibility with QInputDialog::getText - static QString getText(void* ignored, const QString & title, const QString & label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), bool * ok = 0, Qt::WindowFlags flags = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone); + static QString getText(void* ignored, const QString & title, const QString & label, + QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), bool * ok = 0, + Qt::WindowFlags flags = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone) { + return getText(OffscreenUi::ICON_NONE, title, label, text, ok); + } // Compatibility with QInputDialog::getItem - static QString getItem(void *ignored, const QString & title, const QString & label, const QStringList & items, int current = 0, bool editable = true, bool * ok = 0, Qt::WindowFlags flags = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone); + static QString getItem(void *ignored, const QString & title, const QString & label, const QStringList & items, + int current = 0, bool editable = true, bool * ok = 0, Qt::WindowFlags flags = 0, + Qt::InputMethodHints inputMethodHints = Qt::ImhNone) { + return getItem(OffscreenUi::ICON_NONE, title, label, items, current, editable, ok); + } + + static QString getText(const Icon icon, const QString & title, const QString & label, const QString & text = QString(), bool * ok = 0); + static QString getItem(const Icon icon, const QString & title, const QString & label, const QStringList & items, int current = 0, bool editable = true, bool * ok = 0); signals: void showDesktop(); diff --git a/tests/ui/qml/main.qml b/tests/ui/qml/main.qml index a3b6114c11..9f4df4e68f 100644 --- a/tests/ui/qml/main.qml +++ b/tests/ui/qml/main.qml @@ -9,6 +9,7 @@ import "../../../interface/resources/qml/windows-uit" import "../../../interface/resources/qml/dialogs" import "../../../interface/resources/qml/hifi" import "../../../interface/resources/qml/hifi/dialogs" +import "../../../interface/resources/qml/styles-uit" ApplicationWindow { id: appWindow @@ -17,6 +18,8 @@ ApplicationWindow { height: 800 title: qsTr("Scratch App") + HifiConstants { id: hifi } + Desktop { id: desktop anchors.fill: parent @@ -142,6 +145,7 @@ ApplicationWindow { onClicked: { desktop.inputDialog({ title: "Bookmark Location", + icon: hifi.icons.placemark, label: "Name" }); } @@ -151,6 +155,7 @@ ApplicationWindow { onClicked: { desktop.inputDialog({ title: "Delete Bookmark", + icon: hifi.icons.placemark, label: "Select the bookmark to delete", items: ["Bookmark A", "Bookmark B", "Bookmark C"] }); From 10e4e5e3a76d34db82ddcc51cf0a53c276ed5ca7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 9 Mar 2016 11:33:55 +1300 Subject: [PATCH 11/13] Use OffscreenUI icon enum instead of QMessageBox icon enum --- .../resources/qml/dialogs/MessageDialog.qml | 17 +--------- .../resources/qml/dialogs/QueryDialog.qml | 9 +----- .../qml/styles-uit/HifiConstants.qml | 31 ++++++++++++++++++- interface/src/Bookmarks.cpp | 2 +- libraries/ui/src/OffscreenUi.cpp | 14 ++++----- libraries/ui/src/OffscreenUi.h | 17 +++++----- tests/ui/qml/main.qml | 16 +++++----- 7 files changed, 58 insertions(+), 48 deletions(-) diff --git a/interface/resources/qml/dialogs/MessageDialog.qml b/interface/resources/qml/dialogs/MessageDialog.qml index 77056ec893..9809708c37 100644 --- a/interface/resources/qml/dialogs/MessageDialog.qml +++ b/interface/resources/qml/dialogs/MessageDialog.qml @@ -55,22 +55,7 @@ ModalWindow { if (!root) { return; } - switch (root.icon) { - case OriginalDialogs.StandardIcon.Information: - iconText = hifi.glyphs.info; - break; - case OriginalDialogs.StandardIcon.Question: - iconText = hifi.glyphs.question; - break; - case OriginalDialogs.StandardIcon.Warning: - iconText = hifi.glyphs.alert; - break; - case OriginalDialogs.StandardIcon.Critical: - iconText = hifi.glyphs.critical; - break; - default: - iconText = hifi.glyphs.noIcon; - } + iconText = hifi.glyphForIcon(root.icon); } Item { diff --git a/interface/resources/qml/dialogs/QueryDialog.qml b/interface/resources/qml/dialogs/QueryDialog.qml index 48adeaf074..5e02fa4859 100644 --- a/interface/resources/qml/dialogs/QueryDialog.qml +++ b/interface/resources/qml/dialogs/QueryDialog.qml @@ -47,14 +47,7 @@ ModalWindow { if (!root) { return; } - - switch (root.icon) { - case hifi.icons.placemark: - iconText = hifi.glyphs.placemark; - break; - default: - iconText = ""; - } + iconText = hifi.glyphForIcon(root.icon); } Item { diff --git a/interface/resources/qml/styles-uit/HifiConstants.qml b/interface/resources/qml/styles-uit/HifiConstants.qml index e0b6061833..b884793025 100644 --- a/interface/resources/qml/styles-uit/HifiConstants.qml +++ b/interface/resources/qml/styles-uit/HifiConstants.qml @@ -21,6 +21,31 @@ Item { readonly property alias buttons: buttons readonly property alias effects: effects + function glyphForIcon(icon) { + // Translates icon enum to glyph char. + var glyph; + switch (icon) { + case hifi.icons.information: + glyph = hifi.glyphs.info; + break; + case hifi.icons.question: + glyph = hifi.glyphs.question; + break; + case hifi.icons.warning: + glyph = hifi.glyphs.alert; + break; + case hifi.icons.critical: + glyph = hifi.glyphs.critical; + break; + case hifi.icons.placemark: + glyph = hifi.glyphs.placemark; + break; + default: + ch = hifi.glyphs.noIcon; + } + return glyph; + } + Item { id: colors @@ -163,7 +188,11 @@ Item { id: icons // Values per OffscreenUi::Icon readonly property int none: 0 - readonly property int placemark: 1 + readonly property int question: 1 + readonly property int information: 2 + readonly property int warning: 3 + readonly property int critical: 4 + readonly property int placemark: 5 } Item { diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 479c21538b..913ff7e890 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -123,7 +123,7 @@ void Bookmarks::bookmarkLocation() { Menu* menubar = Menu::getInstance(); if (contains(bookmarkName)) { auto offscreenUi = DependencyManager::get(); - auto duplicateBookmarkMessage = offscreenUi->createMessageBox(QMessageBox::Warning, "Duplicate Bookmark", + auto duplicateBookmarkMessage = offscreenUi->createMessageBox(OffscreenUi::ICON_WARNING, "Duplicate Bookmark", "The bookmark name you entered already exists in your list.", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); duplicateBookmarkMessage->setProperty("informativeText", "Would you like to overwrite it?"); diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index 8412ac7f6d..ce7ea169f3 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -204,7 +204,7 @@ private slots: } }; -QQuickItem* OffscreenUi::createMessageBox(QMessageBox::Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { +QQuickItem* OffscreenUi::createMessageBox(Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { QVariantMap map; map.insert("title", title); map.insert("text", text); @@ -232,12 +232,12 @@ int OffscreenUi::waitForMessageBoxResult(QQuickItem* messageBox) { } -QMessageBox::StandardButton OffscreenUi::messageBox(QMessageBox::Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { +QMessageBox::StandardButton OffscreenUi::messageBox(Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { if (QThread::currentThread() != thread()) { QMessageBox::StandardButton result = QMessageBox::StandardButton::NoButton; QMetaObject::invokeMethod(this, "messageBox", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QMessageBox::StandardButton, result), - Q_ARG(QMessageBox::Icon, icon), + Q_ARG(Icon, icon), Q_ARG(QString, title), Q_ARG(QString, text), Q_ARG(QMessageBox::StandardButtons, buttons), @@ -250,19 +250,19 @@ QMessageBox::StandardButton OffscreenUi::messageBox(QMessageBox::Icon icon, cons QMessageBox::StandardButton OffscreenUi::critical(const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { - return DependencyManager::get()->messageBox(QMessageBox::Icon::Critical, title, text, buttons, defaultButton); + return DependencyManager::get()->messageBox(OffscreenUi::Icon::ICON_CRITICAL, title, text, buttons, defaultButton); } QMessageBox::StandardButton OffscreenUi::information(const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { - return DependencyManager::get()->messageBox(QMessageBox::Icon::Information, title, text, buttons, defaultButton); + return DependencyManager::get()->messageBox(OffscreenUi::Icon::ICON_INFORMATION, title, text, buttons, defaultButton); } QMessageBox::StandardButton OffscreenUi::question(const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { - return DependencyManager::get()->messageBox(QMessageBox::Icon::Question, title, text, buttons, defaultButton); + return DependencyManager::get()->messageBox(OffscreenUi::Icon::ICON_QUESTION, title, text, buttons, defaultButton); } QMessageBox::StandardButton OffscreenUi::warning(const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { - return DependencyManager::get()->messageBox(QMessageBox::Icon::Warning, title, text, buttons, defaultButton); + return DependencyManager::get()->messageBox(OffscreenUi::Icon::ICON_WARNING, title, text, buttons, defaultButton); } diff --git a/libraries/ui/src/OffscreenUi.h b/libraries/ui/src/OffscreenUi.h index 7ccbe7b687..0188ac5365 100644 --- a/libraries/ui/src/OffscreenUi.h +++ b/libraries/ui/src/OffscreenUi.h @@ -41,11 +41,19 @@ public: QQuickItem* getDesktop(); QQuickItem* getToolWindow(); + enum Icon { + ICON_NONE = 0, + ICON_QUESTION, + ICON_INFORMATION, + ICON_WARNING, + ICON_CRITICAL, + ICON_PLACEMARK + }; // Message box compatibility - Q_INVOKABLE QMessageBox::StandardButton messageBox(QMessageBox::Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton); + Q_INVOKABLE QMessageBox::StandardButton messageBox(Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton); // Must be called from the main thread - QQuickItem* createMessageBox(QMessageBox::Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton); + QQuickItem* createMessageBox(Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton); // Must be called from the main thread Q_INVOKABLE int waitForMessageBoxResult(QQuickItem* messageBox); @@ -95,11 +103,6 @@ public: // Compatibility with QFileDialog::getSaveFileName static QString getSaveFileName(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0); - enum Icon { - ICON_NONE = 0, - ICON_PLACEMARK - }; - Q_INVOKABLE QVariant inputDialog(const Icon icon, const QString& title, const QString& label = QString(), const QVariant& current = QVariant()); QQuickItem* createInputDialog(const Icon icon, const QString& title, const QString& label, const QVariant& current); QVariant waitForInputDialogResult(QQuickItem* inputDialog); diff --git a/tests/ui/qml/main.qml b/tests/ui/qml/main.qml index 9f4df4e68f..273eb1df47 100644 --- a/tests/ui/qml/main.qml +++ b/tests/ui/qml/main.qml @@ -102,11 +102,11 @@ ApplicationWindow { var messageBox = desktop.messageBox({ title: "Set Avatar", text: "Would you like to use 'Albert' for your avatar?", - icon: OriginalDialogs.StandardIcon.Question, // Test question icon - //icon: OriginalDialogs.StandardIcon.Information, // Test informaton icon - //icon: OriginalDialogs.StandardIcon.Warning, // Test warning icon - //icon: OriginalDialogs.StandardIcon.Critical, // Test critical icon - //icon: OriginalDialogs.StandardIcon.NoIcon, // Test no icon + icon: hifi.icons.question, // Test question icon + //icon: hifi.icons.information, // Test informaton icon + //icon: hifi.icons.warning, // Test warning icon + //icon: hifi.icons.critical, // Test critical icon + //icon: hifi.icons.none, // Test no icon buttons: OriginalDialogs.StandardButton.Ok + OriginalDialogs.StandardButton.Cancel, defaultButton: OriginalDialogs.StandardButton.Ok }); @@ -121,7 +121,7 @@ ApplicationWindow { onClicked: { var messageBox = desktop.messageBox({ text: "Diagnostic cycle will be complete in 30 seconds", - icon: OriginalDialogs.StandardIcon.Critical, + icon: hifi.icons.critical, }); messageBox.selected.connect(function(button) { console.log("You clicked " + button) @@ -135,7 +135,7 @@ ApplicationWindow { desktop.messageBox({ informativeText: "Diagnostic cycle will be complete in 30 seconds Diagnostic cycle will be complete in 30 seconds Diagnostic cycle will be complete in 30 seconds Diagnostic cycle will be complete in 30 seconds Diagnostic cycle will be complete in 30 seconds Diagnostic cycle will be complete in 30 seconds Diagnostic cycle will be complete in 30 seconds Diagnostic cycle will be complete in 30 seconds ", text: "Baloney", - icon: OriginalDialogs.StandardIcon.Warning, + icon: hifi.icons.warning, detailedText: "sakjd;laskj dksa;dl jka;lsd j;lkjas ;dlkaj s;dlakjd ;alkjda; slkjda; lkjda;lksjd ;alksjd; alksjd ;alksjd; alksjd; alksdjas;ldkjas;lkdja ;kj ;lkasjd; lkj as;dlka jsd;lka jsd;laksjd a" }); } @@ -169,7 +169,7 @@ ApplicationWindow { var queryBox = desktop.queryBox({ text: "Have you stopped beating your wife?", placeholderText: "Are you sure?", - // icon: OriginalDialogs.StandardIcon.Critical, + // icon: hifi.icons.critical, }); queryBox.selected.connect(function(result) { console.log("User responded with " + result); From edc50f102d74ebc624acb94f2d7ad0989bae25c5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 9 Mar 2016 11:55:09 +1300 Subject: [PATCH 12/13] Fix "duplicate bookmark" dialog --- interface/resources/qml/dialogs/MessageDialog.qml | 9 ++++++--- tests/ui/qml/main.qml | 13 +++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/dialogs/MessageDialog.qml b/interface/resources/qml/dialogs/MessageDialog.qml index 9809708c37..28a36d5a75 100644 --- a/interface/resources/qml/dialogs/MessageDialog.qml +++ b/interface/resources/qml/dialogs/MessageDialog.qml @@ -84,7 +84,7 @@ ModalWindow { RalewaySemibold { id: mainTextContainer - onHeightChanged: d.resize(); onWidthChanged: d.resize(); + onTextChanged: d.resize(); wrapMode: Text.WordWrap size: hifi.fontSizes.menuItem color: hifi.colors.baseGrayHighlight @@ -100,7 +100,7 @@ ModalWindow { RalewaySemibold { id: informativeTextContainer - onHeightChanged: d.resize(); onWidthChanged: d.resize(); + onTextChanged: d.resize(); wrapMode: Text.WordWrap size: hifi.fontSizes.menuItem color: hifi.colors.baseGrayHighlight @@ -194,7 +194,10 @@ ModalWindow { } ] - Component.onCompleted: updateIcon() + Component.onCompleted: { + updateIcon(); + d.resize(); + } onStateChanged: d.resize() } diff --git a/tests/ui/qml/main.qml b/tests/ui/qml/main.qml index 273eb1df47..d8083b7bbd 100644 --- a/tests/ui/qml/main.qml +++ b/tests/ui/qml/main.qml @@ -161,6 +161,19 @@ ApplicationWindow { }); } } + Button { + text: "Duplicate Bookmark" + onClicked: { + desktop.messageBox({ + title: "Duplicate Bookmark", + icon: hifi.icons.warning, + text: "The bookmark name you entered alread exists in yoru list.", + informativeText: "Would you like to overwrite it?", + buttons: OriginalDialogs.StandardButton.Yes + OriginalDialogs.StandardButton.No, + defaultButton: OriginalDialogs.StandardButton.Yes + }); + } + } /* // There is no such desktop.queryBox() function; may need to update test to cover QueryDialog.qml? Button { From 269936f3ac6908d61a9114057f75e54f63f42a47 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 9 Mar 2016 12:20:09 +1300 Subject: [PATCH 13/13] Fix typo --- interface/resources/qml/styles-uit/HifiConstants.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/styles-uit/HifiConstants.qml b/interface/resources/qml/styles-uit/HifiConstants.qml index b884793025..eb4c84b5b8 100644 --- a/interface/resources/qml/styles-uit/HifiConstants.qml +++ b/interface/resources/qml/styles-uit/HifiConstants.qml @@ -41,7 +41,7 @@ Item { glyph = hifi.glyphs.placemark; break; default: - ch = hifi.glyphs.noIcon; + glyph = hifi.glyphs.noIcon; } return glyph; }