refactor(sandbox): make use of StatusQ to layout sandbox app

Closes #41
This commit is contained in:
Pascal Precht 2021-05-27 19:06:50 +02:00 committed by Pascal Precht
parent a4421b5b42
commit 1548212e47
3 changed files with 197 additions and 149 deletions

View File

@ -0,0 +1,18 @@
import QtQuick 2.14
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
Item {
height: 34
width: 176
property alias text: label.text
StatusBaseText {
anchors.verticalCenter: parent.verticalCenter
id: label
font.pixelSize: 15
color: Theme.palette.baseColor1
}
}

28
sandbox/ThemeSwitch.qml Normal file
View File

@ -0,0 +1,28 @@
import QtQuick 2.14
import QtQuick.Controls 2.14
import StatusQ.Controls 0.1
Row {
id: themeSwitch
signal checkedChanged()
spacing: 2
Text {
text: "🌤"
font.pixelSize: 15
anchors.verticalCenter: parent.verticalCenter
}
StatusSwitch {
onCheckedChanged: themeSwitch.checkedChanged()
}
Text {
text: "🌙"
font.pixelSize: 15
anchors.verticalCenter: parent.verticalCenter
}
}

View File

@ -1,154 +1,169 @@
import QtQuick 2.14 import QtQuick 2.14
import QtQuick.Window 2.14 import QtQuick.Window 2.14
import QtQuick.Controls 2.14 import QtQuick.Controls 2.14
import QtGraphicalEffects 1.13
import Sandbox 0.1 import Sandbox 0.1
import StatusQ.Core 0.1 import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1 import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1
import StatusQ.Components 0.1
import StatusQ.Layout 0.1
StatusWindow { StatusWindow {
id: rootWindow id: rootWindow
width: 1024 width: 1024
height: 840 height: 840
visible: true visible: true
title: qsTr("Status App Sandbox") title: qsTr("StatusQ Documentation App")
property ThemePalette lightTheme: StatusLightTheme {} property ThemePalette lightTheme: StatusLightTheme {}
property ThemePalette darkTheme: StatusDarkTheme {} property ThemePalette darkTheme: StatusDarkTheme {}
ButtonGroup {
id: topicsGroup
buttons: tabs.children
}
ButtonGroup {
buttons: switchRow.children
}
Flow {
id: tabs
anchors.left: parent.left
anchors.leftMargin: 100
anchors.right: parent.right
Button {
text: "Reload QML"
onClicked: app.restartQml()
}
Button {
id: iconsTab
checkable: true
text: "Icons"
}
Button {
id: controlsTab
checkable: true
text: "Controls"
}
Button {
id: listItemsTab
checkable: true
text: "List Items"
}
Button {
id: layoutTab
checkable: true
text: "Layout"
}
Button {
id: otherTab
checkable: true
text: "Other"
}
Button {
id: buttonsTab
checkable: true
text: "Buttons"
}
}
ScrollView {
width: parent.width
anchors.top: tabs.bottom
anchors.bottom: parent.bottom
contentHeight: lightThemeBg.height * rootWindow.factor
contentWidth: rootWindow.width * rootWindow.factor
clip: true
Rectangle {
id: lightThemeBg
width: rootWindow.width
height: page.height + 64
anchors.topMargin: 32
color: Theme.palette.baseColor5
clip: true
scale: rootWindow.factor
Loader {
id: page
active: true
anchors.centerIn: parent
sourceComponent: {
switch(topicsGroup.checkedButton) {
case iconsTab:
return iconsComponent;
case controlsTab:
return controlsComponent;
case listItemsTab:
return listItemsComponent;
case layoutTab:
return layoutComponent;
case otherTab:
return othersComponent;
case buttonsTab:
return buttonsComponent;
default:
return null;
}
}
}
Row {
id: switchRow
scale: 0.8
anchors.right: parent.right
anchors.top: parent.top
Button {
checkable: true
checked: true
text: "Light Theme"
onCheckedChanged: {
if (checked) {
Theme.setTheme(lightTheme)
}
}
}
Button {
checkable: true
text: "Dark Theme"
onCheckedChanged: {
if (checked) {
Theme.setTheme(darkTheme)
}
}
}
}
}
}
readonly property real maxFactor: 2.0 readonly property real maxFactor: 2.0
readonly property real minFactor: 0.5 readonly property real minFactor: 0.5
property real factor: 1.0 property real factor: 1.0
Component.onCompleted: {
Theme.palette = lightTheme
apiDocsButton.checked = true
}
StatusAppLayout {
id: appLayout
anchors.fill: parent
appNavBar: StatusAppNavBar {
height: rootWindow.height
navBarTabButtons: [
StatusNavBarTabButton {
id: apiDocsButton
icon.name: "edit"
tooltip.text: "API Documentation"
onClicked: {
stackView.clear()
stackView.push(libraryDocumentationCmp)
checked = !checked
demoAppButton.checked = false
}
}
]
}
appView: StackView {
id: stackView
anchors.fill: parent
initialItem: libraryDocumentationCmp
}
ThemeSwitch {
anchors.top: parent.top
anchors.topMargin: 32
anchors.right: parent.right
anchors.rightMargin: 32
onCheckedChanged: {
if (Theme.palette === rootWindow.lightTheme) {
Theme.palette = rootWindow.darkTheme
} else {
Theme.palette = rootWindow.lightTheme
}
}
}
}
Component {
id: libraryDocumentationCmp
StatusAppTwoPanelLayout {
leftPanel: Item {
anchors.fill: parent
ScrollView {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
contentHeight: navigation.height + 56
contentWidth: navigation.width
clip: true
Column {
id: navigation
anchors.top: parent.top
anchors.topMargin: 48
anchors.horizontalCenter: parent.horizontalCenter
spacing: 0
NavigationHeader { text: "StatusQ.Core" }
StatusNavigationListItem {
title: "Icons"
selected: page.sourceComponent == iconsComponent
onClicked: page.sourceComponent = iconsComponent
}
NavigationHeader { text: "StatusQ.Layout" }
StatusNavigationListItem {
title: "Layouts"
selected: page.sourceComponent == layoutComponent
onClicked: page.sourceComponent = layoutComponent
}
NavigationHeader { text: "StatusQ.Controls" }
StatusNavigationListItem {
title: "Buttons"
selected: page.sourceComponent == buttonsComponent
onClicked: page.sourceComponent = buttonsComponent
}
StatusNavigationListItem {
title: "Controls"
selected: page.sourceComponent == controlsComponent
onClicked: page.sourceComponent = controlsComponent
}
NavigationHeader { text: "StatusQ.Components" }
StatusNavigationListItem {
title: "List Items"
selected: page.sourceComponent == listItemsComponent
onClicked: page.sourceComponent = listItemsComponent
}
StatusNavigationListItem {
title: "Others"
selected: page.sourceComponent == othersComponent
onClicked: page.sourceComponent = othersComponent
}
}
}
}
rightPanel: Item {
id: rightPanel
anchors.fill: parent
ScrollView {
width: parent.width
height: parent.height
contentHeight: (pageWrapper.height + pageWrapper.anchors.topMargin) * rootWindow.factor
contentWidth: pageWrapper.width * rootWindow.factor
clip: true
Item {
id: pageWrapper
width: rightPanel.width
anchors.top: parent.top
anchors.topMargin: 64
height: Math.max(rootWindow.height, page.height + 128)
scale: rootWindow.factor
Loader {
id: page
active: true
anchors.centerIn: parent
sourceComponent: iconsComponent
}
}
}
}
}
}
Action { Action {
shortcut: "CTRL+=" shortcut: "CTRL+="
onTriggered: { onTriggered: {
@ -174,44 +189,31 @@ StatusWindow {
Component { Component {
id: iconsComponent id: iconsComponent
Icons { Icons { iconColor: Theme.palette.primaryColor1 }
anchors.centerIn: parent
iconColor: Theme.palette.primaryColor1
}
} }
Component { Component {
id: controlsComponent id: controlsComponent
Controls { Controls {}
anchors.centerIn: parent
}
} }
Component { Component {
id: listItemsComponent id: listItemsComponent
ListItems { ListItems {}
anchors.centerIn: parent
}
} }
Component { Component {
id: layoutComponent id: layoutComponent
Layout { Layout {}
anchors.centerIn: parent
}
} }
Component { Component {
id: othersComponent id: othersComponent
Others { Others {}
anchors.centerIn: parent
}
} }
Component { Component {
id: buttonsComponent id: buttonsComponent
Buttons { Buttons {}
anchors.centerIn: parent
}
} }
} }