etherlab/ConfigEditor.py
changeset 2034 ae8fecf082a1
parent 2030 7147f20c23e3
child 2037 d54036f70390
equal deleted inserted replaced
2033:1c64b84c0609 2034:ae8fecf082a1
   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):
   584         if selected != -1:
   626         if selected != -1:
   585             panel = self.SlaveNodes.GetPage(selected)
   627             panel = self.SlaveNodes.GetPage(selected)
   586             if self.Controler.RemoveSlave(panel.GetSlave()[:2]):
   628             if self.Controler.RemoveSlave(panel.GetSlave()[:2]):
   587                 self.RefreshParentWindow()
   629                 self.RefreshParentWindow()
   588                 wx.CallAfter(self.RefreshView)
   630                 wx.CallAfter(self.RefreshView)
   589             
   631 
       
   632 
       
   633 [ID_DS402NODEEDITOR,
       
   634 ] = [wx.NewId() for _init_ctrls in range(1)]
       
   635 
       
   636 class DS402NodeEditor(EditorPanel):
       
   637     
       
   638     ID = ID_DS402NODEEDITOR
       
   639     
       
   640     def _init_Editor(self, prnt):
       
   641         self.Editor = SlaveInfosPanel(prnt, self.Controler)
       
   642         
       
   643     def __init__(self, parent, controler, window):
       
   644         EditorPanel.__init__(self, parent, "", window, controler)
       
   645         
       
   646         img = wx.Bitmap(self.Controler.GetIconPath("Cfile.png"), wx.BITMAP_TYPE_PNG).ConvertToImage()
       
   647         self.SetIcon(wx.BitmapFromImage(img.Rescale(16, 16)))
       
   648     
       
   649     def __del__(self):
       
   650         self.Controler.OnCloseEditor(self)
       
   651     
       
   652     def GetTitle(self):
       
   653         return self.Controler.PlugFullName()
       
   654     
       
   655     def GetBufferState(self):
       
   656         return False, False
       
   657         
       
   658     def RefreshView(self):
       
   659         self.Editor.SetSlaveInfos(self.Controler.GetSlaveInfos())
       
   660