QmlDesigner: Add QML source
This adds the QML source for the Qt Design Studio Welcome page. The source code was private before. Change-Id: I5dcb900ed9a17b1bc3bbcaf50f649ebeb61cc8bf Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
64
share/qtcreator/qmldesigner/welcomepage/BrandBar.qml
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: brandBar
|
||||||
|
width: 850
|
||||||
|
height: 150
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: brandIcon
|
||||||
|
width: 100
|
||||||
|
height: 100
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
source: "images/ds.png"
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: welcomeTo
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: qsTr("Welcome to")
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.left: brandIcon.right
|
||||||
|
anchors.leftMargin: 5
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
font.pixelSize: 36
|
||||||
|
font.family: "titillium web"
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: brandLabel
|
||||||
|
color: Constants.currentBrand
|
||||||
|
text: qsTr("Qt Design Studio")
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.left: welcomeTo.right
|
||||||
|
anchors.leftMargin: 8
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
font.pixelSize: 36
|
||||||
|
font.family: "titillium web"
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
width: 291
|
||||||
|
height: 55
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: {
|
||||||
|
if (Constants.communityEdition)
|
||||||
|
return qsTr("Community Edition")
|
||||||
|
if (Constants.enterpriseEdition)
|
||||||
|
return qsTr("Enterprise Edition")
|
||||||
|
return qsTr("Professional Edition")
|
||||||
|
}
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.left: brandLabel.right
|
||||||
|
anchors.leftMargin: 8
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
font.pixelSize: 36
|
||||||
|
font.family: "titillium web"
|
||||||
|
}
|
||||||
|
}
|
108
share/qtcreator/qmldesigner/welcomepage/CheckButton.ui.qml
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Templates
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: control
|
||||||
|
|
||||||
|
implicitWidth: Math.max(
|
||||||
|
buttonBackground ? buttonBackground.implicitWidth : 0,
|
||||||
|
textItem.implicitWidth + leftPadding + rightPadding)
|
||||||
|
implicitHeight: Math.max(
|
||||||
|
buttonBackground ? buttonBackground.implicitHeight : 0,
|
||||||
|
textItem.implicitHeight + topPadding + bottomPadding)
|
||||||
|
leftPadding: 4
|
||||||
|
rightPadding: 4
|
||||||
|
|
||||||
|
text: "My Button"
|
||||||
|
checkable: true
|
||||||
|
state: "normal"
|
||||||
|
|
||||||
|
property bool decorated: false
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
id: buttonBackground
|
||||||
|
color: "#00000000"
|
||||||
|
implicitWidth: 100
|
||||||
|
implicitHeight: 40
|
||||||
|
opacity: buttonBackground.enabled ? 1 : 0.3
|
||||||
|
radius: 2
|
||||||
|
border.color: "#047eff"
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: Text {
|
||||||
|
id: textItem
|
||||||
|
text: control.text
|
||||||
|
font.pixelSize: 18
|
||||||
|
opacity: textItem.enabled ? 1.0 : 0.3
|
||||||
|
color: "#047eff"
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: decoration
|
||||||
|
width: 10
|
||||||
|
visible: control.decorated
|
||||||
|
color: Constants.currentBrand
|
||||||
|
border.color: Constants.currentBrand
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.rightMargin: 1
|
||||||
|
anchors.bottomMargin: 1
|
||||||
|
anchors.topMargin: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "normal"
|
||||||
|
when: !control.down && !control.hovered && !control.checked
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: buttonBackground
|
||||||
|
color: Constants.currentPushButtonNormalBackground
|
||||||
|
border.color: Constants.currentPushButtonNormalOutline
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: textItem
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: control.hovered && !control.checked && !control.down
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: textItem
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: buttonBackground
|
||||||
|
color: Constants.currentPushButtonHoverBackground
|
||||||
|
border.color: Constants.currentPushButtonHoverOutline
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "active"
|
||||||
|
when: control.checked || control.down
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: textItem
|
||||||
|
color: Constants.darkActiveGlobalText
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: buttonBackground
|
||||||
|
color: Constants.currentBrand
|
||||||
|
border.color: "#00000000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
42
share/qtcreator/qmldesigner/welcomepage/CustomDialog.qml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Dialog {
|
||||||
|
id: root
|
||||||
|
padding: 12
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
color: Constants.currentDialogBackground
|
||||||
|
border.color: Constants.currentDialogBorder
|
||||||
|
border.width: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
header: Label {
|
||||||
|
text: root.title
|
||||||
|
visible: root.title
|
||||||
|
elide: Label.ElideRight
|
||||||
|
font.bold: true
|
||||||
|
padding: 12
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
x: 1
|
||||||
|
y: 1
|
||||||
|
width: parent.width - 2
|
||||||
|
height: parent.height - 1
|
||||||
|
color: Constants.currentDialogBackground
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
footer: CustomDialogButtonBox {
|
||||||
|
visible: count > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Overlay.modal: Rectangle {
|
||||||
|
color: Color.transparent(Constants.currentDialogBackground, 0.5)
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,25 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
DialogButtonBox {
|
||||||
|
id: root
|
||||||
|
padding: 12
|
||||||
|
alignment: Qt.AlignRight | Qt.AlignBottom
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
implicitHeight: 40
|
||||||
|
x: 1
|
||||||
|
y: 1
|
||||||
|
width: parent.width - 2
|
||||||
|
height: parent.height - 2
|
||||||
|
color: Constants.currentDialogBackground
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate: DialogButton {
|
||||||
|
width: root.count === 1 ? root.availableWidth / 2 : undefined
|
||||||
|
}
|
||||||
|
}
|
41
share/qtcreator/qmldesigner/welcomepage/CustomGrid.qml
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import DataModels 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: gridContainer
|
||||||
|
width: 1460
|
||||||
|
height: 760
|
||||||
|
|
||||||
|
property alias hover: scrollView.outsideHover
|
||||||
|
property alias model: gridView.model
|
||||||
|
property alias delegate: gridView.delegate
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: gridContainer
|
||||||
|
onWidthChanged: Constants.responsiveResize(gridContainer.width)
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomScrollView {
|
||||||
|
id: scrollView
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
GridView {
|
||||||
|
id: gridView
|
||||||
|
clip: true
|
||||||
|
anchors.fill: parent
|
||||||
|
rightMargin: -Constants.gridSpacing
|
||||||
|
bottomMargin: -Constants.gridSpacing
|
||||||
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
|
cellWidth: Constants.gridCellSize
|
||||||
|
cellHeight: Constants.gridCellSize
|
||||||
|
|
||||||
|
model: ExamplesModel {}
|
||||||
|
delegate: ThumbnailDelegate {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
98
share/qtcreator/qmldesigner/welcomepage/CustomScrollBar.qml
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Templates as T
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import StudioTheme 1.0 as StudioTheme
|
||||||
|
|
||||||
|
T.ScrollBar {
|
||||||
|
id: control
|
||||||
|
|
||||||
|
property bool show: false
|
||||||
|
property bool otherInUse: false
|
||||||
|
property bool isNeeded: control.size < 1.0
|
||||||
|
property bool inUse: control.hovered || control.pressed
|
||||||
|
property int thickness: control.inUse || control.otherInUse ? 10 : 8
|
||||||
|
|
||||||
|
property bool scrollBarVisible: parent.childrenRect.height > parent.height
|
||||||
|
|
||||||
|
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
|
||||||
|
implicitContentWidth + leftPadding + rightPadding)
|
||||||
|
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
|
||||||
|
implicitContentHeight + topPadding + bottomPadding)
|
||||||
|
|
||||||
|
hoverEnabled: true
|
||||||
|
padding: 0
|
||||||
|
minimumSize: orientation === Qt.Horizontal ? height / width : width / height
|
||||||
|
|
||||||
|
opacity: 0.0
|
||||||
|
|
||||||
|
contentItem: Rectangle {
|
||||||
|
implicitWidth: control.thickness
|
||||||
|
implicitHeight: control.thickness
|
||||||
|
radius: width / 2
|
||||||
|
color: control.inUse ? Constants.currentScrollBarHandle
|
||||||
|
: Constants.currentScrollBarHandle_idle
|
||||||
|
}
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
id: controlTrack
|
||||||
|
color: Constants.currentScrollBarTrack
|
||||||
|
opacity: control.inUse || control.otherInUse ? 0.3 : 0.0
|
||||||
|
radius: width / 2
|
||||||
|
|
||||||
|
Behavior on opacity {
|
||||||
|
PropertyAnimation {
|
||||||
|
duration: 100
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "show"
|
||||||
|
when: control.show
|
||||||
|
PropertyChanges {
|
||||||
|
target: control
|
||||||
|
opacity: 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hide"
|
||||||
|
when: !control.show
|
||||||
|
PropertyChanges {
|
||||||
|
target: control
|
||||||
|
opacity: 0.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
transitions: Transition {
|
||||||
|
from: "show"
|
||||||
|
SequentialAnimation {
|
||||||
|
PauseAnimation { duration: 450 }
|
||||||
|
NumberAnimation {
|
||||||
|
target: control
|
||||||
|
duration: 200
|
||||||
|
property: "opacity"
|
||||||
|
to: 0.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Behavior on thickness {
|
||||||
|
PropertyAnimation {
|
||||||
|
duration: 100
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Behavior on x {
|
||||||
|
PropertyAnimation {
|
||||||
|
duration: 100
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
share/qtcreator/qmldesigner/welcomepage/CustomScrollView.qml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Templates as T
|
||||||
|
|
||||||
|
T.ScrollView {
|
||||||
|
id: control
|
||||||
|
|
||||||
|
property bool outsideHover: false
|
||||||
|
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
T.ScrollBar.vertical: CustomScrollBar {
|
||||||
|
id: verticalScrollBar
|
||||||
|
parent: control
|
||||||
|
x: control.width + (verticalScrollBar.inUse ? 4 : 5)
|
||||||
|
y: control.topPadding
|
||||||
|
height: control.availableHeight
|
||||||
|
orientation: Qt.Vertical
|
||||||
|
|
||||||
|
show: (control.hovered || control.focus || control.outsideHover)
|
||||||
|
&& verticalScrollBar.isNeeded
|
||||||
|
}
|
||||||
|
}
|
89
share/qtcreator/qmldesigner/welcomepage/DialogButton.qml
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Templates
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
implicitWidth: Math.max(
|
||||||
|
background ? background.implicitWidth : 0,
|
||||||
|
textItem.implicitWidth + leftPadding + rightPadding)
|
||||||
|
implicitHeight: Math.max(
|
||||||
|
background ? background.implicitHeight : 0,
|
||||||
|
textItem.implicitHeight + topPadding + bottomPadding)
|
||||||
|
leftPadding: 4
|
||||||
|
rightPadding: 4
|
||||||
|
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
id: background
|
||||||
|
implicitWidth: 80
|
||||||
|
implicitHeight: 20
|
||||||
|
opacity: enabled ? 1 : 0.3
|
||||||
|
radius: 2
|
||||||
|
color: Constants.currentPushButtonNormalBackground
|
||||||
|
border.color: Constants.currentPushButtonNormalOutline
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: Text {
|
||||||
|
id: textItem
|
||||||
|
text: root.text
|
||||||
|
font.pixelSize: 12
|
||||||
|
opacity: enabled ? 1.0 : 0.3
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "default"
|
||||||
|
when: !root.down && !root.hovered && !root.checked
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
color: Constants.currentPushButtonNormalBackground
|
||||||
|
border.color: Constants.currentPushButtonNormalOutline
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: textItem
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: root.hovered && !root.checked && !root.down
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: textItem
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
color: Constants.currentPushButtonHoverBackground
|
||||||
|
border.color: Constants.currentPushButtonHoverOutline
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "active"
|
||||||
|
when: root.checked || root.down
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: textItem
|
||||||
|
color: Constants.currentActiveGlobalText
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
color: Constants.currentBrand
|
||||||
|
border.color: "#00000000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
134
share/qtcreator/qmldesigner/welcomepage/DownloadButton.qml
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import StudioTheme 1.0 as StudioTheme
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
width: 30
|
||||||
|
height: 30
|
||||||
|
state: "default"
|
||||||
|
|
||||||
|
property bool dowloadPressed: false
|
||||||
|
property bool isHovered: mouseArea.containsMouse
|
||||||
|
|
||||||
|
property bool globalHover: false
|
||||||
|
|
||||||
|
property bool alreadyDownloaded: false
|
||||||
|
property bool updateAvailable: false
|
||||||
|
property bool downloadUnavailable: false
|
||||||
|
|
||||||
|
signal downloadClicked()
|
||||||
|
|
||||||
|
property color currentColor: {
|
||||||
|
if (root.updateAvailable)
|
||||||
|
return Constants.amberLight
|
||||||
|
if (root.alreadyDownloaded)
|
||||||
|
return Constants.greenLight
|
||||||
|
if (root.downloadUnavailable)
|
||||||
|
return Constants.redLight
|
||||||
|
|
||||||
|
return Constants.currentGlobalText
|
||||||
|
}
|
||||||
|
|
||||||
|
property string currentIcon: {
|
||||||
|
if (root.updateAvailable)
|
||||||
|
return StudioTheme.Constants.downloadUpdate
|
||||||
|
if (root.alreadyDownloaded)
|
||||||
|
return StudioTheme.Constants.downloaded
|
||||||
|
if (root.downloadUnavailable)
|
||||||
|
return StudioTheme.Constants.downloadUnavailable
|
||||||
|
|
||||||
|
return StudioTheme.Constants.download
|
||||||
|
}
|
||||||
|
|
||||||
|
property string currentToolTipText: {
|
||||||
|
if (root.updateAvailable)
|
||||||
|
return qsTr("Update available.")
|
||||||
|
if (root.alreadyDownloaded)
|
||||||
|
return qsTr("Example was already downloaded.")
|
||||||
|
if (root.downloadUnavailable)
|
||||||
|
return qsTr("Network or example is not available or the link is broken.")
|
||||||
|
|
||||||
|
return qsTr("Download the example.")
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: downloadIcon
|
||||||
|
color: root.currentColor
|
||||||
|
font.family: StudioTheme.Constants.iconFont.family
|
||||||
|
text: root.currentIcon
|
||||||
|
anchors.fill: parent
|
||||||
|
font.pixelSize: 22
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
anchors.bottomMargin: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
propagateComposedEvents: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
onClicked: root.downloadClicked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolTip {
|
||||||
|
id: toolTip
|
||||||
|
y: -toolTip.height
|
||||||
|
visible: mouseArea.containsMouse
|
||||||
|
text: root.currentToolTipText
|
||||||
|
delay: 1000
|
||||||
|
height: 20
|
||||||
|
background: Rectangle {
|
||||||
|
color: Constants.currentToolTipBackground
|
||||||
|
border.color: Constants.currentToolTipOutline
|
||||||
|
border.width: 1
|
||||||
|
}
|
||||||
|
contentItem: Text {
|
||||||
|
color: Constants.currentToolTipText
|
||||||
|
text: toolTip.text
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "default"
|
||||||
|
when: !mouseArea.pressed && !mouseArea.containsMouse && !root.globalHover
|
||||||
|
PropertyChanges {
|
||||||
|
target: downloadIcon
|
||||||
|
color: root.currentColor
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "pressed"
|
||||||
|
when: mouseArea.pressed && mouseArea.containsMouse
|
||||||
|
PropertyChanges {
|
||||||
|
target: downloadIcon
|
||||||
|
color: Constants.currentBrand
|
||||||
|
scale: 1.2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: mouseArea.containsMouse && !mouseArea.pressed && !root.globalHover
|
||||||
|
PropertyChanges {
|
||||||
|
target: downloadIcon
|
||||||
|
scale: 1.2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "globalHover"
|
||||||
|
extend: "hover"
|
||||||
|
when: root.globalHover && !mouseArea.pressed && !mouseArea.containsMouse
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
79
share/qtcreator/qmldesigner/welcomepage/DownloadPanel.qml
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
color: Constants.currentNormalThumbnailBackground
|
||||||
|
|
||||||
|
property alias value: progressBar.value
|
||||||
|
property alias text: progressLabel.text
|
||||||
|
property alias allowCancel: progressBar.closeButtonVisible
|
||||||
|
|
||||||
|
readonly property int pixelSize: 12
|
||||||
|
readonly property int textMargin: 5
|
||||||
|
|
||||||
|
signal cancelRequested
|
||||||
|
|
||||||
|
DownloadProgressBar {
|
||||||
|
id: progressBar
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: pushButton.top
|
||||||
|
anchors.bottomMargin: 40
|
||||||
|
anchors.rightMargin: 10
|
||||||
|
anchors.leftMargin: 10
|
||||||
|
|
||||||
|
onCancelRequested: root.cancelRequested()
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: progressLabel
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: qsTr("Progress:")
|
||||||
|
anchors.top: parent.bottom
|
||||||
|
anchors.topMargin: root.textMargin
|
||||||
|
anchors.left: parent.left
|
||||||
|
font.pixelSize: root.pixelSize
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: progressAmount
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: stringMapper.text
|
||||||
|
anchors.top: parent.bottom
|
||||||
|
anchors.topMargin: root.textMargin
|
||||||
|
anchors.right: percentSign.left
|
||||||
|
anchors.rightMargin: root.textMargin
|
||||||
|
font.pixelSize: root.pixelSize
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: percentSign
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: qsTr("%")
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.bottom
|
||||||
|
anchors.topMargin: root.textMargin
|
||||||
|
font.pixelSize: root.pixelSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PushButton {
|
||||||
|
id: pushButton
|
||||||
|
y: 177
|
||||||
|
visible: progressBar.downloadFinished
|
||||||
|
text: qsTr("Open")
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.bottomMargin: 40
|
||||||
|
}
|
||||||
|
|
||||||
|
StringMapper {
|
||||||
|
id: stringMapper
|
||||||
|
decimals: 1
|
||||||
|
input: root.value
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,80 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import StudioTheme as StudioTheme
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: progressBar
|
||||||
|
width: 272
|
||||||
|
height: 25
|
||||||
|
property bool downloadFinished: false
|
||||||
|
property int value: 0
|
||||||
|
property bool closeButtonVisible
|
||||||
|
//property alias numberAnimationRunning: numberAnimation.running
|
||||||
|
|
||||||
|
readonly property int margin: 4
|
||||||
|
|
||||||
|
signal cancelRequested
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: progressBarGroove
|
||||||
|
color: Constants.currentNormalThumbnailLabelBackground
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: progressBarTrack
|
||||||
|
width: progressBar.value * ((progressBar.width - closeButton.width) - 2 * progressBar.margin) / 100
|
||||||
|
color: Constants.currentBrand
|
||||||
|
border.color: "#002e769e"
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.margins: progressBar.margin
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: closeButton
|
||||||
|
visible: progressBar.closeButtonVisible
|
||||||
|
width: 20
|
||||||
|
text: StudioTheme.Constants.closeCross
|
||||||
|
color: Constants.currentBrand
|
||||||
|
horizontalAlignment: Qt.AlignHCenter
|
||||||
|
verticalAlignment: Qt.AlignVCenter
|
||||||
|
font.family: StudioTheme.Constants.iconFont.family
|
||||||
|
font.pixelSize: StudioTheme.Values.myIconFontSize
|
||||||
|
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.margins: progressBar.margin
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: {
|
||||||
|
progressBar.cancelRequested()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
NumberAnimation {
|
||||||
|
id: numberAnimation
|
||||||
|
target: progressBarTrack
|
||||||
|
property: "width"
|
||||||
|
duration: 2500
|
||||||
|
easing.bezierCurve: [0.197,0.543,0.348,0.279,0.417,0.562,0.437,0.757,0.548,0.731,0.616,0.748,0.728,0.789,0.735,0.982,1,1]
|
||||||
|
alwaysRunToEnd: true
|
||||||
|
to: progressBar.width
|
||||||
|
from: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: numberAnimation
|
||||||
|
onFinished: progressBar.downloadFinished = true
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
166
share/qtcreator/qmldesigner/welcomepage/MainGridStack.qml
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import projectmodel 1.0
|
||||||
|
import DataModels 1.0
|
||||||
|
import UiTour
|
||||||
|
import StudioControls as StudioControls
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: thumbnails
|
||||||
|
width: 1500
|
||||||
|
height: 800
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
property alias stackLayoutCurrentIndex: gridStackLayout.currentIndex
|
||||||
|
property var projectModel: Constants.projectModel
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: thumbnailGridBack
|
||||||
|
color: Constants.currentThumbnailGridBackground
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
HoverHandler { id: hoverHandler }
|
||||||
|
|
||||||
|
StackLayout {
|
||||||
|
id: gridStackLayout
|
||||||
|
visible: !Constants.isListView
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: Constants.gridMargins
|
||||||
|
currentIndex: 0
|
||||||
|
|
||||||
|
CustomGrid {
|
||||||
|
id: recentGrid
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
hover: hoverHandler.hovered
|
||||||
|
model: thumbnails.projectModel
|
||||||
|
delegate: ThumbnailDelegate {
|
||||||
|
id: delegate
|
||||||
|
type: ThumbnailDelegate.Type.RecentProject
|
||||||
|
hasPath: true
|
||||||
|
thumbnailPlaceholderSource: previewUrl
|
||||||
|
onClicked: projectModel.openProjectAt(index)
|
||||||
|
onRightClicked: {
|
||||||
|
removeMenuItem.index = index
|
||||||
|
contextMenu.popup(delegate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: qsTr("Create a new project using the \"<b>Create Project</b>\" or open an existing project using the \"<b>Open Project</b>\" option. ")
|
||||||
|
font.pixelSize: 18
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: recentGrid.width
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
leftPadding: 20
|
||||||
|
rightPadding: 20
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
visible: projectModel.count === 0
|
||||||
|
}
|
||||||
|
|
||||||
|
StudioControls.Menu {
|
||||||
|
id: contextMenu
|
||||||
|
|
||||||
|
StudioControls.MenuItem {
|
||||||
|
id: removeMenuItem
|
||||||
|
|
||||||
|
property int index: -1
|
||||||
|
|
||||||
|
text: qsTr("Remove Project from Recent Projects")
|
||||||
|
onTriggered: projectModel.removeFromRecentProjects(removeMenuItem.index)
|
||||||
|
}
|
||||||
|
|
||||||
|
StudioControls.MenuItem {
|
||||||
|
text: qsTr("Clear Recent Project List")
|
||||||
|
onTriggered: projectModel.clearRecentProjects()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomGrid {
|
||||||
|
id: examplesGrid
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
hover: hoverHandler.hovered
|
||||||
|
model: ExamplesModel { id: examplesModel}
|
||||||
|
delegate: ThumbnailDelegate {
|
||||||
|
type: ThumbnailDelegate.Type.Example
|
||||||
|
downloadable: showDownload
|
||||||
|
hasUpdate: showUpdate
|
||||||
|
downloadUrl: url
|
||||||
|
thumbnailPlaceholderSource: examplesModel.resolveUrl(thumbnail)
|
||||||
|
onClicked: projectModel.openExample(targetPath,
|
||||||
|
projectName,
|
||||||
|
qmlFileName,
|
||||||
|
explicitQmlproject)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomGrid {
|
||||||
|
id: tutorialsGrid
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
hover: hoverHandler.hovered
|
||||||
|
model: TutorialsModel { id: tutorialsModel}
|
||||||
|
delegate: ThumbnailDelegate {
|
||||||
|
type: ThumbnailDelegate.Type.Tutorial
|
||||||
|
thumbnailPlaceholderSource: tutorialsModel.resolveUrl(thumbnail)
|
||||||
|
onClicked: Qt.openUrlExternally(url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomGrid {
|
||||||
|
id: tourGrid
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
hover: hoverHandler.hovered
|
||||||
|
model: TourModel {}
|
||||||
|
delegate: TourThumbnailDelegate {
|
||||||
|
id: thumbnailDelegate
|
||||||
|
visible: !slidePlayer.visible
|
||||||
|
enabled: !slidePlayer.visible
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: thumbnailDelegate
|
||||||
|
onClicked: tourGrid.startTour(qmlFileName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function startTour(url) {
|
||||||
|
slidePlayer.visible = true
|
||||||
|
slidePlayer.slideSource = Qt.resolvedUrl(url)
|
||||||
|
}
|
||||||
|
|
||||||
|
SlidePlayer {
|
||||||
|
id: slidePlayer
|
||||||
|
anchors.fill: parent
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
TourDialogButton {
|
||||||
|
id: closeButton
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.rightMargin: 16
|
||||||
|
anchors.topMargin: 16
|
||||||
|
visible: slidePlayer.visible
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: closeButton
|
||||||
|
onButtonClicked: {
|
||||||
|
slidePlayer.visible = false
|
||||||
|
slidePlayer.loaderActive = false
|
||||||
|
slidePlayer.loaderActive = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
318
share/qtcreator/qmldesigner/welcomepage/MainScreen.qml
Normal file
@@ -0,0 +1,318 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import projectmodel 1.0
|
||||||
|
import DataModels 1.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: appBackground
|
||||||
|
height: Constants.height
|
||||||
|
color: Constants.currentThemeBackground
|
||||||
|
width: 1842
|
||||||
|
//anchors.fill: parent //this is required to make it responsive but commented out to force minimum size to work
|
||||||
|
property int pageIndex: 0
|
||||||
|
property bool designMode: !(typeof (Constants.projectModel.designMode) === "undefined")
|
||||||
|
|
||||||
|
signal openUiTour
|
||||||
|
signal closeUiTour
|
||||||
|
|
||||||
|
function uiTourClosed() {
|
||||||
|
recentProjects.checked = true
|
||||||
|
}
|
||||||
|
|
||||||
|
TestControlPanel {
|
||||||
|
id: controlPanel
|
||||||
|
x: 1644
|
||||||
|
width: 220
|
||||||
|
height: 127
|
||||||
|
visible: appBackground.designMode
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 15
|
||||||
|
anchors.rightMargin: 56
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: openCreatelayout
|
||||||
|
y: 150
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: thumbnails.left
|
||||||
|
anchors.rightMargin: 20
|
||||||
|
spacing: 15
|
||||||
|
anchors.leftMargin: 20
|
||||||
|
|
||||||
|
PushButton {
|
||||||
|
id: createProject
|
||||||
|
height: 50
|
||||||
|
text: qsTr("Create Project ...")
|
||||||
|
|
||||||
|
Layout.maximumHeight: 75
|
||||||
|
Layout.minimumHeight: 25
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 50
|
||||||
|
decorated: true
|
||||||
|
onClicked: Constants.projectModel.createProject()
|
||||||
|
}
|
||||||
|
|
||||||
|
PushButton {
|
||||||
|
id: openProject
|
||||||
|
height: 50
|
||||||
|
text: qsTr("Open Project ...")
|
||||||
|
|
||||||
|
Layout.maximumHeight: 75
|
||||||
|
Layout.minimumHeight: 25
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 50
|
||||||
|
decorated: true
|
||||||
|
onClicked: Constants.projectModel.openProject()
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: newQtLabel
|
||||||
|
width: 266
|
||||||
|
height: 40
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: qsTr("New to Qt?")
|
||||||
|
font.pixelSize: 24
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
PushButton {
|
||||||
|
id: getStarted
|
||||||
|
height: 50
|
||||||
|
text: qsTr("Get Started")
|
||||||
|
Layout.maximumHeight: 75
|
||||||
|
Layout.minimumHeight: 25
|
||||||
|
Layout.preferredHeight: 50
|
||||||
|
Layout.fillWidth: true
|
||||||
|
onClicked: Constants.projectModel.showHelp()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: currentPageMenuLayout
|
||||||
|
y: 422
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: thumbnails.left
|
||||||
|
anchors.rightMargin: 20
|
||||||
|
anchors.leftMargin: 20
|
||||||
|
spacing: 15
|
||||||
|
|
||||||
|
CheckButton {
|
||||||
|
id: recentProjects
|
||||||
|
text: qsTr("Recent Projects")
|
||||||
|
autoExclusive: true
|
||||||
|
checked: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: recentProjects
|
||||||
|
function onClicked(mouse) { appBackground.pageIndex = 0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckButton {
|
||||||
|
id: examples
|
||||||
|
text: qsTr("Examples")
|
||||||
|
autoExclusive: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: examples
|
||||||
|
function onClicked(mouse) { appBackground.pageIndex = 1 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckButton {
|
||||||
|
id: tutorials
|
||||||
|
text: qsTr("Tutorials")
|
||||||
|
autoExclusive: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: tutorials
|
||||||
|
function onClicked(mouse) { appBackground.pageIndex = 2 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckButton {
|
||||||
|
id: tours
|
||||||
|
text: qsTr("UI Tour")
|
||||||
|
autoExclusive: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: tours
|
||||||
|
function onClicked(mouse) { appBackground.pageIndex = 3 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BrandBar {
|
||||||
|
id: brandBar
|
||||||
|
y: 0
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 20
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: loadProgress
|
||||||
|
x: 4
|
||||||
|
y: 120
|
||||||
|
width: Constants.loadingProgress * 10
|
||||||
|
height: 4
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
opacity: Constants.loadingProgress > 90 ? (100 - Constants.loadingProgress) / 10 : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MainGridStack {
|
||||||
|
id: thumbnails
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.topMargin: 150
|
||||||
|
anchors.rightMargin: 56
|
||||||
|
anchors.bottomMargin: 54
|
||||||
|
anchors.leftMargin: 290
|
||||||
|
stackLayoutCurrentIndex: appBackground.pageIndex
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: linkRow
|
||||||
|
y: 1041
|
||||||
|
height: 25
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.leftMargin: 290
|
||||||
|
anchors.rightMargin: 55
|
||||||
|
anchors.bottomMargin: 14
|
||||||
|
spacing: 0
|
||||||
|
|
||||||
|
PushButton {
|
||||||
|
id: userGuide
|
||||||
|
text: qsTr("User Guide")
|
||||||
|
fontpixelSize: 12
|
||||||
|
Layout.minimumWidth: 100
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
Layout.preferredWidth: 200
|
||||||
|
decorated: true
|
||||||
|
onClicked: Qt.openUrlExternally("https://doc.qt.io/qtdesignstudio/")
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 200
|
||||||
|
height: 200
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredWidth: 50
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
}
|
||||||
|
|
||||||
|
PushButton {
|
||||||
|
id: blog
|
||||||
|
text: qsTr("Blog")
|
||||||
|
fontpixelSize: 12
|
||||||
|
Layout.minimumWidth: 100
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
Layout.preferredWidth: 200
|
||||||
|
decorated: true
|
||||||
|
onClicked: Qt.openUrlExternally("https://blog.qt.io/")
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 200
|
||||||
|
height: 200
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredWidth: 50
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
}
|
||||||
|
|
||||||
|
PushButton {
|
||||||
|
id: forums
|
||||||
|
text: qsTr("Forums")
|
||||||
|
fontpixelSize: 12
|
||||||
|
Layout.minimumWidth: 100
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
Layout.preferredWidth: 200
|
||||||
|
decorated: true
|
||||||
|
onClicked: Qt.openUrlExternally("https://forum.qt.io/")
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 200
|
||||||
|
height: 200
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredWidth: 50
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
}
|
||||||
|
|
||||||
|
PushButton {
|
||||||
|
id: account
|
||||||
|
text: qsTr("Account")
|
||||||
|
fontpixelSize: 12
|
||||||
|
Layout.minimumWidth: 100
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
Layout.preferredWidth: 200
|
||||||
|
decorated: true
|
||||||
|
onClicked: Qt.openUrlExternally("https://login.qt.io/login")
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 200
|
||||||
|
height: 200
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredWidth: 50
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
}
|
||||||
|
|
||||||
|
PushButton {
|
||||||
|
id: getQt
|
||||||
|
text: qsTr("Get Qt")
|
||||||
|
fontpixelSize: 12
|
||||||
|
Layout.minimumWidth: 100
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
Layout.preferredWidth: 200
|
||||||
|
decorated: true
|
||||||
|
onClicked: Qt.openUrlExternally("https://www.qt.io/pricing")
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 200
|
||||||
|
height: 200
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredWidth: 50
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
}
|
||||||
|
|
||||||
|
SocialButton {
|
||||||
|
id: social
|
||||||
|
text: ""
|
||||||
|
Layout.minimumWidth: 100
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 25
|
||||||
|
Layout.preferredWidth: 200
|
||||||
|
decorated: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BlogBanner {
|
||||||
|
id: blogBanner
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 20
|
||||||
|
anchors.right: thumbnails.left
|
||||||
|
anchors.rightMargin: 20
|
||||||
|
y: 657
|
||||||
|
}
|
||||||
|
}
|
108
share/qtcreator/qmldesigner/welcomepage/PushButton.ui.qml
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Templates
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: control
|
||||||
|
|
||||||
|
implicitWidth: Math.max(
|
||||||
|
buttonBackground ? buttonBackground.implicitWidth : 0,
|
||||||
|
textItem.implicitWidth + leftPadding + rightPadding)
|
||||||
|
implicitHeight: Math.max(
|
||||||
|
buttonBackground ? buttonBackground.implicitHeight : 0,
|
||||||
|
textItem.implicitHeight + topPadding + bottomPadding)
|
||||||
|
leftPadding: 4
|
||||||
|
rightPadding: 4
|
||||||
|
|
||||||
|
text: "My Button"
|
||||||
|
state: "normal"
|
||||||
|
|
||||||
|
property alias fontpixelSize: textItem.font.pixelSize
|
||||||
|
property bool decorated: false
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
id: buttonBackground
|
||||||
|
color: "#00000000"
|
||||||
|
implicitWidth: 100
|
||||||
|
implicitHeight: 40
|
||||||
|
opacity: buttonBackground.enabled ? 1 : 0.3
|
||||||
|
radius: 2
|
||||||
|
border.color: "#047eff"
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: Text {
|
||||||
|
id: textItem
|
||||||
|
text: control.text
|
||||||
|
font.pixelSize: 18
|
||||||
|
opacity: textItem.enabled ? 1.0 : 0.3
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: decoration
|
||||||
|
width: 10
|
||||||
|
visible: control.decorated
|
||||||
|
color: Constants.currentBrand
|
||||||
|
border.color: Constants.currentBrand
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.rightMargin: 1
|
||||||
|
anchors.bottomMargin: 1
|
||||||
|
anchors.topMargin: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "normal"
|
||||||
|
when: !control.down && !control.hovered
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: buttonBackground
|
||||||
|
color: Constants.currentPushButtonNormalBackground
|
||||||
|
border.color: Constants.currentPushButtonNormalOutline
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: textItem
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: control.hovered && !control.down
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: textItem
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: buttonBackground
|
||||||
|
color: Constants.currentPushButtonHoverBackground
|
||||||
|
border.color: Constants.currentPushButtonHoverOutline
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "press"
|
||||||
|
when: control.down
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: textItem
|
||||||
|
color: Constants.darkActiveGlobalText
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: buttonBackground
|
||||||
|
color: Constants.currentBrand
|
||||||
|
border.color: "#00000000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
42
share/qtcreator/qmldesigner/welcomepage/RangeMapper.qml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
id: object
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The input value.
|
||||||
|
*/
|
||||||
|
property real input: 0
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The output value.
|
||||||
|
*/
|
||||||
|
property real output: {
|
||||||
|
var slope = (object.outputMaximum - object.outputMinimum) / (object.inputMaximum - object.inputMinimum)
|
||||||
|
return object.outputMinimum + slope * (object.input - object.inputMinimum)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The minimum input value.
|
||||||
|
*/
|
||||||
|
property real inputMinimum: 0
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The maximum input value.
|
||||||
|
*/
|
||||||
|
property real inputMaximum: 100
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The minimum output value.
|
||||||
|
*/
|
||||||
|
property real outputMinimum: 0
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The maximum output value.
|
||||||
|
*/
|
||||||
|
property real outputMaximum: 100
|
||||||
|
|
||||||
|
}
|
129
share/qtcreator/qmldesigner/welcomepage/SocialButton.qml
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Templates
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: control
|
||||||
|
|
||||||
|
implicitWidth: Math.max(
|
||||||
|
buttonBackground ? buttonBackground.implicitWidth : 0,
|
||||||
|
textItem.implicitWidth + leftPadding + rightPadding)
|
||||||
|
implicitHeight: Math.max(
|
||||||
|
buttonBackground ? buttonBackground.implicitHeight : 0,
|
||||||
|
textItem.implicitHeight + topPadding + bottomPadding)
|
||||||
|
leftPadding: 4
|
||||||
|
rightPadding: 4
|
||||||
|
|
||||||
|
text: ""
|
||||||
|
visible: true
|
||||||
|
state: "normal"
|
||||||
|
|
||||||
|
property alias fontpixelSize: textItem.font.pixelSize
|
||||||
|
property bool decorated: false
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
id: buttonBackground
|
||||||
|
color: "#fca4a4"
|
||||||
|
implicitWidth: 100
|
||||||
|
implicitHeight: 40
|
||||||
|
opacity: buttonBackground.enabled ? 1 : 0.3
|
||||||
|
radius: 2
|
||||||
|
border.color: "#047eff"
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: Text {
|
||||||
|
id: textItem
|
||||||
|
visible: false
|
||||||
|
text: qsTr("Text")
|
||||||
|
font.pixelSize: 12
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: decoration
|
||||||
|
width: 10
|
||||||
|
visible: control.decorated
|
||||||
|
color: Constants.currentBrand
|
||||||
|
border.color: Constants.currentBrand
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.rightMargin: 1
|
||||||
|
anchors.bottomMargin: 1
|
||||||
|
anchors.topMargin: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 200
|
||||||
|
height: 200
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
}
|
||||||
|
|
||||||
|
YoutubeButton {
|
||||||
|
id: youtubeButton
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.preferredWidth: 60
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 200
|
||||||
|
height: 200
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
TwitterButton {
|
||||||
|
id: twitterButton
|
||||||
|
Layout.maximumHeight: 15
|
||||||
|
Layout.minimumHeight: 15
|
||||||
|
Layout.preferredHeight: 15
|
||||||
|
Layout.fillHeight: false
|
||||||
|
Layout.preferredWidth: 25
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 200
|
||||||
|
height: 200
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "normal"
|
||||||
|
when: !youtubeButton.isHovered && !twitterButton.isHovered && !control.hovered
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: buttonBackground
|
||||||
|
color: Constants.currentPushButtonNormalBackground
|
||||||
|
border.color: Constants.currentPushButtonNormalOutline
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: control.hovered || youtubeButton.isHovered || twitterButton.isHovered
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: buttonBackground
|
||||||
|
color: Constants.currentPushButtonHoverBackground
|
||||||
|
border.color: Constants.currentPushButtonHoverOutline
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/*##^##
|
||||||
|
Designer {
|
||||||
|
D{i:0;formeditorZoom:4;height:25;width:207}D{i:3;locked:true}D{i:7}D{i:9}
|
||||||
|
}
|
||||||
|
##^##*/
|
||||||
|
|
68
share/qtcreator/qmldesigner/welcomepage/StringMapper.qml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick 2.10
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype StringMapper
|
||||||
|
\inqmlmodule QtQuick.Studio.LogicHelper
|
||||||
|
\since QtQuick.Studio.LogicHelper 1.0
|
||||||
|
\inherits QtObject
|
||||||
|
|
||||||
|
\brief Converts numbers to strings with the defined precision.
|
||||||
|
|
||||||
|
The StringMapper type maps numbers to strings. The string mapper
|
||||||
|
\l input property is bound to the \c value property of a control that
|
||||||
|
provides the number and the \l text property of the string mapper is
|
||||||
|
mapped to the \c text property of type that displays the string.
|
||||||
|
|
||||||
|
Designers can use the String Mapper type in \QDS instead of writing
|
||||||
|
JavaScript expressions.
|
||||||
|
|
||||||
|
\section1 Example Usage
|
||||||
|
|
||||||
|
In the following example, we use \l Text type to display the numerical
|
||||||
|
value of a \l Slider type as a string:
|
||||||
|
|
||||||
|
\code
|
||||||
|
Rectangle {
|
||||||
|
Slider {
|
||||||
|
id: slider
|
||||||
|
value: 0.5
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
id: text1
|
||||||
|
text: stringMapper.text
|
||||||
|
}
|
||||||
|
StringMapper {
|
||||||
|
id: stringMapper
|
||||||
|
input: slider.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endcode
|
||||||
|
*/
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
id: object
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The value to convert to a string.
|
||||||
|
*/
|
||||||
|
property real input: 0
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The number of digits after the decimal separator.
|
||||||
|
*/
|
||||||
|
property int decimals: 2
|
||||||
|
|
||||||
|
/*!
|
||||||
|
The \l input value as a string.
|
||||||
|
*/
|
||||||
|
property string text: object.input.toFixed(object.decimals)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*##^##
|
||||||
|
Designer {
|
||||||
|
D{i:0;autoSize:true;height:480;width:640}
|
||||||
|
}
|
||||||
|
##^##*/
|
28
share/qtcreator/qmldesigner/welcomepage/Tag.qml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import QtQuick.Layouts 1.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: tagBackground
|
||||||
|
width: 84
|
||||||
|
height: 15
|
||||||
|
color: Constants.currentBrand
|
||||||
|
visible: tagLabel.text.length
|
||||||
|
|
||||||
|
property alias text: tagLabel.text
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: tagLabel
|
||||||
|
color: Constants.darkActiveGlobalText
|
||||||
|
text: qsTr("tag name")
|
||||||
|
anchors.fill: parent
|
||||||
|
font.pixelSize: 10
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
//font.weight: Font.ExtraLight
|
||||||
|
}
|
||||||
|
}
|
43
share/qtcreator/qmldesigner/welcomepage/TagArea.qml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import QtQuick.Layouts
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
height: (repeater.count > root.columnCount) ? root.tagHeight * 2 + root.tagSpacing
|
||||||
|
: root.tagHeight
|
||||||
|
|
||||||
|
property alias tags: repeater.model
|
||||||
|
// private
|
||||||
|
property int tagWidth: 75
|
||||||
|
property int tagHeight: 25
|
||||||
|
property int tagSpacing: 4
|
||||||
|
|
||||||
|
readonly property int columnCount: 3
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: root
|
||||||
|
onWidthChanged: root.tagWidth = Math.floor((root.width - root.tagSpacing
|
||||||
|
* (root.columnCount - 1)) / root.columnCount)
|
||||||
|
}
|
||||||
|
|
||||||
|
Flow {
|
||||||
|
anchors.fill: parent
|
||||||
|
spacing: root.tagSpacing
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
id: repeater
|
||||||
|
model: ["Qt 6", "Qt for MCU", "3D"]
|
||||||
|
|
||||||
|
Tag {
|
||||||
|
text: modelData
|
||||||
|
width: root.tagWidth
|
||||||
|
height: root.tagHeight
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
153
share/qtcreator/qmldesigner/welcomepage/TestControlPanel.qml
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import StudioTheme 1.0 as Theme
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: controlPanel
|
||||||
|
width: 220
|
||||||
|
height: 80
|
||||||
|
color: "#9b787878"
|
||||||
|
radius: 10
|
||||||
|
|
||||||
|
property bool closeOpen: true
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: closeOpen
|
||||||
|
x: 203
|
||||||
|
color: "#ffffff"
|
||||||
|
text: qsTr("X")
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
font.pixelSize: 12
|
||||||
|
horizontalAlignment: Text.AlignRight
|
||||||
|
anchors.rightMargin: 9
|
||||||
|
anchors.topMargin: 6
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
function onClicked(mouse) { controlPanel.closeOpen = !controlPanel.closeOpen }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: themeSwitchLabel
|
||||||
|
x: 8
|
||||||
|
y: 50
|
||||||
|
color: "#ffffff"
|
||||||
|
text: qsTr("Theme")
|
||||||
|
font.pixelSize: 12
|
||||||
|
horizontalAlignment: Text.AlignRight
|
||||||
|
anchors.rightMargin: 6
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: lightLabel
|
||||||
|
x: 172
|
||||||
|
y: 26
|
||||||
|
color: "#ffffff"
|
||||||
|
text: qsTr("light")
|
||||||
|
font.pixelSize: 12
|
||||||
|
horizontalAlignment: Text.AlignRight
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: darkLabel
|
||||||
|
x: 65
|
||||||
|
y: 26
|
||||||
|
color: "#ffffff"
|
||||||
|
text: qsTr("dark")
|
||||||
|
font.pixelSize: 12
|
||||||
|
horizontalAlignment: Text.AlignRight
|
||||||
|
}
|
||||||
|
|
||||||
|
Slider {
|
||||||
|
id: themeSlider
|
||||||
|
x: 58
|
||||||
|
y: 44
|
||||||
|
width: 145
|
||||||
|
height: 28
|
||||||
|
snapMode: RangeSlider.SnapAlways
|
||||||
|
value: 0
|
||||||
|
from: 0
|
||||||
|
to: 1
|
||||||
|
stepSize: 1
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: themeSlider
|
||||||
|
function onValueChanged(value) { Theme.Values.style = themeSlider.value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: basicCheckBox
|
||||||
|
x: 60
|
||||||
|
y: 79
|
||||||
|
text: qsTr("")
|
||||||
|
checked: true
|
||||||
|
onToggled: { Constants.basic = !Constants.basic }
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: communityCheckBox
|
||||||
|
x: 174
|
||||||
|
y: 79
|
||||||
|
text: qsTr("")
|
||||||
|
checked: false
|
||||||
|
onToggled: { Constants.communityEdition = !Constants.communityEdition }
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: basicEditionLabel
|
||||||
|
x: 8
|
||||||
|
y: 92
|
||||||
|
color: "#ffffff"
|
||||||
|
text: qsTr("Basic")
|
||||||
|
font.pixelSize: 12
|
||||||
|
horizontalAlignment: Text.AlignRight
|
||||||
|
anchors.rightMargin: 6
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: communityEditionLabel
|
||||||
|
x: 116
|
||||||
|
y: 92
|
||||||
|
color: "#ffffff"
|
||||||
|
text: qsTr("Community")
|
||||||
|
font.pixelSize: 12
|
||||||
|
horizontalAlignment: Text.AlignRight
|
||||||
|
anchors.rightMargin: 6
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "open"
|
||||||
|
when: controlPanel.closeOpen
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "close"
|
||||||
|
when: !controlPanel.closeOpen
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: closeOpen
|
||||||
|
text: qsTr("<")
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: controlPanel
|
||||||
|
width: 28
|
||||||
|
height: 26
|
||||||
|
clip: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
630
share/qtcreator/qmldesigner/welcomepage/ThumbnailDelegate.qml
Normal file
@@ -0,0 +1,630 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import ExampleCheckout 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
width: Constants.thumbnailSize
|
||||||
|
height: Constants.thumbnailSize
|
||||||
|
clip: true
|
||||||
|
state: "normal"
|
||||||
|
|
||||||
|
property bool textWrapped: false
|
||||||
|
property bool hasDescription: false
|
||||||
|
property bool hasPath: false
|
||||||
|
property bool hasUpdate: false
|
||||||
|
property bool downloadable: false
|
||||||
|
property int numberOfPanels: 3
|
||||||
|
|
||||||
|
enum Type {
|
||||||
|
RecentProject,
|
||||||
|
Example,
|
||||||
|
Tutorial
|
||||||
|
}
|
||||||
|
|
||||||
|
property int type: ThumbnailDelegate.Type.RecentProject
|
||||||
|
|
||||||
|
property alias projectNameLabelText: projectNameLabel.text
|
||||||
|
property alias projectPathLabelText: projectPathLabel.text
|
||||||
|
property alias thumbnailPlaceholderSource: thumbnailPlaceholder.source
|
||||||
|
|
||||||
|
property alias downloadUrl: downloader.url
|
||||||
|
property alias tempFile: downloader.outputFile
|
||||||
|
property alias completeBaseName: downloader.completeBaseName
|
||||||
|
property alias targetPath: extractor.targetPath
|
||||||
|
|
||||||
|
property alias bannerLabelText: updateText.text
|
||||||
|
|
||||||
|
enum Panel {
|
||||||
|
InBetween,
|
||||||
|
Download,
|
||||||
|
Main,
|
||||||
|
Details
|
||||||
|
}
|
||||||
|
|
||||||
|
property int currentPanel: ThumbnailDelegate.Panel.Main
|
||||||
|
|
||||||
|
signal clicked()
|
||||||
|
signal rightClicked()
|
||||||
|
|
||||||
|
function startDownload() {
|
||||||
|
twirlToDownloadAnimation.start()
|
||||||
|
downloadPanel.text = downloadPanel.downloadText
|
||||||
|
downloadPanel.allowCancel = true
|
||||||
|
downloadPanel.value = Qt.binding(function() { return downloader.progress })
|
||||||
|
downloader.start()
|
||||||
|
mouseArea.enabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function thumbnailClicked() {
|
||||||
|
if (root.type === ThumbnailDelegate.Type.RecentProject
|
||||||
|
|| root.type === ThumbnailDelegate.Type.Tutorial)
|
||||||
|
root.clicked() // open recent project/tutorial
|
||||||
|
|
||||||
|
if (Constants.loadingProgress < 95)
|
||||||
|
return
|
||||||
|
if (root.type === ThumbnailDelegate.Type.Example) {
|
||||||
|
if (root.downloadable
|
||||||
|
&& !downloadButton.alreadyDownloaded
|
||||||
|
&& !downloadButton.downloadUnavailable) {
|
||||||
|
root.startDownload()
|
||||||
|
} else if (downloadButton.alreadyDownloaded) {
|
||||||
|
root.clicked() // open example
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
propagateComposedEvents: true
|
||||||
|
hoverEnabled: true
|
||||||
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
function onClicked(mouse) {
|
||||||
|
if (mouse.button === Qt.RightButton)
|
||||||
|
root.rightClicked()
|
||||||
|
else
|
||||||
|
root.thumbnailClicked(mouse)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomDialog {
|
||||||
|
id: overwriteDialog
|
||||||
|
title: qsTr("Overwrite Example?")
|
||||||
|
standardButtons: Dialog.Yes | Dialog.No
|
||||||
|
modal: true
|
||||||
|
anchors.centerIn: parent
|
||||||
|
|
||||||
|
onAccepted: root.startDownload()
|
||||||
|
|
||||||
|
Text {
|
||||||
|
width: parent.width
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font.pixelSize: 12
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: qsTr("Example already exists.<br>Do you want to replace it?")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: canvas
|
||||||
|
width: Constants.thumbnailSize
|
||||||
|
height: Constants.thumbnailSize * root.numberOfPanels
|
||||||
|
|
||||||
|
DownloadPanel {
|
||||||
|
id: downloadPanel
|
||||||
|
|
||||||
|
height: Constants.thumbnailSize
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: mainPanel.top
|
||||||
|
radius: 10
|
||||||
|
value: downloader.progress
|
||||||
|
|
||||||
|
readonly property string downloadText: qsTr("Downloading...")
|
||||||
|
readonly property string extractText: qsTr("Extracting...")
|
||||||
|
|
||||||
|
onCancelRequested: downloader.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: mainPanel
|
||||||
|
height: Constants.thumbnailSize
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
color: "#ea8c8c"
|
||||||
|
radius: 10
|
||||||
|
|
||||||
|
property bool multiline: (projectNameLabelMetric.width >= projectNameLabel.width)
|
||||||
|
|
||||||
|
TextMetrics {
|
||||||
|
id: projectNameLabelMetric
|
||||||
|
text: projectNameLabel.text
|
||||||
|
font: projectNameLabel.font
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: thumbnailPlaceholder
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.bottomMargin: Constants.imageBottomMargin
|
||||||
|
anchors.rightMargin: Constants.thumbnailMargin
|
||||||
|
anchors.leftMargin: Constants.thumbnailMargin
|
||||||
|
anchors.topMargin: Constants.thumbnailMargin
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
verticalAlignment: Image.AlignTop
|
||||||
|
mipmap: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: projectNameBackground
|
||||||
|
height: mainPanel.multiline && !root.hasPath ? Constants.titleHeightMultiline
|
||||||
|
: Constants.titleHeight
|
||||||
|
color: "#e5b0e4"
|
||||||
|
radius: 3
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: thumbnailPlaceholder.bottom
|
||||||
|
anchors.topMargin: Constants.titleBackgroundTopMargin
|
||||||
|
anchors.leftMargin: Constants.thumbnailMargin
|
||||||
|
anchors.rightMargin: Constants.thumbnailMargin
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: projectNameLabel
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: typeof(displayName) === "undefined" ? projectName : displayName
|
||||||
|
elide: root.hasPath ? Text.ElideMiddle : Text.ElideRight
|
||||||
|
font.pixelSize: 16
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
maximumLineCount: 2
|
||||||
|
clip: false
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.leftMargin: Constants.titleMargin
|
||||||
|
anchors.rightMargin: Constants.titleMargin
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: projectNameMouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
// Only enable the MouseArea if label actually contains text
|
||||||
|
enabled: projectNameLabel.text !== "" ? true : false
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: projectNameMouseArea
|
||||||
|
onClicked: root.thumbnailClicked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolTip {
|
||||||
|
id: projectNameToolTip
|
||||||
|
y: -projectNameToolTip.height
|
||||||
|
visible: projectNameMouseArea.containsMouse && projectNameLabel.truncated
|
||||||
|
text: projectNameLabel.text
|
||||||
|
delay: 1000
|
||||||
|
height: 20
|
||||||
|
background: Rectangle {
|
||||||
|
color: Constants.currentToolTipBackground
|
||||||
|
border.color: Constants.currentToolTipOutline
|
||||||
|
border.width: 1
|
||||||
|
}
|
||||||
|
contentItem: Text {
|
||||||
|
color: Constants.currentToolTipText
|
||||||
|
text: projectNameToolTip.text
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DownloadButton {
|
||||||
|
id: downloadButton
|
||||||
|
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
visible: root.downloadable
|
||||||
|
enabled: !downloadButton.downloadUnavailable
|
||||||
|
|
||||||
|
globalHover: (mouseArea.containsMouse || projectNameMouseArea.containsMouse)
|
||||||
|
&& !downloadButton.alreadyDownloaded
|
||||||
|
&& !downloadButton.downloadUnavailable
|
||||||
|
&& !downloadButton.updateAvailable
|
||||||
|
|
||||||
|
alreadyDownloaded: extractor.targetFolderExists
|
||||||
|
downloadUnavailable: !downloader.available
|
||||||
|
updateAvailable: downloader.lastModified > extractor.birthTime
|
||||||
|
|
||||||
|
FileDownloader {
|
||||||
|
id: downloader
|
||||||
|
downloadEnabled: $dataModel.downloadEnabled()
|
||||||
|
probeUrl: true
|
||||||
|
|
||||||
|
onFinishedChanged: {
|
||||||
|
downloadPanel.text = downloadPanel.extractText
|
||||||
|
downloadPanel.allowCancel = false
|
||||||
|
downloadPanel.value = Qt.binding(function() { return extractor.progress })
|
||||||
|
extractor.extract()
|
||||||
|
}
|
||||||
|
|
||||||
|
onDownloadStarting: {
|
||||||
|
$dataModel.usageStatisticsDownloadExample(downloader.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
onDownloadCanceled: {
|
||||||
|
downloadPanel.text = ""
|
||||||
|
downloadPanel.value = 0
|
||||||
|
twirlToMainAnimation.start()
|
||||||
|
mouseArea.enabled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FileExtractor {
|
||||||
|
id: extractor
|
||||||
|
archiveName: downloader.completeBaseName
|
||||||
|
sourceFile: downloader.outputFile
|
||||||
|
targetPath: $dataModel.targetPath()
|
||||||
|
alwaysCreateDir: true
|
||||||
|
clearTargetPathContents: true
|
||||||
|
onFinishedChanged: {
|
||||||
|
twirlToMainAnimation.start()
|
||||||
|
root.bannerLabelText = qsTr("Recently Downloaded")
|
||||||
|
mouseArea.enabled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: downloadButton
|
||||||
|
onDownloadClicked: {
|
||||||
|
if (downloadButton.alreadyDownloaded) {
|
||||||
|
overwriteDialog.open()
|
||||||
|
} else {
|
||||||
|
if (downloadButton.enabled)
|
||||||
|
root.startDownload()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: $dataModel
|
||||||
|
onTargetPathMustChange: (path) => {
|
||||||
|
extractor.changeTargetPath(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: projectPathLabel
|
||||||
|
visible: root.hasPath
|
||||||
|
color: Constants.currentBrand
|
||||||
|
text: typeof(prettyFilePath) === "undefined" ? "" : prettyFilePath
|
||||||
|
elide: Text.ElideLeft
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
font.pixelSize: 16
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: projectNameBackground.bottom
|
||||||
|
anchors.topMargin: 5
|
||||||
|
anchors.rightMargin: Constants.thumbnailMargin
|
||||||
|
anchors.leftMargin: Constants.thumbnailMargin
|
||||||
|
leftPadding: 5
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: projectPathMouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
// Only enable the MouseArea if label actually contains text
|
||||||
|
enabled: projectPathLabel.text !== ""
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolTip {
|
||||||
|
id: projectPathToolTip
|
||||||
|
y: -projectPathToolTip.height
|
||||||
|
visible: projectPathMouseArea.containsMouse && projectPathLabel.truncated
|
||||||
|
text: projectPathLabel.text
|
||||||
|
delay: 1000
|
||||||
|
height: 20
|
||||||
|
background: Rectangle {
|
||||||
|
color: Constants.currentToolTipBackground
|
||||||
|
border.color: Constants.currentToolTipOutline
|
||||||
|
border.width: 1
|
||||||
|
}
|
||||||
|
contentItem: Text {
|
||||||
|
color: Constants.currentToolTipText
|
||||||
|
text: projectPathToolTip.text
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: updateBackground
|
||||||
|
width: 200
|
||||||
|
height: 25
|
||||||
|
visible: root.bannerLabelText !== ""
|
||||||
|
color: Constants.currentBrand
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 0
|
||||||
|
anchors.rightMargin: Constants.thumbnailMargin
|
||||||
|
anchors.leftMargin: Constants.thumbnailMargin
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: updateText
|
||||||
|
color: Constants.darkActiveGlobalText
|
||||||
|
text: typeof(displayName) === "bannerText" ? "" : bannerText
|
||||||
|
anchors.fill: parent
|
||||||
|
font.pixelSize: 12
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: detailsPanel
|
||||||
|
height: Constants.thumbnailSize
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: mainPanel.bottom
|
||||||
|
color: Constants.currentNormalThumbnailBackground
|
||||||
|
radius: 10
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: recentProjectInfo
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: typeof(description) === "undefined" ? "" : description
|
||||||
|
anchors.fill: parent
|
||||||
|
font.pixelSize: 12
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignTop
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
anchors.margins: Constants.thumbnailMargin
|
||||||
|
anchors.topMargin: 25
|
||||||
|
}
|
||||||
|
|
||||||
|
TagArea {
|
||||||
|
id: tagArea
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.bottomMargin: Constants.thumbnailMargin
|
||||||
|
anchors.rightMargin: Constants.thumbnailMargin
|
||||||
|
anchors.leftMargin: Constants.thumbnailMargin
|
||||||
|
tags: typeof(tagData) === "undefined" ? "" : tagData.split(",")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "normal"
|
||||||
|
when: !mouseArea.containsMouse && !(mouseArea.pressedButtons & Qt.LeftButton)
|
||||||
|
&& !projectPathMouseArea.containsMouse && !projectNameMouseArea.containsMouse
|
||||||
|
&& !downloadButton.isHovered && !twirlButtonDown.isHovered
|
||||||
|
&& !twirlButtonUp.isHovered
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: mainPanel
|
||||||
|
color: Constants.currentNormalThumbnailBackground
|
||||||
|
border.width: 0
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: detailsPanel
|
||||||
|
color: Constants.currentNormalThumbnailBackground
|
||||||
|
border.width: 0
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: projectNameBackground
|
||||||
|
color: Constants.currentNormalThumbnailLabelBackground
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlButtonDown
|
||||||
|
parentHovered: false
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlButtonUp
|
||||||
|
parentHovered: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: (mouseArea.containsMouse || projectPathMouseArea.containsMouse
|
||||||
|
|| projectNameMouseArea.containsMouse || downloadButton.isHovered
|
||||||
|
|| twirlButtonDown.isHovered || twirlButtonUp.isHovered)
|
||||||
|
&& !(mouseArea.pressedButtons & Qt.LeftButton) && !root.hasDescription
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: mainPanel
|
||||||
|
color: Constants.currentHoverThumbnailBackground
|
||||||
|
border.width: 0
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: detailsPanel
|
||||||
|
color: Constants.currentHoverThumbnailBackground
|
||||||
|
border.width: 0
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: projectNameBackground
|
||||||
|
color: Constants.currentHoverThumbnailLabelBackground
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: thumbnailPlaceholder
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlButtonDown
|
||||||
|
parentHovered: true
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlButtonUp
|
||||||
|
parentHovered: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "press"
|
||||||
|
when: (mouseArea.pressedButtons & Qt.LeftButton) && !root.hasDescription
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: mainPanel
|
||||||
|
color: Constants.currentHoverThumbnailBackground
|
||||||
|
border.color: Constants.currentBrand
|
||||||
|
border.width: 2
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: detailsPanel
|
||||||
|
color: Constants.currentHoverThumbnailBackground
|
||||||
|
border.color: Constants.currentBrand
|
||||||
|
border.width: 2
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: projectNameBackground
|
||||||
|
color: Constants.currentBrand
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: thumbnailPlaceholder
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: projectNameLabel
|
||||||
|
color: Constants.darkActiveGlobalText
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hoverDescription"
|
||||||
|
when: mouseArea.containsMouse && !(mouseArea.pressedButtons & Qt.LeftButton)
|
||||||
|
&& root.hasDescription
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: mainPanel
|
||||||
|
color: Constants.currentHoverThumbnailBackground
|
||||||
|
border.width: 0
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: projectNameBackground
|
||||||
|
color: Constants.currentHoverThumbnailLabelBackground
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: thumbnailPlaceholder
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "pressDescription"
|
||||||
|
when: (mouseArea.pressedButtons & Qt.LeftButton) && root.hasDescription
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: mainPanel
|
||||||
|
color: Constants.currentHoverThumbnailBackground
|
||||||
|
border.color: Constants.currentBrand
|
||||||
|
border.width: 2
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: projectNameBackground
|
||||||
|
color: Constants.currentBrand
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: thumbnailPlaceholder
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
TwirlButton {
|
||||||
|
id: twirlButtonDown
|
||||||
|
height: 20
|
||||||
|
visible: root.currentPanel === ThumbnailDelegate.Panel.Main
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: twirlButtonDown
|
||||||
|
onTriggerRelease: twirlToDetailsAnimation.start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TwirlButton {
|
||||||
|
id: twirlButtonUp
|
||||||
|
height: 20
|
||||||
|
visible: root.currentPanel === ThumbnailDelegate.Panel.Details
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
rotation: 180
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: twirlButtonUp
|
||||||
|
onTriggerRelease: twirlToMainAnimation.start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
id: twirlToDetailsAnimation
|
||||||
|
target: canvas
|
||||||
|
property: "y"
|
||||||
|
easing.bezierCurve: [0.972,-0.176,0.0271,1.16,1,1]
|
||||||
|
duration: 250
|
||||||
|
alwaysRunToEnd: true
|
||||||
|
to: -Constants.thumbnailSize // dynamic size because of rescale - needs to be inverted because animation goes into negative range
|
||||||
|
from: canvas.y
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
id: twirlToMainAnimation
|
||||||
|
target: canvas
|
||||||
|
property: "y"
|
||||||
|
easing.bezierCurve: [0.972,-0.176,0.0271,1.16,1,1]
|
||||||
|
alwaysRunToEnd: true
|
||||||
|
duration: 250
|
||||||
|
to: 0
|
||||||
|
from: canvas.y
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
id: twirlToDownloadAnimation
|
||||||
|
target: canvas
|
||||||
|
property: "y"
|
||||||
|
easing.bezierCurve: [0.972,-0.176,0.0271,1.16,1,1]
|
||||||
|
alwaysRunToEnd: true
|
||||||
|
duration: 250
|
||||||
|
to: Constants.thumbnailSize
|
||||||
|
from: canvas.y
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: twirlToDetailsAnimation
|
||||||
|
onStarted: root.currentPanel = ThumbnailDelegate.Panel.InBetween
|
||||||
|
onFinished: {
|
||||||
|
root.currentPanel = ThumbnailDelegate.Panel.Details
|
||||||
|
canvas.y = Qt.binding(function() {return -Constants.thumbnailSize })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: twirlToMainAnimation
|
||||||
|
onStarted: root.currentPanel = ThumbnailDelegate.Panel.InBetween
|
||||||
|
onFinished: {
|
||||||
|
root.currentPanel = ThumbnailDelegate.Panel.Main
|
||||||
|
canvas.y = Qt.binding(function() {return 0 })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: twirlToDownloadAnimation
|
||||||
|
onStarted: root.currentPanel = ThumbnailDelegate.Panel.InBetween
|
||||||
|
onFinished: {
|
||||||
|
root.currentPanel = ThumbnailDelegate.Panel.Download
|
||||||
|
canvas.y = Qt.binding(function() {return Constants.thumbnailSize })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
69
share/qtcreator/qmldesigner/welcomepage/TourDialogButton.qml
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import StudioTheme 1.0 as StudioTheme
|
||||||
|
import UiTour
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: tourButton
|
||||||
|
width: 40
|
||||||
|
height: 40
|
||||||
|
property alias dialogButtonText: dialogButton.text
|
||||||
|
|
||||||
|
signal buttonClicked
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: dialogButton
|
||||||
|
color: "#ffffff"
|
||||||
|
font.family: StudioTheme.Constants.iconFont.family
|
||||||
|
text: StudioTheme.Constants.closeFile_large
|
||||||
|
font.pixelSize: 32
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
onClicked: tourButton.buttonClicked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "normal"
|
||||||
|
when: !mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: dialogButton
|
||||||
|
color: "#ecebeb"
|
||||||
|
font.pixelSize: 28
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: dialogButton
|
||||||
|
font.pixelSize: 29
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "press"
|
||||||
|
when: mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: dialogButton
|
||||||
|
font.pixelSize: 29
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
73
share/qtcreator/qmldesigner/welcomepage/TourModel.qml
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
ListModel {
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/welcomepage-tour/WelcomeSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/welcome-page.png"
|
||||||
|
title: QT_TR_NOOP("Welcome Page")
|
||||||
|
subtitle: QT_TR_NOOP("The welcome page of Qt Design Studio.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/workspace-tour/WorkspaceSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/workspaces.png"
|
||||||
|
title: QT_TR_NOOP("Workspaces")
|
||||||
|
subtitle: QT_TR_NOOP("Introduction to the most important workspaces.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/toolbar-tour/ToolbarSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/top-toolbar.png"
|
||||||
|
title: QT_TR_NOOP("Top Toolbar")
|
||||||
|
subtitle: QT_TR_NOOP("Short explanation of the top toolbar.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/states-tour/StatesSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/states.png"
|
||||||
|
title: QT_TR_NOOP("States")
|
||||||
|
subtitle: QT_TR_NOOP("An introduction to states.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/sortcomponents-tour/SortComponentsSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/sorting-components.png"
|
||||||
|
title: QT_TR_NOOP("Sorting Components")
|
||||||
|
subtitle: QT_TR_NOOP("A way to organize multiple components.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/connectcomponents-tour/ConnectComponentsSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/connecting-components.png"
|
||||||
|
title: QT_TR_NOOP("Connecting Components")
|
||||||
|
subtitle: QT_TR_NOOP("A way to connect components with actions.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/addassets-tour/AddAssetsSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/adding-assets.png"
|
||||||
|
title: QT_TR_NOOP("Adding Assets")
|
||||||
|
subtitle: QT_TR_NOOP("A way to add new assets to the project.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/animation-tour/AnimationSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/animation-2d.png"
|
||||||
|
title: QT_TR_NOOP("Creating 2D Animation")
|
||||||
|
subtitle: QT_TR_NOOP("A way to create a 2D Animation.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/studiocomponents-border-arc-tour/StudioComponentBorderArcSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/border-arc.png"
|
||||||
|
title: QT_TR_NOOP("Border and Arc")
|
||||||
|
subtitle: QT_TR_NOOP("Work with Border and Arc Studio Components.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/studiocomponents-ellipse-pie-tour/StudioComponentEllipsePieSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/ellipse-pie.png"
|
||||||
|
title: QT_TR_NOOP("Ellipse and Pie")
|
||||||
|
subtitle: QT_TR_NOOP("Work with Ellipse and Pie Studio Components.")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
qmlFileName: "tours/studiocomponents-polygon-triangle-rectangle-tour/StudioComponentPolygonTriangleRectangleSlideShow.ui.qml"
|
||||||
|
thumbnail: "images/complex-shapes.png"
|
||||||
|
title: QT_TR_NOOP("Complex Shapes")
|
||||||
|
subtitle: QT_TR_NOOP("Work with Polygon, Triangle and Rectangle Studio Components.")
|
||||||
|
}
|
||||||
|
}
|
41
share/qtcreator/qmldesigner/welcomepage/TourProgressBar.qml
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: progressBar
|
||||||
|
|
||||||
|
property int endSlide: 10
|
||||||
|
property int currentSlide: 1
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: progressBarGroove
|
||||||
|
color: "#272727"
|
||||||
|
radius: 5
|
||||||
|
border.color: "#00000000"
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: progressBarTrack
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.bottomMargin: 1
|
||||||
|
anchors.topMargin: 1
|
||||||
|
width: (progressBarGroove.width / 100) * rangeMapper.output
|
||||||
|
color: "#57b9fc"
|
||||||
|
radius: 4.5
|
||||||
|
}
|
||||||
|
|
||||||
|
RangeMapper {
|
||||||
|
id: rangeMapper
|
||||||
|
inputMaximum: progressBar.endSlide
|
||||||
|
outputMaximum: 100
|
||||||
|
outputMinimum: 0
|
||||||
|
inputMinimum: 0
|
||||||
|
input: progressBar.currentSlide
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,84 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: restart
|
||||||
|
height: 36
|
||||||
|
color: "#00ffffff"
|
||||||
|
radius: 18
|
||||||
|
border.color: "#f9f9f9"
|
||||||
|
border.width: 3
|
||||||
|
state: "normal"
|
||||||
|
|
||||||
|
signal restart()
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: text2
|
||||||
|
color: "#ffffff"
|
||||||
|
text: qsTrId("Restart")
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
font.pixelSize: 12
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
onClicked: restart.restart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "normal"
|
||||||
|
when: !mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: text2
|
||||||
|
color: "#dedede"
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: restart
|
||||||
|
border.color: "#dedede"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: restart
|
||||||
|
color: "#00ffffff"
|
||||||
|
border.color: "#ffffff"
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: text2
|
||||||
|
color: "#ffffff"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "press"
|
||||||
|
when: mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: restart
|
||||||
|
color: "#ffffff"
|
||||||
|
border.color: "#ffffff"
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: text2
|
||||||
|
color: "#000000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@@ -0,0 +1,164 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
width: Constants.thumbnailSize
|
||||||
|
height: Constants.thumbnailSize
|
||||||
|
state: "normal"
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
property bool complete: root.currentSlide === root.endSlide
|
||||||
|
|
||||||
|
// Needs to be set from the current slide show and user progress
|
||||||
|
property int currentSlide: 0
|
||||||
|
property int endSlide: 10
|
||||||
|
|
||||||
|
signal clicked()
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: background
|
||||||
|
radius: 10
|
||||||
|
color: Constants.currentNormalThumbnailBackground
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
property bool multiline: (tourNameLabelMetric.width >= tourNameLabel.width)
|
||||||
|
|
||||||
|
TextMetrics {
|
||||||
|
id: tourNameLabelMetric
|
||||||
|
text: tourNameLabel.text
|
||||||
|
font: tourNameLabel.font
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: thumbnailPlaceholder
|
||||||
|
source: thumbnail
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.bottomMargin: Constants.imageBottomMargin
|
||||||
|
anchors.rightMargin: Constants.thumbnailMargin
|
||||||
|
anchors.leftMargin: Constants.thumbnailMargin
|
||||||
|
anchors.topMargin: Constants.thumbnailMargin
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
verticalAlignment: Image.AlignTop
|
||||||
|
mipmap: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: tourNameBackground
|
||||||
|
height: background.multiline ? Constants.titleHeightMultiline : Constants.titleHeight
|
||||||
|
color: "#e5b0e4"
|
||||||
|
radius: 3
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: thumbnailPlaceholder.bottom
|
||||||
|
anchors.topMargin: Constants.titleBackgroundTopMargin
|
||||||
|
anchors.leftMargin: Constants.thumbnailMargin
|
||||||
|
anchors.rightMargin: Constants.thumbnailMargin
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: tourNameLabel
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
font.pixelSize: 16
|
||||||
|
text: title
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
maximumLineCount: 2
|
||||||
|
clip: false
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.leftMargin: Constants.titleMargin
|
||||||
|
anchors.rightMargin: Constants.titleMargin
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: subtitleCaption
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
text: subtitle
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
font.pixelSize: 14
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: tourNameBackground.bottom
|
||||||
|
anchors.topMargin: 5
|
||||||
|
anchors.rightMargin: Constants.thumbnailMargin
|
||||||
|
anchors.leftMargin: Constants.thumbnailMargin
|
||||||
|
leftPadding: 5
|
||||||
|
rightPadding: 5
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
onClicked: root.clicked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "normal"
|
||||||
|
when: root.enabled && !mouseArea.containsMouse && !mouseArea.pressed && !root.complete
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
color: Constants.currentNormalThumbnailBackground
|
||||||
|
border.width: 0
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: tourNameBackground
|
||||||
|
color: Constants.currentNormalThumbnailLabelBackground
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: mouseArea
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: root.enabled && mouseArea.containsMouse && !mouseArea.pressed && !root.complete
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
color: Constants.currentHoverThumbnailBackground
|
||||||
|
border.width: 0
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: tourNameBackground
|
||||||
|
color: Constants.currentHoverThumbnailLabelBackground
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: mouseArea
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "press"
|
||||||
|
when: root.enabled && mouseArea.pressed && !root.complete
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
color: Constants.currentHoverThumbnailBackground
|
||||||
|
border.color: Constants.currentBrand
|
||||||
|
border.width: 2
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: tourNameBackground
|
||||||
|
color: Constants.currentBrand
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: mouseArea
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
118
share/qtcreator/qmldesigner/welcomepage/TwirlButton.qml
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import StudioTheme 1.0 as StudioTheme
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: twirlButton
|
||||||
|
width: 25
|
||||||
|
height: 25
|
||||||
|
state: "normal"
|
||||||
|
|
||||||
|
property bool parentHovered: false
|
||||||
|
property bool isHovered: mouseArea.containsMouse
|
||||||
|
signal triggerRelease()
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: background
|
||||||
|
color: "#eab336"
|
||||||
|
border.width: 0
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: twirlIcon
|
||||||
|
width: 23
|
||||||
|
height: 23
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
font.family: StudioTheme.Constants.iconFont.family
|
||||||
|
text: StudioTheme.Constants.adsDropDown
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
font.pixelSize: 14
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
onReleased: twirlButton.triggerRelease()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "hidden"
|
||||||
|
when: !mouseArea.containsMouse && !mouseArea.pressed && !twirlButton.parentHovered
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlIcon
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "normal"
|
||||||
|
when: !mouseArea.containsMouse && !mouseArea.pressed && twirlButton.parentHovered
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlIcon
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlIcon
|
||||||
|
scale: 1.4
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
visible: true
|
||||||
|
color: Constants.currentHoverThumbnailLabelBackground
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlIcon
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "press"
|
||||||
|
when: mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlIcon
|
||||||
|
color: Constants.currentGlobalText
|
||||||
|
scale: 1.8
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: background
|
||||||
|
visible: true
|
||||||
|
color: Constants.currentBrand
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: twirlIcon
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
125
share/qtcreator/qmldesigner/welcomepage/TwitterButton.qml
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import StudioTheme 1.0 as StudioTheme
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: twitterButton
|
||||||
|
state: "darkNormal"
|
||||||
|
|
||||||
|
property bool isHovered: mouseArea.containsMouse
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: twitterDarkNormal
|
||||||
|
anchors.fill: parent
|
||||||
|
source: "images/twitterDarkNormal.png"
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: twitterLightNormal
|
||||||
|
anchors.fill: parent
|
||||||
|
source: "images/twitterLightNormal.png"
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: twitterHover
|
||||||
|
anchors.fill: parent
|
||||||
|
source: "images/twitterHover.png"
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
function onClicked(mouse) { Qt.openUrlExternally("https://twitter.com/qtproject/") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "darkNormal"
|
||||||
|
when: !StudioTheme.Values.isLightTheme && !mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterDarkNormal
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterLightNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "lightNormal"
|
||||||
|
when: StudioTheme.Values.isLightTheme && !mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterLightNormal
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterDarkNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterHover
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterLightNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterDarkNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "press"
|
||||||
|
when: (mouseArea.containsMouse || !mouseArea.containsMouse) && mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterHover
|
||||||
|
visible: true
|
||||||
|
scale: 1.1
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterLightNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: twitterDarkNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
52
share/qtcreator/qmldesigner/welcomepage/WelcomePage.qml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import projectmodel 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: appFrame
|
||||||
|
clip: true
|
||||||
|
width: Constants.width
|
||||||
|
height: Constants.height
|
||||||
|
|
||||||
|
property int loadingProgress: 50
|
||||||
|
|
||||||
|
onLoadingProgressChanged: Constants.loadingProgress = appFrame.loadingProgress
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
target: appFrame
|
||||||
|
property: "loadingProgress"
|
||||||
|
from: 0
|
||||||
|
to: 100
|
||||||
|
loops: Animation.Infinite
|
||||||
|
running: false
|
||||||
|
duration: 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
MainScreen {
|
||||||
|
id: screen
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.leftMargin: screen.designMode ? 0 : -45 // hide sidebar
|
||||||
|
}
|
||||||
|
|
||||||
|
property int pageIndex: 0
|
||||||
|
property int minimumWidth: 1200
|
||||||
|
property int minimumHeight: 720
|
||||||
|
|
||||||
|
onHeightChanged: {
|
||||||
|
if (appFrame.height > appFrame.minimumHeight)
|
||||||
|
appFrame.anchors.fill = parent
|
||||||
|
else if (appFrame.height < appFrame.minimumHeight)
|
||||||
|
appFrame.height = appFrame.minimumHeight
|
||||||
|
}
|
||||||
|
onWidthChanged: {
|
||||||
|
if (appFrame.width > appFrame.minimumWidth)
|
||||||
|
appFrame.anchors.fill = parent
|
||||||
|
else if (appFrame.width < appFrame.minimumWidth)
|
||||||
|
appFrame.width = appFrame.minimumWidth
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,49 @@
|
|||||||
|
/* File generated by Qt Creator */
|
||||||
|
|
||||||
|
import QmlProject 1.1
|
||||||
|
|
||||||
|
Project {
|
||||||
|
mainFile: "WelcomePage.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"
|
||||||
|
QT_SCALE_FACTOR: "0.8"
|
||||||
|
QT_LOGGING_RULES: "qt.qml.connections=false"
|
||||||
|
}
|
||||||
|
|
||||||
|
qt6Project: true
|
||||||
|
|
||||||
|
/* List of plugin directories passed to QML runtime */
|
||||||
|
importPaths: [ "imports", "studioImports", "asset_imports", "mockData", "dataImports" ]
|
||||||
|
|
||||||
|
/* Required for deployment */
|
||||||
|
targetDirectory: "/opt/WelcomeScreen"
|
||||||
|
}
|
201
share/qtcreator/qmldesigner/welcomepage/YoutubeButton.qml
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Templates
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import StudioTheme 1.0 as StudioTheme
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: youtubeButton
|
||||||
|
state: "darkNormal"
|
||||||
|
|
||||||
|
property bool isHovered: mouseArea.containsMouse
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: youtubeDarkNormal
|
||||||
|
anchors.fill: parent
|
||||||
|
source: "images/youtubeDarkNormal.png"
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: youtubeLightNormal
|
||||||
|
anchors.fill: parent
|
||||||
|
source: "images/youtubeLightNormal.png"
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: youtubeLightHover
|
||||||
|
anchors.fill: parent
|
||||||
|
source: "images/youtubeLightHover.png"
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: youtubeDarkHover
|
||||||
|
anchors.fill: parent
|
||||||
|
source: "images/youtubeDarkHover.png"
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
function onClicked(mouse) { Qt.openUrlExternally("https://www.youtube.com/user/QtStudios/") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "darkNormal"
|
||||||
|
when: !StudioTheme.Values.isLightTheme && !mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkNormal
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "lightNormal"
|
||||||
|
when: StudioTheme.Values.isLightTheme && !mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightNormal
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "darkHover"
|
||||||
|
when: !StudioTheme.Values.isLightTheme && mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkHover
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "lightHover"
|
||||||
|
when: StudioTheme.Values.isLightTheme && mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightHover
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "darkPress"
|
||||||
|
when: !StudioTheme.Values.isLightTheme && mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkHover
|
||||||
|
visible: true
|
||||||
|
scale: 1.1
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "lightPress"
|
||||||
|
when: StudioTheme.Values.isLightTheme && mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkHover
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightHover
|
||||||
|
visible: true
|
||||||
|
scale: 1.1
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeLightNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: youtubeDarkNormal
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
1
share/qtcreator/qmldesigner/welcomepage/fonts/fonts.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Fonts in this folder are loaded automatically.
|
BIN
share/qtcreator/qmldesigner/welcomepage/images/adding-assets.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/animation-2d.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/border-arc.png
Normal file
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 48 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/ds.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/ellipse-pie.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/newThumbnail.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/noPreview.png
Normal file
After Width: | Height: | Size: 8.2 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/place_holder.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 42 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/states.png
Normal file
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 32 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/top-toolbar.png
Normal file
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 1.3 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/twitterHover.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.1 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/welcome-page.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
share/qtcreator/qmldesigner/welcomepage/images/workspaces.png
Normal file
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 2.9 KiB |
@@ -0,0 +1,61 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Timeline
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
width: 872
|
||||||
|
height: 860
|
||||||
|
radius: 4
|
||||||
|
color: "transparent"
|
||||||
|
border.color: "#1381e3"
|
||||||
|
border.width: 8
|
||||||
|
state: "off"
|
||||||
|
|
||||||
|
property bool active: true
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "on"
|
||||||
|
when: root.active
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: root
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "off"
|
||||||
|
when: !root.active
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: root
|
||||||
|
opacity: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
transitions: [
|
||||||
|
Transition {
|
||||||
|
id: transition
|
||||||
|
to: "*"
|
||||||
|
from: "*"
|
||||||
|
ParallelAnimation {
|
||||||
|
SequentialAnimation {
|
||||||
|
PauseAnimation { duration: 0 }
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: root
|
||||||
|
property: "opacity"
|
||||||
|
duration: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
118
share/qtcreator/qmldesigner/welcomepage/imports/UiTour/Slide.qml
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Timeline
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
width: 1920
|
||||||
|
height: 1080
|
||||||
|
|
||||||
|
property string caption: "This is a string"
|
||||||
|
property string title: "this is a string"
|
||||||
|
property bool active: false
|
||||||
|
|
||||||
|
function prev() {
|
||||||
|
var states = root.stateNames()
|
||||||
|
|
||||||
|
if (states.length === 0)
|
||||||
|
return false
|
||||||
|
|
||||||
|
if (root.state === "")
|
||||||
|
return false
|
||||||
|
|
||||||
|
var index = states.indexOf(root.state)
|
||||||
|
|
||||||
|
// base state is not in the list
|
||||||
|
if (index > 0) {
|
||||||
|
root.state = states[index - 1]
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
function next() {
|
||||||
|
var states = root.stateNames()
|
||||||
|
|
||||||
|
if (states.length === 0)
|
||||||
|
return false
|
||||||
|
|
||||||
|
if (root.state === "") {
|
||||||
|
root.state = states[0]
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
var index = states.indexOf(root.state)
|
||||||
|
|
||||||
|
if (index < (states.length - 1)) {
|
||||||
|
root.state = states[index + 1]
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
function stateNames() {
|
||||||
|
var states = []
|
||||||
|
|
||||||
|
for (var i = 0; i < root.states.length; i++) {
|
||||||
|
var state = root.states[i]
|
||||||
|
states.push(state.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return states
|
||||||
|
}
|
||||||
|
|
||||||
|
signal activated
|
||||||
|
|
||||||
|
function activate() {
|
||||||
|
root.active = true
|
||||||
|
stateGroup.state = "active"
|
||||||
|
root.activated()
|
||||||
|
}
|
||||||
|
|
||||||
|
function done() {
|
||||||
|
stateGroup.state = "done"
|
||||||
|
}
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
root.active = false
|
||||||
|
stateGroup.state = "inactive"
|
||||||
|
}
|
||||||
|
|
||||||
|
StateGroup {
|
||||||
|
id: stateGroup
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "active"
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: root
|
||||||
|
opacity: 1
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "inactive"
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: root
|
||||||
|
opacity: 0
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "done"
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: root
|
||||||
|
opacity: 1
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,71 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
import StudioTheme 1.0 as StudioTheme
|
||||||
|
import UiTour
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: tourButton
|
||||||
|
width: 120
|
||||||
|
height: 120
|
||||||
|
property alias dialogButtonRotation: dialogButton.rotation
|
||||||
|
property alias dialogButtonFontpixelSize: dialogButton.font.pixelSize
|
||||||
|
property alias dialogButtonText: dialogButton.text
|
||||||
|
|
||||||
|
signal buttonClicked
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: dialogButton
|
||||||
|
color: "#ffffff"
|
||||||
|
text: StudioTheme.Constants.nextFile_large
|
||||||
|
font.family: StudioTheme.Constants.iconFont.family
|
||||||
|
font.pixelSize: 32
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: mouseArea
|
||||||
|
onClicked: tourButton.buttonClicked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "normal"
|
||||||
|
when: !mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: dialogButton
|
||||||
|
color: "#ecebeb"
|
||||||
|
font.pixelSize: 92
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hover"
|
||||||
|
when: mouseArea.containsMouse && !mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: dialogButton
|
||||||
|
font.pixelSize: 96
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "press"
|
||||||
|
when: mouseArea.pressed
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: dialogButton
|
||||||
|
font.pixelSize: 98
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@@ -0,0 +1,132 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import QtQuick.Shapes
|
||||||
|
import UiTour
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
width: 1920
|
||||||
|
height: 1080
|
||||||
|
visible: true
|
||||||
|
|
||||||
|
property alias slideSource: loader.source
|
||||||
|
property alias loaderActive: loader.active
|
||||||
|
property var mainScreen: loader.item
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: gradientRect
|
||||||
|
anchors.fill: parent
|
||||||
|
source: "gradientRect.webp"
|
||||||
|
mipmap: true
|
||||||
|
fillMode: Image.Stretch
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.preferredWidth: 160
|
||||||
|
Layout.maximumWidth: 160
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
SlideNavButton {
|
||||||
|
id: prevSlideButton
|
||||||
|
dialogButtonRotation: 180
|
||||||
|
visible: ((mainScreen.currentSlide + 1) !== 1)
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: prevSlideButton
|
||||||
|
onButtonClicked: mainScreen.prev()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Column {
|
||||||
|
id: content
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredWidth: 120
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: titleFrame
|
||||||
|
width: content.width
|
||||||
|
height: 100
|
||||||
|
|
||||||
|
Text {
|
||||||
|
color: "#ffffff"
|
||||||
|
text: mainScreen.title
|
||||||
|
font.pixelSize: 40
|
||||||
|
font.bold: true
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
anchors.centerIn: parent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: slideFrame
|
||||||
|
width: content.width
|
||||||
|
height: Math.min(1080 * content.width / 1920,
|
||||||
|
root.height - (titleFrame.height + captionFrame.height + indicatorFrame.height))
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: loader
|
||||||
|
source: "MySlideShow.ui.qml"
|
||||||
|
transformOrigin: Item.Center
|
||||||
|
scale: Math.min(slideFrame.width / 1920, slideFrame.height / 1080)
|
||||||
|
anchors.centerIn: parent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: captionFrame
|
||||||
|
width: content.width
|
||||||
|
height: 140
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: captionText
|
||||||
|
color: "#ffffff"
|
||||||
|
text: mainScreen.caption
|
||||||
|
font.pixelSize: 20
|
||||||
|
font.bold: true
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
anchors.fill: parent
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: indicatorFrame
|
||||||
|
width: content.width
|
||||||
|
height: 100
|
||||||
|
|
||||||
|
Text {
|
||||||
|
color: "#ffffff"
|
||||||
|
text: (mainScreen.currentSlide + 1) + "/" + mainScreen.progress
|
||||||
|
font.pixelSize: 20
|
||||||
|
anchors.centerIn: parent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.preferredWidth: 160
|
||||||
|
Layout.maximumWidth: 160
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
SlideNavButton {
|
||||||
|
id: nextSlideButton
|
||||||
|
visible: (mainScreen.progress !== (mainScreen.currentSlide + 1))
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: nextSlideButton
|
||||||
|
onButtonClicked: mainScreen.next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,85 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
width: 1920
|
||||||
|
height: 1080
|
||||||
|
color: "#00000000"
|
||||||
|
|
||||||
|
property string caption
|
||||||
|
property string title
|
||||||
|
|
||||||
|
property int progress: 0
|
||||||
|
property int currentSlide: 0
|
||||||
|
|
||||||
|
function next() {
|
||||||
|
if (root.currentSlide === (root.progress - 1))
|
||||||
|
return
|
||||||
|
|
||||||
|
var index = root.findActive()
|
||||||
|
var current = root.children[index]
|
||||||
|
|
||||||
|
root.currentSlide++
|
||||||
|
|
||||||
|
if (current.next()) {
|
||||||
|
root.caption = current.caption
|
||||||
|
root.title = current.title
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
root.children[index].init()
|
||||||
|
root.children[index + 1].activate()
|
||||||
|
|
||||||
|
root.caption = root.children[index + 1].caption
|
||||||
|
root.title = root.children[index + 1].title
|
||||||
|
}
|
||||||
|
|
||||||
|
function prev() {
|
||||||
|
if (root.currentSlide === 0)
|
||||||
|
return
|
||||||
|
|
||||||
|
var index = root.findActive()
|
||||||
|
var current = root.children[index]
|
||||||
|
|
||||||
|
root.currentSlide--
|
||||||
|
|
||||||
|
if (current.prev()) {
|
||||||
|
root.caption = current.caption
|
||||||
|
root.title = current.title
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
root.children[index].init()
|
||||||
|
root.children[index - 1].activate()
|
||||||
|
root.caption = root.children[index - 1].caption
|
||||||
|
root.title = root.children[index - 1].title
|
||||||
|
}
|
||||||
|
|
||||||
|
function findActive() {
|
||||||
|
for (var i = 0; i < root.children.length; i++) {
|
||||||
|
var child = root.children[i]
|
||||||
|
if (child.active)
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
for (var i = 0; i < root.children.length; i++) {
|
||||||
|
var child = root.children[i]
|
||||||
|
child.init()
|
||||||
|
root.progress += child.states.length
|
||||||
|
if (i === 0) {
|
||||||
|
child.visible = true
|
||||||
|
child.activate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
root.caption = root.children[0].caption
|
||||||
|
root.title = root.children[0].title
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,107 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Timeline
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
width: 600
|
||||||
|
height: 600
|
||||||
|
radius: 2
|
||||||
|
color: "transparent"
|
||||||
|
border.color: "#1381e3"
|
||||||
|
border.width: 8
|
||||||
|
state: "off"
|
||||||
|
|
||||||
|
property bool active: true
|
||||||
|
|
||||||
|
property color shadowColor: "#aa1b1b1b"
|
||||||
|
|
||||||
|
property int globalX: root.x //200
|
||||||
|
property int globalY: root.y //200
|
||||||
|
property int parentWidth: root.parent.width //1200
|
||||||
|
property int parentHeight: root.parent.height //1200
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
z: -1
|
||||||
|
color: "transparent"
|
||||||
|
anchors.fill: parent
|
||||||
|
border.color: root.shadowColor
|
||||||
|
border.width: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
x: -width
|
||||||
|
z: -1
|
||||||
|
width: root.globalX
|
||||||
|
height: root.height
|
||||||
|
color: root.shadowColor
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
x: root.width
|
||||||
|
z: -1
|
||||||
|
width: root.parentWidth - root.globalX - root.width
|
||||||
|
height: root.height
|
||||||
|
color: root.shadowColor
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
x: -root.globalX
|
||||||
|
y: -root.globalY
|
||||||
|
z: -1
|
||||||
|
width: root.parentWidth
|
||||||
|
height: root.globalY
|
||||||
|
color: root.shadowColor
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
x: -root.globalX
|
||||||
|
y: root.height
|
||||||
|
z: -1
|
||||||
|
width: root.parentWidth
|
||||||
|
height: root.parentHeight - root.globalY - root.height
|
||||||
|
color: root.shadowColor
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "on"
|
||||||
|
when: root.active
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: root
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "off"
|
||||||
|
when: !root.active
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: root
|
||||||
|
opacity: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
transitions: [
|
||||||
|
Transition {
|
||||||
|
id: transition
|
||||||
|
to: "*"
|
||||||
|
from: "*"
|
||||||
|
ParallelAnimation {
|
||||||
|
SequentialAnimation {
|
||||||
|
PauseAnimation { duration: 0 }
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: root
|
||||||
|
property: "opacity"
|
||||||
|
duration: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
After Width: | Height: | Size: 38 KiB |
@@ -0,0 +1,6 @@
|
|||||||
|
Highlight 1.0 Highlight.ui.qml
|
||||||
|
StrongHighlight 1.0 StrongHighlight.ui.qml
|
||||||
|
Slide 1.0 Slide.qml
|
||||||
|
SlideShow 1.0 SlideShow.qml
|
||||||
|
SlidePlayer 1.0 SlidePlayer.qml
|
||||||
|
SlideNavButton 1.0 SlideNavButton.qml
|
@@ -0,0 +1,189 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
pragma Singleton
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import StudioTheme 1.0
|
||||||
|
import projectmodel 1.0
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property int loadingProgress: 100
|
||||||
|
readonly property int width: 1842
|
||||||
|
readonly property int height: 1080
|
||||||
|
property bool communityEdition: projectModel.communityVersion
|
||||||
|
property bool enterpriseEdition: projectModel.enterpriseVersion
|
||||||
|
|
||||||
|
/* 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 var projectModel: ProjectModel {}
|
||||||
|
|
||||||
|
// Responsive grid stuff
|
||||||
|
readonly property int minColumnCount: 2
|
||||||
|
readonly property int minThumbnailSize: 244
|
||||||
|
readonly property int gridSpacing: 8
|
||||||
|
readonly property int scrollBarWidth: 10
|
||||||
|
readonly property int gridMargins: 20
|
||||||
|
readonly property int scrollBarTrackSize: 10
|
||||||
|
|
||||||
|
property int thumbnailSize: root.adaptiveThumbnailSize
|
||||||
|
property int gridCellSize: root.adaptiveThumbnailSize + root.gridSpacing
|
||||||
|
property int adaptiveThumbnailSize: root.minThumbnailSize // default to minimum size
|
||||||
|
|
||||||
|
function responsiveResize(width) {
|
||||||
|
var columnCount = Math.max(Math.floor(width / (root.minThumbnailSize + root.gridSpacing)),
|
||||||
|
root.minColumnCount)
|
||||||
|
root.adaptiveThumbnailSize = Math.floor((width + root.gridSpacing) / columnCount - root.gridSpacing)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Thumbnail margins and sizes
|
||||||
|
property int thumbnailMargin: 10
|
||||||
|
property int imageBottomMargin: 90
|
||||||
|
property int titleBackgroundTopMargin: 5
|
||||||
|
property int titleHeight: 30
|
||||||
|
property int titleHeightMultiline: 52
|
||||||
|
property int titleMargin: 5
|
||||||
|
|
||||||
|
/// THEME
|
||||||
|
|
||||||
|
/// theme selector
|
||||||
|
property int currentTheme: 0
|
||||||
|
property bool defaultBrand: true
|
||||||
|
property bool basic: true
|
||||||
|
|
||||||
|
/// list view
|
||||||
|
property bool isListView: false
|
||||||
|
|
||||||
|
/// Current theme - USE THESE IN YOUR PROPERTY BINDINGS!
|
||||||
|
|
||||||
|
/// TRAFFIC LIGHT SYSTEM
|
||||||
|
property color greenLight: Values.themeGreenLight
|
||||||
|
property color amberLight: Values.themeAmberLight
|
||||||
|
property color redLight: Values.themeRedLight
|
||||||
|
|
||||||
|
/// BRAND
|
||||||
|
property string currentBrand: root.defaultBrand ? root.qdsBrand : root.creatorBrand
|
||||||
|
|
||||||
|
/// TEXT
|
||||||
|
property color currentGlobalText: Values.themeTextColor
|
||||||
|
property color currentActiveGlobalText: "#ffffff"
|
||||||
|
property string brandGlobalText: root.defaultBrand ? root.qdsGlobalText : root.creatorGlobalText
|
||||||
|
|
||||||
|
/// BACKGROUND
|
||||||
|
property color currentThemeBackground: Values.welcomeScreenBackground
|
||||||
|
|
||||||
|
/// DIALOG
|
||||||
|
property color currentDialogBackground: Values.themeThumbnailBackground
|
||||||
|
property color currentDialogBorder: root.currentBrand
|
||||||
|
|
||||||
|
/// BUTTONS
|
||||||
|
property color currentPushButtonNormalBackground: Values.themeControlBackground
|
||||||
|
property color currentPushButtonHoverBackground: Values.themeControlBackgroundHover
|
||||||
|
|
||||||
|
property color currentPushButtonNormalOutline: Values.themeControlOutline
|
||||||
|
property color currentPushButtonHoverOutline: Values.themeControlOutline
|
||||||
|
|
||||||
|
/// THUMBNAILS
|
||||||
|
property color currentThumbnailGridBackground: Values.themeSubPanelBackground
|
||||||
|
|
||||||
|
property color currentNormalThumbnailBackground: Values.themeThumbnailBackground
|
||||||
|
property color currentHoverThumbnailBackground: Values.themeControlBackgroundGlobalHover
|
||||||
|
|
||||||
|
property color currentNormalThumbnailLabelBackground: Values.themeThumbnailLabelBackground
|
||||||
|
property color currentHoverThumbnailLabelBackground: Values.themeControlBackgroundInteraction
|
||||||
|
|
||||||
|
/// TOOLTIP
|
||||||
|
property color currentToolTipBackground: Values.themeToolTipBackground
|
||||||
|
property color currentToolTipOutline: Values.themeToolTipOutline
|
||||||
|
property color currentToolTipText: Values.themeToolTipText
|
||||||
|
|
||||||
|
property color currentScrollBarTrack: Values.themeScrollBarTrack
|
||||||
|
property color currentScrollBarHandle: Values.themeScrollBarHandle
|
||||||
|
property color currentScrollBarHandle_idle: Values.themeScrollBarHandle_idle
|
||||||
|
|
||||||
|
/// GLOBAL COLORS
|
||||||
|
|
||||||
|
/// brand
|
||||||
|
property string creatorBrand: "#54D263"
|
||||||
|
property string qdsBrand: "#57B9FC"
|
||||||
|
|
||||||
|
|
||||||
|
/// DARK THEME COLORS
|
||||||
|
property string darkBackground: "#242424"
|
||||||
|
property string modeBarDark: "#414141"
|
||||||
|
|
||||||
|
/// globalText
|
||||||
|
property string darkGlobalText: "#ffffff"
|
||||||
|
property string darkActiveGlobalText: "#111111"
|
||||||
|
property string qdsGlobalText: "#ffffff"
|
||||||
|
property string creatorGlobalText: "#111111"
|
||||||
|
|
||||||
|
/// button
|
||||||
|
property string darkPushButtonNormalBackground: "#323232"
|
||||||
|
property string darkPushButtonNormalOutline: "#000000"
|
||||||
|
property string darkPushButtonHoverBackground: "#474747"
|
||||||
|
property string darkPushButtonHoverOutline: "#000000"
|
||||||
|
|
||||||
|
/// thumbnails
|
||||||
|
property string darkThumbnailGridBackground: "#040404"
|
||||||
|
property string darkNormalThumbnailBackground: "#292929"
|
||||||
|
property string darkNormalThumbnailLabelBackground: "#3D3D3D"
|
||||||
|
property string darkHoverThumbnailBackground: "#323232"
|
||||||
|
property string darkHoverThumbnailLabelBackground: "#474747"
|
||||||
|
|
||||||
|
|
||||||
|
/// MID THEME COLORS
|
||||||
|
property string midBackground: "#514e48"
|
||||||
|
property string modeBarMid: "#737068"
|
||||||
|
|
||||||
|
/// globalText
|
||||||
|
property string midGlobalText: "#ffffff"
|
||||||
|
property string midActiveGlobalText: "#111111"
|
||||||
|
|
||||||
|
/// button
|
||||||
|
property string midPushButtonNormalBackground: "#43413c"
|
||||||
|
property string midPushButtonNormalOutline: "#636058"
|
||||||
|
property string midPushButtonHoverBackground: "#504D47"
|
||||||
|
property string midPushButtonHoverOutline: "#737068"
|
||||||
|
|
||||||
|
/// thumbnails
|
||||||
|
property string midThumbnailGridBackground: "#383732"
|
||||||
|
property string midNormalThumbnailBackground: "#514e48"
|
||||||
|
property string midNormalThumbnailLabelBackground: "#43413c"
|
||||||
|
property string midHoverThumbnailBackground: "#5B5851"
|
||||||
|
property string midHoverThumbnailLabelBackground: "#43413c"
|
||||||
|
|
||||||
|
|
||||||
|
/// LIGHT THEME COLORS
|
||||||
|
property string lightBackground: "#EAEAEA"
|
||||||
|
property string modeBarLight: "#D1CFCF"
|
||||||
|
|
||||||
|
/// globalText
|
||||||
|
property string lightGlobalText: "#111111"
|
||||||
|
property string lightActiveGlobalText: "#ffffff"
|
||||||
|
|
||||||
|
/// button
|
||||||
|
property string lightPushButtonNormalBackground: "#eaeaea"
|
||||||
|
property string lightPushButtonNormalOutline: "#CACECE"
|
||||||
|
property string lightPushButtonHoverBackground: "#E5E5E5"
|
||||||
|
property string lightPushButtonHoverOutline: "#CACECE"
|
||||||
|
|
||||||
|
/// thumbnails
|
||||||
|
property string lightThumbnailGridBackground: "#EFEFEF"
|
||||||
|
property string lightNormalThumbnailBackground: "#F2F2F2"
|
||||||
|
property string lightNormalThumbnailLabelBackground: "#EBEBEB"
|
||||||
|
property string lightHoverThumbnailBackground: "#EAEAEA"
|
||||||
|
property string lightHoverThumbnailLabelBackground: "#E1E1E1"
|
||||||
|
}
|
@@ -0,0 +1,13 @@
|
|||||||
|
MetaInfo {
|
||||||
|
Type {
|
||||||
|
name: "WelcomeScreen.EventListSimulator"
|
||||||
|
icon: ":/qtquickplugin/images/item-icon16.png"
|
||||||
|
|
||||||
|
Hints {
|
||||||
|
visibleInNavigator: true
|
||||||
|
canBeDroppedInNavigator: true
|
||||||
|
canBeDroppedInFormEditor: false
|
||||||
|
canBeDroppedInView3D: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,2 @@
|
|||||||
|
singleton Constants 1.0 Constants.qml
|
||||||
|
EventListSimulator 1.0 EventListSimulator.qml
|
22
share/qtcreator/qmldesigner/welcomepage/main.qml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import WelcomeScreen 1.0
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: loader
|
||||||
|
asynchronous: false
|
||||||
|
source: "MainScreen.qml"
|
||||||
|
|
||||||
|
property int loadingProgress: 50
|
||||||
|
|
||||||
|
onLoadingProgressChanged: {
|
||||||
|
Constants.loadingProgress = loader.loadingProgress
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: Constants.currentThemeBackground
|
||||||
|
}
|
||||||
|
}
|
10
share/qtcreator/qmldesigner/welcomepage/main.qml.qml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
MainScreen {
|
||||||
|
color: "#ffffff"
|
||||||
|
border.color: "#ffffff"
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,16 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick 2.0
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
property url url
|
||||||
|
property bool finished
|
||||||
|
property bool error
|
||||||
|
property string name
|
||||||
|
property string completeBaseName
|
||||||
|
property int progress
|
||||||
|
property string outputFile
|
||||||
|
property date lastModified
|
||||||
|
property bool available
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick 2.0
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
|
||||||
|
property string targetPath
|
||||||
|
property string archiveName
|
||||||
|
property string detailedText
|
||||||
|
property string currentFile
|
||||||
|
property string size
|
||||||
|
property string count
|
||||||
|
property string sourceFile
|
||||||
|
|
||||||
|
property bool finished
|
||||||
|
property bool targetFolderExists
|
||||||
|
|
||||||
|
property int progress
|
||||||
|
property date birthTime
|
||||||
|
}
|
@@ -0,0 +1,2 @@
|
|||||||
|
FileExtractor 1.0 FileExtractor.qml
|
||||||
|
FileDownloader 1.0 FileDownloader.qml
|
@@ -0,0 +1,117 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
ListModel {
|
||||||
|
property bool communityVersion: true
|
||||||
|
property bool designMode: true
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 01"
|
||||||
|
prettyFilePath: "my_file_1"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 02"
|
||||||
|
prettyFilePath: "my_file_2"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 03"
|
||||||
|
prettyFilePath: "my_file_3"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 04"
|
||||||
|
prettyFilePath: "my_file_4"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 05"
|
||||||
|
prettyFilePath: "my_file_5"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 06"
|
||||||
|
prettyFilePath: "my_file_6"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 07"
|
||||||
|
prettyFilePath: "my_file_7"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 08"
|
||||||
|
filename: "my_file_8"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 09"
|
||||||
|
filename: "my_file_9"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 10"
|
||||||
|
prettyFilePath: "my_file_10"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 11"
|
||||||
|
filename: "my_file_11"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 12"
|
||||||
|
prettyFilePath: "my_file_12"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 13"
|
||||||
|
filename: "my_file_13"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 14"
|
||||||
|
prettyFilePath: "my_file_14"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 15"
|
||||||
|
filename: "my_file_15"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 16"
|
||||||
|
filename: "my_file_16"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 17"
|
||||||
|
filename: "my_file_17"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListElement {
|
||||||
|
displayName: "Project 18"
|
||||||
|
prettyFilePath: "my_file_18"
|
||||||
|
thumbnail: "images/thumbnail_test.png"
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1 @@
|
|||||||
|
ProjectModel 1.0 ProjectModel.qml
|
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
property bool usageStatisticEnabled: false
|
||||||
|
}
|
@@ -0,0 +1 @@
|
|||||||
|
UsageStatisticModel 1.0 UsageStatisticModel.qml
|
@@ -0,0 +1,2 @@
|
|||||||
|
[Controls]
|
||||||
|
Style=Basic
|