kde-playground/kdepim/mobile/tasks/tasks.qml
2015-04-14 21:49:29 +00:00

422 lines
13 KiB
QML

/*
Copyright (c) 2010 Volker Krause <vkrause@kde.org>
Copyright (c) 2010 Bertjan Broeksema <broeksema@kde.org>
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
*/
import QtQuick 1.1 as QML
import org.kde 4.5
import org.kde.akonadi 4.5 as Akonadi
import org.kde.pim.mobileui 4.5 as KPIM
import org.kde.kcal 4.5 as KCal
import org.kde.akonadi.tasks 4.5 as Tasks
import "../mobileui/ScreenFunctions.js" as Screen
KPIM.MainView {
id: tasksMobile
QML.Connections {
target: guiStateManager
onGuiStateChanged: { updateContextActionStates() }
}
QML.Component.onCompleted : updateContextActionStates();
function updateContextActionStates()
{
if ( guiStateManager.inHomeScreenState ) {
taskActions.showOnlyCategory( "home" )
} else if ( guiStateManager.inAccountScreenState ) {
taskActions.showOnlyCategory( "account" )
} else if ( guiStateManager.inSingleFolderScreenState ) {
taskActions.showOnlyCategory( "single_folder" )
} else if ( guiStateManager.inMultipleFolderScreenState || guiStateManager.inSearchResultScreenState ) {
taskActions.showOnlyCategory( "multiple_folder" )
} else if ( guiStateManager.inViewSingleItemState ) {
taskActions.showOnlyCategory( "todo_viewer" )
}
}
KCal.IncidenceView {
id: taskView
visible: guiStateManager.inViewSingleItemState
anchors { fill: parent; topMargin: 40; leftMargin: 40 }
width: parent.width
height: parent.height
z: 0
itemId: -1
swipeLength: 0.2 // Require at least 20% of screenwidth to trigger next or prev
onNextItemRequest: {
_itemNavigationModel.requestNext();
}
onPreviousItemRequest: {
_itemNavigationModel.requestPrevious();
}
KPIM.ItemEditButton {
actionName: "akonadi_incidence_edit"
anchors.bottom: backButton.top
anchors.right: parent.right
anchors.margins: 12
onClicked: {
application.editIncidence( parent.item );
}
}
KPIM.Button {
id: backButton
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.margins: 12
width: 70
height: 70
icon: KDE.locate( "data", "mobileui/back-to-list-button.png" );
onClicked: {
_itemActionModel.select(-1, 1)
_itemNavigationModel.select(-1, 1)
guiStateManager.popState();
}
}
}
QML.Item {
id : mainWorkView
visible: { guiStateManager.inHomeScreenState ||
guiStateManager.inAccountScreenState ||
guiStateManager.inSingleFolderScreenState ||
guiStateManager.inMultipleFolderScreenState
}
anchors.top: parent.top
anchors.topMargin : 12
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right : parent.right
QML.Image {
id: backgroundImage
x: 0
y: 0
// FIXME: too big, costs about 1.5Mb RAM
// source: "tasks-mobile-background.png"
visible: collectionView.visible
}
Akonadi.AkonadiBreadcrumbNavigationView {
id : collectionView
anchors.top: parent.top
width: 1/3 * parent.width
anchors.bottom : selectButton.top
//height : parent.height - ( collectionView.hasSelection ? 0 : selectButton.height)
anchors.left: parent.left
itemHeight: Screen.partition( height, 7 )
breadcrumbComponentFactory : _breadcrumbNavigationFactory
multipleSelectionText : KDE.i18nc("%1 is e.g. 3 folders, %2 is e.g. from 2 accounts, %3 is e.g. 9 tasks",
"You have selected \n%1\n%2\n%3",
KDE.i18np("1 folder","%1 folders",collectionView.numSelected),
KDE.i18np("from 1 account","from %1 accounts",application.numSelectedAccounts),
KDE.i18np("1 task","%1 tasks",itemList.count))
onSelectedClicked : {
guiStateManager.pushState( KPIM.GuiStateManager.BulkActionScreenState )
}
KPIM.AgentStatusIndicator {
anchors { top: parent.top; right: parent.right; rightMargin: 10; topMargin: 10 }
}
}
KPIM.Button2 {
id : selectButton
anchors.left: collectionView.left
anchors.right: collectionView.right
anchors.bottom : parent.bottom
anchors.bottomMargin : { (collectionView.numSelected == 1) ? -selectButton.height : 0 }
buttonText : (collectionView.numSelected <= 1) ? KDE.i18n("Select") : KDE.i18n("Change Selection")
opacity : { (collectionView.numSelected == 1) ? 0 : 1 }
onClicked : {
application.persistCurrentSelection("preFavSelection");
guiStateManager.pushState( KPIM.GuiStateManager.MultipleFolderSelectionScreenState )
}
}
KPIM.StartCanvas {
id : startPage
visible: !collectionView.hasSelection
anchors.left : collectionView.right
anchors.top : parent.top
anchors.bottom : parent.bottom
anchors.right : parent.right
anchors.leftMargin : 10
anchors.rightMargin : 10
showAccountsList : false
favoritesModel : favoritesList
contextActions : [
QML.Column {
anchors.fill: parent
height : 70
KPIM.Button2 {
width: parent.width
buttonText : KDE.i18n( "New Task" )
onClicked : {
application.newTask();
}
}
}
]
}
QML.Rectangle {
id : emptyFolderPage
visible: (!guiStateManager.inHomeScreenState && collectionView.hasBreadcrumbs && itemList.count == 0)
anchors.left : collectionView.right
anchors.top : parent.top
anchors.bottom : parent.bottom
anchors.right : parent.right
color : "#00000000"
// TODO: content
QML.Text {
text : KDE.i18n("No tasks in this folder");
height : 20;
font.italic : true
horizontalAlignment : QML.Text.AlignHCenter
anchors.verticalCenter : parent.verticalCenter;
anchors.horizontalCenter : parent.horizontalCenter
}
}
QML.Rectangle {
id : itemListPage
visible: { guiStateManager.inAccountScreenState ||
guiStateManager.inSingleFolderScreenState ||
guiStateManager.inMultipleFolderScreenState
}
anchors.left : collectionView.right
anchors.top : parent.top
anchors.bottom : parent.bottom
anchors.right : parent.right
color : "#00000000"
TaskListView {
id: itemList
model: itemModel
checkModel : _itemActionModel
anchors.left : parent.left
anchors.top : parent.top
anchors.bottom : filterLineEdit.top
anchors.right : parent.right
navigationModel : _itemNavigationModel
itemHeight: Screen.partition( height, 7 )
}
Akonadi.FilterLineEdit {
id: filterLineEdit
anchors.left : parent.left
anchors.bottom : parent.bottom
anchors.right : parent.right
visible : false
height : 0
y: height == 0 ? parent.height : parent.height - height
}
QML.Connections {
target : _itemNavigationModel
onCurrentRowChanged : {
if ( _itemNavigationModel.currentRow != -1 ) {
taskView.itemId = _itemNavigationModel.currentItemIdHack
guiStateManager.pushUniqueState( KPIM.GuiStateManager.ViewSingleItemState );
_itemActionModel.select( _itemNavigationModel.currentRow, 3 );
}
}
}
}
}
SlideoutPanelContainer {
anchors.fill: parent
z: 100
visible: !guiStateManager.inBulkActionScreenState &&
!guiStateManager.inMultipleFolderSelectionScreenState &&
!guiStateManager.inConfigScreenState &&
!guiStateManager.inSearchScreenState
SlideoutPanel {
id: actionPanel
titleText: KDE.i18n( "Actions" )
handlePosition : 125
handleHeight: 150
anchors.fill : parent
QML.Component.onCompleted: {
actionPanel.expanded.connect( taskActions, taskActions.refresh );
}
content : [
TaskActions {
id : taskActions
anchors.fill : parent
scriptActions : [
KPIM.ScriptAction {
name : "show_about_dialog"
script : {
actionPanel.collapse();
aboutDialog.visible = true
}
},
KPIM.ScriptAction {
name : "configure"
script : {
actionPanel.collapse();
guiStateManager.pushState( KPIM.GuiStateManager.ConfigScreenState );
}
},
//TODO enable when SearchWidget::query() is implemented
// KPIM.ScriptAction {
// name : "search_task"
// script : {
// actionPanel.collapse();
// guiStateManager.pushState( KPIM.GuiStateManager.SearchScreenState );
// }
// },
KPIM.ScriptAction {
name : "to_selection_screen"
script : {
actionPanel.collapse();
guiStateManager.pushState( KPIM.GuiStateManager.MultipleFolderSelectionScreenState )
}
},
KPIM.ScriptAction {
name : "add_as_favorite"
script : {
actionPanel.collapse();
application.saveFavorite();
}
},
KPIM.ScriptAction {
name : "start_maintenance"
script : {
actionPanel.collapse();
guiStateManager.pushState( KPIM.GuiStateManager.BulkActionScreenState )
}
}
]
onDoCollapse : actionPanel.collapse();
}
]
}
SlideoutPanel {
anchors.fill: parent
handlePosition : actionPanel.handlePosition + actionPanel.handleHeight
id: attachmentPanel
visible: (taskView.attachmentModel.attachmentCount >= 1) && guiStateManager.inViewSingleItemState
titleIcon: KDE.iconPath( "mail-attachment", 48 );
handleHeight: parent.height - actionPanel.handlePosition - actionPanel.handleHeight - anchors.topMargin - anchors.bottomMargin
content: [
KPIM.AttachmentList {
id: attachmentView
model: taskView.attachmentModel
anchors.fill: parent
onOpenAttachment: {
application.openAttachment(url, mimeType);
}
onSaveAttachment: {
application.saveAttachment(url, fileName);
}
}
]
}
}
QML.Loader {
anchors.fill: parent
source: guiStateManager.inMultipleFolderSelectionScreenState ? KDE.locate( "module", "imports/org/kde/pim/mobileui/MultipleSelectionScreen.qml" ) : ""
onLoaded: { item.backgroundImage = backgroundImage.source; }
}
QML.Loader {
anchors.fill: parent
source: guiStateManager.inBulkActionScreenState ? "BulkActionComponent.qml" : ""
onLoaded: {
item.backgroundImage = backgroundImage.source
item.itemHeight = Screen.partition( item.height, 7 )
}
}
KPIM.SearchResultScreen {
id : searchResultScreen
anchors.top: parent.top
anchors.topMargin : 12
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right : parent.right
itemView: TaskListView {
id: searchTaskListView
model: itemModel
checkModel : _itemActionModel
navigationModel : _itemNavigationModel
anchors.fill : parent
itemHeight: Screen.partition( height, 7 )
}
resultText: KDE.i18np( "One task found", "%1 tasks found", searchTaskListView.count )
}
QML.Connections {
target: taskView
onIncidenceRemoved : { guiStateManager.popState(); }
}
QML.Connections {
target: startPage
onFavoriteSelected : {
application.loadFavorite(favName);
}
}
QML.Loader {
id : aboutDialog
anchors.fill: parent
visible: false
source: visible ? KDE.locate( "module", "imports/org/kde/pim/mobileui/AboutDialog.qml" ) : ""
onLoaded: { item.backgroundSource = backgroundImage.source; }
}
QML.Loader {
anchors.fill: parent
source: guiStateManager.inConfigScreenState ? "ConfigDialog.qml" : ""
onLoaded: item.load();
}
KPIM.SearchDialog {
id: searchDialog
searchWidget: Tasks.SearchWidget {
anchors.fill: parent
}
}
}