--- a/etherlab/ConfigEditor.py Wed Feb 29 12:00:20 2012 +0100
+++ b/etherlab/ConfigEditor.py Sun Mar 11 19:32:44 2012 +0100
@@ -1,5 +1,6 @@
import wx
import wx.grid
+import wx.gizmos
from controls import CustomGrid, CustomTable, EditorPanel
@@ -110,40 +111,7 @@
def GetVariablesTableColnames():
_ = lambda x : x
- return ["#", _("Index"), _("SubIndex"), _("Name"), _("Type"), _("PDO index"), _("PDO name"), _("PDO type")]
-
-class VariablesTable(CustomTable):
-
- def GetValue(self, row, col):
- if row < self.GetNumberRows():
- if col == 0:
- return row + 1
- return self.data[row].get(self.GetColLabelValue(col, False), "")
-
- def _updateColAttrs(self, grid):
- """
- wx.grid.Grid -> update the column attributes to add the
- appropriate renderer given the column name.
-
- Otherwise default to the default renderer.
- """
- for row in range(self.GetNumberRows()):
- row_highlights = self.Highlights.get(row, {})
- pdo_mapping = self.GetValueByName(row, "PDOMapping")
- for col in range(self.GetNumberCols()):
- colname = self.GetColLabelValue(col, False)
-
- if colname in ["PDO index", "PDO name", "PDO type"] and pdo_mapping == "":
- highlight_colours = (wx.LIGHT_GREY, wx.WHITE)
- else:
- highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
- grid.SetReadOnly(row, col, True)
- grid.SetCellEditor(row, col, None)
- grid.SetCellRenderer(row, col, None)
-
- grid.SetCellBackgroundColour(row, col, highlight_colours[0])
- grid.SetCellTextColour(row, col, highlight_colours[1])
- self.ResizeRow(grid, row)
+ return ["#", _("Name"), _("Index"), _("SubIndex"), _("Type"), _("PDO index"), _("PDO name"), _("PDO type")]
[ID_SLAVEINFOSPANEL, ID_SLAVEINFOSPANELVENDORLABEL,
ID_SLAVEINFOSPANELVENDOR, ID_SLAVEINFOSPANELPRODUCTCODELABEL,
@@ -248,14 +216,15 @@
label=_('Variable entries:'), name='VariablesLabel', parent=self,
pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
- self.VariablesGrid = CustomGrid(id=ID_SLAVEINFOSPANELVARIABLESGRID,
+ self.VariablesGrid = wx.gizmos.TreeListCtrl(id=ID_SLAVEINFOSPANELVARIABLESGRID,
name='VariablesGrid', parent=self, pos=wx.Point(0, 0),
- size=wx.Size(0, 0), style=wx.VSCROLL)
- if wx.VERSION >= (2, 5, 0):
- self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
- else:
- wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick)
-
+ size=wx.Size(0, 0), style=wx.TR_DEFAULT_STYLE |
+ wx.TR_ROW_LINES |
+ wx.TR_COLUMN_LINES |
+ wx.TR_HIDE_ROOT |
+ wx.TR_FULL_ROW_HIGHLIGHT)
+ self.VariablesGrid.GetMainWindow().Bind(wx.EVT_LEFT_DOWN, self.OnVariablesGridLeftClick)
+
self._init_sizers()
def __init__(self, parent, controler):
@@ -277,21 +246,15 @@
self.SyncManagersGrid.SetColAttr(col, attr)
self.SyncManagersGrid.SetColMinimalWidth(col, self.SyncManagersGridColSizes[col])
self.SyncManagersGrid.AutoSizeColumn(col, False)
-
- self.VariablesTable = VariablesTable(self, [], GetVariablesTableColnames())
- self.VariablesGrid.SetTable(self.VariablesTable)
- self.VariablesGridColAlignements = [wx.ALIGN_RIGHT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT,
- wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT,
- wx.ALIGN_LEFT, wx.ALIGN_LEFT]
- self.VariablesGridColSizes = [40, 100, 100, 150, 150, 100, 150, 100]
- self.VariablesGrid.SetRowLabelSize(0)
- for col in range(self.VariablesTable.GetNumberCols()):
- attr = wx.grid.GridCellAttr()
- attr.SetAlignment(self.VariablesGridColAlignements[col], wx.ALIGN_CENTRE)
- self.VariablesGrid.SetColAttr(col, attr)
- self.VariablesGrid.SetColMinimalWidth(col, self.VariablesGridColSizes[col])
- self.VariablesGrid.AutoSizeColumn(col, False)
-
+
+ for colname, colsize, colalign in zip(GetVariablesTableColnames(),
+ [40, 150, 100, 100, 150, 100, 150, 100],
+ [wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT,
+ wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT,
+ wx.ALIGN_LEFT, wx.ALIGN_LEFT]):
+ self.VariablesGrid.AddColumn(colname, colsize, colalign)
+ self.VariablesGrid.SetMainColumn(1)
+
def SetSlaveInfos(self, slave_pos, slave_infos):
self.Slave = slave_pos
if slave_infos is not None:
@@ -302,8 +265,7 @@
self.Physics.SetValue(slave_infos["physics"])
self.SyncManagersTable.SetData(slave_infos["sync_managers"])
self.SyncManagersTable.ResetView(self.SyncManagersGrid)
- self.VariablesTable.SetData(slave_infos["entries"])
- self.VariablesTable.ResetView(self.VariablesGrid)
+ self.RefreshVariablesGrid(slave_infos["entries"])
else:
self.Type = None
self.Vendor.SetValue("")
@@ -312,32 +274,72 @@
self.Physics.SetValue("")
self.SyncManagersTable.SetData([])
self.SyncManagersTable.ResetView(self.SyncManagersGrid)
- self.VariablesTable.SetData([])
- self.VariablesTable.ResetView(self.VariablesGrid)
-
- def OnVariablesGridCellLeftClick(self, event):
- row = event.GetRow()
-
- data_type = self.VariablesTable.GetValueByName(row, "Type")
- pdo_mapping = self.VariablesTable.GetValueByName(row, "PDOMapping")
- if (event.GetCol() == 0 and pdo_mapping != "" and
- self.Controler.GetSizeOfType(data_type) is not None):
+ self.RefreshVariablesGrid([])
- entry_index = self.Controler.ExtractHexDecValue(self.VariablesTable.GetValueByName(row, "Index"))
- entry_subindex = self.Controler.ExtractHexDecValue(self.VariablesTable.GetValueByName(row, "SubIndex"))
- var_name = "%s_%4.4x_%2.2x" % (self.Type, entry_index, entry_subindex)
- if pdo_mapping in ["R"]:
- dir = "%I"
- else:
- dir = "%Q"
- location = "%s%s" % (dir, self.Controler.GetSizeOfType(data_type)) + \
- ".".join(map(lambda x:str(x), self.Controler.GetCurrentLocation() + self.Slave + (entry_index, entry_subindex)))
+ def RefreshVariablesGrid(self, entries):
+ root = self.VariablesGrid.GetRootItem()
+ if not root.IsOk():
+ root = self.VariablesGrid.AddRoot("Slave entries")
+ self.GenerateVariablesGridBranch(root, entries, GetVariablesTableColnames())
+ self.VariablesGrid.Expand(root)
+
+ def GenerateVariablesGridBranch(self, root, entries, colnames, idx=0):
+ if wx.VERSION >= (2, 6, 0):
+ item, root_cookie = self.VariablesGrid.GetFirstChild(root)
+ else:
+ item, root_cookie = self.VariablesGrid.GetFirstChild(root, 0)
+
+ for entry in entries:
+ idx += 1
+ if not item.IsOk():
+ item = self.VariablesGrid.AppendItem(root, "")
+ for col, colname in enumerate(colnames):
+ if col == 0:
+ self.VariablesGrid.SetItemText(item, str(idx), 0)
+ else:
+ self.VariablesGrid.SetItemText(item, entry.get(colname, ""), col)
+ if entry["PDOMapping"] == "":
+ self.VariablesGrid.SetItemBackgroundColour(item, wx.LIGHT_GREY)
+ self.VariablesGrid.SetItemPyData(item, entry)
+ idx = self.GenerateVariablesGridBranch(item, entry["children"], colnames, idx)
+ if wx.Platform != '__WXMSW__':
+ item, root_cookie = self.VariablesGrid.GetNextChild(root, root_cookie)
+ item, root_cookie = self.VariablesGrid.GetNextChild(root, root_cookie)
+
+ to_delete = []
+ while item.IsOk():
+ to_delete.append(item)
+ item, root_cookie = self.VariablesGrid.GetNextChild(root, root_cookie)
+ for item in to_delete:
+ self.VariablesGrid.Delete(item)
+
+ return idx
+
+ def OnVariablesGridLeftClick(self, event):
+ item, flags, col = self.VariablesGrid.HitTest(event.GetPosition())
+ if item.IsOk():
+ entry = self.VariablesGrid.GetItemPyData(item)
+ data_type = entry.get("Type", "")
+ pdo_mapping = entry.get("PDOMapping", "")
- data = wx.TextDataObject(str((location, "location", data_type, var_name, "")))
- dragSource = wx.DropSource(self.VariablesGrid)
- dragSource.SetData(data)
- dragSource.DoDragDrop()
-
+ if (col == -1 and pdo_mapping != "" and
+ self.Controler.GetSizeOfType(data_type) is not None):
+
+ entry_index = self.Controler.ExtractHexDecValue(entry.get("Index", "0"))
+ entry_subindex = self.Controler.ExtractHexDecValue(entry.get("SubIndex", "0"))
+ var_name = "%s_%4.4x_%2.2x" % (self.Type, entry_index, entry_subindex)
+ if pdo_mapping == "R":
+ dir = "%I"
+ else:
+ dir = "%Q"
+ location = "%s%s" % (dir, self.Controler.GetSizeOfType(data_type)) + \
+ ".".join(map(lambda x:str(x), self.Controler.GetCurrentLocation() + self.Slave + (entry_index, entry_subindex)))
+
+ data = wx.TextDataObject(str((location, "location", data_type, var_name, "")))
+ dragSource = wx.DropSource(self.VariablesGrid)
+ dragSource.SetData(data)
+ dragSource.DoDragDrop()
+
event.Skip()
[ID_SLAVEPANEL, ID_SLAVEPANELTYPELABEL,