--- 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: