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