54 lines
1.4 KiB
Python
54 lines
1.4 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 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
|