uihelper.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #
  2. # Copyright (C) 2006 - 2007 Michael 'Mickey' Lauer
  3. # Copyright (C) 2006 - 2007 Richard Purdie
  4. #
  5. # SPDX-License-Identifier: GPL-2.0-only
  6. #
  7. import bb.build
  8. import time
  9. class BBUIHelper:
  10. def __init__(self):
  11. self.needUpdate = False
  12. self.running_tasks = {}
  13. # Running PIDs preserves the order tasks were executed in
  14. self.running_pids = []
  15. self.failed_tasks = []
  16. self.pidmap = {}
  17. self.tasknumber_current = 0
  18. self.tasknumber_total = 0
  19. def eventHandler(self, event):
  20. # PIDs are a bad idea as they can be reused before we process all UI events.
  21. # We maintain a 'fuzzy' match for TaskProgress since there is no other way to match
  22. def removetid(pid, tid):
  23. self.running_pids.remove(tid)
  24. del self.running_tasks[tid]
  25. if self.pidmap[pid] == tid:
  26. del self.pidmap[pid]
  27. self.needUpdate = True
  28. if isinstance(event, bb.build.TaskStarted):
  29. tid = event._fn + ":" + event._task
  30. if event._mc != "default":
  31. self.running_tasks[tid] = { 'title' : "mc:%s:%s %s" % (event._mc, event._package, event._task), 'starttime' : time.time(), 'pid' : event.pid }
  32. else:
  33. self.running_tasks[tid] = { 'title' : "%s %s" % (event._package, event._task), 'starttime' : time.time(), 'pid' : event.pid }
  34. self.running_pids.append(tid)
  35. self.pidmap[event.pid] = tid
  36. self.needUpdate = True
  37. elif isinstance(event, bb.build.TaskSucceeded):
  38. tid = event._fn + ":" + event._task
  39. removetid(event.pid, tid)
  40. elif isinstance(event, bb.build.TaskFailedSilent):
  41. tid = event._fn + ":" + event._task
  42. removetid(event.pid, tid)
  43. # Don't add to the failed tasks list since this is e.g. a setscene task failure
  44. elif isinstance(event, bb.build.TaskFailed):
  45. tid = event._fn + ":" + event._task
  46. removetid(event.pid, tid)
  47. self.failed_tasks.append( { 'title' : "%s %s" % (event._package, event._task)})
  48. elif isinstance(event, bb.runqueue.runQueueTaskStarted):
  49. self.tasknumber_current = event.stats.completed + event.stats.active + event.stats.failed + 1
  50. self.tasknumber_total = event.stats.total
  51. self.needUpdate = True
  52. elif isinstance(event, bb.build.TaskProgress):
  53. if event.pid > 0 and event.pid in self.pidmap:
  54. self.running_tasks[self.pidmap[event.pid]]['progress'] = event.progress
  55. self.running_tasks[self.pidmap[event.pid]]['rate'] = event.rate
  56. self.needUpdate = True
  57. else:
  58. return False
  59. return True
  60. def getTasks(self):
  61. self.needUpdate = False
  62. return (self.running_tasks, self.failed_tasks)