dialogs/FBDBlockDialog.py
changeset 676 0f10f5091245
parent 646 97bed1acd860
child 714 131ea7f237b9
--- a/dialogs/FBDBlockDialog.py	Wed May 02 00:32:15 2012 +0200
+++ b/dialogs/FBDBlockDialog.py	Thu May 03 19:02:17 2012 +0200
@@ -25,6 +25,7 @@
 import wx
 
 from graphics import *
+from controls import LibraryPanel
 
 #-------------------------------------------------------------------------------
 #                          Create New Block Dialog
@@ -63,9 +64,8 @@
         parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
 
     def _init_coll_LeftBoxSizer_Items(self, parent):
-        parent.AddWindow(self.TypeTree, 3, border=5, flag=wx.GROW|wx.BOTTOM)
-        parent.AddWindow(self.TypeDesc, 1, border=0, flag=wx.GROW)
-
+        parent.AddWindow(self.LibraryPanel, 1, border=5, flag=wx.GROW|wx.TOP)
+    
     def _init_coll_RightGridSizer_Items(self, parent):
         parent.AddSizer(self.RightUpGridSizer, 0, border=0, flag=wx.GROW)
         parent.AddWindow(self.staticText6, 0, border=0, flag=wx.GROW)
@@ -137,15 +137,7 @@
               label=_('Preview:'), name='staticText6', parent=self,
               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
 
-        self.TypeTree = wx.TreeCtrl(id=ID_FBDBLOCKDIALOGTYPETREE,
-              name='TypeTree', parent=self, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_HIDE_ROOT|wx.TR_LINES_AT_ROOT)
-        self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypeTreeItemSelected,
-              id=ID_FBDBLOCKDIALOGTYPETREE)
-
-        self.TypeDesc = wx.TextCtrl(id=ID_FBDBLOCKDIALOGTYPEDESC,
-              name='TypeDesc', parent=self, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TE_READONLY|wx.TE_MULTILINE)
+        self.LibraryPanel = LibraryPanel(self)
 
         self.BlockName = wx.TextCtrl(id=ID_FBDBLOCKDIALOGNAME, value='',
               name='BlockName', parent=self, pos=wx.Point(0, 0),
@@ -198,44 +190,22 @@
         
         self.PouNames = []
         self.PouElementNames = []
-    
-        self.TypeTree.SetFocus()
+        
+        self.LibraryPanel.SetControler(controler)
+        setattr(self.LibraryPanel, "_OnTreeItemSelected", self.OnLibraryTreeItemSelected)
+        self.LibraryPanel.SetFocus()
+    
+    def SetBlockList(self, blocklist):
+        self.LibraryPanel.SetBlockList(blocklist)
     
     def SetPreviewFont(self, font):
         self.Preview.SetFont(font)
     
-    def FindTreeItem(self, root, name, inputs = None):
-        if root.IsOk():
-            pydata = self.TypeTree.GetPyData(root)
-            if pydata is not None:
-                type_inputs = pydata.get("inputs", None)
-                type_extension = pydata.get("extension", None)
-                if inputs is not None and type_inputs is not None:
-                    if type_extension is not None:
-                        same_inputs = type_inputs == inputs[:type_extension]
-                    else:
-                        same_inputs = type_inputs == inputs
-                else:
-                    same_inputs = True
-            if pydata is not None and self.TypeTree.GetItemText(root) == name and same_inputs:
-                return root
-            else:
-                if wx.VERSION < (2, 6, 0):
-                    item, root_cookie = self.TypeTree.GetFirstChild(root, 0)
-                else:
-                    item, root_cookie = self.TypeTree.GetFirstChild(root)
-                while item.IsOk():
-                    result = self.FindTreeItem(item, name, inputs)
-                    if result:
-                        return result
-                    item, root_cookie = self.TypeTree.GetNextChild(root, root_cookie)
-        return None
-    
     def OnOK(self, event):
-        selected = self.TypeTree.GetSelection()
+        selected = self.LibraryPanel.GetSelectedBlock()
         block_name = self.BlockName.GetValue()
         name_enabled = self.BlockName.IsEnabled()
-        if not selected.IsOk() or self.TypeTree.GetItemParent(selected) == self.TypeTree.GetRootItem() or selected == self.TypeTree.GetRootItem():
+        if selected is None:
             message = wx.MessageDialog(self, _("Form isn't complete. Valid block type must be selected!"), _("Error"), wx.OK|wx.ICON_ERROR)
             message.ShowModal()
             message.Destroy()
@@ -262,21 +232,6 @@
         else:
             self.EndModal(wx.ID_OK)
 
-    def SetBlockList(self, blocktypes):
-        root = self.TypeTree.AddRoot("")
-        for category in blocktypes:
-            category_name = category["name"]
-            category_item = self.TypeTree.AppendItem(root, _(category_name))
-            self.TypeTree.SetPyData(category_item, {"type" : CATEGORY})
-            for blocktype in category["list"]:
-                blocktype_item = self.TypeTree.AppendItem(category_item, blocktype["name"])
-                block_data = {"type" : BLOCK, 
-                              "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]]),
-                              "extension" : None}
-                if blocktype["extensible"]:
-                    block_data["extension"] = len(blocktype["inputs"])
-                self.TypeTree.SetPyData(blocktype_item, block_data)
-        
     def SetMinBlockSize(self, size):
         self.MinBlockSize = size
 
@@ -289,11 +244,7 @@
     def SetValues(self, values):
         blocktype = values.get("type", None)
         if blocktype is not None:
-            inputs = values.get("inputs", None)
-            item = self.FindTreeItem(self.TypeTree.GetRootItem(), blocktype, inputs)
-            if item:
-                self.TypeTree.SelectItem(item)
-                self.TypeTree.EnsureVisible(item)
+            self.LibraryPanel.SelectTreeItem(blocktype, values.get("inputs", None))
         for name, value in values.items():
             if name == "name":
                 self.BlockName.SetValue(value)
@@ -306,10 +257,7 @@
         self.RefreshPreview()
 
     def GetValues(self):
-        values = {}
-        item = self.TypeTree.GetSelection()
-        values["type"] = self.TypeTree.GetItemText(item)
-        values["inputs"] = self.TypeTree.GetPyData(item)["inputs"]
+        values = self.LibraryPanel.GetSelectedBlock()
         if self.BlockName.GetValue() != "":
             values["name"] = self.BlockName.GetValue()
         values["width"], values["height"] = self.Block.GetSize()
@@ -318,32 +266,23 @@
         values["executionControl"] = self.ExecutionControl.GetValue()
         return values
 
-    def OnTypeTreeItemSelected(self, event):
-        selected = event.GetItem()
-        pydata = self.TypeTree.GetPyData(selected)
-        if pydata["type"] != CATEGORY:
-            blocktype = self.Controler.GetBlockType(self.TypeTree.GetItemText(selected), pydata["inputs"])
-            if blocktype:
-                self.Inputs.SetValue(len(blocktype["inputs"]))
-                self.Inputs.Enable(blocktype["extensible"])
-                self.BlockName.Enable(blocktype["type"] != "function")
-                comment = blocktype["comment"]
-                self.TypeDesc.SetValue(_(comment) + blocktype.get("usage", ""))
-                wx.CallAfter(self.RefreshPreview)
-            else:
-                self.BlockName.Enable(False)
-                self.Inputs.Enable(False)
-                self.Inputs.SetValue(2)
-                self.TypeDesc.SetValue("")
-                wx.CallAfter(self.ErasePreview)
+    def OnLibraryTreeItemSelected(self, event):
+        values = self.LibraryPanel.GetSelectedBlock()
+        if values is not None:
+            blocktype = self.Controler.GetBlockType(values["type"], values["inputs"])
+        else:
+            blocktype = None
+        if blocktype is not None:
+            self.Inputs.SetValue(len(blocktype["inputs"]))
+            self.Inputs.Enable(blocktype["extensible"])
+            self.BlockName.Enable(blocktype["type"] != "function")
+            wx.CallAfter(self.RefreshPreview)
         else:
             self.BlockName.Enable(False)
             self.Inputs.Enable(False)
             self.Inputs.SetValue(2)
-            self.TypeDesc.SetValue("")
             wx.CallAfter(self.ErasePreview)
-        event.Skip()
-
+    
     def OnNameChanged(self, event):
         if self.BlockName.IsEnabled():
             self.RefreshPreview()
@@ -371,31 +310,25 @@
         dc = wx.ClientDC(self.Preview)
         dc.SetFont(self.Preview.GetFont())
         dc.Clear()
-        item = self.TypeTree.GetSelection()
-        if item.IsOk():
-            pydata = self.TypeTree.GetPyData(item)
-            if pydata["type"] == CATEGORY:
-                self.Block = None
-            else:
-                blocktype = self.TypeTree.GetItemText(item)
-                if blocktype:
-                    self.Block = FBD_Block(self.Preview, blocktype, 
-                            self.BlockName.GetValue(), 
-                            extension = self.Inputs.GetValue(), 
-                            inputs = pydata["inputs"], 
-                            executionControl = self.ExecutionControl.GetValue(), 
-                            executionOrder = self.ExecutionOrder.GetValue())
-                    width, height = self.MinBlockSize
-                    min_width, min_height = self.Block.GetMinSize()
-                    width, height = max(min_width, width), max(min_height, height)
-                    self.Block.SetSize(width, height)
-                    clientsize = self.Preview.GetClientSize()
-                    x = (clientsize.width - width) / 2
-                    y = (clientsize.height - height) / 2
-                    self.Block.SetPosition(x, y)
-                    self.Block.Draw(dc)
-                else:
-                    self.Block = None
+        values = self.LibraryPanel.GetSelectedBlock()
+        if values is not None:
+            self.Block = FBD_Block(self.Preview, values["type"], 
+                    self.BlockName.GetValue(), 
+                    extension = self.Inputs.GetValue(), 
+                    inputs = values["inputs"], 
+                    executionControl = self.ExecutionControl.GetValue(), 
+                    executionOrder = self.ExecutionOrder.GetValue())
+            width, height = self.MinBlockSize
+            min_width, min_height = self.Block.GetMinSize()
+            width, height = max(min_width, width), max(min_height, height)
+            self.Block.SetSize(width, height)
+            clientsize = self.Preview.GetClientSize()
+            x = (clientsize.width - width) / 2
+            y = (clientsize.height - height) / 2
+            self.Block.SetPosition(x, y)
+            self.Block.Draw(dc)
+        else:
+            self.Block = None        
 
     def OnPaint(self, event):
         if self.Block is not None: