143 |
143 |
144 grid.SetCellBackgroundColour(row, col, highlight_colours[0]) |
144 grid.SetCellBackgroundColour(row, col, highlight_colours[0]) |
145 grid.SetCellTextColour(row, col, highlight_colours[1]) |
145 grid.SetCellTextColour(row, col, highlight_colours[1]) |
146 self.ResizeRow(grid, row) |
146 self.ResizeRow(grid, row) |
147 |
147 |
148 [ID_SLAVEPANEL, ID_SLAVEPANELTYPELABEL, |
148 [ID_SLAVEINFOSPANEL, ID_SLAVEINFOSPANELVENDORLABEL, |
149 ID_SLAVEPANELTYPE, ID_SLAVEPANELTYPEBROWSE, |
149 ID_SLAVEINFOSPANELVENDOR, ID_SLAVEINFOSPANELPRODUCTCODELABEL, |
150 ID_SLAVEPANELALIASLABEL, ID_SLAVEPANELALIAS, |
150 ID_SLAVEINFOSPANELPRODUCTCODE, ID_SLAVEINFOSPANELREVISIONNUMBERLABEL, |
151 ID_SLAVEPANELPOSLABEL, ID_SLAVEPANELPOS, |
151 ID_SLAVEINFOSPANELREVISIONNUMBER, ID_SLAVEINFOSPANELPHYSICSLABEL, |
152 ID_SLAVEPANELSLAVEINFOSSTATICBOX, ID_SLAVEPANELVENDORLABEL, |
152 ID_SLAVEINFOSPANELPHYSICS, ID_SLAVEINFOSPANELSYNCMANAGERSLABEL, |
153 ID_SLAVEPANELVENDOR, ID_SLAVEPANELPRODUCTCODELABEL, |
153 ID_SLAVEINFOSPANELSYNCMANAGERSGRID, ID_SLAVEINFOSPANELVARIABLESLABEL, |
154 ID_SLAVEPANELPRODUCTCODE, ID_SLAVEPANELREVISIONNUMBERLABEL, |
154 ID_SLAVEINFOSPANELVARIABLESGRID, |
155 ID_SLAVEPANELREVISIONNUMBER, ID_SLAVEPANELPHYSICSLABEL, |
155 ] = [wx.NewId() for _init_ctrls in range(13)] |
156 ID_SLAVEPANELPHYSICS, ID_SLAVEPANELSYNCMANAGERSLABEL, |
156 |
157 ID_SLAVEPANELSYNCMANAGERSGRID, ID_SLAVEPANELVARIABLESLABEL, |
157 class SlaveInfosPanel(wx.Panel): |
158 ID_SLAVEPANELVARIABLESGRID, |
|
159 ] = [wx.NewId() for _init_ctrls in range(21)] |
|
160 |
|
161 class SlavePanel(wx.Panel): |
|
162 |
158 |
163 if wx.VERSION < (2, 6, 0): |
159 if wx.VERSION < (2, 6, 0): |
164 def Bind(self, event, function, id = None): |
160 def Bind(self, event, function, id = None): |
165 if id is not None: |
161 if id is not None: |
166 event(self, id, function) |
162 event(self, id, function) |
167 else: |
163 else: |
168 event(self, function) |
164 event(self, function) |
169 |
165 |
170 def _init_coll_MainSizer_Items(self, parent): |
166 def _init_coll_MainSizer_Items(self, parent): |
171 parent.AddSizer(self.PositionSizer, 0, border=5, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT) |
167 parent.AddSizer(self.SlaveInfosDetailsSizer, 0, border=5, flag=wx.TOP|wx.LEFT|wx.RIGHT|wx.GROW) |
172 parent.AddSizer(self.SlaveInfosBoxSizer, 0, border=5, flag=wx.GROW|wx.ALIGN_RIGHT|wx.LEFT|wx.RIGHT) |
168 parent.AddWindow(self.SyncManagersLabel, 0, border=5, flag=wx.LEFT|wx.RIGHT|wx.GROW) |
173 |
169 parent.AddWindow(self.SyncManagersGrid, 0, border=5, flag=wx.LEFT|wx.RIGHT|wx.GROW) |
|
170 parent.AddWindow(self.VariablesLabel, 0, border=5, flag=wx.LEFT|wx.RIGHT|wx.GROW) |
|
171 parent.AddWindow(self.VariablesGrid, 0, border=5, flag=wx.BOTTOM|wx.LEFT|wx.RIGHT|wx.GROW) |
|
172 |
174 def _init_coll_MainSizer_Growables(self, parent): |
173 def _init_coll_MainSizer_Growables(self, parent): |
175 parent.AddGrowableCol(0) |
|
176 parent.AddGrowableRow(1) |
|
177 |
|
178 def _init_coll_PositionSizer_Items(self, parent): |
|
179 parent.AddWindow(self.TypeLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL) |
|
180 parent.AddSizer(self.TypeSizer, 0, border=0, flag=wx.GROW) |
|
181 parent.AddWindow(self.AliasLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL) |
|
182 parent.AddWindow(self.Alias, 0, border=0, flag=wx.GROW) |
|
183 parent.AddWindow(self.PosLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL) |
|
184 parent.AddWindow(self.Pos, 0, border=0, flag=wx.GROW) |
|
185 |
|
186 def _init_coll_PositionSizer_Growables(self, parent): |
|
187 parent.AddGrowableCol(1) |
|
188 parent.AddGrowableCol(3) |
|
189 parent.AddGrowableCol(5) |
|
190 parent.AddGrowableRow(0) |
|
191 |
|
192 def _init_coll_TypeSizer_Items(self, parent): |
|
193 parent.AddWindow(self.Type, 1, border=0, flag=0) |
|
194 parent.AddWindow(self.TypeBrowse, 0, border=0, flag=0) |
|
195 |
|
196 def _init_coll_SlaveInfosBoxSizer_Items(self, parent): |
|
197 parent.AddSizer(self.SlaveInfosSizer, 1, border=5, flag=wx.GROW|wx.ALL) |
|
198 |
|
199 def _init_coll_SlaveInfosSizer_Items(self, parent): |
|
200 parent.AddSizer(self.SlaveInfosDetailsSizer, 0, border=0, flag=wx.GROW) |
|
201 parent.AddWindow(self.SyncManagersLabel, 0, border=0, flag=wx.GROW) |
|
202 parent.AddWindow(self.SyncManagersGrid, 0, border=0, flag=wx.GROW) |
|
203 parent.AddWindow(self.VariablesLabel, 0, border=0, flag=wx.GROW) |
|
204 parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW) |
|
205 |
|
206 def _init_coll_SlaveInfosSizer_Growables(self, parent): |
|
207 parent.AddGrowableCol(0) |
174 parent.AddGrowableCol(0) |
208 parent.AddGrowableRow(2, 1) |
175 parent.AddGrowableRow(2, 1) |
209 parent.AddGrowableRow(4, 2) |
176 parent.AddGrowableRow(4, 2) |
210 |
177 |
211 def _init_coll_SlaveInfosDetailsSizer_Items(self, parent): |
178 def _init_coll_SlaveInfosDetailsSizer_Items(self, parent): |
221 def _init_coll_SlaveInfosDetailsSizer_Growables(self, parent): |
188 def _init_coll_SlaveInfosDetailsSizer_Growables(self, parent): |
222 parent.AddGrowableCol(1) |
189 parent.AddGrowableCol(1) |
223 parent.AddGrowableCol(3) |
190 parent.AddGrowableCol(3) |
224 |
191 |
225 def _init_sizers(self): |
192 def _init_sizers(self): |
226 self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) |
193 self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=5) |
227 self.PositionSizer = wx.FlexGridSizer(cols=6, hgap=5, rows=1, vgap=0) |
|
228 self.TypeSizer = wx.BoxSizer(wx.HORIZONTAL) |
|
229 self.SlaveInfosBoxSizer = wx.StaticBoxSizer(self.SlaveInfosStaticBox, wx.VERTICAL) |
|
230 self.SlaveInfosSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=5) |
|
231 self.SlaveInfosDetailsSizer = wx.FlexGridSizer(cols=4, hgap=5, rows=2, vgap=5) |
194 self.SlaveInfosDetailsSizer = wx.FlexGridSizer(cols=4, hgap=5, rows=2, vgap=5) |
232 |
195 |
233 self._init_coll_MainSizer_Growables(self.MainSizer) |
196 self._init_coll_MainSizer_Growables(self.MainSizer) |
234 self._init_coll_MainSizer_Items(self.MainSizer) |
197 self._init_coll_MainSizer_Items(self.MainSizer) |
235 self._init_coll_PositionSizer_Growables(self.PositionSizer) |
|
236 self._init_coll_PositionSizer_Items(self.PositionSizer) |
|
237 self._init_coll_TypeSizer_Items(self.TypeSizer) |
|
238 self._init_coll_SlaveInfosBoxSizer_Items(self.SlaveInfosBoxSizer) |
|
239 self._init_coll_SlaveInfosSizer_Growables(self.SlaveInfosSizer) |
|
240 self._init_coll_SlaveInfosSizer_Items(self.SlaveInfosSizer) |
|
241 self._init_coll_SlaveInfosDetailsSizer_Growables(self.SlaveInfosDetailsSizer) |
198 self._init_coll_SlaveInfosDetailsSizer_Growables(self.SlaveInfosDetailsSizer) |
242 self._init_coll_SlaveInfosDetailsSizer_Items(self.SlaveInfosDetailsSizer) |
199 self._init_coll_SlaveInfosDetailsSizer_Items(self.SlaveInfosDetailsSizer) |
243 |
200 |
244 self.SetSizer(self.MainSizer) |
201 self.SetSizer(self.MainSizer) |
245 |
202 |
246 def _init_ctrls(self, prnt): |
203 def _init_ctrls(self, prnt): |
247 wx.Panel.__init__(self, id=ID_SLAVEPANEL, name='SlavePanel', parent=prnt, |
204 wx.Panel.__init__(self, id=ID_SLAVEINFOSPANEL, name='SlavePanel', parent=prnt, |
248 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
205 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
249 |
206 |
250 self.TypeLabel = wx.StaticText(id=ID_SLAVEPANELTYPELABEL, |
207 self.VendorLabel = wx.StaticText(id=ID_SLAVEINFOSPANELVENDORLABEL, |
251 label=_('Type:'), name='TypeLabel', parent=self, |
|
252 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
253 |
|
254 self.Type = wx.TextCtrl(id=ID_SLAVEPANELTYPE, value='', |
|
255 name='Type', parent=self, pos=wx.Point(0, 0), |
|
256 size=wx.Size(0, 24), style=wx.TE_READONLY) |
|
257 |
|
258 self.TypeBrowse = wx.Button(id=ID_SLAVEPANELTYPEBROWSE, label='...', |
|
259 name='TypeBrowse', parent=self, pos=wx.Point(0, 0), |
|
260 size=wx.Size(30, 24), style=0) |
|
261 self.Bind(wx.EVT_BUTTON, self.OnTypeBrowseClick, id=ID_SLAVEPANELTYPEBROWSE) |
|
262 |
|
263 self.AliasLabel = wx.StaticText(id=ID_SLAVEPANELALIASLABEL, |
|
264 label=_('Alias:'), name='AliasLabel', parent=self, |
|
265 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
266 |
|
267 self.Alias = wx.SpinCtrl(id=ID_SLAVEPANELALIAS, |
|
268 name='Alias', parent=self, pos=wx.Point(0, 0), |
|
269 size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0, max=0xffff) |
|
270 self.Bind(wx.EVT_SPINCTRL, self.OnAliasChanged, id=ID_SLAVEPANELALIAS) |
|
271 |
|
272 self.PosLabel = wx.StaticText(id=ID_SLAVEPANELPOSLABEL, |
|
273 label=_('Position:'), name='PositionLabel', parent=self, |
|
274 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
275 |
|
276 self.Pos = wx.SpinCtrl(id=ID_SLAVEPANELPOS, |
|
277 name='Pos', parent=self, pos=wx.Point(0, 0), |
|
278 size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0, max=0xffff) |
|
279 self.Bind(wx.EVT_SPINCTRL, self.OnPositionChanged, id=ID_SLAVEPANELPOS) |
|
280 |
|
281 self.SlaveInfosStaticBox = wx.StaticBox(id=ID_SLAVEPANELSLAVEINFOSSTATICBOX, |
|
282 label=_('Slave infos:'), name='SlaveInfosStaticBox', parent=self, |
|
283 pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0) |
|
284 |
|
285 self.VendorLabel = wx.StaticText(id=ID_SLAVEPANELVENDORLABEL, |
|
286 label=_('Vendor:'), name='VendorLabel', parent=self, |
208 label=_('Vendor:'), name='VendorLabel', parent=self, |
287 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
209 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
288 |
210 |
289 self.Vendor = wx.TextCtrl(id=ID_SLAVEPANELVENDOR, value='', |
211 self.Vendor = wx.TextCtrl(id=ID_SLAVEINFOSPANELVENDOR, value='', |
290 name='Vendor', parent=self, pos=wx.Point(0, 0), |
212 name='Vendor', parent=self, pos=wx.Point(0, 0), |
291 size=wx.Size(0, 24), style=wx.TE_READONLY) |
213 size=wx.Size(0, 24), style=wx.TE_READONLY) |
292 |
214 |
293 self.ProductCodeLabel = wx.StaticText(id=ID_SLAVEPANELPRODUCTCODELABEL, |
215 self.ProductCodeLabel = wx.StaticText(id=ID_SLAVEINFOSPANELPRODUCTCODELABEL, |
294 label=_('Product code:'), name='ProductCodeLabel', parent=self, |
216 label=_('Product code:'), name='ProductCodeLabel', parent=self, |
295 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
217 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
296 |
218 |
297 self.ProductCode = wx.TextCtrl(id=ID_SLAVEPANELPRODUCTCODE, value='', |
219 self.ProductCode = wx.TextCtrl(id=ID_SLAVEINFOSPANELPRODUCTCODE, value='', |
298 name='ProductCode', parent=self, pos=wx.Point(0, 0), |
220 name='ProductCode', parent=self, pos=wx.Point(0, 0), |
299 size=wx.Size(0, 24), style=wx.TE_READONLY) |
221 size=wx.Size(0, 24), style=wx.TE_READONLY) |
300 |
222 |
301 self.RevisionNumberLabel = wx.StaticText(id=ID_SLAVEPANELREVISIONNUMBERLABEL, |
223 self.RevisionNumberLabel = wx.StaticText(id=ID_SLAVEINFOSPANELREVISIONNUMBERLABEL, |
302 label=_('Revision number:'), name='RevisionNumberLabel', parent=self, |
224 label=_('Revision number:'), name='RevisionNumberLabel', parent=self, |
303 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
225 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
304 |
226 |
305 self.RevisionNumber = wx.TextCtrl(id=ID_SLAVEPANELREVISIONNUMBER, value='', |
227 self.RevisionNumber = wx.TextCtrl(id=ID_SLAVEINFOSPANELREVISIONNUMBER, value='', |
306 name='RevisionNumber', parent=self, pos=wx.Point(0, 0), |
228 name='RevisionNumber', parent=self, pos=wx.Point(0, 0), |
307 size=wx.Size(0, 24), style=wx.TE_READONLY) |
229 size=wx.Size(0, 24), style=wx.TE_READONLY) |
308 |
230 |
309 self.PhysicsLabel = wx.StaticText(id=ID_SLAVEPANELPHYSICSLABEL, |
231 self.PhysicsLabel = wx.StaticText(id=ID_SLAVEINFOSPANELPHYSICSLABEL, |
310 label=_('Physics:'), name='PhysicsLabel', parent=self, |
232 label=_('Physics:'), name='PhysicsLabel', parent=self, |
311 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
233 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
312 |
234 |
313 self.Physics = wx.TextCtrl(id=ID_SLAVEPANELPHYSICS, value='', |
235 self.Physics = wx.TextCtrl(id=ID_SLAVEINFOSPANELPHYSICS, value='', |
314 name='Physics', parent=self, pos=wx.Point(0, 0), |
236 name='Physics', parent=self, pos=wx.Point(0, 0), |
315 size=wx.Size(0, 24), style=wx.TE_READONLY) |
237 size=wx.Size(0, 24), style=wx.TE_READONLY) |
316 |
238 |
317 self.SyncManagersLabel = wx.StaticText(id=ID_SLAVEPANELSYNCMANAGERSLABEL, |
239 self.SyncManagersLabel = wx.StaticText(id=ID_SLAVEINFOSPANELSYNCMANAGERSLABEL, |
318 label=_('Sync managers:'), name='SyncManagersLabel', parent=self, |
240 label=_('Sync managers:'), name='SyncManagersLabel', parent=self, |
319 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
241 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
320 |
242 |
321 self.SyncManagersGrid = CustomGrid(id=ID_SLAVEPANELSYNCMANAGERSGRID, |
243 self.SyncManagersGrid = CustomGrid(id=ID_SLAVEINFOSPANELSYNCMANAGERSGRID, |
322 name='SyncManagersGrid', parent=self, pos=wx.Point(0, 0), |
244 name='SyncManagersGrid', parent=self, pos=wx.Point(0, 0), |
323 size=wx.Size(0, 0), style=wx.VSCROLL) |
245 size=wx.Size(0, 0), style=wx.VSCROLL) |
324 |
246 |
325 self.VariablesLabel = wx.StaticText(id=ID_SLAVEPANELVARIABLESLABEL, |
247 self.VariablesLabel = wx.StaticText(id=ID_SLAVEINFOSPANELVARIABLESLABEL, |
326 label=_('Variable entries:'), name='VariablesLabel', parent=self, |
248 label=_('Variable entries:'), name='VariablesLabel', parent=self, |
327 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
249 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
328 |
250 |
329 self.VariablesGrid = CustomGrid(id=ID_SLAVEPANELVARIABLESGRID, |
251 self.VariablesGrid = CustomGrid(id=ID_SLAVEINFOSPANELVARIABLESGRID, |
330 name='VariablesGrid', parent=self, pos=wx.Point(0, 0), |
252 name='VariablesGrid', parent=self, pos=wx.Point(0, 0), |
331 size=wx.Size(0, 0), style=wx.VSCROLL) |
253 size=wx.Size(0, 0), style=wx.VSCROLL) |
332 if wx.VERSION >= (2, 5, 0): |
254 if wx.VERSION >= (2, 5, 0): |
333 self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick) |
255 self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick) |
334 else: |
256 else: |
335 wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick) |
257 wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick) |
336 |
258 |
337 self._init_sizers() |
259 self._init_sizers() |
338 |
260 |
339 def __init__(self, parent, controler, window, slave): |
261 def __init__(self, parent, controler): |
340 self._init_ctrls(parent) |
262 self._init_ctrls(parent) |
341 |
263 |
342 self.Controler = controler |
264 self.Controler = controler |
343 self.ParentWindow = window |
|
344 self.Slave = slave |
|
345 |
265 |
346 self.SyncManagersTable = SyncManagersTable(self, [], GetSyncManagersTableColnames()) |
266 self.SyncManagersTable = SyncManagersTable(self, [], GetSyncManagersTableColnames()) |
347 self.SyncManagersGrid.SetTable(self.SyncManagersTable) |
267 self.SyncManagersGrid.SetTable(self.SyncManagersTable) |
348 self.SyncManagersGridColAlignements = [wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, |
268 self.SyncManagersGridColAlignements = [wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, |
349 wx.ALIGN_RIGHT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT] |
269 wx.ALIGN_RIGHT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT] |
367 attr = wx.grid.GridCellAttr() |
287 attr = wx.grid.GridCellAttr() |
368 attr.SetAlignment(self.VariablesGridColAlignements[col], wx.ALIGN_CENTRE) |
288 attr.SetAlignment(self.VariablesGridColAlignements[col], wx.ALIGN_CENTRE) |
369 self.VariablesGrid.SetColAttr(col, attr) |
289 self.VariablesGrid.SetColAttr(col, attr) |
370 self.VariablesGrid.SetColMinimalWidth(col, self.VariablesGridColSizes[col]) |
290 self.VariablesGrid.SetColMinimalWidth(col, self.VariablesGridColSizes[col]) |
371 self.VariablesGrid.AutoSizeColumn(col, False) |
291 self.VariablesGrid.AutoSizeColumn(col, False) |
372 |
292 |
373 self.RefreshView() |
293 def SetSlaveInfos(self, slave_infos): |
374 |
|
375 def GetSlaveTitle(self): |
|
376 type_infos = self.Controler.GetSlaveType(self.Slave) |
|
377 return "%s (%d:%d)" % (type_infos["device_type"], self.Slave[0], self.Slave[1]) |
|
378 |
|
379 def GetSlave(self): |
|
380 return self.Slave |
|
381 |
|
382 def SetSlave(self, slave): |
|
383 if self.Slave != slave: |
|
384 self.Slave = slave |
|
385 self.RefreshView() |
|
386 |
|
387 def RefreshView(self): |
|
388 self.Alias.SetValue(self.Slave[0]) |
|
389 self.Pos.SetValue(self.Slave[1]) |
|
390 slave_infos = self.Controler.GetSlaveInfos(self.Slave) |
|
391 if slave_infos is not None: |
294 if slave_infos is not None: |
392 self.Type.SetValue(slave_infos["device_type"]) |
|
393 self.Vendor.SetValue(slave_infos["vendor"]) |
295 self.Vendor.SetValue(slave_infos["vendor"]) |
394 self.ProductCode.SetValue(slave_infos["product_code"]) |
296 self.ProductCode.SetValue(slave_infos["product_code"]) |
395 self.RevisionNumber.SetValue(slave_infos["revision_number"]) |
297 self.RevisionNumber.SetValue(slave_infos["revision_number"]) |
396 self.Physics.SetValue(slave_infos["physics"]) |
298 self.Physics.SetValue(slave_infos["physics"]) |
397 self.SyncManagersTable.SetData(slave_infos["sync_managers"]) |
299 self.SyncManagersTable.SetData(slave_infos["sync_managers"]) |
398 self.SyncManagersTable.ResetView(self.SyncManagersGrid) |
300 self.SyncManagersTable.ResetView(self.SyncManagersGrid) |
399 self.VariablesTable.SetData(slave_infos["entries"]) |
301 self.VariablesTable.SetData(slave_infos["entries"]) |
400 self.VariablesTable.ResetView(self.VariablesGrid) |
302 self.VariablesTable.ResetView(self.VariablesGrid) |
401 else: |
303 else: |
402 type_infos = self.Controler.GetSlaveType(self.Slave) |
304 self.Vendor.SetValue("") |
403 self.Type.SetValue(type_infos["device_type"]) |
305 self.ProductCode.SetValue("") |
404 |
306 self.RevisionNumber.SetValue("") |
405 def OnAliasChanged(self, event): |
307 self.Physics.SetValue("") |
406 alias = self.Alias.GetValue() |
308 self.SyncManagersTable.SetData([]) |
407 if alias != self.Slave[0]: |
309 self.SyncManagersTable.ResetView(self.SyncManagersGrid) |
408 result = self.Controler.SetSlavePos(self.Slave[:2], alias = alias) |
310 self.VariablesTable.SetData([]) |
409 if result is not None: |
311 self.VariablesTable.ResetView(self.VariablesGrid) |
410 message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR) |
|
411 message.ShowModal() |
|
412 message.Destroy() |
|
413 else: |
|
414 wx.CallAfter(self.ParentWindow.RefreshView, (alias, self.Slave[1])) |
|
415 wx.CallAfter(self.ParentWindow.RefreshParentWindow) |
|
416 event.Skip() |
|
417 |
|
418 def OnPositionChanged(self, event): |
|
419 position = self.Pos.GetValue() |
|
420 if position != self.Slave[1]: |
|
421 result = self.Controler.SetSlavePos(self.Slave, position = position) |
|
422 if result is not None: |
|
423 message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR) |
|
424 message.ShowModal() |
|
425 message.Destroy() |
|
426 else: |
|
427 wx.CallAfter(self.ParentWindow.RefreshView, (self.Slave[0], position)) |
|
428 wx.CallAfter(self.ParentWindow.RefreshParentWindow) |
|
429 event.Skip() |
|
430 |
|
431 def OnTypeBrowseClick(self, event): |
|
432 dialog = SlaveTypeChoiceDialog(self, self.Controler, self.Controler.GetSlaveType(self.Slave)) |
|
433 if dialog.ShowModal() == wx.ID_OK: |
|
434 result = self.Controler.SetSlaveType(self.Slave, dialog.GetType()) |
|
435 if result is not None: |
|
436 message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR) |
|
437 message.ShowModal() |
|
438 message.Destroy() |
|
439 else: |
|
440 wx.CallAfter(self.RefreshView) |
|
441 wx.CallAfter(self.ParentWindow.RefreshSlaveNodesTitles) |
|
442 wx.CallAfter(self.ParentWindow.RefreshParentWindow) |
|
443 dialog.Destroy() |
|
444 event.Skip() |
|
445 |
312 |
446 def OnVariablesGridCellLeftClick(self, event): |
313 def OnVariablesGridCellLeftClick(self, event): |
447 row = event.GetRow() |
314 row = event.GetRow() |
448 |
315 |
449 data_type = self.VariablesTable.GetValueByName(row, "Type") |
316 data_type = self.VariablesTable.GetValueByName(row, "Type") |
466 dragSource.SetData(data) |
333 dragSource.SetData(data) |
467 dragSource.DoDragDrop() |
334 dragSource.DoDragDrop() |
468 |
335 |
469 event.Skip() |
336 event.Skip() |
470 |
337 |
471 [ID_CONFIGEDITOR, ID_CONFIGEDITORADDSLAVEBUTTON, |
338 [ID_SLAVEPANEL, ID_SLAVEPANELTYPELABEL, |
472 ID_CONFIGEDITORDELETESLAVEBUTTON, ID_CONFIGEDITORSLAVENODES, |
339 ID_SLAVEPANELTYPE, ID_SLAVEPANELTYPEBROWSE, |
473 ] = [wx.NewId() for _init_ctrls in range(4)] |
340 ID_SLAVEPANELALIASLABEL, ID_SLAVEPANELALIAS, |
|
341 ID_SLAVEPANELPOSLABEL, ID_SLAVEPANELPOS, |
|
342 ID_SLAVEPANELSLAVEINFOSSTATICBOX, |
|
343 ] = [wx.NewId() for _init_ctrls in range(9)] |
|
344 |
|
345 class SlavePanel(wx.Panel): |
|
346 |
|
347 if wx.VERSION < (2, 6, 0): |
|
348 def Bind(self, event, function, id = None): |
|
349 if id is not None: |
|
350 event(self, id, function) |
|
351 else: |
|
352 event(self, function) |
|
353 |
|
354 def _init_coll_MainSizer_Items(self, parent): |
|
355 parent.AddSizer(self.PositionSizer, 0, border=5, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT) |
|
356 parent.AddSizer(self.SlaveInfosBoxSizer, 0, border=5, flag=wx.GROW|wx.ALIGN_RIGHT|wx.LEFT|wx.RIGHT) |
|
357 |
|
358 def _init_coll_MainSizer_Growables(self, parent): |
|
359 parent.AddGrowableCol(0) |
|
360 parent.AddGrowableRow(1) |
|
361 |
|
362 def _init_coll_PositionSizer_Items(self, parent): |
|
363 parent.AddWindow(self.TypeLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL) |
|
364 parent.AddSizer(self.TypeSizer, 0, border=0, flag=wx.GROW) |
|
365 parent.AddWindow(self.AliasLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL) |
|
366 parent.AddWindow(self.Alias, 0, border=0, flag=wx.GROW) |
|
367 parent.AddWindow(self.PosLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL) |
|
368 parent.AddWindow(self.Pos, 0, border=0, flag=wx.GROW) |
|
369 |
|
370 def _init_coll_PositionSizer_Growables(self, parent): |
|
371 parent.AddGrowableCol(1) |
|
372 parent.AddGrowableCol(3) |
|
373 parent.AddGrowableCol(5) |
|
374 parent.AddGrowableRow(0) |
|
375 |
|
376 def _init_coll_TypeSizer_Items(self, parent): |
|
377 parent.AddWindow(self.Type, 1, border=0, flag=0) |
|
378 parent.AddWindow(self.TypeBrowse, 0, border=0, flag=0) |
|
379 |
|
380 def _init_coll_SlaveInfosBoxSizer_Items(self, parent): |
|
381 parent.AddWindow(self.SlaveInfosPanel, 1, border=0, flag=wx.GROW) |
|
382 |
|
383 def _init_sizers(self): |
|
384 self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) |
|
385 self.PositionSizer = wx.FlexGridSizer(cols=6, hgap=5, rows=1, vgap=0) |
|
386 self.TypeSizer = wx.BoxSizer(wx.HORIZONTAL) |
|
387 self.SlaveInfosBoxSizer = wx.StaticBoxSizer(self.SlaveInfosStaticBox, wx.VERTICAL) |
|
388 |
|
389 self._init_coll_MainSizer_Growables(self.MainSizer) |
|
390 self._init_coll_MainSizer_Items(self.MainSizer) |
|
391 self._init_coll_PositionSizer_Growables(self.PositionSizer) |
|
392 self._init_coll_PositionSizer_Items(self.PositionSizer) |
|
393 self._init_coll_TypeSizer_Items(self.TypeSizer) |
|
394 self._init_coll_SlaveInfosBoxSizer_Items(self.SlaveInfosBoxSizer) |
|
395 |
|
396 self.SetSizer(self.MainSizer) |
|
397 |
|
398 def _init_ctrls(self, prnt): |
|
399 wx.Panel.__init__(self, id=ID_SLAVEPANEL, name='SlavePanel', parent=prnt, |
|
400 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
|
401 |
|
402 self.TypeLabel = wx.StaticText(id=ID_SLAVEPANELTYPELABEL, |
|
403 label=_('Type:'), name='TypeLabel', parent=self, |
|
404 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
405 |
|
406 self.Type = wx.TextCtrl(id=ID_SLAVEPANELTYPE, value='', |
|
407 name='Type', parent=self, pos=wx.Point(0, 0), |
|
408 size=wx.Size(0, 24), style=wx.TE_READONLY) |
|
409 |
|
410 self.TypeBrowse = wx.Button(id=ID_SLAVEPANELTYPEBROWSE, label='...', |
|
411 name='TypeBrowse', parent=self, pos=wx.Point(0, 0), |
|
412 size=wx.Size(30, 24), style=0) |
|
413 self.Bind(wx.EVT_BUTTON, self.OnTypeBrowseClick, id=ID_SLAVEPANELTYPEBROWSE) |
|
414 |
|
415 self.AliasLabel = wx.StaticText(id=ID_SLAVEPANELALIASLABEL, |
|
416 label=_('Alias:'), name='AliasLabel', parent=self, |
|
417 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
418 |
|
419 self.Alias = wx.SpinCtrl(id=ID_SLAVEPANELALIAS, |
|
420 name='Alias', parent=self, pos=wx.Point(0, 0), |
|
421 size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0, max=0xffff) |
|
422 self.Bind(wx.EVT_SPINCTRL, self.OnAliasChanged, id=ID_SLAVEPANELALIAS) |
|
423 |
|
424 self.PosLabel = wx.StaticText(id=ID_SLAVEPANELPOSLABEL, |
|
425 label=_('Position:'), name='PositionLabel', parent=self, |
|
426 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
427 |
|
428 self.Pos = wx.SpinCtrl(id=ID_SLAVEPANELPOS, |
|
429 name='Pos', parent=self, pos=wx.Point(0, 0), |
|
430 size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0, max=0xffff) |
|
431 self.Bind(wx.EVT_SPINCTRL, self.OnPositionChanged, id=ID_SLAVEPANELPOS) |
|
432 |
|
433 self.SlaveInfosStaticBox = wx.StaticBox(id=ID_SLAVEPANELSLAVEINFOSSTATICBOX, |
|
434 label=_('Slave infos:'), name='SlaveInfosStaticBox', parent=self, |
|
435 pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0) |
|
436 |
|
437 self.SlaveInfosPanel = SlaveInfosPanel(self, self.Controler) |
|
438 |
|
439 self._init_sizers() |
|
440 |
|
441 def __init__(self, parent, controler, window, slave): |
|
442 self.Controler = controler |
|
443 self.ParentWindow = window |
|
444 self.Slave = slave |
|
445 |
|
446 self._init_ctrls(parent) |
|
447 |
|
448 self.RefreshView() |
|
449 |
|
450 def GetSlaveTitle(self): |
|
451 type_infos = self.Controler.GetSlaveType(self.Slave) |
|
452 return "%s (%d:%d)" % (type_infos["device_type"], self.Slave[0], self.Slave[1]) |
|
453 |
|
454 def GetSlave(self): |
|
455 return self.Slave |
|
456 |
|
457 def SetSlave(self, slave): |
|
458 if self.Slave != slave: |
|
459 self.Slave = slave |
|
460 self.RefreshView() |
|
461 |
|
462 def RefreshView(self): |
|
463 self.Alias.SetValue(self.Slave[0]) |
|
464 self.Pos.SetValue(self.Slave[1]) |
|
465 slave_infos = self.Controler.GetSlaveInfos(self.Slave) |
|
466 if slave_infos is not None: |
|
467 self.Type.SetValue(slave_infos["device_type"]) |
|
468 else: |
|
469 type_infos = self.Controler.GetSlaveType(self.Slave) |
|
470 self.Type.SetValue(type_infos["device_type"]) |
|
471 self.SlaveInfosPanel.SetSlaveInfos(slave_infos) |
|
472 |
|
473 def OnAliasChanged(self, event): |
|
474 alias = self.Alias.GetValue() |
|
475 if alias != self.Slave[0]: |
|
476 result = self.Controler.SetSlavePos(self.Slave[:2], alias = alias) |
|
477 if result is not None: |
|
478 message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR) |
|
479 message.ShowModal() |
|
480 message.Destroy() |
|
481 else: |
|
482 wx.CallAfter(self.ParentWindow.RefreshView, (alias, self.Slave[1])) |
|
483 wx.CallAfter(self.ParentWindow.RefreshParentWindow) |
|
484 event.Skip() |
|
485 |
|
486 def OnPositionChanged(self, event): |
|
487 position = self.Pos.GetValue() |
|
488 if position != self.Slave[1]: |
|
489 result = self.Controler.SetSlavePos(self.Slave, position = position) |
|
490 if result is not None: |
|
491 message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR) |
|
492 message.ShowModal() |
|
493 message.Destroy() |
|
494 else: |
|
495 wx.CallAfter(self.ParentWindow.RefreshView, (self.Slave[0], position)) |
|
496 wx.CallAfter(self.ParentWindow.RefreshParentWindow) |
|
497 event.Skip() |
|
498 |
|
499 def OnTypeBrowseClick(self, event): |
|
500 dialog = SlaveTypeChoiceDialog(self, self.Controler, self.Controler.GetSlaveType(self.Slave)) |
|
501 if dialog.ShowModal() == wx.ID_OK: |
|
502 result = self.Controler.SetSlaveType(self.Slave, dialog.GetType()) |
|
503 if result is not None: |
|
504 message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR) |
|
505 message.ShowModal() |
|
506 message.Destroy() |
|
507 else: |
|
508 wx.CallAfter(self.RefreshView) |
|
509 wx.CallAfter(self.ParentWindow.RefreshSlaveNodesTitles) |
|
510 wx.CallAfter(self.ParentWindow.RefreshParentWindow) |
|
511 dialog.Destroy() |
|
512 event.Skip() |
|
513 |
|
514 [ID_CONFIGEDITOR, ID_CONFIGEDITORSLAVENODES, |
|
515 ] = [wx.NewId() for _init_ctrls in range(2)] |
474 |
516 |
475 [ID_CONFIGEDITORPLUGINMENUADDSLAVE, ID_CONFIGEDITORPLUGINMENUDELETESLAVE, |
517 [ID_CONFIGEDITORPLUGINMENUADDSLAVE, ID_CONFIGEDITORPLUGINMENUDELETESLAVE, |
476 ] = [wx.NewId() for _init_coll_PluginMenu_Items in range(2)] |
518 ] = [wx.NewId() for _init_coll_PluginMenu_Items in range(2)] |
477 |
519 |
478 class ConfigEditor(EditorPanel): |
520 class ConfigEditor(EditorPanel): |