diff --git a/doc/qtdesignstudio/examples/doc/images/imported-translations.png b/doc/qtdesignstudio/examples/doc/images/imported-translations.png index 7609394b8e0..1d30eb7be02 100644 Binary files a/doc/qtdesignstudio/examples/doc/images/imported-translations.png and b/doc/qtdesignstudio/examples/doc/images/imported-translations.png differ diff --git a/doc/qtdesignstudio/examples/doc/images/loginui1-project-files.png b/doc/qtdesignstudio/examples/doc/images/loginui1-project-files.png index 47ff9b43032..7b7edd8fe1b 100644 Binary files a/doc/qtdesignstudio/examples/doc/images/loginui1-project-files.png and b/doc/qtdesignstudio/examples/doc/images/loginui1-project-files.png differ diff --git a/doc/qtdesignstudio/examples/doc/images/loginui3-visibility.png b/doc/qtdesignstudio/examples/doc/images/loginui3-visibility.png index 48bedc6a485..d43dbb61075 100644 Binary files a/doc/qtdesignstudio/examples/doc/images/loginui3-visibility.png and b/doc/qtdesignstudio/examples/doc/images/loginui3-visibility.png differ diff --git a/doc/qtdesignstudio/examples/doc/loginui1.qdoc b/doc/qtdesignstudio/examples/doc/loginui1.qdoc index 976c4923a44..78bc2192b56 100644 --- a/doc/qtdesignstudio/examples/doc/loginui1.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui1.qdoc @@ -41,6 +41,9 @@ project and a button UI control, and how to modify the files generated by the wizard templates to wireframe the UI. + You can donwnload the completed project from + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui1}{here}. + The \e {Learn More} sections provide additional information about the tasks performed by the wizards and about other basic tasks and concepts. @@ -54,24 +57,19 @@ To create a project: \list 1 - \li Select \uicontrol File > \uicontrol {New Project} > - \uicontrol General > \uicontrol {Qt Quick Application - Empty} > - \uicontrol Choose. - \li In the \uicontrol Name field, enter the project name: \e {loginui1}. - When naming your own projects, keep in mind that they cannot be - easily renamed later. - \li In the \uicontrol {Create in} field, enter the path to the folder - where you want to store the project files. You can move project - folders later without problems. - \li Select \uicontrol Next (or \uicontrol Continue on \macos) to - continue to the \uicontrol {Define Project Details} page. - \li In the \uicontrol {Screen resolution} field, select the initial - size of the UI. In this tutorial, we use the predefined size - \e {720 x 1280 (HD)} (portrait) instead of the default size - (landscape). You can easily change the screen size later in - \l Properties. - \li Select \uicontrol Finish (or \uicontrol Done on \macos) to create - the project. + \li Select \uicontrol File > \uicontrol {New Project}. + \li In the \uicontrol Presets tab, select \uicontrol General > + \uicontrol {Empty}. + \li In the \uicontrol Details tab: + \list + \li Enter \e Loginui1 as the name for the project. Keep in mind + that projects cannot be easily renamed later. + \li Select the path for the project files. You can move project + folders later. + \li Set \uicontrol Width to 720 and \uicontrol Height to 1280. + You can change the screen size later in \l Properties. + \endlist + \li Select \uicontrol Create to create the project. \endlist Your project should now look something like this in the \uicontrol Design @@ -92,7 +90,7 @@ \section2 Learn More - Projects and Files \QDS creates a set of boilerplate files and folders that you need to create - a UI. The files are listed in the \l Projects view. + a UI. The files are listed in the \l{File System} view. \image loginui1-project-files.png @@ -112,6 +110,9 @@ Specifically, if you export and import designs using \QB, your main file is most likely called something else. For more information, see \l {Exporting from Design Tools}. + \li The \e CMakeLists.txt project configuration file allowing you to + share your project as a fully working C++ application with + developers. \li The \e {qtquickcontrols2.conf} file specifies the selected \l {Styling Qt Quick Controls}{UI style} and some style-specific arguments. @@ -230,7 +231,7 @@ adds the following \e import statements to the UI files (.ui.qml) that it creates: - \quotefromfile loginui1/Screen01.ui.qml + \quotefromfile Loginui1/Content/Screen01.ui.qml \skipto import \printuntil Controls @@ -333,7 +334,7 @@ To be able to use the functionality of the Button control, the wizard template adds the following \e import statements to the \e EntryField.ui.qml file: - \quotefromfile loginui1/EntryField.ui.qml + \quotefromfile Loginui1/Content/EntryField.ui.qml \skipto import \printuntil Controls @@ -364,7 +365,7 @@ to \e 100, to match the width of the tag line. \li In the \uicontrol Control section, deselect the \uicontrol Hover check box because we don't want the hover effect for the button. - \li Select the button background in \uicontrol Navigator to display its + \li Select \e buttonBackground in \uicontrol Navigator to display its properties in \uicontrol Properties. \li In \uicontrol Rectangle > \uicontrol {Fill color}, set the color to transparent light gray (\e #28e7e7e7) in \uicontrol Hex. You can @@ -372,7 +373,7 @@ \li In \uicontrol {Border Color}, select white (\e #ffffff). \li In \uicontrol Radius, enter \e 50 to give the button rounded corners. - \li Select the text component in \uicontrol Navigator to display its + \li Select \e textItem in \uicontrol Navigator to display its properties in \uicontrol Properties. \li In \uicontrol Character > \uicontrol Font, select \e {Titillium Web ExtraLight}. @@ -382,7 +383,7 @@ (\e #ffffff). \li In \uicontrol {Alignment H}, select the \uicontrol Left button to align the text horizontally to the left. - \li In the \uicontrol Padding section > \uicontrol Horizontal > + \li In \uicontrol Padding > \uicontrol Horizontal > \uicontrol Left, set the padding in the field between background border and text to \e 50. \image loginui1-text-properties-button.png "Text properties" @@ -450,13 +451,13 @@ to \e 100. \li In the \uicontrol Control section, deselect the \uicontrol Hover check box because we don't want the hover effect for the button. - \li Select the button background in \uicontrol Navigator to display its + \li Select \e buttonBackground in \uicontrol Navigator to display its properties in \uicontrol Properties. \li In \uicontrol Rectangle > \uicontrol {Border color}, select the green used in the logo (\e #41cd52). \li In \uicontrol Radius, enter \e 50 to give the button rounded corners. - \li Select the the text component in \uicontrol Navigator to display + \li Select \e textItem in \uicontrol Navigator to display its properties in \uicontrol Properties. \li In \uicontrol Character > \uicontrol Font, select \e {Titillium Web ExtraLight}. diff --git a/doc/qtdesignstudio/examples/doc/loginui2.qdoc b/doc/qtdesignstudio/examples/doc/loginui2.qdoc index bcf557825d7..c2ca170552e 100644 --- a/doc/qtdesignstudio/examples/doc/loginui2.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui2.qdoc @@ -24,7 +24,7 @@ ****************************************************************************/ /*! - \example loginui2 + \example Loginui2 \ingroup gstutorials \previouspage {Log In UI - Components} \nextpage {Log In UI - States} @@ -45,7 +45,12 @@ their proper places when you resize the UI on the desktop or on devices with different screen sizes, you will use anchors and positioners. - These instructions build on \l {Log In UI - Components}. + The starting point for this tutorial is the completed + \l{Log In UI - Components} project. You can download the project from + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui1}{here}. + + Additionally, you can download the completed project of this tutorial from + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui2}{here}. The \e {Learn More} sections provide additional information about the task at hand. @@ -79,6 +84,9 @@ anchor button to anchor \e adventurePage to its parent in the \uicontrol Target field. This attaches the background image to the rectangle on all sides. + Note: Selecting the anchor button should automatically select the + four buttons on the left side of it. If it doesn't, refresh + \uicontrol{Form Editor}. \image loginui2-layout.png "Layout properties" \li Select \e qt_logo_green_128x128px in \l Navigator. \li In \uicontrol Properties > \uicontrol Layout, select the diff --git a/doc/qtdesignstudio/examples/doc/loginui3.qdoc b/doc/qtdesignstudio/examples/doc/loginui3.qdoc index 34730dfc425..999215d90b1 100644 --- a/doc/qtdesignstudio/examples/doc/loginui3.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui3.qdoc @@ -46,12 +46,12 @@ login page, you will use \e states to show and hide UI components as necessary when a user selects the \e {Create Account} button. - These instructions build on: + The starting point for this tutorial is the completed + \l{Log In UI - Positioning} project. You can download the project from + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui2}{here}. - \list - \li \l {Log In UI - Components} - \li \l {Log In UI - Positioning} - \endlist + Additionally, you can download the completed project of this tutorial from + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui3}{here}. The \e {Learn More} sections provide additional information relevant to the task at hand. diff --git a/doc/qtdesignstudio/examples/doc/loginui4.qdoc b/doc/qtdesignstudio/examples/doc/loginui4.qdoc index a601d8aa8ec..a6a1ad77d4a 100644 --- a/doc/qtdesignstudio/examples/doc/loginui4.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui4.qdoc @@ -46,13 +46,13 @@ \l{Creating Timeline Animations}{timeline animations} that you bind to states. - These instructions build on: + The starting point for this tutorial is the completed + \l{Log In UI - States} project. You can download the project from + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui3}{here}. + + Additionally, you can download the completed project of this tutorial from + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui4}{here}. - \list - \li \l {Log In UI - Components} - \li \l {Log In UI - Positioning} - \li \l {Log In UI - States} - \endlist The \e {Learn More} sections provide additional information relevant to the task at hand. @@ -94,7 +94,7 @@ \li Select \inlineimage icons/navigator-arrowup.png to move \e username below \e tagLine in \uicontrol Navigator to preserve the \l{Arranging Components}{component hierarchy}. - \li Repeat for \e password and \e repeatPassword. + \li Repeat step 3 and 4 for \e password and \e repeatPassword. \li Select \e fields in \uicontrol Navigator and press \key Delete to delete it. \li Select \e username in \uicontrol Navigator to display its properties @@ -196,8 +196,8 @@ to save your changes. \endlist - When you move the playhead along the timeline, you can see how the login - button fades out while the repeat password field fades in. + When you move the playhead along the timeline, you can see how the create + account button fades out while the repeat password field fades in. You will now animate the top anchor margin of the repeat password field to make it appear to slide down from the password field. @@ -219,7 +219,7 @@ frame 0, and select the record button for the \e anchors.topMargin property of \e repeatPassword. \li In the field next to the property, set a negative value for the - top anchor margin, -40, to place \e repeatPassword on top of + top anchor margin, -100, to place \e repeatPassword on top of \e password. \li Move the playhead to frame 1000 and change the top anchor margin to 20, so that, combined with the change in the \uicontrol Opacity @@ -312,7 +312,7 @@ the following \e import statement to the UI files where it uses the components: - \quotefromfile loginui4/Screen01.ui.qml + \quotefromfile Loginui4/Content/Screen01.ui.qml \skipto QtQuick.Timeline \printuntil 1.0 diff --git a/doc/qtdesignstudio/examples/doc/multilanguage.qdoc b/doc/qtdesignstudio/examples/doc/multilanguage.qdoc index 27afb9d02b2..e749ab59675 100644 --- a/doc/qtdesignstudio/examples/doc/multilanguage.qdoc +++ b/doc/qtdesignstudio/examples/doc/multilanguage.qdoc @@ -39,8 +39,8 @@ translations from a JSON file. You need to download the starting project for this tutorial from - \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/examples/ - loginui2}{here} before you start. + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/multi-language%20tutorial/Loginui2}{here} + before you start. Download the project and open the \e loginui2.qmlproject file in \QDS to get started. @@ -48,8 +48,7 @@ This project consists of a login page with a couple of text elements. Additionally, you will use a JSON translation file in this tutorial. - Download it from \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/ - master/tutorial%20projects/multi-language}{here}. + Download it from \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/multi-language}{here}. \section1 JSON Translation File @@ -133,10 +132,11 @@ First, you need to prepare your project for translation: \list 1 + \li In \uicontrol{Projects}, double-click \e{Screen01.ui.qml} to open it. \li All text strings that you want to translate need to be of \c qsTrId type. In this project the text strings are of \c qsTr type so you need to change them. Open \uicontrol{Text Editor}, find all five - occurrences of \c QsTr and replace them with \c{QsTrId}. For example, + occurrences of \c qsTr and replace them with \c{qsTrId}. For example, replace: \code text: qsTr("Qt Account") @@ -165,21 +165,14 @@ \li Go to \uicontrol View > \uicontrol Views and select \uicontrol Translations to open the \uicontrol Translations view. You can drag it to a workspace to dock it. - - When you open the \uicontrol Translations view for the first time, \QDS - prompts you to enable the multi-language database, select - \uicontrol{Yes}. - \image enable-multilanguage.png \li In \uicontrol Translations, select \inlineimage icons/select-languages.png . - - When you enable the multi-language database, an SQLite database named - \e translations.db is created in the project folder root. \li Select the languages that you want to support in your project, in this case \uicontrol{English - American English} and - \uicontrol{Swedish}. - \li Set \uicontrol English as primary language and select \uicontrol{OK}. + \uicontrol{Swedish - Svenska}. + \li Set \uicontrol{English - American English} as primary language and + select \uicontrol{Ok}. \li Select \inlineimage icons/import-json-translations.png and open the \e ml_translations.json file. Now you can see all your imported translations in the \uicontrol Translations view. diff --git a/doc/qtdesignstudio/examples/loginui1/EntryField.ui.qml b/doc/qtdesignstudio/examples/loginui1/content/EntryField.ui.qml similarity index 93% rename from doc/qtdesignstudio/examples/loginui1/EntryField.ui.qml rename to doc/qtdesignstudio/examples/loginui1/content/EntryField.ui.qml index 4232d16445b..02b4ce8d183 100644 --- a/doc/qtdesignstudio/examples/loginui1/EntryField.ui.qml +++ b/doc/qtdesignstudio/examples/loginui1/content/EntryField.ui.qml @@ -1,8 +1,6 @@ - - /**************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Design Studio. @@ -49,6 +47,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + import QtQuick 2.15 import QtQuick.Controls 2.12 @@ -100,13 +99,16 @@ Button { when: !control.down PropertyChanges { - target: textItem - font.family: "Titillium Web ExtraLight" + target: buttonBackground + color: "#00000000" + border.color: "#ffffff" } PropertyChanges { - target: buttonBackground - color: "#28e7e7e7" + target: textItem + color: "#ffffff" + font.pixelSize: 34 + font.family: "Titillium Web ExtraLight" } }, State { @@ -115,12 +117,14 @@ Button { PropertyChanges { target: textItem color: "#ffffff" + border.color: "#ffffff" + font.family: "Titillium Web ExtraLight" } PropertyChanges { target: buttonBackground - color: "#e7e7e7" - border.color: "#ffffff" + color: "#28e7e7e7" + border.color: "#00000000" } } ] diff --git a/doc/qtdesignstudio/examples/loginui1/PushButton.ui.qml b/doc/qtdesignstudio/examples/loginui1/content/PushButton.ui.qml similarity index 88% rename from doc/qtdesignstudio/examples/loginui1/PushButton.ui.qml rename to doc/qtdesignstudio/examples/loginui1/content/PushButton.ui.qml index 3a0871f4fc8..cfd617703c8 100644 --- a/doc/qtdesignstudio/examples/loginui1/PushButton.ui.qml +++ b/doc/qtdesignstudio/examples/loginui1/content/PushButton.ui.qml @@ -1,8 +1,6 @@ - - /**************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Design Studio. @@ -49,6 +47,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + import QtQuick 2.15 import QtQuick.Controls 2.12 @@ -68,6 +67,7 @@ Button { text: "My Button" hoverEnabled: false + enabled: true background: buttonBackground Rectangle { @@ -83,6 +83,8 @@ Button { contentItem: textItem Text { id: textItem + width: 500 + height: 100 text: control.text font.pixelSize: 34 @@ -101,6 +103,14 @@ Button { PropertyChanges { target: buttonBackground color: "#00000000" + border.color: "#41cd52" + } + + PropertyChanges { + target: textItem + color: "#41cd52" + font.pixelSize: 34 + font.family: "Titillium Web ExtraLight" } }, State { @@ -108,20 +118,17 @@ Button { when: control.down PropertyChanges { target: textItem - color: "#ffffff" + color: "#41cd52" + border.color: "#41cd52" + font.pixelSize: 34 + font.family: "Titillium Web ExtraLight" } PropertyChanges { target: buttonBackground color: "#41cd52" - border.color: "#00000000" + border.color: "#41cd52" } } ] } - -/*##^## -Designer { - D{i:0;height:100;width:500} -} -##^##*/ diff --git a/doc/qtdesignstudio/examples/loginui1/Screen01.ui.qml b/doc/qtdesignstudio/examples/loginui1/content/Screen01.ui.qml similarity index 89% rename from doc/qtdesignstudio/examples/loginui1/Screen01.ui.qml rename to doc/qtdesignstudio/examples/loginui1/content/Screen01.ui.qml index 9fbbf7fb090..de16a1ba014 100644 --- a/doc/qtdesignstudio/examples/loginui1/Screen01.ui.qml +++ b/doc/qtdesignstudio/examples/loginui1/content/Screen01.ui.qml @@ -1,8 +1,6 @@ - - /**************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Design Studio. @@ -49,9 +47,10 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + import QtQuick import QtQuick.Controls -import loginui1 1.0 +import Loginui1 Rectangle { width: Constants.width @@ -70,47 +69,44 @@ Rectangle { Image { id: qt_logo_green_128x128px x: 296 - y: 40 + y: 0 source: "images/qt_logo_green_128x128px.png" fillMode: Image.PreserveAspectFit } Text { - id: tagLine - width: 541 - height: 78 color: "#ffffff" text: qsTr("Are you ready to explore?") font.pixelSize: 50 font.family: "Titillium Web ExtraLight" - anchors.verticalCenterOffset: -391 - anchors.horizontalCenterOffset: 18 + anchors.verticalCenterOffset: -430 + anchors.horizontalCenterOffset: 0 anchors.centerIn: parent } EntryField { id: username - x: 128 + x: 110 y: 470 - text: "Username or Email" + text: qsTr("Username or Email") } EntryField { id: password - x: 128 + x: 110 y: 590 text: qsTr("Password") } PushButton { id: login - x: 102 - y: 966 + x: 101 + y: 944 text: qsTr("Continue") } PushButton { - id: createAccount - x: 102 + id: creteAccount + x: 101 y: 1088 text: qsTr("Create Account") } @@ -118,7 +114,7 @@ Rectangle { /*##^## Designer { - D{i:0;formeditorZoom:0.33} + D{i:0;formeditorZoom:0.5}D{i:1}D{i:2}D{i:3}D{i:4}D{i:5}D{i:6}D{i:7} } ##^##*/ diff --git a/doc/qtdesignstudio/examples/loginui1/images/adventurePage.jpg b/doc/qtdesignstudio/examples/loginui1/content/images/adventurePage.jpg similarity index 100% rename from doc/qtdesignstudio/examples/loginui1/images/adventurePage.jpg rename to doc/qtdesignstudio/examples/loginui1/content/images/adventurePage.jpg diff --git a/doc/qtdesignstudio/examples/loginui1/content/images/qt_logo_green_128x128px.png b/doc/qtdesignstudio/examples/loginui1/content/images/qt_logo_green_128x128px.png new file mode 100644 index 00000000000..2f3c7550774 Binary files /dev/null and b/doc/qtdesignstudio/examples/loginui1/content/images/qt_logo_green_128x128px.png differ diff --git a/doc/qtdesignstudio/examples/loginui1/images/qt_logo_green_128x128px.png b/doc/qtdesignstudio/examples/loginui1/images/qt_logo_green_128x128px.png deleted file mode 100644 index 1a002353a55..00000000000 Binary files a/doc/qtdesignstudio/examples/loginui1/images/qt_logo_green_128x128px.png and /dev/null differ diff --git a/doc/qtdesignstudio/examples/loginui1/imports/loginui1/EventListModel.qml b/doc/qtdesignstudio/examples/loginui1/imports/loginui1/EventListModel.qml new file mode 100644 index 00000000000..b213175da8f --- /dev/null +++ b/doc/qtdesignstudio/examples/loginui1/imports/loginui1/EventListModel.qml @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Quick Designer Components. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick + +ListModel { + id: eventListModel + + ListElement { + eventId: "enterPressed" + eventDescription: "Emitted when pressing the enter button" + shortcut: "Return" + parameters: "Enter" + } +} diff --git a/doc/qtdesignstudio/examples/loginui1/imports/loginui1/EventListSimulator.qml b/doc/qtdesignstudio/examples/loginui1/imports/loginui1/EventListSimulator.qml new file mode 100644 index 00000000000..a7d0fd5b772 --- /dev/null +++ b/doc/qtdesignstudio/examples/loginui1/imports/loginui1/EventListSimulator.qml @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Quick Designer Components. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtQuick.Studio.EventSimulator 1.0 +import QtQuick.Studio.EventSystem 1.0 + +QtObject { + id: simulator + property bool active: true + + property Timer __timer: Timer { + id: timer + interval: 100 + onTriggered: { + EventSimulator.show() + } + } + + Component.onCompleted: { + EventSystem.init(Qt.resolvedUrl("EventListModel.qml")) + if (simulator.active) + timer.start() + } +} diff --git a/doc/qtdesignstudio/examples/loginui1/imports/loginui1/qmldir b/doc/qtdesignstudio/examples/loginui1/imports/loginui1/qmldir index 69846237302..e96c109449c 100644 --- a/doc/qtdesignstudio/examples/loginui1/imports/loginui1/qmldir +++ b/doc/qtdesignstudio/examples/loginui1/imports/loginui1/qmldir @@ -1,2 +1,6 @@ +Module Loginui1 singleton Constants 1.0 Constants.qml EventListSimulator 1.0 EventListSimulator.qml +EventListModel 1.0 EventListModel.qml +DirectoryFontLoader 1.0 DirectoryFontLoader.qml + diff --git a/doc/qtdesignstudio/examples/loginui1/loginui1.qml b/doc/qtdesignstudio/examples/loginui1/loginui1.qml deleted file mode 100644 index 68ded96dd7b..00000000000 --- a/doc/qtdesignstudio/examples/loginui1/loginui1.qml +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Design Studio. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick -import loginui1 1.0 - -Item { - width: Constants.width - height: Constants.height - - Screen01 { - } - -} diff --git a/doc/qtdesignstudio/examples/loginui1/loginui1.qmlproject b/doc/qtdesignstudio/examples/loginui1/loginui1.qmlproject index a11e3d77c75..5b34751fa51 100644 --- a/doc/qtdesignstudio/examples/loginui1/loginui1.qmlproject +++ b/doc/qtdesignstudio/examples/loginui1/loginui1.qmlproject @@ -1,21 +1,69 @@ -/* File generated by Qt Creator */ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Design Studio. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ -import QmlProject 1.1 +import QmlProject Project { - mainFile: "loginui1.qml" + mainFile: "content/App.qml" /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { - directory: "." + directory: "content" } JavaScriptFiles { - directory: "." + directory: "content" } ImageFiles { - directory: "." + directory: "content" } Files { @@ -32,9 +80,34 @@ Project { filter: "*.ttf;*.otf" } + Files { + filter: "*.wav;*.mp3" + } + + Files { + filter: "*.mp4" + } + + Files { + filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag" + } + + Files { + filter: "*.mesh" + directory: "asset_imports" + } + Environment { QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" QT_AUTO_SCREEN_SCALE_FACTOR: "1" + QT_LOGGING_RULES: "qt.qml.connections=false" + QT_ENABLE_HIGHDPI_SCALING: "0" + /* Useful for debugging + QSG_VISUALIZE=batches + QSG_VISUALIZE=clip + QSG_VISUALIZE=changes + QSG_VISUALIZE=overdraw + */ } qt6Project: true @@ -43,5 +116,10 @@ Project { importPaths: [ "imports", "asset_imports" ] /* Required for deployment */ - targetDirectory: "/opt/loginui1" + targetDirectory: "/opt/Loginui1" + + qdsVersion: "3.0" + + /* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */ + widgetApp: true } diff --git a/doc/qtdesignstudio/examples/loginui1/qtquickcontrols2.conf b/doc/qtdesignstudio/examples/loginui1/qtquickcontrols2.conf deleted file mode 100644 index 75b2cb8fffb..00000000000 --- a/doc/qtdesignstudio/examples/loginui1/qtquickcontrols2.conf +++ /dev/null @@ -1,6 +0,0 @@ -; This file can be edited to change the style of the application -; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html - -[Controls] -Style=Default diff --git a/doc/qtdesignstudio/examples/loginui4/loginui4.qml b/doc/qtdesignstudio/examples/loginui1/src/app_environment.h similarity index 85% rename from doc/qtdesignstudio/examples/loginui4/loginui4.qml rename to doc/qtdesignstudio/examples/loginui1/src/app_environment.h index 6ce943cc3da..5961a217045 100644 --- a/doc/qtdesignstudio/examples/loginui4/loginui4.qml +++ b/doc/qtdesignstudio/examples/loginui1/src/app_environment.h @@ -1,6 +1,11 @@ +/* + * This file is automatically generated by Qt Design Studio. + * Do not change. +*/ + /**************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Design Studio. @@ -48,14 +53,12 @@ ** ****************************************************************************/ -import QtQuick -import loginui4 1.0 - -Item { - width: Constants.width - height: Constants.height - - Screen01 { - } +#include +void set_qt_environment() +{ + qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1"); + qputenv("QT_ENABLE_HIGHDPI_SCALING", "0"); + qputenv("QT_LOGGING_RULES", "qt.qml.connections=false"); + qputenv("QT_QUICK_CONTROLS_CONF", ":/qtquickcontrols2.conf"); } diff --git a/doc/qtdesignstudio/examples/loginui1/src/import_qml_plugins.h b/doc/qtdesignstudio/examples/loginui1/src/import_qml_plugins.h new file mode 100644 index 00000000000..18e0e769915 --- /dev/null +++ b/doc/qtdesignstudio/examples/loginui1/src/import_qml_plugins.h @@ -0,0 +1,9 @@ +/* + * This file is automatically generated by Qt Design Studio. + * Do not change. +*/ + +#include + +Q_IMPORT_QML_PLUGIN(contentPlugin) +Q_IMPORT_QML_PLUGIN(Loginui1Plugin) diff --git a/doc/qtdesignstudio/examples/loginui1/src/main.cpp b/doc/qtdesignstudio/examples/loginui1/src/main.cpp new file mode 100644 index 00000000000..aaf18173a1a --- /dev/null +++ b/doc/qtdesignstudio/examples/loginui1/src/main.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Quick Studio Components. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "app_environment.h" +#include "import_qml_plugins.h" + +int main(int argc, char *argv[]) +{ + set_qt_environment(); + + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + const QUrl url(u"qrc:Main/main.qml"_qs); + QObject::connect( + &engine, &QQmlApplicationEngine::objectCreated, &app, + [url](QObject *obj, const QUrl &objUrl) { + if (!obj && url == objUrl) + QCoreApplication::exit(-1); + }, + Qt::QueuedConnection); + + engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml"); + engine.addImportPath(":/"); + + engine.load(url); + + if (engine.rootObjects().isEmpty()) { + return -1; + } + + return app.exec(); +} diff --git a/doc/qtdesignstudio/examples/loginui2/Loginui2.qmlproject b/doc/qtdesignstudio/examples/loginui2/Loginui2.qmlproject new file mode 100644 index 00000000000..467ccd3c545 --- /dev/null +++ b/doc/qtdesignstudio/examples/loginui2/Loginui2.qmlproject @@ -0,0 +1,75 @@ +import QmlProject + +Project { + mainFile: "content/App.qml" + + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "content" + } + + JavaScriptFiles { + directory: "content" + } + + ImageFiles { + directory: "content" + } + + Files { + filter: "*.conf" + files: ["qtquickcontrols2.conf"] + } + + Files { + filter: "qmldir" + directory: "." + } + + Files { + filter: "*.ttf;*.otf" + } + + Files { + filter: "*.wav;*.mp3" + } + + Files { + filter: "*.mp4" + } + + Files { + filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag" + } + + Files { + filter: "*.mesh" + directory: "asset_imports" + } + + Environment { + QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" + QT_AUTO_SCREEN_SCALE_FACTOR: "1" + QT_LOGGING_RULES: "qt.qml.connections=false" + QT_ENABLE_HIGHDPI_SCALING: "0" + /* Useful for debugging + QSG_VISUALIZE=batches + QSG_VISUALIZE=clip + QSG_VISUALIZE=changes + QSG_VISUALIZE=overdraw + */ + } + + qt6Project: true + + /* List of plugin directories passed to QML runtime */ + importPaths: [ "imports", "asset_imports" ] + + /* Required for deployment */ + targetDirectory: "/opt/Loginui1" + + qdsVersion: "3.0" + + /* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */ + widgetApp: true +} diff --git a/doc/qtdesignstudio/examples/loginui2/Screen01.ui.qml b/doc/qtdesignstudio/examples/loginui2/content/Screen01.ui.qml similarity index 92% rename from doc/qtdesignstudio/examples/loginui2/Screen01.ui.qml rename to doc/qtdesignstudio/examples/loginui2/content/Screen01.ui.qml index 6466b19bd06..c806c43034a 100644 --- a/doc/qtdesignstudio/examples/loginui2/Screen01.ui.qml +++ b/doc/qtdesignstudio/examples/loginui2/content/Screen01.ui.qml @@ -1,8 +1,6 @@ - - /**************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Design Studio. @@ -49,9 +47,10 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + import QtQuick import QtQuick.Controls -import loginui2 1.0 +import Loginui1 Rectangle { id: rectangle @@ -69,7 +68,6 @@ Rectangle { Image { id: qt_logo_green_128x128px - x: 296 anchors.top: parent.top source: "images/qt_logo_green_128x128px.png" anchors.horizontalCenter: parent.horizontalCenter @@ -78,8 +76,6 @@ Rectangle { } Text { id: tagLine - width: 541 - height: 78 color: "#ffffff" text: qsTr("Are you ready to explore?") anchors.top: qt_logo_green_128x128px.bottom @@ -87,11 +83,11 @@ Rectangle { anchors.topMargin: 40 anchors.horizontalCenter: parent.horizontalCenter font.family: "Titillium Web ExtraLight" + anchors.horizontalCenterOffset: 0 } Column { id: fields - x: 128 anchors.top: tagLine.bottom anchors.horizontalCenter: parent.horizontalCenter anchors.topMargin: 170 @@ -99,7 +95,7 @@ Rectangle { EntryField { id: username - text: "Username or Email" + text: qsTr("Username or Email") } EntryField { @@ -110,11 +106,10 @@ Rectangle { Column { id: buttons - x: 102 - y: 966 + y: 944 anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter - anchors.bottomMargin: 100 + anchors.bottomMargin: 50 spacing: 20 PushButton { @@ -123,7 +118,7 @@ Rectangle { } PushButton { - id: createAccount + id: creteAccount text: qsTr("Create Account") } } @@ -131,7 +126,7 @@ Rectangle { /*##^## Designer { - D{i:0;formeditorZoom:0.5}D{i:1}D{i:2}D{i:4} + D{i:0;formeditorZoom:0.66}D{i:1}D{i:2}D{i:3}D{i:5}D{i:6}D{i:4}D{i:8}D{i:9}D{i:7} } ##^##*/ diff --git a/doc/qtdesignstudio/examples/loginui2/imports/loginui2/Constants.qml b/doc/qtdesignstudio/examples/loginui2/imports/loginui2/Constants.qml deleted file mode 100644 index 6fef815fa14..00000000000 --- a/doc/qtdesignstudio/examples/loginui2/imports/loginui2/Constants.qml +++ /dev/null @@ -1,26 +0,0 @@ -pragma Singleton -import QtQuick - -QtObject { - readonly property int width: 720 - readonly property int height: 1280 - - property alias fontDirectory: directoryFontLoader.fontDirectory - property alias relativeFontDirectory: directoryFontLoader.relativeFontDirectory - - /* Edit this comment to add your custom font */ - readonly property font font: Qt.font({ - family: Qt.application.font.family, - pixelSize: Qt.application.font.pixelSize - }) - readonly property font largeFont: Qt.font({ - family: Qt.application.font.family, - pixelSize: Qt.application.font.pixelSize * 1.6 - }) - - readonly property color backgroundColor: "#c2c2c2" - - property DirectoryFontLoader directoryFontLoader: DirectoryFontLoader { - id: directoryFontLoader - } -} diff --git a/doc/qtdesignstudio/examples/loginui2/imports/loginui2/qmldir b/doc/qtdesignstudio/examples/loginui2/imports/loginui2/qmldir deleted file mode 100644 index 69846237302..00000000000 --- a/doc/qtdesignstudio/examples/loginui2/imports/loginui2/qmldir +++ /dev/null @@ -1,2 +0,0 @@ -singleton Constants 1.0 Constants.qml -EventListSimulator 1.0 EventListSimulator.qml diff --git a/doc/qtdesignstudio/examples/loginui2/loginui2.qml b/doc/qtdesignstudio/examples/loginui2/loginui2.qml deleted file mode 100644 index 127e947a1c5..00000000000 --- a/doc/qtdesignstudio/examples/loginui2/loginui2.qml +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Design Studio. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick -import loginui2 1.0 - -Item { - width: Constants.width - height: Constants.height - - Screen01 { - } - -} diff --git a/doc/qtdesignstudio/examples/loginui2/loginui2.qmlproject b/doc/qtdesignstudio/examples/loginui2/loginui2.qmlproject deleted file mode 100644 index 7d9e775731f..00000000000 --- a/doc/qtdesignstudio/examples/loginui2/loginui2.qmlproject +++ /dev/null @@ -1,47 +0,0 @@ -/* File generated by Qt Creator */ - -import QmlProject 1.1 - -Project { - mainFile: "loginui2.qml" - - /* Include .qml, .js, and image files from current directory and subdirectories */ - QmlFiles { - directory: "." - } - - JavaScriptFiles { - directory: "." - } - - ImageFiles { - directory: "." - } - - Files { - filter: "*.conf" - files: ["qtquickcontrols2.conf"] - } - - Files { - filter: "qmldir" - directory: "." - } - - Files { - filter: "*.ttf;*.otf" - } - - Environment { - QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" - QT_AUTO_SCREEN_SCALE_FACTOR: "1" - } - - qt6Project: true - - /* List of plugin directories passed to QML runtime */ - importPaths: [ "imports", "asset_imports" ] - - /* Required for deployment */ - targetDirectory: "/opt/loginui1" -} diff --git a/doc/qtdesignstudio/examples/loginui2/qtquickcontrols2.conf b/doc/qtdesignstudio/examples/loginui2/qtquickcontrols2.conf deleted file mode 100644 index 75b2cb8fffb..00000000000 --- a/doc/qtdesignstudio/examples/loginui2/qtquickcontrols2.conf +++ /dev/null @@ -1,6 +0,0 @@ -; This file can be edited to change the style of the application -; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html - -[Controls] -Style=Default diff --git a/doc/qtdesignstudio/examples/loginui3/Loginui3.qmlproject b/doc/qtdesignstudio/examples/loginui3/Loginui3.qmlproject new file mode 100644 index 00000000000..467ccd3c545 --- /dev/null +++ b/doc/qtdesignstudio/examples/loginui3/Loginui3.qmlproject @@ -0,0 +1,75 @@ +import QmlProject + +Project { + mainFile: "content/App.qml" + + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "content" + } + + JavaScriptFiles { + directory: "content" + } + + ImageFiles { + directory: "content" + } + + Files { + filter: "*.conf" + files: ["qtquickcontrols2.conf"] + } + + Files { + filter: "qmldir" + directory: "." + } + + Files { + filter: "*.ttf;*.otf" + } + + Files { + filter: "*.wav;*.mp3" + } + + Files { + filter: "*.mp4" + } + + Files { + filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag" + } + + Files { + filter: "*.mesh" + directory: "asset_imports" + } + + Environment { + QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" + QT_AUTO_SCREEN_SCALE_FACTOR: "1" + QT_LOGGING_RULES: "qt.qml.connections=false" + QT_ENABLE_HIGHDPI_SCALING: "0" + /* Useful for debugging + QSG_VISUALIZE=batches + QSG_VISUALIZE=clip + QSG_VISUALIZE=changes + QSG_VISUALIZE=overdraw + */ + } + + qt6Project: true + + /* List of plugin directories passed to QML runtime */ + importPaths: [ "imports", "asset_imports" ] + + /* Required for deployment */ + targetDirectory: "/opt/Loginui1" + + qdsVersion: "3.0" + + /* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */ + widgetApp: true +} diff --git a/doc/qtdesignstudio/examples/loginui3/Screen01.ui.qml b/doc/qtdesignstudio/examples/loginui3/content/Screen01.ui.qml similarity index 93% rename from doc/qtdesignstudio/examples/loginui3/Screen01.ui.qml rename to doc/qtdesignstudio/examples/loginui3/content/Screen01.ui.qml index 28131577351..55bf71619d7 100644 --- a/doc/qtdesignstudio/examples/loginui3/Screen01.ui.qml +++ b/doc/qtdesignstudio/examples/loginui3/content/Screen01.ui.qml @@ -1,8 +1,6 @@ - - /**************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Design Studio. @@ -49,9 +47,10 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + import QtQuick import QtQuick.Controls -import loginui3 1.0 +import Loginui1 Rectangle { id: rectangle @@ -70,7 +69,6 @@ Rectangle { Image { id: qt_logo_green_128x128px - x: 296 anchors.top: parent.top source: "images/qt_logo_green_128x128px.png" anchors.horizontalCenter: parent.horizontalCenter @@ -79,8 +77,6 @@ Rectangle { } Text { id: tagLine - width: 541 - height: 78 color: "#ffffff" text: qsTr("Are you ready to explore?") anchors.top: qt_logo_green_128x128px.bottom @@ -88,11 +84,11 @@ Rectangle { anchors.topMargin: 40 anchors.horizontalCenter: parent.horizontalCenter font.family: "Titillium Web ExtraLight" + anchors.horizontalCenterOffset: 0 } Column { id: fields - x: 128 anchors.top: tagLine.bottom anchors.horizontalCenter: parent.horizontalCenter anchors.topMargin: 170 @@ -100,7 +96,7 @@ Rectangle { EntryField { id: username - text: "Username or Email" + text: qsTr("Username or Email") } EntryField { @@ -110,17 +106,16 @@ Rectangle { EntryField { id: repeatPassword - text: "Repeat Password" + text: qsTr("Repeat Password") } } Column { id: buttons - x: 102 - y: 966 + y: 944 anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter - anchors.bottomMargin: 100 + anchors.bottomMargin: 50 spacing: 20 PushButton { @@ -160,7 +155,8 @@ Rectangle { /*##^## Designer { - D{i:0;formeditorZoom:0.5} + D{i:0;formeditorZoom:0.5}D{i:1}D{i:2}D{i:3}D{i:5}D{i:6}D{i:7}D{i:4}D{i:9}D{i:11}D{i:10} +D{i:8} } ##^##*/ diff --git a/doc/qtdesignstudio/examples/loginui3/imports/loginui3/Constants.qml b/doc/qtdesignstudio/examples/loginui3/imports/loginui3/Constants.qml deleted file mode 100644 index 6fef815fa14..00000000000 --- a/doc/qtdesignstudio/examples/loginui3/imports/loginui3/Constants.qml +++ /dev/null @@ -1,26 +0,0 @@ -pragma Singleton -import QtQuick - -QtObject { - readonly property int width: 720 - readonly property int height: 1280 - - property alias fontDirectory: directoryFontLoader.fontDirectory - property alias relativeFontDirectory: directoryFontLoader.relativeFontDirectory - - /* Edit this comment to add your custom font */ - readonly property font font: Qt.font({ - family: Qt.application.font.family, - pixelSize: Qt.application.font.pixelSize - }) - readonly property font largeFont: Qt.font({ - family: Qt.application.font.family, - pixelSize: Qt.application.font.pixelSize * 1.6 - }) - - readonly property color backgroundColor: "#c2c2c2" - - property DirectoryFontLoader directoryFontLoader: DirectoryFontLoader { - id: directoryFontLoader - } -} diff --git a/doc/qtdesignstudio/examples/loginui3/imports/loginui3/qmldir b/doc/qtdesignstudio/examples/loginui3/imports/loginui3/qmldir deleted file mode 100644 index 69846237302..00000000000 --- a/doc/qtdesignstudio/examples/loginui3/imports/loginui3/qmldir +++ /dev/null @@ -1,2 +0,0 @@ -singleton Constants 1.0 Constants.qml -EventListSimulator 1.0 EventListSimulator.qml diff --git a/doc/qtdesignstudio/examples/loginui3/loginui3.qml b/doc/qtdesignstudio/examples/loginui3/loginui3.qml deleted file mode 100644 index ea8b947d3ce..00000000000 --- a/doc/qtdesignstudio/examples/loginui3/loginui3.qml +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Design Studio. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick -import loginui3 1.0 - -Item { - width: Constants.width - height: Constants.height - - Screen01 { - } - -} diff --git a/doc/qtdesignstudio/examples/loginui3/loginui3.qmlproject b/doc/qtdesignstudio/examples/loginui3/loginui3.qmlproject deleted file mode 100644 index 3015de6092e..00000000000 --- a/doc/qtdesignstudio/examples/loginui3/loginui3.qmlproject +++ /dev/null @@ -1,47 +0,0 @@ -/* File generated by Qt Creator */ - -import QmlProject 1.1 - -Project { - mainFile: "loginui3.qml" - - /* Include .qml, .js, and image files from current directory and subdirectories */ - QmlFiles { - directory: "." - } - - JavaScriptFiles { - directory: "." - } - - ImageFiles { - directory: "." - } - - Files { - filter: "*.conf" - files: ["qtquickcontrols2.conf"] - } - - Files { - filter: "qmldir" - directory: "." - } - - Files { - filter: "*.ttf;*.otf" - } - - Environment { - QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" - QT_AUTO_SCREEN_SCALE_FACTOR: "1" - } - - qt6Project: true - - /* List of plugin directories passed to QML runtime */ - importPaths: [ "imports", "asset_imports" ] - - /* Required for deployment */ - targetDirectory: "/opt/loginui1" -} diff --git a/doc/qtdesignstudio/examples/loginui3/qtquickcontrols2.conf b/doc/qtdesignstudio/examples/loginui3/qtquickcontrols2.conf deleted file mode 100644 index caace6db8e4..00000000000 --- a/doc/qtdesignstudio/examples/loginui3/qtquickcontrols2.conf +++ /dev/null @@ -1,2 +0,0 @@ -[Controls] -Style=Default diff --git a/doc/qtdesignstudio/examples/loginui4/Loginui4.qmlproject b/doc/qtdesignstudio/examples/loginui4/Loginui4.qmlproject new file mode 100644 index 00000000000..467ccd3c545 --- /dev/null +++ b/doc/qtdesignstudio/examples/loginui4/Loginui4.qmlproject @@ -0,0 +1,75 @@ +import QmlProject + +Project { + mainFile: "content/App.qml" + + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "content" + } + + JavaScriptFiles { + directory: "content" + } + + ImageFiles { + directory: "content" + } + + Files { + filter: "*.conf" + files: ["qtquickcontrols2.conf"] + } + + Files { + filter: "qmldir" + directory: "." + } + + Files { + filter: "*.ttf;*.otf" + } + + Files { + filter: "*.wav;*.mp3" + } + + Files { + filter: "*.mp4" + } + + Files { + filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag" + } + + Files { + filter: "*.mesh" + directory: "asset_imports" + } + + Environment { + QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" + QT_AUTO_SCREEN_SCALE_FACTOR: "1" + QT_LOGGING_RULES: "qt.qml.connections=false" + QT_ENABLE_HIGHDPI_SCALING: "0" + /* Useful for debugging + QSG_VISUALIZE=batches + QSG_VISUALIZE=clip + QSG_VISUALIZE=changes + QSG_VISUALIZE=overdraw + */ + } + + qt6Project: true + + /* List of plugin directories passed to QML runtime */ + importPaths: [ "imports", "asset_imports" ] + + /* Required for deployment */ + targetDirectory: "/opt/Loginui1" + + qdsVersion: "3.0" + + /* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */ + widgetApp: true +} diff --git a/doc/qtdesignstudio/examples/loginui4/Screen01.ui.qml b/doc/qtdesignstudio/examples/loginui4/content/Screen01.ui.qml similarity index 53% rename from doc/qtdesignstudio/examples/loginui4/Screen01.ui.qml rename to doc/qtdesignstudio/examples/loginui4/content/Screen01.ui.qml index e919f39d82e..fa8377b980f 100644 --- a/doc/qtdesignstudio/examples/loginui4/Screen01.ui.qml +++ b/doc/qtdesignstudio/examples/loginui4/content/Screen01.ui.qml @@ -1,57 +1,6 @@ - - -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Design Studio. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ import QtQuick import QtQuick.Controls -import loginui4 1.0 +import Loginui1 import QtQuick.Timeline 1.0 Rectangle { @@ -71,7 +20,6 @@ Rectangle { Image { id: qt_logo_green_128x128px - x: 296 anchors.top: parent.top source: "images/qt_logo_green_128x128px.png" anchors.horizontalCenter: parent.horizontalCenter @@ -80,8 +28,6 @@ Rectangle { } Text { id: tagLine - width: 541 - height: 78 color: "#ffffff" text: qsTr("Are you ready to explore?") anchors.top: qt_logo_green_128x128px.bottom @@ -89,30 +35,29 @@ Rectangle { anchors.topMargin: 40 anchors.horizontalCenter: parent.horizontalCenter font.family: "Titillium Web ExtraLight" + anchors.horizontalCenterOffset: 0 } EntryField { id: username - x: 110 - text: "Username or Email" + text: qsTr("Username or Email") anchors.top: tagLine.bottom - anchors.topMargin: 170 anchors.horizontalCenter: parent.horizontalCenter + anchors.topMargin: 170 } EntryField { id: password - x: 110 text: qsTr("Password") anchors.top: username.bottom anchors.horizontalCenter: parent.horizontalCenter - anchors.topMargin: 20 + anchors.topMargin: 21 } EntryField { id: repeatPassword - x: 110 - text: "Repeat Password" + opacity: 0 + text: qsTr("Repeat Password") anchors.top: password.bottom anchors.horizontalCenter: parent.horizontalCenter anchors.topMargin: 20 @@ -120,11 +65,10 @@ Rectangle { Column { id: buttons - x: 102 - y: 966 + y: 944 anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter - anchors.bottomMargin: 100 + anchors.bottomMargin: 50 spacing: 20 PushButton { @@ -148,70 +92,68 @@ Rectangle { animations: [ TimelineAnimation { id: toCreateAccountState + duration: 1000 running: false loops: 1 - duration: 1000 to: 1000 from: 0 } ] endFrame: 1000 - startFrame: 0 enabled: true + startFrame: 0 KeyframeGroup { target: repeatPassword property: "opacity" - Keyframe { - frame: 0 value: 0 + frame: 0 } Keyframe { - frame: 999 value: 1 + frame: 1000 } } KeyframeGroup { target: createAccount property: "opacity" + Keyframe { + value: 1 + frame: 0 + } Keyframe { - frame: 1000 value: 0 + frame: 1000 } } KeyframeGroup { target: repeatPassword property: "anchors.topMargin" - Keyframe { + value: -100 frame: 0 - value: -40 } Keyframe { - easing.bezierCurve: [0.39,0.575,0.565,1,1,1] - frame: 999 + value: -100 + frame: 4 + } + + Keyframe { + easing.bezierCurve: [0.39, 0.575, 0.565, 1, 1, 1] value: 20 + frame: 999 } } } states: [ State { name: "login" - - PropertyChanges { - target: timeline - enabled: true - } - - PropertyChanges { - target: toCreateAccountState - } }, State { name: "createAccount" @@ -231,6 +173,8 @@ Rectangle { /*##^## Designer { - D{i:0;formeditorZoom:0.5}D{i:6}D{i:9}D{i:11} + D{i:0;formeditorZoom:0.5}D{i:1}D{i:2}D{i:3}D{i:4}D{i:5}D{i:6}D{i:8}D{i:10}D{i:9}D{i:7} +D{i:11} } ##^##*/ + diff --git a/doc/qtdesignstudio/examples/loginui4/imports/loginui4/Constants.qml b/doc/qtdesignstudio/examples/loginui4/imports/loginui4/Constants.qml deleted file mode 100644 index 6fef815fa14..00000000000 --- a/doc/qtdesignstudio/examples/loginui4/imports/loginui4/Constants.qml +++ /dev/null @@ -1,26 +0,0 @@ -pragma Singleton -import QtQuick - -QtObject { - readonly property int width: 720 - readonly property int height: 1280 - - property alias fontDirectory: directoryFontLoader.fontDirectory - property alias relativeFontDirectory: directoryFontLoader.relativeFontDirectory - - /* Edit this comment to add your custom font */ - readonly property font font: Qt.font({ - family: Qt.application.font.family, - pixelSize: Qt.application.font.pixelSize - }) - readonly property font largeFont: Qt.font({ - family: Qt.application.font.family, - pixelSize: Qt.application.font.pixelSize * 1.6 - }) - - readonly property color backgroundColor: "#c2c2c2" - - property DirectoryFontLoader directoryFontLoader: DirectoryFontLoader { - id: directoryFontLoader - } -} diff --git a/doc/qtdesignstudio/examples/loginui4/imports/loginui4/qmldir b/doc/qtdesignstudio/examples/loginui4/imports/loginui4/qmldir deleted file mode 100644 index 69846237302..00000000000 --- a/doc/qtdesignstudio/examples/loginui4/imports/loginui4/qmldir +++ /dev/null @@ -1,2 +0,0 @@ -singleton Constants 1.0 Constants.qml -EventListSimulator 1.0 EventListSimulator.qml diff --git a/doc/qtdesignstudio/examples/loginui4/loginui4.qmlproject b/doc/qtdesignstudio/examples/loginui4/loginui4.qmlproject deleted file mode 100644 index 9bb93ec5dd2..00000000000 --- a/doc/qtdesignstudio/examples/loginui4/loginui4.qmlproject +++ /dev/null @@ -1,47 +0,0 @@ -/* File generated by Qt Creator */ - -import QmlProject 1.1 - -Project { - mainFile: "loginui4.qml" - - /* Include .qml, .js, and image files from current directory and subdirectories */ - QmlFiles { - directory: "." - } - - JavaScriptFiles { - directory: "." - } - - ImageFiles { - directory: "." - } - - Files { - filter: "*.conf" - files: ["qtquickcontrols2.conf"] - } - - Files { - filter: "qmldir" - directory: "." - } - - Files { - filter: "*.ttf;*.otf" - } - - Environment { - QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" - QT_AUTO_SCREEN_SCALE_FACTOR: "1" - } - - qt6Project: true - - /* List of plugin directories passed to QML runtime */ - importPaths: [ "imports", "asset_imports" ] - - /* Required for deployment */ - targetDirectory: "/opt/loginui4" -} diff --git a/doc/qtdesignstudio/examples/loginui4/qtquickcontrols2.conf b/doc/qtdesignstudio/examples/loginui4/qtquickcontrols2.conf deleted file mode 100644 index caace6db8e4..00000000000 --- a/doc/qtdesignstudio/examples/loginui4/qtquickcontrols2.conf +++ /dev/null @@ -1,2 +0,0 @@ -[Controls] -Style=Default diff --git a/doc/qtdesignstudio/images/enable-multilanguage.png b/doc/qtdesignstudio/images/enable-multilanguage.png deleted file mode 100644 index ebb528a81a2..00000000000 Binary files a/doc/qtdesignstudio/images/enable-multilanguage.png and /dev/null differ diff --git a/doc/qtdesignstudio/images/studio-translations-view.png b/doc/qtdesignstudio/images/studio-translations-view.png index 454e8ce2a23..d5a843d0df6 100644 Binary files a/doc/qtdesignstudio/images/studio-translations-view.png and b/doc/qtdesignstudio/images/studio-translations-view.png differ diff --git a/doc/qtdesignstudio/images/translation-tester.png b/doc/qtdesignstudio/images/translation-tester.png index 6b1e6f024df..6a3f7441805 100644 Binary files a/doc/qtdesignstudio/images/translation-tester.png and b/doc/qtdesignstudio/images/translation-tester.png differ diff --git a/doc/qtdesignstudio/src/views/studio-translations.qdoc b/doc/qtdesignstudio/src/views/studio-translations.qdoc index 75aaf32179f..c7767d98b8c 100644 --- a/doc/qtdesignstudio/src/views/studio-translations.qdoc +++ b/doc/qtdesignstudio/src/views/studio-translations.qdoc @@ -63,12 +63,14 @@ \li \l{Generating Qt Translation Source Files} \row \li \inlineimage icons/project-translation-test.png - \li Run project translation test. - \li \l{Running the Project Translation Test} + \li Run translation test for several documents and create a test report. + \li \l{Running Translation Test for Several Documents} \row \li \inlineimage icons/qml-translation-test.png - \li Run QML translation test to find missing and elided translations. - \li \l{Running the QML Translation Test} + \li Run translation test for the currently open document. This test + shows translation warnings in \uicontrol{From Editor} and creates a + test report. + \li \l{Running Translation Test for a Single Document} \row \li \inlineimage icons/export-translations.png \li Export all translations used in your project or all translations @@ -93,8 +95,8 @@ "translation": "Password" }, { - "language": "sv", - "translation": "Lösenord" + "language": "fi", + "translation": "Salasana" } ] } @@ -120,8 +122,8 @@ "translation": "Password" }, { - "language": "sv", - "translation": "Lösenord" + "language": "fi", + "translation": "Salasana" } ] \endcode @@ -139,14 +141,14 @@ in the \uicontrol Translations view. The files are generated in \e{/i18n}. - \section1 Running the QML Translation Test + \section1 Running Translation Test for a Single Document - You can run the QML language test to find missing - and elided translations. Running the QML language test - is a quick way to check the translations in the application you have open in - \uicontrol{Form Editor} as it highlights errors in the UI. + You can run the translation test to find missing translations + and translations where the text exceeds the text element boundaries. Running + the test is a quick way to check the translations in the document you have + open in \uicontrol{Form Editor} as it highlights errors in the UI. - To run the QML translation test: + To run the test for the currently open document: \list 1 \li In the \uicontrol Translations view, select @@ -155,12 +157,11 @@ \li Select the tests to run and the highlight color for each test: \list - \li \uicontrol{Show Translation Warnings} highlights missing - translations. - \li \uicontrol{Show Found Translations} highlights all translations - that are correct. - \li \uicontrol{Show Elide Warnings} highlights all translations where - the text is too long to fit in the text object and therefore is elided. + \li \uicontrol{Success} highlights translations without any warnings. + \li \uicontrol{Missing translation} highlights translations that are + missing for one or more languages. + \li \uicontrol{Exceeds boundaries} highlights translations where + the text is too long to fit in the text object. \endlist \image translation-tester.png \li Select \uicontrol{Run Tests}. @@ -205,16 +206,21 @@ The report shows the type of error as well as line and column of the affected text element in the \e{ui.qml} file. - \section1 Running the Project Translation Test + \section1 Running Translation Test for Several Documents You can run the project translation test on several \e{.ui.qml} files at the same time. \QDS runs the same tests as during the - \l{Running the QML Translation Test}{QML Translation Test} and generates the - same test reports but does not highlight errors in the UI. + \l{Running Translation Test for a Single Document}{Translation Test} and + generates the same test reports but does not highlight errors in the UI. - To run the project translation test, select - \inlineimage icons/project-translation-test.png - in the \uicontrol Translations view. + To run the translation test for several documents: + \list 1 + \li Select + \inlineimage icons/project-translation-test.png + in the \uicontrol Translations view. + \li Select the files that you want to include in the test. + \li Select \uicontrol{Run Tests}. + \endlist \section1 Exporting Translations in Other Ways diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml index a1061ba672c..eb7d50d2e4f 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml @@ -872,6 +872,13 @@ Item { camera: viewRoot.usePerspective ? overlayPerspectiveCamera : overlayOrthoCamera importScene: overlayScene z: 2 + + environment: sceneEnv + SceneEnvironment { + id: sceneEnv + antialiasingMode: SceneEnvironment.MSAA + antialiasingQuality: SceneEnvironment.High + } } Overlay2D { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SceneView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SceneView3D.qml index c75472096e7..e59392b1ee2 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SceneView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SceneView3D.qml @@ -50,6 +50,13 @@ View3D { thresPerc = (grid_thresholds[thresIdx] - cameraZoomFactor) / (grid_thresholds[thresIdx] - grid_thresholds[thresIdx - 1]); } + environment: sceneEnv + SceneEnvironment { + id: sceneEnv + antialiasingMode: SceneEnvironment.MSAA + antialiasingQuality: SceneEnvironment.High + } + Node { id: sceneHelpers diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp index 4260921a378..046dc486063 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp @@ -142,6 +142,16 @@ void CameraGeometry::doUpdateGeometry() if (!QQuick3DObjectPrivate::get(m_camera)->spatialNode) { // Doing explicit viewport mapping forces cameraNode creation m_camera->mapToViewport({}, m_viewPortRect.width(), m_viewPortRect.height()); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + if (!m_nodeCreationUpdateDone) { + // Post-node creation update is done only once to avoid infinite loop in case the node + // creation fails. + m_nodeCreationUpdateDone = true; + m_cameraUpdatePending = true; + update(); + return; + } +#endif } GeometryBase::doUpdateGeometry(); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.h index 5b4fa66fe46..c65b0d1798e 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.h @@ -67,6 +67,9 @@ private: QQuick3DCamera *m_camera = nullptr; QRectF m_viewPortRect; bool m_cameraUpdatePending = false; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + bool m_nodeCreationUpdateDone = false; +#endif }; } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp index a4e950b238b..cee091531a7 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp @@ -729,7 +729,8 @@ void MouseArea3D::applyFreeRotation(QQuick3DNode *node, const QVector3D &startRo if (dragVector.length() < 0.001f) return; - const float *dataPtr(sceneTransform().data()); + const auto &transform = sceneTransform(); + const float *dataPtr(transform.data()); QVector3D xAxis = QVector3D(dataPtr[0], dataPtr[1], dataPtr[2]).normalized(); QVector3D yAxis = QVector3D(dataPtr[4], dataPtr[5], dataPtr[6]).normalized(); QVector3D finalAxis = (dragVector.x() * yAxis + dragVector.y() * xAxis); @@ -1029,7 +1030,8 @@ void MouseArea3D::setHovering(bool enable) QVector3D MouseArea3D::getNormal() const { - const float *dataPtr(sceneTransform().data()); + const auto &transform = sceneTransform(); + const float *dataPtr(transform.data()); return QVector3D(dataPtr[8], dataPtr[9], dataPtr[10]).normalized(); } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppetmain.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppetmain.cpp index 4b3d047142e..d5371e4b5e4 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppetmain.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppetmain.cpp @@ -241,7 +241,7 @@ int internalMain(QGuiApplication *application) #endif #if defined(ENABLE_CRASHPAD) && defined(Q_OS_WIN) - startCrashpad(); + /* startCrashpad(); */ #endif new QmlDesigner::Qt5NodeInstanceClientProxy(application); diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml index 8444a2c88f6..ab403d203b2 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml @@ -36,7 +36,9 @@ Item { property var selectedAssets: ({}) property int allExpandedState: 0 - property string delFilePath: "" + property string contextFilePath: "" + property var contextDir: undefined + property bool isDirContextMenu: false DropArea { id: dropArea @@ -67,6 +69,19 @@ Item { } } + MouseArea { // right clicking the empty area of the view + anchors.fill: parent + acceptedButtons: Qt.RightButton + onClicked: { + if (!assetsModel.isEmpty) { + contextFilePath = "" + contextDir = assetsModel.rootDir() + isDirContextMenu = false + contextMenu.popup() + } + } + } + // called from C++ to close context menu on focus out function handleViewFocusOut() { @@ -75,9 +90,139 @@ Item { selectedAssetsChanged() } + Dialog { + id: newFolderDialog + + title: qsTr("Create new folder") + anchors.centerIn: parent + closePolicy: Popup.CloseOnEscape + modal: true + + contentItem: Column { + spacing: 2 + + Row { + Text { + text: qsTr("Folder Name: ") + anchors.verticalCenter: parent.verticalCenter + color: StudioTheme.Values.themeTextColor + } + + StudioControls.TextField { + id: folderName + + actionIndicator.visible: false + translationIndicator.visible: false + + Keys.onEnterPressed: btnCreate.onClicked() + Keys.onReturnPressed: btnCreate.onClicked() + } + } + + Text { + text: qsTr("Folder Name cannot be empty.") + color: "#ff0000" + anchors.right: parent.right + visible: folderName.text === "" + } + + Item { // spacer + width: 1 + height: 20 + } + + Row { + anchors.right: parent.right + + Button { + id: btnCreate + + text: qsTr("Create") + enabled: folderName.text !== "" + onClicked: { + assetsModel.addNewFolder(contextDir.dirPath + '/' + folderName.text) + newFolderDialog.accept() + } + } + + Button { + text: qsTr("Cancel") + onClicked: newFolderDialog.reject() + } + } + } + + onOpened: { + folderName.text = "New folder" + folderName.selectAll() + folderName.forceActiveFocus() + } + } + + Dialog { + id: confirmDeleteFolderDialog + + title: qsTr("Folder not empty") + anchors.centerIn: parent + closePolicy: Popup.CloseOnEscape + implicitWidth: 300 + modal: true + + contentItem: Column { + spacing: 20 + width: parent.width + + Text { + id: folderNotEmpty + + text: qsTr("Folder '%1' is not empty. Are you sure you want to delete it?") + .arg(contextDir ? contextDir.dirName : "") + color: StudioTheme.Values.themeTextColor + wrapMode: Text.WordWrap + width: confirmDeleteFolderDialog.width + leftPadding: 10 + rightPadding: 10 + + Keys.onEnterPressed: btnDelete.onClicked() + Keys.onReturnPressed: btnDelete.onClicked() + } + + Text { + text: qsTr("If the folder has assets in use, deleting it might cause the project to not work correctly.") + color: StudioTheme.Values.themeTextColor + wrapMode: Text.WordWrap + width: confirmDeleteFolderDialog.width + leftPadding: 10 + rightPadding: 10 + } + + Row { + anchors.right: parent.right + Button { + id: btnDelete + + text: qsTr("Delete") + + onClicked: { + assetsModel.deleteFolder(contextDir.dirPath) + confirmDeleteFolderDialog.accept() + } + } + + Button { + text: qsTr("Cancel") + onClicked: confirmDeleteFolderDialog.reject() + } + } + } + + onOpened: folderNotEmpty.forceActiveFocus() + } + ScrollView { // TODO: experiment using ListView instead of ScrollView + Column id: assetsView anchors.fill: parent + interactive: assetsView.verticalScrollBarVisible Item { StudioControls.Menu { @@ -86,7 +231,7 @@ Item { StudioControls.MenuItem { text: qsTr("Expand All") enabled: allExpandedState !== 1 - visible: !delFilePath + visible: isDirContextMenu height: visible ? implicitHeight : 0 onTriggered: assetsModel.toggleExpandAll(true) } @@ -94,22 +239,51 @@ Item { StudioControls.MenuItem { text: qsTr("Collapse All") enabled: allExpandedState !== 2 - visible: !delFilePath + visible: isDirContextMenu height: visible ? implicitHeight : 0 onTriggered: assetsModel.toggleExpandAll(false) } + StudioControls.MenuSeparator { + visible: isDirContextMenu + height: visible ? StudioTheme.Values.border : 0 + } + StudioControls.MenuItem { text: qsTr("Delete File") - visible: delFilePath + visible: contextFilePath height: visible ? implicitHeight : 0 - onTriggered: assetsModel.removeFile(delFilePath) + onTriggered: assetsModel.deleteFile(contextFilePath) + } + + StudioControls.MenuSeparator { + visible: contextFilePath + height: visible ? StudioTheme.Values.border : 0 + } + + StudioControls.MenuItem { + text: qsTr("New Folder") + onTriggered: newFolderDialog.open() + } + + StudioControls.MenuItem { + text: qsTr("Delete Folder") + visible: isDirContextMenu + height: visible ? implicitHeight : 0 + onTriggered: { + var dirEmpty = !(contextDir.dirsModel && contextDir.dirsModel.rowCount() > 0) + && !(contextDir.filesModel && contextDir.filesModel.rowCount() > 0); + + if (dirEmpty) + assetsModel.deleteFolder(contextDir.dirPath) + else + confirmDeleteFolderDialog.open() + } } } } Column { - spacing: 2 Repeater { model: assetsModel // context property delegate: dirSection @@ -120,31 +294,35 @@ Item { Section { width: assetsView.width - - (assetsView.verticalScrollBarVisible ? assetsView.verticalThickness : 0) + (assetsView.verticalScrollBarVisible ? assetsView.verticalThickness : 0) - 5 caption: dirName sectionHeight: 30 sectionFontSize: 15 - levelShift: 20 leftPadding: 0 + topPadding: dirDepth > 0 ? 5 : 0 + bottomPadding: 0 hideHeader: dirDepth === 0 - showLeftBorder: true + showLeftBorder: dirDepth > 0 expanded: dirExpanded - visible: dirVisible + visible: !assetsModel.isEmpty && dirVisible expandOnClick: false useDefaulContextMenu: false onToggleExpand: { dirExpanded = !dirExpanded } + onShowContextMenu: { - delFilePath = "" + contextFilePath = "" + contextDir = model + isDirContextMenu = true allExpandedState = assetsModel.getAllExpandedState() contextMenu.popup() } Column { spacing: 5 - leftPadding: 15 + leftPadding: 5 Repeater { model: dirsModel @@ -155,6 +333,25 @@ Item { model: filesModel delegate: fileSection } + + Text { + text: qsTr("Empty folder") + color: StudioTheme.Values.themeTextColorDisabled + font.pixelSize: 12 + visible: !(dirsModel && dirsModel.rowCount() > 0) + && !(filesModel && filesModel.rowCount() > 0) + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.RightButton + onClicked: { + contextFilePath = "" + contextDir = model + isDirContextMenu = true + contextMenu.popup() + } + } + } } } } @@ -222,8 +419,11 @@ Item { if (currFileSelected) rootView.startDragAsset(selectedAssetsArr, mapToGlobal(mouse.x, mouse.y)) } else { - delFilePath = filePath + contextFilePath = filePath + contextDir = model.fileDir + tooltipBackend.hideTooltip() + isDirContextMenu = false contextMenu.popup() } } @@ -263,7 +463,7 @@ Item { // Placeholder when the assets panel is empty Column { id: colNoAssets - visible: assetsModel.isEmpty + visible: assetsModel.isEmpty && !rootView.searchActive spacing: 20 x: 20 @@ -307,4 +507,13 @@ Item { wrapMode: Text.WordWrap } } + + Text { + text: qsTr("No match found.") + x: 20 + y: 10 + color: StudioTheme.Values.themeTextColor + font.pixelSize: 12 + visible: assetsModel.isEmpty && rootView.searchActive + } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Section.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Section.qml index 66f05462c3e..3f8a3311894 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Section.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Section.qml @@ -173,7 +173,7 @@ Item { id: leftBorder visible: false width: 1 - height: parent.height - 15 + height: parent.height - bottomPadding color: header.color } diff --git a/share/qtcreator/qmldesigner/qt4mcu/metadata.qml b/share/qtcreator/qmldesigner/qt4mcu/metadata.qml index d26ef06fd56..ee889214065 100644 --- a/share/qtcreator/qmldesigner/qt4mcu/metadata.qml +++ b/share/qtcreator/qmldesigner/qt4mcu/metadata.qml @@ -27,29 +27,35 @@ Metadata { id: metadataFile - defaultVersion: v19 + defaultVersion: v20 VersionData { id: v14 - name: "QUL 1.4" + name: "Qt for MCUs 1.4" path: "qul-14.qml" } VersionData { id: v17 - name: "QUL 1.7" + name: "Qt for MCUs 1.7" path: "qul-17.qml" } VersionData { id: v18 - name: "QUL 1.8" + name: "Qt for MCUs 1.8" path: "qul-18.qml" } VersionData { id: v19 - name: "QUL 1.9" + name: "Qt for MCUs 1.9" path: "qul-19.qml" } + + VersionData { + id: v20 + name: "Qt for MCUs 2.0" + path: "qul-20.qml" + } } diff --git a/share/qtcreator/qmldesigner/qt4mcu/qul-14.qml b/share/qtcreator/qmldesigner/qt4mcu/qul-14.qml index 03110763f5b..56467f170f0 100644 --- a/share/qtcreator/qmldesigner/qt4mcu/qul-14.qml +++ b/share/qtcreator/qmldesigner/qt4mcu/qul-14.qml @@ -24,7 +24,7 @@ ****************************************************************************/ VersionData { - name: "QUL 1.4" + name: "Qt for MCUs 1.4" bannedItems: ["QtQuick.AnimatedImage", "QtQuick.FocusScope", @@ -34,6 +34,7 @@ VersionData { "QtQuick.Grid", "QtQuick.GridView", "QtQuick.PathView", + "QtQuick.Loader", "QtQuick.Controls", "QtQuick.Controls.BusyIndicator", "QtQuick.Controls.ButtonGroup", diff --git a/share/qtcreator/qmldesigner/qt4mcu/qul-17.qml b/share/qtcreator/qmldesigner/qt4mcu/qul-17.qml index 765c54bd9d7..190d9f398a4 100644 --- a/share/qtcreator/qmldesigner/qt4mcu/qul-17.qml +++ b/share/qtcreator/qmldesigner/qt4mcu/qul-17.qml @@ -24,7 +24,7 @@ ****************************************************************************/ VersionData { - name: "QUL 1.7" + name: "Qt for MCUs 1.7" bannedItems: ["QtQuick.AnimatedImage", "QtQuick.FocusScope", @@ -34,6 +34,7 @@ VersionData { "QtQuick.Grid", "QtQuick.GridView", "QtQuick.PathView", + "QtQuick.Loader", "QtQuick.Controls", "QtQuick.Controls.BusyIndicator", "QtQuick.Controls.ButtonGroup", diff --git a/share/qtcreator/qmldesigner/qt4mcu/qul-18.qml b/share/qtcreator/qmldesigner/qt4mcu/qul-18.qml index 4c0cf5d4b9f..dba879c9a10 100644 --- a/share/qtcreator/qmldesigner/qt4mcu/qul-18.qml +++ b/share/qtcreator/qmldesigner/qt4mcu/qul-18.qml @@ -24,7 +24,7 @@ ****************************************************************************/ VersionData { - name: "QUL 1.8" + name: "Qt for MCUs 1.8" bannedItems: ["QtQuick.AnimatedImage", "QtQuick.FocusScope", @@ -34,6 +34,7 @@ VersionData { "QtQuick.Grid", "QtQuick.GridView", "QtQuick.PathView", + "QtQuick.Loader", "QtQuick.Controls", "QtQuick.Controls.BusyIndicator", "QtQuick.Controls.ButtonGroup", @@ -63,7 +64,11 @@ VersionData { "QtQuick.Controls.TextArea", "QtQuick.Controls.TextField", "QtQuick.Controls.ToolSeparator", - "QtQuick.Controls.Tumbler"] + "QtQuick.Controls.Tumbler", + "QtQuick.Shapes.ConicalGradient", + "QtQuick.Shapes.LinearGradient", + "QtQuick.Shapes.RadialGradient", + "QtQuick.Shapes.ShapeGradient"] allowedImports: ["QtQuick", "QtQuick.Shapes", diff --git a/share/qtcreator/qmldesigner/qt4mcu/qul-19.qml b/share/qtcreator/qmldesigner/qt4mcu/qul-19.qml index be473bc8caf..55f720c45b7 100644 --- a/share/qtcreator/qmldesigner/qt4mcu/qul-19.qml +++ b/share/qtcreator/qmldesigner/qt4mcu/qul-19.qml @@ -24,7 +24,7 @@ ****************************************************************************/ VersionData { - name: "QUL 1.9" + name: "Qt for MCUs 1.9" bannedItems: ["QtQuick.AnimatedImage", "QtQuick.FocusScope", @@ -34,6 +34,7 @@ VersionData { "QtQuick.Grid", "QtQuick.GridView", "QtQuick.PathView", + "QtQuick.Loader", "QtQuick.Controls", "QtQuick.Controls.BusyIndicator", "QtQuick.Controls.ButtonGroup", @@ -63,7 +64,11 @@ VersionData { "QtQuick.Controls.TextArea", "QtQuick.Controls.TextField", "QtQuick.Controls.ToolSeparator", - "QtQuick.Controls.Tumbler"] + "QtQuick.Controls.Tumbler", + "QtQuick.Shapes.ConicalGradient", + "QtQuick.Shapes.LinearGradient", + "QtQuick.Shapes.RadialGradient", + "QtQuick.Shapes.ShapeGradient"] allowedImports: ["QtQuick", "QtQuick.Shapes", diff --git a/share/qtcreator/qmldesigner/qt4mcu/qul-20.qml b/share/qtcreator/qmldesigner/qt4mcu/qul-20.qml new file mode 100644 index 00000000000..d6b41cd0552 --- /dev/null +++ b/share/qtcreator/qmldesigner/qt4mcu/qul-20.qml @@ -0,0 +1,221 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +VersionData { + name: "Qt for MCUs 2.0" + + bannedItems: ["QtQuick.AnimatedImage", + "QtQuick.FocusScope", + "QtQuick.TextInput", + "QtQuick.TextEdit", + "QtQuick.Flow", + "QtQuick.Grid", + "QtQuick.GridView", + "QtQuick.PathView", + "QtQuick.Loader", + "QtQuick.Controls", + "QtQuick.Controls.BusyIndicator", + "QtQuick.Controls.ButtonGroup", + "QtQuick.Controls.CheckDelegate", + "QtQuick.Controls.Container", + "QtQuick.Controls.ComboBox", + "QtQuick.Controls.DelayButton", + "QtQuick.Controls.Frame", + "QtQuick.Controls.GroupBox", + "QtQuick.Controls.ItemDelegate", + "QtQuick.Controls.Label", + "QtQuick.Controls.Page", + "QtQuick.Controls.PageIndicator", + "QtQuick.Controls.Pane", + "QtQuick.Controls.RadioDelegate", + "QtQuick.Controls.RangeSlider", + "QtQuick.Controls.RoundButton", + "QtQuick.Controls.ScrollView", + "QtQuick.Controls.SpinBox", + "QtQuick.Controls.StackView", + "QtQuick.Controls.SwipeDelegate", + "QtQuick.Controls.SwitchDelegate", + "QtQuick.Controls.ToolBar", + "QtQuick.Controls.ToolButton", + "QtQuick.Controls.TabBar", + "QtQuick.Controls.TabButton", + "QtQuick.Controls.TextArea", + "QtQuick.Controls.TextField", + "QtQuick.Controls.ToolSeparator", + "QtQuick.Controls.Tumbler", + "QtQuick.Shapes.ConicalGradient", + "QtQuick.Shapes.LinearGradient", + "QtQuick.Shapes.RadialGradient", + "QtQuick.Shapes.ShapeGradient"] + + allowedImports: ["QtQuick", + "QtQuick.Shapes", + "QtQuick.Controls", + "QtQuick.Timeline", + "QtQuickUltralite.Extras", + "QtQuickUltralite.Layers"] + + bannedImports: ["FlowView"] + + //ComplexProperty is not a type, it's just a way to handle bigger props + ComplexProperty { + prefix: "font" + bannedProperties: ["wordSpacing", "letterSpacing", "hintingPreference", + "kerning", "preferShaping", "capitalization", + "strikeout", "underline", "styleName"] + } + + QtQuick.Item { + bannedProperties: ["layer", "opacity", "smooth", "antialiasing", + "baselineOffset", "focus", "activeFocusOnTab", + "rotation", "scale", "transformOrigin"] + } + + QtQuick.Rectangle { + bannedProperties: ["gradient", "border"] + } + + QtQuick.Flickable { + bannedProperties: ["boundsBehavior", "boundsMovement", "flickDeceleration", + "flickableDirection", "leftMargin", "rightMargin", "bottomMargin", "topMargin", + "originX", "originY", "pixelAligned", "pressDelay", "synchronousDrag"] + } + + QtQuick.MouseArea { + bannedProperties: ["propagateComposedEvents", "preventStealing", "cursorShape", + "scrollGestureEnabled", "drag", "acceptedButtons", "hoverEnabled"] + } + + QtQuick.Image { + allowChildren: false + allowedProperties: ["rotation", "scale", "transformOrigin"] + bannedProperties: ["mirror", "mipmap", "cache", "autoTransform", "asynchronous", + "sourceSize", "smooth"] + } + + QtQuick.BorderImage { + bannedProperties: ["asynchronous", "cache", "currentFrame", "frameCount", + "horizontalTileMode", "mirror", "progress", "smooth", "sourceSize", + "status", "verticalTileMode"] + } + + QtQuick.Text { + allowChildren: false + allowedProperties: ["rotation", "scale", "transformOrigin"] + bannedProperties: ["elide", "lineHeight", "lineHeightMode", "wrapMode", "style", + "styleColor", "minimumPointSize", "minimumPixelSize", + "fontSizeMode", "renderType", "renderTypeQuality", "textFormat", "maximumLineCount"] + } + + //Padding is not an actual item, but rather set of properties in Text + Padding { + bannedProperties: ["bottomPadding", "topPadding", "leftPadding", "rightPadding"] + } + + QtQuick.Column { + bannedProperties: ["bottomPadding", "leftPadding", "rightPadding", "topPadding"] + } + + QtQuick.Row { + bannedProperties: ["bottomPadding", "leftPadding", "rightPadding", "topPadding", + "effectiveLayoutDirection", "layoutDirection"] + } + + QtQuick.ListView { + bannedProperties: ["cacheBuffer", "highlightRangeMode", "highlightMoveDuration", + "highlightResizeDuration", "preferredHighlightBegin", "layoutDirection", + "preferredHighlightEnd", "highlightFollowsCurrentItem", "keyNavigationWraps", + "snapMode", "highlightMoveVelocity", "highlightResizeVelocity"] + } + + QtQuick.Animation { + bannedProperties: ["paused"] + } + + //Quick Controls2 Items and properties: + + QtQuick.Controls.Control { + bannedProperties: ["focusPolicy", "hoverEnabled", "wheelEnabled"] + } + + QtQuick.Controls.AbstractButton { + bannedProperties: ["display", "autoExclusive"] + } + + QtQuick.Controls.ProgressBar { + bannedProperties: ["indeterminate"] + } + + QtQuick.Controls.Slider { + bannedProperties: ["live", "snapMode", "touchDragThreshold"] + } + + //Path and Shapes related: + + QtQuick.Path { + bannedProperties: ["scale", "pathElements"] + } + + QtQuick.PathArc { + bannedProperties: ["relativeX", "relativeY"] + } + + QtQuick.PathLine { + bannedProperties: ["relativeX", "relativeY"] + } + + QtQuick.PathMove { + bannedProperties: ["relativeX", "relativeY"] + } + + QtQuick.PathQuad { + bannedProperties: ["relativeX", "relativeY", + "relativeControlX", "relativeControlY"] + } + + QtQuick.PathCubic { + bannedProperties: ["relativeX", "relativeY", + "relativeControl1X", "relativeControl1Y", + "relativeControl2X", "relativeControl2Y"] + } + + QtQuick.PathElement { + //nothing + } + + QtQuick.PathSvg { + //nothing + } + + QtQuick.Shapes.Shape { + bannedProperties: ["asynchronous", "containsMode", "data", + "renderType", "status", "vendorExtensionsEnabled"] + } + + QtQuick.Shapes.ShapePath { + bannedProperties: ["dashOffset", "dashPattern", + "fillGradient", "strokeStyle"] + } +} diff --git a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml index 08a7bc7dc3d..7d0aa14cfd6 100644 --- a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml +++ b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml @@ -33,11 +33,8 @@ import StudioTheme 1.0 as StudioTheme Rectangle { id: myRoot - color: baseColor - property bool isBaseState property bool isCurrentState - property color baseColor property string delegateStateName property string delegateStateImageSource property bool delegateHasWhenCondition @@ -47,14 +44,14 @@ Rectangle { property int bottomAreaHeight property int stateMargin property int previewMargin - property int columnSpacing readonly property bool isDefaultState: isDefault property int closeButtonMargin: 6 property int textFieldMargin: 4 - signal delegateInteraction + property int scrollBarH: 0 + property int listMargin: 0 function autoComplete(text, pos, explicitComplete, filter) { var stringList = statesEditorModel.autoComplete(text, pos, explicitComplete) @@ -65,14 +62,16 @@ Rectangle { return statesEditorModel.hasAnnotation(internalNodeId) } + color: isCurrentState ? StudioTheme.Values.themeInteraction + : StudioTheme.Values.themeControlBackgroundInteraction MouseArea { id: mouseArea anchors.fill: parent + onClicked: { focus = true root.currentStateInternalId = internalNodeId contextMenu.dismiss() // close potentially open context menu - myRoot.delegateInteraction() } } @@ -89,7 +88,6 @@ Rectangle { visible: !isBaseState && isCurrentState onClicked: { - myRoot.delegateInteraction() if (isDefaultState) statesEditorModel.resetDefaultState() @@ -254,9 +252,8 @@ Rectangle { Rectangle { // separator width: column.width - height: myRoot.columnSpacing + height: 2 color: StudioTheme.Values.themeStateSeparator - visible: expanded } Rectangle { @@ -264,7 +261,6 @@ Rectangle { width: myRoot.width - 2 * myRoot.stateMargin height: myRoot.bottomAreaHeight color: StudioTheme.Values.themeStateBackground - visible: expanded Image { anchors.fill: stateImageBackground diff --git a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml index 6f2dfbbf3d0..ef2cbdf62f7 100644 --- a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml +++ b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml @@ -26,6 +26,7 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuickDesignerTheme 1.0 +import Qt.labs.qmlmodels 1.0 import HelperWidgets 2.0 import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme @@ -33,27 +34,24 @@ import StudioTheme 1.0 as StudioTheme FocusScope { id: root - property int delegateTopAreaHeight: StudioTheme.Values.height + 8 - property int delegateBottomAreaHeight: delegateHeight - 2 * delegateStateMargin - delegateTopAreaHeight - delegateColumnSpacing - property int delegateColumnSpacing: 2 - property int delegateStateMargin: 16 - property int delegatePreviewMargin: 10 - property int effectiveHeight: root.expanded ? Math.max(85, Math.min(287, root.height)) : 85 // height of the states area + readonly property int delegateTopAreaHeight: StudioTheme.Values.height + 8 + readonly property int delegateBottomAreaHeight: delegateHeight - 2 * delegateStateMargin - delegateTopAreaHeight - 2 + readonly property int delegateStateMargin: 16 + readonly property int delegatePreviewMargin: 10 + readonly property int effectiveHeight: root.height < 130 ? 89 : Math.min(root.height, 287) + + readonly property int scrollBarH: statesListView.ScrollBar.horizontal.scrollBarVisible ? StudioTheme.Values.scrollBarThickness : 0 + readonly property int listMargin: 10 + readonly property int delegateWidth: 264 + readonly property int delegateHeight: Math.max(effectiveHeight - scrollBarH - 2 * listMargin, 69) + readonly property int innerSpacing: 2 + + property int currentStateInternalId: 0 signal createNewState signal deleteState(int internalNodeId) signal duplicateCurrentState - property int padding: 2 - property int delegateWidth: 264 - property int delegateHeight: effectiveHeight - - StudioTheme.Values.scrollBarThickness - - 2 * (root.padding + StudioTheme.Values.border) - property int innerSpacing: 2 - property int currentStateInternalId: 0 - - property bool expanded: true - Connections { target: statesEditorModel function onChangedToState(n) { root.currentStateInternalId = n } @@ -65,92 +63,117 @@ FocusScope { color: StudioTheme.Values.themePanelBackground } - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton - - onClicked: function(mouse) { - if (mouse.button === Qt.LeftButton) { - contextMenu.dismiss() - focus = true - } else if (mouse.button === Qt.RightButton) { - contextMenu.popup() - } - } - - StudioControls.Menu { - id: contextMenu - - StudioControls.MenuItem { - text: root.expanded ? qsTr("Collapse") : qsTr("Expand") - onTriggered: root.expanded = !root.expanded - } - } - } - AbstractButton { id: addStateButton - buttonIcon: root.expanded ? qsTr("Create New State") : StudioTheme.Constants.plus - iconFont: root.expanded ? StudioTheme.Constants.font : StudioTheme.Constants.iconFont - iconSize: root.expanded ? StudioTheme.Values.myFontSize : StudioTheme.Values.myIconFontSize - iconItalic: root.expanded + buttonIcon: StudioTheme.Constants.plus + iconFont: StudioTheme.Constants.iconFont + iconSize: StudioTheme.Values.myIconFontSize tooltip: qsTr("Add a new state.") visible: canAddNewStates anchors.right: parent.right - anchors.rightMargin: 8 - y: (Math.min(effectiveHeight, root.height) - height) / 2 - width: root.expanded ? 140 : 18 - height: root.expanded ? 60 : 18 + anchors.rightMargin: 4 + anchors.bottom: parent.bottom + anchors.bottomMargin: statesListView.contentWidth - statesListView.contentX - root.delegateWidth / 2 > statesListView.width ? scrollBarH + 5 : -35 + width: 35 + height: 35 - onClicked: { - contextMenu.dismiss() - root.createNewState() + Behavior on anchors.bottomMargin { + PropertyAnimation { + duration: 700 + easing.type: Easing.InOutBack + } } - } - Rectangle { // separator lines between state items - color: StudioTheme.Values.themeStateSeparator - x: root.padding - y: root.padding - width: statesListView.width - height: root.delegateHeight + onClicked: root.createNewState() } ListView { id: statesListView - boundsBehavior: Flickable.StopAtBounds clip: true - - x: root.padding - y: root.padding - width: Math.min(root.delegateWidth * statesListView.count + root.innerSpacing * (statesListView.count - 1), - root.width - addStateButton.width - root.padding - 16) // 16 = 2 * 8 (addStateButton margin) - height: root.delegateHeight + StudioTheme.Values.scrollBarThickness + anchors.fill: parent + anchors.topMargin: listMargin + anchors.leftMargin: listMargin + anchors.rightMargin: listMargin model: statesEditorModel orientation: ListView.Horizontal spacing: root.innerSpacing - delegate: StatesDelegate { - id: statesDelegate - width: root.delegateWidth - height: root.delegateHeight - isBaseState: 0 === internalNodeId - isCurrentState: root.currentStateInternalId === internalNodeId - baseColor: isCurrentState ? StudioTheme.Values.themeInteraction : background.color - delegateStateName: stateName - delegateStateImageSource: stateImageSource - delegateHasWhenCondition: hasWhenCondition - delegateWhenConditionString: whenConditionString - onDelegateInteraction: contextMenu.dismiss() + property int prevCount: 0 + onCountChanged: { + if (count > prevCount) + Qt.callLater(statesListView.positionViewAtEnd) + prevCount = count + } - columnSpacing: root.delegateColumnSpacing - topAreaHeight: root.delegateTopAreaHeight - bottomAreaHeight: root.delegateBottomAreaHeight - stateMargin: root.delegateStateMargin - previewMargin: root.delegatePreviewMargin + delegate: DelegateChooser { + role: "type" + + DelegateChoice { + roleValue: "state" + + StatesDelegate { + width: root.delegateWidth + height: root.delegateHeight + anchors.verticalCenter: parent ? parent.verticalCenter : undefined + anchors.verticalCenterOffset: -.5 * (scrollBarH + listMargin) + isBaseState: 0 === internalNodeId + isCurrentState: root.currentStateInternalId === internalNodeId + delegateStateName: stateName + delegateStateImageSource: stateImageSource + delegateHasWhenCondition: hasWhenCondition + delegateWhenConditionString: whenConditionString + + topAreaHeight: root.delegateTopAreaHeight + bottomAreaHeight: root.delegateBottomAreaHeight + stateMargin: root.delegateStateMargin + previewMargin: root.delegatePreviewMargin + scrollBarH: root.scrollBarH + listMargin: root.listMargin + } + } + + DelegateChoice { + roleValue: "add" + + Rectangle { + visible: canAddNewStates + + width: root.delegateWidth + height: root.delegateHeight + anchors.verticalCenter: parent ? parent.verticalCenter : undefined + anchors.verticalCenterOffset: -.5 * (scrollBarH + listMargin) + color: Qt.lighter(StudioTheme.Values.themeControlBackgroundInteraction, addState.containsMouse ? 1.5 : 1) + + ToolTip.text: qsTr("Add a new state.") + ToolTip.visible: addState.containsMouse + ToolTip.delay: 1000 + + Rectangle { // inner rect + width: parent.width - 30 + height: parent.height - 30 + anchors.centerIn: parent + color: StudioTheme.Values.themeStateBackground + } + + Text { + text: "+" + anchors.centerIn: parent + anchors.verticalCenterOffset: -5 + font.pixelSize: parent.height * .5 + color: Qt.lighter(StudioTheme.Values.themeControlBackgroundInteraction, addState.containsMouse ? 1.5 : 1) + } + + MouseArea { + id: addState + hoverEnabled: true + anchors.fill: parent + onClicked: root.createNewState() + } + } + } } ScrollBar.horizontal: HorizontalScrollBar {} diff --git a/src/plugins/qmldesigner/cmakegeneratordialog.cpp b/src/plugins/qmldesigner/cmakegeneratordialog.cpp index a972147051d..eb7a35f170c 100644 --- a/src/plugins/qmldesigner/cmakegeneratordialog.cpp +++ b/src/plugins/qmldesigner/cmakegeneratordialog.cpp @@ -28,6 +28,7 @@ #include "generatecmakelistsconstants.h" #include +#include #include #include @@ -50,17 +51,14 @@ CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePa m_model = new CMakeGeneratorDialogTreeModel(rootDir, files, this); - QVBoxLayout *layout = new QVBoxLayout(this); - setLayout(layout); + QVBoxLayout *dialogLayout = new QVBoxLayout(this); + dialogLayout->setSizeConstraint(QLayout::SetFixedSize); + setLayout(dialogLayout); - QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); - - auto *okButton = buttons->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - - connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); - connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); - connect(m_model, &CMakeGeneratorDialogTreeModel::checkedStateChanged, this, &CmakeGeneratorDialog::refreshNotificationText); + QWidget *advancedInnerWidget = new QWidget(this); + QVBoxLayout *advancedInnerLayout = new QVBoxLayout(advancedInnerWidget); + advancedInnerWidget->setLayout(advancedInnerLayout); + advancedInnerWidget->setMinimumHeight(640); QTreeView *tree = new QTreeView(this); tree->setModel(m_model); @@ -72,9 +70,31 @@ CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePa refreshNotificationText(); - layout->addWidget(tree, 2); - layout->addWidget(m_notifications, 1); - layout->addWidget(buttons); + advancedInnerLayout->addWidget(tree, 2); + advancedInnerLayout->addWidget(m_notifications, 1); + + DetailsWidget *advancedWidget = new DetailsWidget(this); + advancedWidget->setMinimumWidth(600); + advancedWidget->setWidget(advancedInnerWidget); + advancedWidget->setSummaryText(QCoreApplication::translate("QmlDesigner::GenerateCmake", + "Advanced Options")); + + QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); + auto *okButton = buttons->button(QDialogButtonBox::Ok); + okButton->setDefault(true); + + connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); + connect(m_model, &CMakeGeneratorDialogTreeModel::checkedStateChanged, this, &CmakeGeneratorDialog::refreshNotificationText); + + QLabel *mainLabel = new QLabel(QCoreApplication::translate("QmlDesigner::GenerateCmake", + "Start CMakeFiles.txt generation"), + this); + mainLabel->setMargin(50); + + dialogLayout->addWidget(mainLabel); + dialogLayout->addWidget(advancedWidget); + dialogLayout->addWidget(buttons); } FilePaths CmakeGeneratorDialog::getFilePaths() diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsfilesmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsfilesmodel.cpp index 1140ba43d7e..271f330fd23 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsfilesmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsfilesmodel.cpp @@ -34,6 +34,7 @@ ItemLibraryAssetsFilesModel::ItemLibraryAssetsFilesModel(QObject *parent) // add roles m_roleNames.insert(FileNameRole, "fileName"); m_roleNames.insert(FilePathRole, "filePath"); + m_roleNames.insert(FileDirRole, "fileDir"); } QVariant ItemLibraryAssetsFilesModel::data(const QModelIndex &index, int role) const @@ -49,6 +50,9 @@ QVariant ItemLibraryAssetsFilesModel::data(const QModelIndex &index, int role) c if (role == FilePathRole) return m_files[index.row()]; + if (role == FileDirRole) + return QVariant::fromValue(parent()); + qWarning() << Q_FUNC_INFO << "Invalid role requested: " << QString::number(role); return {}; } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsfilesmodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsfilesmodel.h index 25577dce515..5b44878eefc 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsfilesmodel.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsfilesmodel.h @@ -44,7 +44,8 @@ public: private: enum Roles {FileNameRole = Qt::UserRole + 1, - FilePathRole}; + FilePathRole, + FileDirRole}; QStringList m_files; QHash m_roleNames; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.cpp index a09391570d5..a04ff0f48f4 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -99,7 +100,7 @@ void ItemLibraryAssetsModel::toggleExpandAll(bool expand) endResetModel(); } -void ItemLibraryAssetsModel::removeFile(const QString &filePath) +void ItemLibraryAssetsModel::deleteFile(const QString &filePath) { bool askBeforeDelete = DesignerSettings::getValue( DesignerSettingsKey::ASK_BEFORE_DELETING_ASSET).toBool(); @@ -134,6 +135,52 @@ void ItemLibraryAssetsModel::removeFile(const QString &filePath) } } +void ItemLibraryAssetsModel::addNewFolder(const QString &folderPath) +{ + QString iterPath = folderPath; + QRegularExpression rgx("\\d+$"); // matches a number at the end of a string + QDir dir{folderPath}; + + while (dir.exists()) { + // if the folder name ends with a number, increment it + QRegularExpressionMatch match = rgx.match(iterPath); + if (match.hasMatch()) { // ends with a number + QString numStr = match.captured(0); + int num = match.captured(0).toInt(); + + // get number of padding zeros, ex: for "005" = 2 + int nPaddingZeros = 0; + for (; nPaddingZeros < numStr.size() && numStr[nPaddingZeros] == '0'; ++nPaddingZeros); + + ++num; + + // if the incremented number's digits increased, decrease the padding zeros + if (std::fmod(std::log10(num), 1.0) == 0) + --nPaddingZeros; + + iterPath = folderPath.mid(0, match.capturedStart()) + + QString('0').repeated(nPaddingZeros) + + QString::number(num); + } else { + iterPath = folderPath + '1'; + } + + dir.setPath(iterPath); + } + + dir.mkpath(iterPath); +} + +void ItemLibraryAssetsModel::deleteFolder(const QString &folderPath) +{ + QDir{folderPath}.removeRecursively(); +} + +QObject *ItemLibraryAssetsModel::rootDir() const +{ + return m_assetsDir; +} + const QStringList &ItemLibraryAssetsModel::supportedImageSuffixes() { static QStringList retList; @@ -270,7 +317,7 @@ void ItemLibraryAssetsModel::setRootPath(const QString &path) isEmpty &= parseDirRecursive(assetsDir, currDepth + 1); } - if (isEmpty) + if (!m_searchText.isEmpty() && isEmpty) currAssetsDir->setDirVisible(false); return isEmpty; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.h index f7621563492..e429605b9a6 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.h @@ -83,7 +83,10 @@ public: Q_INVOKABLE void toggleExpandAll(bool expand); Q_INVOKABLE DirExpandState getAllExpandedState() const; - Q_INVOKABLE void removeFile(const QString &filePath); + Q_INVOKABLE void deleteFile(const QString &filePath); + Q_INVOKABLE void addNewFolder(const QString &folderPath); + Q_INVOKABLE void deleteFolder(const QString &folderPath); + Q_INVOKABLE QObject *rootDir() const; signals: void isEmptyChanged(); diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp index 1828317a9e8..2d96d01a9dc 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp @@ -53,7 +53,6 @@ StatesEditorModel::StatesEditorModel(StatesEditorView *view) { } - int StatesEditorModel::count() const { return rowCount(); @@ -64,9 +63,8 @@ QModelIndex StatesEditorModel::index(int row, int column, const QModelIndex &par if (m_statesEditorView.isNull()) return {}; - int internalNodeId = 0; - if (row > 0) + if (row > 0 && row < rowCount() - 1) // first and last rows are base state, add state internalNodeId = m_statesEditorView->rootModelNode().nodeListProperty("states").at(row - 1).internalId(); return hasIndex(row, column, parent) ? createIndex(row, column, internalNodeId) : QModelIndex(); @@ -78,9 +76,9 @@ int StatesEditorModel::rowCount(const QModelIndex &parent) const return 0; if (!m_statesEditorView->rootModelNode().hasNodeListProperty("states")) - return 1; + return 2; // base state + add new state - return m_statesEditorView->rootModelNode().nodeListProperty("states").count() + 1; + return m_statesEditorView->rootModelNode().nodeListProperty("states").count() + 2; // 2 = base state + add new state } void StatesEditorModel::reset() @@ -101,16 +99,16 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const switch (role) { case StateNameRole: { - if (index.row() == 0) { - return tr("base state", "Implicit default state"); - } else { - if (stateNode.hasVariantProperty("name")) - return stateNode.variantProperty("name").value(); - else - return QVariant(); - } - + if (index.row() == 0) { + return tr("base state", "Implicit default state"); + } else { + if (stateNode.hasVariantProperty("name")) + return stateNode.variantProperty("name").value(); + else + return QVariant(); } + } + case StateImageSourceRole: { static int randomNumber = 0; randomNumber++; @@ -119,9 +117,12 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const else return QString("image://qmldesigner_stateseditor/%1-%2").arg(index.internalId()).arg(randomNumber); } - case InternalNodeId: return index.internalId(); - case HasWhenCondition: return stateNode.isValid() && stateNode.hasProperty("when"); + case InternalNodeId: + return index.internalId(); + + case HasWhenCondition: + return stateNode.isValid() && stateNode.hasProperty("when"); case WhenConditionString: { if (stateNode.isValid() && stateNode.hasBindingProperty("when")) @@ -137,10 +138,11 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const return false; } - case ModelHasDefaultState: { + case ModelHasDefaultState: return hasDefaultState(); - } + case StateType: + return index.row() == rowCount() - 1 ? "add" : "state"; } return QVariant(); @@ -148,14 +150,15 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const QHash StatesEditorModel::roleNames() const { - static QHash roleNames{ + static QHash roleNames { {StateNameRole, "stateName"}, {StateImageSourceRole, "stateImageSource"}, {InternalNodeId, "internalNodeId"}, {HasWhenCondition, "hasWhenCondition"}, {WhenConditionString, "whenConditionString"}, {IsDefault, "isDefault"}, - {ModelHasDefaultState, "modelHasDefaultState"} + {ModelHasDefaultState, "modelHasDefaultState"}, + {StateType, "type"} }; return roleNames; } @@ -163,10 +166,8 @@ QHash StatesEditorModel::roleNames() const void StatesEditorModel::insertState(int stateIndex) { if (stateIndex >= 0) { - const int updateIndex = stateIndex + 1; beginInsertRows(QModelIndex(), updateIndex, updateIndex); - endInsertRows(); emit dataChanged(index(updateIndex, 0), index(updateIndex, 0)); diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h index 65c1385e897..d467e4fceb1 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h @@ -44,7 +44,8 @@ class StatesEditorModel : public QAbstractListModel HasWhenCondition, WhenConditionString, IsDefault, - ModelHasDefaultState + ModelHasDefaultState, + StateType }; public: diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index 997852cfb25..cf1f3771412 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -85,12 +85,6 @@ void StatesEditorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorV checkForStatesAvailability(); } -void StatesEditorView::toggleStatesViewExpanded() -{ - if (m_statesEditorWidget) - m_statesEditorWidget->toggleStatesViewExpanded(); -} - void StatesEditorView::removeState(int nodeId) { try { @@ -102,6 +96,22 @@ void StatesEditorView::removeState(int nodeId) if (modelState.isValid()) { QStringList lockedTargets; const auto propertyChanges = modelState.propertyChanges(); + + // confirm removing not empty states + if (!propertyChanges.isEmpty()) { + QMessageBox msgBox; + msgBox.setTextFormat(Qt::RichText); + msgBox.setIcon(QMessageBox::Question); + msgBox.setWindowTitle(tr("Remove State")); + msgBox.setText(tr("This state is not empty. Are you sure you want to remove it?")); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Yes); + + if (msgBox.exec() == QMessageBox::Cancel) + return; + } + + // confirm removing states with locked targets for (const QmlPropertyChanges &change : propertyChanges) { const ModelNode target = change.target(); QTC_ASSERT(target.isValid(), continue); diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h index 1ac7a6f39fa..71a82711eaa 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h @@ -87,8 +87,6 @@ public: void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override; - void toggleStatesViewExpanded(); - public slots: void synchonizeCurrentStateFromWidget(); void createNewState(); diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp index 4701a4079eb..b7b391944ad 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp @@ -133,13 +133,6 @@ QString StatesEditorWidget::qmlSourcesPath() return Core::ICore::resourcePath("qmldesigner/statesEditorQmlSources").toString(); } -void StatesEditorWidget::toggleStatesViewExpanded() -{ - QTC_ASSERT(rootObject(), return); - bool expanded = rootObject()->property("expanded").toBool(); - rootObject()->setProperty("expanded", !expanded); -} - void StatesEditorWidget::showEvent(QShowEvent *event) { QQuickWidget::showEvent(event); @@ -168,18 +161,6 @@ void StatesEditorWidget::reloadQmlSource() connect(rootObject(), SIGNAL(createNewState()), m_statesEditorView.data(), SLOT(createNewState())); connect(rootObject(), SIGNAL(deleteState(int)), m_statesEditorView.data(), SLOT(removeState(int))); m_statesEditorView.data()->synchonizeCurrentStateFromWidget(); - - if (!DesignerSettings::getValue(DesignerSettingsKey::STATESEDITOR_EXPANDED).toBool()) - toggleStatesViewExpanded(); - - connect(rootObject(), SIGNAL(expandedChanged()), this, SLOT(handleExpandedChanged())); } -void StatesEditorWidget::handleExpandedChanged() -{ - QTC_ASSERT(rootObject(), return); - - bool expanded = rootObject()->property("expanded").toBool(); - DesignerSettings::setValue(DesignerSettingsKey::STATESEDITOR_EXPANDED, expanded); -} -} +} // QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h index e4e9668abb0..b613e600c44 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h @@ -57,14 +57,11 @@ public: static QString qmlSourcesPath(); - void toggleStatesViewExpanded(); - protected: void showEvent(QShowEvent *) override; private: void reloadQmlSource(); - Q_SLOT void handleExpandedChanged(); private: QPointer m_statesEditorView; diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h index 166f458f619..ecfec36860b 100644 --- a/src/plugins/qmldesigner/designercore/include/viewmanager.h +++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h @@ -100,8 +100,6 @@ public: DesignerActionManager &designerActionManager(); const DesignerActionManager &designerActionManager() const; - void toggleStatesViewExpanded(); - void qmlJSEditorContextHelp(const Core::IContext::HelpCallback &callback) const; DesignDocument *currentDesignDocument() const; diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index 6b6a37c35b9..127925df1b3 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -394,11 +394,6 @@ const DesignerActionManager &ViewManager::designerActionManager() const return d->designerActionManagerView.designerActionManager(); } -void ViewManager::toggleStatesViewExpanded() -{ - d->statesEditorView.toggleStatesViewExpanded(); -} - void ViewManager::qmlJSEditorContextHelp(const Core::IContext::HelpCallback &callback) const { d->textEditorView.qmlJSEditorContextHelp(callback); diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index 08788ca5bef..8ecaaa6edd9 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -72,7 +72,6 @@ void DesignerSettings::fromSettings(QSettings *settings) restoreValue(settings, DesignerSettingsKey::FORWARD_PUPPET_OUTPUT, QString()); restoreValue(settings, DesignerSettingsKey::REFORMAT_UI_QML_FILES, true); restoreValue(settings, DesignerSettingsKey::IGNORE_DEVICE_PIXEL_RATIO, false); - restoreValue(settings, DesignerSettingsKey::STATESEDITOR_EXPANDED, true); restoreValue(settings, DesignerSettingsKey::NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS, true); restoreValue(settings, DesignerSettingsKey::NAVIGATOR_REVERSE_ITEM_ORDER, false); restoreValue(settings, DesignerSettingsKey::STANDALONE_MODE, false); diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index 0afb86d6dd6..bb25e2e04c9 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -60,7 +60,6 @@ const char ENABLE_MODEL_EXCEPTION_OUTPUT[] = "WarnException"; const char PUPPET_KILL_TIMEOUT[] = "PuppetKillTimeout"; const char DEBUG_PUPPET[] = "DebugPuppet"; const char FORWARD_PUPPET_OUTPUT[] = "ForwardPuppetOutput"; -const char STATESEDITOR_EXPANDED[] = "StatesEditorExpanded"; const char NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS[] = "NavigatorShowOnlyVisibleItems"; const char NAVIGATOR_REVERSE_ITEM_ORDER[] = "NavigatorReverseItemOrder"; const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* These settings are not exposed in ui. */ diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 2f195c3c89e..a0ef9a52128 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -511,8 +511,14 @@ bool DocumentManager::belongsToQmakeProject() Utils::FilePath DocumentManager::currentResourcePath() { Utils::FilePath resourcePath = currentProjectDirPath(); + if (resourcePath.isEmpty()) return currentFilePath().absolutePath(); + + FilePath contentFilePath = resourcePath.pathAppended("content"); + if (contentFilePath.exists()) + return contentFilePath; + return resourcePath; } diff --git a/src/plugins/qmldesigner/generatecmakelists.cpp b/src/plugins/qmldesigner/generatecmakelists.cpp index c11f20436ca..1dc5cd1bc81 100644 --- a/src/plugins/qmldesigner/generatecmakelists.cpp +++ b/src/plugins/qmldesigner/generatecmakelists.cpp @@ -205,8 +205,6 @@ bool showConfirmationDialog(const Utils::FilePath &rootDir) files.append(file.filePath); CmakeGeneratorDialog dialog(rootDir, files); - dialog.setMinimumWidth(600); - dialog.setMinimumHeight(640); if (dialog.exec()) { Utils::FilePaths confirmedFiles = dialog.getFilePaths(); removeUnconfirmedQueuedFiles(confirmedFiles); diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp index 25d1c27c471..e82e7a04c01 100644 --- a/src/plugins/qmldesigner/shortcutmanager.cpp +++ b/src/plugins/qmldesigner/shortcutmanager.cpp @@ -69,7 +69,6 @@ ShortCutManager::ShortCutManager() m_copyAction(tr("&Copy")), m_pasteAction(tr("&Paste")), m_selectAllAction(tr("Select &All")), - m_collapseExpandStatesAction(tr("Toggle States")), m_escapeAction(this) { @@ -97,10 +96,6 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex connect(&m_selectAllAction,&QAction::triggered, this, &ShortCutManager::selectAll); - connect(&m_collapseExpandStatesAction, &QAction::triggered, [] { - QmlDesignerPlugin::instance()->viewManager().toggleStatesViewExpanded(); - }); - // Revert to saved Core::EditorManager *em = Core::EditorManager::instance(); Core::ActionManager::registerAction(&m_revertToSavedAction,Core::Constants::REVERTTOSAVED, qmlDesignerMainContext); @@ -188,13 +183,6 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex command->setDefaultKeySequence(QKeySequence::SelectAll); editMenu->addAction(command, Core::Constants::G_EDIT_SELECTALL); - Core::ActionContainer *viewsMenu = Core::ActionManager::actionContainer(Core::Constants::M_VIEW_VIEWS); - - command = Core::ActionManager::registerAction(&m_collapseExpandStatesAction, Constants::TOGGLE_STATES_EDITOR, qmlDesignerMainContext); - command->setAttribute(Core::Command::CA_Hide); - command->setDefaultKeySequence(QKeySequence("Ctrl+Alt+s")); - viewsMenu->addAction(command); - /* Registering disabled action for Escape, because Qt Quick does not support shortcut overrides. */ command = Core::ActionManager::registerAction(&m_escapeAction, Core::Constants::S_RETURNTOEDITOR, qmlDesignerMainContext); command->setDefaultKeySequence(QKeySequence(Qt::Key_Escape)); diff --git a/src/plugins/qmldesigner/shortcutmanager.h b/src/plugins/qmldesigner/shortcutmanager.h index 6e5b5ec23bd..4bc4ae5f848 100644 --- a/src/plugins/qmldesigner/shortcutmanager.h +++ b/src/plugins/qmldesigner/shortcutmanager.h @@ -83,7 +83,6 @@ private: QAction m_copyAction; QAction m_pasteAction; QAction m_selectAllAction; - QAction m_collapseExpandStatesAction; QAction m_escapeAction; }; diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index f26e8511509..9ba6ed9b808 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -581,7 +581,8 @@ void StudioWelcomePlugin::extensionsInitialized() Core::ModeManager::activateMode(m_welcomeMode->id()); // Enable QDS new project dialog - Core::ICore::setNewDialogFactory([](QWidget *parent) { return new QdsNewDialog(parent); }); + if (Core::ICore::settings()->value("QML/Designer/StandAloneMode", false).toBool()) + Core::ICore::setNewDialogFactory([](QWidget *parent) { return new QdsNewDialog(parent); }); if (showSplashScreen()) { connect(Core::ICore::instance(), &Core::ICore::coreOpened, this, [this] { diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 3d6698a0bcc..731c5ba779e 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -2984,7 +2984,7 @@ bool TextEditorWidget::event(QEvent *e) && (ke->key() < Qt::Key_Escape)); d->m_maybeFakeTooltipEvent = false; } - break; + return true; } case QEvent::ApplicationPaletteChange: { // slight hack: ignore palette changes diff --git a/tests/system/shared/editor_utils.py b/tests/system/shared/editor_utils.py index 9af13028486..bb6e8ba299d 100644 --- a/tests/system/shared/editor_utils.py +++ b/tests/system/shared/editor_utils.py @@ -37,7 +37,7 @@ def placeCursorToLine(editor, line, isRegex=False): return waitForObject(editor) isDarwin = platform.system() == 'Darwin' - if not isinstance(editor, (str, unicode)): + if not isString(editor): editor = objectMap.realName(editor) oldPosition = 0 jumpToFirstLine(getEditor()) @@ -120,7 +120,7 @@ def replaceEditorContent(editor, newcontent): type(editor, newcontent) def typeLines(editor, lines): - if isinstance(lines, (str, unicode)): + if isString(lines): lines = [lines] if isinstance(lines, (list, tuple)): for line in lines: diff --git a/tests/system/shared/fs_utils.py b/tests/system/shared/fs_utils.py index f36fbd7fbf2..ee24d6f0ca3 100644 --- a/tests/system/shared/fs_utils.py +++ b/tests/system/shared/fs_utils.py @@ -35,10 +35,10 @@ def changeFilePermissions(dirPath, readPerm, writePerm, excludeFileNames=None): permission |= stat.S_IWRITE if excludeFileNames == None: excludeFileNames = [] - elif isinstance(excludeFileNames, (str, unicode)): + elif isString(excludeFileNames): excludeFileNames = [excludeFileNames] if not isinstance(excludeFileNames, (tuple, list)): - test.warning("File names to exclude must be of type str, unicode, list, tuple or None - " + test.warning("File names to exclude must be of type str, list, tuple or None - " "ignoring parameter this time.") excludeFileNames = [] if not os.path.isdir(dirPath): diff --git a/tests/system/shared/project_explorer.py b/tests/system/shared/project_explorer.py index 587574ff0a5..a4abeb7a723 100644 --- a/tests/system/shared/project_explorer.py +++ b/tests/system/shared/project_explorer.py @@ -95,8 +95,8 @@ def setRunInTerminal(wantedKit, runInTerminal=True): switchViewTo(ViewConstants.EDIT) def __getTargetFromToolTip__(toolTip): - if toolTip == None or not isinstance(toolTip, (str, unicode)): - test.warning("Parameter toolTip must be of type str or unicode and can't be None!") + if toolTip == None or not isString(toolTip): + test.warning("Parameter toolTip must be of type str and can't be None!") return None pattern = re.compile(".*Kit:(.*)Deploy.*") target = pattern.match(toolTip) @@ -108,7 +108,7 @@ def __getTargetFromToolTip__(toolTip): def getExecutableAndTargetFromToolTip(toolTip): target = __getTargetFromToolTip__(toolTip) - if toolTip == None or not isinstance(toolTip, (str, unicode)): + if toolTip == None or not isString(toolTip): return None, target pattern = re.compile('.*Run:(.*) 2: + return isinstance(sth, str) + else: + return isinstance(sth, (str, unicode)) diff --git a/tests/system/suite_editors/tst_qml_editor/test.py b/tests/system/suite_editors/tst_qml_editor/test.py index c26207ea6ec..e75db758939 100644 --- a/tests/system/suite_editors/tst_qml_editor/test.py +++ b/tests/system/suite_editors/tst_qml_editor/test.py @@ -87,7 +87,6 @@ def testRenameId(): formerTxt = editor.plainText originalText = originalTexts.get(file).replace("mainView", "renamedView") test.compare(originalText,formerTxt, "Comparing %s" % file.replace("Core.","").replace("\\","")) - invokeMenuItem("File","Save All") def __invokeFindUsage__(filename, line, additionalKeyPresses, expectedCount): openDocument(focusDocumentPath % filename) diff --git a/tests/system/suite_editors/tst_rename_macros/test.py b/tests/system/suite_editors/tst_rename_macros/test.py index 491cc3bd200..f1111f8583c 100644 --- a/tests/system/suite_editors/tst_rename_macros/test.py +++ b/tests/system/suite_editors/tst_rename_macros/test.py @@ -46,6 +46,8 @@ def main(): expectedHeaderName=headerName) if not testRenameMacroAfterSourceMoving(): return + # save and exit + invokeMenuItem("File", "Save All") invokeMenuItem("File", "Exit") def testRenameMacroAfterSourceModification(): @@ -156,8 +158,7 @@ def revertChanges(files): simpleName = simpleFileName(f) if openDocument(f): try: - invokeMenuItem('File', 'Revert "%s" to Saved' % simpleName) - clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton")) + invokeMenuItem('Edit', 'Undo') test.log("Reverted changes inside %s" % simpleName) except: test.warning("File '%s' cannot be reverted." % simpleName, diff --git a/tests/system/suite_general/tst_default_settings/test.py b/tests/system/suite_general/tst_default_settings/test.py index 2cb40725b82..29c65425b09 100644 --- a/tests/system/suite_general/tst_default_settings/test.py +++ b/tests/system/suite_general/tst_default_settings/test.py @@ -306,7 +306,7 @@ def __compareCompilers__(foundCompilers, expectedCompilers): if isinstance(currentFound, dict): foundExp = False for currentExp in expectedCompilers: - if isinstance(currentExp, (str, unicode)): + if isString(currentExp): continue key = currentExp.keys()[0] # special case for (fuzzy) regex comparison on Windows (internal LLVM) @@ -353,7 +353,7 @@ def __compareDebuggers__(foundDebuggers, expectedDebuggers): def __lowerStrs__(iterable): for it in iterable: - if isinstance(it, (str, unicode)): + if isString(it): yield it.lower() else: yield it