class TaskManager(QtCore.QObject):

    def __init__(self, parent):
        super(TaskManager, self).__init__(parent)
        self._processed = 0
        self._total = 0
        self._daemon = DaemonProxy(self)
        self._daemon.task_started.connect(self.taskStarted)
        self._daemon.task_progress.connect(self._onTaskProgress)
        self._daemon.task_done.connect(self.taskDone)

    taskStarted = QtCore.Signal(str)
    taskDone = QtCore.Signal(str)

    def release(self):
        self._daemon.release()

    @QtCore.Slot(str, int, int)
    def _onTaskProgress(self, task_id, count, total):
        self._total = total
        self._processed = count
        self._nfy_total.emit()
        self._nfy_processed.emit()

    # daemon (read-only, non-nfy) attribute ------------
    def _get_daemon(self):
        return self._daemon

    daemon = QtCore.Property(DaemonProxy, _get_daemon)

    # processed (read-only) attribute ------------
    def _get_processed(self):
        return self._processed

    _nfy_processed = QtCore.Signal()

    processed = QtCore.Property(int, _get_processed, notify=_nfy_processed)

    # total (read-only) attribute ------------
    def _get_total(self):
        return self._total

    _nfy_total = QtCore.Signal()

    total = QtCore.Property(int, _get_total, notify=_nfy_total)

    # progress (read-only) attribute ------------
    def _get_progress(self):
        if total > 0:
            return float(self._processed)/float(self._total)
        else:
            return 0.0

    _nfy_progress = QtCore.Signal()

    progress = QtCore.Property(float, _get_progress, notify=_nfy_progress)
 def __init__(self, parent):
     super(TaskManager, self).__init__(parent)
     self._processed = 0
     self._total = 0
     self._daemon = DaemonProxy(self)
     self._daemon.task_started.connect(self.taskStarted)
     self._daemon.task_progress.connect(self._onTaskProgress)
     self._daemon.task_done.connect(self.taskDone)