feat: add interactions for the downloaded elements
This commit is contained in:
parent
4639517786
commit
ce0d717717
|
@ -32,6 +32,13 @@ Rectangle {
|
||||||
property var downloads: []
|
property var downloads: []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function removeDownloadFromModel(index) {
|
||||||
|
downloadModel.downloads = downloadModel.downloads.filter(function (el) {
|
||||||
|
return el.id !== downloadModel.downloads[index].id;
|
||||||
|
});
|
||||||
|
downloadModel.remove(index);
|
||||||
|
}
|
||||||
|
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
@ -631,7 +638,7 @@ Rectangle {
|
||||||
}
|
}
|
||||||
|
|
||||||
function onDownloadRequested(download) {
|
function onDownloadRequested(download) {
|
||||||
downloadBar.visible = true
|
downloadBar.isVisible = true
|
||||||
downloadView.append(download);
|
downloadView.append(download);
|
||||||
download.accept();
|
download.accept();
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,11 +4,11 @@ import "../../../shared"
|
||||||
import "../../../shared/status"
|
import "../../../shared/status"
|
||||||
import "../../../imports"
|
import "../../../imports"
|
||||||
|
|
||||||
//downloadModel.downloads[index].receivedBytes
|
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
|
property bool isVisible: false
|
||||||
|
|
||||||
id: root
|
id: root
|
||||||
visible: false
|
visible: isVisible && !!listView.count
|
||||||
color: Style.current.background
|
color: Style.current.background
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: 56
|
height: 56
|
||||||
|
@ -61,7 +61,7 @@ Rectangle {
|
||||||
icon.name: "browser/close"
|
icon.name: "browser/close"
|
||||||
iconColor: Style.current.textColor
|
iconColor: Style.current.textColor
|
||||||
onClicked: {
|
onClicked: {
|
||||||
root.visible = false
|
root.isVisible = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,44 @@
|
||||||
import QtQuick 2.1
|
import QtQuick 2.1
|
||||||
|
import QtQuick.Controls 2.13
|
||||||
import QtGraphicalEffects 1.13
|
import QtGraphicalEffects 1.13
|
||||||
import "../../../shared"
|
import "../../../shared"
|
||||||
import "../../../shared/status"
|
import "../../../shared/status"
|
||||||
import "../../../imports"
|
import "../../../imports"
|
||||||
|
|
||||||
|
|
||||||
Item {
|
Rectangle {
|
||||||
id: downloadElement
|
property bool downloadComplete: {
|
||||||
|
return !!downloadModel.downloads && !!downloadModel.downloads[index] && downloadModel.downloads[index].receivedBytes >= downloadModel.downloads[index].totalBytes
|
||||||
|
}
|
||||||
|
property bool isCanceled: false
|
||||||
|
property bool hovered: false
|
||||||
|
|
||||||
|
id: root
|
||||||
width: 272
|
width: 272
|
||||||
height: 40
|
height: 40
|
||||||
|
border.width: 0
|
||||||
|
color: hovered ? Style.current.backgroundHover : Style.current.transparent
|
||||||
|
radius: Style.current.radius
|
||||||
|
|
||||||
|
function openFile() {
|
||||||
|
Qt.openUrlExternally(`file://${downloadDirectory}/${downloadFileName}`)
|
||||||
|
removeDownloadFromModel(index)
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
hoverEnabled: true
|
||||||
|
onEntered: {
|
||||||
|
root.hovered = true
|
||||||
|
}
|
||||||
|
onExited: {
|
||||||
|
root.hovered = false
|
||||||
|
}
|
||||||
|
onClicked: {
|
||||||
|
openFile()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
id: iconLoader
|
id: iconLoader
|
||||||
|
@ -17,10 +47,10 @@ Item {
|
||||||
anchors.leftMargin: Style.current.smallPadding
|
anchors.leftMargin: Style.current.smallPadding
|
||||||
active: root.visible
|
active: root.visible
|
||||||
sourceComponent: {
|
sourceComponent: {
|
||||||
if (!downloadModel.downloads || !downloadModel.downloads[index] || downloadModel.downloads[index].receivedBytes < downloadModel.downloads[index].totalBytes) {
|
if (downloadComplete || !downloadModel.downloads[index] || downloadModel.downloads[index].isPaused || isCanceled) {
|
||||||
return loadingImageComponent
|
return fileImageComponent
|
||||||
}
|
}
|
||||||
return fileImageComponent
|
return loadingImageComponent
|
||||||
}
|
}
|
||||||
|
|
||||||
Component {
|
Component {
|
||||||
|
@ -34,10 +64,9 @@ Item {
|
||||||
width: 24
|
width: 24
|
||||||
height: 24
|
height: 24
|
||||||
ColorOverlay {
|
ColorOverlay {
|
||||||
enabled: false
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
source: parent
|
source: parent
|
||||||
color: Style.current.darkGrey
|
color: downloadComplete ? Style.current.transparent : Style.current.darkGrey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +78,8 @@ Item {
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
anchors.left: iconLoader.right
|
anchors.left: iconLoader.right
|
||||||
anchors.right: optionsBtn.left
|
anchors.right: optionsBtn.left
|
||||||
anchors.top: parent.top
|
anchors.top: downloadComplete ? undefined : parent.top
|
||||||
|
anchors.verticalCenter: downloadComplete ? parent.verticalCenter : undefined
|
||||||
minimumPixelSize: 13
|
minimumPixelSize: 13
|
||||||
anchors.leftMargin: Style.current.smallPadding
|
anchors.leftMargin: Style.current.smallPadding
|
||||||
anchors.topMargin: 2
|
anchors.topMargin: 2
|
||||||
|
@ -57,8 +87,17 @@ Item {
|
||||||
|
|
||||||
StyledText {
|
StyledText {
|
||||||
id: progressText
|
id: progressText
|
||||||
|
visible: !downloadComplete
|
||||||
color: Style.current.secondaryText
|
color: Style.current.secondaryText
|
||||||
text: `${downloadModel.downloads[index] ? downloadModel.downloads[index].receivedBytes / 1000000 : 0}/${downloadModel.downloads[index] ? downloadModel.downloads[index].totalBytes / 1000000 : 0} MB` //"14.4/109 MB, 26 sec left"
|
text: {
|
||||||
|
if (isCanceled) {
|
||||||
|
return qsTr("Cancelled")
|
||||||
|
}
|
||||||
|
if (downloadModel.downloads[index] && downloadModel.downloads[index].isPaused) {
|
||||||
|
return qsTr("Paused")
|
||||||
|
}
|
||||||
|
return `${downloadModel.downloads[index] ? (downloadModel.downloads[index].receivedBytes / 1000000).toFixed(2) : 0}/${downloadModel.downloads[index] ? (downloadModel.downloads[index].totalBytes / 1000000).toFixed(2) : 0} MB` //"14.4/109 MB, 26 sec left"
|
||||||
|
}
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
anchors.left: iconLoader.right
|
anchors.left: iconLoader.right
|
||||||
anchors.right: optionsBtn.left
|
anchors.right: optionsBtn.left
|
||||||
|
@ -74,6 +113,70 @@ Item {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.rightMargin: Style.current.smallPadding
|
anchors.rightMargin: Style.current.smallPadding
|
||||||
icon.name: "dots-icon"
|
icon.name: "dots-icon"
|
||||||
|
onClicked: {
|
||||||
|
downloadMenu.x = optionsBtn.x
|
||||||
|
downloadMenu.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Move this outside?
|
||||||
|
PopupMenu {
|
||||||
|
id: downloadMenu
|
||||||
|
y: -height - Style.current.smallPadding
|
||||||
|
|
||||||
|
Action {
|
||||||
|
enabled: downloadComplete
|
||||||
|
icon.source: "../../img/browser/file.svg"
|
||||||
|
icon.width: 16
|
||||||
|
icon.height: 16
|
||||||
|
text: qsTr("Open")
|
||||||
|
onTriggered: openFile()
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
icon.source: "../../img/add_watch_only.svg"
|
||||||
|
icon.width: 13
|
||||||
|
icon.height: 9
|
||||||
|
text: qsTr("Show in folder")
|
||||||
|
// TODO check if this works in Windows and Mac
|
||||||
|
onTriggered: Qt.openUrlExternally("file://" + downloadDirectory)
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
enabled: !downloadComplete && !!downloadModel.downloads[index] && !downloadModel.downloads[index].isPaused
|
||||||
|
icon.source: "../../img/browser/pause.svg"
|
||||||
|
icon.width: 16
|
||||||
|
icon.height: 16
|
||||||
|
text: qsTr("Pause")
|
||||||
|
onTriggered: {
|
||||||
|
downloadModel.downloads[index].pause()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Action {
|
||||||
|
enabled: !downloadComplete && !!downloadModel.downloads[index] && downloadModel.downloads[index].isPaused
|
||||||
|
icon.source: "../../img/browser/play.svg"
|
||||||
|
icon.width: 16
|
||||||
|
icon.height: 16
|
||||||
|
text: qsTr("Resume")
|
||||||
|
onTriggered: {
|
||||||
|
downloadModel.downloads[index].resume()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Separator {
|
||||||
|
visible: !downloadComplete
|
||||||
|
}
|
||||||
|
|
||||||
|
Action {
|
||||||
|
enabled: !downloadComplete
|
||||||
|
icon.source: "../../img/block-icon.svg"
|
||||||
|
icon.width: 13
|
||||||
|
icon.height: 13
|
||||||
|
text: qsTr("Cancel")
|
||||||
|
onTriggered: {
|
||||||
|
downloadModel.downloads[index].cancel()
|
||||||
|
isCanceled = true
|
||||||
|
}
|
||||||
|
icon.color: Style.current.red
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ Rectangle {
|
||||||
}
|
}
|
||||||
Label {
|
Label {
|
||||||
id: label
|
id: label
|
||||||
text: downloadModel.downloads[index].downloadDirectory + "/" + downloadModel.downloads[index].downloadFileName
|
text: downloadDirectory + "/" + downloadFileName
|
||||||
anchors {
|
anchors {
|
||||||
verticalCenter: cancelButton.verticalCenter
|
verticalCenter: cancelButton.verticalCenter
|
||||||
left: parent.left
|
left: parent.left
|
||||||
|
@ -112,10 +112,7 @@ Rectangle {
|
||||||
|
|
||||||
download.cancel();
|
download.cancel();
|
||||||
|
|
||||||
downloadModel.downloads = downloadModel.downloads.filter(function (el) {
|
removeDownloadFromModel(index)
|
||||||
return el.id !== download.id;
|
|
||||||
});
|
|
||||||
downloadModel.remove(index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.50033 3.5C4.4878 3.5 3.66699 4.32081 3.66699 5.33333V10.6667C3.66699 11.6792 4.4878 12.5 5.50033 12.5C6.51285 12.5 7.33366 11.6792 7.33366 10.6667V5.33333C7.33366 4.32081 6.51285 3.5 5.50033 3.5ZM4.66699 5.33333C4.66699 4.8731 5.04009 4.5 5.50033 4.5C5.96056 4.5 6.33366 4.8731 6.33366 5.33333V10.6667C6.33366 11.1269 5.96056 11.5 5.50033 11.5C5.04009 11.5 4.66699 11.1269 4.66699 10.6667V5.33333Z" fill="#4360DF"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.5003 3.5C9.4878 3.5 8.66699 4.32081 8.66699 5.33333V10.6667C8.66699 11.6792 9.4878 12.5 10.5003 12.5C11.5128 12.5 12.3337 11.6792 12.3337 10.6667V5.33333C12.3337 4.32081 11.5128 3.5 10.5003 3.5ZM9.66699 5.33333C9.66699 4.8731 10.0401 4.5 10.5003 4.5C10.9606 4.5 11.3337 4.8731 11.3337 5.33333V10.6667C11.3337 11.1269 10.9606 11.5 10.5003 11.5C10.0401 11.5 9.66699 11.1269 9.66699 10.6667V5.33333Z" fill="#4360DF"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.0 KiB |
|
@ -0,0 +1,3 @@
|
||||||
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.66699 4.56312C4.66699 3.63702 5.6942 3.08011 6.47028 3.58546L12.1775 7.3018C12.6823 7.63052 12.6823 8.36976 12.1775 8.69847L6.47028 12.4148C5.6942 12.9202 4.66699 12.3633 4.66699 11.4371V4.56312ZM5.9246 4.42346C5.81374 4.35127 5.66699 4.43082 5.66699 4.56312V11.4371C5.66699 11.5694 5.81374 11.649 5.9246 11.5768L11.2029 8.1398C11.3038 8.07406 11.3038 7.92621 11.2029 7.86047L5.9246 4.42346Z" fill="#4360DF"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 565 B |
|
@ -4,7 +4,7 @@ import "../imports"
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: separator
|
id: separator
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: 1
|
height: visible ? 1 : 0
|
||||||
color: Style.current.border
|
color: Style.current.border
|
||||||
anchors.topMargin: Style.current.padding
|
anchors.topMargin: Style.current.padding
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue