# 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