12 changed files with 347 additions and 10 deletions
@ -0,0 +1,172 @@ |
|||
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.1 |
|||
import de.skycoder42.QtMvvm.Quick 1.1 |
|||
|
|||
Item { |
|||
id: _searchBar |
|||
|
|||
property alias title: _titleLabel.text |
|||
property alias allowSearch: _searchButton.visible |
|||
property alias searchToolTip: _searchButton.text |
|||
property bool inSearchMode: state == "search" |
|||
|
|||
property alias searchText: _searchField.text |
|||
|
|||
function showTitle() { |
|||
state = "title"; |
|||
} |
|||
|
|||
function showSearchBar(text) { |
|||
if(typeof text === "string") |
|||
searchText = text |
|||
state = "search"; |
|||
} |
|||
|
|||
//! @brief Can be called to toggle the state of the search bar |
|||
function toggleSearchState() { |
|||
if(!allowSearch) |
|||
return; |
|||
if(inSearchMode) |
|||
showTitle(); |
|||
else |
|||
showSearchBar(); |
|||
} |
|||
|
|||
onAllowSearchChanged: { |
|||
if(!allowSearch) |
|||
showTitle(); |
|||
} |
|||
|
|||
RowLayout { |
|||
anchors.fill: parent |
|||
spacing: 0 |
|||
|
|||
Item { |
|||
id: _labelContainer |
|||
|
|||
Layout.fillWidth: true |
|||
Layout.fillHeight: true |
|||
Layout.leftMargin: 16 |
|||
|
|||
ToolBarLabel { |
|||
id: _titleLabel |
|||
anchors.fill: parent |
|||
leftPadding: 0 |
|||
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 |
|||
text: qsTr("Search…") |
|||
onClicked: toggleSearchState() |
|||
} |
|||
} |
|||
|
|||
states: [ |
|||
State { |
|||
name: "title" |
|||
PropertyChanges { |
|||
target: _searchButton |
|||
icon.name: "search" |
|||
icon.source: "qrc:/de/skycoder42/qtmvvm/quick/icons/ic_search.svg" |
|||
} |
|||
PropertyChanges { |
|||
target: _titleLabel |
|||
visible: true |
|||
} |
|||
PropertyChanges { |
|||
target: _searchField |
|||
visible: false |
|||
width: 0 |
|||
} |
|||
StateChangeScript { |
|||
name: "clearScript" |
|||
script: _searchField.clear(); |
|||
} |
|||
}, |
|||
State { |
|||
name: "search" |
|||
PropertyChanges { |
|||
target: _searchButton |
|||
icon.name: "gtk-close" |
|||
icon.source: "qrc:/de/skycoder42/qtmvvm/quick/icons/ic_close.svg" |
|||
} |
|||
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" |
|||
} |
@ -0,0 +1,160 @@ |
|||
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.1 |
|||
import de.skycoder42.QtMvvm.Quick 1.1 |
|||
|
|||
/*! @brief The view implementation for the QtMvvm::SettingsViewModel |
|||
* |
|||
* @extends QtQuick.Controls.Page |
|||
* |
|||
* @details This is the view used to present a settings view model. You can extend the class |
|||
* if you need to extend that view. |
|||
* |
|||
* @sa QtMvvm::SettingsViewModel |
|||
*/ |
|||
Page { |
|||
id: _settingsView |
|||
|
|||
/*! @brief The viewmodel to use |
|||
* |
|||
* @default{<i>Injected</i>} |
|||
* |
|||
* @accessors{ |
|||
* @memberAc{viewModel} |
|||
* @notifyAc{viewModelChanged()} |
|||
* } |
|||
* |
|||
* @sa QtMvvm::SettingsViewModel |
|||
*/ |
|||
property SettingsViewModel viewModel: null |
|||
/*! @brief Specifiy if a back action should always close the full settings |
|||
* |
|||
* @default{`false`} |
|||
* |
|||
* The settings view consists of an internal stack view to present settings pages. By |
|||
* default only one page is closed at a time. By setting this property to true, a close |
|||
* action will always close all of them. |
|||
* |
|||
* @accessors{ |
|||
* @memberAc{fullClose} |
|||
* @notifyAc{fullCloseChanged()} |
|||
* } |
|||
*/ |
|||
property bool fullClose: false |
|||
|
|||
/*! @brief Can be called to try to close a single settings page |
|||
* |
|||
* @return type:bool `true` if a page was closed, `false` if not |
|||
* |
|||
* This method is called by the presenter to close the pages of the settings view one at |
|||
* a time. |
|||
* |
|||
* @note if SettingsView::fullClose is true, this method will always return false. |
|||
* |
|||
* @sa SettingsView::fullClose, PresentingStackView::closeAction |
|||
*/ |
|||
function closeAction() { |
|||
return !fullClose && _settingsStack.closeAction(); |
|||
} |
|||
|
|||
header: ContrastToolBar { |
|||
id: _toolBar |
|||
|
|||
RowLayout { |
|||
id: _toolLayout |
|||
anchors.fill: parent |
|||
spacing: 0 |
|||
|
|||
SearchBar { |
|||
id: _searchBar |
|||
|
|||
Layout.fillWidth: true |
|||
Layout.fillHeight: true |
|||
|
|||
title: qsTr("Settings") |
|||
allowSearch: _builder.allowSearch |
|||
searchToolTip: qsTr("Search in settings") |
|||
} |
|||
|
|||
ActionButton { |
|||
id: _restoreButton |
|||
visible: _builder.allowRestore |
|||
icon.source: "qrc:/de/skycoder42/qtmvvm/quick/icons/ic_settings_backup_restore.svg" |
|||
text: qsTr("Restore settings") |
|||
onClicked: _builder.restoreDefaults() |
|||
} |
|||
} |
|||
} |
|||
|
|||
PresenterProgress {} |
|||
|
|||
StackView { |
|||
id: _settingsStack |
|||
anchors.fill: parent |
|||
|
|||
function closeAction() { |
|||
if(_settingsStack.depth <= 1) |
|||
return false; |
|||
else { |
|||
_settingsStack.pop(); |
|||
return true; |
|||
} |
|||
} |
|||
} |
|||
|
|||
Component { |
|||
id: _overviewComponent |
|||
|
|||
ScrollView { |
|||
id: __ovScrollView |
|||
property alias model: __ovListView.model |
|||
property alias showSections: __ovListView.showSections |
|||
clip: true |
|||
|
|||
OverviewListView { |
|||
id: __ovListView |
|||
builder: _builder |
|||
} |
|||
|
|||
Component.onCompleted: _settingsStack.push(__ovScrollView) |
|||
} |
|||
} |
|||
|
|||
Component { |
|||
id: _sectionViewComponent |
|||
|
|||
ScrollView { |
|||
id: __secScrollView |
|||
property alias model: __secListView.model |
|||
clip: true |
|||
|
|||
SectionListView { |
|||
id: __secListView |
|||
builder: _builder |
|||
} |
|||
|
|||
Component.onCompleted: _settingsStack.push(__secScrollView) |
|||
} |
|||
} |
|||
|
|||
SettingsUiBuilder { |
|||
id: _builder |
|||
buildView: _settingsView |
|||
viewModel: _settingsView.viewModel |
|||
filterText: _searchBar.searchText |
|||
|
|||
onPresentOverview: _overviewComponent.incubateObject(_settingsStack, { |
|||
model: model, |
|||
showSections: hasSections |
|||
}, Qt.Synchronous) |
|||
onPresentSection: _sectionViewComponent.incubateObject(_settingsStack, { |
|||
model: model |
|||
}, Qt.Synchronous) |
|||
onCloseSettings: { |
|||
_settingsView.fullClose = true; |
|||
QuickPresenter.popView(); |
|||
} |
|||
} |
|||
} |
@ -1,3 +1,3 @@ |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.0 as QtMvvm |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.1 as QtMvvm |
|||
|
|||
QtMvvm.ChangeRemoteView {} |
|||
|
@ -1,3 +1,3 @@ |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.0 as QtMvvm |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.1 as QtMvvm |
|||
|
|||
QtMvvm.DataSyncView {} |
|||
|
@ -1,3 +1,3 @@ |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.0 as QtMvvm |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.1 as QtMvvm |
|||
|
|||
QtMvvm.ExportSetupView {} |
|||
|
@ -1,3 +1,3 @@ |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.0 as QtMvvm |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.1 as QtMvvm |
|||
|
|||
QtMvvm.IdentityEditView {} |
|||
|
@ -1,3 +1,3 @@ |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.0 as QtMvvm |
|||
import de.skycoder42.QtMvvm.DataSync.Quick 1.1 as QtMvvm |
|||
|
|||
QtMvvm.NetworkExchangeView {} |
|||
|
@ -1,3 +1,3 @@ |
|||
import de.skycoder42.QtMvvm.Quick 1.0 as QtMvvm |
|||
import de.skycoder42.QtMvvm.Quick 1.1 as QtMvvm |
|||
|
|||
QtMvvm.SettingsView {} |
|||
|
Loading…
Reference in new issue