Skip to content

Commit a9fe519

Browse files
committed
enh: refresh upload panel
1 parent c099617 commit a9fe519

3 files changed

Lines changed: 32 additions & 18 deletions

File tree

CHANGELOG

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
- fix: finalize/ephermalize job when upload finishes when widget not visible
77
- fix: race condition in `DownloadJob.get_status`
88
- enh: display DCOR instance title in search bar
9-
- enh: increase download panel refresh rate to 2 Hz
10-
- enh: initialize download panel with final column widths
11-
- enh: add tool tip with full resource and dataset name in download panel
9+
- enh: increase up/download panel refresh rate to 2 Hz
10+
- enh: initialize up/download panel with final column widths
11+
- enh: add tool tip with full resource and dataset name in up/download panel
1212
- enh: make icons "grayer" so they work in dark themes as well
1313
- enh: add `SQLiteKeyJSONDatabase` for persistent metadata storage
1414
- enh: add `MetaCache` for persistent metadata management

dcoraid/gui/panel_uploads/widget_upload.py

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import logging
4+
import threading
45
import warnings
56
from functools import lru_cache
67
import os.path as os_path
@@ -381,20 +382,29 @@ def __init__(self, *args, **kwargs):
381382
QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows)
382383

383384
self._jobs = None
385+
self._finished_uploads = []
386+
self._on_update_job_status_lock = threading.Lock()
384387

385388
settings = QtCore.QSettings()
386389
if bool(int(settings.value("debug/without timers", "0"))):
387390
self.timer = None
388391
else:
389392
self.timer = QtCore.QTimer()
390-
self.timer.timeout.connect(self.update_job_status)
391-
self.timer.start(1000)
392-
self._finished_uploads = []
393+
self.timer.timeout.connect(self.on_update_job_status)
394+
self.timer.start(500)
393395

394396
# signals
395397
self.itemSelectionChanged.connect(self.on_selection)
396398
self.itemClicked.connect(self.on_selection)
397399

400+
# Set columns and spacing for upload table
401+
self.setColumnCount(6)
402+
header = self.horizontalHeader()
403+
header.setSectionResizeMode(
404+
0, QtWidgets.QHeaderView.ResizeMode.ResizeToContents)
405+
header.setSectionResizeMode(
406+
1, QtWidgets.QHeaderView.ResizeMode.Stretch)
407+
398408
@property
399409
def jobs(self):
400410
"""Upload job list
@@ -430,12 +440,12 @@ def set_job_list(self, jobs):
430440
@QtCore.pyqtSlot(str)
431441
def on_job_abort(self, dataset_id):
432442
self.jobs.abort_job(dataset_id)
433-
self.update_job_status()
443+
self.on_update_job_status()
434444

435445
@QtCore.pyqtSlot(str)
436446
def on_job_delete(self, dataset_id):
437447
self.jobs.remove_job(dataset_id)
438-
self.update_job_status()
448+
self.on_update_job_status()
439449

440450
@QtCore.pyqtSlot()
441451
def on_selection(self):
@@ -460,7 +470,7 @@ def on_upload_finished(self, dataset_id):
460470
self.logger.error(tb.format_exc())
461471

462472
@QtCore.pyqtSlot()
463-
def update_job_status(self):
473+
def on_update_job_status(self):
464474
"""Update UI with information from self.jobs (UploadJobList)"""
465475
# Let everyone know when a job is done
466476
for job in self.jobs:
@@ -470,13 +480,18 @@ def update_job_status(self):
470480
if not self.isVisible() or not self.jobs:
471481
# Don't update the UI if nobody is looking anyway.
472482
return
483+
if self._on_update_job_status_lock.locked():
484+
return
485+
486+
with self._on_update_job_status_lock:
487+
self.update_job_status()
488+
489+
def update_job_status(self):
473490
# disable updates
474491
self.setUpdatesEnabled(False)
475492
# make sure the length of the table is long enough
476493
self.setRowCount(len(self.jobs))
477494
if self.jobs:
478-
self.setColumnCount(6)
479-
480495
for row, job in enumerate(self.jobs):
481496
status = job.get_status()
482497
self.set_label_item(row, 0, job.dataset_id[:5])
@@ -486,12 +501,9 @@ def update_job_status(self):
486501
self.set_label_item(row, 4, job.get_rate_string())
487502
self.set_actions_item(row, 5, job)
488503

489-
# spacing (did not work in __init__)
490-
header = self.horizontalHeader()
491-
header.setSectionResizeMode(
492-
0, QtWidgets.QHeaderView.ResizeMode.ResizeToContents)
493-
header.setSectionResizeMode(
494-
1, QtWidgets.QHeaderView.ResizeMode.Stretch)
504+
QtWidgets.QApplication.processEvents(
505+
QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 300)
506+
495507
# enable updates again
496508
self.setUpdatesEnabled(True)
497509

@@ -504,11 +516,13 @@ def set_label_item(self, row, col, label):
504516
item = self.item(row, col)
505517
if item is None:
506518
item = QtWidgets.QTableWidgetItem(label)
519+
item.setToolTip(label)
507520
item.setFlags(QtCore.Qt.ItemFlag.ItemIsEnabled)
508521
self.setItem(row, col, item)
509522
else:
510523
if item.text() != label:
511524
item.setText(label)
525+
item.setToolTip(label)
512526

513527
def set_actions_item(self, row, col, job):
514528
"""Set/Create a TableCellActions widget in the table

tests/test_gui.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def test_gui_upload_simple(mw, qtbot):
230230
dataset_id=dlg.dataset_id,
231231
set_job_done=False)
232232

233-
mw.panel_upload.widget_jobs.update_job_status()
233+
mw.panel_upload.widget_jobs.on_update_job_status()
234234
QtWidgets.QApplication.processEvents(
235235
QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 200)
236236
assert mw.database.get_dataset_dict(dlg.dataset_id)

0 commit comments

Comments
 (0)