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