diff options
author | Tim Jenssen <tim.jenssen@qt.io> | 2021-12-01 17:56:12 +0100 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2021-12-01 16:56:37 +0000 |
commit | 4710d765b22bc1ee4657fd346b92ec098f7c4c09 (patch) | |
tree | 2103e9d2e25ce39a5b234ef45b927aa710d42235 | |
parent | bbb7a8fe4e99d5f4a31a4c6c115ccefd288fc933 (diff) | |
parent | 38b2bb9fb2fbc0d764605c9a103ff58ea26c2d61 (diff) | |
download | qt-creator-4710d765b22bc1ee4657fd346b92ec098f7c4c09.tar.gz |
Merge remote-tracking branch 'origin/6.0' into qds-2.3
Change-Id: I67a01bae763ef723a88bf4cb94ef29c713eaa743
32 files changed, 693 insertions, 517 deletions
diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc index e3209835c0..6a4dc9bf92 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc @@ -55,10 +55,12 @@ \image qtcreator-build-environment.png "Build Environment" - \note The changes are stored in the local project specific \c{.pro.user} - file. Therefore, they are not suitable for sharing between developers or - development PCs. To share settings, incorporate them into the build system. - For example, if you use qmake, make the changes in the \c{.pro} file. + The changes are stored in the local project specific \c{CMakeLists.txt.user} + or \c{.pro.user} file, depending on the build system you use. Therefore, + they are not suitable for sharing between developers or development PCs. To + share settings, incorporate them into the build system. For example, if you + use CMake, make the changes in the \c {CMakeLists.txt} file, and if you use + qmake, make the changes in the \c{.pro} file. \section1 Batch Editing diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index 2af504a69d..2d154021cf 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -32,7 +32,7 @@ /*! \page creator-quick-tour.html \if defined(qtdesignstudio) - \previouspage {Your First UI} + \previouspage {Tutorials} \else \previouspage creator-overview.html \endif diff --git a/doc/qtdesignstudio/examples/doc/loginui1.qdoc b/doc/qtdesignstudio/examples/doc/loginui1.qdoc index 0165817ad6..31e1ebb549 100644 --- a/doc/qtdesignstudio/examples/doc/loginui1.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui1.qdoc @@ -25,7 +25,6 @@ /*! \example loginui1 - \ingroup studioexamples \ingroup gstutorials \nextpage {Log In UI - Positioning} diff --git a/doc/qtdesignstudio/examples/doc/loginui2.qdoc b/doc/qtdesignstudio/examples/doc/loginui2.qdoc index 0a74a67f85..6ff8b2f542 100644 --- a/doc/qtdesignstudio/examples/doc/loginui2.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui2.qdoc @@ -25,7 +25,6 @@ /*! \example loginui2 - \ingroup studioexamples \ingroup gstutorials \previouspage {Log In UI - Components} \nextpage {Log In UI - States} diff --git a/doc/qtdesignstudio/examples/doc/loginui3.qdoc b/doc/qtdesignstudio/examples/doc/loginui3.qdoc index a7a919319c..d04690b224 100644 --- a/doc/qtdesignstudio/examples/doc/loginui3.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui3.qdoc @@ -25,7 +25,6 @@ /*! \example loginui3 - \ingroup studioexamples \ingroup gstutorials \title Log In UI - States diff --git a/doc/qtdesignstudio/examples/doc/loginui4.qdoc b/doc/qtdesignstudio/examples/doc/loginui4.qdoc index b88c122558..5c8bdca033 100644 --- a/doc/qtdesignstudio/examples/doc/loginui4.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui4.qdoc @@ -25,7 +25,6 @@ /*! \example loginui4 - \ingroup studioexamples \ingroup gstutorials \title Log In UI - Timeline @@ -324,5 +323,5 @@ \section1 Next Steps - For more examples about using timelines, see \l{Examples and Tutorials}. + For more examples about using timelines, see \l{Examples}. */ diff --git a/doc/qtdesignstudio/src/overviews/qtquick-uis.qdoc b/doc/qtdesignstudio/src/overviews/qtquick-uis.qdoc index 3cb66337fc..4b626c46e0 100644 --- a/doc/qtdesignstudio/src/overviews/qtquick-uis.qdoc +++ b/doc/qtdesignstudio/src/overviews/qtquick-uis.qdoc @@ -26,7 +26,7 @@ /*! \page quick-uis.html \if defined(qtdesignstudio) - \previouspage {Examples and Tutorials} + \previouspage {Examples} \nextpage studio-app-flows.html \else \previouspage qtquick-text-editor.html diff --git a/doc/qtdesignstudio/src/qtdesignstudio-examples.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-examples.qdoc index d2b7a7e9dd..f80f66dc38 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-examples.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-examples.qdoc @@ -27,43 +27,29 @@ \previouspage studio-terms.html \group studioexamples \nextpage quick-uis.html - \title Examples and Tutorials + \title Examples - In the \uicontrol Welcome mode, you can open examples and tutorials that - illustrate how to use \QDS. Some examples are delivered together with - \QDS and have been documented, while you can download and install others - for previewing them on the desktop. - - \section1 Video Tutorials - - The \uicontrol Tutorials tab contains links to video tutorials that provide - more information about \QDS. To watch a tutorial on YouTube, select it in - the tab. - - \include qtbridge-tutorial-links.qdocinc qtsketchbridge tutorials - - \section1 Examples for Downloading - - The \uicontrol Examples tab lists complex example applications for - downloading that demonstrate what you can accomplish with \QDS. + \QDS comes with a set of example projects. To see these, select \uicontrol + Examples on the \uicontrol Welcome page when you run \QDS. \image studio-examples-download.png "Examples for download in Welcome mode" - To download the examples and open them in \QDS: + To run an example project: + \list 1 + \li Select the example. + \li Select the \inlineimage live_preview.png + (\uicontrol {Show Live Preview}) button to preview the example. + \endlist + Some of the example projects require that you download them before you can run them, to do this: \list 1 - \li Select an example. - \li Select \uicontrol {Start Download} to download the example source - files. - \li Select the folder where the source files will be installed. - \li Select \uicontrol Continue to install the files. - \li Select \uicontrol Open to open the example in \QDS. - \li Select the \inlineimage live_preview.png - (\uicontrol {Show Live Preview}) button to preview the example. + \li Select an example. + \li Select \uicontrol {Start Download}. + \li Select the folder where the source files will be installed. + \li Select \uicontrol Continue to install the files. + \li Select \uicontrol Open to open the example in \QDS. \endlist - \section1 Documented Examples + \section1 Example Documentation - The \uicontrol Examples tab lists documented examples of using \QDS. To - open an example in \QDS, select it in the tab. */ diff --git a/doc/qtdesignstudio/src/qtdesignstudio-faq.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-faq.qdoc index 0e802ebcc7..97981f16bc 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-faq.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-faq.qdoc @@ -34,7 +34,7 @@ grouped by categories. You might also find answers to your questions in the product documentation by searching or browsing the index in the \l{Using the Help Mode}{Help mode}. Many questions are also answered by the - \l{Examples and Tutorials}{examples and video tutorials}. + \l{Examples}{examples} and \l{Tutorials}{video tutorials}. \list \li \l {FAQ - \QB}{\QB} diff --git a/doc/qtdesignstudio/src/qtdesignstudio-getting-started.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-getting-started.qdoc index 58dbd20203..6ad323da3e 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-getting-started.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-getting-started.qdoc @@ -47,10 +47,10 @@ \QDS is available either as a standalone installation package or as an option in the Qt online installer. - \li \l {Your First UI} + \li \l {Tutorials} - Follow a set of hands-on tutorials that build on each other to - design your first animated UI using preset and custom components. + Follow a set of hands-on tutorials that illustrate how to use the + features of \QDS. \li \l {User Interface} Describes the parts and basic features of \QDS. @@ -71,7 +71,7 @@ \li \l{Concepts and Terms} Describes main \QDS concepts and terms. - \li \l{Examples and Tutorials} + \li \l{Examples} A set of examples available in the \uicontrol Welcome mode illustrates how to use \QDS features such as the timeline. diff --git a/doc/qtdesignstudio/src/qtdesignstudio-installation.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-installation.qdoc index 701b84d30c..a896a1ded6 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-installation.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-installation.qdoc @@ -26,7 +26,7 @@ /*! \page studio-installation.html \previouspage studio-getting-started.html - \nextpage {Your First UI} + \nextpage {Tutorials} \title Installation @@ -42,8 +42,8 @@ package \l{https://www.qt.io/product/ui-design-tools}{here}. After the installation, you can start exploring \QDS by following - tutorials to \l{Your First UI}{create your first UI}, opening - \l{Examples and Tutorials}{examples}, watching videos, and reading + \l{Tutorials}{tutorials}, opening + \l{Examples}{examples}, watching videos, and reading this manual. \section1 Stand-Alone Installation diff --git a/doc/qtdesignstudio/src/qtdesignstudio-terms.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-terms.qdoc index a1b163bc21..c05618ee0c 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-terms.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-terms.qdoc @@ -26,7 +26,7 @@ /*! \page studio-terms.html \previouspage studio-use-cases.html - \nextpage {Examples and Tutorials} + \nextpage {Examples} \title Concepts and Terms diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index 52ba391531..cd6982b100 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -31,7 +31,7 @@ \li \l{Getting Started} \list \li \l{Installation} - \li \l{Your First UI} + \li \l{Tutorials} \li \l{User Interface} \list \li \l{Selecting Modes} @@ -59,7 +59,7 @@ \li \l{Creating Projects} \li \l{Use Cases} \li \l{Concepts and Terms} - \li \l{Examples and Tutorials} + \li \l{Examples} \endlist \li \l{Wireframing} \list diff --git a/doc/qtdesignstudio/src/qtdesignstudio-tutorials.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-tutorials.qdoc index 331e84185a..0ff5137f58 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-tutorials.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-tutorials.qdoc @@ -28,14 +28,22 @@ \previouspage studio-installation.html \nextpage creator-quick-tour.html - \title Your First UI + \title Tutorials \image loginui4.gif "Log In UI" - You can follow a set of hands-on tutorials that build on each other to + \section1 Video Tutorials + + When you run \QDS, the \uicontrol Tutorials tab in \uicontrol Welcome mode contains links + to video tutorials. To watch a tutorial on YouTube, + select it. + + \section1 Written Tutorials + + You can follow a set of hands-on tutorials that illustrate how to use the features of \QDS. Even if you plan to export your - designs from a design tool, it is useful to first create a small UI from - scratch to learn to use \QDS. In particular, \e {Log In UI - Components} + designs from a design tool, it is useful to go through tutorials to learn to + use \QDS. In particular, \l {Log In UI - Components} describes the terms and concepts that you will run into when exporting designs with \QB. @@ -43,8 +51,8 @@ yourself with the parts of \QDS in general, and the \uicontrol Design mode in particular: \l{User Interface} and \l{Design Views}. - In addition to these entry-level tutorials, \QDS comes with examples - and video tutorials that you can open from the \uicontrol Examples and - \uicontrol Tutorials tabs in the \uicontrol Welcome mode. For more - information, see \l {Examples and Tutorials}. + In addition to these tutorials, \QDS comes with examples that you can open + from the \uicontrol Examples and tabs in the \uicontrol Welcome mode. For more + information, see \l {Examples}. + */ diff --git a/doc/qtdesignstudio/src/qtdesignstudio.qdoc b/doc/qtdesignstudio/src/qtdesignstudio.qdoc index e97a0cbf6a..a64c5e95be 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio.qdoc @@ -48,12 +48,12 @@ \li \b {\l{Getting Started}} \list \li \l{Installation} - \li \l{Your First UI} + \li \l{Tutorials} \li \l{User Interface} \li \l{Creating Projects} \li \l{Use Cases} \li \l{Concepts and Terms} - \li \l{Examples and Tutorials} + \li \l{Examples} \endlist \li \b {\l{Wireframing}} \list diff --git a/share/qtcreator/qmldesigner/newprojectdialog/NewProjectDialog.qml b/share/qtcreator/qmldesigner/newprojectdialog/NewProjectDialog.qml index 86234bf5ba..eb0cb21adf 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/NewProjectDialog.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/NewProjectDialog.qml @@ -34,6 +34,7 @@ import StudioControls as SC import NewProjectDialog Item { + id: rootDialog width: DialogValues.dialogWidth height: DialogValues.dialogHeight @@ -47,38 +48,53 @@ Item { Layout.alignment: Qt.AlignHCenter spacing: 0 + Item { width: parent.width; height: 20 } // spacer + Item { // Header Item Layout.fillWidth: true - implicitHeight: 218 + implicitHeight: 164 - Column { + ColumnLayout { anchors.fill: parent - Item { width: parent.width; height: 74 } // spacer - - Text { - text: qsTr("Welcome to Qt Design Studio. Let's Create Something Wonderful!") - font.pixelSize: 32 + Item { width: parent.width; implicitHeight: 20 } // spacer + Row { width: parent.width - height: 47 - lineHeight: 49 - lineHeightMode: Text.FixedHeight - color: DialogValues.textColor - horizontalAlignment: Text.AlignHCenter - } + height: DialogValues.dialogTitleTextHeight + Layout.alignment: Qt.AlignHCenter + Text { + text: qsTr("Welcome to ") + font.pixelSize: DialogValues.dialogTitlePixelSize + font.family: "Titillium Web" + height: DialogValues.dialogTitleTextHeight + lineHeight: DialogValues.dialogTitleLineHeight + lineHeightMode: Text.FixedHeight + color: DialogValues.textColor + } - Item { width: parent.width; height: 11 } // spacer + Text { + text: qsTr("Qt Design Studio") + font.pixelSize: DialogValues.dialogTitlePixelSize + font.family: "Titillium Web" + height: DialogValues.dialogTitleTextHeight + lineHeight: DialogValues.dialogTitleLineHeight + lineHeightMode: Text.FixedHeight + color: DialogValues.textColorInteraction + } + } Text { width: parent.width - text: qsTr("Get started by selecting from Presets or start from empty screen. You may also include your design file.") + text: qsTr("Create new project by selecting a suitable Preset and then adjust details.") color: DialogValues.textColor font.pixelSize: DialogValues.paneTitlePixelSize lineHeight: DialogValues.paneTitleLineHeight lineHeightMode: Text.FixedHeight - horizontalAlignment: Text.AlignHCenter + Layout.alignment: Qt.AlignHCenter } - } + + Item { width: parent.width; Layout.fillHeight: true} // spacer + } // ColumnLayout } // Header Item Item { // Content Item @@ -96,7 +112,7 @@ Item { Layout.fillWidth: true Layout.fillHeight: true Layout.minimumWidth: 379 // figured out this number visually - Layout.minimumHeight: 326 // figured out this number visually + Layout.minimumHeight: 261 // figured out this number visually Column { x: DialogValues.defaultPadding // left padding @@ -106,19 +122,86 @@ Item { Text { text: qsTr("Presets") width: parent.width + height: 47 font.weight: Font.DemiBold font.pixelSize: DialogValues.paneTitlePixelSize lineHeight: DialogValues.paneTitleLineHeight lineHeightMode: Text.FixedHeight color: DialogValues.textColor + verticalAlignment: Qt.AlignVCenter } + Rectangle { // TabBar + readonly property int animDur: 500 + id: samTabRect + x: 10 // left padding + width: parent.width - 64 // right padding + height: DialogValues.projectViewHeaderHeight + color: DialogValues.lightPaneColor + + Row { + id: tabBarRow + spacing: 20 + property int currIndex: 0 + + Repeater { + model: categoryModel + Text { + text: name + font.weight: Font.DemiBold + font.pixelSize: DialogValues.viewHeaderPixelSize + verticalAlignment: Text.AlignVCenter + color: tabBarRow.currIndex === index ? DialogValues.textColorInteraction + : DialogValues.textColor + Behavior on color { ColorAnimation { duration: samTabRect.animDur } } + + MouseArea { + anchors.fill: parent + onClicked: { + tabBarRow.currIndex = index + projectModel.setPage(index) + projectViewId.currentIndex = 0 + projectViewId.currentIndexChanged() + + strip.x = parent.x + strip.width = parent.width + } + } + + } // Text + } // Repeater + } // tabBarRow + + Rectangle { + id: strip + width: tabBarRow.children[0].width + height: 5 + radius: 2 + color: DialogValues.textColorInteraction + anchors.bottom: parent.bottom + + Behavior on x { SmoothedAnimation { duration: samTabRect.animDur } } + Behavior on width { SmoothedAnimation { duration: strip.width === 0 ? 0 : samTabRect.animDur } } // do not animate initial width + } + } // Rectangle + NewProjectView { id: projectViewId x: 10 // left padding width: parent.width - 64 // right padding height: DialogValues.projectViewHeight loader: projectDetailsLoader + + Connections { + target: rootDialog + function onHeightChanged() { + if (rootDialog.height < 700) { // 700 = minimum height big dialog + projectViewId.height = DialogValues.projectViewHeight / 2 + } else { + projectViewId.height = DialogValues.projectViewHeight + } + } + } } Item { height: 5; width: parent.width } @@ -158,32 +241,46 @@ Item { Item { Layout.fillWidth: true } - SC.AbstractButton { - implicitWidth: DialogValues.dialogButtonWidth - width: DialogValues.dialogButtonWidth - visible: true - buttonIcon: qsTr("Cancel") - iconSize: DialogValues.defaultPixelSize - iconFont: StudioTheme.Constants.font + Item { // Dialog Button Box + width: DialogValues.stylesPaneWidth + height: parent.height - onClicked: { - dialogBox.reject(); - } - } + RowLayout { + width: DialogValues.stylesPaneWidth + implicitWidth: DialogValues.stylesPaneWidth + implicitHeight: parent.height + + SC.AbstractButton { + implicitWidth: DialogValues.dialogButtonWidth + width: DialogValues.dialogButtonWidth + visible: true + buttonIcon: qsTr("Cancel") + iconSize: DialogValues.defaultPixelSize + iconFont: StudioTheme.Constants.font + + onClicked: { + dialogBox.reject(); + } + } + + Item { Layout.fillWidth: true } + + SC.AbstractButton { + implicitWidth: DialogValues.dialogButtonWidth + width: DialogValues.dialogButtonWidth + visible: true + buttonIcon: qsTr("Create") + iconSize: DialogValues.defaultPixelSize + enabled: dialogBox.fieldsValid + iconFont: StudioTheme.Constants.font + + onClicked: { + dialogBox.accept(); + } + } + } // RowLayout + } // Dialog Button Box - SC.AbstractButton { - implicitWidth: DialogValues.dialogButtonWidth - width: DialogValues.dialogButtonWidth - visible: true - buttonIcon: qsTr("Create") - iconSize: DialogValues.defaultPixelSize - enabled: dialogBox.fieldsValid - iconFont: StudioTheme.Constants.font - - onClicked: { - dialogBox.accept(); - } - } Item { implicitWidth: 35 - DialogValues.defaultPadding } } // RowLayout } // Footer diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml index 9c4f259648..d622253a68 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml @@ -49,358 +49,385 @@ Item { Item { x: DialogValues.detailsPanePadding // left padding width: parent.width - DialogValues.detailsPanePadding * 2 // right padding + height: parent.height Column { anchors.fill: parent spacing: DialogValues.defaultPadding Text { + id: detailsHeading text: qsTr("Details") + height: DialogValues.dialogTitleTextHeight width: parent.width; font.weight: Font.DemiBold font.pixelSize: DialogValues.paneTitlePixelSize lineHeight: DialogValues.paneTitleLineHeight lineHeightMode: Text.FixedHeight color: DialogValues.textColor + verticalAlignment: Qt.AlignVCenter } - SC.TextField { - id: projectNameTextField - actionIndicatorVisible: false - translationIndicatorVisible: false - text: dialogBox.projectName + Flickable { width: parent.width - color: DialogValues.textColor - selectByMouse: true + height: parent.height - detailsHeading.height - DialogValues.defaultPadding - onEditingFinished: { - text = text.charAt(0).toUpperCase() + text.slice(1) - } + contentWidth: parent.width + contentHeight: scrollContent.height + boundsBehavior: Flickable.StopAtBounds + clip: true - font.pixelSize: DialogValues.paneTitlePixelSize - } + ScrollBar.vertical: ScrollBar { + implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding) + implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, + implicitContentHeight + topPadding + bottomPadding) - Binding { - target: dialogBox - property: "projectName" - value: projectNameTextField.text - } + property bool scrollBarVisible: parent.childrenRect.height > parent.height - Item { width: parent.width; height: DialogValues.narrowSpacing(11) } + minimumSize: orientation == Qt.Horizontal ? height / width : width / height - RowLayout { // Project location - width: parent.width + orientation: Qt.Vertical + policy: scrollBarVisible ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff + x: parent.width - width + y: 0 + height: parent.availableHeight + - (parent.bothVisible ? parent.horizontalThickness : 0) + padding: 0 - SC.TextField { - Layout.fillWidth: true - id: projectLocationTextField - actionIndicatorVisible: false - translationIndicatorVisible: false - text: dialogBox.projectLocation - color: DialogValues.textColor - selectByMouse: true - font.pixelSize: DialogValues.defaultPixelSize - } - - Binding { - target: dialogBox - property: "projectLocation" - value: projectLocationTextField.text - } - - SC.AbstractButton { - implicitWidth: 30 - iconSize: 20 - visible: true - buttonIcon: "…" - iconFont: StudioTheme.Constants.font - - onClicked: { - var newLocation = dialogBox.chooseProjectLocation() - if (newLocation) - projectLocationTextField.text = newLocation + background: Rectangle { + color: StudioTheme.Values.themeScrollBarTrack } - } // SC.AbstractButton - } // Project location RowLayout - Item { width: parent.width; height: DialogValues.narrowSpacing(7) } + contentItem: Rectangle { + implicitWidth: StudioTheme.Values.scrollBarThickness + color: StudioTheme.Values.themeScrollBarHandle + } + } // ScrollBar - RowLayout { // StatusMessage - width: parent.width - spacing: 0 - - Image { - id: statusIcon - Layout.alignment: Qt.AlignTop - asynchronous: false - } - - Text { - id: statusMessage - text: dialogBox.statusMessage - font.pixelSize: DialogValues.defaultPixelSize - lineHeight: DialogValues.defaultLineHeight - lineHeightMode: Text.FixedHeight - color: DialogValues.textColor - wrapMode: Text.Wrap - elide: Text.ElideRight - maximumLineCount: 3 - Layout.fillWidth: true - - states: [ - State { - name: "warning" - when: dialogBox.statusType === "warning" - PropertyChanges { - target: statusMessage - color: DialogValues.textWarning - } - PropertyChanges { - target: statusIcon - source: "image://newprojectdialog_library/status-warning" - } - }, - - State { - name: "error" - when: dialogBox.statusType === "error" - PropertyChanges { - target: statusMessage - color: DialogValues.textError - } - PropertyChanges { - target: statusIcon - source: "image://newprojectdialog_library/status-error" - } + Column { + id: scrollContent + width: parent.width - DialogValues.detailsPanePadding + height: DialogValues.detailsScrollableContentHeight + spacing: DialogValues.defaultPadding + + SC.TextField { + id: projectNameTextField + actionIndicatorVisible: false + translationIndicatorVisible: false + text: dialogBox.projectName + width: parent.width + color: DialogValues.textColor + selectByMouse: true + + onEditingFinished: { + text = text.charAt(0).toUpperCase() + text.slice(1) } - ] - } // Text - } // RowLayout - - SC.CheckBox { - id: defaultLocationCheckbox - actionIndicatorVisible: false - text: qsTr("Use as default project location") - checked: false - font.pixelSize: DialogValues.defaultPixelSize - } - Binding { - target: dialogBox - property: "saveAsDefaultLocation" - value: defaultLocationCheckbox.checked - } + font.pixelSize: DialogValues.defaultPixelSize + } - Rectangle { width: parent.width; height: 1; color: DialogValues.dividerlineColor } + Binding { + target: dialogBox + property: "projectName" + value: projectNameTextField.text + } - SC.ComboBox { // Screen Size ComboBox - id: screenSizeComboBox - actionIndicatorVisible: false - currentIndex: -1 - model: screenSizeModel - textRole: "display" - width: parent.width - font.pixelSize: DialogValues.defaultPixelSize + Item { width: parent.width; height: DialogValues.narrowSpacing(11) } - onActivated: (index) => { - dialogBox.setScreenSizeIndex(index); + RowLayout { // Project location + width: parent.width - var size = screenSizeModel.screenSizes(index); - widthField.realValue = size.width; - heightField.realValue = size.height; - } + SC.TextField { + Layout.fillWidth: true + id: projectLocationTextField + actionIndicatorVisible: false + translationIndicatorVisible: false + text: dialogBox.projectLocation + color: DialogValues.textColor + selectByMouse: true + font.pixelSize: DialogValues.defaultPixelSize + } - Connections { - target: screenSizeModel - function onModelReset() { - var newIndex = screenSizeComboBox.currentIndex > -1 - ? screenSizeComboBox.currentIndex - : dialogBox.screenSizeIndex() + Binding { + target: dialogBox + property: "projectLocation" + value: projectLocationTextField.text + } - screenSizeComboBox.currentIndex = newIndex - screenSizeComboBox.activated(newIndex) - } - } - } // Screen Size ComboBox + SC.AbstractButton { + implicitWidth: 30 + iconSize: 20 + visible: true + buttonIcon: "…" + iconFont: StudioTheme.Constants.font + + onClicked: { + var newLocation = dialogBox.chooseProjectLocation() + if (newLocation) + projectLocationTextField.text = newLocation + } + } // SC.AbstractButton + } // Project location RowLayout - GridLayout { // orientation + width + height - width: parent.width - height: 85 - - columns: 4 - rows: 2 - - columnSpacing: 10 - rowSpacing: 10 - - // header items - Text { - text: qsTr("Width") - font.pixelSize: DialogValues.defaultPixelSize - lineHeight: DialogValues.defaultLineHeight - lineHeightMode: Text.FixedHeight - color: DialogValues.textColor - } - - Text { - text: qsTr("Height") - font.pixelSize: DialogValues.defaultPixelSize - lineHeight: DialogValues.defaultLineHeight - lineHeightMode: Text.FixedHeight - color: DialogValues.textColor - } - - Item { Layout.fillWidth: true } - - Text { - text: qsTr("Orientation") - font.pixelSize: DialogValues.defaultPixelSize - lineHeight: DialogValues.defaultLineHeight - lineHeightMode: Text.FixedHeight - color: DialogValues.textColor - } - - // content items - SC.RealSpinBox { - id: widthField - actionIndicatorVisible: false - implicitWidth: 70 - labelColor: DialogValues.textColor - realFrom: 100 - realTo: 100000 - realValue: 100 - realStepSize: 10 - font.pixelSize: DialogValues.defaultPixelSize - - onRealValueChanged: { - var height = heightField.realValue - var width = realValue - - if (width >= height) - orientationButton.setHorizontal() - else - orientationButton.setVertical() + Item { width: parent.width; height: DialogValues.narrowSpacing(7) } + + RowLayout { // StatusMessage + width: parent.width + spacing: 0 + + Image { + id: statusIcon + Layout.alignment: Qt.AlignTop + asynchronous: false + } + + Text { + id: statusMessage + text: dialogBox.statusMessage + font.pixelSize: DialogValues.defaultPixelSize + lineHeight: DialogValues.defaultLineHeight + lineHeightMode: Text.FixedHeight + color: DialogValues.textColor + wrapMode: Text.Wrap + elide: Text.ElideRight + maximumLineCount: 3 + Layout.fillWidth: true + + states: [ + State { + name: "warning" + when: dialogBox.statusType === "warning" + PropertyChanges { + target: statusMessage + color: DialogValues.textWarning + } + PropertyChanges { + target: statusIcon + source: "image://newprojectdialog_library/status-warning" + } + }, + + State { + name: "error" + when: dialogBox.statusType === "error" + PropertyChanges { + target: statusMessage + color: DialogValues.textError + } + PropertyChanges { + target: statusIcon + source: "image://newprojectdialog_library/status-error" + } + } + ] + } // Text + } // RowLayout + + SC.CheckBox { + id: defaultLocationCheckbox + actionIndicatorVisible: false + text: qsTr("Use as default project location") + checked: false + font.pixelSize: DialogValues.defaultPixelSize } - } // Width Text Field - - Binding { - target: dialogBox - property: "customWidth" - value: widthField.realValue - } - - SC.RealSpinBox { - id: heightField - actionIndicatorVisible: false - implicitWidth: 70 - labelColor: DialogValues.textColor - realFrom: 100 - realTo: 100000 - realValue: 100 - realStepSize: 10 - font.pixelSize: DialogValues.defaultPixelSize - - onRealValueChanged: { - var height = realValue - var width = widthField.realValue - - if (width >= height) - orientationButton.setHorizontal() - else - orientationButton.setVertical() + + Binding { + target: dialogBox + property: "saveAsDefaultLocation" + value: defaultLocationCheckbox.checked } - } // Height Text Field - Binding { - target: dialogBox - property: "customHeight" - value: heightField.realValue - } + Rectangle { width: parent.width; height: 1; color: DialogValues.dividerlineColor } - Item { Layout.fillWidth: true } + SC.ComboBox { // Screen Size ComboBox + id: screenSizeComboBox + actionIndicatorVisible: false + currentIndex: -1 + model: screenSizeModel + textRole: "display" + width: parent.width + font.pixelSize: DialogValues.defaultPixelSize - Button { - id: orientationButton - implicitWidth: 100 - implicitHeight: 50 + onActivated: (index) => { + dialogBox.setScreenSizeIndex(index); - checked: false - hoverEnabled: false - background: Rectangle { - width: parent.width - height: parent.height - color: "transparent" - - Row { - Item { - width: orientationButton.width / 2 - height: orientationButton.height - Rectangle { - id: horizontalBar - color: "white" - width: parent.width - height: orientationButton.height / 2 - anchors.verticalCenter: parent.verticalCenter - } - } + var size = screenSizeModel.screenSizes(index); + widthField.realValue = size.width; + heightField.realValue = size.height; + } - Item { - width: orientationButton.width / 4 - height: orientationButton.height - } + Connections { + target: screenSizeModel + function onModelReset() { + var newIndex = screenSizeComboBox.currentIndex > -1 + ? screenSizeComboBox.currentIndex + : dialogBox.screenSizeIndex() - Rectangle { - id: verticalBar - width: orientationButton.width / 4 - height: orientationButton.height - color: "white" + screenSizeComboBox.currentIndex = newIndex + screenSizeComboBox.activated(newIndex) } } - } + } // Screen Size ComboBox + + GridLayout { // orientation + width + height + width: parent.width + height: 85 + + columns: 4 + rows: 2 - onClicked: { - if (widthField.realValue && heightField.realValue) { - [widthField.realValue, heightField.realValue] = [heightField.realValue, widthField.realValue]; - checked = !checked + columnSpacing: 10 + rowSpacing: 10 + + // header items + Text { + text: qsTr("Width") + font.pixelSize: DialogValues.defaultPixelSize + lineHeight: DialogValues.defaultLineHeight + lineHeightMode: Text.FixedHeight + color: DialogValues.textColor } - } - function setHorizontal() { - checked = false - horizontalBar.color = DialogValues.textColorInteraction - verticalBar.color = "white" - } + Text { + text: qsTr("Height") + font.pixelSize: DialogValues.defaultPixelSize + lineHeight: DialogValues.defaultLineHeight + lineHeightMode: Text.FixedHeight + color: DialogValues.textColor + } - function setVertical() { - checked = true - horizontalBar.color = "white" - verticalBar.color = DialogValues.textColorInteraction - } - } // Orientation button + Item { Layout.fillWidth: true } - } // GridLayout: orientation + width + height + Text { + text: qsTr("Orientation") + font.pixelSize: DialogValues.defaultPixelSize + lineHeight: DialogValues.defaultLineHeight + lineHeightMode: Text.FixedHeight + color: DialogValues.textColor + } - Rectangle { width: parent.width; height: 1; color: DialogValues.dividerlineColor } + // content items + SC.RealSpinBox { + id: widthField + actionIndicatorVisible: false + implicitWidth: 70 + labelColor: DialogValues.textColor + realFrom: 100 + realTo: 100000 + realValue: 100 + realStepSize: 10 + font.pixelSize: DialogValues.defaultPixelSize - SC.Section { - width: parent.width - caption: qsTr("Advanced") - captionPixelSize: DialogValues.defaultPixelSize - captionColor: DialogValues.darkPaneColor - captionTextColor: DialogValues.textColor - leftPadding: 0 - expanded: true - visible: dialogBox.haveVirtualKeyboard || dialogBox.haveTargetQtVersion + onRealValueChanged: { + var height = heightField.realValue + var width = realValue - Column { - spacing: DialogValues.defaultPadding - width: parent.width + if (width >= height) + orientationButton.setHorizontal() + else + orientationButton.setVertical() + } + } // Width Text Field + + Binding { + target: dialogBox + property: "customWidth" + value: widthField.realValue + } - /* We need a spacer of -10 in order to have actual 18px spacing between - * section bottom and the checkbox. Otherwise, with Column spacing set to - * 18, without a spacer, the default space to the first item would be 10, - * for some reason. */ - Item { width: parent.width; height: -10 } + SC.RealSpinBox { + id: heightField + actionIndicatorVisible: false + implicitWidth: 70 + labelColor: DialogValues.textColor + realFrom: 100 + realTo: 100000 + realValue: 100 + realStepSize: 10 + font.pixelSize: DialogValues.defaultPixelSize + + onRealValueChanged: { + var height = realValue + var width = widthField.realValue + + if (width >= height) + orientationButton.setHorizontal() + else + orientationButton.setVertical() + } + } // Height Text Field + + Binding { + target: dialogBox + property: "customHeight" + value: heightField.realValue + } + + Item { Layout.fillWidth: true } + + Button { + id: orientationButton + implicitWidth: 100 + implicitHeight: 50 + + checked: false + hoverEnabled: false + background: Rectangle { + width: parent.width + height: parent.height + color: "transparent" + + Row { + Item { + width: orientationButton.width / 2 + height: orientationButton.height + Rectangle { + id: horizontalBar + color: "white" + width: parent.width + height: orientationButton.height / 2 + anchors.verticalCenter: parent.verticalCenter + } + } + + Item { + width: orientationButton.width / 4 + height: orientationButton.height + } + + Rectangle { + id: verticalBar + width: orientationButton.width / 4 + height: orientationButton.height + color: "white" + } + } + } + + onClicked: { + if (widthField.realValue && heightField.realValue) { + [widthField.realValue, heightField.realValue] = [heightField.realValue, widthField.realValue]; + checked = !checked + } + } + + function setHorizontal() { + checked = false + horizontalBar.color = DialogValues.textColorInteraction + verticalBar.color = "white" + } + + function setVertical() { + checked = true + horizontalBar.color = "white" + verticalBar.color = DialogValues.textColorInteraction + } + } // Orientation button + + } // GridLayout: orientation + width + height + + Rectangle { width: parent.width; height: 1; color: DialogValues.dividerlineColor } SC.CheckBox { id: useQtVirtualKeyboard @@ -440,22 +467,19 @@ Item { } } - width: parent.width - onActivated: (index) => { dialogBox.setTargetQtVersion(index) } } // Target Qt Version ComboBox - } // RowLayout - } // Column - } // SC.Section - Binding { - target: dialogBox - property: "useVirtualKeyboard" - value: useQtVirtualKeyboard.checked - } + Binding { + target: dialogBox + property: "useVirtualKeyboard" + value: useQtVirtualKeyboard.checked + } + } // ScrollContent Column + } // ScrollView } // Column } // Item diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/DialogValues.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/DialogValues.qml index 4fedf87921..0dafb43e44 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/DialogValues.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/DialogValues.qml @@ -30,12 +30,16 @@ import StudioTheme as StudioTheme QtObject { readonly property int dialogWidth: 1522 - readonly property int dialogHeight: 994 + readonly property int dialogHeight: 940 readonly property int projectViewMinimumWidth: 600 readonly property int projectViewMinimumHeight: projectViewHeight readonly property int dialogContentHeight: projectViewHeight + 300 // i.e. dialog without header and footer readonly property int loadedPanesWidth: detailsPaneWidth + stylesPaneWidth - readonly property int detailsPaneWidth: 330 + detailsPanePadding * 2 + readonly property int detailsPaneWidth: 330 + detailsPanePadding * 2// + 10 // 50 + readonly property int dialogTitleTextHeight: 47 + /* detailsScrollableContentHeight - the full height that may need to be scrolled to be fully + visible, if the dialog box is too small. */ + readonly property int detailsScrollableContentHeight: 428 readonly property int stylesPaneWidth: styleImageWidth + stylesPanePadding * 2 + styleImageBorderWidth * 2 // i.e. 240px readonly property int detailsPanePadding: 18 readonly property int stylesPanePadding: 18 @@ -44,9 +48,9 @@ QtObject { readonly property int styleImageWidth: 200 readonly property int styleImageBorderWidth: 2 readonly property int footerHeight: 73 - readonly property int projectItemWidth: 144 + readonly property int projectItemWidth: 90 readonly property int projectItemHeight: 144 - readonly property int projectViewHeight: projectItemHeight * 2 + projectViewHeaderHeight + readonly property int projectViewHeight: projectItemHeight * 2 readonly property int projectViewHeaderHeight: 38 readonly property int dialogButtonWidth: 100 @@ -69,6 +73,8 @@ QtObject { readonly property real viewHeaderLineHeight: 24 readonly property real paneTitlePixelSize: 18 readonly property real paneTitleLineHeight: 27 + readonly property int dialogTitlePixelSize: 32 + readonly property int dialogTitleLineHeight: 49 // for a spacer item function narrowSpacing(value, layoutSpacing = DialogValues.defaultPadding) { diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml index 32a22cb1fc..4270c0946a 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml @@ -35,61 +35,9 @@ GridView { required property Item loader - readonly property int animDur: 500 - - header: Rectangle { - width: parent.width - height: DialogValues.projectViewHeaderHeight - color: DialogValues.lightPaneColor - - Row { - id: row - spacing: 20 - property int currIndex: 0 - - Repeater { - model: categoryModel - Text { - text: name - font.weight: Font.DemiBold - font.pixelSize: DialogValues.viewHeaderPixelSize - verticalAlignment: Text.AlignVCenter - color: row.currIndex === index ? DialogValues.textColorInteraction - : DialogValues.textColor - Behavior on color { ColorAnimation { duration: animDur } } - - MouseArea { - anchors.fill: parent - onClicked: { - row.currIndex = index - projectModel.setPage(index) - projectView.currentIndex = 0 - projectView.currentIndexChanged() - - strip.x = parent.x - strip.width = parent.width - } - } - - } // Text - } // Repeater - } // Row - - Rectangle { - id: strip - width: row.children[0].width - height: 5 - radius: 2 - color: DialogValues.textColorInteraction - anchors.bottom: parent.bottom - - Behavior on x { SmoothedAnimation { duration: animDur } } - Behavior on width { SmoothedAnimation { duration: strip.width === 0 ? 0 : animDur } } // do not animate initial width - } - } // Rectangle - cellWidth: DialogValues.projectItemWidth cellHeight: DialogValues.projectItemHeight + clip: true boundsBehavior: Flickable.StopAtBounds diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Styles.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Styles.qml index a1ef6696f3..09350f5601 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Styles.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Styles.qml @@ -65,12 +65,13 @@ Item { Text { id: styleTitleText text: qsTr("Style") - width: parent.width; + Layout.minimumHeight: DialogValues.dialogTitleTextHeight font.weight: Font.DemiBold font.pixelSize: DialogValues.paneTitlePixelSize lineHeight: DialogValues.paneTitleLineHeight lineHeightMode: Text.FixedHeight color: DialogValues.textColor + verticalAlignment: Qt.AlignVCenter function refresh() { text = qsTr("Style") + " (" + styleModel.rowCount() + ")" diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml index 98fdccddb0..bb8166326a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml @@ -203,13 +203,15 @@ T.ComboBox { | T.Popup.CloseOnReleaseOutsideParent contentItem: ListView { + id: listView clip: true - implicitHeight: contentHeight + implicitHeight: listView.contentHeight model: myComboBox.popup.visible ? myComboBox.delegateModel : null currentIndex: myComboBox.highlightedIndex boundsBehavior: Flickable.StopAtBounds ScrollBar.vertical: ScrollBar { id: comboBoxPopupScrollBar + visible: listView.height < listView.contentHeight } } diff --git a/src/plugins/mcusupport/mcusupportcmakemapper.cpp b/src/plugins/mcusupport/mcusupportcmakemapper.cpp index 8b0e05db63..34cd578259 100644 --- a/src/plugins/mcusupport/mcusupportcmakemapper.cpp +++ b/src/plugins/mcusupport/mcusupportcmakemapper.cpp @@ -40,12 +40,15 @@ static const QHash<QString, QString> &envVarToCMakeVarMapping() {"STM32Cube_FW_F4_SDK_PATH","QUL_BOARD_SDK_DIR"}, {"STM32Cube_FW_L4_SDK_PATH","QUL_BOARD_SDK_DIR"}, {"STM32Cube_FW_H7_SDK_PATH","QUL_BOARD_SDK_DIR"}, + {"RGL_DIR", "QUL_BOARD_SDK_DIR"}, + {"TVII_GRAPHICS_DRIVER_DIR", "QUL_BOARD_SDK_DIR"}, + {"EK_RA6M3G_FSP_PATH", "QUL_BOARD_SDK_DIR"}, {"ARMGCC_DIR", "QUL_TARGET_TOOLCHAIN_DIR"}, {"IAR_ARM_COMPILER_DIR", "QUL_TARGET_TOOLCHAIN_DIR"}, {"GHS_COMPILER_DIR", "QUL_TARGET_TOOLCHAIN_DIR"}, {"GHS_ARM_COMPILER_DIR", "QUL_TARGET_TOOLCHAIN_DIR"}, {"EVK_MIMXRT1170_FREERTOS_PATH","FREERTOS_DIR"}, - {"EVK_MIMXRT1170_FREERTOS_PATH","FREERTOS_DIR"}, + {"IMXRT1050_FREERTOS_DIR","FREERTOS_DIR"}, {"IMXRT1064_FREERTOS_DIR","FREERTOS_DIR"}, {"IMXRT595_FREERTOS_DIR","FREERTOS_DIR"}, {"STM32F7_FREERTOS_DIR", "FREERTOS_DIR"}, @@ -53,10 +56,8 @@ static const QHash<QString, QString> &envVarToCMakeVarMapping() {"RenesasFlashProgrammer_PATH", "RENESAS_FLASH_PROGRAMMER_PATH"}, {"MCUXpressoIDE_PATH", "MCUXPRESSO_IDE_PATH"}, {"JLINK_PATH", "JLINK_PATH"}, - {"TVII_GRAPHICS_DRIVER_DIR", "TVII_GRAPHICS_DRIVER_DIR"}, {"CYPRESS_AUTO_FLASH_UTILITY_DIR", "CYPRESS_AUTO_FLASH_UTILITY_DIR"}, {"EK_RA6M3G_E2_PROJECT_PATH", "EK_RA6M3G_E2_PROJECT_PATH"}, - {"EK_RA6M3G_FSP_PATH", "EK_RA6M3G_FSP_PATH"}, }; return mapping; } diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 4a21ece87b..4c9c7dab27 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -497,8 +497,27 @@ QVariant McuToolChainPackage::debuggerId() const { using namespace Debugger; - QString sub = QString::fromLatin1(m_type == TypeArmGcc ? "bin/arm-none-eabi-gdb-py" - : m_type == TypeIAR ? "../common/bin/CSpyBat" : "bar/foo-keil-gdb"); + QString sub, displayName; + DebuggerEngineType engineType; + + switch (m_type) { + case TypeArmGcc: { + sub = QString::fromLatin1("bin/arm-none-eabi-gdb-py"); + displayName = McuPackage::tr("Arm GDB at %1"); + engineType = Debugger::GdbEngineType; + break; } + case TypeIAR: { + sub = QString::fromLatin1("../common/bin/CSpyBat"); + displayName = QLatin1String("CSpy"); + engineType = Debugger::NoEngineType; // support for IAR missing + break; } + case TypeKEIL: { + sub = QString::fromLatin1("UV4/UV4"); + displayName = QLatin1String("KEIL uVision Debugger"); + engineType = Debugger::UvscEngineType; + break; } + default: return QVariant(); + } const FilePath command = path().pathAppended(sub).withExecutableSuffix(); const DebuggerItem *debugger = DebuggerItemManager::findByCommand(command); @@ -506,11 +525,8 @@ QVariant McuToolChainPackage::debuggerId() const if (!debugger) { DebuggerItem newDebugger; newDebugger.setCommand(command); - const QString displayName = m_type == TypeArmGcc - ? McuPackage::tr("Arm GDB at %1") - : m_type == TypeIAR ? QLatin1String("CSpy") - : QLatin1String("/bar/foo-keil-gdb"); newDebugger.setUnexpandedDisplayName(displayName.arg(command.toUserOutput())); + newDebugger.setEngineType(engineType); debuggerId = DebuggerItemManager::registerDebugger(newDebugger); } else { debuggerId = debugger->id(); @@ -743,7 +759,9 @@ static void setKitDebugger(Kit *k, const McuToolChainPackage *tcPackage) || tcPackage->type() == McuToolChainPackage::TypeIAR) return; - Debugger::DebuggerKitAspect::setDebugger(k, tcPackage->debuggerId()); + const QVariant debuggerId = tcPackage->debuggerId(); + if (debuggerId.isValid()) + Debugger::DebuggerKitAspect::setDebugger(k, debuggerId); } static void setKitDevice(Kit *k, const McuTarget* mcuTarget) diff --git a/src/plugins/qmldesigner/generatecmakelists.cpp b/src/plugins/qmldesigner/generatecmakelists.cpp index 51c199d585..1e49ed3909 100644 --- a/src/plugins/qmldesigner/generatecmakelists.cpp +++ b/src/plugins/qmldesigner/generatecmakelists.cpp @@ -63,13 +63,14 @@ enum ProjectDirectoryError { NoError = 0, MissingContentDir = 1<<1, MissingImportDir = 1<<2, - MissingCppDir = 1<<3, - MissingMainCMake = 1<<4, - MissingMainQml = 1<<5, - MissingAppMainQml = 1<<6, - MissingQmlModules = 1<<7, - MissingMainCpp = 1<<8, - MissingMainCppHeader = 1<<9 + MissingAssetImportDir = 1<<3, + MissingCppDir = 1<<4, + MissingMainCMake = 1<<5, + MissingMainQml = 1<<6, + MissingAppMainQml = 1<<7, + MissingQmlModules = 1<<8, + MissingMainCpp = 1<<9, + MissingMainCppHeader = 1<<10 }; QVector<GeneratableFile> queuedFiles; @@ -131,6 +132,8 @@ int isProjectCorrectlyFormed(const FilePath &rootDir) if (!rootDir.pathAppended(DIRNAME_IMPORT).exists()) errors |= MissingImportDir; + if (!rootDir.pathAppended(DIRNAME_ASSET).exists()) + errors |= MissingAssetImportDir; if (!rootDir.pathAppended(DIRNAME_CPP).exists()) errors |= MissingCppDir; @@ -159,7 +162,7 @@ void removeUnconfirmedQueuedFiles(const Utils::FilePaths confirmedFiles) const QString WARNING_MISSING_STRUCTURE_FATAL = QCoreApplication::translate("QmlDesigner::GenerateCmake", "The project is not properly structured for automatically generating CMake files.\n\nAborting process.\n\nThe following files or directories are missing:\n\n%1"); const QString WARNING_MISSING_STRUCTURE_NONFATAL = QCoreApplication::translate("QmlDesigner::GenerateCmake", - "The project is not properly structured for automatically generating CMake files.\n\nThe following files will be created:\n\n%1"); + "The project is not properly structured for automatically generating CMake files.\n\nThe following files or directories are missing and may be created:\n\n%1"); const QString WARNING_TITLE_FATAL = QCoreApplication::translate("QmlDesigner::GenerateCmake", "Cannot Generate CMake Files"); const QString WARNING_TITLE_NONFATAL = QCoreApplication::translate("QmlDesigner::GenerateCmake", @@ -182,6 +185,8 @@ void showProjectDirErrorDialog(int error) if (error & MissingImportDir) fatalList.append(QString(DIRNAME_IMPORT) + "\n"); + if (error & MissingAssetImportDir) + nonFatalList.append(QString(DIRNAME_ASSET) + "\n"); if (error & MissingMainCMake) nonFatalList.append(QString(FILENAME_CMAKELISTS) + "\n"); if (error & MissingQmlModules) @@ -290,16 +295,21 @@ bool generateCmakes(const FilePath &rootDir) { moduleNames.clear(); - FilePath contentDir = rootDir.pathAppended("content"); - FilePath importDir = rootDir.pathAppended("imports"); + FilePath contentDir = rootDir.pathAppended(DIRNAME_CONTENT); + FilePath importDir = rootDir.pathAppended(DIRNAME_IMPORT); + FilePath assetDir = rootDir.pathAppended(DIRNAME_ASSET); generateModuleCmake(contentDir); generateImportCmake(importDir); + generateImportCmake(assetDir); generateMainCmake(rootDir); return true; } +const char DO_NOT_EDIT_FILE_COMMENT[] = "### This file is automatically generated by Qt Design Studio.\n### Do not change\n\n"; +const char ADD_SUBDIR[] = "add_subdirectory(%1)\n"; + void generateMainCmake(const FilePath &rootDir) { //TODO startupProject() may be a terrible way to try to get "current project". It's not necessarily the same thing at all. @@ -309,27 +319,47 @@ void generateMainCmake(const FilePath &rootDir) QString cmakeFileContent = GenerateCmake::readTemplate(MAIN_CMAKEFILE_TEMPLATE_PATH).arg(appName); queueCmakeFile(rootDir, cmakeFileContent); + QString subdirIncludes; + subdirIncludes.append(QString(ADD_SUBDIR).arg(DIRNAME_CONTENT)); + subdirIncludes.append(QString(ADD_SUBDIR).arg(DIRNAME_IMPORT)); + if (rootDir.pathAppended(DIRNAME_ASSET).exists()) + subdirIncludes.append(QString(ADD_SUBDIR).arg(DIRNAME_ASSET)); + QString modulesAsPlugins; for (const QString &moduleName : moduleNames) modulesAsPlugins.append(" " + moduleName + "plugin\n"); - QString moduleFileContent = GenerateCmake::readTemplate(QMLMODULES_FILE_TEMPLATE_PATH).arg(appName).arg(modulesAsPlugins); + QString moduleFileContent = GenerateCmake::readTemplate(QMLMODULES_FILE_TEMPLATE_PATH) + .arg(appName) + .arg(subdirIncludes) + .arg(modulesAsPlugins); + GenerateCmake::queueFile(rootDir.pathAppended(FILENAME_MODULES), moduleFileContent); } -const char DO_NOT_EDIT_FILE_COMMENT[] = "### This file is automatically generated by Qt Design Studio.\n### Do not change\n\n"; -const char ADD_SUBDIR[] = "add_subdirectory(%1)\n"; - -void generateImportCmake(const FilePath &dir) +void generateImportCmake(const FilePath &dir, const QString &modulePrefix) { + if (!dir.exists()) + return; + QString fileContent; fileContent.append(DO_NOT_EDIT_FILE_COMMENT); - FilePaths subDirs = dir.dirEntries(DIRS_ONLY); for (FilePath &subDir : subDirs) { + if (isDirBlacklisted(subDir)) + continue; + if (getDirectoryTreeQmls(subDir).isEmpty() && getDirectoryTreeResources(subDir).isEmpty()) + continue; fileContent.append(QString(ADD_SUBDIR).arg(subDir.fileName())); - generateModuleCmake(subDir); + QString prefix = modulePrefix.isEmpty() ? + modulePrefix % subDir.fileName() : + QString(modulePrefix + '.') + subDir.fileName(); + if (getDirectoryQmls(subDir).isEmpty()) { + generateImportCmake(subDir, prefix); + } else { + generateModuleCmake(subDir, prefix); + } } queueCmakeFile(dir, fileContent); @@ -339,13 +369,12 @@ const char MODULEFILE_PROPERTY_SINGLETON[] = "QT_QML_SINGLETON_TYPE"; const char MODULEFILE_PROPERTY_SET[] = "set_source_files_properties(%1\n PROPERTIES\n %2 %3\n)\n\n"; const char MODULEFILE_TEMPLATE_PATH[] = ":/boilerplatetemplates/qmlprojectmodulecmakelists.tpl"; -void generateModuleCmake(const FilePath &dir) +void generateModuleCmake(const FilePath &dir, const QString &uri) { QString fileTemplate = GenerateCmake::readTemplate(MODULEFILE_TEMPLATE_PATH); - const QStringList qmldirFilesOnly(FILENAME_QMLDIR); QString singletonContent; - FilePaths qmldirFileList = dir.dirEntries(qmldirFilesOnly, FILES_ONLY); + FilePaths qmldirFileList = dir.dirEntries(QStringList(FILENAME_QMLDIR), FILES_ONLY); if (!qmldirFileList.isEmpty()) { QStringList singletons = getSingletonsFromQmldirFile(qmldirFileList.first()); for (QString &singleton : singletons) { @@ -371,12 +400,14 @@ void generateModuleCmake(const FilePath &dir) moduleContent.append(QString(" RESOURCES\n%1").arg(resourceFiles)); } - QString moduleName = dir.fileName(); - + QString moduleUri = uri.isEmpty() ? + dir.fileName() : + uri; + QString moduleName = QString(moduleUri).remove('.'); moduleNames.append(moduleName); QString fileContent; - fileContent.append(fileTemplate.arg(singletonContent).arg(moduleName).arg(moduleContent)); + fileContent.append(fileTemplate.arg(singletonContent, moduleName, moduleUri, moduleContent)); queueCmakeFile(dir, fileContent); } @@ -403,6 +434,22 @@ QStringList getSingletonsFromQmldirFile(const FilePath &filePath) return singletons; } +FilePaths getDirectoryQmls(const FilePath &dir) +{ + const QStringList qmlFilesOnly("*.qml"); + ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); + FilePaths allFiles = dir.dirEntries(qmlFilesOnly, FILES_ONLY); + FilePaths moduleFiles; + for (FilePath &file : allFiles) { + if (!isFileBlacklisted(file.fileName()) && + project->isKnownFile(file)) { + moduleFiles.append(file); + } + } + + return moduleFiles; +} + QStringList getDirectoryTreeQmls(const FilePath &dir) { const QStringList qmlFilesOnly("*.qml"); @@ -419,6 +466,8 @@ QStringList getDirectoryTreeQmls(const FilePath &dir) FilePaths subDirsList = dir.dirEntries(DIRS_ONLY); for (FilePath &subDir : subDirsList) { + if (isDirBlacklisted(subDir)) + continue; QStringList subDirQmlFiles = getDirectoryTreeQmls(subDir); for (QString &qmlFile : subDirQmlFiles) { qmlFileList.append(subDir.fileName().append('/').append(qmlFile)); @@ -444,6 +493,8 @@ QStringList getDirectoryTreeResources(const FilePath &dir) FilePaths subDirsList = dir.dirEntries(DIRS_ONLY); for (FilePath &subDir : subDirsList) { + if (isDirBlacklisted(subDir)) + continue; QStringList subDirResources = getDirectoryTreeResources(subDir); for (QString &resource : subDirResources) { resourceFileList.append(subDir.fileName().append('/').append(resource)); @@ -466,6 +517,11 @@ bool isFileBlacklisted(const QString &fileName) !fileName.compare(FILENAME_CMAKELISTS)); } +bool isDirBlacklisted(const FilePath &dir) +{ + return (!dir.fileName().compare(DIRNAME_DESIGNER)); +} + } namespace GenerateEntryPoints { diff --git a/src/plugins/qmldesigner/generatecmakelists.h b/src/plugins/qmldesigner/generatecmakelists.h index 794610a53f..53c6703ef0 100644 --- a/src/plugins/qmldesigner/generatecmakelists.h +++ b/src/plugins/qmldesigner/generatecmakelists.h @@ -54,13 +54,15 @@ QString readTemplate(const QString &templatePath); namespace GenerateCmakeLists { bool generateCmakes(const Utils::FilePath &rootDir); void generateMainCmake(const Utils::FilePath &rootDir); -void generateImportCmake(const Utils::FilePath &dir); -void generateModuleCmake(const Utils::FilePath &dir); +void generateImportCmake(const Utils::FilePath &dir, const QString &modulePrefix = QString()); +void generateModuleCmake(const Utils::FilePath &dir, const QString &moduleUri = QString()); +Utils::FilePaths getDirectoryQmls(const Utils::FilePath &dir); QStringList getSingletonsFromQmldirFile(const Utils::FilePath &filePath); QStringList getDirectoryTreeQmls(const Utils::FilePath &dir); QStringList getDirectoryTreeResources(const Utils::FilePath &dir); void queueCmakeFile(const Utils::FilePath &filePath, const QString &content); bool isFileBlacklisted(const QString &fileName); +bool isDirBlacklisted(const Utils::FilePath &dir); } namespace GenerateEntryPoints { bool generateEntryPointFiles(const Utils::FilePath &dir); diff --git a/src/plugins/qmldesigner/generatecmakelistsconstants.h b/src/plugins/qmldesigner/generatecmakelistsconstants.h index 59b11723e4..dce1b8e61b 100644 --- a/src/plugins/qmldesigner/generatecmakelistsconstants.h +++ b/src/plugins/qmldesigner/generatecmakelistsconstants.h @@ -34,7 +34,9 @@ namespace Constants { const char DIRNAME_CONTENT[] = "content"; const char DIRNAME_IMPORT[] = "imports"; +const char DIRNAME_ASSET[] = "asset_imports"; const char DIRNAME_CPP[] = "src"; +const char DIRNAME_DESIGNER[] = "designer"; const char FILENAME_CMAKELISTS[] = "CMakeLists.txt"; const char FILENAME_APPMAINQML[] = "App.qml"; diff --git a/src/plugins/qmldesigner/qmlprojectmodulecmakelists.tpl b/src/plugins/qmldesigner/qmlprojectmodulecmakelists.tpl index 46132d8c1a..e193ebf5ba 100644 --- a/src/plugins/qmldesigner/qmlprojectmodulecmakelists.tpl +++ b/src/plugins/qmldesigner/qmlprojectmodulecmakelists.tpl @@ -5,7 +5,7 @@ qt_add_library(%2 STATIC) qt6_add_qml_module(%2 - URI "%2" + URI "%3" VERSION 1.0 -%3 +%4 ) diff --git a/src/plugins/qmldesigner/qmlprojectmodules.tpl b/src/plugins/qmldesigner/qmlprojectmodules.tpl index 2cae6017cc..a1fdb4071d 100644 --- a/src/plugins/qmldesigner/qmlprojectmodules.tpl +++ b/src/plugins/qmldesigner/qmlprojectmodules.tpl @@ -8,9 +8,8 @@ qt6_add_qml_module(%1 QML_FILES main.qml ) -add_subdirectory(content) -add_subdirectory(imports) +%2 target_link_libraries(%1 PRIVATE -%2 +%3 ) diff --git a/src/plugins/studiowelcome/newprojectdialogimageprovider.cpp b/src/plugins/studiowelcome/newprojectdialogimageprovider.cpp index bdb3e4af8b..0e50292504 100644 --- a/src/plugins/studiowelcome/newprojectdialogimageprovider.cpp +++ b/src/plugins/studiowelcome/newprojectdialogimageprovider.cpp @@ -84,6 +84,26 @@ QPixmap NewProjectDialogImageProvider::requestStylePixmap(const QString &id, QSi return pixmap; } +QPixmap NewProjectDialogImageProvider::requestDefaultPixmap(const QString &id, QSize *size, const QSize &requestedSize) +{ + QString realPath = Core::ICore::resourcePath("qmldesigner/newprojectdialog/image/" + id).toString(); + + QPixmap pixmap{realPath}; + + if (size) { + size->setWidth(pixmap.width()); + size->setHeight(pixmap.height()); + } + + if (pixmap.isNull()) + return QPixmap{}; + + if (requestedSize.isValid()) + return pixmap.scaled(requestedSize); + + return pixmap; +} + QPixmap NewProjectDialogImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) { if (id.startsWith("style-")) @@ -92,7 +112,7 @@ QPixmap NewProjectDialogImageProvider::requestPixmap(const QString &id, QSize *s if (id.startsWith("status-")) return requestStatusPixmap(id, size, requestedSize); - return QPixmap{}; + return requestDefaultPixmap(id, size, requestedSize); } } // namespace Internal diff --git a/src/plugins/studiowelcome/newprojectdialogimageprovider.h b/src/plugins/studiowelcome/newprojectdialogimageprovider.h index f149d082c2..0064070259 100644 --- a/src/plugins/studiowelcome/newprojectdialogimageprovider.h +++ b/src/plugins/studiowelcome/newprojectdialogimageprovider.h @@ -41,6 +41,7 @@ public: private: QPixmap requestStatusPixmap(const QString &id, QSize *size, const QSize &requestedSize); QPixmap requestStylePixmap(const QString &id, QSize *size, const QSize &requestedSize); + QPixmap requestDefaultPixmap(const QString &id, QSize *size, const QSize &requestedSize); static QPixmap invalidStyleIcon(); }; diff --git a/src/plugins/studiowelcome/qdsnewdialog.cpp b/src/plugins/studiowelcome/qdsnewdialog.cpp index 7ab0d9f8c1..1ab2a45ee8 100644 --- a/src/plugins/studiowelcome/qdsnewdialog.cpp +++ b/src/plugins/studiowelcome/qdsnewdialog.cpp @@ -23,9 +23,6 @@ ** ****************************************************************************/ -#include <QQmlContext> -#include <QMessageBox> - #include "qdsnewdialog.h" #include <coreplugin/icore.h> @@ -37,6 +34,10 @@ #include "wizardfactories.h" #include "newprojectdialogimageprovider.h" +#include <QMessageBox> +#include <QQmlContext> +#include <QScreen> + using namespace StudioWelcome; namespace { @@ -93,7 +94,11 @@ QdsNewDialog::QdsNewDialog(QWidget *parent) m_dialog->setWindowModality(Qt::ApplicationModal); m_dialog->setWindowFlags(Qt::Dialog); m_dialog->setAttribute(Qt::WA_DeleteOnClose); - m_dialog->setMinimumSize(1155, 804); + m_dialog->setMinimumSize(1110, 554); + + QSize screenSize = m_dialog->screen()->geometry().size(); + if (screenSize.height() < 1080) + m_dialog->resize(parent->size()); QObject::connect(&m_wizard, &WizardHandler::deletingWizard, this, &QdsNewDialog::onDeletingWizard); QObject::connect(&m_wizard, &WizardHandler::wizardCreated, this, &QdsNewDialog::onWizardCreated); diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index ef6e169813..28fe278cab 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -342,6 +342,7 @@ public: void checkNext() { + QTC_ASSERT(m_currentHandlerIndex >= 0, return); QTC_ASSERT(m_currentHandlerIndex < m_handlers.size(), return); BaseHoverHandler *currentHandler = m_handlers[m_currentHandlerIndex]; @@ -352,6 +353,7 @@ public: void onHandlerFinished(int documentRevision, int position, int priority) { + QTC_ASSERT(m_currentHandlerIndex >= 0, return); QTC_ASSERT(m_currentHandlerIndex < m_handlers.size(), return); QTC_ASSERT(documentRevision == m_documentRevision, return); QTC_ASSERT(position == m_position, return); |