1# Boa:FramePanel:PnlJobManager 2# -*- coding: utf-8 -*- 3# 4# Copyright (C) 2018 Jens Goepfert 5# 6 7import wx 8import wx.lib.scrolledpanel 9 10from photofilmstrip.lib.jobimpl.WxVisualJobManager import WxVisualJobManager, EVT_REGISTER_JOB 11from photofilmstrip.lib.jobimpl.JobManager import JobManager 12 13from photofilmstrip.lib.jobimpl.PnlJobVisual import PnlJobVisual 14 15[wxID_PNLJOBMANAGER, wxID_PNLJOBMANAGERCMDCLEAR, wxID_PNLJOBMANAGERPNLJOBS, 16] = [wx.NewId() for _init_ctrls in range(3)] 17 18 19class PnlJobManager(wx.Panel, WxVisualJobManager): 20 21 def _init_coll_szMain_Items(self, parent): 22 # generated method, don't edit 23 24 parent.Add(self.pnlJobs, 1, border=0, flag=wx.EXPAND) 25 parent.Add(self.cmdClear, 0, border=4, flag=wx.ALL) 26 27 def _init_sizers(self): 28 # generated method, don't edit 29 self.szMain = wx.BoxSizer(orient=wx.VERTICAL) 30 31 self.szJobs = wx.BoxSizer(orient=wx.VERTICAL) 32 33 self._init_coll_szMain_Items(self.szMain) 34 35 self.SetSizer(self.szMain) 36 self.pnlJobs.SetSizer(self.szJobs) 37 38 def _init_ctrls(self, prnt): 39 # generated method, don't edit 40 wx.Panel.__init__(self, id=wxID_PNLJOBMANAGER, name=u'PnlJobManager', 41 parent=prnt, pos=wx.Point(-1, -1), size=wx.Size(-1, -1), 42 style=wx.TAB_TRAVERSAL) 43 self.SetClientSize(wx.Size(400, 250)) 44 45 self.pnlJobs = wx.lib.scrolledpanel.ScrolledPanel(id=wxID_PNLJOBMANAGERPNLJOBS, 46 name=u'pnlJobs', parent=self, pos=wx.Point(-1, -1), 47 size=wx.Size(-1, -1), style=wx.SUNKEN_BORDER) 48 49 self.cmdClear = wx.Button(id=wxID_PNLJOBMANAGERCMDCLEAR, 50 label=_(u'&Clear list'), name=u'cmdClear', parent=self, 51 pos=wx.Point(-1, -1), size=wx.Size(-1, -1), style=0) 52 self.cmdClear.Bind(wx.EVT_BUTTON, self.OnCmdClearButton, 53 id=wxID_PNLJOBMANAGERCMDCLEAR) 54 55 self._init_sizers() 56 57 def __init__(self, parent, pnlJobClass=PnlJobVisual): 58 self._init_ctrls(parent) 59 WxVisualJobManager.__init__(self) 60 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnSelectItem) 61 self.pnlJobs.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 62 63 self.pnlJobs.SetupScrolling(scroll_x=False) 64 65 self.parentFrame = None 66 if isinstance(parent, wx.Frame): 67 self.parentFrame = parent 68 69 self._selected = None 70 71 self.pnlJobVisuals = [] 72 self.pnlJobClass = pnlJobClass 73 74 self.Bind(EVT_REGISTER_JOB, self.OnRegisterJob) 75 76 JobManager().AddVisual(self) 77 78 def OnRegisterJob(self, event): 79 jobContext = event.GetJob() 80 if jobContext.GetGroupId() != "render": 81 return 82 83 pjv = self.pnlJobClass(self.pnlJobs, self, jobContext) 84 pjv.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 85 86 self.szJobs.Add(pjv, 0, wx.EXPAND) 87 self.szJobs.Layout() 88 89 self.pnlJobs.SetupScrolling(scroll_x=False) 90 91 self.pnlJobVisuals.append(pjv) 92 93 if self._selected is None: 94 pjv.Select(True) 95 self._selected = pjv 96 97 if self.parentFrame: 98 self.parentFrame.Show() 99 100 def OnSelectItem(self, event): 101 pnl = event.GetEventObject() 102 if pnl != self._selected: 103 if self._selected is not None: 104 self._selected.Select(False) 105 self._selected = pnl 106 self._selected.Select(True) 107 108 def OnKeyDown(self, event): 109 key = event.GetKeyCode() 110 try: 111 idx = self.pnlJobVisuals.index(self._selected) 112 except ValueError: 113 idx = -1 114 if key == wx.WXK_DOWN: 115 if self._selected is not None and len(self.pnlJobVisuals) > idx + 1: 116 self._selected.Select(False) 117 self._selected = self.pnlJobVisuals[idx + 1] 118 self._selected.Select(True) 119 elif key == wx.WXK_UP: 120 if self._selected is not None and idx > 0: 121 self._selected.Select(False) 122 self._selected = self.pnlJobVisuals[idx - 1] 123 self._selected.Select(True) 124 else: 125 event.Skip() 126 127 def RemovePnlJobVisual(self, pnlJobVisual, layout=False): 128 if pnlJobVisual.jobContext.IsDone(): 129 if pnlJobVisual is self._selected: 130 self._selected = None 131 self.pnlJobVisuals.remove(pnlJobVisual) 132 self.szJobs.Detach(pnlJobVisual) 133 pnlJobVisual.Destroy() 134 135 if layout: 136 self.szJobs.Layout() 137 self.pnlJobs.SetupScrolling(scroll_x=False) 138 return True 139 else: 140 return False 141 142 def OnCmdClearButton(self, event): 143 removedOne = False 144 idx = 0 145 while idx < len(self.pnlJobVisuals): 146 pnlJobVis = self.pnlJobVisuals[idx] 147 if self.RemovePnlJobVisual(pnlJobVis): 148 removedOne = True 149 else: 150 idx += 1 151 152 if removedOne: 153 self.szJobs.Layout() 154 self.pnlJobs.SetupScrolling(scroll_x=False) 155