First attempt at getting rid of tracker for post capture
[harmattan/cameraplus] / qml / PostCaptureView.qml
1 // -*- qml -*-
2
3 /*!
4  * This file is part of CameraPlus.
5  *
6  * Copyright (C) 2012-2013 Mohammed Sameer <msameer@foolab.org>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  */
22
23 import QtQuick 2.0
24 import CameraPlus 1.0
25 import QtCamera 1.0
26
27 // TODO: qrc:/qml/PostCaptureView.qml:104:5: QML CameraToolBar: Binding loop detected for property "height"
28
29 Item {
30     id: postCaptureView
31
32     property Camera camera: null
33     property bool pressed: view.currentItem ? view.currentItem.playing : false
34     property int policyMode: view.currentItem && view.currentItem.playing ?
35         CameraResources.Player : settings.mode == Camera.VideoMode ? CameraResources.Video :
36         CameraResources.Image
37
38     Connections {
39         target: view.currentItem
40         onPlayingChanged: {
41             if (view.currentItem.playing) {
42                 hideTimer.running = false
43             }
44         }
45     }
46
47     ShareHelper {
48         id: share
49         settings: platformSettings
50     }
51
52     GalleryHelper {
53         id: gallery
54         settings: platformSettings
55     }
56
57     ListView {
58         id: view
59         anchors.fill: parent
60         snapMode: ListView.SnapOneItem
61         cacheBuffer: height * 3
62         model: postCaptureModel
63         highlightRangeMode: ListView.StrictlyEnforceRange
64         interactive: view.currentItem && view.currentItem.playing ? false : true
65
66         delegate: PostCaptureItem {
67             width: view.width
68             height: view.height
69             onClicked: hideTimer.running = !hideTimer.running
70         }
71
72         onFlickingChanged: {
73             if (flicking && hideTimer.running) {
74                 restartTimer()
75             }
76         }
77     }
78
79     property variant postCaptureModel: postCaptureModelLoader.item ?
80         postCaptureModelLoader.item.model : null
81     property bool loadModel: mainView.currentIndex == 2 && Qt.application.active
82
83     Loader {
84         id: postCaptureModelLoader
85         sourceComponent: loadModel ? postCaptureModelComponent : undefined
86     }
87
88     // We have to do it that way because Loader does not support non-visual elements.
89     Component {
90         id: postCaptureModelComponent
91
92         Item {
93             property alias model: postCaptureModel
94
95             PostCaptureModel {
96                 id: postCaptureModel
97                 imagePath: platformSettings.imagePath
98                 videoPath: platformSettings.videoPath
99
100                 Component.onCompleted: reload()
101             }
102         }
103     }
104
105     Timer {
106         id: hideTimer
107         running: false
108         interval: 3000
109     }
110
111     CameraToolBar {
112         id: toolBar
113         expanded: true
114         hideBack: true
115         anchors.bottom: parent.bottom
116         anchors.bottomMargin: show ? 20 : -1 * (height + 20)
117         anchors.left: parent.left
118         anchors.leftMargin: 20
119         anchors.right: parent.right
120         anchors.rightMargin: 20
121         opacity: 0.8
122
123         property bool show: deleteDialog.isOpen || deleteDialog.isOpening ||
124             hideTimer.running ||
125             (view.currentItem != null && view.currentItem.error) && !view.currentItem.playing
126
127         Behavior on anchors.bottomMargin {
128             PropertyAnimation { duration: view.currentItem && view.currentItem.playing ? 0 : 200 }
129         }
130
131         tools: CameraToolBarTools {
132             CameraToolIcon {
133                 iconSource: cameraTheme.shareIconId
134                 onClicked: {
135                     shareCurrentItem()
136                     restartTimer()
137                 }
138             }
139
140             CameraToolIcon {
141                 iconSource: cameraTheme.deleteIconId
142                 onClicked: {
143                     deleteCurrentItem()
144                     restartTimer()
145                 }
146             }
147
148             CameraToolIcon {
149                 iconSource: cameraTheme.galleryIconId
150                 onClicked: {
151                     launchGallery()
152                     restartTimer()
153                 }
154             }
155         }
156     }
157
158     CameraQueryDialog {
159         id: deleteDialog
160         titleText: qsTr("Delete item?");
161         acceptButtonText: qsTr("Yes");
162         rejectButtonText: qsTr("No");
163
164         onStatusChanged: restartTimer()
165
166         onAccepted: {
167             if (!remove.remove(view.currentItem.itemUrl)) {
168                 showError(qsTr("Failed to delete item"))
169             } else {
170                 view.model.remove(view.currentItem.itemUrl)
171             }
172         }
173
174         DeleteHelper {
175             id: remove
176         }
177     }
178
179     Rectangle {
180         opacity: toolBar.opacity
181         anchors.top: parent.top
182         anchors.topMargin: toolBar.show ? 20 : -1 * (height + 20)
183         anchors.left: parent.left
184         anchors.leftMargin: 20
185         anchors.right: parent.right
186         anchors.rightMargin: 20
187         visible: toolBar.visible
188         height: screen.isPortrait ? toolBar.height * 2 : toolBar.height
189         color: toolBar.color
190         border.color: toolBar.border.color
191         radius: toolBar.radius
192
193         Behavior on anchors.topMargin {
194             PropertyAnimation { duration: view.currentItem && view.currentItem.playing ? 0 : 200 }
195         }
196
197         Flow {
198             width: parent.width - 40
199             x: 20
200             height: parent.height
201
202             CameraLabel {
203                 text: view.currentItem ? view.currentItem.itemTitle : ""
204                 width: parent.width / 2
205                 height: parent.height
206                 font.bold: true
207                 verticalAlignment: Text.AlignVCenter
208                 horizontalAlignment: Text.AlignLeft
209             }
210
211             CameraLabel {
212                 text: view.currentItem ? view.currentItem.itemCreated : ""
213                 width: parent.width / 2
214                 height: parent.height
215                 font.bold: true
216                 verticalAlignment: Text.AlignVCenter
217                 horizontalAlignment: Text.AlignRight
218             }
219         }
220     }
221
222     function launchGallery() {
223         if (!gallery.launch()) {
224             showError(qsTr("Failed to launch gallery"))
225         }
226     }
227
228     function deleteCurrentItem() {
229         if (view.currentItem == null) {
230             return
231         }
232
233         deleteDialog.message = view.currentItem.itemFileName
234         deleteDialog.open()
235     }
236
237     function shareCurrentItem() {
238         if (view.currentItem != null && !share.share(view.currentItem.itemUrl)) {
239             showError(qsTr("Failed to launch share service"))
240         }
241     }
242
243     function restartTimer() {
244         hideTimer.restart()
245     }
246
247     function policyLost() {
248         if (view.currentItem && view.currentItem.playing) {
249             view.currentItem.stopPlayback()
250         }
251     }
252 }