Merge remote-tracking branch 'origin/6.0' into 7.0

Change-Id: Ie2b23daa457c2aed635a784963bc1e95740bd076
This commit is contained in:
Eike Ziller
2022-02-02 10:17:03 +01:00
91 changed files with 1461 additions and 913 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -41,6 +41,9 @@
project and a button UI control, and how to modify the files generated by project and a button UI control, and how to modify the files generated by
the wizard templates to wireframe the UI. 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 The \e {Learn More} sections provide additional information about the
tasks performed by the wizards and about other basic tasks and concepts. tasks performed by the wizards and about other basic tasks and concepts.
@@ -54,24 +57,19 @@
To create a project: To create a project:
\list 1 \list 1
\li Select \uicontrol File > \uicontrol {New Project} > \li Select \uicontrol File > \uicontrol {New Project}.
\uicontrol General > \uicontrol {Qt Quick Application - Empty} > \li In the \uicontrol Presets tab, select \uicontrol General >
\uicontrol Choose. \uicontrol {Empty}.
\li In the \uicontrol Name field, enter the project name: \e {loginui1}. \li In the \uicontrol Details tab:
When naming your own projects, keep in mind that they cannot be \list
easily renamed later. \li Enter \e Loginui1 as the name for the project. Keep in mind
\li In the \uicontrol {Create in} field, enter the path to the folder that projects cannot be easily renamed later.
where you want to store the project files. You can move project \li Select the path for the project files. You can move project
folders later without problems. folders later.
\li Select \uicontrol Next (or \uicontrol Continue on \macos) to \li Set \uicontrol Width to 720 and \uicontrol Height to 1280.
continue to the \uicontrol {Define Project Details} page. You can change the screen size later in \l Properties.
\li In the \uicontrol {Screen resolution} field, select the initial \endlist
size of the UI. In this tutorial, we use the predefined size \li Select \uicontrol Create to create the project.
\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.
\endlist \endlist
Your project should now look something like this in the \uicontrol Design Your project should now look something like this in the \uicontrol Design
@@ -92,7 +90,7 @@
\section2 Learn More - Projects and Files \section2 Learn More - Projects and Files
\QDS creates a set of boilerplate files and folders that you need to create \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 \image loginui1-project-files.png
@@ -112,6 +110,9 @@
Specifically, if you export and import designs using \QB, your main Specifically, if you export and import designs using \QB, your main
file is most likely called something else. For more information, file is most likely called something else. For more information,
see \l {Exporting from Design Tools}. 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 \li The \e {qtquickcontrols2.conf} file specifies the selected
\l {Styling Qt Quick Controls}{UI style} and some style-specific \l {Styling Qt Quick Controls}{UI style} and some style-specific
arguments. arguments.
@@ -230,7 +231,7 @@
adds the following \e import statements to the UI files (.ui.qml) that it adds the following \e import statements to the UI files (.ui.qml) that it
creates: creates:
\quotefromfile loginui1/Screen01.ui.qml \quotefromfile Loginui1/Content/Screen01.ui.qml
\skipto import \skipto import
\printuntil Controls \printuntil Controls
@@ -333,7 +334,7 @@
To be able to use the functionality of the Button control, the wizard template 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: 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 \skipto import
\printuntil Controls \printuntil Controls
@@ -364,7 +365,7 @@
to \e 100, to match the width of the tag line. to \e 100, to match the width of the tag line.
\li In the \uicontrol Control section, deselect the \uicontrol Hover \li In the \uicontrol Control section, deselect the \uicontrol Hover
check box because we don't want the hover effect for the button. 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. properties in \uicontrol Properties.
\li In \uicontrol Rectangle > \uicontrol {Fill color}, set the color to \li In \uicontrol Rectangle > \uicontrol {Fill color}, set the color to
transparent light gray (\e #28e7e7e7) in \uicontrol Hex. You can 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 {Border Color}, select white (\e #ffffff).
\li In \uicontrol Radius, enter \e 50 to give the button \li In \uicontrol Radius, enter \e 50 to give the button
rounded corners. 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. properties in \uicontrol Properties.
\li In \uicontrol Character > \uicontrol Font, select \li In \uicontrol Character > \uicontrol Font, select
\e {Titillium Web ExtraLight}. \e {Titillium Web ExtraLight}.
@@ -382,7 +383,7 @@
(\e #ffffff). (\e #ffffff).
\li In \uicontrol {Alignment H}, select the \uicontrol Left button to \li In \uicontrol {Alignment H}, select the \uicontrol Left button to
align the text horizontally to the left. 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 \uicontrol Left, set the padding in the field between background
border and text to \e 50. border and text to \e 50.
\image loginui1-text-properties-button.png "Text properties" \image loginui1-text-properties-button.png "Text properties"
@@ -450,13 +451,13 @@
to \e 100. to \e 100.
\li In the \uicontrol Control section, deselect the \uicontrol Hover \li In the \uicontrol Control section, deselect the \uicontrol Hover
check box because we don't want the hover effect for the button. 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. properties in \uicontrol Properties.
\li In \uicontrol Rectangle > \uicontrol {Border color}, select the \li In \uicontrol Rectangle > \uicontrol {Border color}, select the
green used in the logo (\e #41cd52). green used in the logo (\e #41cd52).
\li In \uicontrol Radius, enter \e 50 to give the button rounded \li In \uicontrol Radius, enter \e 50 to give the button rounded
corners. 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. its properties in \uicontrol Properties.
\li In \uicontrol Character > \uicontrol Font, select \li In \uicontrol Character > \uicontrol Font, select
\e {Titillium Web ExtraLight}. \e {Titillium Web ExtraLight}.

View File

@@ -24,7 +24,7 @@
****************************************************************************/ ****************************************************************************/
/*! /*!
\example loginui2 \example Loginui2
\ingroup gstutorials \ingroup gstutorials
\previouspage {Log In UI - Components} \previouspage {Log In UI - Components}
\nextpage {Log In UI - States} \nextpage {Log In UI - States}
@@ -45,7 +45,12 @@
their proper places when you resize the UI on the desktop or on devices their proper places when you resize the UI on the desktop or on devices
with different screen sizes, you will use anchors and positioners. 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 The \e {Learn More} sections provide additional information about the
task at hand. task at hand.
@@ -79,6 +84,9 @@
anchor button to anchor \e adventurePage to its anchor button to anchor \e adventurePage to its
parent in the \uicontrol Target field. This attaches the background parent in the \uicontrol Target field. This attaches the background
image to the rectangle on all sides. 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" \image loginui2-layout.png "Layout properties"
\li Select \e qt_logo_green_128x128px in \l Navigator. \li Select \e qt_logo_green_128x128px in \l Navigator.
\li In \uicontrol Properties > \uicontrol Layout, select the \li In \uicontrol Properties > \uicontrol Layout, select the

View File

@@ -46,12 +46,12 @@
login page, you will use \e states to show and hide UI components as necessary login page, you will use \e states to show and hide UI components as necessary
when a user selects the \e {Create Account} button. 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 Additionally, you can download the completed project of this tutorial from
\li \l {Log In UI - Components} \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui3}{here}.
\li \l {Log In UI - Positioning}
\endlist
The \e {Learn More} sections provide additional information relevant to the The \e {Learn More} sections provide additional information relevant to the
task at hand. task at hand.

View File

@@ -46,13 +46,13 @@
\l{Creating Timeline Animations}{timeline animations} that you bind \l{Creating Timeline Animations}{timeline animations} that you bind
to states. 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 The \e {Learn More} sections provide additional information relevant to the
task at hand. task at hand.
@@ -94,7 +94,7 @@
\li Select \inlineimage icons/navigator-arrowup.png \li Select \inlineimage icons/navigator-arrowup.png
to move \e username below \e tagLine in \uicontrol Navigator to move \e username below \e tagLine in \uicontrol Navigator
to preserve the \l{Arranging Components}{component hierarchy}. 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 \li Select \e fields in \uicontrol Navigator and press \key Delete to
delete it. delete it.
\li Select \e username in \uicontrol Navigator to display its properties \li Select \e username in \uicontrol Navigator to display its properties
@@ -196,8 +196,8 @@
to save your changes. to save your changes.
\endlist \endlist
When you move the playhead along the timeline, you can see how the login When you move the playhead along the timeline, you can see how the create
button fades out while the repeat password field fades in. account button fades out while the repeat password field fades in.
You will now animate the top anchor margin of the repeat password field You will now animate the top anchor margin of the repeat password field
to make it appear to slide down from the 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 frame 0, and select the record button for the \e anchors.topMargin
property of \e repeatPassword. property of \e repeatPassword.
\li In the field next to the property, set a negative value for the \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. \e password.
\li Move the playhead to frame 1000 and change the top anchor margin \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 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 the following \e import statement to the UI files where it uses the
components: components:
\quotefromfile loginui4/Screen01.ui.qml \quotefromfile Loginui4/Content/Screen01.ui.qml
\skipto QtQuick.Timeline \skipto QtQuick.Timeline
\printuntil 1.0 \printuntil 1.0

View File

@@ -39,8 +39,8 @@
translations from a JSON file. translations from a JSON file.
You need to download the starting project for this tutorial from You need to download the starting project for this tutorial from
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/examples/ \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/multi-language%20tutorial/Loginui2}{here}
loginui2}{here} before you start. before you start.
Download the project and open the \e loginui2.qmlproject file in \QDS Download the project and open the \e loginui2.qmlproject file in \QDS
to get started. to get started.
@@ -48,8 +48,7 @@
This project consists of a login page with a couple of text elements. This project consists of a login page with a couple of text elements.
Additionally, you will use a JSON translation file in this tutorial. Additionally, you will use a JSON translation file in this tutorial.
Download it from \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/ Download it from \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/multi-language}{here}.
master/tutorial%20projects/multi-language}{here}.
\section1 JSON Translation File \section1 JSON Translation File
@@ -133,10 +132,11 @@
First, you need to prepare your project for translation: First, you need to prepare your project for translation:
\list 1 \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 \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 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 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: replace:
\code \code
text: qsTr("Qt Account") text: qsTr("Qt Account")
@@ -165,21 +165,14 @@
\li Go to \uicontrol View > \uicontrol Views and select \uicontrol \li Go to \uicontrol View > \uicontrol Views and select \uicontrol
Translations to open the \uicontrol Translations view. You can Translations to open the \uicontrol Translations view. You can
drag it to a workspace to dock it. 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 \li In \uicontrol Translations, select
\inlineimage icons/select-languages.png \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, \li Select the languages that you want to support in your project,
in this case \uicontrol{English - American English} and in this case \uicontrol{English - American English} and
\uicontrol{Swedish}. \uicontrol{Swedish - Svenska}.
\li Set \uicontrol English as primary language and select \uicontrol{OK}. \li Set \uicontrol{English - American English} as primary language and
select \uicontrol{Ok}.
\li Select \inlineimage icons/import-json-translations.png \li Select \inlineimage icons/import-json-translations.png
and open the \e ml_translations.json file. Now you can see all your and open the \e ml_translations.json file. Now you can see all your
imported translations in the \uicontrol Translations view. imported translations in the \uicontrol Translations view.

View File

@@ -1,8 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the examples of the Qt Design Studio. ** This file is part of the examples of the Qt Design Studio.
@@ -49,6 +47,7 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls 2.12 import QtQuick.Controls 2.12
@@ -100,13 +99,16 @@ Button {
when: !control.down when: !control.down
PropertyChanges { PropertyChanges {
target: textItem target: buttonBackground
font.family: "Titillium Web ExtraLight" color: "#00000000"
border.color: "#ffffff"
} }
PropertyChanges { PropertyChanges {
target: buttonBackground target: textItem
color: "#28e7e7e7" color: "#ffffff"
font.pixelSize: 34
font.family: "Titillium Web ExtraLight"
} }
}, },
State { State {
@@ -115,12 +117,14 @@ Button {
PropertyChanges { PropertyChanges {
target: textItem target: textItem
color: "#ffffff" color: "#ffffff"
border.color: "#ffffff"
font.family: "Titillium Web ExtraLight"
} }
PropertyChanges { PropertyChanges {
target: buttonBackground target: buttonBackground
color: "#e7e7e7" color: "#28e7e7e7"
border.color: "#ffffff" border.color: "#00000000"
} }
} }
] ]

View File

@@ -1,8 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the examples of the Qt Design Studio. ** This file is part of the examples of the Qt Design Studio.
@@ -49,6 +47,7 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls 2.12 import QtQuick.Controls 2.12
@@ -68,6 +67,7 @@ Button {
text: "My Button" text: "My Button"
hoverEnabled: false hoverEnabled: false
enabled: true
background: buttonBackground background: buttonBackground
Rectangle { Rectangle {
@@ -83,6 +83,8 @@ Button {
contentItem: textItem contentItem: textItem
Text { Text {
id: textItem id: textItem
width: 500
height: 100
text: control.text text: control.text
font.pixelSize: 34 font.pixelSize: 34
@@ -101,6 +103,14 @@ Button {
PropertyChanges { PropertyChanges {
target: buttonBackground target: buttonBackground
color: "#00000000" color: "#00000000"
border.color: "#41cd52"
}
PropertyChanges {
target: textItem
color: "#41cd52"
font.pixelSize: 34
font.family: "Titillium Web ExtraLight"
} }
}, },
State { State {
@@ -108,20 +118,17 @@ Button {
when: control.down when: control.down
PropertyChanges { PropertyChanges {
target: textItem target: textItem
color: "#ffffff" color: "#41cd52"
border.color: "#41cd52"
font.pixelSize: 34
font.family: "Titillium Web ExtraLight"
} }
PropertyChanges { PropertyChanges {
target: buttonBackground target: buttonBackground
color: "#41cd52" color: "#41cd52"
border.color: "#00000000" border.color: "#41cd52"
} }
} }
] ]
} }
/*##^##
Designer {
D{i:0;height:100;width:500}
}
##^##*/

View File

@@ -1,8 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the examples of the Qt Design Studio. ** This file is part of the examples of the Qt Design Studio.
@@ -49,9 +47,10 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import loginui1 1.0 import Loginui1
Rectangle { Rectangle {
width: Constants.width width: Constants.width
@@ -70,47 +69,44 @@ Rectangle {
Image { Image {
id: qt_logo_green_128x128px id: qt_logo_green_128x128px
x: 296 x: 296
y: 40 y: 0
source: "images/qt_logo_green_128x128px.png" source: "images/qt_logo_green_128x128px.png"
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
} }
Text { Text {
id: tagLine
width: 541
height: 78
color: "#ffffff" color: "#ffffff"
text: qsTr("Are you ready to explore?") text: qsTr("Are you ready to explore?")
font.pixelSize: 50 font.pixelSize: 50
font.family: "Titillium Web ExtraLight" font.family: "Titillium Web ExtraLight"
anchors.verticalCenterOffset: -391 anchors.verticalCenterOffset: -430
anchors.horizontalCenterOffset: 18 anchors.horizontalCenterOffset: 0
anchors.centerIn: parent anchors.centerIn: parent
} }
EntryField { EntryField {
id: username id: username
x: 128 x: 110
y: 470 y: 470
text: "Username or Email" text: qsTr("Username or Email")
} }
EntryField { EntryField {
id: password id: password
x: 128 x: 110
y: 590 y: 590
text: qsTr("Password") text: qsTr("Password")
} }
PushButton { PushButton {
id: login id: login
x: 102 x: 101
y: 966 y: 944
text: qsTr("Continue") text: qsTr("Continue")
} }
PushButton { PushButton {
id: createAccount id: creteAccount
x: 102 x: 101
y: 1088 y: 1088
text: qsTr("Create Account") text: qsTr("Create Account")
} }
@@ -118,7 +114,7 @@ Rectangle {
/*##^## /*##^##
Designer { 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}
} }
##^##*/ ##^##*/

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -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"
}
}

View File

@@ -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()
}
}

View File

@@ -1,2 +1,6 @@
Module Loginui1
singleton Constants 1.0 Constants.qml singleton Constants 1.0 Constants.qml
EventListSimulator 1.0 EventListSimulator.qml EventListSimulator 1.0 EventListSimulator.qml
EventListModel 1.0 EventListModel.qml
DirectoryFontLoader 1.0 DirectoryFontLoader.qml

View File

@@ -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 {
}
}

View File

@@ -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 { Project {
mainFile: "loginui1.qml" mainFile: "content/App.qml"
/* Include .qml, .js, and image files from current directory and subdirectories */ /* Include .qml, .js, and image files from current directory and subdirectories */
QmlFiles { QmlFiles {
directory: "." directory: "content"
} }
JavaScriptFiles { JavaScriptFiles {
directory: "." directory: "content"
} }
ImageFiles { ImageFiles {
directory: "." directory: "content"
} }
Files { Files {
@@ -32,9 +80,34 @@ Project {
filter: "*.ttf;*.otf" 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 { Environment {
QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf"
QT_AUTO_SCREEN_SCALE_FACTOR: "1" 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 qt6Project: true
@@ -43,5 +116,10 @@ Project {
importPaths: [ "imports", "asset_imports" ] importPaths: [ "imports", "asset_imports" ]
/* Required for deployment */ /* 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
} }

View File

@@ -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

View File

@@ -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/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the examples of the Qt Design Studio. ** This file is part of the examples of the Qt Design Studio.
@@ -48,14 +53,12 @@
** **
****************************************************************************/ ****************************************************************************/
import QtQuick #include <QGuiApplication>
import loginui4 1.0
Item {
width: Constants.width
height: Constants.height
Screen01 {
}
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");
} }

View File

@@ -0,0 +1,9 @@
/*
* This file is automatically generated by Qt Design Studio.
* Do not change.
*/
#include <QtQml/qqmlextensionplugin.h>
Q_IMPORT_QML_PLUGIN(contentPlugin)
Q_IMPORT_QML_PLUGIN(Loginui1Plugin)

View File

@@ -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 <QGuiApplication>
#include <QQmlApplicationEngine>
#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();
}

View File

@@ -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
}

View File

@@ -1,8 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the examples of the Qt Design Studio. ** This file is part of the examples of the Qt Design Studio.
@@ -49,9 +47,10 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import loginui2 1.0 import Loginui1
Rectangle { Rectangle {
id: rectangle id: rectangle
@@ -69,7 +68,6 @@ Rectangle {
Image { Image {
id: qt_logo_green_128x128px id: qt_logo_green_128x128px
x: 296
anchors.top: parent.top anchors.top: parent.top
source: "images/qt_logo_green_128x128px.png" source: "images/qt_logo_green_128x128px.png"
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
@@ -78,8 +76,6 @@ Rectangle {
} }
Text { Text {
id: tagLine id: tagLine
width: 541
height: 78
color: "#ffffff" color: "#ffffff"
text: qsTr("Are you ready to explore?") text: qsTr("Are you ready to explore?")
anchors.top: qt_logo_green_128x128px.bottom anchors.top: qt_logo_green_128x128px.bottom
@@ -87,11 +83,11 @@ Rectangle {
anchors.topMargin: 40 anchors.topMargin: 40
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
font.family: "Titillium Web ExtraLight" font.family: "Titillium Web ExtraLight"
anchors.horizontalCenterOffset: 0
} }
Column { Column {
id: fields id: fields
x: 128
anchors.top: tagLine.bottom anchors.top: tagLine.bottom
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 170 anchors.topMargin: 170
@@ -99,7 +95,7 @@ Rectangle {
EntryField { EntryField {
id: username id: username
text: "Username or Email" text: qsTr("Username or Email")
} }
EntryField { EntryField {
@@ -110,11 +106,10 @@ Rectangle {
Column { Column {
id: buttons id: buttons
x: 102 y: 944
y: 966
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 100 anchors.bottomMargin: 50
spacing: 20 spacing: 20
PushButton { PushButton {
@@ -123,7 +118,7 @@ Rectangle {
} }
PushButton { PushButton {
id: createAccount id: creteAccount
text: qsTr("Create Account") text: qsTr("Create Account")
} }
} }
@@ -131,7 +126,7 @@ Rectangle {
/*##^## /*##^##
Designer { 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}
} }
##^##*/ ##^##*/

View File

@@ -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
}
}

View File

@@ -1,2 +0,0 @@
singleton Constants 1.0 Constants.qml
EventListSimulator 1.0 EventListSimulator.qml

View File

@@ -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 {
}
}

View File

@@ -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"
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -1,8 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the examples of the Qt Design Studio. ** This file is part of the examples of the Qt Design Studio.
@@ -49,9 +47,10 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import loginui3 1.0 import Loginui1
Rectangle { Rectangle {
id: rectangle id: rectangle
@@ -70,7 +69,6 @@ Rectangle {
Image { Image {
id: qt_logo_green_128x128px id: qt_logo_green_128x128px
x: 296
anchors.top: parent.top anchors.top: parent.top
source: "images/qt_logo_green_128x128px.png" source: "images/qt_logo_green_128x128px.png"
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
@@ -79,8 +77,6 @@ Rectangle {
} }
Text { Text {
id: tagLine id: tagLine
width: 541
height: 78
color: "#ffffff" color: "#ffffff"
text: qsTr("Are you ready to explore?") text: qsTr("Are you ready to explore?")
anchors.top: qt_logo_green_128x128px.bottom anchors.top: qt_logo_green_128x128px.bottom
@@ -88,11 +84,11 @@ Rectangle {
anchors.topMargin: 40 anchors.topMargin: 40
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
font.family: "Titillium Web ExtraLight" font.family: "Titillium Web ExtraLight"
anchors.horizontalCenterOffset: 0
} }
Column { Column {
id: fields id: fields
x: 128
anchors.top: tagLine.bottom anchors.top: tagLine.bottom
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 170 anchors.topMargin: 170
@@ -100,7 +96,7 @@ Rectangle {
EntryField { EntryField {
id: username id: username
text: "Username or Email" text: qsTr("Username or Email")
} }
EntryField { EntryField {
@@ -110,17 +106,16 @@ Rectangle {
EntryField { EntryField {
id: repeatPassword id: repeatPassword
text: "Repeat Password" text: qsTr("Repeat Password")
} }
} }
Column { Column {
id: buttons id: buttons
x: 102 y: 944
y: 966
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 100 anchors.bottomMargin: 50
spacing: 20 spacing: 20
PushButton { PushButton {
@@ -160,7 +155,8 @@ Rectangle {
/*##^## /*##^##
Designer { 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}
} }
##^##*/ ##^##*/

View File

@@ -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
}
}

View File

@@ -1,2 +0,0 @@
singleton Constants 1.0 Constants.qml
EventListSimulator 1.0 EventListSimulator.qml

View File

@@ -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 {
}
}

View File

@@ -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"
}

View File

@@ -1,2 +0,0 @@
[Controls]
Style=Default

View File

@@ -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
}

View File

@@ -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
import QtQuick.Controls import QtQuick.Controls
import loginui4 1.0 import Loginui1
import QtQuick.Timeline 1.0 import QtQuick.Timeline 1.0
Rectangle { Rectangle {
@@ -71,7 +20,6 @@ Rectangle {
Image { Image {
id: qt_logo_green_128x128px id: qt_logo_green_128x128px
x: 296
anchors.top: parent.top anchors.top: parent.top
source: "images/qt_logo_green_128x128px.png" source: "images/qt_logo_green_128x128px.png"
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
@@ -80,8 +28,6 @@ Rectangle {
} }
Text { Text {
id: tagLine id: tagLine
width: 541
height: 78
color: "#ffffff" color: "#ffffff"
text: qsTr("Are you ready to explore?") text: qsTr("Are you ready to explore?")
anchors.top: qt_logo_green_128x128px.bottom anchors.top: qt_logo_green_128x128px.bottom
@@ -89,30 +35,29 @@ Rectangle {
anchors.topMargin: 40 anchors.topMargin: 40
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
font.family: "Titillium Web ExtraLight" font.family: "Titillium Web ExtraLight"
anchors.horizontalCenterOffset: 0
} }
EntryField { EntryField {
id: username id: username
x: 110 text: qsTr("Username or Email")
text: "Username or Email"
anchors.top: tagLine.bottom anchors.top: tagLine.bottom
anchors.topMargin: 170
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 170
} }
EntryField { EntryField {
id: password id: password
x: 110
text: qsTr("Password") text: qsTr("Password")
anchors.top: username.bottom anchors.top: username.bottom
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 20 anchors.topMargin: 21
} }
EntryField { EntryField {
id: repeatPassword id: repeatPassword
x: 110 opacity: 0
text: "Repeat Password" text: qsTr("Repeat Password")
anchors.top: password.bottom anchors.top: password.bottom
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 20 anchors.topMargin: 20
@@ -120,11 +65,10 @@ Rectangle {
Column { Column {
id: buttons id: buttons
x: 102 y: 944
y: 966
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.bottomMargin: 100 anchors.bottomMargin: 50
spacing: 20 spacing: 20
PushButton { PushButton {
@@ -148,70 +92,68 @@ Rectangle {
animations: [ animations: [
TimelineAnimation { TimelineAnimation {
id: toCreateAccountState id: toCreateAccountState
duration: 1000
running: false running: false
loops: 1 loops: 1
duration: 1000
to: 1000 to: 1000
from: 0 from: 0
} }
] ]
endFrame: 1000 endFrame: 1000
startFrame: 0
enabled: true enabled: true
startFrame: 0
KeyframeGroup { KeyframeGroup {
target: repeatPassword target: repeatPassword
property: "opacity" property: "opacity"
Keyframe { Keyframe {
frame: 0
value: 0 value: 0
frame: 0
} }
Keyframe { Keyframe {
frame: 999
value: 1 value: 1
frame: 1000
} }
} }
KeyframeGroup { KeyframeGroup {
target: createAccount target: createAccount
property: "opacity" property: "opacity"
Keyframe {
value: 1
frame: 0
}
Keyframe { Keyframe {
frame: 1000
value: 0 value: 0
frame: 1000
} }
} }
KeyframeGroup { KeyframeGroup {
target: repeatPassword target: repeatPassword
property: "anchors.topMargin" property: "anchors.topMargin"
Keyframe {
value: -100
frame: 0
}
Keyframe { Keyframe {
frame: 0 value: -100
value: -40 frame: 4
} }
Keyframe { Keyframe {
easing.bezierCurve: [0.39, 0.575, 0.565, 1, 1, 1] easing.bezierCurve: [0.39, 0.575, 0.565, 1, 1, 1]
frame: 999
value: 20 value: 20
frame: 999
} }
} }
} }
states: [ states: [
State { State {
name: "login" name: "login"
PropertyChanges {
target: timeline
enabled: true
}
PropertyChanges {
target: toCreateAccountState
}
}, },
State { State {
name: "createAccount" name: "createAccount"
@@ -231,6 +173,8 @@ Rectangle {
/*##^## /*##^##
Designer { 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}
} }
##^##*/ ##^##*/

View File

@@ -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
}
}

View File

@@ -1,2 +0,0 @@
singleton Constants 1.0 Constants.qml
EventListSimulator 1.0 EventListSimulator.qml

View File

@@ -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"
}

View File

@@ -1,2 +0,0 @@
[Controls]
Style=Default

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -63,12 +63,14 @@
\li \l{Generating Qt Translation Source Files} \li \l{Generating Qt Translation Source Files}
\row \row
\li \inlineimage icons/project-translation-test.png \li \inlineimage icons/project-translation-test.png
\li Run project translation test. \li Run translation test for several documents and create a test report.
\li \l{Running the Project Translation Test} \li \l{Running Translation Test for Several Documents}
\row \row
\li \inlineimage icons/qml-translation-test.png \li \inlineimage icons/qml-translation-test.png
\li Run QML translation test to find missing and elided translations. \li Run translation test for the currently open document. This test
\li \l{Running the QML Translation Test} shows translation warnings in \uicontrol{From Editor} and creates a
test report.
\li \l{Running Translation Test for a Single Document}
\row \row
\li \inlineimage icons/export-translations.png \li \inlineimage icons/export-translations.png
\li Export all translations used in your project or all translations \li Export all translations used in your project or all translations
@@ -93,8 +95,8 @@
"translation": "Password" "translation": "Password"
}, },
{ {
"language": "sv", "language": "fi",
"translation": "Lösenord" "translation": "Salasana"
} }
] ]
} }
@@ -120,8 +122,8 @@
"translation": "Password" "translation": "Password"
}, },
{ {
"language": "sv", "language": "fi",
"translation": "Lösenord" "translation": "Salasana"
} }
] ]
\endcode \endcode
@@ -139,14 +141,14 @@
in the \uicontrol Translations view. The files are generated in the \uicontrol Translations view. The files are generated
in \e{<project-folder>/i18n}. in \e{<project-folder>/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 You can run the translation test to find missing translations
and elided translations. Running the QML language test and translations where the text exceeds the text element boundaries. Running
is a quick way to check the translations in the application you have open in the test is a quick way to check the translations in the document you have
\uicontrol{Form Editor} as it highlights errors in the UI. 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 \list 1
\li In the \uicontrol Translations view, select \li In the \uicontrol Translations view, select
@@ -155,12 +157,11 @@
\li Select the tests to run and the highlight color \li Select the tests to run and the highlight color
for each test: for each test:
\list \list
\li \uicontrol{Show Translation Warnings} highlights missing \li \uicontrol{Success} highlights translations without any warnings.
translations. \li \uicontrol{Missing translation} highlights translations that are
\li \uicontrol{Show Found Translations} highlights all translations missing for one or more languages.
that are correct. \li \uicontrol{Exceeds boundaries} highlights translations where
\li \uicontrol{Show Elide Warnings} highlights all translations where the text is too long to fit in the text object.
the text is too long to fit in the text object and therefore is elided.
\endlist \endlist
\image translation-tester.png \image translation-tester.png
\li Select \uicontrol{Run Tests}. \li Select \uicontrol{Run Tests}.
@@ -205,16 +206,21 @@
The report shows the type of error as well as line and column of the The report shows the type of error as well as line and column of the
affected text element in the \e{ui.qml} file. 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 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 at the same time. \QDS runs the same tests as during the
\l{Running the QML Translation Test}{QML Translation Test} and generates the \l{Running Translation Test for a Single Document}{Translation Test} and
same test reports but does not highlight errors in the UI. generates the same test reports but does not highlight errors in the UI.
To run the project translation test, select To run the translation test for several documents:
\list 1
\li Select
\inlineimage icons/project-translation-test.png \inlineimage icons/project-translation-test.png
in the \uicontrol Translations view. 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 \section1 Exporting Translations in Other Ways

View File

@@ -872,6 +872,13 @@ Item {
camera: viewRoot.usePerspective ? overlayPerspectiveCamera : overlayOrthoCamera camera: viewRoot.usePerspective ? overlayPerspectiveCamera : overlayOrthoCamera
importScene: overlayScene importScene: overlayScene
z: 2 z: 2
environment: sceneEnv
SceneEnvironment {
id: sceneEnv
antialiasingMode: SceneEnvironment.MSAA
antialiasingQuality: SceneEnvironment.High
}
} }
Overlay2D { Overlay2D {

View File

@@ -50,6 +50,13 @@ View3D {
thresPerc = (grid_thresholds[thresIdx] - cameraZoomFactor) / (grid_thresholds[thresIdx] - grid_thresholds[thresIdx - 1]); thresPerc = (grid_thresholds[thresIdx] - cameraZoomFactor) / (grid_thresholds[thresIdx] - grid_thresholds[thresIdx - 1]);
} }
environment: sceneEnv
SceneEnvironment {
id: sceneEnv
antialiasingMode: SceneEnvironment.MSAA
antialiasingQuality: SceneEnvironment.High
}
Node { Node {
id: sceneHelpers id: sceneHelpers

View File

@@ -142,6 +142,16 @@ void CameraGeometry::doUpdateGeometry()
if (!QQuick3DObjectPrivate::get(m_camera)->spatialNode) { if (!QQuick3DObjectPrivate::get(m_camera)->spatialNode) {
// Doing explicit viewport mapping forces cameraNode creation // Doing explicit viewport mapping forces cameraNode creation
m_camera->mapToViewport({}, m_viewPortRect.width(), m_viewPortRect.height()); 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(); GeometryBase::doUpdateGeometry();

View File

@@ -67,6 +67,9 @@ private:
QQuick3DCamera *m_camera = nullptr; QQuick3DCamera *m_camera = nullptr;
QRectF m_viewPortRect; QRectF m_viewPortRect;
bool m_cameraUpdatePending = false; bool m_cameraUpdatePending = false;
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
bool m_nodeCreationUpdateDone = false;
#endif
}; };
} }

View File

@@ -729,7 +729,8 @@ void MouseArea3D::applyFreeRotation(QQuick3DNode *node, const QVector3D &startRo
if (dragVector.length() < 0.001f) if (dragVector.length() < 0.001f)
return; 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 xAxis = QVector3D(dataPtr[0], dataPtr[1], dataPtr[2]).normalized();
QVector3D yAxis = QVector3D(dataPtr[4], dataPtr[5], dataPtr[6]).normalized(); QVector3D yAxis = QVector3D(dataPtr[4], dataPtr[5], dataPtr[6]).normalized();
QVector3D finalAxis = (dragVector.x() * yAxis + dragVector.y() * xAxis); QVector3D finalAxis = (dragVector.x() * yAxis + dragVector.y() * xAxis);
@@ -1029,7 +1030,8 @@ void MouseArea3D::setHovering(bool enable)
QVector3D MouseArea3D::getNormal() const 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(); return QVector3D(dataPtr[8], dataPtr[9], dataPtr[10]).normalized();
} }

View File

@@ -241,7 +241,7 @@ int internalMain(QGuiApplication *application)
#endif #endif
#if defined(ENABLE_CRASHPAD) && defined(Q_OS_WIN) #if defined(ENABLE_CRASHPAD) && defined(Q_OS_WIN)
startCrashpad(); /* startCrashpad(); */
#endif #endif
new QmlDesigner::Qt5NodeInstanceClientProxy(application); new QmlDesigner::Qt5NodeInstanceClientProxy(application);

View File

@@ -36,7 +36,9 @@ Item {
property var selectedAssets: ({}) property var selectedAssets: ({})
property int allExpandedState: 0 property int allExpandedState: 0
property string delFilePath: "" property string contextFilePath: ""
property var contextDir: undefined
property bool isDirContextMenu: false
DropArea { DropArea {
id: 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 // called from C++ to close context menu on focus out
function handleViewFocusOut() function handleViewFocusOut()
{ {
@@ -75,9 +90,139 @@ Item {
selectedAssetsChanged() 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 ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
id: assetsView id: assetsView
anchors.fill: parent anchors.fill: parent
interactive: assetsView.verticalScrollBarVisible
Item { Item {
StudioControls.Menu { StudioControls.Menu {
@@ -86,7 +231,7 @@ Item {
StudioControls.MenuItem { StudioControls.MenuItem {
text: qsTr("Expand All") text: qsTr("Expand All")
enabled: allExpandedState !== 1 enabled: allExpandedState !== 1
visible: !delFilePath visible: isDirContextMenu
height: visible ? implicitHeight : 0 height: visible ? implicitHeight : 0
onTriggered: assetsModel.toggleExpandAll(true) onTriggered: assetsModel.toggleExpandAll(true)
} }
@@ -94,22 +239,51 @@ Item {
StudioControls.MenuItem { StudioControls.MenuItem {
text: qsTr("Collapse All") text: qsTr("Collapse All")
enabled: allExpandedState !== 2 enabled: allExpandedState !== 2
visible: !delFilePath visible: isDirContextMenu
height: visible ? implicitHeight : 0 height: visible ? implicitHeight : 0
onTriggered: assetsModel.toggleExpandAll(false) onTriggered: assetsModel.toggleExpandAll(false)
} }
StudioControls.MenuSeparator {
visible: isDirContextMenu
height: visible ? StudioTheme.Values.border : 0
}
StudioControls.MenuItem { StudioControls.MenuItem {
text: qsTr("Delete File") text: qsTr("Delete File")
visible: delFilePath visible: contextFilePath
height: visible ? implicitHeight : 0 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 { Column {
spacing: 2
Repeater { Repeater {
model: assetsModel // context property model: assetsModel // context property
delegate: dirSection delegate: dirSection
@@ -120,31 +294,35 @@ Item {
Section { Section {
width: assetsView.width - width: assetsView.width -
(assetsView.verticalScrollBarVisible ? assetsView.verticalThickness : 0) (assetsView.verticalScrollBarVisible ? assetsView.verticalThickness : 0) - 5
caption: dirName caption: dirName
sectionHeight: 30 sectionHeight: 30
sectionFontSize: 15 sectionFontSize: 15
levelShift: 20
leftPadding: 0 leftPadding: 0
topPadding: dirDepth > 0 ? 5 : 0
bottomPadding: 0
hideHeader: dirDepth === 0 hideHeader: dirDepth === 0
showLeftBorder: true showLeftBorder: dirDepth > 0
expanded: dirExpanded expanded: dirExpanded
visible: dirVisible visible: !assetsModel.isEmpty && dirVisible
expandOnClick: false expandOnClick: false
useDefaulContextMenu: false useDefaulContextMenu: false
onToggleExpand: { onToggleExpand: {
dirExpanded = !dirExpanded dirExpanded = !dirExpanded
} }
onShowContextMenu: { onShowContextMenu: {
delFilePath = "" contextFilePath = ""
contextDir = model
isDirContextMenu = true
allExpandedState = assetsModel.getAllExpandedState() allExpandedState = assetsModel.getAllExpandedState()
contextMenu.popup() contextMenu.popup()
} }
Column { Column {
spacing: 5 spacing: 5
leftPadding: 15 leftPadding: 5
Repeater { Repeater {
model: dirsModel model: dirsModel
@@ -155,6 +333,25 @@ Item {
model: filesModel model: filesModel
delegate: fileSection 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) if (currFileSelected)
rootView.startDragAsset(selectedAssetsArr, mapToGlobal(mouse.x, mouse.y)) rootView.startDragAsset(selectedAssetsArr, mapToGlobal(mouse.x, mouse.y))
} else { } else {
delFilePath = filePath contextFilePath = filePath
contextDir = model.fileDir
tooltipBackend.hideTooltip() tooltipBackend.hideTooltip()
isDirContextMenu = false
contextMenu.popup() contextMenu.popup()
} }
} }
@@ -263,7 +463,7 @@ Item {
// Placeholder when the assets panel is empty // Placeholder when the assets panel is empty
Column { Column {
id: colNoAssets id: colNoAssets
visible: assetsModel.isEmpty visible: assetsModel.isEmpty && !rootView.searchActive
spacing: 20 spacing: 20
x: 20 x: 20
@@ -307,4 +507,13 @@ Item {
wrapMode: Text.WordWrap 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
}
} }

View File

@@ -173,7 +173,7 @@ Item {
id: leftBorder id: leftBorder
visible: false visible: false
width: 1 width: 1
height: parent.height - 15 height: parent.height - bottomPadding
color: header.color color: header.color
} }

View File

@@ -27,29 +27,35 @@
Metadata { Metadata {
id: metadataFile id: metadataFile
defaultVersion: v19 defaultVersion: v20
VersionData { VersionData {
id: v14 id: v14
name: "QUL 1.4" name: "Qt for MCUs 1.4"
path: "qul-14.qml" path: "qul-14.qml"
} }
VersionData { VersionData {
id: v17 id: v17
name: "QUL 1.7" name: "Qt for MCUs 1.7"
path: "qul-17.qml" path: "qul-17.qml"
} }
VersionData { VersionData {
id: v18 id: v18
name: "QUL 1.8" name: "Qt for MCUs 1.8"
path: "qul-18.qml" path: "qul-18.qml"
} }
VersionData { VersionData {
id: v19 id: v19
name: "QUL 1.9" name: "Qt for MCUs 1.9"
path: "qul-19.qml" path: "qul-19.qml"
} }
VersionData {
id: v20
name: "Qt for MCUs 2.0"
path: "qul-20.qml"
}
} }

View File

@@ -24,7 +24,7 @@
****************************************************************************/ ****************************************************************************/
VersionData { VersionData {
name: "QUL 1.4" name: "Qt for MCUs 1.4"
bannedItems: ["QtQuick.AnimatedImage", bannedItems: ["QtQuick.AnimatedImage",
"QtQuick.FocusScope", "QtQuick.FocusScope",
@@ -34,6 +34,7 @@ VersionData {
"QtQuick.Grid", "QtQuick.Grid",
"QtQuick.GridView", "QtQuick.GridView",
"QtQuick.PathView", "QtQuick.PathView",
"QtQuick.Loader",
"QtQuick.Controls", "QtQuick.Controls",
"QtQuick.Controls.BusyIndicator", "QtQuick.Controls.BusyIndicator",
"QtQuick.Controls.ButtonGroup", "QtQuick.Controls.ButtonGroup",

View File

@@ -24,7 +24,7 @@
****************************************************************************/ ****************************************************************************/
VersionData { VersionData {
name: "QUL 1.7" name: "Qt for MCUs 1.7"
bannedItems: ["QtQuick.AnimatedImage", bannedItems: ["QtQuick.AnimatedImage",
"QtQuick.FocusScope", "QtQuick.FocusScope",
@@ -34,6 +34,7 @@ VersionData {
"QtQuick.Grid", "QtQuick.Grid",
"QtQuick.GridView", "QtQuick.GridView",
"QtQuick.PathView", "QtQuick.PathView",
"QtQuick.Loader",
"QtQuick.Controls", "QtQuick.Controls",
"QtQuick.Controls.BusyIndicator", "QtQuick.Controls.BusyIndicator",
"QtQuick.Controls.ButtonGroup", "QtQuick.Controls.ButtonGroup",

View File

@@ -24,7 +24,7 @@
****************************************************************************/ ****************************************************************************/
VersionData { VersionData {
name: "QUL 1.8" name: "Qt for MCUs 1.8"
bannedItems: ["QtQuick.AnimatedImage", bannedItems: ["QtQuick.AnimatedImage",
"QtQuick.FocusScope", "QtQuick.FocusScope",
@@ -34,6 +34,7 @@ VersionData {
"QtQuick.Grid", "QtQuick.Grid",
"QtQuick.GridView", "QtQuick.GridView",
"QtQuick.PathView", "QtQuick.PathView",
"QtQuick.Loader",
"QtQuick.Controls", "QtQuick.Controls",
"QtQuick.Controls.BusyIndicator", "QtQuick.Controls.BusyIndicator",
"QtQuick.Controls.ButtonGroup", "QtQuick.Controls.ButtonGroup",
@@ -63,7 +64,11 @@ VersionData {
"QtQuick.Controls.TextArea", "QtQuick.Controls.TextArea",
"QtQuick.Controls.TextField", "QtQuick.Controls.TextField",
"QtQuick.Controls.ToolSeparator", "QtQuick.Controls.ToolSeparator",
"QtQuick.Controls.Tumbler"] "QtQuick.Controls.Tumbler",
"QtQuick.Shapes.ConicalGradient",
"QtQuick.Shapes.LinearGradient",
"QtQuick.Shapes.RadialGradient",
"QtQuick.Shapes.ShapeGradient"]
allowedImports: ["QtQuick", allowedImports: ["QtQuick",
"QtQuick.Shapes", "QtQuick.Shapes",

View File

@@ -24,7 +24,7 @@
****************************************************************************/ ****************************************************************************/
VersionData { VersionData {
name: "QUL 1.9" name: "Qt for MCUs 1.9"
bannedItems: ["QtQuick.AnimatedImage", bannedItems: ["QtQuick.AnimatedImage",
"QtQuick.FocusScope", "QtQuick.FocusScope",
@@ -34,6 +34,7 @@ VersionData {
"QtQuick.Grid", "QtQuick.Grid",
"QtQuick.GridView", "QtQuick.GridView",
"QtQuick.PathView", "QtQuick.PathView",
"QtQuick.Loader",
"QtQuick.Controls", "QtQuick.Controls",
"QtQuick.Controls.BusyIndicator", "QtQuick.Controls.BusyIndicator",
"QtQuick.Controls.ButtonGroup", "QtQuick.Controls.ButtonGroup",
@@ -63,7 +64,11 @@ VersionData {
"QtQuick.Controls.TextArea", "QtQuick.Controls.TextArea",
"QtQuick.Controls.TextField", "QtQuick.Controls.TextField",
"QtQuick.Controls.ToolSeparator", "QtQuick.Controls.ToolSeparator",
"QtQuick.Controls.Tumbler"] "QtQuick.Controls.Tumbler",
"QtQuick.Shapes.ConicalGradient",
"QtQuick.Shapes.LinearGradient",
"QtQuick.Shapes.RadialGradient",
"QtQuick.Shapes.ShapeGradient"]
allowedImports: ["QtQuick", allowedImports: ["QtQuick",
"QtQuick.Shapes", "QtQuick.Shapes",

View File

@@ -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"]
}
}

View File

@@ -33,11 +33,8 @@ import StudioTheme 1.0 as StudioTheme
Rectangle { Rectangle {
id: myRoot id: myRoot
color: baseColor
property bool isBaseState property bool isBaseState
property bool isCurrentState property bool isCurrentState
property color baseColor
property string delegateStateName property string delegateStateName
property string delegateStateImageSource property string delegateStateImageSource
property bool delegateHasWhenCondition property bool delegateHasWhenCondition
@@ -47,14 +44,14 @@ Rectangle {
property int bottomAreaHeight property int bottomAreaHeight
property int stateMargin property int stateMargin
property int previewMargin property int previewMargin
property int columnSpacing
readonly property bool isDefaultState: isDefault readonly property bool isDefaultState: isDefault
property int closeButtonMargin: 6 property int closeButtonMargin: 6
property int textFieldMargin: 4 property int textFieldMargin: 4
signal delegateInteraction property int scrollBarH: 0
property int listMargin: 0
function autoComplete(text, pos, explicitComplete, filter) { function autoComplete(text, pos, explicitComplete, filter) {
var stringList = statesEditorModel.autoComplete(text, pos, explicitComplete) var stringList = statesEditorModel.autoComplete(text, pos, explicitComplete)
@@ -65,14 +62,16 @@ Rectangle {
return statesEditorModel.hasAnnotation(internalNodeId) return statesEditorModel.hasAnnotation(internalNodeId)
} }
color: isCurrentState ? StudioTheme.Values.themeInteraction
: StudioTheme.Values.themeControlBackgroundInteraction
MouseArea { MouseArea {
id: mouseArea id: mouseArea
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
focus = true focus = true
root.currentStateInternalId = internalNodeId root.currentStateInternalId = internalNodeId
contextMenu.dismiss() // close potentially open context menu contextMenu.dismiss() // close potentially open context menu
myRoot.delegateInteraction()
} }
} }
@@ -89,7 +88,6 @@ Rectangle {
visible: !isBaseState && isCurrentState visible: !isBaseState && isCurrentState
onClicked: { onClicked: {
myRoot.delegateInteraction()
if (isDefaultState) if (isDefaultState)
statesEditorModel.resetDefaultState() statesEditorModel.resetDefaultState()
@@ -254,9 +252,8 @@ Rectangle {
Rectangle { // separator Rectangle { // separator
width: column.width width: column.width
height: myRoot.columnSpacing height: 2
color: StudioTheme.Values.themeStateSeparator color: StudioTheme.Values.themeStateSeparator
visible: expanded
} }
Rectangle { Rectangle {
@@ -264,7 +261,6 @@ Rectangle {
width: myRoot.width - 2 * myRoot.stateMargin width: myRoot.width - 2 * myRoot.stateMargin
height: myRoot.bottomAreaHeight height: myRoot.bottomAreaHeight
color: StudioTheme.Values.themeStateBackground color: StudioTheme.Values.themeStateBackground
visible: expanded
Image { Image {
anchors.fill: stateImageBackground anchors.fill: stateImageBackground

View File

@@ -26,6 +26,7 @@
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls 2.15 import QtQuick.Controls 2.15
import QtQuickDesignerTheme 1.0 import QtQuickDesignerTheme 1.0
import Qt.labs.qmlmodels 1.0
import HelperWidgets 2.0 import HelperWidgets 2.0
import StudioControls 1.0 as StudioControls import StudioControls 1.0 as StudioControls
import StudioTheme 1.0 as StudioTheme import StudioTheme 1.0 as StudioTheme
@@ -33,27 +34,24 @@ import StudioTheme 1.0 as StudioTheme
FocusScope { FocusScope {
id: root id: root
property int delegateTopAreaHeight: StudioTheme.Values.height + 8 readonly property int delegateTopAreaHeight: StudioTheme.Values.height + 8
property int delegateBottomAreaHeight: delegateHeight - 2 * delegateStateMargin - delegateTopAreaHeight - delegateColumnSpacing readonly property int delegateBottomAreaHeight: delegateHeight - 2 * delegateStateMargin - delegateTopAreaHeight - 2
property int delegateColumnSpacing: 2 readonly property int delegateStateMargin: 16
property int delegateStateMargin: 16 readonly property int delegatePreviewMargin: 10
property int delegatePreviewMargin: 10 readonly property int effectiveHeight: root.height < 130 ? 89 : Math.min(root.height, 287)
property int effectiveHeight: root.expanded ? Math.max(85, Math.min(287, root.height)) : 85 // height of the states area
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 createNewState
signal deleteState(int internalNodeId) signal deleteState(int internalNodeId)
signal duplicateCurrentState 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 { Connections {
target: statesEditorModel target: statesEditorModel
function onChangedToState(n) { root.currentStateInternalId = n } function onChangedToState(n) { root.currentStateInternalId = n }
@@ -65,92 +63,117 @@ FocusScope {
color: StudioTheme.Values.themePanelBackground 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 { AbstractButton {
id: addStateButton id: addStateButton
buttonIcon: root.expanded ? qsTr("Create New State") : StudioTheme.Constants.plus buttonIcon: StudioTheme.Constants.plus
iconFont: root.expanded ? StudioTheme.Constants.font : StudioTheme.Constants.iconFont iconFont: StudioTheme.Constants.iconFont
iconSize: root.expanded ? StudioTheme.Values.myFontSize : StudioTheme.Values.myIconFontSize iconSize: StudioTheme.Values.myIconFontSize
iconItalic: root.expanded
tooltip: qsTr("Add a new state.") tooltip: qsTr("Add a new state.")
visible: canAddNewStates visible: canAddNewStates
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: 8 anchors.rightMargin: 4
y: (Math.min(effectiveHeight, root.height) - height) / 2 anchors.bottom: parent.bottom
width: root.expanded ? 140 : 18 anchors.bottomMargin: statesListView.contentWidth - statesListView.contentX - root.delegateWidth / 2 > statesListView.width ? scrollBarH + 5 : -35
height: root.expanded ? 60 : 18 width: 35
height: 35
onClicked: { Behavior on anchors.bottomMargin {
contextMenu.dismiss() PropertyAnimation {
root.createNewState() duration: 700
easing.type: Easing.InOutBack
} }
} }
Rectangle { // separator lines between state items onClicked: root.createNewState()
color: StudioTheme.Values.themeStateSeparator
x: root.padding
y: root.padding
width: statesListView.width
height: root.delegateHeight
} }
ListView { ListView {
id: statesListView id: statesListView
boundsBehavior: Flickable.StopAtBounds
clip: true clip: true
anchors.fill: parent
x: root.padding anchors.topMargin: listMargin
y: root.padding anchors.leftMargin: listMargin
width: Math.min(root.delegateWidth * statesListView.count + root.innerSpacing * (statesListView.count - 1), anchors.rightMargin: listMargin
root.width - addStateButton.width - root.padding - 16) // 16 = 2 * 8 (addStateButton margin)
height: root.delegateHeight + StudioTheme.Values.scrollBarThickness
model: statesEditorModel model: statesEditorModel
orientation: ListView.Horizontal orientation: ListView.Horizontal
spacing: root.innerSpacing spacing: root.innerSpacing
delegate: StatesDelegate { property int prevCount: 0
id: statesDelegate onCountChanged: {
if (count > prevCount)
Qt.callLater(statesListView.positionViewAtEnd)
prevCount = count
}
delegate: DelegateChooser {
role: "type"
DelegateChoice {
roleValue: "state"
StatesDelegate {
width: root.delegateWidth width: root.delegateWidth
height: root.delegateHeight height: root.delegateHeight
anchors.verticalCenter: parent ? parent.verticalCenter : undefined
anchors.verticalCenterOffset: -.5 * (scrollBarH + listMargin)
isBaseState: 0 === internalNodeId isBaseState: 0 === internalNodeId
isCurrentState: root.currentStateInternalId === internalNodeId isCurrentState: root.currentStateInternalId === internalNodeId
baseColor: isCurrentState ? StudioTheme.Values.themeInteraction : background.color
delegateStateName: stateName delegateStateName: stateName
delegateStateImageSource: stateImageSource delegateStateImageSource: stateImageSource
delegateHasWhenCondition: hasWhenCondition delegateHasWhenCondition: hasWhenCondition
delegateWhenConditionString: whenConditionString delegateWhenConditionString: whenConditionString
onDelegateInteraction: contextMenu.dismiss()
columnSpacing: root.delegateColumnSpacing
topAreaHeight: root.delegateTopAreaHeight topAreaHeight: root.delegateTopAreaHeight
bottomAreaHeight: root.delegateBottomAreaHeight bottomAreaHeight: root.delegateBottomAreaHeight
stateMargin: root.delegateStateMargin stateMargin: root.delegateStateMargin
previewMargin: root.delegatePreviewMargin 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 {} ScrollBar.horizontal: HorizontalScrollBar {}

View File

@@ -28,6 +28,7 @@
#include "generatecmakelistsconstants.h" #include "generatecmakelistsconstants.h"
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <utils/detailswidget.h>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QPushButton> #include <QPushButton>
@@ -50,17 +51,14 @@ CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePa
m_model = new CMakeGeneratorDialogTreeModel(rootDir, files, this); m_model = new CMakeGeneratorDialogTreeModel(rootDir, files, this);
QVBoxLayout *layout = new QVBoxLayout(this); QVBoxLayout *dialogLayout = new QVBoxLayout(this);
setLayout(layout); dialogLayout->setSizeConstraint(QLayout::SetFixedSize);
setLayout(dialogLayout);
QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QWidget *advancedInnerWidget = new QWidget(this);
QVBoxLayout *advancedInnerLayout = new QVBoxLayout(advancedInnerWidget);
auto *okButton = buttons->button(QDialogButtonBox::Ok); advancedInnerWidget->setLayout(advancedInnerLayout);
okButton->setDefault(true); advancedInnerWidget->setMinimumHeight(640);
connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
connect(m_model, &CMakeGeneratorDialogTreeModel::checkedStateChanged, this, &CmakeGeneratorDialog::refreshNotificationText);
QTreeView *tree = new QTreeView(this); QTreeView *tree = new QTreeView(this);
tree->setModel(m_model); tree->setModel(m_model);
@@ -72,9 +70,31 @@ CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePa
refreshNotificationText(); refreshNotificationText();
layout->addWidget(tree, 2); advancedInnerLayout->addWidget(tree, 2);
layout->addWidget(m_notifications, 1); advancedInnerLayout->addWidget(m_notifications, 1);
layout->addWidget(buttons);
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() FilePaths CmakeGeneratorDialog::getFilePaths()

View File

@@ -34,6 +34,7 @@ ItemLibraryAssetsFilesModel::ItemLibraryAssetsFilesModel(QObject *parent)
// add roles // add roles
m_roleNames.insert(FileNameRole, "fileName"); m_roleNames.insert(FileNameRole, "fileName");
m_roleNames.insert(FilePathRole, "filePath"); m_roleNames.insert(FilePathRole, "filePath");
m_roleNames.insert(FileDirRole, "fileDir");
} }
QVariant ItemLibraryAssetsFilesModel::data(const QModelIndex &index, int role) const 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) if (role == FilePathRole)
return m_files[index.row()]; return m_files[index.row()];
if (role == FileDirRole)
return QVariant::fromValue(parent());
qWarning() << Q_FUNC_INFO << "Invalid role requested: " << QString::number(role); qWarning() << Q_FUNC_INFO << "Invalid role requested: " << QString::number(role);
return {}; return {};
} }

View File

@@ -44,7 +44,8 @@ public:
private: private:
enum Roles {FileNameRole = Qt::UserRole + 1, enum Roles {FileNameRole = Qt::UserRole + 1,
FilePathRole}; FilePathRole,
FileDirRole};
QStringList m_files; QStringList m_files;
QHash<int, QByteArray> m_roleNames; QHash<int, QByteArray> m_roleNames;

View File

@@ -42,6 +42,7 @@
#include <QMetaProperty> #include <QMetaProperty>
#include <QPainter> #include <QPainter>
#include <QRawFont> #include <QRawFont>
#include <QRegularExpression>
#include <QMessageBox> #include <QMessageBox>
#include <QCheckBox> #include <QCheckBox>
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
@@ -99,7 +100,7 @@ void ItemLibraryAssetsModel::toggleExpandAll(bool expand)
endResetModel(); endResetModel();
} }
void ItemLibraryAssetsModel::removeFile(const QString &filePath) void ItemLibraryAssetsModel::deleteFile(const QString &filePath)
{ {
bool askBeforeDelete = DesignerSettings::getValue( bool askBeforeDelete = DesignerSettings::getValue(
DesignerSettingsKey::ASK_BEFORE_DELETING_ASSET).toBool(); 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() const QStringList &ItemLibraryAssetsModel::supportedImageSuffixes()
{ {
static QStringList retList; static QStringList retList;
@@ -270,7 +317,7 @@ void ItemLibraryAssetsModel::setRootPath(const QString &path)
isEmpty &= parseDirRecursive(assetsDir, currDepth + 1); isEmpty &= parseDirRecursive(assetsDir, currDepth + 1);
} }
if (isEmpty) if (!m_searchText.isEmpty() && isEmpty)
currAssetsDir->setDirVisible(false); currAssetsDir->setDirVisible(false);
return isEmpty; return isEmpty;

View File

@@ -83,7 +83,10 @@ public:
Q_INVOKABLE void toggleExpandAll(bool expand); Q_INVOKABLE void toggleExpandAll(bool expand);
Q_INVOKABLE DirExpandState getAllExpandedState() const; 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: signals:
void isEmptyChanged(); void isEmptyChanged();

View File

@@ -53,7 +53,6 @@ StatesEditorModel::StatesEditorModel(StatesEditorView *view)
{ {
} }
int StatesEditorModel::count() const int StatesEditorModel::count() const
{ {
return rowCount(); return rowCount();
@@ -64,9 +63,8 @@ QModelIndex StatesEditorModel::index(int row, int column, const QModelIndex &par
if (m_statesEditorView.isNull()) if (m_statesEditorView.isNull())
return {}; return {};
int internalNodeId = 0; 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(); internalNodeId = m_statesEditorView->rootModelNode().nodeListProperty("states").at(row - 1).internalId();
return hasIndex(row, column, parent) ? createIndex(row, column, internalNodeId) : QModelIndex(); return hasIndex(row, column, parent) ? createIndex(row, column, internalNodeId) : QModelIndex();
@@ -78,9 +76,9 @@ int StatesEditorModel::rowCount(const QModelIndex &parent) const
return 0; return 0;
if (!m_statesEditorView->rootModelNode().hasNodeListProperty("states")) 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() void StatesEditorModel::reset()
@@ -109,8 +107,8 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const
else else
return QVariant(); return QVariant();
} }
} }
case StateImageSourceRole: { case StateImageSourceRole: {
static int randomNumber = 0; static int randomNumber = 0;
randomNumber++; randomNumber++;
@@ -119,9 +117,12 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const
else else
return QString("image://qmldesigner_stateseditor/%1-%2").arg(index.internalId()).arg(randomNumber); 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: { case WhenConditionString: {
if (stateNode.isValid() && stateNode.hasBindingProperty("when")) if (stateNode.isValid() && stateNode.hasBindingProperty("when"))
@@ -137,10 +138,11 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const
return false; return false;
} }
case ModelHasDefaultState: { case ModelHasDefaultState:
return hasDefaultState(); return hasDefaultState();
}
case StateType:
return index.row() == rowCount() - 1 ? "add" : "state";
} }
return QVariant(); return QVariant();
@@ -155,7 +157,8 @@ QHash<int, QByteArray> StatesEditorModel::roleNames() const
{HasWhenCondition, "hasWhenCondition"}, {HasWhenCondition, "hasWhenCondition"},
{WhenConditionString, "whenConditionString"}, {WhenConditionString, "whenConditionString"},
{IsDefault, "isDefault"}, {IsDefault, "isDefault"},
{ModelHasDefaultState, "modelHasDefaultState"} {ModelHasDefaultState, "modelHasDefaultState"},
{StateType, "type"}
}; };
return roleNames; return roleNames;
} }
@@ -163,10 +166,8 @@ QHash<int, QByteArray> StatesEditorModel::roleNames() const
void StatesEditorModel::insertState(int stateIndex) void StatesEditorModel::insertState(int stateIndex)
{ {
if (stateIndex >= 0) { if (stateIndex >= 0) {
const int updateIndex = stateIndex + 1; const int updateIndex = stateIndex + 1;
beginInsertRows(QModelIndex(), updateIndex, updateIndex); beginInsertRows(QModelIndex(), updateIndex, updateIndex);
endInsertRows(); endInsertRows();
emit dataChanged(index(updateIndex, 0), index(updateIndex, 0)); emit dataChanged(index(updateIndex, 0), index(updateIndex, 0));

View File

@@ -44,7 +44,8 @@ class StatesEditorModel : public QAbstractListModel
HasWhenCondition, HasWhenCondition,
WhenConditionString, WhenConditionString,
IsDefault, IsDefault,
ModelHasDefaultState ModelHasDefaultState,
StateType
}; };
public: public:

View File

@@ -85,12 +85,6 @@ void StatesEditorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorV
checkForStatesAvailability(); checkForStatesAvailability();
} }
void StatesEditorView::toggleStatesViewExpanded()
{
if (m_statesEditorWidget)
m_statesEditorWidget->toggleStatesViewExpanded();
}
void StatesEditorView::removeState(int nodeId) void StatesEditorView::removeState(int nodeId)
{ {
try { try {
@@ -102,6 +96,22 @@ void StatesEditorView::removeState(int nodeId)
if (modelState.isValid()) { if (modelState.isValid()) {
QStringList lockedTargets; QStringList lockedTargets;
const auto propertyChanges = modelState.propertyChanges(); 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) { for (const QmlPropertyChanges &change : propertyChanges) {
const ModelNode target = change.target(); const ModelNode target = change.target();
QTC_ASSERT(target.isValid(), continue); QTC_ASSERT(target.isValid(), continue);

View File

@@ -87,8 +87,6 @@ public:
void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override; void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override;
void toggleStatesViewExpanded();
public slots: public slots:
void synchonizeCurrentStateFromWidget(); void synchonizeCurrentStateFromWidget();
void createNewState(); void createNewState();

View File

@@ -133,13 +133,6 @@ QString StatesEditorWidget::qmlSourcesPath()
return Core::ICore::resourcePath("qmldesigner/statesEditorQmlSources").toString(); 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) void StatesEditorWidget::showEvent(QShowEvent *event)
{ {
QQuickWidget::showEvent(event); QQuickWidget::showEvent(event);
@@ -168,18 +161,6 @@ void StatesEditorWidget::reloadQmlSource()
connect(rootObject(), SIGNAL(createNewState()), m_statesEditorView.data(), SLOT(createNewState())); connect(rootObject(), SIGNAL(createNewState()), m_statesEditorView.data(), SLOT(createNewState()));
connect(rootObject(), SIGNAL(deleteState(int)), m_statesEditorView.data(), SLOT(removeState(int))); connect(rootObject(), SIGNAL(deleteState(int)), m_statesEditorView.data(), SLOT(removeState(int)));
m_statesEditorView.data()->synchonizeCurrentStateFromWidget(); m_statesEditorView.data()->synchonizeCurrentStateFromWidget();
if (!DesignerSettings::getValue(DesignerSettingsKey::STATESEDITOR_EXPANDED).toBool())
toggleStatesViewExpanded();
connect(rootObject(), SIGNAL(expandedChanged()), this, SLOT(handleExpandedChanged()));
} }
void StatesEditorWidget::handleExpandedChanged() } // QmlDesigner
{
QTC_ASSERT(rootObject(), return);
bool expanded = rootObject()->property("expanded").toBool();
DesignerSettings::setValue(DesignerSettingsKey::STATESEDITOR_EXPANDED, expanded);
}
}

View File

@@ -57,14 +57,11 @@ public:
static QString qmlSourcesPath(); static QString qmlSourcesPath();
void toggleStatesViewExpanded();
protected: protected:
void showEvent(QShowEvent *) override; void showEvent(QShowEvent *) override;
private: private:
void reloadQmlSource(); void reloadQmlSource();
Q_SLOT void handleExpandedChanged();
private: private:
QPointer<StatesEditorView> m_statesEditorView; QPointer<StatesEditorView> m_statesEditorView;

View File

@@ -100,8 +100,6 @@ public:
DesignerActionManager &designerActionManager(); DesignerActionManager &designerActionManager();
const DesignerActionManager &designerActionManager() const; const DesignerActionManager &designerActionManager() const;
void toggleStatesViewExpanded();
void qmlJSEditorContextHelp(const Core::IContext::HelpCallback &callback) const; void qmlJSEditorContextHelp(const Core::IContext::HelpCallback &callback) const;
DesignDocument *currentDesignDocument() const; DesignDocument *currentDesignDocument() const;

View File

@@ -394,11 +394,6 @@ const DesignerActionManager &ViewManager::designerActionManager() const
return d->designerActionManagerView.designerActionManager(); return d->designerActionManagerView.designerActionManager();
} }
void ViewManager::toggleStatesViewExpanded()
{
d->statesEditorView.toggleStatesViewExpanded();
}
void ViewManager::qmlJSEditorContextHelp(const Core::IContext::HelpCallback &callback) const void ViewManager::qmlJSEditorContextHelp(const Core::IContext::HelpCallback &callback) const
{ {
d->textEditorView.qmlJSEditorContextHelp(callback); d->textEditorView.qmlJSEditorContextHelp(callback);

View File

@@ -72,7 +72,6 @@ void DesignerSettings::fromSettings(QSettings *settings)
restoreValue(settings, DesignerSettingsKey::FORWARD_PUPPET_OUTPUT, QString()); restoreValue(settings, DesignerSettingsKey::FORWARD_PUPPET_OUTPUT, QString());
restoreValue(settings, DesignerSettingsKey::REFORMAT_UI_QML_FILES, true); restoreValue(settings, DesignerSettingsKey::REFORMAT_UI_QML_FILES, true);
restoreValue(settings, DesignerSettingsKey::IGNORE_DEVICE_PIXEL_RATIO, false); 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_SHOW_ONLY_VISIBLE_ITEMS, true);
restoreValue(settings, DesignerSettingsKey::NAVIGATOR_REVERSE_ITEM_ORDER, false); restoreValue(settings, DesignerSettingsKey::NAVIGATOR_REVERSE_ITEM_ORDER, false);
restoreValue(settings, DesignerSettingsKey::STANDALONE_MODE, false); restoreValue(settings, DesignerSettingsKey::STANDALONE_MODE, false);

View File

@@ -60,7 +60,6 @@ const char ENABLE_MODEL_EXCEPTION_OUTPUT[] = "WarnException";
const char PUPPET_KILL_TIMEOUT[] = "PuppetKillTimeout"; const char PUPPET_KILL_TIMEOUT[] = "PuppetKillTimeout";
const char DEBUG_PUPPET[] = "DebugPuppet"; const char DEBUG_PUPPET[] = "DebugPuppet";
const char FORWARD_PUPPET_OUTPUT[] = "ForwardPuppetOutput"; const char FORWARD_PUPPET_OUTPUT[] = "ForwardPuppetOutput";
const char STATESEDITOR_EXPANDED[] = "StatesEditorExpanded";
const char NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS[] = "NavigatorShowOnlyVisibleItems"; const char NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS[] = "NavigatorShowOnlyVisibleItems";
const char NAVIGATOR_REVERSE_ITEM_ORDER[] = "NavigatorReverseItemOrder"; const char NAVIGATOR_REVERSE_ITEM_ORDER[] = "NavigatorReverseItemOrder";
const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* These settings are not exposed in ui. */ const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* These settings are not exposed in ui. */

View File

@@ -511,8 +511,14 @@ bool DocumentManager::belongsToQmakeProject()
Utils::FilePath DocumentManager::currentResourcePath() Utils::FilePath DocumentManager::currentResourcePath()
{ {
Utils::FilePath resourcePath = currentProjectDirPath(); Utils::FilePath resourcePath = currentProjectDirPath();
if (resourcePath.isEmpty()) if (resourcePath.isEmpty())
return currentFilePath().absolutePath(); return currentFilePath().absolutePath();
FilePath contentFilePath = resourcePath.pathAppended("content");
if (contentFilePath.exists())
return contentFilePath;
return resourcePath; return resourcePath;
} }

View File

@@ -205,8 +205,6 @@ bool showConfirmationDialog(const Utils::FilePath &rootDir)
files.append(file.filePath); files.append(file.filePath);
CmakeGeneratorDialog dialog(rootDir, files); CmakeGeneratorDialog dialog(rootDir, files);
dialog.setMinimumWidth(600);
dialog.setMinimumHeight(640);
if (dialog.exec()) { if (dialog.exec()) {
Utils::FilePaths confirmedFiles = dialog.getFilePaths(); Utils::FilePaths confirmedFiles = dialog.getFilePaths();
removeUnconfirmedQueuedFiles(confirmedFiles); removeUnconfirmedQueuedFiles(confirmedFiles);

View File

@@ -69,7 +69,6 @@ ShortCutManager::ShortCutManager()
m_copyAction(tr("&Copy")), m_copyAction(tr("&Copy")),
m_pasteAction(tr("&Paste")), m_pasteAction(tr("&Paste")),
m_selectAllAction(tr("Select &All")), m_selectAllAction(tr("Select &All")),
m_collapseExpandStatesAction(tr("Toggle States")),
m_escapeAction(this) m_escapeAction(this)
{ {
@@ -97,10 +96,6 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
connect(&m_selectAllAction,&QAction::triggered, this, &ShortCutManager::selectAll); connect(&m_selectAllAction,&QAction::triggered, this, &ShortCutManager::selectAll);
connect(&m_collapseExpandStatesAction, &QAction::triggered, [] {
QmlDesignerPlugin::instance()->viewManager().toggleStatesViewExpanded();
});
// Revert to saved // Revert to saved
Core::EditorManager *em = Core::EditorManager::instance(); Core::EditorManager *em = Core::EditorManager::instance();
Core::ActionManager::registerAction(&m_revertToSavedAction,Core::Constants::REVERTTOSAVED, qmlDesignerMainContext); Core::ActionManager::registerAction(&m_revertToSavedAction,Core::Constants::REVERTTOSAVED, qmlDesignerMainContext);
@@ -188,13 +183,6 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
command->setDefaultKeySequence(QKeySequence::SelectAll); command->setDefaultKeySequence(QKeySequence::SelectAll);
editMenu->addAction(command, Core::Constants::G_EDIT_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. */ /* 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 = Core::ActionManager::registerAction(&m_escapeAction, Core::Constants::S_RETURNTOEDITOR, qmlDesignerMainContext);
command->setDefaultKeySequence(QKeySequence(Qt::Key_Escape)); command->setDefaultKeySequence(QKeySequence(Qt::Key_Escape));

View File

@@ -83,7 +83,6 @@ private:
QAction m_copyAction; QAction m_copyAction;
QAction m_pasteAction; QAction m_pasteAction;
QAction m_selectAllAction; QAction m_selectAllAction;
QAction m_collapseExpandStatesAction;
QAction m_escapeAction; QAction m_escapeAction;
}; };

View File

@@ -581,6 +581,7 @@ void StudioWelcomePlugin::extensionsInitialized()
Core::ModeManager::activateMode(m_welcomeMode->id()); Core::ModeManager::activateMode(m_welcomeMode->id());
// Enable QDS new project dialog // Enable QDS new project dialog
if (Core::ICore::settings()->value("QML/Designer/StandAloneMode", false).toBool())
Core::ICore::setNewDialogFactory([](QWidget *parent) { return new QdsNewDialog(parent); }); Core::ICore::setNewDialogFactory([](QWidget *parent) { return new QdsNewDialog(parent); });
if (showSplashScreen()) { if (showSplashScreen()) {

View File

@@ -2984,7 +2984,7 @@ bool TextEditorWidget::event(QEvent *e)
&& (ke->key() < Qt::Key_Escape)); && (ke->key() < Qt::Key_Escape));
d->m_maybeFakeTooltipEvent = false; d->m_maybeFakeTooltipEvent = false;
} }
break; return true;
} }
case QEvent::ApplicationPaletteChange: { case QEvent::ApplicationPaletteChange: {
// slight hack: ignore palette changes // slight hack: ignore palette changes

View File

@@ -37,7 +37,7 @@ def placeCursorToLine(editor, line, isRegex=False):
return waitForObject(editor) return waitForObject(editor)
isDarwin = platform.system() == 'Darwin' isDarwin = platform.system() == 'Darwin'
if not isinstance(editor, (str, unicode)): if not isString(editor):
editor = objectMap.realName(editor) editor = objectMap.realName(editor)
oldPosition = 0 oldPosition = 0
jumpToFirstLine(getEditor()) jumpToFirstLine(getEditor())
@@ -120,7 +120,7 @@ def replaceEditorContent(editor, newcontent):
type(editor, newcontent) type(editor, newcontent)
def typeLines(editor, lines): def typeLines(editor, lines):
if isinstance(lines, (str, unicode)): if isString(lines):
lines = [lines] lines = [lines]
if isinstance(lines, (list, tuple)): if isinstance(lines, (list, tuple)):
for line in lines: for line in lines:

View File

@@ -35,10 +35,10 @@ def changeFilePermissions(dirPath, readPerm, writePerm, excludeFileNames=None):
permission |= stat.S_IWRITE permission |= stat.S_IWRITE
if excludeFileNames == None: if excludeFileNames == None:
excludeFileNames = [] excludeFileNames = []
elif isinstance(excludeFileNames, (str, unicode)): elif isString(excludeFileNames):
excludeFileNames = [excludeFileNames] excludeFileNames = [excludeFileNames]
if not isinstance(excludeFileNames, (tuple, list)): 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.") "ignoring parameter this time.")
excludeFileNames = [] excludeFileNames = []
if not os.path.isdir(dirPath): if not os.path.isdir(dirPath):

View File

@@ -95,8 +95,8 @@ def setRunInTerminal(wantedKit, runInTerminal=True):
switchViewTo(ViewConstants.EDIT) switchViewTo(ViewConstants.EDIT)
def __getTargetFromToolTip__(toolTip): def __getTargetFromToolTip__(toolTip):
if toolTip == None or not isinstance(toolTip, (str, unicode)): if toolTip == None or not isString(toolTip):
test.warning("Parameter toolTip must be of type str or unicode and can't be None!") test.warning("Parameter toolTip must be of type str and can't be None!")
return None return None
pattern = re.compile(".*<b>Kit:</b>(.*)<b>Deploy.*") pattern = re.compile(".*<b>Kit:</b>(.*)<b>Deploy.*")
target = pattern.match(toolTip) target = pattern.match(toolTip)
@@ -108,7 +108,7 @@ def __getTargetFromToolTip__(toolTip):
def getExecutableAndTargetFromToolTip(toolTip): def getExecutableAndTargetFromToolTip(toolTip):
target = __getTargetFromToolTip__(toolTip) target = __getTargetFromToolTip__(toolTip)
if toolTip == None or not isinstance(toolTip, (str, unicode)): if toolTip == None or not isString(toolTip):
return None, target return None, target
pattern = re.compile('.*<b>Run:</b>(.*)</.*') pattern = re.compile('.*<b>Run:</b>(.*)</.*')
exe = pattern.match(toolTip) exe = pattern.match(toolTip)

View File

@@ -76,7 +76,7 @@ def ensureChecked(objectName, shouldBeChecked = True, timeout=20000):
# or the object itself. If it is an object, it must exist already. # or the object itself. If it is an object, it must exist already.
# param expectedState is the expected enable state of the object # param expectedState is the expected enable state of the object
def verifyEnabled(objectSpec, expectedState = True): def verifyEnabled(objectSpec, expectedState = True):
if isinstance(objectSpec, (str, unicode)): if isString(objectSpec):
waitFor("object.exists('" + str(objectSpec).replace("'", "\\'") + "')", 20000) waitFor("object.exists('" + str(objectSpec).replace("'", "\\'") + "')", 20000)
foundObject = findObject(objectSpec) foundObject = findObject(objectSpec)
else: else:
@@ -154,7 +154,7 @@ def which(program):
def cleanUpUserFiles(pathsToProFiles=None): def cleanUpUserFiles(pathsToProFiles=None):
if pathsToProFiles==None: if pathsToProFiles==None:
return False return False
if isinstance(pathsToProFiles, (str, unicode)): if isString(pathsToProFiles):
filelist = glob.glob(pathsToProFiles+".user*") filelist = glob.glob(pathsToProFiles+".user*")
elif isinstance(pathsToProFiles, (list, tuple)): elif isinstance(pathsToProFiles, (list, tuple)):
filelist = [] filelist = []
@@ -398,10 +398,10 @@ def enabledCheckBoxExists(text):
# this function verifies if the text matches the given # this function verifies if the text matches the given
# regex inside expectedTexts # regex inside expectedTexts
# param text must be a single str/unicode # param text must be a single str
# param expectedTexts can be str/unicode/list/tuple # param expectedTexts can be str/list/tuple
def regexVerify(text, expectedTexts): def regexVerify(text, expectedTexts):
if isinstance(expectedTexts, (str,unicode)): if isString(expectedTexts):
expectedTexts = [expectedTexts] expectedTexts = [expectedTexts]
for curr in expectedTexts: for curr in expectedTexts:
pattern = re.compile(curr) pattern = re.compile(curr)
@@ -453,7 +453,7 @@ def iterateQtVersions(keepOptionsOpen=False, alreadyOnOptionsDialog=False,
result.append({target:version}) result.append({target:version})
if additionalFunction: if additionalFunction:
try: try:
if isinstance(additionalFunction, (str, unicode)): if isString(additionalFunction):
currResult = globals()[additionalFunction](target, version, *argsForAdditionalFunc) currResult = globals()[additionalFunction](target, version, *argsForAdditionalFunc)
else: else:
currResult = additionalFunction(target, version, *argsForAdditionalFunc) currResult = additionalFunction(target, version, *argsForAdditionalFunc)
@@ -514,7 +514,7 @@ def iterateKits(keepOptionsOpen=False, alreadyOnOptionsDialog=False,
currentItem.replace(".", "\\.")]) currentItem.replace(".", "\\.")])
if additionalFunction: if additionalFunction:
try: try:
if isinstance(additionalFunction, (str, unicode)): if isString(additionalFunction):
currResult = globals()[additionalFunction](item, kitName, *argsForAdditionalFunc) currResult = globals()[additionalFunction](item, kitName, *argsForAdditionalFunc)
else: else:
currResult = additionalFunction(item, kitName, *argsForAdditionalFunc) currResult = additionalFunction(item, kitName, *argsForAdditionalFunc)
@@ -674,3 +674,10 @@ def getHelpViewer():
def getHelpTitle(): def getHelpTitle():
return str(getHelpViewer().title()) return str(getHelpViewer().title())
def isString(sth):
if sys.version_info.major > 2:
return isinstance(sth, str)
else:
return isinstance(sth, (str, unicode))

View File

@@ -87,7 +87,6 @@ def testRenameId():
formerTxt = editor.plainText formerTxt = editor.plainText
originalText = originalTexts.get(file).replace("mainView", "renamedView") originalText = originalTexts.get(file).replace("mainView", "renamedView")
test.compare(originalText,formerTxt, "Comparing %s" % file.replace("Core.","").replace("\\","")) test.compare(originalText,formerTxt, "Comparing %s" % file.replace("Core.","").replace("\\",""))
invokeMenuItem("File","Save All")
def __invokeFindUsage__(filename, line, additionalKeyPresses, expectedCount): def __invokeFindUsage__(filename, line, additionalKeyPresses, expectedCount):
openDocument(focusDocumentPath % filename) openDocument(focusDocumentPath % filename)

View File

@@ -46,6 +46,8 @@ def main():
expectedHeaderName=headerName) expectedHeaderName=headerName)
if not testRenameMacroAfterSourceMoving(): if not testRenameMacroAfterSourceMoving():
return return
# save and exit
invokeMenuItem("File", "Save All")
invokeMenuItem("File", "Exit") invokeMenuItem("File", "Exit")
def testRenameMacroAfterSourceModification(): def testRenameMacroAfterSourceModification():
@@ -156,8 +158,7 @@ def revertChanges(files):
simpleName = simpleFileName(f) simpleName = simpleFileName(f)
if openDocument(f): if openDocument(f):
try: try:
invokeMenuItem('File', 'Revert "%s" to Saved' % simpleName) invokeMenuItem('Edit', 'Undo')
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
test.log("Reverted changes inside %s" % simpleName) test.log("Reverted changes inside %s" % simpleName)
except: except:
test.warning("File '%s' cannot be reverted." % simpleName, test.warning("File '%s' cannot be reverted." % simpleName,

View File

@@ -306,7 +306,7 @@ def __compareCompilers__(foundCompilers, expectedCompilers):
if isinstance(currentFound, dict): if isinstance(currentFound, dict):
foundExp = False foundExp = False
for currentExp in expectedCompilers: for currentExp in expectedCompilers:
if isinstance(currentExp, (str, unicode)): if isString(currentExp):
continue continue
key = currentExp.keys()[0] key = currentExp.keys()[0]
# special case for (fuzzy) regex comparison on Windows (internal LLVM) # special case for (fuzzy) regex comparison on Windows (internal LLVM)
@@ -353,7 +353,7 @@ def __compareDebuggers__(foundDebuggers, expectedDebuggers):
def __lowerStrs__(iterable): def __lowerStrs__(iterable):
for it in iterable: for it in iterable:
if isinstance(it, (str, unicode)): if isString(it):
yield it.lower() yield it.lower()
else: else:
yield it yield it