Todo List Demo App
import Felgo 3.0
import QtQuick 2.0
import "../ui"
Page {
id: page
title: qsTr("Todo List")
leftBarItem: IconButtonBarItem {
icon: IconType.gear
onClicked: settingsDialog.open()
}
rightBarItem: NavigationBarRow {
ActivityIndicatorBarItem {
enabled: dataModel.isBusy
visible: enabled
showItem: showItemAlways
}
IconButtonBarItem {
icon: IconType.plus
showItem: showItemAlways
onClicked: {
var title = qsTr("New Todo")
logic.addNewDraftTodo(title)
}
}
}
Connections {
target: dataModel
onDraftTodoCreated: {
if(page.navigationStack.splitViewActive)
page.navigationStack.popAllExceptFirstAndPush(detailPageComponent, { todoId: todo.id })
if(sortFilterSettings.storeDraftsActive)
logic.storeDraftTodo(todo)
}
}
JsonListModel {
id: myJsonListModel
source: dataModel.draftTodos.concat(dataModel.todos)
keyField: "id"
fields: ["id", "title", "completed"]
}
SortFilterProxyModel {
id: filteredModel
sourceModel: myJsonListModel
sorters: [
StringSorter {
id: titleSorter
roleName: "title"
enabled: sortFilterSettings.sortTitleActive
}]
filters: [
ValueFilter {
id: completedFilter
roleName: "completed"
value: true
enabled: sortFilterSettings.filterCompletedActive
}
]
}
AppListView {
id: listView
anchors.fill: parent
model: filteredModel
delegate: SimpleRow {
text: viewHelper.formatTodoId(model)
detailText: "Title: "+title
style.textColor: dataModel.isDraft(model) ? "grey" : Theme.listItem.textColor
onSelected: page.navigationStack.popAllExceptFirstAndPush(detailPageComponent, { todoId: model.id })
Rectangle {
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.margins: dp(4)
width: dp(4)
color: completed ? "lightgreen" : Theme.secondaryBackgroundColor
}
}
add: Transition {
NumberAnimation {
property: "opacity";
from: 0;
to: 1;
duration: 200
easing.type: Easing.OutQuad;
}
}
addDisplaced: Transition {
NumberAnimation {
properties: "x,y";
duration: 200
easing.type: Easing.OutQuad;
}
}
remove: Transition {
NumberAnimation {
property: "opacity";
from: 1;
to: 0;
duration: 200
easing.type: Easing.OutQuad;
}
}
removeDisplaced: Transition {
NumberAnimation {
properties: "x,y";
duration: 200
easing.type: Easing.OutQuad;
}
}
scrollIndicatorVisible: false
footer: VisibilityRefreshHandler {
canRefresh: !dataModel.isFetchingTodos
onRefresh: logic.fetchNextPage()
}
PullToRefreshHandler {
refreshing: dataModel.isFetchingTodos
onRefresh: logic.fetchTodos()
}
}
Component {
id: detailPageComponent
TodoDetailPage { }
}
Dialog {
id: settingsDialog
title: qsTr("Settings")
positiveAction: false
negativeActionLabel: qsTr("Close")
onCanceled: close()
mainWindow: getApplication()
SortFilterSettings {
id: sortFilterSettings
anchors.centerIn: parent