1
0
Fork 0
mirror of synced 2024-06-29 11:40:37 +12:00
Rare/rare/components/tabs/downloads/dl_queue_widget.py
Stelios Tsampas 148cf0ff8e Add models for the download queue.
The addition of download_only option broke the download queue
due to different positional arguments and tuple indices. Since
using indices is awkward, models to represent the download
and each item in the queue itself were added.
2021-05-25 23:52:25 +03:00

134 lines
4.7 KiB
Python

from logging import getLogger
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QGroupBox, QVBoxLayout, QLabel, QHBoxLayout, QPushButton, QWidget
from qtawesome import icon
from rare.utils.models import InstallQueueItemModel
logger = getLogger("QueueWidget")
class DlWidget(QWidget):
move_up = pyqtSignal(str) # app_name
move_down = pyqtSignal(str) # app_name
remove = pyqtSignal(str) # app_name
def __init__(self, index, queue_item: InstallQueueItemModel):
super(DlWidget, self).__init__()
self.app_name = queue_item.download.game.app_name
self.layout = QHBoxLayout()
self.left_layout = QVBoxLayout()
self.move_up_button = QPushButton(icon("fa.arrow-up", color="white"), "")
if index == 0:
self.move_up_button.setDisabled(True)
self.move_up_button.clicked.connect(lambda: self.move_up.emit(self.app_name))
self.move_up_button.setFixedWidth(20)
self.left_layout.addWidget(self.move_up_button)
self.move_down_buttton = QPushButton(icon("fa.arrow-down", color="white"), "")
self.move_down_buttton.clicked.connect(lambda: self.move_down.emit(self.app_name))
self.left_layout.addWidget(self.move_down_buttton)
self.move_down_buttton.setFixedWidth(20)
self.layout.addLayout(self.left_layout)
self.right_layout = QVBoxLayout()
self.title = QLabel(queue_item.download.game.app_title)
self.right_layout.addWidget(self.title)
dl_size = queue_item.download.analysis.dl_size
install_size = queue_item.download.analysis.install_size
self.size = QHBoxLayout()
self.size.addWidget(QLabel(self.tr("Download size: {} GB").format(round(dl_size / 1024 ** 3, 2))))
self.size.addWidget(QLabel(self.tr("Install size: {} GB").format(round(install_size / 1024 ** 3, 2))))
self.right_layout.addLayout(self.size)
self.delete = QPushButton(self.tr("Remove Download"))
self.delete.clicked.connect(lambda: self.remove.emit(self.app_name))
self.right_layout.addWidget(self.delete)
self.layout.addLayout(self.right_layout)
self.setLayout(self.layout)
class DlQueueWidget(QGroupBox):
update_list = pyqtSignal(list)
dl_queue = []
def __init__(self):
super(DlQueueWidget, self).__init__()
self.setTitle(self.tr("Download Queue"))
self.layout = QVBoxLayout()
self.setObjectName("group")
self.text = QLabel(self.tr("No downloads in queue"))
self.layout.addWidget(self.text)
self.setLayout(self.layout)
def update_queue(self, dl_queue: list):
logger.info("Update Queue " + ", ".join(i.download.game.app_title for i in dl_queue))
self.dl_queue = dl_queue
self.setLayout(QVBoxLayout())
QWidget().setLayout(self.layout)
self.layout = QVBoxLayout()
if len(dl_queue) == 0:
self.layout.addWidget(QLabel(self.tr("No downloads in queue")))
self.setLayout(self.layout)
return
for index, item in enumerate(dl_queue):
widget = DlWidget(index, item)
widget.remove.connect(self.remove)
widget.move_up.connect(self.move_up)
widget.move_down.connect(self.move_down)
self.layout.addWidget(widget)
if index + 1 == len(dl_queue):
widget.move_down_buttton.setDisabled(True)
self.setLayout(self.layout)
def remove(self, app_name):
for index, i in enumerate(self.dl_queue):
if i.download.game.app_name == app_name:
self.dl_queue.pop(index)
break
else:
logger.warning("BUG! ", app_name)
return
self.update_list.emit(self.dl_queue)
self.update_queue(self.dl_queue)
def move_up(self, app_name):
index: int
for i, item in enumerate(self.dl_queue):
if item.download.game.app_name == app_name:
index = i
break
else:
logger.warning("Could not find appname" + app_name)
return
self.dl_queue.insert(index - 1, self.dl_queue.pop(index))
self.update_list.emit(self.dl_queue)
self.update_queue(self.dl_queue)
def move_down(self, app_name):
index: int
for i, item in enumerate(self.dl_queue):
if item.download.game.app_name == app_name:
index = i
break
else:
logger.warning("Could not find appname" + app_name)
return
self.dl_queue.insert(index + 1, self.dl_queue.pop(index))
self.update_list.emit(self.dl_queue)
self.update_queue(self.dl_queue)