diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml index e606d48b30f..edbcd62304d 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml @@ -165,223 +165,231 @@ QtObject { readonly property string fitSelected_small: "\u00B8" readonly property string fitSelection_medium: "\u00B9" readonly property string fitToView_medium: "\u00BA" - readonly property string flowAction: "\u00BB" - readonly property string flowTransition: "\u00BC" - readonly property string fontStyleBold: "\u00BD" - readonly property string fontStyleItalic: "\u00BE" - readonly property string fontStyleStrikethrough: "\u00BF" - readonly property string fontStyleUnderline: "\u00C0" - readonly property string forward_medium: "\u00C1" - readonly property string globalOrient_medium: "\u00C2" - readonly property string gradient: "\u00C3" - readonly property string gridView: "\u00C4" - readonly property string grid_medium: "\u00C5" - readonly property string group_small: "\u00C6" - readonly property string help: "\u00C7" - readonly property string home_large: "\u00C8" - readonly property string idAliasOff: "\u00C9" - readonly property string idAliasOn: "\u00CA" - readonly property string import_medium: "\u00CB" - readonly property string imported: "\u00CC" - readonly property string importedModels_small: "\u00CD" - readonly property string infinity: "\u00CE" - readonly property string invisible_medium: "\u00CF" - readonly property string invisible_small: "\u00D0" - readonly property string jumpToCode_medium: "\u00D1" - readonly property string jumpToCode_small: "\u00D2" - readonly property string keyframe: "\u00D3" - readonly property string languageList_medium: "\u00D4" - readonly property string layouts_small: "\u00D5" - readonly property string lights_small: "\u00D6" - readonly property string linear_medium: "\u00D7" - readonly property string linkTriangle: "\u00D8" - readonly property string linked: "\u00D9" - readonly property string listView: "\u00DA" - readonly property string listView_medium: "\u00DB" - readonly property string list_medium: "\u00DC" - readonly property string localOrient_medium: "\u00DD" - readonly property string lockOff: "\u00DE" - readonly property string lockOn: "\u00DF" - readonly property string loopPlayback_medium: "\u00E0" - readonly property string materialBrowser_medium: "\u00E1" - readonly property string materialPreviewEnvironment: "\u00E2" - readonly property string materialPreviewModel: "\u00E3" - readonly property string material_medium: "\u00E4" - readonly property string maxBar_small: "\u00E5" - readonly property string mergeCells: "\u00E6" - readonly property string merge_small: "\u00E7" - readonly property string minus: "\u00E8" - readonly property string mirror: "\u00E9" - readonly property string more_medium: "\u00EA" - readonly property string mouseArea_small: "\u00EB" - readonly property string moveDown_medium: "\u00EC" - readonly property string moveInwards_medium: "\u00ED" - readonly property string moveUp_medium: "\u00EE" - readonly property string moveUpwards_medium: "\u00EF" - readonly property string move_medium: "\u00F0" - readonly property string newMaterial: "\u00F1" - readonly property string nextFile_large: "\u00F2" - readonly property string normalBar_small: "\u00F3" - readonly property string openLink: "\u00F4" - readonly property string openMaterialBrowser: "\u00F5" - readonly property string orientation: "\u00F6" - readonly property string orthCam_medium: "\u00F7" - readonly property string orthCam_small: "\u00F8" - readonly property string paddingEdge: "\u00F9" - readonly property string paddingFrame: "\u00FA" - readonly property string particleAnimation_medium: "\u00FB" - readonly property string pasteStyle: "\u00FC" - readonly property string paste_small: "\u00FD" - readonly property string pause: "\u00FE" - readonly property string pause_medium: "\u00FF" - readonly property string perspectiveCam_medium: "\u0100" - readonly property string perspectiveCam_small: "\u0101" - readonly property string pin: "\u0102" - readonly property string plane_medium: "\u0103" - readonly property string plane_small: "\u0104" - readonly property string play: "\u0105" - readonly property string playFill_medium: "\u0106" - readonly property string playOutline_medium: "\u0107" - readonly property string plus: "\u0108" - readonly property string pointLight_small: "\u0109" - readonly property string positioners_small: "\u010A" - readonly property string previewEnv_medium: "\u010B" - readonly property string previousFile_large: "\u010C" - readonly property string promote: "\u010D" - readonly property string properties_medium: "\u010E" - readonly property string readOnly: "\u010F" - readonly property string recent_medium: "\u0110" - readonly property string recordFill_medium: "\u0111" - readonly property string recordOutline_medium: "\u0112" - readonly property string redo: "\u0113" - readonly property string reload_medium: "\u0114" - readonly property string remove_medium: "\u0115" - readonly property string remove_small: "\u0116" - readonly property string rename_small: "\u0117" - readonly property string replace_small: "\u0118" - readonly property string resetView_small: "\u0119" - readonly property string restartParticles_medium: "\u011A" - readonly property string reverseOrder_medium: "\u011B" - readonly property string roatate_medium: "\u011C" - readonly property string rotationFill: "\u011D" - readonly property string rotationOutline: "\u011E" - readonly property string runProjFill_large: "\u011F" - readonly property string runProjOutline_large: "\u0120" - readonly property string s_anchors: "\u0121" - readonly property string s_annotations: "\u0122" - readonly property string s_arrange: "\u0123" - readonly property string s_boundingBox: "\u0124" - readonly property string s_component: "\u0125" - readonly property string s_connections: "\u0126" - readonly property string s_edit: "\u0127" - readonly property string s_enterComponent: "\u0128" - readonly property string s_eventList: "\u0129" - readonly property string s_group: "\u012A" - readonly property string s_layouts: "\u012B" - readonly property string s_merging: "\u012C" - readonly property string s_mouseArea: "\u012D" - readonly property string s_positioners: "\u012E" - readonly property string s_selection: "\u012F" - readonly property string s_snapping: "\u0130" - readonly property string s_timeline: "\u0131" - readonly property string s_visibility: "\u0132" - readonly property string saveAs_medium: "\u0133" - readonly property string saveLogs_medium: "\u0134" - readonly property string save_medium: "\u0135" - readonly property string scale_medium: "\u0136" - readonly property string search: "\u0137" - readonly property string search_small: "\u0138" - readonly property string sectionToggle: "\u0139" - readonly property string selectFill_medium: "\u013A" - readonly property string selectOutline_medium: "\u013B" - readonly property string selectParent_small: "\u013C" - readonly property string selection_small: "\u013D" - readonly property string settings_medium: "\u013E" - readonly property string signal_small: "\u013F" - readonly property string snapping_conf_medium: "\u0140" - readonly property string snapping_medium: "\u0141" - readonly property string snapping_small: "\u0142" - readonly property string sortascending_medium: "\u0143" - readonly property string sortdescending_medium: "\u0144" - readonly property string sphere_medium: "\u0145" - readonly property string sphere_small: "\u0146" - readonly property string splitColumns: "\u0147" - readonly property string splitRows: "\u0148" - readonly property string splitScreen_medium: "\u0149" - readonly property string spotLight_small: "\u014A" - readonly property string stackedContainer_small: "\u014B" - readonly property string startNode: "\u014C" - readonly property string step_medium: "\u014D" - readonly property string stop_medium: "\u014E" - readonly property string tableView_medium: "\u014F" - readonly property string testIcon: "\u0150" - readonly property string textAlignBottom: "\u0151" - readonly property string textAlignCenter: "\u0152" - readonly property string textAlignJustified: "\u0153" - readonly property string textAlignLeft: "\u0154" - readonly property string textAlignMiddle: "\u0155" - readonly property string textAlignRight: "\u0156" - readonly property string textAlignTop: "\u0157" - readonly property string textBulletList: "\u0158" - readonly property string textFullJustification: "\u0159" - readonly property string textNumberedList: "\u015A" - readonly property string textures_medium: "\u015B" - readonly property string tickIcon: "\u015C" - readonly property string tickMark_small: "\u015D" - readonly property string timeline_small: "\u015E" - readonly property string toEndFrame_medium: "\u015F" - readonly property string toNextFrame_medium: "\u0160" - readonly property string toPrevFrame_medium: "\u0161" - readonly property string toStartFrame_medium: "\u0162" - readonly property string topToolbar_annotations: "\u0163" - readonly property string topToolbar_closeFile: "\u0164" - readonly property string topToolbar_designMode: "\u0165" - readonly property string topToolbar_enterComponent: "\u0166" - readonly property string topToolbar_home: "\u0167" - readonly property string topToolbar_makeComponent: "\u0168" - readonly property string topToolbar_navFile: "\u0169" - readonly property string topToolbar_runProject: "\u016A" - readonly property string translationCreateFiles: "\u016B" - readonly property string translationCreateReport: "\u016C" - readonly property string translationExport: "\u016D" - readonly property string translationImport: "\u016E" - readonly property string translationSelectLanguages: "\u016F" - readonly property string translationTest: "\u0170" - readonly property string transparent: "\u0171" - readonly property string trash_medium: "\u0172" - readonly property string triState: "\u0173" - readonly property string triangleArcA: "\u0174" - readonly property string triangleArcB: "\u0175" - readonly property string triangleCornerA: "\u0176" - readonly property string triangleCornerB: "\u0177" - readonly property string unLinked: "\u0178" - readonly property string undo: "\u0179" - readonly property string unify_medium: "\u017A" - readonly property string unpin: "\u017B" - readonly property string upDownIcon: "\u017C" - readonly property string upDownSquare2: "\u017D" - readonly property string updateAvailable_medium: "\u017E" - readonly property string updateContent_medium: "\u017F" - readonly property string visibilityOff: "\u0180" - readonly property string visibilityOn: "\u0181" - readonly property string visible_medium: "\u0182" - readonly property string visible_small: "\u0183" - readonly property string warning2_medium: "\u0184" - readonly property string warning_medium: "\u0185" - readonly property string wildcard: "\u0186" - readonly property string wizardsAutomotive: "\u0187" - readonly property string wizardsDesktop: "\u0188" - readonly property string wizardsGeneric: "\u0189" - readonly property string wizardsMcuEmpty: "\u018A" - readonly property string wizardsMcuGraph: "\u018B" - readonly property string wizardsMobile: "\u018C" - readonly property string wizardsUnknown: "\u018D" - readonly property string zoomAll: "\u018E" - readonly property string zoomIn: "\u018F" - readonly property string zoomIn_medium: "\u0190" - readonly property string zoomOut: "\u0191" - readonly property string zoomOut_medium: "\u0192" - readonly property string zoomSelection: "\u0193" + readonly property string flag_medium: "\u00BB" + readonly property string flowAction: "\u00BC" + readonly property string flowTransition: "\u00BD" + readonly property string fontStyleBold: "\u00BE" + readonly property string fontStyleItalic: "\u00BF" + readonly property string fontStyleStrikethrough: "\u00C0" + readonly property string fontStyleUnderline: "\u00C1" + readonly property string forward_medium: "\u00C2" + readonly property string globalOrient_medium: "\u00C3" + readonly property string gradient: "\u00C4" + readonly property string gridView: "\u00C5" + readonly property string grid_medium: "\u00C6" + readonly property string group_small: "\u00C7" + readonly property string help: "\u00C8" + readonly property string home_large: "\u00C9" + readonly property string idAliasOff: "\u00CA" + readonly property string idAliasOn: "\u00CB" + readonly property string import_medium: "\u00CC" + readonly property string imported: "\u00CD" + readonly property string importedModels_small: "\u00CE" + readonly property string infinity: "\u00CF" + readonly property string invisible_medium: "\u00D0" + readonly property string invisible_small: "\u00D1" + readonly property string jumpToCode_medium: "\u00D2" + readonly property string jumpToCode_small: "\u00D3" + readonly property string keyframe: "\u00D4" + readonly property string languageList_medium: "\u00D5" + readonly property string layouts_small: "\u00D6" + readonly property string lights_small: "\u00D7" + readonly property string linear_medium: "\u00D8" + readonly property string linkTriangle: "\u00D9" + readonly property string linked: "\u00DA" + readonly property string listView: "\u00DB" + readonly property string listView_medium: "\u00DC" + readonly property string list_medium: "\u00DD" + readonly property string localOrient_medium: "\u00DE" + readonly property string lockOff: "\u00DF" + readonly property string lockOn: "\u00E0" + readonly property string loopPlayback_medium: "\u00E1" + readonly property string materialBrowser_medium: "\u00E2" + readonly property string materialPreviewEnvironment: "\u00E3" + readonly property string materialPreviewModel: "\u00E4" + readonly property string material_medium: "\u00E5" + readonly property string maxBar_small: "\u00E6" + readonly property string mergeCells: "\u00E7" + readonly property string merge_small: "\u00E8" + readonly property string minus: "\u00E9" + readonly property string mirror: "\u00EA" + readonly property string more_medium: "\u00EB" + readonly property string mouseArea_small: "\u00EC" + readonly property string moveDown_medium: "\u00ED" + readonly property string moveInwards_medium: "\u00EE" + readonly property string moveUp_medium: "\u00EF" + readonly property string moveUpwards_medium: "\u00F0" + readonly property string move_medium: "\u00F1" + readonly property string newMaterial: "\u00F2" + readonly property string nextFile_large: "\u00F3" + readonly property string normalBar_small: "\u00F4" + readonly property string number_medium: "\u00F5" + readonly property string openLink: "\u00F6" + readonly property string openMaterialBrowser: "\u00F7" + readonly property string orientation: "\u00F8" + readonly property string orthCam_medium: "\u00F9" + readonly property string orthCam_small: "\u00FA" + readonly property string paddingEdge: "\u00FB" + readonly property string paddingFrame: "\u00FC" + readonly property string particleAnimation_medium: "\u00FD" + readonly property string pasteStyle: "\u00FE" + readonly property string paste_small: "\u00FF" + readonly property string pause: "\u0100" + readonly property string pause_medium: "\u0101" + readonly property string perspectiveCam_medium: "\u0102" + readonly property string perspectiveCam_small: "\u0103" + readonly property string pin: "\u0104" + readonly property string plane_medium: "\u0105" + readonly property string plane_small: "\u0106" + readonly property string play: "\u0107" + readonly property string playFill_medium: "\u0108" + readonly property string playOutline_medium: "\u0109" + readonly property string plus: "\u010A" + readonly property string pointLight_small: "\u010B" + readonly property string positioners_small: "\u010C" + readonly property string previewEnv_medium: "\u010D" + readonly property string previousFile_large: "\u010E" + readonly property string promote: "\u010F" + readonly property string properties_medium: "\u0110" + readonly property string readOnly: "\u0111" + readonly property string recent_medium: "\u0112" + readonly property string recordFill_medium: "\u0113" + readonly property string recordOutline_medium: "\u0114" + readonly property string redo: "\u0115" + readonly property string reload_medium: "\u0116" + readonly property string remove_medium: "\u0117" + readonly property string remove_small: "\u0118" + readonly property string rename_small: "\u0119" + readonly property string replace_small: "\u011A" + readonly property string resetView_small: "\u011B" + readonly property string restartParticles_medium: "\u011C" + readonly property string reverseOrder_medium: "\u011D" + readonly property string roatate_medium: "\u011E" + readonly property string rotationFill: "\u011F" + readonly property string rotationOutline: "\u0120" + readonly property string runProjFill_large: "\u0121" + readonly property string runProjOutline_large: "\u0122" + readonly property string s_anchors: "\u0123" + readonly property string s_annotations: "\u0124" + readonly property string s_arrange: "\u0125" + readonly property string s_boundingBox: "\u0126" + readonly property string s_component: "\u0127" + readonly property string s_connections: "\u0128" + readonly property string s_edit: "\u0129" + readonly property string s_enterComponent: "\u012A" + readonly property string s_eventList: "\u012B" + readonly property string s_group: "\u012C" + readonly property string s_layouts: "\u012D" + readonly property string s_merging: "\u012E" + readonly property string s_mouseArea: "\u012F" + readonly property string s_positioners: "\u0130" + readonly property string s_selection: "\u0131" + readonly property string s_snapping: "\u0132" + readonly property string s_timeline: "\u0133" + readonly property string s_visibility: "\u0134" + readonly property string saveAs_medium: "\u0135" + readonly property string saveLogs_medium: "\u0136" + readonly property string save_medium: "\u0137" + readonly property string scale_medium: "\u0138" + readonly property string search: "\u0139" + readonly property string search_small: "\u013A" + readonly property string sectionToggle: "\u013B" + readonly property string selectFill_medium: "\u013C" + readonly property string selectOutline_medium: "\u013D" + readonly property string selectParent_small: "\u013E" + readonly property string selection_small: "\u013F" + readonly property string settings_medium: "\u0140" + readonly property string share_large: "\u0141" + readonly property string signal_small: "\u0142" + readonly property string signin_medium: "\u0143" + readonly property string signout_medium: "\u0144" + readonly property string snapping_conf_medium: "\u0145" + readonly property string snapping_medium: "\u0146" + readonly property string snapping_small: "\u0147" + readonly property string sortascending_medium: "\u0148" + readonly property string sortdescending_medium: "\u0149" + readonly property string sphere_medium: "\u014A" + readonly property string sphere_small: "\u014B" + readonly property string splitColumns: "\u014C" + readonly property string splitRows: "\u014D" + readonly property string splitScreen_medium: "\u014E" + readonly property string spotLight_small: "\u014F" + readonly property string stackedContainer_small: "\u0150" + readonly property string startNode: "\u0151" + readonly property string step_medium: "\u0152" + readonly property string stop_medium: "\u0153" + readonly property string string_medium: "\u0154" + readonly property string tableView_medium: "\u0155" + readonly property string testIcon: "\u0156" + readonly property string textAlignBottom: "\u0157" + readonly property string textAlignCenter: "\u0158" + readonly property string textAlignJustified: "\u0159" + readonly property string textAlignLeft: "\u015A" + readonly property string textAlignMiddle: "\u015B" + readonly property string textAlignRight: "\u015C" + readonly property string textAlignTop: "\u015D" + readonly property string textBulletList: "\u015E" + readonly property string textFullJustification: "\u015F" + readonly property string textNumberedList: "\u0160" + readonly property string textures_medium: "\u0161" + readonly property string tickIcon: "\u0162" + readonly property string tickMark_small: "\u0163" + readonly property string timeline_small: "\u0164" + readonly property string toEndFrame_medium: "\u0165" + readonly property string toNextFrame_medium: "\u0166" + readonly property string toPrevFrame_medium: "\u0167" + readonly property string toStartFrame_medium: "\u0168" + readonly property string topToolbar_annotations: "\u0169" + readonly property string topToolbar_closeFile: "\u016A" + readonly property string topToolbar_designMode: "\u016B" + readonly property string topToolbar_enterComponent: "\u016C" + readonly property string topToolbar_home: "\u016D" + readonly property string topToolbar_makeComponent: "\u016E" + readonly property string topToolbar_navFile: "\u016F" + readonly property string topToolbar_runProject: "\u0170" + readonly property string translationCreateFiles: "\u0171" + readonly property string translationCreateReport: "\u0172" + readonly property string translationExport: "\u0173" + readonly property string translationImport: "\u0174" + readonly property string translationSelectLanguages: "\u0175" + readonly property string translationTest: "\u0176" + readonly property string transparent: "\u0177" + readonly property string trash_medium: "\u0178" + readonly property string triState: "\u0179" + readonly property string triangleArcA: "\u017A" + readonly property string triangleArcB: "\u017B" + readonly property string triangleCornerA: "\u017C" + readonly property string triangleCornerB: "\u017D" + readonly property string unLinked: "\u017E" + readonly property string undo: "\u017F" + readonly property string unify_medium: "\u0180" + readonly property string unpin: "\u0181" + readonly property string upDownIcon: "\u0182" + readonly property string upDownSquare2: "\u0183" + readonly property string updateAvailable_medium: "\u0184" + readonly property string updateContent_medium: "\u0185" + readonly property string upload_medium: "\u0186" + readonly property string user_medium: "\u0187" + readonly property string visibilityOff: "\u0188" + readonly property string visibilityOn: "\u0189" + readonly property string visible_medium: "\u018A" + readonly property string visible_small: "\u018B" + readonly property string warning2_medium: "\u018C" + readonly property string warning_medium: "\u018D" + readonly property string wildcard: "\u018E" + readonly property string wizardsAutomotive: "\u018F" + readonly property string wizardsDesktop: "\u0190" + readonly property string wizardsGeneric: "\u0191" + readonly property string wizardsMcuEmpty: "\u0192" + readonly property string wizardsMcuGraph: "\u0193" + readonly property string wizardsMobile: "\u0194" + readonly property string wizardsUnknown: "\u0195" + readonly property string zoomAll: "\u0196" + readonly property string zoomIn: "\u0197" + readonly property string zoomIn_medium: "\u0198" + readonly property string zoomOut: "\u0199" + readonly property string zoomOut_medium: "\u019A" + readonly property string zoomSelection: "\u019B" readonly property font iconFont: Qt.font({ family: controlIcons.name, diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/TopToolbarButtonStyle.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/TopToolbarButtonStyle.qml index 594dc033369..943707b3975 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/TopToolbarButtonStyle.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/TopToolbarButtonStyle.qml @@ -4,7 +4,6 @@ import QtQuick ControlStyle { - controlSize: Qt.size(Values.topLevelComboWidth, Values.topLevelComboHeight) borderWidth: Values.border baseIconFontSize: Values.topLevelComboIcon diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf index 485c4bbf4d7..b26e73aa2af 100644 Binary files a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf and b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf differ diff --git a/share/qtcreator/qmldesigner/toolbar/Main.qml b/share/qtcreator/qmldesigner/toolbar/Main.qml index 77cc74ed978..061b16a08b3 100644 --- a/share/qtcreator/qmldesigner/toolbar/Main.qml +++ b/share/qtcreator/qmldesigner/toolbar/Main.qml @@ -3,9 +3,11 @@ import QtQuick import QtQuick.Controls +import QtQuick.Layouts import StudioControls as StudioControls import StudioTheme as StudioTheme +import StudioWindowManager import ToolBar Rectangle { @@ -283,20 +285,293 @@ Rectangle { onCountChanged: workspaces.currentIndex = workspaces.indexOfValue(backend.currentWorkspace) } + Connections { + target: WindowManager + enabled: dvWindow.visible + + function onAboutToQuit() { + dvWindow.close() + } + + function onMainWindowVisibleChanged(value) { + if (!value) + dvWindow.close() + } + } + ToolbarButton { id: shareButton - style: StudioTheme.Values.primaryToolbarStyle - width: 96 anchors.verticalCenter: parent.verticalCenter anchors.right: moreItems.left anchors.rightMargin: 8 - iconFontFamily: StudioTheme.Constants.font.family - buttonIcon: qsTr("Share") - visible: !root.flyoutEnabled && backend.isSharingEnabled + buttonIcon: StudioTheme.Constants.share_large enabled: backend.isSharingEnabled - tooltip: shareButton.enabled ? qsTr("Share your project online.") : qsTr("Sharing your project online is disabled in the Community Version.") + tooltip: qsTr("You can share your project to Qt Design Viewer web service.

To be able to use the sharing service, you need to sign in with your Qt Account details.") - onClicked: backend.shareApplicationOnline() + checkable: true + checked: dvWindow.visible + checkedInverted: true + + onClicked: { + if (dvWindow.visible) { + dvWindow.close() + } else { + var originMapped = shareButton.mapToGlobal(0,0) + dvWindow.x = originMapped.x + shareButton.width - dvWindow.width + dvWindow.y = originMapped.y + shareButton.height + dvWindow.show() + dvWindow.requestActivate() + } + } + + Window { + id: dvWindow + + width: 300 + height: stackLayout.children[stackLayout.currentIndex].implicitHeight + + visible: false + flags: Qt.FramelessWindowHint | Qt.Tool | Qt.NoDropShadowWindowHint + modality: Qt.NonModal + transientParent: null + color: "transparent" + + onActiveFocusItemChanged: { + if (dvWindow.activeFocusItem === null && !dvWindow.active + && !shareButton.hover + && !backend.designViewerConnector.isWebViewerVisible) + dvWindow.close() + } + + onVisibleChanged: { + // if visible and logged in + // fetch user info + } + + onClosing: { + if (shareNotification.hasFinished()) + shareNotification.visible = false + } + + function formatBytes(bytes, decimals = 2) { + if (!+bytes) + return '0 Bytes' + + const k = 1024 + const dm = decimals < 0 ? 0 : decimals + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] + const i = Math.floor(Math.log(bytes) / Math.log(k)) + + return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}` + } + + Connections { + target: backend.designViewerConnector + + function onUserInfoReceived(reply: var) { + let jsonReply = JSON.parse(reply) + + loggedInPage.email = jsonReply.email + loggedInPage.license = jsonReply.license + loggedInPage.storageUsed = jsonReply.storageUsed + loggedInPage.storageLimit = jsonReply.storageLimit + } + } + + StackLayout { + id: stackLayout + + property int internalMargin: 8 + + anchors.fill: parent + currentIndex: backend.designViewerConnector.connectorStatus + + // Fetching + Rectangle { + id: fetchingPage + color: StudioTheme.Values.themePopupBackground + Layout.fillWidth: true + implicitHeight: 200 + + BusyIndicator { + anchors.centerIn: parent + running: StackView.status === StackView.Active // TODO test + } + } + + // NotLoggedIn + Rectangle { + id: notLoggedInPage + color: StudioTheme.Values.themePopupBackground + Layout.fillWidth: true + implicitHeight: menuColumn.implicitHeight + + Column { + id: menuColumn + anchors.fill: parent + padding: StudioTheme.Values.border + + MenuItemDelegate { + width: parent.width + + myText: qsTr("Sign in") + myIcon: StudioTheme.Constants.signin_medium + + onClicked: backend.designViewerConnector.login() + } + } + } + + // LoggedIn + Rectangle { + id: loggedInPage + + property string email + property string license + property var storageUsed + property var storageLimit + + color: StudioTheme.Values.themePopupBackground + + Layout.fillWidth: true + implicitHeight: loggedInPageColumn.implicitHeight + + Column { + id: loggedInPageColumn + anchors.fill: parent + padding: StudioTheme.Values.border + spacing: 0 + + MenuItemDelegate { + id: shareMenuItem + width: parent.width + + myText: qsTr("Share") + myIcon: StudioTheme.Constants.upload_medium + + onClicked: backend.designViewerConnector.uploadCurrentProject() + } + + ShareNotification { + id: shareNotification + + Connections { + target: backend.designViewerConnector + + function onProjectUploadProgress(progress: var) { + shareNotification.setProgress(progress) + } + + function onProjectUploaded() { + shareNotification.type = ShareNotification.NotificationType.Success + shareNotification.setHelperText(qsTr("Upload succeeded.")) + + shareMenuItem.enabled = true + } + + function onProjectUploadError(errorCode: int, message: string) { + shareNotification.type = ShareNotification.NotificationType.Error + shareNotification.setHelperText(qsTr("Upload failed (" + errorCode + ").")) + + shareMenuItem.enabled = true + } + + function onProjectIsPacking() { + shareNotification.type = ShareNotification.NotificationType.Indeterminate + shareNotification.setText(qsTr("Packing")) + shareNotification.visible = true + + shareMenuItem.enabled = true + } + + function onProjectPackingFailed(errorString: string) { + shareNotification.type = ShareNotification.NotificationType.Error + shareNotification.setHelperText(qsTr("Packing failed.")) + } + + function onProjectIsUploading() { + shareNotification.type = ShareNotification.NotificationType.Normal + shareNotification.setText(qsTr("Uploading")) + shareNotification.visible = true + + shareMenuItem.enabled = false + } + } + } + + MenuItemDelegate { + width: parent.width + + myText: qsTr("Manage shared projects") + myIcon: StudioTheme.Constants.openLink + + onClicked: Qt.openUrlExternally("https://designviewer-staging.qt.io/") + } + + Rectangle { + width: parent.width + height: StudioTheme.Values.height * 2 + color: StudioTheme.Values.themePanelBackground + + Row { + anchors.fill: parent + spacing: 0 + + Label { + id: iconLabel + width: StudioTheme.Values.topLevelComboHeight + height: StudioTheme.Values.topLevelComboHeight + + anchors.verticalCenter: parent.verticalCenter + + color: StudioTheme.Values.themeTextColor + font.family: StudioTheme.Constants.iconFont.family + font.pixelSize: StudioTheme.Values.topLevelComboIcon + text: StudioTheme.Constants.user_medium + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + + Column { + width: parent.width - parent.spacing - iconLabel.width - 8 // TODO 8 is the margin + anchors.verticalCenter: parent.verticalCenter + spacing: 4 + + Text { + color: StudioTheme.Values.themeTextColor + text: loggedInPage.email ?? "" + } + + RowLayout { + width: parent.width + + Text { + Layout.fillWidth: true + color: StudioTheme.Values.themeTextColor + text: loggedInPage.license ?? "" + } + + Text { + color: StudioTheme.Values.themeTextColor + text: `${dvWindow.formatBytes(loggedInPage.storageUsed)} / ${dvWindow.formatBytes(loggedInPage.storageLimit)}` + } + } + } + } + } + + MenuItemDelegate { + width: parent.width + + myText: qsTr("Sign out") + myIcon: StudioTheme.Constants.signout_medium + + onClicked: backend.designViewerConnector.logout() + } + } + } + } + } } ToolbarButton { @@ -328,8 +603,9 @@ Rectangle { id: window readonly property int padding: 6 + readonly property int morePopupWidth: Math.max(180, row.width) - width: row.width + window.padding * 2 + width: window.morePopupWidth + window.padding * 2 height: row.height + (backend.isLiteModeEnabled ? 0 : workspacesFlyout.height) + (backend.isLiteModeEnabled ? 2 : 3) * window.padding + (workspacesFlyout.popup.opened ? workspacesFlyout.popup.height : 0) @@ -411,18 +687,6 @@ Rectangle { onClicked: backend.setLockWorkspace(lockWorkspaceFlyout.checked) } - - ToolbarButton { - anchors.verticalCenter: parent.verticalCenter - style: StudioTheme.Values.primaryToolbarStyle - width: shareButton.width - iconFontFamily: StudioTheme.Constants.font.family - buttonIcon: qsTr("Share") - enabled: backend.isSharingEnabled - tooltip: shareButton.enabled ? qsTr("Share your project online.") : qsTr("Sharing your project online is disabled in the Community Version.") - - onClicked: backend.shareApplicationOnline() - } } StudioControls.ComboBox { @@ -430,7 +694,7 @@ Rectangle { anchors.horizontalCenter: parent.horizontalCenter actionIndicatorVisible: false style: StudioTheme.Values.statusbarControlStyle - width: row.width + width: window.morePopupWidth maximumPopupHeight: 400 model: workspaceModel textRole: "displayName" diff --git a/share/qtcreator/qmldesigner/toolbar/MenuItemDelegate.qml b/share/qtcreator/qmldesigner/toolbar/MenuItemDelegate.qml index 674045bb3bc..1edc8711970 100644 --- a/share/qtcreator/qmldesigner/toolbar/MenuItemDelegate.qml +++ b/share/qtcreator/qmldesigner/toolbar/MenuItemDelegate.qml @@ -14,8 +14,8 @@ T.ItemDelegate { property alias myIcon: iconLabel.text property alias myText: textLabel.text - //width: root.menuWidth - 2 * window.padding - //height: root.style.controlSize.height// - 2 * root.style.borderWidth + implicitWidth: root.style.controlSize.width + implicitHeight: root.style.controlSize.height contentItem: Row { id: row @@ -40,7 +40,6 @@ T.ItemDelegate { font.pixelSize: root.style.baseIconFontSize verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter - text: StudioTheme.Constants.playOutline_medium } T.Label { @@ -68,8 +67,6 @@ T.ItemDelegate { background: Rectangle { id: rootBackground - x: 0 - y: 0 width: root.width height: root.height opacity: enabled ? 1 : 0.3 diff --git a/share/qtcreator/qmldesigner/toolbar/ShareNotification.qml b/share/qtcreator/qmldesigner/toolbar/ShareNotification.qml new file mode 100644 index 00000000000..d8743e38fba --- /dev/null +++ b/share/qtcreator/qmldesigner/toolbar/ShareNotification.qml @@ -0,0 +1,203 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import QtQuick.Templates as T + +import StudioControls as StudioControls +import StudioTheme as StudioTheme + +Item { + id: root + + enum NotificationType { + Normal, + Indeterminate, + Success, + Error + } + + property int type: ShareNotification.NotificationType.Normal + + width: parent.width + height: StudioTheme.Values.height * 2 + visible: false + + function setText(value: string) { + label.text = value + } + + function setHelperText(value: string) { + helperText.text = value + } + + function setProgress(value: var) { + helperText.text = `${value.toFixed(0)} %` + progressBar.value = value / 100.0 + } + + function hasFinished() { + return root.type === ShareNotification.NotificationType.Success + || root.type === ShareNotification.NotificationType.Error + } + + Column { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.margins: 8 + spacing: 4 + + RowLayout { + width: parent.width + + Text { + id: label + Layout.fillWidth: true + color: StudioTheme.Values.themeTextColor + } + + Item { + implicitWidth: StudioTheme.Values.controlLabelWidth + implicitHeight: StudioTheme.Values.controlLabelWidth + + Label { + id: statusIcon + anchors.fill: parent + color: StudioTheme.Values.themeIconColor + font.family: StudioTheme.Constants.iconFont.family + font.pixelSize: StudioTheme.Values.myIconFontSize + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + + StudioControls.ToolTipArea { + anchors.fill: parent + text: qsTr("This can be your message.") + } + } + } + + T.ProgressBar { + id: progressBar + + property color color + + width: parent.width + height: 8 + + value: 0.5 + + background: Rectangle { + id: track + implicitWidth: 200 + implicitHeight: 6 + color: StudioTheme.Values.themeScrollBarTrack + } + + contentItem: Item { + implicitWidth: 200 + implicitHeight: 6 + clip: true + + // Progress indicator for determinate state. + Rectangle { + id: barIndicator + width: progressBar.visualPosition * parent.width + height: parent.height + color: progressBar.color + visible: !progressBar.indeterminate + } + + // Scrolling animation for indeterminate state. + Rectangle { + id: barIndicatorIndeterminate + width: parent.width * 0.5 + height: parent.height + color: progressBar.color + visible: progressBar.indeterminate + + XAnimator on x { + duration: 650 + from: -barIndicatorIndeterminate.width + to: progressBar.width + loops: Animation.Infinite + running: progressBar.indeterminate + } + } + } + } + + Text { + id: helperText + color: StudioTheme.Values.themeTextColor + } + } + + states: [ + State { + name: "normal" + when: root.type === ShareNotification.NotificationType.Normal + + PropertyChanges { + target: progressBar + color: StudioTheme.Values.themeInteraction + indeterminate: false + } + PropertyChanges { + target: statusIcon + visible: false + } + }, + State { + name: "error" + when: root.type === ShareNotification.NotificationType.Error + + PropertyChanges { + target: progressBar + color: StudioTheme.Values.themeRedLight + indeterminate: false + value: 1 + } + PropertyChanges { + target: statusIcon + visible: true + color: StudioTheme.Values.themeRedLight + text: StudioTheme.Constants.error_medium + } + }, + State { + name: "success" + when: root.type === ShareNotification.NotificationType.Success + + PropertyChanges { + target: progressBar + color: StudioTheme.Values.themeGreenLight + indeterminate: false + value: 1 + } + PropertyChanges { + target: statusIcon + visible: true + color: StudioTheme.Values.themeGreenLight + text: StudioTheme.Constants.apply_medium + } + }, + State { + name: "indeterminate" + when: root.type === ShareNotification.NotificationType.Indeterminate + + PropertyChanges { + target: progressBar + color: StudioTheme.Values.themeInteraction + indeterminate: true + } + PropertyChanges { + target: statusIcon + visible: false + } + } + ] +} diff --git a/src/plugins/qmldesigner/components/componentcore/theme.h b/src/plugins/qmldesigner/components/componentcore/theme.h index 3afb0ae83c4..82ff73aa114 100644 --- a/src/plugins/qmldesigner/components/componentcore/theme.h +++ b/src/plugins/qmldesigner/components/componentcore/theme.h @@ -173,6 +173,7 @@ public: fitSelected_small, fitSelection_medium, fitToView_medium, + flag_medium, flowAction, flowTransition, fontStyleBold, @@ -230,6 +231,7 @@ public: newMaterial, nextFile_large, normalBar_small, + number_medium, openLink, openMaterialBrowser, orientation, @@ -305,7 +307,10 @@ public: selectParent_small, selection_small, settings_medium, + share_large, signal_small, + signin_medium, + signout_medium, snapping_conf_medium, snapping_medium, snapping_small, @@ -321,6 +326,7 @@ public: startNode, step_medium, stop_medium, + string_medium, tableView_medium, testIcon, textAlignBottom, @@ -370,6 +376,8 @@ public: upDownSquare2, updateAvailable_medium, updateContent_medium, + upload_medium, + user_medium, visibilityOff, visibilityOn, visible_medium, diff --git a/src/plugins/qmldesigner/components/designviewer/dvconnector.cpp b/src/plugins/qmldesigner/components/designviewer/dvconnector.cpp index a4f32d6cf10..610fb913359 100644 --- a/src/plugins/qmldesigner/components/designviewer/dvconnector.cpp +++ b/src/plugins/qmldesigner/components/designviewer/dvconnector.cpp @@ -11,6 +11,8 @@ #include #include +#include + #include #include #include @@ -115,10 +117,12 @@ DVConnector::DVConnector(QObject *parent) m_webEngineProfile.reset(new QWebEngineProfile("DesignViewer", this)); m_webEngineProfile->setPersistentCookiesPolicy(QWebEngineProfile::ForcePersistentCookies); m_webEnginePage.reset(new CustomWebEnginePage(m_webEngineProfile.data(), this)); - m_webEngineView.reset(new QWebEngineView); + m_webEngineView.reset(new QWebEngineView(Core::ICore::instance()->dialogParent())); m_webEngineView->setPage(m_webEnginePage.data()); m_webEngineView->resize(1024, 750); + m_webEngineView->setWindowFlag(Qt::Dialog); m_webEngineView->installEventFilter(this); + m_webEngineView->hide(); m_networkCookieJar.reset( new CustomCookieJar(this, m_webEngineProfile->persistentStoragePath() + "/dv_cookies.txt")); @@ -284,7 +288,8 @@ void DVConnector::uploadProject(const QString &projectId, const QString &filePat &QNetworkReply::uploadProgress, this, [this](qint64 bytesSent, qint64 bytesTotal) { - emit projectUploadProgress(100.0 * (double) bytesSent / (double) bytesTotal); + if (bytesTotal != 0) + emit projectUploadProgress(100.0 * (double) bytesSent / (double) bytesTotal); }); evaluatorData.connectCallbacks(this); } @@ -592,6 +597,7 @@ void DVConnector::login() qCDebug(deploymentPluginLog) << "Logging in"; m_webEnginePage->load(QUrl(DVEndpoints::serviceUrl + DVEndpoints::login)); m_webEngineView->show(); + m_webEngineView->raise(); } void DVConnector::logout() diff --git a/src/plugins/qmldesigner/components/designviewer/dvconnector.h b/src/plugins/qmldesigner/components/designviewer/dvconnector.h index 5ffd0eebf9a..52d81c05ec4 100644 --- a/src/plugins/qmldesigner/components/designviewer/dvconnector.h +++ b/src/plugins/qmldesigner/components/designviewer/dvconnector.h @@ -59,7 +59,7 @@ public: bool isWebViewerVisible() const; void projectList(); - void uploadCurrentProject(); + Q_INVOKABLE void uploadCurrentProject(); void uploadProject(const QString &projectId, const QString &filePath); void deleteProject(const QString &projectId); void downloadProject(const QString &projectId, const QString &filePath); @@ -78,9 +78,9 @@ public: void downloadSharedProject(const QString &projectId, const QString &filePath); void downloadSharedProjectThumbnail(const QString &projectId, const QString &filePath); - void login(); - void logout(); - void fetchUserInfo(); + Q_INVOKABLE void login(); + Q_INVOKABLE void logout(); + Q_INVOKABLE void fetchUserInfo(); private: // network diff --git a/src/plugins/qmldesigner/components/designviewer/resourcegeneratorproxy.cpp b/src/plugins/qmldesigner/components/designviewer/resourcegeneratorproxy.cpp index 1e7235c2283..8f59d7f5891 100644 --- a/src/plugins/qmldesigner/components/designviewer/resourcegeneratorproxy.cpp +++ b/src/plugins/qmldesigner/components/designviewer/resourcegeneratorproxy.cpp @@ -37,7 +37,7 @@ void ResourceGeneratorProxy::createResourceFileAsync(const QString &projectName) m_future = QtConcurrent::run([&]() { const std::optional filePath = createResourceFileSync(projectName); - if (filePath->isEmpty()) { + if (!filePath || filePath->isEmpty()) { emit errorOccurred("Failed to create resource file"); return; } diff --git a/src/plugins/qmldesigner/components/toolbar/toolbarbackend.cpp b/src/plugins/qmldesigner/components/toolbar/toolbarbackend.cpp index d2901de4597..276747fbb72 100644 --- a/src/plugins/qmldesigner/components/toolbar/toolbarbackend.cpp +++ b/src/plugins/qmldesigner/components/toolbar/toolbarbackend.cpp @@ -510,6 +510,12 @@ void ToolBarBackend::registerDeclarativeType() "RunManager shouldn't be instantiated."); qmlRegisterUncreatableType( "ToolBar", 1, 0, "DeviceManagerModel", "DeviceManagerModel shouldn't be instantiated."); + + qmlRegisterUncreatableType("ToolBar", + 1, + 0, + "DVConnector", + "DVConnector shouldn't be instantiated."); } void ToolBarBackend::triggerModeChange() @@ -896,6 +902,11 @@ int ToolBarBackend::runManagerState() const return QmlDesignerPlugin::runManager().state(); } +DesignViewer::DVConnector *ToolBarBackend::designViewerConnector() +{ + return &m_designViewerConnector; +} + void ToolBarBackend::launchGlobalAnnotations() { QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_TOOLBAR_EDIT_GLOBAL_ANNOTATION); diff --git a/src/plugins/qmldesigner/components/toolbar/toolbarbackend.h b/src/plugins/qmldesigner/components/toolbar/toolbarbackend.h index dc9a4c4de7a..71f83438806 100644 --- a/src/plugins/qmldesigner/components/toolbar/toolbarbackend.h +++ b/src/plugins/qmldesigner/components/toolbar/toolbarbackend.h @@ -6,6 +6,8 @@ #include #include +#include + namespace QmlDesigner { class ActionInterface; @@ -126,6 +128,8 @@ class ToolBarBackend : public QObject Q_PROPERTY(int runTargetIndex READ runTargetIndex NOTIFY runTargetIndexChanged) Q_PROPERTY(int runManagerState READ runManagerState NOTIFY runManagerStateChanged) + Q_PROPERTY(DesignViewer::DVConnector *designViewerConnector READ designViewerConnector CONSTANT) + public: ToolBarBackend(QObject *parent = nullptr); static void registerDeclarativeType(); @@ -186,6 +190,8 @@ public: int runTargetIndex() const; int runManagerState() const; + DesignViewer::DVConnector *designViewerConnector(); + static void launchGlobalAnnotations(); signals: @@ -218,6 +224,7 @@ private: QStringList m_openDocuments; QMetaObject::Connection m_kitConnection; + DesignViewer::DVConnector m_designViewerConnector; }; } // namespace QmlDesigner