import QtQuick 2.10 import QtQuick.Controls 2.3 import QtQuick.Controls.Material 2.3 import QtQuick.Layouts 1.3 import de.skycoder42.QtMvvm.Core 1.0 import de.skycoder42.QtMvvm.Quick 1.0 Page { id: _settingsView property SettingsViewModel viewModel: null property bool fullClose: false function closeAction() { return !fullClose && _settingsStack.closeAction(); } header: ToolBar { id: _toolBar RowLayout { id: _toolLayout anchors.fill: parent spacing: 0 Item { id: _labelContainer Layout.fillWidth: true Layout.minimumHeight: 56 Layout.leftMargin: 10 Label { id: _titleLabel font.pointSize: 14 font.bold: true elide: Label.ElideRight horizontalAlignment: Qt.AlignLeft verticalAlignment: Qt.AlignVCenter anchors.fill: parent text: qsTr("Settings") visible: !_searchField.visible } TextField { id: _searchField horizontalAlignment: Qt.AlignLeft verticalAlignment: Qt.AlignVCenter anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter height: Math.min(implicitHeight, parent.height) width: parent.width } } ActionButton { id: _searchButton visible: _builder.allowSearch toolTip: qsTr("Search in settings") onClicked: toggleSearchState() } ActionButton { id: _restoreButton visible: _builder.allowRestore source: "image://svg/de/skycoder42/qtmvvm/quick/icons/ic_settings_backup_restore" toolTip: qsTr("Restore settings") onClicked: _builder.restoreDefaults() } } } states: [ State { name: "title" PropertyChanges { target: _searchButton source: "image://svg/de/skycoder42/qtmvvm/quick/icons/ic_search" } PropertyChanges { target: _titleLabel visible: true } PropertyChanges { target: _searchField visible: false width: 0 } StateChangeScript { name: "focusScript" script: _searchField.clear(); } }, State { name: "search" PropertyChanges { target: _searchButton source: "image://svg/de/skycoder42/qtmvvm/quick/icons/ic_close" } PropertyChanges { target: _titleLabel visible: false } PropertyChanges { target: _searchField visible: true width: _labelContainer.width } StateChangeScript { name: "focusScript" script: _searchField.forceActiveFocus(); } } ] transitions: [ Transition { from: "title" to: "search" SequentialAnimation { PropertyAnimation { target: _searchField property: "visible" duration: 0 } PropertyAnimation { target: _searchField property: "width" duration: 250 easing.type: Easing.InOutCubic } PropertyAnimation { target: _titleLabel property: "visible" duration: 0 } } }, Transition { from: "search" to: "title" SequentialAnimation { PropertyAnimation { target: _titleLabel property: "visible" duration: 0 } PropertyAnimation { target: _searchField property: "width" duration: 250 easing.type: Easing.InOutCubic } PropertyAnimation { target: _searchField property: "visible" duration: 0 } } } ] state: "title" function toggleSearchState() { if(state == "title") state = "search"; else state = "title"; } PresenterProgress {} StackView { id: _settingsStack anchors.fill: parent function closeAction() { if(_settingsStack.depth <= 1) return false; else { _settingsStack.pop(); return true; } } } Component { id: _overviewComponent OverviewListView { id: __ovListView builder: _builder Component.onCompleted: _settingsStack.push(__ovListView) } } Component { id: _sectionViewComponent SectionListView { id: __secListView builder: _builder Component.onCompleted: _settingsStack.push(__secListView) } } SettingsUiBuilder { id: _builder buildView: _settingsView viewModel: _settingsView.viewModel filterText: _searchField.text onPresentOverview: _overviewComponent.incubateObject(_settingsStack, { model: model, showSections: hasSections }, Qt.Asynchronous) onPresentSection: _sectionViewComponent.incubateObject(_settingsStack, { model: model }, Qt.Asynchronous) onCloseSettings: { _settingsView.fullClose = true; QuickPresenter.popView(); } } }