emmental/scanner/queue.py

57 lines
1.5 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
from gi.repository import GLib
from gi.repository import GObject
from . import task
class TaskQueue(GObject.GObject):
def __init__(self):
GObject.GObject.__init__(self)
self.tasks = [ ]
self.total = 0
self.idleid = None
def __del__(self):
if self.idleid != None:
GLib.source_remove(self.idleid)
def push(self, task):
self.emit("task-pushed", task)
def clear(self):
self.emit("tasks-finished")
def run(self):
self.emit("run-task", self.tasks.pop(0))
if len(self.tasks) > 0:
return GLib.SOURCE_CONTINUE
self.emit("tasks-finished")
return GLib.SOURCE_REMOVE
@GObject.Property
def progress(self):
if len(self.tasks) == 0:
return 0
return (self.total - len(self.tasks)) / self.total
@GObject.Signal(arg_types=(task.Task,))
def task_pushed(self, task):
self.tasks.append(task)
self.total += 1
if self.idleid == None:
self.idleid = GLib.idle_add(self.run)
@GObject.Signal(arg_types=(task.Task,))
def run_task(self, task):
if tasks := task.run_task():
self.tasks += tasks
self.total += len(tasks)
@GObject.Signal
def tasks_finished(self):
if self.idleid:
GLib.source_remove(self.idleid)
self.tasks.clear()
self.total = 0
self.idleid = None