Merge remote-tracking branch 'origin/6.0' into 7.0
Change-Id: Ie2b23daa457c2aed635a784963bc1e95740bd076
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 4.0 KiB |
@@ -41,6 +41,9 @@
|
||||
project and a button UI control, and how to modify the files generated by
|
||||
the wizard templates to wireframe the UI.
|
||||
|
||||
You can donwnload the completed project from
|
||||
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui1}{here}.
|
||||
|
||||
The \e {Learn More} sections provide additional information about the
|
||||
tasks performed by the wizards and about other basic tasks and concepts.
|
||||
|
||||
@@ -54,24 +57,19 @@
|
||||
To create a project:
|
||||
|
||||
\list 1
|
||||
\li Select \uicontrol File > \uicontrol {New Project} >
|
||||
\uicontrol General > \uicontrol {Qt Quick Application - Empty} >
|
||||
\uicontrol Choose.
|
||||
\li In the \uicontrol Name field, enter the project name: \e {loginui1}.
|
||||
When naming your own projects, keep in mind that they cannot be
|
||||
easily renamed later.
|
||||
\li In the \uicontrol {Create in} field, enter the path to the folder
|
||||
where you want to store the project files. You can move project
|
||||
folders later without problems.
|
||||
\li Select \uicontrol Next (or \uicontrol Continue on \macos) to
|
||||
continue to the \uicontrol {Define Project Details} page.
|
||||
\li In the \uicontrol {Screen resolution} field, select the initial
|
||||
size of the UI. In this tutorial, we use the predefined size
|
||||
\e {720 x 1280 (HD)} (portrait) instead of the default size
|
||||
(landscape). You can easily change the screen size later in
|
||||
\l Properties.
|
||||
\li Select \uicontrol Finish (or \uicontrol Done on \macos) to create
|
||||
the project.
|
||||
\li Select \uicontrol File > \uicontrol {New Project}.
|
||||
\li In the \uicontrol Presets tab, select \uicontrol General >
|
||||
\uicontrol {Empty}.
|
||||
\li In the \uicontrol Details tab:
|
||||
\list
|
||||
\li Enter \e Loginui1 as the name for the project. Keep in mind
|
||||
that projects cannot be easily renamed later.
|
||||
\li Select the path for the project files. You can move project
|
||||
folders later.
|
||||
\li Set \uicontrol Width to 720 and \uicontrol Height to 1280.
|
||||
You can change the screen size later in \l Properties.
|
||||
\endlist
|
||||
\li Select \uicontrol Create to create the project.
|
||||
\endlist
|
||||
|
||||
Your project should now look something like this in the \uicontrol Design
|
||||
@@ -92,7 +90,7 @@
|
||||
\section2 Learn More - Projects and Files
|
||||
|
||||
\QDS creates a set of boilerplate files and folders that you need to create
|
||||
a UI. The files are listed in the \l Projects view.
|
||||
a UI. The files are listed in the \l{File System} view.
|
||||
|
||||
\image loginui1-project-files.png
|
||||
|
||||
@@ -112,6 +110,9 @@
|
||||
Specifically, if you export and import designs using \QB, your main
|
||||
file is most likely called something else. For more information,
|
||||
see \l {Exporting from Design Tools}.
|
||||
\li The \e CMakeLists.txt project configuration file allowing you to
|
||||
share your project as a fully working C++ application with
|
||||
developers.
|
||||
\li The \e {qtquickcontrols2.conf} file specifies the selected
|
||||
\l {Styling Qt Quick Controls}{UI style} and some style-specific
|
||||
arguments.
|
||||
@@ -230,7 +231,7 @@
|
||||
adds the following \e import statements to the UI files (.ui.qml) that it
|
||||
creates:
|
||||
|
||||
\quotefromfile loginui1/Screen01.ui.qml
|
||||
\quotefromfile Loginui1/Content/Screen01.ui.qml
|
||||
\skipto import
|
||||
\printuntil Controls
|
||||
|
||||
@@ -333,7 +334,7 @@
|
||||
To be able to use the functionality of the Button control, the wizard template
|
||||
adds the following \e import statements to the \e EntryField.ui.qml file:
|
||||
|
||||
\quotefromfile loginui1/EntryField.ui.qml
|
||||
\quotefromfile Loginui1/Content/EntryField.ui.qml
|
||||
\skipto import
|
||||
\printuntil Controls
|
||||
|
||||
@@ -364,7 +365,7 @@
|
||||
to \e 100, to match the width of the tag line.
|
||||
\li In the \uicontrol Control section, deselect the \uicontrol Hover
|
||||
check box because we don't want the hover effect for the button.
|
||||
\li Select the button background in \uicontrol Navigator to display its
|
||||
\li Select \e buttonBackground in \uicontrol Navigator to display its
|
||||
properties in \uicontrol Properties.
|
||||
\li In \uicontrol Rectangle > \uicontrol {Fill color}, set the color to
|
||||
transparent light gray (\e #28e7e7e7) in \uicontrol Hex. You can
|
||||
@@ -372,7 +373,7 @@
|
||||
\li In \uicontrol {Border Color}, select white (\e #ffffff).
|
||||
\li In \uicontrol Radius, enter \e 50 to give the button
|
||||
rounded corners.
|
||||
\li Select the text component in \uicontrol Navigator to display its
|
||||
\li Select \e textItem in \uicontrol Navigator to display its
|
||||
properties in \uicontrol Properties.
|
||||
\li In \uicontrol Character > \uicontrol Font, select
|
||||
\e {Titillium Web ExtraLight}.
|
||||
@@ -382,7 +383,7 @@
|
||||
(\e #ffffff).
|
||||
\li In \uicontrol {Alignment H}, select the \uicontrol Left button to
|
||||
align the text horizontally to the left.
|
||||
\li In the \uicontrol Padding section > \uicontrol Horizontal >
|
||||
\li In \uicontrol Padding > \uicontrol Horizontal >
|
||||
\uicontrol Left, set the padding in the field between background
|
||||
border and text to \e 50.
|
||||
\image loginui1-text-properties-button.png "Text properties"
|
||||
@@ -450,13 +451,13 @@
|
||||
to \e 100.
|
||||
\li In the \uicontrol Control section, deselect the \uicontrol Hover
|
||||
check box because we don't want the hover effect for the button.
|
||||
\li Select the button background in \uicontrol Navigator to display its
|
||||
\li Select \e buttonBackground in \uicontrol Navigator to display its
|
||||
properties in \uicontrol Properties.
|
||||
\li In \uicontrol Rectangle > \uicontrol {Border color}, select the
|
||||
green used in the logo (\e #41cd52).
|
||||
\li In \uicontrol Radius, enter \e 50 to give the button rounded
|
||||
corners.
|
||||
\li Select the the text component in \uicontrol Navigator to display
|
||||
\li Select \e textItem in \uicontrol Navigator to display
|
||||
its properties in \uicontrol Properties.
|
||||
\li In \uicontrol Character > \uicontrol Font, select
|
||||
\e {Titillium Web ExtraLight}.
|
||||
|
@@ -24,7 +24,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
/*!
|
||||
\example loginui2
|
||||
\example Loginui2
|
||||
\ingroup gstutorials
|
||||
\previouspage {Log In UI - Components}
|
||||
\nextpage {Log In UI - States}
|
||||
@@ -45,7 +45,12 @@
|
||||
their proper places when you resize the UI on the desktop or on devices
|
||||
with different screen sizes, you will use anchors and positioners.
|
||||
|
||||
These instructions build on \l {Log In UI - Components}.
|
||||
The starting point for this tutorial is the completed
|
||||
\l{Log In UI - Components} project. You can download the project from
|
||||
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui1}{here}.
|
||||
|
||||
Additionally, you can download the completed project of this tutorial from
|
||||
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui2}{here}.
|
||||
|
||||
The \e {Learn More} sections provide additional information about the
|
||||
task at hand.
|
||||
@@ -79,6 +84,9 @@
|
||||
anchor button to anchor \e adventurePage to its
|
||||
parent in the \uicontrol Target field. This attaches the background
|
||||
image to the rectangle on all sides.
|
||||
Note: Selecting the anchor button should automatically select the
|
||||
four buttons on the left side of it. If it doesn't, refresh
|
||||
\uicontrol{Form Editor}.
|
||||
\image loginui2-layout.png "Layout properties"
|
||||
\li Select \e qt_logo_green_128x128px in \l Navigator.
|
||||
\li In \uicontrol Properties > \uicontrol Layout, select the
|
||||
|
@@ -46,12 +46,12 @@
|
||||
login page, you will use \e states to show and hide UI components as necessary
|
||||
when a user selects the \e {Create Account} button.
|
||||
|
||||
These instructions build on:
|
||||
The starting point for this tutorial is the completed
|
||||
\l{Log In UI - Positioning} project. You can download the project from
|
||||
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui2}{here}.
|
||||
|
||||
\list
|
||||
\li \l {Log In UI - Components}
|
||||
\li \l {Log In UI - Positioning}
|
||||
\endlist
|
||||
Additionally, you can download the completed project of this tutorial from
|
||||
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui3}{here}.
|
||||
|
||||
The \e {Learn More} sections provide additional information relevant to the
|
||||
task at hand.
|
||||
|
@@ -46,13 +46,13 @@
|
||||
\l{Creating Timeline Animations}{timeline animations} that you bind
|
||||
to states.
|
||||
|
||||
These instructions build on:
|
||||
The starting point for this tutorial is the completed
|
||||
\l{Log In UI - States} project. You can download the project from
|
||||
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui3}{here}.
|
||||
|
||||
Additionally, you can download the completed project of this tutorial from
|
||||
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/Loginui4}{here}.
|
||||
|
||||
\list
|
||||
\li \l {Log In UI - Components}
|
||||
\li \l {Log In UI - Positioning}
|
||||
\li \l {Log In UI - States}
|
||||
\endlist
|
||||
|
||||
The \e {Learn More} sections provide additional information relevant to the
|
||||
task at hand.
|
||||
@@ -94,7 +94,7 @@
|
||||
\li Select \inlineimage icons/navigator-arrowup.png
|
||||
to move \e username below \e tagLine in \uicontrol Navigator
|
||||
to preserve the \l{Arranging Components}{component hierarchy}.
|
||||
\li Repeat for \e password and \e repeatPassword.
|
||||
\li Repeat step 3 and 4 for \e password and \e repeatPassword.
|
||||
\li Select \e fields in \uicontrol Navigator and press \key Delete to
|
||||
delete it.
|
||||
\li Select \e username in \uicontrol Navigator to display its properties
|
||||
@@ -196,8 +196,8 @@
|
||||
to save your changes.
|
||||
\endlist
|
||||
|
||||
When you move the playhead along the timeline, you can see how the login
|
||||
button fades out while the repeat password field fades in.
|
||||
When you move the playhead along the timeline, you can see how the create
|
||||
account button fades out while the repeat password field fades in.
|
||||
|
||||
You will now animate the top anchor margin of the repeat password field
|
||||
to make it appear to slide down from the password field.
|
||||
@@ -219,7 +219,7 @@
|
||||
frame 0, and select the record button for the \e anchors.topMargin
|
||||
property of \e repeatPassword.
|
||||
\li In the field next to the property, set a negative value for the
|
||||
top anchor margin, -40, to place \e repeatPassword on top of
|
||||
top anchor margin, -100, to place \e repeatPassword on top of
|
||||
\e password.
|
||||
\li Move the playhead to frame 1000 and change the top anchor margin
|
||||
to 20, so that, combined with the change in the \uicontrol Opacity
|
||||
@@ -312,7 +312,7 @@
|
||||
the following \e import statement to the UI files where it uses the
|
||||
components:
|
||||
|
||||
\quotefromfile loginui4/Screen01.ui.qml
|
||||
\quotefromfile Loginui4/Content/Screen01.ui.qml
|
||||
\skipto QtQuick.Timeline
|
||||
\printuntil 1.0
|
||||
|
||||
|
@@ -39,8 +39,8 @@
|
||||
translations from a JSON file.
|
||||
|
||||
You need to download the starting project for this tutorial from
|
||||
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/examples/
|
||||
loginui2}{here} before you start.
|
||||
\l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/multi-language%20tutorial/Loginui2}{here}
|
||||
before you start.
|
||||
|
||||
Download the project and open the \e loginui2.qmlproject file in \QDS
|
||||
to get started.
|
||||
@@ -48,8 +48,7 @@
|
||||
This project consists of a login page with a couple of text elements.
|
||||
|
||||
Additionally, you will use a JSON translation file in this tutorial.
|
||||
Download it from \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/
|
||||
master/tutorial%20projects/multi-language}{here}.
|
||||
Download it from \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/multi-language}{here}.
|
||||
|
||||
\section1 JSON Translation File
|
||||
|
||||
@@ -133,10 +132,11 @@
|
||||
First, you need to prepare your project for translation:
|
||||
|
||||
\list 1
|
||||
\li In \uicontrol{Projects}, double-click \e{Screen01.ui.qml} to open it.
|
||||
\li All text strings that you want to translate need to be of \c
|
||||
qsTrId type. In this project the text strings are of \c qsTr type so you
|
||||
need to change them. Open \uicontrol{Text Editor}, find all five
|
||||
occurrences of \c QsTr and replace them with \c{QsTrId}. For example,
|
||||
occurrences of \c qsTr and replace them with \c{qsTrId}. For example,
|
||||
replace:
|
||||
\code
|
||||
text: qsTr("Qt Account")
|
||||
@@ -165,21 +165,14 @@
|
||||
\li Go to \uicontrol View > \uicontrol Views and select \uicontrol
|
||||
Translations to open the \uicontrol Translations view. You can
|
||||
drag it to a workspace to dock it.
|
||||
|
||||
When you open the \uicontrol Translations view for the first time, \QDS
|
||||
prompts you to enable the multi-language database, select
|
||||
\uicontrol{Yes}.
|
||||
\image enable-multilanguage.png
|
||||
\li In \uicontrol Translations, select
|
||||
\inlineimage icons/select-languages.png
|
||||
.
|
||||
|
||||
When you enable the multi-language database, an SQLite database named
|
||||
\e translations.db is created in the project folder root.
|
||||
\li Select the languages that you want to support in your project,
|
||||
in this case \uicontrol{English - American English} and
|
||||
\uicontrol{Swedish}.
|
||||
\li Set \uicontrol English as primary language and select \uicontrol{OK}.
|
||||
\uicontrol{Swedish - Svenska}.
|
||||
\li Set \uicontrol{English - American English} as primary language and
|
||||
select \uicontrol{Ok}.
|
||||
\li Select \inlineimage icons/import-json-translations.png
|
||||
and open the \e ml_translations.json file. Now you can see all your
|
||||
imported translations in the \uicontrol Translations view.
|
||||
|
@@ -1,8 +1,6 @@
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Copyright (C) 2022 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Design Studio.
|
||||
@@ -49,6 +47,7 @@
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.12
|
||||
|
||||
@@ -100,13 +99,16 @@ Button {
|
||||
when: !control.down
|
||||
|
||||
PropertyChanges {
|
||||
target: textItem
|
||||
font.family: "Titillium Web ExtraLight"
|
||||
target: buttonBackground
|
||||
color: "#00000000"
|
||||
border.color: "#ffffff"
|
||||
}
|
||||
|
||||
PropertyChanges {
|
||||
target: buttonBackground
|
||||
color: "#28e7e7e7"
|
||||
target: textItem
|
||||
color: "#ffffff"
|
||||
font.pixelSize: 34
|
||||
font.family: "Titillium Web ExtraLight"
|
||||
}
|
||||
},
|
||||
State {
|
||||
@@ -115,12 +117,14 @@ Button {
|
||||
PropertyChanges {
|
||||
target: textItem
|
||||
color: "#ffffff"
|
||||
border.color: "#ffffff"
|
||||
font.family: "Titillium Web ExtraLight"
|
||||
}
|
||||
|
||||
PropertyChanges {
|
||||
target: buttonBackground
|
||||
color: "#e7e7e7"
|
||||
border.color: "#ffffff"
|
||||
color: "#28e7e7e7"
|
||||
border.color: "#00000000"
|
||||
}
|
||||
}
|
||||
]
|
@@ -1,8 +1,6 @@
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Copyright (C) 2022 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Design Studio.
|
||||
@@ -49,6 +47,7 @@
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.12
|
||||
|
||||
@@ -68,6 +67,7 @@ Button {
|
||||
|
||||
text: "My Button"
|
||||
hoverEnabled: false
|
||||
enabled: true
|
||||
|
||||
background: buttonBackground
|
||||
Rectangle {
|
||||
@@ -83,6 +83,8 @@ Button {
|
||||
contentItem: textItem
|
||||
Text {
|
||||
id: textItem
|
||||
width: 500
|
||||
height: 100
|
||||
text: control.text
|
||||
font.pixelSize: 34
|
||||
|
||||
@@ -101,6 +103,14 @@ Button {
|
||||
PropertyChanges {
|
||||
target: buttonBackground
|
||||
color: "#00000000"
|
||||
border.color: "#41cd52"
|
||||
}
|
||||
|
||||
PropertyChanges {
|
||||
target: textItem
|
||||
color: "#41cd52"
|
||||
font.pixelSize: 34
|
||||
font.family: "Titillium Web ExtraLight"
|
||||
}
|
||||
},
|
||||
State {
|
||||
@@ -108,20 +118,17 @@ Button {
|
||||
when: control.down
|
||||
PropertyChanges {
|
||||
target: textItem
|
||||
color: "#ffffff"
|
||||
color: "#41cd52"
|
||||
border.color: "#41cd52"
|
||||
font.pixelSize: 34
|
||||
font.family: "Titillium Web ExtraLight"
|
||||
}
|
||||
|
||||
PropertyChanges {
|
||||
target: buttonBackground
|
||||
color: "#41cd52"
|
||||
border.color: "#00000000"
|
||||
border.color: "#41cd52"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;height:100;width:500}
|
||||
}
|
||||
##^##*/
|
@@ -1,8 +1,6 @@
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Copyright (C) 2022 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Design Studio.
|
||||
@@ -49,9 +47,10 @@
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import loginui1 1.0
|
||||
import Loginui1
|
||||
|
||||
Rectangle {
|
||||
width: Constants.width
|
||||
@@ -70,47 +69,44 @@ Rectangle {
|
||||
Image {
|
||||
id: qt_logo_green_128x128px
|
||||
x: 296
|
||||
y: 40
|
||||
y: 0
|
||||
source: "images/qt_logo_green_128x128px.png"
|
||||
fillMode: Image.PreserveAspectFit
|
||||
}
|
||||
Text {
|
||||
id: tagLine
|
||||
width: 541
|
||||
height: 78
|
||||
color: "#ffffff"
|
||||
text: qsTr("Are you ready to explore?")
|
||||
font.pixelSize: 50
|
||||
font.family: "Titillium Web ExtraLight"
|
||||
anchors.verticalCenterOffset: -391
|
||||
anchors.horizontalCenterOffset: 18
|
||||
anchors.verticalCenterOffset: -430
|
||||
anchors.horizontalCenterOffset: 0
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
|
||||
EntryField {
|
||||
id: username
|
||||
x: 128
|
||||
x: 110
|
||||
y: 470
|
||||
text: "Username or Email"
|
||||
text: qsTr("Username or Email")
|
||||
}
|
||||
|
||||
EntryField {
|
||||
id: password
|
||||
x: 128
|
||||
x: 110
|
||||
y: 590
|
||||
text: qsTr("Password")
|
||||
}
|
||||
|
||||
PushButton {
|
||||
id: login
|
||||
x: 102
|
||||
y: 966
|
||||
x: 101
|
||||
y: 944
|
||||
text: qsTr("Continue")
|
||||
}
|
||||
|
||||
PushButton {
|
||||
id: createAccount
|
||||
x: 102
|
||||
id: creteAccount
|
||||
x: 101
|
||||
y: 1088
|
||||
text: qsTr("Create Account")
|
||||
}
|
||||
@@ -118,7 +114,7 @@ Rectangle {
|
||||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;formeditorZoom:0.33}
|
||||
D{i:0;formeditorZoom:0.5}D{i:1}D{i:2}D{i:3}D{i:4}D{i:5}D{i:6}D{i:7}
|
||||
}
|
||||
##^##*/
|
||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 3.4 KiB |
@@ -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"
|
||||
}
|
||||
}
|
@@ -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()
|
||||
}
|
||||
}
|
@@ -1,2 +1,6 @@
|
||||
Module Loginui1
|
||||
singleton Constants 1.0 Constants.qml
|
||||
EventListSimulator 1.0 EventListSimulator.qml
|
||||
EventListModel 1.0 EventListModel.qml
|
||||
DirectoryFontLoader 1.0 DirectoryFontLoader.qml
|
||||
|
||||
|
@@ -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 {
|
||||
}
|
||||
|
||||
}
|
@@ -1,21 +1,69 @@
|
||||
/* File generated by Qt Creator */
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Design Studio.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** BSD License Usage
|
||||
** Alternatively, you may use this file under the terms of the BSD license
|
||||
** as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QmlProject 1.1
|
||||
import QmlProject
|
||||
|
||||
Project {
|
||||
mainFile: "loginui1.qml"
|
||||
mainFile: "content/App.qml"
|
||||
|
||||
/* Include .qml, .js, and image files from current directory and subdirectories */
|
||||
QmlFiles {
|
||||
directory: "."
|
||||
directory: "content"
|
||||
}
|
||||
|
||||
JavaScriptFiles {
|
||||
directory: "."
|
||||
directory: "content"
|
||||
}
|
||||
|
||||
ImageFiles {
|
||||
directory: "."
|
||||
directory: "content"
|
||||
}
|
||||
|
||||
Files {
|
||||
@@ -32,9 +80,34 @@ Project {
|
||||
filter: "*.ttf;*.otf"
|
||||
}
|
||||
|
||||
Files {
|
||||
filter: "*.wav;*.mp3"
|
||||
}
|
||||
|
||||
Files {
|
||||
filter: "*.mp4"
|
||||
}
|
||||
|
||||
Files {
|
||||
filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag"
|
||||
}
|
||||
|
||||
Files {
|
||||
filter: "*.mesh"
|
||||
directory: "asset_imports"
|
||||
}
|
||||
|
||||
Environment {
|
||||
QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf"
|
||||
QT_AUTO_SCREEN_SCALE_FACTOR: "1"
|
||||
QT_LOGGING_RULES: "qt.qml.connections=false"
|
||||
QT_ENABLE_HIGHDPI_SCALING: "0"
|
||||
/* Useful for debugging
|
||||
QSG_VISUALIZE=batches
|
||||
QSG_VISUALIZE=clip
|
||||
QSG_VISUALIZE=changes
|
||||
QSG_VISUALIZE=overdraw
|
||||
*/
|
||||
}
|
||||
|
||||
qt6Project: true
|
||||
@@ -43,5 +116,10 @@ Project {
|
||||
importPaths: [ "imports", "asset_imports" ]
|
||||
|
||||
/* Required for deployment */
|
||||
targetDirectory: "/opt/loginui1"
|
||||
targetDirectory: "/opt/Loginui1"
|
||||
|
||||
qdsVersion: "3.0"
|
||||
|
||||
/* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */
|
||||
widgetApp: true
|
||||
}
|
||||
|
@@ -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
|
@@ -1,6 +1,11 @@
|
||||
/*
|
||||
* This file is automatically generated by Qt Design Studio.
|
||||
* Do not change.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Copyright (C) 2022 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Design Studio.
|
||||
@@ -48,14 +53,12 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick
|
||||
import loginui4 1.0
|
||||
|
||||
Item {
|
||||
width: Constants.width
|
||||
height: Constants.height
|
||||
|
||||
Screen01 {
|
||||
}
|
||||
#include <QGuiApplication>
|
||||
|
||||
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");
|
||||
}
|
@@ -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)
|
62
doc/qtdesignstudio/examples/loginui1/src/main.cpp
Normal 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();
|
||||
}
|
75
doc/qtdesignstudio/examples/loginui2/Loginui2.qmlproject
Normal 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
|
||||
}
|
@@ -1,8 +1,6 @@
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Copyright (C) 2022 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Design Studio.
|
||||
@@ -49,9 +47,10 @@
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import loginui2 1.0
|
||||
import Loginui1
|
||||
|
||||
Rectangle {
|
||||
id: rectangle
|
||||
@@ -69,7 +68,6 @@ Rectangle {
|
||||
|
||||
Image {
|
||||
id: qt_logo_green_128x128px
|
||||
x: 296
|
||||
anchors.top: parent.top
|
||||
source: "images/qt_logo_green_128x128px.png"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
@@ -78,8 +76,6 @@ Rectangle {
|
||||
}
|
||||
Text {
|
||||
id: tagLine
|
||||
width: 541
|
||||
height: 78
|
||||
color: "#ffffff"
|
||||
text: qsTr("Are you ready to explore?")
|
||||
anchors.top: qt_logo_green_128x128px.bottom
|
||||
@@ -87,11 +83,11 @@ Rectangle {
|
||||
anchors.topMargin: 40
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
font.family: "Titillium Web ExtraLight"
|
||||
anchors.horizontalCenterOffset: 0
|
||||
}
|
||||
|
||||
Column {
|
||||
id: fields
|
||||
x: 128
|
||||
anchors.top: tagLine.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.topMargin: 170
|
||||
@@ -99,7 +95,7 @@ Rectangle {
|
||||
|
||||
EntryField {
|
||||
id: username
|
||||
text: "Username or Email"
|
||||
text: qsTr("Username or Email")
|
||||
}
|
||||
|
||||
EntryField {
|
||||
@@ -110,11 +106,10 @@ Rectangle {
|
||||
|
||||
Column {
|
||||
id: buttons
|
||||
x: 102
|
||||
y: 966
|
||||
y: 944
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.bottomMargin: 100
|
||||
anchors.bottomMargin: 50
|
||||
spacing: 20
|
||||
|
||||
PushButton {
|
||||
@@ -123,7 +118,7 @@ Rectangle {
|
||||
}
|
||||
|
||||
PushButton {
|
||||
id: createAccount
|
||||
id: creteAccount
|
||||
text: qsTr("Create Account")
|
||||
}
|
||||
}
|
||||
@@ -131,7 +126,7 @@ Rectangle {
|
||||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;formeditorZoom:0.5}D{i:1}D{i:2}D{i:4}
|
||||
D{i:0;formeditorZoom:0.66}D{i:1}D{i:2}D{i:3}D{i:5}D{i:6}D{i:4}D{i:8}D{i:9}D{i:7}
|
||||
}
|
||||
##^##*/
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
@@ -1,2 +0,0 @@
|
||||
singleton Constants 1.0 Constants.qml
|
||||
EventListSimulator 1.0 EventListSimulator.qml
|
@@ -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 {
|
||||
}
|
||||
|
||||
}
|
@@ -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"
|
||||
}
|
@@ -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
|
75
doc/qtdesignstudio/examples/loginui3/Loginui3.qmlproject
Normal 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
|
||||
}
|
@@ -1,8 +1,6 @@
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Copyright (C) 2022 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Design Studio.
|
||||
@@ -49,9 +47,10 @@
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import loginui3 1.0
|
||||
import Loginui1
|
||||
|
||||
Rectangle {
|
||||
id: rectangle
|
||||
@@ -70,7 +69,6 @@ Rectangle {
|
||||
|
||||
Image {
|
||||
id: qt_logo_green_128x128px
|
||||
x: 296
|
||||
anchors.top: parent.top
|
||||
source: "images/qt_logo_green_128x128px.png"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
@@ -79,8 +77,6 @@ Rectangle {
|
||||
}
|
||||
Text {
|
||||
id: tagLine
|
||||
width: 541
|
||||
height: 78
|
||||
color: "#ffffff"
|
||||
text: qsTr("Are you ready to explore?")
|
||||
anchors.top: qt_logo_green_128x128px.bottom
|
||||
@@ -88,11 +84,11 @@ Rectangle {
|
||||
anchors.topMargin: 40
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
font.family: "Titillium Web ExtraLight"
|
||||
anchors.horizontalCenterOffset: 0
|
||||
}
|
||||
|
||||
Column {
|
||||
id: fields
|
||||
x: 128
|
||||
anchors.top: tagLine.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.topMargin: 170
|
||||
@@ -100,7 +96,7 @@ Rectangle {
|
||||
|
||||
EntryField {
|
||||
id: username
|
||||
text: "Username or Email"
|
||||
text: qsTr("Username or Email")
|
||||
}
|
||||
|
||||
EntryField {
|
||||
@@ -110,17 +106,16 @@ Rectangle {
|
||||
|
||||
EntryField {
|
||||
id: repeatPassword
|
||||
text: "Repeat Password"
|
||||
text: qsTr("Repeat Password")
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
id: buttons
|
||||
x: 102
|
||||
y: 966
|
||||
y: 944
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.bottomMargin: 100
|
||||
anchors.bottomMargin: 50
|
||||
spacing: 20
|
||||
|
||||
PushButton {
|
||||
@@ -160,7 +155,8 @@ Rectangle {
|
||||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;formeditorZoom:0.5}
|
||||
D{i:0;formeditorZoom:0.5}D{i:1}D{i:2}D{i:3}D{i:5}D{i:6}D{i:7}D{i:4}D{i:9}D{i:11}D{i:10}
|
||||
D{i:8}
|
||||
}
|
||||
##^##*/
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
@@ -1,2 +0,0 @@
|
||||
singleton Constants 1.0 Constants.qml
|
||||
EventListSimulator 1.0 EventListSimulator.qml
|
@@ -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 {
|
||||
}
|
||||
|
||||
}
|
@@ -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"
|
||||
}
|
@@ -1,2 +0,0 @@
|
||||
[Controls]
|
||||
Style=Default
|
75
doc/qtdesignstudio/examples/loginui4/Loginui4.qmlproject
Normal 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
|
||||
}
|
@@ -1,57 +1,6 @@
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2021 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the examples of the Qt Design Studio.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** BSD License Usage
|
||||
** Alternatively, you may use this file under the terms of the BSD license
|
||||
** as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||
** contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import loginui4 1.0
|
||||
import Loginui1
|
||||
import QtQuick.Timeline 1.0
|
||||
|
||||
Rectangle {
|
||||
@@ -71,7 +20,6 @@ Rectangle {
|
||||
|
||||
Image {
|
||||
id: qt_logo_green_128x128px
|
||||
x: 296
|
||||
anchors.top: parent.top
|
||||
source: "images/qt_logo_green_128x128px.png"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
@@ -80,8 +28,6 @@ Rectangle {
|
||||
}
|
||||
Text {
|
||||
id: tagLine
|
||||
width: 541
|
||||
height: 78
|
||||
color: "#ffffff"
|
||||
text: qsTr("Are you ready to explore?")
|
||||
anchors.top: qt_logo_green_128x128px.bottom
|
||||
@@ -89,30 +35,29 @@ Rectangle {
|
||||
anchors.topMargin: 40
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
font.family: "Titillium Web ExtraLight"
|
||||
anchors.horizontalCenterOffset: 0
|
||||
}
|
||||
|
||||
EntryField {
|
||||
id: username
|
||||
x: 110
|
||||
text: "Username or Email"
|
||||
text: qsTr("Username or Email")
|
||||
anchors.top: tagLine.bottom
|
||||
anchors.topMargin: 170
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.topMargin: 170
|
||||
}
|
||||
|
||||
EntryField {
|
||||
id: password
|
||||
x: 110
|
||||
text: qsTr("Password")
|
||||
anchors.top: username.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.topMargin: 20
|
||||
anchors.topMargin: 21
|
||||
}
|
||||
|
||||
EntryField {
|
||||
id: repeatPassword
|
||||
x: 110
|
||||
text: "Repeat Password"
|
||||
opacity: 0
|
||||
text: qsTr("Repeat Password")
|
||||
anchors.top: password.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.topMargin: 20
|
||||
@@ -120,11 +65,10 @@ Rectangle {
|
||||
|
||||
Column {
|
||||
id: buttons
|
||||
x: 102
|
||||
y: 966
|
||||
y: 944
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.bottomMargin: 100
|
||||
anchors.bottomMargin: 50
|
||||
spacing: 20
|
||||
|
||||
PushButton {
|
||||
@@ -148,70 +92,68 @@ Rectangle {
|
||||
animations: [
|
||||
TimelineAnimation {
|
||||
id: toCreateAccountState
|
||||
duration: 1000
|
||||
running: false
|
||||
loops: 1
|
||||
duration: 1000
|
||||
to: 1000
|
||||
from: 0
|
||||
}
|
||||
]
|
||||
endFrame: 1000
|
||||
startFrame: 0
|
||||
enabled: true
|
||||
startFrame: 0
|
||||
|
||||
KeyframeGroup {
|
||||
target: repeatPassword
|
||||
property: "opacity"
|
||||
|
||||
Keyframe {
|
||||
frame: 0
|
||||
value: 0
|
||||
frame: 0
|
||||
}
|
||||
|
||||
Keyframe {
|
||||
frame: 999
|
||||
value: 1
|
||||
frame: 1000
|
||||
}
|
||||
}
|
||||
|
||||
KeyframeGroup {
|
||||
target: createAccount
|
||||
property: "opacity"
|
||||
Keyframe {
|
||||
value: 1
|
||||
frame: 0
|
||||
}
|
||||
|
||||
Keyframe {
|
||||
frame: 1000
|
||||
value: 0
|
||||
frame: 1000
|
||||
}
|
||||
}
|
||||
|
||||
KeyframeGroup {
|
||||
target: repeatPassword
|
||||
property: "anchors.topMargin"
|
||||
Keyframe {
|
||||
value: -100
|
||||
frame: 0
|
||||
}
|
||||
|
||||
Keyframe {
|
||||
frame: 0
|
||||
value: -40
|
||||
value: -100
|
||||
frame: 4
|
||||
}
|
||||
|
||||
Keyframe {
|
||||
easing.bezierCurve: [0.39, 0.575, 0.565, 1, 1, 1]
|
||||
frame: 999
|
||||
value: 20
|
||||
frame: 999
|
||||
}
|
||||
}
|
||||
}
|
||||
states: [
|
||||
State {
|
||||
name: "login"
|
||||
|
||||
PropertyChanges {
|
||||
target: timeline
|
||||
enabled: true
|
||||
}
|
||||
|
||||
PropertyChanges {
|
||||
target: toCreateAccountState
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "createAccount"
|
||||
@@ -231,6 +173,8 @@ Rectangle {
|
||||
|
||||
/*##^##
|
||||
Designer {
|
||||
D{i:0;formeditorZoom:0.5}D{i:6}D{i:9}D{i:11}
|
||||
D{i:0;formeditorZoom:0.5}D{i:1}D{i:2}D{i:3}D{i:4}D{i:5}D{i:6}D{i:8}D{i:10}D{i:9}D{i:7}
|
||||
D{i:11}
|
||||
}
|
||||
##^##*/
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
@@ -1,2 +0,0 @@
|
||||
singleton Constants 1.0 Constants.qml
|
||||
EventListSimulator 1.0 EventListSimulator.qml
|
@@ -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"
|
||||
}
|
@@ -1,2 +0,0 @@
|
||||
[Controls]
|
||||
Style=Default
|
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 3.8 KiB |
@@ -63,12 +63,14 @@
|
||||
\li \l{Generating Qt Translation Source Files}
|
||||
\row
|
||||
\li \inlineimage icons/project-translation-test.png
|
||||
\li Run project translation test.
|
||||
\li \l{Running the Project Translation Test}
|
||||
\li Run translation test for several documents and create a test report.
|
||||
\li \l{Running Translation Test for Several Documents}
|
||||
\row
|
||||
\li \inlineimage icons/qml-translation-test.png
|
||||
\li Run QML translation test to find missing and elided translations.
|
||||
\li \l{Running the QML Translation Test}
|
||||
\li Run translation test for the currently open document. This test
|
||||
shows translation warnings in \uicontrol{From Editor} and creates a
|
||||
test report.
|
||||
\li \l{Running Translation Test for a Single Document}
|
||||
\row
|
||||
\li \inlineimage icons/export-translations.png
|
||||
\li Export all translations used in your project or all translations
|
||||
@@ -93,8 +95,8 @@
|
||||
"translation": "Password"
|
||||
},
|
||||
{
|
||||
"language": "sv",
|
||||
"translation": "Lösenord"
|
||||
"language": "fi",
|
||||
"translation": "Salasana"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -120,8 +122,8 @@
|
||||
"translation": "Password"
|
||||
},
|
||||
{
|
||||
"language": "sv",
|
||||
"translation": "Lösenord"
|
||||
"language": "fi",
|
||||
"translation": "Salasana"
|
||||
}
|
||||
]
|
||||
\endcode
|
||||
@@ -139,14 +141,14 @@
|
||||
in the \uicontrol Translations view. The files are generated
|
||||
in \e{<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
|
||||
and elided translations. Running the QML language test
|
||||
is a quick way to check the translations in the application you have open in
|
||||
\uicontrol{Form Editor} as it highlights errors in the UI.
|
||||
You can run the translation test to find missing translations
|
||||
and translations where the text exceeds the text element boundaries. Running
|
||||
the test is a quick way to check the translations in the document you have
|
||||
open in \uicontrol{Form Editor} as it highlights errors in the UI.
|
||||
|
||||
To run the QML translation test:
|
||||
To run the test for the currently open document:
|
||||
|
||||
\list 1
|
||||
\li In the \uicontrol Translations view, select
|
||||
@@ -155,12 +157,11 @@
|
||||
\li Select the tests to run and the highlight color
|
||||
for each test:
|
||||
\list
|
||||
\li \uicontrol{Show Translation Warnings} highlights missing
|
||||
translations.
|
||||
\li \uicontrol{Show Found Translations} highlights all translations
|
||||
that are correct.
|
||||
\li \uicontrol{Show Elide Warnings} highlights all translations where
|
||||
the text is too long to fit in the text object and therefore is elided.
|
||||
\li \uicontrol{Success} highlights translations without any warnings.
|
||||
\li \uicontrol{Missing translation} highlights translations that are
|
||||
missing for one or more languages.
|
||||
\li \uicontrol{Exceeds boundaries} highlights translations where
|
||||
the text is too long to fit in the text object.
|
||||
\endlist
|
||||
\image translation-tester.png
|
||||
\li Select \uicontrol{Run Tests}.
|
||||
@@ -205,16 +206,21 @@
|
||||
The report shows the type of error as well as line and column of the
|
||||
affected text element in the \e{ui.qml} file.
|
||||
|
||||
\section1 Running the Project Translation Test
|
||||
\section1 Running Translation Test for Several Documents
|
||||
|
||||
You can run the project translation test on several \e{.ui.qml} files
|
||||
at the same time. \QDS runs the same tests as during the
|
||||
\l{Running the QML Translation Test}{QML Translation Test} and generates the
|
||||
same test reports but does not highlight errors in the UI.
|
||||
\l{Running Translation Test for a Single Document}{Translation Test} and
|
||||
generates the same test reports but does not highlight errors in the UI.
|
||||
|
||||
To run the project translation test, select
|
||||
To run the translation test for several documents:
|
||||
\list 1
|
||||
\li Select
|
||||
\inlineimage icons/project-translation-test.png
|
||||
in the \uicontrol Translations view.
|
||||
\li Select the files that you want to include in the test.
|
||||
\li Select \uicontrol{Run Tests}.
|
||||
\endlist
|
||||
|
||||
\section1 Exporting Translations in Other Ways
|
||||
|
||||
|
@@ -872,6 +872,13 @@ Item {
|
||||
camera: viewRoot.usePerspective ? overlayPerspectiveCamera : overlayOrthoCamera
|
||||
importScene: overlayScene
|
||||
z: 2
|
||||
|
||||
environment: sceneEnv
|
||||
SceneEnvironment {
|
||||
id: sceneEnv
|
||||
antialiasingMode: SceneEnvironment.MSAA
|
||||
antialiasingQuality: SceneEnvironment.High
|
||||
}
|
||||
}
|
||||
|
||||
Overlay2D {
|
||||
|
@@ -50,6 +50,13 @@ View3D {
|
||||
thresPerc = (grid_thresholds[thresIdx] - cameraZoomFactor) / (grid_thresholds[thresIdx] - grid_thresholds[thresIdx - 1]);
|
||||
}
|
||||
|
||||
environment: sceneEnv
|
||||
SceneEnvironment {
|
||||
id: sceneEnv
|
||||
antialiasingMode: SceneEnvironment.MSAA
|
||||
antialiasingQuality: SceneEnvironment.High
|
||||
}
|
||||
|
||||
Node {
|
||||
id: sceneHelpers
|
||||
|
||||
|
@@ -142,6 +142,16 @@ void CameraGeometry::doUpdateGeometry()
|
||||
if (!QQuick3DObjectPrivate::get(m_camera)->spatialNode) {
|
||||
// Doing explicit viewport mapping forces cameraNode creation
|
||||
m_camera->mapToViewport({}, m_viewPortRect.width(), m_viewPortRect.height());
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||
if (!m_nodeCreationUpdateDone) {
|
||||
// Post-node creation update is done only once to avoid infinite loop in case the node
|
||||
// creation fails.
|
||||
m_nodeCreationUpdateDone = true;
|
||||
m_cameraUpdatePending = true;
|
||||
update();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
GeometryBase::doUpdateGeometry();
|
||||
|
@@ -67,6 +67,9 @@ private:
|
||||
QQuick3DCamera *m_camera = nullptr;
|
||||
QRectF m_viewPortRect;
|
||||
bool m_cameraUpdatePending = false;
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||
bool m_nodeCreationUpdateDone = false;
|
||||
#endif
|
||||
};
|
||||
|
||||
}
|
||||
|
@@ -729,7 +729,8 @@ void MouseArea3D::applyFreeRotation(QQuick3DNode *node, const QVector3D &startRo
|
||||
if (dragVector.length() < 0.001f)
|
||||
return;
|
||||
|
||||
const float *dataPtr(sceneTransform().data());
|
||||
const auto &transform = sceneTransform();
|
||||
const float *dataPtr(transform.data());
|
||||
QVector3D xAxis = QVector3D(dataPtr[0], dataPtr[1], dataPtr[2]).normalized();
|
||||
QVector3D yAxis = QVector3D(dataPtr[4], dataPtr[5], dataPtr[6]).normalized();
|
||||
QVector3D finalAxis = (dragVector.x() * yAxis + dragVector.y() * xAxis);
|
||||
@@ -1029,7 +1030,8 @@ void MouseArea3D::setHovering(bool enable)
|
||||
|
||||
QVector3D MouseArea3D::getNormal() const
|
||||
{
|
||||
const float *dataPtr(sceneTransform().data());
|
||||
const auto &transform = sceneTransform();
|
||||
const float *dataPtr(transform.data());
|
||||
return QVector3D(dataPtr[8], dataPtr[9], dataPtr[10]).normalized();
|
||||
}
|
||||
|
||||
|
@@ -241,7 +241,7 @@ int internalMain(QGuiApplication *application)
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_CRASHPAD) && defined(Q_OS_WIN)
|
||||
startCrashpad();
|
||||
/* startCrashpad(); */
|
||||
#endif
|
||||
|
||||
new QmlDesigner::Qt5NodeInstanceClientProxy(application);
|
||||
|
@@ -36,7 +36,9 @@ Item {
|
||||
|
||||
property var selectedAssets: ({})
|
||||
property int allExpandedState: 0
|
||||
property string delFilePath: ""
|
||||
property string contextFilePath: ""
|
||||
property var contextDir: undefined
|
||||
property bool isDirContextMenu: false
|
||||
|
||||
DropArea {
|
||||
id: dropArea
|
||||
@@ -67,6 +69,19 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea { // right clicking the empty area of the view
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.RightButton
|
||||
onClicked: {
|
||||
if (!assetsModel.isEmpty) {
|
||||
contextFilePath = ""
|
||||
contextDir = assetsModel.rootDir()
|
||||
isDirContextMenu = false
|
||||
contextMenu.popup()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// called from C++ to close context menu on focus out
|
||||
function handleViewFocusOut()
|
||||
{
|
||||
@@ -75,9 +90,139 @@ Item {
|
||||
selectedAssetsChanged()
|
||||
}
|
||||
|
||||
Dialog {
|
||||
id: newFolderDialog
|
||||
|
||||
title: qsTr("Create new folder")
|
||||
anchors.centerIn: parent
|
||||
closePolicy: Popup.CloseOnEscape
|
||||
modal: true
|
||||
|
||||
contentItem: Column {
|
||||
spacing: 2
|
||||
|
||||
Row {
|
||||
Text {
|
||||
text: qsTr("Folder Name: ")
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: StudioTheme.Values.themeTextColor
|
||||
}
|
||||
|
||||
StudioControls.TextField {
|
||||
id: folderName
|
||||
|
||||
actionIndicator.visible: false
|
||||
translationIndicator.visible: false
|
||||
|
||||
Keys.onEnterPressed: btnCreate.onClicked()
|
||||
Keys.onReturnPressed: btnCreate.onClicked()
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
text: qsTr("Folder Name cannot be empty.")
|
||||
color: "#ff0000"
|
||||
anchors.right: parent.right
|
||||
visible: folderName.text === ""
|
||||
}
|
||||
|
||||
Item { // spacer
|
||||
width: 1
|
||||
height: 20
|
||||
}
|
||||
|
||||
Row {
|
||||
anchors.right: parent.right
|
||||
|
||||
Button {
|
||||
id: btnCreate
|
||||
|
||||
text: qsTr("Create")
|
||||
enabled: folderName.text !== ""
|
||||
onClicked: {
|
||||
assetsModel.addNewFolder(contextDir.dirPath + '/' + folderName.text)
|
||||
newFolderDialog.accept()
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
text: qsTr("Cancel")
|
||||
onClicked: newFolderDialog.reject()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onOpened: {
|
||||
folderName.text = "New folder"
|
||||
folderName.selectAll()
|
||||
folderName.forceActiveFocus()
|
||||
}
|
||||
}
|
||||
|
||||
Dialog {
|
||||
id: confirmDeleteFolderDialog
|
||||
|
||||
title: qsTr("Folder not empty")
|
||||
anchors.centerIn: parent
|
||||
closePolicy: Popup.CloseOnEscape
|
||||
implicitWidth: 300
|
||||
modal: true
|
||||
|
||||
contentItem: Column {
|
||||
spacing: 20
|
||||
width: parent.width
|
||||
|
||||
Text {
|
||||
id: folderNotEmpty
|
||||
|
||||
text: qsTr("Folder '%1' is not empty. Are you sure you want to delete it?")
|
||||
.arg(contextDir ? contextDir.dirName : "")
|
||||
color: StudioTheme.Values.themeTextColor
|
||||
wrapMode: Text.WordWrap
|
||||
width: confirmDeleteFolderDialog.width
|
||||
leftPadding: 10
|
||||
rightPadding: 10
|
||||
|
||||
Keys.onEnterPressed: btnDelete.onClicked()
|
||||
Keys.onReturnPressed: btnDelete.onClicked()
|
||||
}
|
||||
|
||||
Text {
|
||||
text: qsTr("If the folder has assets in use, deleting it might cause the project to not work correctly.")
|
||||
color: StudioTheme.Values.themeTextColor
|
||||
wrapMode: Text.WordWrap
|
||||
width: confirmDeleteFolderDialog.width
|
||||
leftPadding: 10
|
||||
rightPadding: 10
|
||||
}
|
||||
|
||||
Row {
|
||||
anchors.right: parent.right
|
||||
Button {
|
||||
id: btnDelete
|
||||
|
||||
text: qsTr("Delete")
|
||||
|
||||
onClicked: {
|
||||
assetsModel.deleteFolder(contextDir.dirPath)
|
||||
confirmDeleteFolderDialog.accept()
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
text: qsTr("Cancel")
|
||||
onClicked: confirmDeleteFolderDialog.reject()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onOpened: folderNotEmpty.forceActiveFocus()
|
||||
}
|
||||
|
||||
ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
|
||||
id: assetsView
|
||||
anchors.fill: parent
|
||||
interactive: assetsView.verticalScrollBarVisible
|
||||
|
||||
Item {
|
||||
StudioControls.Menu {
|
||||
@@ -86,7 +231,7 @@ Item {
|
||||
StudioControls.MenuItem {
|
||||
text: qsTr("Expand All")
|
||||
enabled: allExpandedState !== 1
|
||||
visible: !delFilePath
|
||||
visible: isDirContextMenu
|
||||
height: visible ? implicitHeight : 0
|
||||
onTriggered: assetsModel.toggleExpandAll(true)
|
||||
}
|
||||
@@ -94,22 +239,51 @@ Item {
|
||||
StudioControls.MenuItem {
|
||||
text: qsTr("Collapse All")
|
||||
enabled: allExpandedState !== 2
|
||||
visible: !delFilePath
|
||||
visible: isDirContextMenu
|
||||
height: visible ? implicitHeight : 0
|
||||
onTriggered: assetsModel.toggleExpandAll(false)
|
||||
}
|
||||
|
||||
StudioControls.MenuSeparator {
|
||||
visible: isDirContextMenu
|
||||
height: visible ? StudioTheme.Values.border : 0
|
||||
}
|
||||
|
||||
StudioControls.MenuItem {
|
||||
text: qsTr("Delete File")
|
||||
visible: delFilePath
|
||||
visible: contextFilePath
|
||||
height: visible ? implicitHeight : 0
|
||||
onTriggered: assetsModel.removeFile(delFilePath)
|
||||
onTriggered: assetsModel.deleteFile(contextFilePath)
|
||||
}
|
||||
|
||||
StudioControls.MenuSeparator {
|
||||
visible: contextFilePath
|
||||
height: visible ? StudioTheme.Values.border : 0
|
||||
}
|
||||
|
||||
StudioControls.MenuItem {
|
||||
text: qsTr("New Folder")
|
||||
onTriggered: newFolderDialog.open()
|
||||
}
|
||||
|
||||
StudioControls.MenuItem {
|
||||
text: qsTr("Delete Folder")
|
||||
visible: isDirContextMenu
|
||||
height: visible ? implicitHeight : 0
|
||||
onTriggered: {
|
||||
var dirEmpty = !(contextDir.dirsModel && contextDir.dirsModel.rowCount() > 0)
|
||||
&& !(contextDir.filesModel && contextDir.filesModel.rowCount() > 0);
|
||||
|
||||
if (dirEmpty)
|
||||
assetsModel.deleteFolder(contextDir.dirPath)
|
||||
else
|
||||
confirmDeleteFolderDialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
spacing: 2
|
||||
Repeater {
|
||||
model: assetsModel // context property
|
||||
delegate: dirSection
|
||||
@@ -120,31 +294,35 @@ Item {
|
||||
|
||||
Section {
|
||||
width: assetsView.width -
|
||||
(assetsView.verticalScrollBarVisible ? assetsView.verticalThickness : 0)
|
||||
(assetsView.verticalScrollBarVisible ? assetsView.verticalThickness : 0) - 5
|
||||
caption: dirName
|
||||
sectionHeight: 30
|
||||
sectionFontSize: 15
|
||||
levelShift: 20
|
||||
leftPadding: 0
|
||||
topPadding: dirDepth > 0 ? 5 : 0
|
||||
bottomPadding: 0
|
||||
hideHeader: dirDepth === 0
|
||||
showLeftBorder: true
|
||||
showLeftBorder: dirDepth > 0
|
||||
expanded: dirExpanded
|
||||
visible: dirVisible
|
||||
visible: !assetsModel.isEmpty && dirVisible
|
||||
expandOnClick: false
|
||||
useDefaulContextMenu: false
|
||||
|
||||
onToggleExpand: {
|
||||
dirExpanded = !dirExpanded
|
||||
}
|
||||
|
||||
onShowContextMenu: {
|
||||
delFilePath = ""
|
||||
contextFilePath = ""
|
||||
contextDir = model
|
||||
isDirContextMenu = true
|
||||
allExpandedState = assetsModel.getAllExpandedState()
|
||||
contextMenu.popup()
|
||||
}
|
||||
|
||||
Column {
|
||||
spacing: 5
|
||||
leftPadding: 15
|
||||
leftPadding: 5
|
||||
|
||||
Repeater {
|
||||
model: dirsModel
|
||||
@@ -155,6 +333,25 @@ Item {
|
||||
model: filesModel
|
||||
delegate: fileSection
|
||||
}
|
||||
|
||||
Text {
|
||||
text: qsTr("Empty folder")
|
||||
color: StudioTheme.Values.themeTextColorDisabled
|
||||
font.pixelSize: 12
|
||||
visible: !(dirsModel && dirsModel.rowCount() > 0)
|
||||
&& !(filesModel && filesModel.rowCount() > 0)
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.RightButton
|
||||
onClicked: {
|
||||
contextFilePath = ""
|
||||
contextDir = model
|
||||
isDirContextMenu = true
|
||||
contextMenu.popup()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -222,8 +419,11 @@ Item {
|
||||
if (currFileSelected)
|
||||
rootView.startDragAsset(selectedAssetsArr, mapToGlobal(mouse.x, mouse.y))
|
||||
} else {
|
||||
delFilePath = filePath
|
||||
contextFilePath = filePath
|
||||
contextDir = model.fileDir
|
||||
|
||||
tooltipBackend.hideTooltip()
|
||||
isDirContextMenu = false
|
||||
contextMenu.popup()
|
||||
}
|
||||
}
|
||||
@@ -263,7 +463,7 @@ Item {
|
||||
// Placeholder when the assets panel is empty
|
||||
Column {
|
||||
id: colNoAssets
|
||||
visible: assetsModel.isEmpty
|
||||
visible: assetsModel.isEmpty && !rootView.searchActive
|
||||
|
||||
spacing: 20
|
||||
x: 20
|
||||
@@ -307,4 +507,13 @@ Item {
|
||||
wrapMode: Text.WordWrap
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
text: qsTr("No match found.")
|
||||
x: 20
|
||||
y: 10
|
||||
color: StudioTheme.Values.themeTextColor
|
||||
font.pixelSize: 12
|
||||
visible: assetsModel.isEmpty && rootView.searchActive
|
||||
}
|
||||
}
|
||||
|
@@ -173,7 +173,7 @@ Item {
|
||||
id: leftBorder
|
||||
visible: false
|
||||
width: 1
|
||||
height: parent.height - 15
|
||||
height: parent.height - bottomPadding
|
||||
color: header.color
|
||||
}
|
||||
|
||||
|
@@ -27,29 +27,35 @@
|
||||
Metadata {
|
||||
id: metadataFile
|
||||
|
||||
defaultVersion: v19
|
||||
defaultVersion: v20
|
||||
|
||||
VersionData {
|
||||
id: v14
|
||||
name: "QUL 1.4"
|
||||
name: "Qt for MCUs 1.4"
|
||||
path: "qul-14.qml"
|
||||
}
|
||||
|
||||
VersionData {
|
||||
id: v17
|
||||
name: "QUL 1.7"
|
||||
name: "Qt for MCUs 1.7"
|
||||
path: "qul-17.qml"
|
||||
}
|
||||
|
||||
VersionData {
|
||||
id: v18
|
||||
name: "QUL 1.8"
|
||||
name: "Qt for MCUs 1.8"
|
||||
path: "qul-18.qml"
|
||||
}
|
||||
|
||||
VersionData {
|
||||
id: v19
|
||||
name: "QUL 1.9"
|
||||
name: "Qt for MCUs 1.9"
|
||||
path: "qul-19.qml"
|
||||
}
|
||||
|
||||
VersionData {
|
||||
id: v20
|
||||
name: "Qt for MCUs 2.0"
|
||||
path: "qul-20.qml"
|
||||
}
|
||||
}
|
||||
|
@@ -24,7 +24,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
VersionData {
|
||||
name: "QUL 1.4"
|
||||
name: "Qt for MCUs 1.4"
|
||||
|
||||
bannedItems: ["QtQuick.AnimatedImage",
|
||||
"QtQuick.FocusScope",
|
||||
@@ -34,6 +34,7 @@ VersionData {
|
||||
"QtQuick.Grid",
|
||||
"QtQuick.GridView",
|
||||
"QtQuick.PathView",
|
||||
"QtQuick.Loader",
|
||||
"QtQuick.Controls",
|
||||
"QtQuick.Controls.BusyIndicator",
|
||||
"QtQuick.Controls.ButtonGroup",
|
||||
|
@@ -24,7 +24,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
VersionData {
|
||||
name: "QUL 1.7"
|
||||
name: "Qt for MCUs 1.7"
|
||||
|
||||
bannedItems: ["QtQuick.AnimatedImage",
|
||||
"QtQuick.FocusScope",
|
||||
@@ -34,6 +34,7 @@ VersionData {
|
||||
"QtQuick.Grid",
|
||||
"QtQuick.GridView",
|
||||
"QtQuick.PathView",
|
||||
"QtQuick.Loader",
|
||||
"QtQuick.Controls",
|
||||
"QtQuick.Controls.BusyIndicator",
|
||||
"QtQuick.Controls.ButtonGroup",
|
||||
|
@@ -24,7 +24,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
VersionData {
|
||||
name: "QUL 1.8"
|
||||
name: "Qt for MCUs 1.8"
|
||||
|
||||
bannedItems: ["QtQuick.AnimatedImage",
|
||||
"QtQuick.FocusScope",
|
||||
@@ -34,6 +34,7 @@ VersionData {
|
||||
"QtQuick.Grid",
|
||||
"QtQuick.GridView",
|
||||
"QtQuick.PathView",
|
||||
"QtQuick.Loader",
|
||||
"QtQuick.Controls",
|
||||
"QtQuick.Controls.BusyIndicator",
|
||||
"QtQuick.Controls.ButtonGroup",
|
||||
@@ -63,7 +64,11 @@ VersionData {
|
||||
"QtQuick.Controls.TextArea",
|
||||
"QtQuick.Controls.TextField",
|
||||
"QtQuick.Controls.ToolSeparator",
|
||||
"QtQuick.Controls.Tumbler"]
|
||||
"QtQuick.Controls.Tumbler",
|
||||
"QtQuick.Shapes.ConicalGradient",
|
||||
"QtQuick.Shapes.LinearGradient",
|
||||
"QtQuick.Shapes.RadialGradient",
|
||||
"QtQuick.Shapes.ShapeGradient"]
|
||||
|
||||
allowedImports: ["QtQuick",
|
||||
"QtQuick.Shapes",
|
||||
|
@@ -24,7 +24,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
VersionData {
|
||||
name: "QUL 1.9"
|
||||
name: "Qt for MCUs 1.9"
|
||||
|
||||
bannedItems: ["QtQuick.AnimatedImage",
|
||||
"QtQuick.FocusScope",
|
||||
@@ -34,6 +34,7 @@ VersionData {
|
||||
"QtQuick.Grid",
|
||||
"QtQuick.GridView",
|
||||
"QtQuick.PathView",
|
||||
"QtQuick.Loader",
|
||||
"QtQuick.Controls",
|
||||
"QtQuick.Controls.BusyIndicator",
|
||||
"QtQuick.Controls.ButtonGroup",
|
||||
@@ -63,7 +64,11 @@ VersionData {
|
||||
"QtQuick.Controls.TextArea",
|
||||
"QtQuick.Controls.TextField",
|
||||
"QtQuick.Controls.ToolSeparator",
|
||||
"QtQuick.Controls.Tumbler"]
|
||||
"QtQuick.Controls.Tumbler",
|
||||
"QtQuick.Shapes.ConicalGradient",
|
||||
"QtQuick.Shapes.LinearGradient",
|
||||
"QtQuick.Shapes.RadialGradient",
|
||||
"QtQuick.Shapes.ShapeGradient"]
|
||||
|
||||
allowedImports: ["QtQuick",
|
||||
"QtQuick.Shapes",
|
||||
|
221
share/qtcreator/qmldesigner/qt4mcu/qul-20.qml
Normal 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"]
|
||||
}
|
||||
}
|
@@ -33,11 +33,8 @@ import StudioTheme 1.0 as StudioTheme
|
||||
Rectangle {
|
||||
id: myRoot
|
||||
|
||||
color: baseColor
|
||||
|
||||
property bool isBaseState
|
||||
property bool isCurrentState
|
||||
property color baseColor
|
||||
property string delegateStateName
|
||||
property string delegateStateImageSource
|
||||
property bool delegateHasWhenCondition
|
||||
@@ -47,14 +44,14 @@ Rectangle {
|
||||
property int bottomAreaHeight
|
||||
property int stateMargin
|
||||
property int previewMargin
|
||||
property int columnSpacing
|
||||
|
||||
readonly property bool isDefaultState: isDefault
|
||||
|
||||
property int closeButtonMargin: 6
|
||||
property int textFieldMargin: 4
|
||||
|
||||
signal delegateInteraction
|
||||
property int scrollBarH: 0
|
||||
property int listMargin: 0
|
||||
|
||||
function autoComplete(text, pos, explicitComplete, filter) {
|
||||
var stringList = statesEditorModel.autoComplete(text, pos, explicitComplete)
|
||||
@@ -65,14 +62,16 @@ Rectangle {
|
||||
return statesEditorModel.hasAnnotation(internalNodeId)
|
||||
}
|
||||
|
||||
color: isCurrentState ? StudioTheme.Values.themeInteraction
|
||||
: StudioTheme.Values.themeControlBackgroundInteraction
|
||||
MouseArea {
|
||||
id: mouseArea
|
||||
anchors.fill: parent
|
||||
|
||||
onClicked: {
|
||||
focus = true
|
||||
root.currentStateInternalId = internalNodeId
|
||||
contextMenu.dismiss() // close potentially open context menu
|
||||
myRoot.delegateInteraction()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,7 +88,6 @@ Rectangle {
|
||||
visible: !isBaseState && isCurrentState
|
||||
|
||||
onClicked: {
|
||||
myRoot.delegateInteraction()
|
||||
if (isDefaultState)
|
||||
statesEditorModel.resetDefaultState()
|
||||
|
||||
@@ -254,9 +252,8 @@ Rectangle {
|
||||
|
||||
Rectangle { // separator
|
||||
width: column.width
|
||||
height: myRoot.columnSpacing
|
||||
height: 2
|
||||
color: StudioTheme.Values.themeStateSeparator
|
||||
visible: expanded
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
@@ -264,7 +261,6 @@ Rectangle {
|
||||
width: myRoot.width - 2 * myRoot.stateMargin
|
||||
height: myRoot.bottomAreaHeight
|
||||
color: StudioTheme.Values.themeStateBackground
|
||||
visible: expanded
|
||||
|
||||
Image {
|
||||
anchors.fill: stateImageBackground
|
||||
|
@@ -26,6 +26,7 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
import QtQuickDesignerTheme 1.0
|
||||
import Qt.labs.qmlmodels 1.0
|
||||
import HelperWidgets 2.0
|
||||
import StudioControls 1.0 as StudioControls
|
||||
import StudioTheme 1.0 as StudioTheme
|
||||
@@ -33,27 +34,24 @@ import StudioTheme 1.0 as StudioTheme
|
||||
FocusScope {
|
||||
id: root
|
||||
|
||||
property int delegateTopAreaHeight: StudioTheme.Values.height + 8
|
||||
property int delegateBottomAreaHeight: delegateHeight - 2 * delegateStateMargin - delegateTopAreaHeight - delegateColumnSpacing
|
||||
property int delegateColumnSpacing: 2
|
||||
property int delegateStateMargin: 16
|
||||
property int delegatePreviewMargin: 10
|
||||
property int effectiveHeight: root.expanded ? Math.max(85, Math.min(287, root.height)) : 85 // height of the states area
|
||||
readonly property int delegateTopAreaHeight: StudioTheme.Values.height + 8
|
||||
readonly property int delegateBottomAreaHeight: delegateHeight - 2 * delegateStateMargin - delegateTopAreaHeight - 2
|
||||
readonly property int delegateStateMargin: 16
|
||||
readonly property int delegatePreviewMargin: 10
|
||||
readonly property int effectiveHeight: root.height < 130 ? 89 : Math.min(root.height, 287)
|
||||
|
||||
readonly property int scrollBarH: statesListView.ScrollBar.horizontal.scrollBarVisible ? StudioTheme.Values.scrollBarThickness : 0
|
||||
readonly property int listMargin: 10
|
||||
readonly property int delegateWidth: 264
|
||||
readonly property int delegateHeight: Math.max(effectiveHeight - scrollBarH - 2 * listMargin, 69)
|
||||
readonly property int innerSpacing: 2
|
||||
|
||||
property int currentStateInternalId: 0
|
||||
|
||||
signal createNewState
|
||||
signal deleteState(int internalNodeId)
|
||||
signal duplicateCurrentState
|
||||
|
||||
property int padding: 2
|
||||
property int delegateWidth: 264
|
||||
property int delegateHeight: effectiveHeight
|
||||
- StudioTheme.Values.scrollBarThickness
|
||||
- 2 * (root.padding + StudioTheme.Values.border)
|
||||
property int innerSpacing: 2
|
||||
property int currentStateInternalId: 0
|
||||
|
||||
property bool expanded: true
|
||||
|
||||
Connections {
|
||||
target: statesEditorModel
|
||||
function onChangedToState(n) { root.currentStateInternalId = n }
|
||||
@@ -65,92 +63,117 @@ FocusScope {
|
||||
color: StudioTheme.Values.themePanelBackground
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
||||
|
||||
onClicked: function(mouse) {
|
||||
if (mouse.button === Qt.LeftButton) {
|
||||
contextMenu.dismiss()
|
||||
focus = true
|
||||
} else if (mouse.button === Qt.RightButton) {
|
||||
contextMenu.popup()
|
||||
}
|
||||
}
|
||||
|
||||
StudioControls.Menu {
|
||||
id: contextMenu
|
||||
|
||||
StudioControls.MenuItem {
|
||||
text: root.expanded ? qsTr("Collapse") : qsTr("Expand")
|
||||
onTriggered: root.expanded = !root.expanded
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AbstractButton {
|
||||
id: addStateButton
|
||||
|
||||
buttonIcon: root.expanded ? qsTr("Create New State") : StudioTheme.Constants.plus
|
||||
iconFont: root.expanded ? StudioTheme.Constants.font : StudioTheme.Constants.iconFont
|
||||
iconSize: root.expanded ? StudioTheme.Values.myFontSize : StudioTheme.Values.myIconFontSize
|
||||
iconItalic: root.expanded
|
||||
buttonIcon: StudioTheme.Constants.plus
|
||||
iconFont: StudioTheme.Constants.iconFont
|
||||
iconSize: StudioTheme.Values.myIconFontSize
|
||||
tooltip: qsTr("Add a new state.")
|
||||
visible: canAddNewStates
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 8
|
||||
y: (Math.min(effectiveHeight, root.height) - height) / 2
|
||||
width: root.expanded ? 140 : 18
|
||||
height: root.expanded ? 60 : 18
|
||||
anchors.rightMargin: 4
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: statesListView.contentWidth - statesListView.contentX - root.delegateWidth / 2 > statesListView.width ? scrollBarH + 5 : -35
|
||||
width: 35
|
||||
height: 35
|
||||
|
||||
onClicked: {
|
||||
contextMenu.dismiss()
|
||||
root.createNewState()
|
||||
Behavior on anchors.bottomMargin {
|
||||
PropertyAnimation {
|
||||
duration: 700
|
||||
easing.type: Easing.InOutBack
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle { // separator lines between state items
|
||||
color: StudioTheme.Values.themeStateSeparator
|
||||
x: root.padding
|
||||
y: root.padding
|
||||
width: statesListView.width
|
||||
height: root.delegateHeight
|
||||
onClicked: root.createNewState()
|
||||
}
|
||||
|
||||
ListView {
|
||||
id: statesListView
|
||||
|
||||
boundsBehavior: Flickable.StopAtBounds
|
||||
clip: true
|
||||
|
||||
x: root.padding
|
||||
y: root.padding
|
||||
width: Math.min(root.delegateWidth * statesListView.count + root.innerSpacing * (statesListView.count - 1),
|
||||
root.width - addStateButton.width - root.padding - 16) // 16 = 2 * 8 (addStateButton margin)
|
||||
height: root.delegateHeight + StudioTheme.Values.scrollBarThickness
|
||||
anchors.fill: parent
|
||||
anchors.topMargin: listMargin
|
||||
anchors.leftMargin: listMargin
|
||||
anchors.rightMargin: listMargin
|
||||
|
||||
model: statesEditorModel
|
||||
orientation: ListView.Horizontal
|
||||
spacing: root.innerSpacing
|
||||
|
||||
delegate: StatesDelegate {
|
||||
id: statesDelegate
|
||||
property int prevCount: 0
|
||||
onCountChanged: {
|
||||
if (count > prevCount)
|
||||
Qt.callLater(statesListView.positionViewAtEnd)
|
||||
prevCount = count
|
||||
}
|
||||
|
||||
delegate: DelegateChooser {
|
||||
role: "type"
|
||||
|
||||
DelegateChoice {
|
||||
roleValue: "state"
|
||||
|
||||
StatesDelegate {
|
||||
width: root.delegateWidth
|
||||
height: root.delegateHeight
|
||||
anchors.verticalCenter: parent ? parent.verticalCenter : undefined
|
||||
anchors.verticalCenterOffset: -.5 * (scrollBarH + listMargin)
|
||||
isBaseState: 0 === internalNodeId
|
||||
isCurrentState: root.currentStateInternalId === internalNodeId
|
||||
baseColor: isCurrentState ? StudioTheme.Values.themeInteraction : background.color
|
||||
delegateStateName: stateName
|
||||
delegateStateImageSource: stateImageSource
|
||||
delegateHasWhenCondition: hasWhenCondition
|
||||
delegateWhenConditionString: whenConditionString
|
||||
onDelegateInteraction: contextMenu.dismiss()
|
||||
|
||||
columnSpacing: root.delegateColumnSpacing
|
||||
topAreaHeight: root.delegateTopAreaHeight
|
||||
bottomAreaHeight: root.delegateBottomAreaHeight
|
||||
stateMargin: root.delegateStateMargin
|
||||
previewMargin: root.delegatePreviewMargin
|
||||
scrollBarH: root.scrollBarH
|
||||
listMargin: root.listMargin
|
||||
}
|
||||
}
|
||||
|
||||
DelegateChoice {
|
||||
roleValue: "add"
|
||||
|
||||
Rectangle {
|
||||
visible: canAddNewStates
|
||||
|
||||
width: root.delegateWidth
|
||||
height: root.delegateHeight
|
||||
anchors.verticalCenter: parent ? parent.verticalCenter : undefined
|
||||
anchors.verticalCenterOffset: -.5 * (scrollBarH + listMargin)
|
||||
color: Qt.lighter(StudioTheme.Values.themeControlBackgroundInteraction, addState.containsMouse ? 1.5 : 1)
|
||||
|
||||
ToolTip.text: qsTr("Add a new state.")
|
||||
ToolTip.visible: addState.containsMouse
|
||||
ToolTip.delay: 1000
|
||||
|
||||
Rectangle { // inner rect
|
||||
width: parent.width - 30
|
||||
height: parent.height - 30
|
||||
anchors.centerIn: parent
|
||||
color: StudioTheme.Values.themeStateBackground
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "+"
|
||||
anchors.centerIn: parent
|
||||
anchors.verticalCenterOffset: -5
|
||||
font.pixelSize: parent.height * .5
|
||||
color: Qt.lighter(StudioTheme.Values.themeControlBackgroundInteraction, addState.containsMouse ? 1.5 : 1)
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: addState
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
onClicked: root.createNewState()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ScrollBar.horizontal: HorizontalScrollBar {}
|
||||
|
@@ -28,6 +28,7 @@
|
||||
#include "generatecmakelistsconstants.h"
|
||||
|
||||
#include <utils/utilsicons.h>
|
||||
#include <utils/detailswidget.h>
|
||||
|
||||
#include <QDialogButtonBox>
|
||||
#include <QPushButton>
|
||||
@@ -50,17 +51,14 @@ CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePa
|
||||
|
||||
m_model = new CMakeGeneratorDialogTreeModel(rootDir, files, this);
|
||||
|
||||
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||
setLayout(layout);
|
||||
QVBoxLayout *dialogLayout = new QVBoxLayout(this);
|
||||
dialogLayout->setSizeConstraint(QLayout::SetFixedSize);
|
||||
setLayout(dialogLayout);
|
||||
|
||||
QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
|
||||
|
||||
auto *okButton = buttons->button(QDialogButtonBox::Ok);
|
||||
okButton->setDefault(true);
|
||||
|
||||
connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||||
connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
connect(m_model, &CMakeGeneratorDialogTreeModel::checkedStateChanged, this, &CmakeGeneratorDialog::refreshNotificationText);
|
||||
QWidget *advancedInnerWidget = new QWidget(this);
|
||||
QVBoxLayout *advancedInnerLayout = new QVBoxLayout(advancedInnerWidget);
|
||||
advancedInnerWidget->setLayout(advancedInnerLayout);
|
||||
advancedInnerWidget->setMinimumHeight(640);
|
||||
|
||||
QTreeView *tree = new QTreeView(this);
|
||||
tree->setModel(m_model);
|
||||
@@ -72,9 +70,31 @@ CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePa
|
||||
|
||||
refreshNotificationText();
|
||||
|
||||
layout->addWidget(tree, 2);
|
||||
layout->addWidget(m_notifications, 1);
|
||||
layout->addWidget(buttons);
|
||||
advancedInnerLayout->addWidget(tree, 2);
|
||||
advancedInnerLayout->addWidget(m_notifications, 1);
|
||||
|
||||
DetailsWidget *advancedWidget = new DetailsWidget(this);
|
||||
advancedWidget->setMinimumWidth(600);
|
||||
advancedWidget->setWidget(advancedInnerWidget);
|
||||
advancedWidget->setSummaryText(QCoreApplication::translate("QmlDesigner::GenerateCmake",
|
||||
"Advanced Options"));
|
||||
|
||||
QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
|
||||
auto *okButton = buttons->button(QDialogButtonBox::Ok);
|
||||
okButton->setDefault(true);
|
||||
|
||||
connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||||
connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
connect(m_model, &CMakeGeneratorDialogTreeModel::checkedStateChanged, this, &CmakeGeneratorDialog::refreshNotificationText);
|
||||
|
||||
QLabel *mainLabel = new QLabel(QCoreApplication::translate("QmlDesigner::GenerateCmake",
|
||||
"Start CMakeFiles.txt generation"),
|
||||
this);
|
||||
mainLabel->setMargin(50);
|
||||
|
||||
dialogLayout->addWidget(mainLabel);
|
||||
dialogLayout->addWidget(advancedWidget);
|
||||
dialogLayout->addWidget(buttons);
|
||||
}
|
||||
|
||||
FilePaths CmakeGeneratorDialog::getFilePaths()
|
||||
|
@@ -34,6 +34,7 @@ ItemLibraryAssetsFilesModel::ItemLibraryAssetsFilesModel(QObject *parent)
|
||||
// add roles
|
||||
m_roleNames.insert(FileNameRole, "fileName");
|
||||
m_roleNames.insert(FilePathRole, "filePath");
|
||||
m_roleNames.insert(FileDirRole, "fileDir");
|
||||
}
|
||||
|
||||
QVariant ItemLibraryAssetsFilesModel::data(const QModelIndex &index, int role) const
|
||||
@@ -49,6 +50,9 @@ QVariant ItemLibraryAssetsFilesModel::data(const QModelIndex &index, int role) c
|
||||
if (role == FilePathRole)
|
||||
return m_files[index.row()];
|
||||
|
||||
if (role == FileDirRole)
|
||||
return QVariant::fromValue(parent());
|
||||
|
||||
qWarning() << Q_FUNC_INFO << "Invalid role requested: " << QString::number(role);
|
||||
return {};
|
||||
}
|
||||
|
@@ -44,7 +44,8 @@ public:
|
||||
|
||||
private:
|
||||
enum Roles {FileNameRole = Qt::UserRole + 1,
|
||||
FilePathRole};
|
||||
FilePathRole,
|
||||
FileDirRole};
|
||||
|
||||
QStringList m_files;
|
||||
QHash<int, QByteArray> m_roleNames;
|
||||
|
@@ -42,6 +42,7 @@
|
||||
#include <QMetaProperty>
|
||||
#include <QPainter>
|
||||
#include <QRawFont>
|
||||
#include <QRegularExpression>
|
||||
#include <QMessageBox>
|
||||
#include <QCheckBox>
|
||||
#include <utils/stylehelper.h>
|
||||
@@ -99,7 +100,7 @@ void ItemLibraryAssetsModel::toggleExpandAll(bool expand)
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
void ItemLibraryAssetsModel::removeFile(const QString &filePath)
|
||||
void ItemLibraryAssetsModel::deleteFile(const QString &filePath)
|
||||
{
|
||||
bool askBeforeDelete = DesignerSettings::getValue(
|
||||
DesignerSettingsKey::ASK_BEFORE_DELETING_ASSET).toBool();
|
||||
@@ -134,6 +135,52 @@ void ItemLibraryAssetsModel::removeFile(const QString &filePath)
|
||||
}
|
||||
}
|
||||
|
||||
void ItemLibraryAssetsModel::addNewFolder(const QString &folderPath)
|
||||
{
|
||||
QString iterPath = folderPath;
|
||||
QRegularExpression rgx("\\d+$"); // matches a number at the end of a string
|
||||
QDir dir{folderPath};
|
||||
|
||||
while (dir.exists()) {
|
||||
// if the folder name ends with a number, increment it
|
||||
QRegularExpressionMatch match = rgx.match(iterPath);
|
||||
if (match.hasMatch()) { // ends with a number
|
||||
QString numStr = match.captured(0);
|
||||
int num = match.captured(0).toInt();
|
||||
|
||||
// get number of padding zeros, ex: for "005" = 2
|
||||
int nPaddingZeros = 0;
|
||||
for (; nPaddingZeros < numStr.size() && numStr[nPaddingZeros] == '0'; ++nPaddingZeros);
|
||||
|
||||
++num;
|
||||
|
||||
// if the incremented number's digits increased, decrease the padding zeros
|
||||
if (std::fmod(std::log10(num), 1.0) == 0)
|
||||
--nPaddingZeros;
|
||||
|
||||
iterPath = folderPath.mid(0, match.capturedStart())
|
||||
+ QString('0').repeated(nPaddingZeros)
|
||||
+ QString::number(num);
|
||||
} else {
|
||||
iterPath = folderPath + '1';
|
||||
}
|
||||
|
||||
dir.setPath(iterPath);
|
||||
}
|
||||
|
||||
dir.mkpath(iterPath);
|
||||
}
|
||||
|
||||
void ItemLibraryAssetsModel::deleteFolder(const QString &folderPath)
|
||||
{
|
||||
QDir{folderPath}.removeRecursively();
|
||||
}
|
||||
|
||||
QObject *ItemLibraryAssetsModel::rootDir() const
|
||||
{
|
||||
return m_assetsDir;
|
||||
}
|
||||
|
||||
const QStringList &ItemLibraryAssetsModel::supportedImageSuffixes()
|
||||
{
|
||||
static QStringList retList;
|
||||
@@ -270,7 +317,7 @@ void ItemLibraryAssetsModel::setRootPath(const QString &path)
|
||||
isEmpty &= parseDirRecursive(assetsDir, currDepth + 1);
|
||||
}
|
||||
|
||||
if (isEmpty)
|
||||
if (!m_searchText.isEmpty() && isEmpty)
|
||||
currAssetsDir->setDirVisible(false);
|
||||
|
||||
return isEmpty;
|
||||
|
@@ -83,7 +83,10 @@ public:
|
||||
|
||||
Q_INVOKABLE void toggleExpandAll(bool expand);
|
||||
Q_INVOKABLE DirExpandState getAllExpandedState() const;
|
||||
Q_INVOKABLE void removeFile(const QString &filePath);
|
||||
Q_INVOKABLE void deleteFile(const QString &filePath);
|
||||
Q_INVOKABLE void addNewFolder(const QString &folderPath);
|
||||
Q_INVOKABLE void deleteFolder(const QString &folderPath);
|
||||
Q_INVOKABLE QObject *rootDir() const;
|
||||
|
||||
signals:
|
||||
void isEmptyChanged();
|
||||
|
@@ -53,7 +53,6 @@ StatesEditorModel::StatesEditorModel(StatesEditorView *view)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int StatesEditorModel::count() const
|
||||
{
|
||||
return rowCount();
|
||||
@@ -64,9 +63,8 @@ QModelIndex StatesEditorModel::index(int row, int column, const QModelIndex &par
|
||||
if (m_statesEditorView.isNull())
|
||||
return {};
|
||||
|
||||
|
||||
int internalNodeId = 0;
|
||||
if (row > 0)
|
||||
if (row > 0 && row < rowCount() - 1) // first and last rows are base state, add state
|
||||
internalNodeId = m_statesEditorView->rootModelNode().nodeListProperty("states").at(row - 1).internalId();
|
||||
|
||||
return hasIndex(row, column, parent) ? createIndex(row, column, internalNodeId) : QModelIndex();
|
||||
@@ -78,9 +76,9 @@ int StatesEditorModel::rowCount(const QModelIndex &parent) const
|
||||
return 0;
|
||||
|
||||
if (!m_statesEditorView->rootModelNode().hasNodeListProperty("states"))
|
||||
return 1;
|
||||
return 2; // base state + add new state
|
||||
|
||||
return m_statesEditorView->rootModelNode().nodeListProperty("states").count() + 1;
|
||||
return m_statesEditorView->rootModelNode().nodeListProperty("states").count() + 2; // 2 = base state + add new state
|
||||
}
|
||||
|
||||
void StatesEditorModel::reset()
|
||||
@@ -109,8 +107,8 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const
|
||||
else
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
case StateImageSourceRole: {
|
||||
static int randomNumber = 0;
|
||||
randomNumber++;
|
||||
@@ -119,9 +117,12 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const
|
||||
else
|
||||
return QString("image://qmldesigner_stateseditor/%1-%2").arg(index.internalId()).arg(randomNumber);
|
||||
}
|
||||
case InternalNodeId: return index.internalId();
|
||||
|
||||
case HasWhenCondition: return stateNode.isValid() && stateNode.hasProperty("when");
|
||||
case InternalNodeId:
|
||||
return index.internalId();
|
||||
|
||||
case HasWhenCondition:
|
||||
return stateNode.isValid() && stateNode.hasProperty("when");
|
||||
|
||||
case WhenConditionString: {
|
||||
if (stateNode.isValid() && stateNode.hasBindingProperty("when"))
|
||||
@@ -137,10 +138,11 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const
|
||||
return false;
|
||||
}
|
||||
|
||||
case ModelHasDefaultState: {
|
||||
case ModelHasDefaultState:
|
||||
return hasDefaultState();
|
||||
}
|
||||
|
||||
case StateType:
|
||||
return index.row() == rowCount() - 1 ? "add" : "state";
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
@@ -155,7 +157,8 @@ QHash<int, QByteArray> StatesEditorModel::roleNames() const
|
||||
{HasWhenCondition, "hasWhenCondition"},
|
||||
{WhenConditionString, "whenConditionString"},
|
||||
{IsDefault, "isDefault"},
|
||||
{ModelHasDefaultState, "modelHasDefaultState"}
|
||||
{ModelHasDefaultState, "modelHasDefaultState"},
|
||||
{StateType, "type"}
|
||||
};
|
||||
return roleNames;
|
||||
}
|
||||
@@ -163,10 +166,8 @@ QHash<int, QByteArray> StatesEditorModel::roleNames() const
|
||||
void StatesEditorModel::insertState(int stateIndex)
|
||||
{
|
||||
if (stateIndex >= 0) {
|
||||
|
||||
const int updateIndex = stateIndex + 1;
|
||||
beginInsertRows(QModelIndex(), updateIndex, updateIndex);
|
||||
|
||||
endInsertRows();
|
||||
|
||||
emit dataChanged(index(updateIndex, 0), index(updateIndex, 0));
|
||||
|
@@ -44,7 +44,8 @@ class StatesEditorModel : public QAbstractListModel
|
||||
HasWhenCondition,
|
||||
WhenConditionString,
|
||||
IsDefault,
|
||||
ModelHasDefaultState
|
||||
ModelHasDefaultState,
|
||||
StateType
|
||||
};
|
||||
|
||||
public:
|
||||
|
@@ -85,12 +85,6 @@ void StatesEditorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorV
|
||||
checkForStatesAvailability();
|
||||
}
|
||||
|
||||
void StatesEditorView::toggleStatesViewExpanded()
|
||||
{
|
||||
if (m_statesEditorWidget)
|
||||
m_statesEditorWidget->toggleStatesViewExpanded();
|
||||
}
|
||||
|
||||
void StatesEditorView::removeState(int nodeId)
|
||||
{
|
||||
try {
|
||||
@@ -102,6 +96,22 @@ void StatesEditorView::removeState(int nodeId)
|
||||
if (modelState.isValid()) {
|
||||
QStringList lockedTargets;
|
||||
const auto propertyChanges = modelState.propertyChanges();
|
||||
|
||||
// confirm removing not empty states
|
||||
if (!propertyChanges.isEmpty()) {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setTextFormat(Qt::RichText);
|
||||
msgBox.setIcon(QMessageBox::Question);
|
||||
msgBox.setWindowTitle(tr("Remove State"));
|
||||
msgBox.setText(tr("This state is not empty. Are you sure you want to remove it?"));
|
||||
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
|
||||
msgBox.setDefaultButton(QMessageBox::Yes);
|
||||
|
||||
if (msgBox.exec() == QMessageBox::Cancel)
|
||||
return;
|
||||
}
|
||||
|
||||
// confirm removing states with locked targets
|
||||
for (const QmlPropertyChanges &change : propertyChanges) {
|
||||
const ModelNode target = change.target();
|
||||
QTC_ASSERT(target.isValid(), continue);
|
||||
|
@@ -87,8 +87,6 @@ public:
|
||||
|
||||
void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override;
|
||||
|
||||
void toggleStatesViewExpanded();
|
||||
|
||||
public slots:
|
||||
void synchonizeCurrentStateFromWidget();
|
||||
void createNewState();
|
||||
|
@@ -133,13 +133,6 @@ QString StatesEditorWidget::qmlSourcesPath()
|
||||
return Core::ICore::resourcePath("qmldesigner/statesEditorQmlSources").toString();
|
||||
}
|
||||
|
||||
void StatesEditorWidget::toggleStatesViewExpanded()
|
||||
{
|
||||
QTC_ASSERT(rootObject(), return);
|
||||
bool expanded = rootObject()->property("expanded").toBool();
|
||||
rootObject()->setProperty("expanded", !expanded);
|
||||
}
|
||||
|
||||
void StatesEditorWidget::showEvent(QShowEvent *event)
|
||||
{
|
||||
QQuickWidget::showEvent(event);
|
||||
@@ -168,18 +161,6 @@ void StatesEditorWidget::reloadQmlSource()
|
||||
connect(rootObject(), SIGNAL(createNewState()), m_statesEditorView.data(), SLOT(createNewState()));
|
||||
connect(rootObject(), SIGNAL(deleteState(int)), m_statesEditorView.data(), SLOT(removeState(int)));
|
||||
m_statesEditorView.data()->synchonizeCurrentStateFromWidget();
|
||||
|
||||
if (!DesignerSettings::getValue(DesignerSettingsKey::STATESEDITOR_EXPANDED).toBool())
|
||||
toggleStatesViewExpanded();
|
||||
|
||||
connect(rootObject(), SIGNAL(expandedChanged()), this, SLOT(handleExpandedChanged()));
|
||||
}
|
||||
|
||||
void StatesEditorWidget::handleExpandedChanged()
|
||||
{
|
||||
QTC_ASSERT(rootObject(), return);
|
||||
|
||||
bool expanded = rootObject()->property("expanded").toBool();
|
||||
DesignerSettings::setValue(DesignerSettingsKey::STATESEDITOR_EXPANDED, expanded);
|
||||
}
|
||||
}
|
||||
} // QmlDesigner
|
||||
|
@@ -57,14 +57,11 @@ public:
|
||||
|
||||
static QString qmlSourcesPath();
|
||||
|
||||
void toggleStatesViewExpanded();
|
||||
|
||||
protected:
|
||||
void showEvent(QShowEvent *) override;
|
||||
|
||||
private:
|
||||
void reloadQmlSource();
|
||||
Q_SLOT void handleExpandedChanged();
|
||||
|
||||
private:
|
||||
QPointer<StatesEditorView> m_statesEditorView;
|
||||
|
@@ -100,8 +100,6 @@ public:
|
||||
DesignerActionManager &designerActionManager();
|
||||
const DesignerActionManager &designerActionManager() const;
|
||||
|
||||
void toggleStatesViewExpanded();
|
||||
|
||||
void qmlJSEditorContextHelp(const Core::IContext::HelpCallback &callback) const;
|
||||
DesignDocument *currentDesignDocument() const;
|
||||
|
||||
|
@@ -394,11 +394,6 @@ const DesignerActionManager &ViewManager::designerActionManager() const
|
||||
return d->designerActionManagerView.designerActionManager();
|
||||
}
|
||||
|
||||
void ViewManager::toggleStatesViewExpanded()
|
||||
{
|
||||
d->statesEditorView.toggleStatesViewExpanded();
|
||||
}
|
||||
|
||||
void ViewManager::qmlJSEditorContextHelp(const Core::IContext::HelpCallback &callback) const
|
||||
{
|
||||
d->textEditorView.qmlJSEditorContextHelp(callback);
|
||||
|
@@ -72,7 +72,6 @@ void DesignerSettings::fromSettings(QSettings *settings)
|
||||
restoreValue(settings, DesignerSettingsKey::FORWARD_PUPPET_OUTPUT, QString());
|
||||
restoreValue(settings, DesignerSettingsKey::REFORMAT_UI_QML_FILES, true);
|
||||
restoreValue(settings, DesignerSettingsKey::IGNORE_DEVICE_PIXEL_RATIO, false);
|
||||
restoreValue(settings, DesignerSettingsKey::STATESEDITOR_EXPANDED, true);
|
||||
restoreValue(settings, DesignerSettingsKey::NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS, true);
|
||||
restoreValue(settings, DesignerSettingsKey::NAVIGATOR_REVERSE_ITEM_ORDER, false);
|
||||
restoreValue(settings, DesignerSettingsKey::STANDALONE_MODE, false);
|
||||
|
@@ -60,7 +60,6 @@ const char ENABLE_MODEL_EXCEPTION_OUTPUT[] = "WarnException";
|
||||
const char PUPPET_KILL_TIMEOUT[] = "PuppetKillTimeout";
|
||||
const char DEBUG_PUPPET[] = "DebugPuppet";
|
||||
const char FORWARD_PUPPET_OUTPUT[] = "ForwardPuppetOutput";
|
||||
const char STATESEDITOR_EXPANDED[] = "StatesEditorExpanded";
|
||||
const char NAVIGATOR_SHOW_ONLY_VISIBLE_ITEMS[] = "NavigatorShowOnlyVisibleItems";
|
||||
const char NAVIGATOR_REVERSE_ITEM_ORDER[] = "NavigatorReverseItemOrder";
|
||||
const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* These settings are not exposed in ui. */
|
||||
|
@@ -511,8 +511,14 @@ bool DocumentManager::belongsToQmakeProject()
|
||||
Utils::FilePath DocumentManager::currentResourcePath()
|
||||
{
|
||||
Utils::FilePath resourcePath = currentProjectDirPath();
|
||||
|
||||
if (resourcePath.isEmpty())
|
||||
return currentFilePath().absolutePath();
|
||||
|
||||
FilePath contentFilePath = resourcePath.pathAppended("content");
|
||||
if (contentFilePath.exists())
|
||||
return contentFilePath;
|
||||
|
||||
return resourcePath;
|
||||
}
|
||||
|
||||
|
@@ -205,8 +205,6 @@ bool showConfirmationDialog(const Utils::FilePath &rootDir)
|
||||
files.append(file.filePath);
|
||||
|
||||
CmakeGeneratorDialog dialog(rootDir, files);
|
||||
dialog.setMinimumWidth(600);
|
||||
dialog.setMinimumHeight(640);
|
||||
if (dialog.exec()) {
|
||||
Utils::FilePaths confirmedFiles = dialog.getFilePaths();
|
||||
removeUnconfirmedQueuedFiles(confirmedFiles);
|
||||
|
@@ -69,7 +69,6 @@ ShortCutManager::ShortCutManager()
|
||||
m_copyAction(tr("&Copy")),
|
||||
m_pasteAction(tr("&Paste")),
|
||||
m_selectAllAction(tr("Select &All")),
|
||||
m_collapseExpandStatesAction(tr("Toggle States")),
|
||||
m_escapeAction(this)
|
||||
{
|
||||
|
||||
@@ -97,10 +96,6 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
|
||||
|
||||
connect(&m_selectAllAction,&QAction::triggered, this, &ShortCutManager::selectAll);
|
||||
|
||||
connect(&m_collapseExpandStatesAction, &QAction::triggered, [] {
|
||||
QmlDesignerPlugin::instance()->viewManager().toggleStatesViewExpanded();
|
||||
});
|
||||
|
||||
// Revert to saved
|
||||
Core::EditorManager *em = Core::EditorManager::instance();
|
||||
Core::ActionManager::registerAction(&m_revertToSavedAction,Core::Constants::REVERTTOSAVED, qmlDesignerMainContext);
|
||||
@@ -188,13 +183,6 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
|
||||
command->setDefaultKeySequence(QKeySequence::SelectAll);
|
||||
editMenu->addAction(command, Core::Constants::G_EDIT_SELECTALL);
|
||||
|
||||
Core::ActionContainer *viewsMenu = Core::ActionManager::actionContainer(Core::Constants::M_VIEW_VIEWS);
|
||||
|
||||
command = Core::ActionManager::registerAction(&m_collapseExpandStatesAction, Constants::TOGGLE_STATES_EDITOR, qmlDesignerMainContext);
|
||||
command->setAttribute(Core::Command::CA_Hide);
|
||||
command->setDefaultKeySequence(QKeySequence("Ctrl+Alt+s"));
|
||||
viewsMenu->addAction(command);
|
||||
|
||||
/* Registering disabled action for Escape, because Qt Quick does not support shortcut overrides. */
|
||||
command = Core::ActionManager::registerAction(&m_escapeAction, Core::Constants::S_RETURNTOEDITOR, qmlDesignerMainContext);
|
||||
command->setDefaultKeySequence(QKeySequence(Qt::Key_Escape));
|
||||
|
@@ -83,7 +83,6 @@ private:
|
||||
QAction m_copyAction;
|
||||
QAction m_pasteAction;
|
||||
QAction m_selectAllAction;
|
||||
QAction m_collapseExpandStatesAction;
|
||||
QAction m_escapeAction;
|
||||
};
|
||||
|
||||
|
@@ -581,6 +581,7 @@ void StudioWelcomePlugin::extensionsInitialized()
|
||||
Core::ModeManager::activateMode(m_welcomeMode->id());
|
||||
|
||||
// Enable QDS new project dialog
|
||||
if (Core::ICore::settings()->value("QML/Designer/StandAloneMode", false).toBool())
|
||||
Core::ICore::setNewDialogFactory([](QWidget *parent) { return new QdsNewDialog(parent); });
|
||||
|
||||
if (showSplashScreen()) {
|
||||
|
@@ -2984,7 +2984,7 @@ bool TextEditorWidget::event(QEvent *e)
|
||||
&& (ke->key() < Qt::Key_Escape));
|
||||
d->m_maybeFakeTooltipEvent = false;
|
||||
}
|
||||
break;
|
||||
return true;
|
||||
}
|
||||
case QEvent::ApplicationPaletteChange: {
|
||||
// slight hack: ignore palette changes
|
||||
|
@@ -37,7 +37,7 @@ def placeCursorToLine(editor, line, isRegex=False):
|
||||
return waitForObject(editor)
|
||||
|
||||
isDarwin = platform.system() == 'Darwin'
|
||||
if not isinstance(editor, (str, unicode)):
|
||||
if not isString(editor):
|
||||
editor = objectMap.realName(editor)
|
||||
oldPosition = 0
|
||||
jumpToFirstLine(getEditor())
|
||||
@@ -120,7 +120,7 @@ def replaceEditorContent(editor, newcontent):
|
||||
type(editor, newcontent)
|
||||
|
||||
def typeLines(editor, lines):
|
||||
if isinstance(lines, (str, unicode)):
|
||||
if isString(lines):
|
||||
lines = [lines]
|
||||
if isinstance(lines, (list, tuple)):
|
||||
for line in lines:
|
||||
|
@@ -35,10 +35,10 @@ def changeFilePermissions(dirPath, readPerm, writePerm, excludeFileNames=None):
|
||||
permission |= stat.S_IWRITE
|
||||
if excludeFileNames == None:
|
||||
excludeFileNames = []
|
||||
elif isinstance(excludeFileNames, (str, unicode)):
|
||||
elif isString(excludeFileNames):
|
||||
excludeFileNames = [excludeFileNames]
|
||||
if not isinstance(excludeFileNames, (tuple, list)):
|
||||
test.warning("File names to exclude must be of type str, unicode, list, tuple or None - "
|
||||
test.warning("File names to exclude must be of type str, list, tuple or None - "
|
||||
"ignoring parameter this time.")
|
||||
excludeFileNames = []
|
||||
if not os.path.isdir(dirPath):
|
||||
|
@@ -95,8 +95,8 @@ def setRunInTerminal(wantedKit, runInTerminal=True):
|
||||
switchViewTo(ViewConstants.EDIT)
|
||||
|
||||
def __getTargetFromToolTip__(toolTip):
|
||||
if toolTip == None or not isinstance(toolTip, (str, unicode)):
|
||||
test.warning("Parameter toolTip must be of type str or unicode and can't be None!")
|
||||
if toolTip == None or not isString(toolTip):
|
||||
test.warning("Parameter toolTip must be of type str and can't be None!")
|
||||
return None
|
||||
pattern = re.compile(".*<b>Kit:</b>(.*)<b>Deploy.*")
|
||||
target = pattern.match(toolTip)
|
||||
@@ -108,7 +108,7 @@ def __getTargetFromToolTip__(toolTip):
|
||||
|
||||
def getExecutableAndTargetFromToolTip(toolTip):
|
||||
target = __getTargetFromToolTip__(toolTip)
|
||||
if toolTip == None or not isinstance(toolTip, (str, unicode)):
|
||||
if toolTip == None or not isString(toolTip):
|
||||
return None, target
|
||||
pattern = re.compile('.*<b>Run:</b>(.*)</.*')
|
||||
exe = pattern.match(toolTip)
|
||||
|
@@ -76,7 +76,7 @@ def ensureChecked(objectName, shouldBeChecked = True, timeout=20000):
|
||||
# or the object itself. If it is an object, it must exist already.
|
||||
# param expectedState is the expected enable state of the object
|
||||
def verifyEnabled(objectSpec, expectedState = True):
|
||||
if isinstance(objectSpec, (str, unicode)):
|
||||
if isString(objectSpec):
|
||||
waitFor("object.exists('" + str(objectSpec).replace("'", "\\'") + "')", 20000)
|
||||
foundObject = findObject(objectSpec)
|
||||
else:
|
||||
@@ -154,7 +154,7 @@ def which(program):
|
||||
def cleanUpUserFiles(pathsToProFiles=None):
|
||||
if pathsToProFiles==None:
|
||||
return False
|
||||
if isinstance(pathsToProFiles, (str, unicode)):
|
||||
if isString(pathsToProFiles):
|
||||
filelist = glob.glob(pathsToProFiles+".user*")
|
||||
elif isinstance(pathsToProFiles, (list, tuple)):
|
||||
filelist = []
|
||||
@@ -398,10 +398,10 @@ def enabledCheckBoxExists(text):
|
||||
|
||||
# this function verifies if the text matches the given
|
||||
# regex inside expectedTexts
|
||||
# param text must be a single str/unicode
|
||||
# param expectedTexts can be str/unicode/list/tuple
|
||||
# param text must be a single str
|
||||
# param expectedTexts can be str/list/tuple
|
||||
def regexVerify(text, expectedTexts):
|
||||
if isinstance(expectedTexts, (str,unicode)):
|
||||
if isString(expectedTexts):
|
||||
expectedTexts = [expectedTexts]
|
||||
for curr in expectedTexts:
|
||||
pattern = re.compile(curr)
|
||||
@@ -453,7 +453,7 @@ def iterateQtVersions(keepOptionsOpen=False, alreadyOnOptionsDialog=False,
|
||||
result.append({target:version})
|
||||
if additionalFunction:
|
||||
try:
|
||||
if isinstance(additionalFunction, (str, unicode)):
|
||||
if isString(additionalFunction):
|
||||
currResult = globals()[additionalFunction](target, version, *argsForAdditionalFunc)
|
||||
else:
|
||||
currResult = additionalFunction(target, version, *argsForAdditionalFunc)
|
||||
@@ -514,7 +514,7 @@ def iterateKits(keepOptionsOpen=False, alreadyOnOptionsDialog=False,
|
||||
currentItem.replace(".", "\\.")])
|
||||
if additionalFunction:
|
||||
try:
|
||||
if isinstance(additionalFunction, (str, unicode)):
|
||||
if isString(additionalFunction):
|
||||
currResult = globals()[additionalFunction](item, kitName, *argsForAdditionalFunc)
|
||||
else:
|
||||
currResult = additionalFunction(item, kitName, *argsForAdditionalFunc)
|
||||
@@ -674,3 +674,10 @@ def getHelpViewer():
|
||||
|
||||
def getHelpTitle():
|
||||
return str(getHelpViewer().title())
|
||||
|
||||
|
||||
def isString(sth):
|
||||
if sys.version_info.major > 2:
|
||||
return isinstance(sth, str)
|
||||
else:
|
||||
return isinstance(sth, (str, unicode))
|
||||
|
@@ -87,7 +87,6 @@ def testRenameId():
|
||||
formerTxt = editor.plainText
|
||||
originalText = originalTexts.get(file).replace("mainView", "renamedView")
|
||||
test.compare(originalText,formerTxt, "Comparing %s" % file.replace("Core.","").replace("\\",""))
|
||||
invokeMenuItem("File","Save All")
|
||||
|
||||
def __invokeFindUsage__(filename, line, additionalKeyPresses, expectedCount):
|
||||
openDocument(focusDocumentPath % filename)
|
||||
|
@@ -46,6 +46,8 @@ def main():
|
||||
expectedHeaderName=headerName)
|
||||
if not testRenameMacroAfterSourceMoving():
|
||||
return
|
||||
# save and exit
|
||||
invokeMenuItem("File", "Save All")
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
||||
def testRenameMacroAfterSourceModification():
|
||||
@@ -156,8 +158,7 @@ def revertChanges(files):
|
||||
simpleName = simpleFileName(f)
|
||||
if openDocument(f):
|
||||
try:
|
||||
invokeMenuItem('File', 'Revert "%s" to Saved' % simpleName)
|
||||
clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton"))
|
||||
invokeMenuItem('Edit', 'Undo')
|
||||
test.log("Reverted changes inside %s" % simpleName)
|
||||
except:
|
||||
test.warning("File '%s' cannot be reverted." % simpleName,
|
||||
|
@@ -306,7 +306,7 @@ def __compareCompilers__(foundCompilers, expectedCompilers):
|
||||
if isinstance(currentFound, dict):
|
||||
foundExp = False
|
||||
for currentExp in expectedCompilers:
|
||||
if isinstance(currentExp, (str, unicode)):
|
||||
if isString(currentExp):
|
||||
continue
|
||||
key = currentExp.keys()[0]
|
||||
# special case for (fuzzy) regex comparison on Windows (internal LLVM)
|
||||
@@ -353,7 +353,7 @@ def __compareDebuggers__(foundDebuggers, expectedDebuggers):
|
||||
|
||||
def __lowerStrs__(iterable):
|
||||
for it in iterable:
|
||||
if isinstance(it, (str, unicode)):
|
||||
if isString(it):
|
||||
yield it.lower()
|
||||
else:
|
||||
yield it
|
||||
|