2
* Copyright 2015 Canonical Ltd.
4
* This file is part of webbrowser-app.
6
* webbrowser-app is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 3.
10
* webbrowser-app is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program. If not, see <http://www.gnu.org/licenses/>.
20
import Qt.labs.settings 1.0
21
import Ubuntu.Components 1.3
22
import Ubuntu.Components.Popups 1.0
23
import Ubuntu.Thumbnailer 0.1
24
import Ubuntu.Content 1.3
26
import webbrowserapp.private 0.1
27
import webbrowsercommon.private 0.1
29
import "../MimeTypeMapper.js" as MimeTypeMapper
34
property QtObject downloadsModel
36
// We can get file picking requests either via content-hub (activeTransfer)
37
// Or via the internal oxide file picker (internalFilePicker) in the case
38
// where the user wishes to upload a file from their previous downloads.
39
property var activeTransfer
40
property var internalFilePicker
42
property bool selectMode
43
property bool pickingMode
44
property bool multiSelect
45
property alias mimetypeFilter: downloadModelFilter.pattern
56
text: i18n.tr("Downloads")
60
text: i18n.tr("Confirm selection")
63
enabled: downloadsListView.ViewItems.selectedIndices.length > 0
66
if (internalFilePicker) {
67
for (var i = 0; i < downloadsListView.ViewItems.selectedIndices.length; i++) {
68
var selectedDownload = downloadsListView.model.get(downloadsListView.ViewItems.selectedIndices[i])
69
results.push(selectedDownload.path)
71
internalFilePicker.accept(results)
73
for (var i = 0; i < downloadsListView.ViewItems.selectedIndices.length; i++) {
74
var selectedDownload = downloadsListView.model.get(downloadsListView.ViewItems.selectedIndices[i])
75
results.push(resultComponent.createObject(downloadsItem, {"url": "file://" + selectedDownload.path}))
77
activeTransfer.items = results
78
activeTransfer.state = ContentTransfer.Charged
84
text: i18n.tr("Select all")
88
if (downloadsListView.ViewItems.selectedIndices.length === downloadsListView.count) {
89
downloadsListView.ViewItems.selectedIndices = []
92
for (var i = 0; i < downloadsListView.count; ++i) {
95
downloadsListView.ViewItems.selectedIndices = indices
100
text: i18n.tr("Delete")
105
for (var i = 0; i < downloadsListView.ViewItems.selectedIndices.length; i++) {
106
var selectedDownload = downloadsListView.model.get(downloadsListView.ViewItems.selectedIndices[i])
107
toDelete.push(selectedDownload.path)
109
for (var i = 0; i < toDelete.length; i++) {
110
downloadsModel.deleteDownload(toDelete[i])
112
downloadsListView.ViewItems.selectedIndices = []
113
downloadsItem.selectMode = false
118
visible: !selectMode && !pickingMode
129
if (activeTransfer) {
130
activeTransfer.state = ContentTransfer.Aborted
132
if (internalFilePicker) {
133
internalFilePicker.reject()
146
id: downloadsListView
153
bottom: parent.bottom
154
rightMargin: units.gu(2)
157
model: SortFilterModel {
158
model: downloadsModel
160
id: downloadModelFilter
165
delegate: DownloadDelegate {
166
downloadId: model.downloadId
167
title: model.filename ? model.filename : model.url.toString().split('/').pop().split('?').shift()
169
image: model.complete && (model.mimetype.indexOf("image") === 0 || model.mimetype.indexOf("video") === 0) ? "image://thumbnailer/file://" + model.path : ""
170
icon: MimeDatabase.iconForMimetype(model.mimetype)
171
incomplete: !model.complete
172
selectMode: downloadsItem.selectMode || downloadsItem.pickingMode
173
visible: !(selectMode && incomplete)
174
errorMessage: model.error
176
// Work around bug #1493880
177
property bool lastSelected
180
if (!multiSelect && selected && lastSelected != selected) {
181
downloadsListView.ViewItems.selectedIndices = [index]
183
lastSelected = selected
187
if (model.complete) {
191
exportPeerPicker.contentType = MimeTypeMapper.mimeTypeToContentType(model.mimetype)
192
exportPeerPicker.visible = true
193
exportPeerPicker.path = model.path
199
downloadsItem.selectMode = true
200
downloadsItem.multiSelect = true
201
if (downloadsItem.selectMode) {
202
downloadsListView.ViewItems.selectedIndices = [index]
207
if (model.complete) {
208
downloadsModel.deleteDownload(model.path)
213
downloadsModel.cancelDownload(model.downloadId)
221
anchors.centerIn: parent
222
visible: downloadsListView.count == 0
225
horizontalAlignment: Text.AlignHCenter
226
text: i18n.tr("No downloads available")
230
id: contentItemComponent
238
handler: ContentHandler.Destination
241
var transfer = peer.request()
242
if (transfer.state === ContentTransfer.InProgress) {
243
transfer.items = [contentItemComponent.createObject(downloadsItem, {"url": path})]
244
transfer.state = ContentTransfer.Charged