feat(Sandbox): add visual test setup page for StatusImageCropPanel
Other improvements: - save state for theme switcher and last selected page - add optional fill all test space for pages fixes: 5401
This commit is contained in:
parent
18ecb2b140
commit
59fc0a6669
|
@ -7,6 +7,8 @@ Item {
|
||||||
id: themeSwitchWrapper
|
id: themeSwitchWrapper
|
||||||
signal checkedChanged()
|
signal checkedChanged()
|
||||||
|
|
||||||
|
property alias lightThemeEnabled: switchControl.checked
|
||||||
|
|
||||||
width: themeSwitch.width
|
width: themeSwitch.width
|
||||||
height: themeSwitch.height
|
height: themeSwitch.height
|
||||||
|
|
||||||
|
@ -26,6 +28,7 @@ Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusSwitch {
|
StatusSwitch {
|
||||||
|
id: switchControl
|
||||||
onCheckedChanged: themeSwitchWrapper.checkedChanged()
|
onCheckedChanged: themeSwitchWrapper.checkedChanged()
|
||||||
|
|
||||||
StatusToolTip {
|
StatusToolTip {
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 190 KiB |
|
@ -11,6 +11,11 @@ int main(int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SandboxApp app(argc, argv);
|
SandboxApp app(argc, argv);
|
||||||
|
|
||||||
|
app.setOrganizationName("Status");
|
||||||
|
app.setOrganizationDomain("status.im");
|
||||||
|
app.setApplicationName("Sandbox");
|
||||||
|
|
||||||
app.startEngine();
|
app.startEngine();
|
||||||
|
|
||||||
return app.exec();
|
return app.exec();
|
||||||
|
|
|
@ -2,6 +2,8 @@ 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 QtGraphicalEffects 1.13
|
||||||
|
import QtQuick.Layouts 1.14
|
||||||
|
import Qt.labs.settings 1.0
|
||||||
|
|
||||||
import Sandbox 0.1
|
import Sandbox 0.1
|
||||||
|
|
||||||
|
@ -31,10 +33,7 @@ StatusWindow {
|
||||||
|
|
||||||
property real factor: 1.0
|
property real factor: 1.0
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: rootWindow.updatePosition()
|
||||||
Theme.palette = lightTheme
|
|
||||||
rootWindow.updatePosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
id: appSectionType
|
id: appSectionType
|
||||||
|
@ -110,12 +109,10 @@ StatusWindow {
|
||||||
anchors.topMargin: 32
|
anchors.topMargin: 32
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.rightMargin: 32
|
anchors.rightMargin: 32
|
||||||
onCheckedChanged: {
|
lightThemeEnabled: storeSettings.lightTheme
|
||||||
if (Theme.palette === rootWindow.lightTheme) {
|
onLightThemeEnabledChanged: {
|
||||||
Theme.palette = rootWindow.darkTheme
|
Theme.palette = lightThemeEnabled ? rootWindow.darkTheme : rootWindow.lightTheme
|
||||||
} else {
|
storeSettings.lightTheme = lightThemeEnabled
|
||||||
Theme.palette = rootWindow.lightTheme
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,11 +123,13 @@ StatusWindow {
|
||||||
StatusAppTwoPanelLayout {
|
StatusAppTwoPanelLayout {
|
||||||
id: mainPageView
|
id: mainPageView
|
||||||
|
|
||||||
function page(name) {
|
function page(name, fillPage) {
|
||||||
|
storeSettings.fillPage = fillPage ? true : false
|
||||||
viewLoader.source = Qt.resolvedUrl("./pages/" + name + "Page.qml");
|
viewLoader.source = Qt.resolvedUrl("./pages/" + name + "Page.qml");
|
||||||
}
|
}
|
||||||
function control(name) {
|
function control(name) {
|
||||||
viewLoader.source = Qt.resolvedUrl("./controls/" + name + ".qml");
|
viewLoader.source = Qt.resolvedUrl("./controls/" + name + ".qml");
|
||||||
|
storeSettings.fillPage = false
|
||||||
}
|
}
|
||||||
|
|
||||||
leftPanel: Item {
|
leftPanel: Item {
|
||||||
|
@ -303,6 +302,11 @@ StatusWindow {
|
||||||
selected: viewLoader.source.toString().includes(title)
|
selected: viewLoader.source.toString().includes(title)
|
||||||
onClicked: mainPageView.page(title);
|
onClicked: mainPageView.page(title);
|
||||||
}
|
}
|
||||||
|
StatusNavigationListItem {
|
||||||
|
title: "StatusImageCropPanel"
|
||||||
|
selected: viewLoader.source.toString().includes(title)
|
||||||
|
onClicked: mainPageView.page(title, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -310,8 +314,11 @@ StatusWindow {
|
||||||
rightPanel: Item {
|
rightPanel: Item {
|
||||||
id: rightPanel
|
id: rightPanel
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
ScrollView {
|
ScrollView {
|
||||||
|
visible: !storeSettings.fillPage
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
anchors.topMargin: 64
|
||||||
contentHeight: (pageWrapper.height + pageWrapper.anchors.topMargin) * rootWindow.factor
|
contentHeight: (pageWrapper.height + pageWrapper.anchors.topMargin) * rootWindow.factor
|
||||||
contentWidth: (pageWrapper.width * rootWindow.factor)
|
contentWidth: (pageWrapper.width * rootWindow.factor)
|
||||||
clip: true
|
clip: true
|
||||||
|
@ -320,14 +327,16 @@ StatusWindow {
|
||||||
id: pageWrapper
|
id: pageWrapper
|
||||||
width: rightPanel.width
|
width: rightPanel.width
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.topMargin: 64
|
|
||||||
height: Math.max(rootWindow.height, viewLoader.height + 128)
|
height: Math.max(rootWindow.height, viewLoader.height + 128)
|
||||||
scale: rootWindow.factor
|
scale: rootWindow.factor
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
id: viewLoader
|
id: viewLoader
|
||||||
|
active: !storeSettings.fillPage
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
source: mainPageView.control("Icons")
|
source: storeSettings.selected.length === 0 ? mainPageView.control("Icons") : storeSettings.selected
|
||||||
onSourceChanged: {
|
onSourceChanged: {
|
||||||
|
storeSettings.selected = viewLoader.source
|
||||||
if (source.toString().includes("Icons")) {
|
if (source.toString().includes("Icons")) {
|
||||||
item.iconColor = Theme.palette.primaryColor1;
|
item.iconColor = Theme.palette.primaryColor1;
|
||||||
}
|
}
|
||||||
|
@ -335,6 +344,15 @@ StatusWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loader {
|
||||||
|
active: storeSettings.fillPage
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.topMargin: 64
|
||||||
|
visible: storeSettings.fillPage
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
source: viewLoader.source
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -452,4 +470,11 @@ StatusWindow {
|
||||||
rootWindow.toggleFullScreen()
|
rootWindow.toggleFullScreen()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Settings {
|
||||||
|
id: storeSettings
|
||||||
|
property string selected: ""
|
||||||
|
property bool lightTheme: true
|
||||||
|
property bool fillPage: false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
import QtQuick 2.14
|
||||||
|
import QtQuick.Layouts 1.14
|
||||||
|
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
import StatusQ.Components 0.1
|
||||||
|
|
||||||
|
import QtGraphicalEffects 1.14
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
implicitWidth: mainLayout.implicitWidth
|
||||||
|
implicitHeight: mainLayout.implicitHeight
|
||||||
|
|
||||||
|
property var testControls: [ctrl1, ctrl2, ctrl3]
|
||||||
|
|
||||||
|
property bool globalStylePreferRound: true
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: mainLayout
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
ColumnLayout {
|
||||||
|
Text {
|
||||||
|
text: `AR: ${ctrl1.aspectRatio.toFixed(2)}`
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusImageCropPanel {
|
||||||
|
id: ctrl1
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
source: "qrc:/demoapp/data/logo-test-image.png"
|
||||||
|
windowStyle: globalStylePreferRound ? StatusImageCrop.WindowStyle.Rounded : StatusImageCrop.WindowStyle.Rectangular
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: `AR: ${ctrl2.aspectRatio.toFixed(2)}`
|
||||||
|
}
|
||||||
|
StatusImageCropPanel {
|
||||||
|
id: ctrl2
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
source: "qrc:/demoapp/data/logo-test-image.png"
|
||||||
|
windowStyle: globalStylePreferRound ? StatusImageCrop.WindowStyle.Rectangular : StatusImageCrop.WindowStyle.Rounded
|
||||||
|
aspectRatio: 16/9
|
||||||
|
enableCheckers: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ColumnLayout {
|
||||||
|
Text {
|
||||||
|
text: `AR: ${ctrl3.aspectRatio.toFixed(2)}`
|
||||||
|
}
|
||||||
|
StatusImageCropPanel {
|
||||||
|
id: ctrl3
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
source: "qrc:/demoapp/data/logo-test-image.png"
|
||||||
|
windowStyle: globalStylePreferRound ? StatusImageCrop.WindowStyle.Rounded : StatusImageCrop.WindowStyle.Rectangular
|
||||||
|
aspectRatio: 0.8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Shortcut {
|
||||||
|
sequence: StandardKey.ZoomIn
|
||||||
|
onActivated: {
|
||||||
|
for(let i in testControls) {
|
||||||
|
const c = testControls[i]
|
||||||
|
c.setCropRect(ctrl1.inflateRectBy(c.cropRect, -0.05))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Shortcut {
|
||||||
|
sequence: StandardKey.ZoomOut
|
||||||
|
onActivated: {
|
||||||
|
for(let i in testControls) {
|
||||||
|
const c = testControls[i]
|
||||||
|
c.setCropRect(ctrl1.inflateRectBy(c.cropRect, 0.05))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Shortcut {
|
||||||
|
sequences: ["Ctrl+W"]
|
||||||
|
onActivated: globalStylePreferRound = !globalStylePreferRound
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -33,6 +33,7 @@
|
||||||
<file>demoapp/StatusAppProfileSettingsView.qml</file>
|
<file>demoapp/StatusAppProfileSettingsView.qml</file>
|
||||||
<file>demoapp/data/Models.qml</file>
|
<file>demoapp/data/Models.qml</file>
|
||||||
<file>demoapp/data/qmldir</file>
|
<file>demoapp/data/qmldir</file>
|
||||||
|
<file>demoapp/data/logo-test-image.png</file>
|
||||||
<file>DemoApp.qml</file>
|
<file>DemoApp.qml</file>
|
||||||
<file>ThemeSwitch.qml</file>
|
<file>ThemeSwitch.qml</file>
|
||||||
<file>pages/StatusColorSelectorGridPage.qml</file>
|
<file>pages/StatusColorSelectorGridPage.qml</file>
|
||||||
|
|
Loading…
Reference in New Issue