]> rtime.felk.cvut.cz Git - CanFestival-3.git/blobdiff - objdictgen/subindextable.py
Problem with Real types unsupported fixed
[CanFestival-3.git] / objdictgen / subindextable.py
index d70bc4ff827960a9828a143f37516cf3f3dc4f72..9da33490273d782c2a6fe96a8efd7558f374f88f 100644 (file)
@@ -25,6 +25,7 @@ import wx
 import wx.grid
 
 from types import *
+from commondialogs import *
 
 from node import OD_Subindex, OD_MultipleSubindexes, OD_IdenticalSubindexes, OD_IdenticalIndexes
 
@@ -175,11 +176,9 @@ class SubindexTable(wx.grid.PyGridTableBase):
                         renderer = wx.grid.GridCellNumberRenderer()
                         if colname == "value" and "min" in editors and "max" in editors:
                             editor.SetParameters("%s,%s"%(editors["min"],editors["max"]))
-                    elif editortype == "real":
-                        editor = wx.grid.GridCellFloatEditor()
-                        renderer = wx.grid.GridCellFloatRenderer()
-                        if colname == "value" and "min" in editors and "max" in editors:
-                            editor.SetParameters("%s,%s"%(editors["min"],editors["max"]))
+                    elif editortype == "float":
+                        editor = wx.grid.GridCellTextEditor()
+                        renderer = wx.grid.GridCellStringRenderer()
                     elif editortype == "bool":
                         editor = wx.grid.GridCellChoiceEditor()
                         editor.SetParameters(BoolList)
@@ -208,6 +207,9 @@ class SubindexTable(wx.grid.PyGridTableBase):
                     elif editortype == "domain":
                         editor = wx.grid.GridCellTextEditor()
                         renderer = wx.grid.GridCellStringRenderer()
+                    elif editortype == "dcf":
+                        editor = wx.grid.GridCellTextEditor()
+                        renderer = wx.grid.GridCellStringRenderer()
                 else:
                     grid.SetReadOnly(row, col, True)
                     
@@ -246,7 +248,8 @@ class SubindexTable(wx.grid.PyGridTableBase):
 ] = [wx.NewId() for _init_coll_IndexListMenu_Items in range(3)]
 
 [ID_EDITINGPANELMENU1ITEMS0, ID_EDITINGPANELMENU1ITEMS1, 
-] = [wx.NewId() for _init_coll_SubindexGridMenu_Items in range(2)]
+ ID_EDITINGPANELMENU1ITEMS3, ID_EDITINGPANELMENU1ITEMS4, 
+] = [wx.NewId() for _init_coll_SubindexGridMenu_Items in range(4)]
 
 class EditingPanel(wx.SplitterWindow):
     def _init_coll_AddToListSizer_Items(self, parent):
@@ -274,13 +277,24 @@ class EditingPanel(wx.SplitterWindow):
 
     def _init_coll_SubindexGridMenu_Items(self, parent):
         parent.Append(help='', id=ID_EDITINGPANELMENU1ITEMS0,
-              kind=wx.ITEM_NORMAL, text='Add')
+              kind=wx.ITEM_NORMAL, text='Add subindexes')
         parent.Append(help='', id=ID_EDITINGPANELMENU1ITEMS1,
-              kind=wx.ITEM_NORMAL, text='Delete')
+              kind=wx.ITEM_NORMAL, text='Delete subindexes')
+        parent.AppendSeparator()
+        parent.Append(help='', id=ID_EDITINGPANELMENU1ITEMS3,
+              kind=wx.ITEM_NORMAL, text='Default value')
+        if not self.Editable:
+            parent.Append(help='', id=ID_EDITINGPANELMENU1ITEMS4,
+                  kind=wx.ITEM_NORMAL, text='Add to DCF')
         self.Bind(wx.EVT_MENU, self.OnAddSubindexMenu,
               id=ID_EDITINGPANELMENU1ITEMS0)
         self.Bind(wx.EVT_MENU, self.OnDeleteSubindexMenu,
               id=ID_EDITINGPANELMENU1ITEMS1)
+        self.Bind(wx.EVT_MENU, self.OnDefaultValueSubindexMenu,
+              id=ID_EDITINGPANELMENU1ITEMS3)
+        if not self.Editable:
+            self.Bind(wx.EVT_MENU, self.OnAddToDCFSubindexMenu,
+                  id=ID_EDITINGPANELMENU1ITEMS4)
 
     def _init_coll_IndexListMenu_Items(self, parent):
         parent.Append(help='', id=ID_EDITINGPANELINDEXLISTMENUITEMS0,
@@ -362,7 +376,10 @@ class EditingPanel(wx.SplitterWindow):
               self.OnSubindexGridRightClick)
         self.SubindexGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL,
               self.OnSubindexGridSelectCell)
-        self.SubindexGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnSubindexGridCellLeftClick)
+        self.SubindexGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, 
+              self.OnSubindexGridCellLeftClick)
+        self.SubindexGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, 
+              self.OnSubindexGridEditorShown)
 
         self.CallbackCheck = wx.CheckBox(id=ID_EDITINGPANELCALLBACKCHECK,
               label='Have Callbacks', name='CallbackCheck',
@@ -390,18 +407,18 @@ class EditingPanel(wx.SplitterWindow):
 
         self._init_sizers()
 
-    def __init__(self, parent, manager, editable = True):
-        self._init_ctrls(parent.GetNoteBook())
-        self.ParentWindow = parent
+    def __init__(self, parent, window, manager, editable = True):
+        self.Editable = editable
+        self._init_ctrls(parent)
+        self.ParentWindow = window
         self.Manager = manager
         self.ListIndex = []
         self.ChoiceIndex = []
         self.FirstCall = False
-        self.Editable = editable
         self.Index = None
         
         for values in DictionaryOrganisation:
-            text = "   0x%04X-0x%04X      %s"%(values["minIndex"],values["maxIndex"],values["name"])
+            text = "   0x%04X-0x%04X      %s"%(values["minIndex"], values["maxIndex"], values["name"])
             self.PartList.Append(text)
         self.Table = SubindexTable(self, [], [], ["subindex", "name", "type", "value", "access", "save", "comment"])
         self.SubindexGrid.SetTable(self.Table)
@@ -430,7 +447,25 @@ class EditingPanel(wx.SplitterWindow):
         return None
 
     def OnSubindexGridCellLeftClick(self, event):
-        wx.CallAfter(self.BeginDrag)
+        if not self.ParentWindow.ModeSolo:
+            col = event.GetCol()
+            if not self.Editable and col == 0:
+                selected = self.IndexList.GetSelection()
+                if selected != wx.NOT_FOUND:
+                    index = self.ListIndex[selected]
+                    subindex = event.GetRow()
+                    entry_infos = self.Manager.GetEntryInfos(index)
+                    if not entry_infos["struct"] & OD_MultipleSubindexes or subindex != 0:
+                        subentry_infos = self.Manager.GetSubentryInfos(index, subindex)
+                        typeinfos = self.Manager.GetEntryInfos(subentry_infos["type"])
+                        if subentry_infos["pdo"] and typeinfos:
+                            bus_id = '.'.join(map(str, self.ParentWindow.GetBusId()))
+                            node_id = self.ParentWindow.GetCurrentNodeId()
+                            size = typeinfos["size"]
+                            data = wx.TextDataObject(str(("%s%s.%d.%d.%d"%(SizeConversion[size], bus_id, node_id, index, subindex), "location")))
+                            dragSource = wx.DropSource(self.SubindexGrid)
+                            dragSource.SetData(data)
+                            dragSource.DoDragDrop()
         event.Skip()
 
     def OnAddButtonClick(self, event):
@@ -470,32 +505,9 @@ class EditingPanel(wx.SplitterWindow):
         event.Skip()
 
     def OnSubindexGridSelectCell(self, event):
-        wx.CallAfter(self.BeginDrag)
         wx.CallAfter(self.ParentWindow.RefreshStatusBar)
         event.Skip()
 
-    def BeginDrag(self):
-        if not self.ParentWindow.ModeSolo:
-            row = self.SubindexGrid.GetGridCursorRow()
-            col = self.SubindexGrid.GetGridCursorCol()
-            if not self.Editable and col == 0:
-                selected = self.IndexList.GetSelection()
-                if selected != wx.NOT_FOUND:
-                    index = self.ListIndex[selected]
-                    subindex = self.SubindexGrid.GetGridCursorRow()
-                    entry_infos = self.Manager.GetEntryInfos(index)
-                    if not entry_infos["struct"] & OD_MultipleSubindexes or row != 0:
-                        subentry_infos = self.Manager.GetSubentryInfos(index, subindex)
-                        typeinfos = self.Manager.GetEntryInfos(subentry_infos["type"])
-                        if subentry_infos["pdo"] and typeinfos:
-                            bus_id = '.'.join(map(str,self.Parent.GetBusId()))
-                            node_id = self.Parent.GetCurrentNodeId()
-                            size = typeinfos["size"]
-                            data = wx.TextDataObject(str(("%s%s.%d.%d.%d"%(SizeConversion[size], bus_id, node_id, index, subindex), "location")))
-                            dragSource = wx.DropSource(self.SubindexGrid)
-                            dragSource.SetData(data)
-                            dragSource.DoDragDrop()
-
 #-------------------------------------------------------------------------------
 #                             Refresh Functions
 #-------------------------------------------------------------------------------
@@ -541,7 +553,7 @@ class EditingPanel(wx.SplitterWindow):
                         else:
                             self.IndexChoice.Append(name)
                         self.ChoiceIndex.append(index)
-                if choiceindex != wx.NOT_FOUND and choice == self.IndexChoice.GetString(choiceindex):
+                if choiceindex != wx.NOT_FOUND and choiceindex < self.IndexChoice.GetCount() and choice == self.IndexChoice.GetString(choiceindex):
                     self.IndexChoice.SetStringSelection(choice)
         if self.Editable:
             self.IndexChoice.Enable(self.IndexChoice.GetCount() != 0)
@@ -576,6 +588,28 @@ class EditingPanel(wx.SplitterWindow):
 #                        Editing Table value function
 #-------------------------------------------------------------------------------
 
+    def OnSubindexGridEditorShown(self, event):
+        row, col = event.GetRow(), event.GetCol() 
+        if self.Table.GetEditor(row, col) == "dcf":
+            wx.CallAfter(self.ShowDCFEntryDialog, row, col)
+            event.Veto()
+        else:
+            event.Skip()
+
+    def ShowDCFEntryDialog(self, row, col):
+        if self.Editable:
+            selected = self.IndexList.GetSelection()
+            if selected != wx.NOT_FOUND:
+                index = self.ListIndex[selected]
+                if self.Manager.IsCurrentEntry(index):
+                    dialog = DCFEntryValuesDialog(self)
+                    dialog.SetValues(self.Table.GetValue(row, col).decode("hex_codec"))
+                    if dialog.ShowModal() == wx.ID_OK:
+                        value = dialog.GetValues()
+                        self.Manager.SetCurrentEntry(index, row, value, "value", "dcf")
+                        self.ParentWindow.RefreshBufferState()
+                        wx.CallAfter(self.RefreshTable)
+
     def OnSubindexGridCellChange(self, event):
         if self.Editable:
             index = self.Table.GetCurrentIndex()
@@ -629,16 +663,76 @@ class EditingPanel(wx.SplitterWindow):
         event.Skip()
 
     def OnSubindexGridRightClick(self, event):
+        self.SubindexGrid.SetGridCursor(event.GetRow(), event.GetCol())
         if self.Editable:
             selected = self.IndexList.GetSelection()
             if selected != wx.NOT_FOUND:
                 index = self.ListIndex[selected]
                 if self.Manager.IsCurrentEntry(index):
+                    showpopup = False
                     infos = self.Manager.GetEntryInfos(index)
-                    if index >= 0x2000 and infos["struct"] & OD_MultipleSubindexes or infos["struct"] & OD_IdenticalSubindexes:
+                    if 0x2000 <= index <= 0x5FFF and infos["struct"] & OD_MultipleSubindexes or infos["struct"] & OD_IdenticalSubindexes:
+                        showpopup = True
+                        self.SubindexGridMenu.FindItemByPosition(0).Enable(True)
+                        self.SubindexGridMenu.FindItemByPosition(1).Enable(True)
+                    else:
+                        self.SubindexGridMenu.FindItemByPosition(0).Enable(False)
+                        self.SubindexGridMenu.FindItemByPosition(1).Enable(False)
+                    if self.Table.GetColLabelValue(event.GetCol()) == "value":
+                        showpopup = True
+                        self.SubindexGridMenu.FindItemByPosition(3).Enable(True)
+                    else:
+                        self.SubindexGridMenu.FindItemByPosition(3).Enable(False)
+                    if showpopup:
+                        self.PopupMenu(self.SubindexGridMenu)
+        elif self.Table.GetColLabelValue(event.GetCol()) == "value":
+            selected = self.IndexList.GetSelection()
+            if selected != wx.NOT_FOUND:
+                index = self.ListIndex[selected]
+                if self.Manager.IsCurrentEntry(index):
+                    infos = self.Manager.GetEntryInfos(index)
+                    if not infos["struct"] & OD_MultipleSubindexes or event.GetRow() > 0:
+                        self.SubindexGridMenu.FindItemByPosition(0).Enable(False)
+                        self.SubindexGridMenu.FindItemByPosition(1).Enable(False)
+                        self.SubindexGridMenu.FindItemByPosition(3).Enable(False)
+                        self.SubindexGridMenu.FindItemByPosition(4).Enable(True)
                         self.PopupMenu(self.SubindexGridMenu)
         event.Skip()
 
+    def OnAddToDCFSubindexMenu(self, event):
+        if not self.Editable:
+            selected = self.IndexList.GetSelection()
+            if selected != wx.NOT_FOUND:
+                index = self.ListIndex[selected]
+                subindex = self.SubindexGrid.GetGridCursorRow()
+                entry_infos = self.Manager.GetEntryInfos(index)
+                if not entry_infos["struct"] & OD_MultipleSubindexes or subindex != 0:
+                    subentry_infos = self.Manager.GetSubentryInfos(index, subindex)
+                    typeinfos = self.Manager.GetEntryInfos(subentry_infos["type"])
+                    if typeinfos:
+                        node_id = self.ParentWindow.GetCurrentNodeId()
+                        value = self.Table.GetValueByName(subindex, "value")
+                        if value == "True":
+                            value = 1
+                        elif value == "False":
+                            value = 0
+                        elif value.isdigit():
+                            value = int(value)
+                        elif value.startswith("0x"):
+                            value = int(value, 16)
+                        else:
+                            value = int(value.encode("hex_codec"), 16)
+                        self.Manager.AddToMasterDCF(node_id, index, subindex, max(1, typeinfos["size"] / 8), value)    
+                        self.ParentWindow.OpenMasterDCFDialog(node_id)
+
+    def OpenDCFDialog(self, node_id):
+        self.PartList.SetSelection(7)
+        self.RefreshIndexList()
+        self.IndexList.SetSelection(self.ListIndex.index(0x1F22))
+        self.RefreshTable()
+        self.SubindexGrid.SetGridCursor(node_id, 3)
+        self.ShowDCFEntryDialog(node_id, 3)
+
     def OnRenameIndexMenu(self, event):
         if self.Editable:
             selected = self.IndexList.GetSelection()
@@ -728,3 +822,14 @@ class EditingPanel(wx.SplitterWindow):
                     dialog.Destroy()
         event.Skip()
 
+    def OnDefaultValueSubindexMenu(self, event):
+        if self.Editable:
+            selected = self.IndexList.GetSelection()
+            if selected != wx.NOT_FOUND:
+                index = self.ListIndex[selected]
+                if self.Manager.IsCurrentEntry(index):
+                    row = self.SubindexGrid.GetGridCursorRow()
+                    self.Manager.SetCurrentEntryToDefault(index, row)
+                    self.ParentWindow.RefreshBufferState()
+                    self.RefreshIndexList()
+        event.Skip()