Dialogs.py
changeset 28 fc23e1f415d8
parent 27 dae55dd9ee14
child 42 4a8400732001
--- a/Dialogs.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/Dialogs.py	Tue Jul 10 09:52:53 2007 +0200
@@ -126,14 +126,20 @@
         EVT_PAINT(self, self.OnPaint)
         EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK)
     
-    def FindTreeItem(self, root, name):
+    def FindTreeItem(self, root, name, inputs = None):
         if root.IsOk():
-            if self.TypeTree.GetItemText(root) == name:
+            pydata = self.TypeTree.GetPyData(root)
+            if inputs and "inputs" in pydata:
+                print inputs, pydata["inputs"]
+                same_inputs = pydata["inputs"] == inputs
+            else:
+                same_inputs = True
+            if self.TypeTree.GetItemText(root) == name and same_inputs:
                 return root
             else:
                 item, root_cookie = self.TypeTree.GetFirstChild(root)
                 while item.IsOk():
-                    result = self.FindTreeItem(item, name)
+                    result = self.FindTreeItem(item, name, inputs)
                     if result:
                         return result
                     item, root_cookie = self.TypeTree.GetNextChild(root, root_cookie)
@@ -155,13 +161,13 @@
 
     def SetBlockList(self, blocktypes):
         root = self.TypeTree.AddRoot("")
-        self.TypeTree.SetPyData(root, CATEGORY)
+        self.TypeTree.SetPyData(root, {"type" : CATEGORY})
         for category in blocktypes:
             category_item = self.TypeTree.AppendItem(root, category["name"])
-            self.TypeTree.SetPyData(category_item, CATEGORY)
+            self.TypeTree.SetPyData(category_item, {"type" : CATEGORY})
             for blocktype in category["list"]:
                 blocktype_item = self.TypeTree.AppendItem(category_item, blocktype["name"])
-                self.TypeTree.SetPyData(blocktype_item, BLOCK)
+                self.TypeTree.SetPyData(blocktype_item, {"type" : BLOCK, "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
 
     def SetMinBlockSize(self, size):
         self.MinBlockSize = size
@@ -169,7 +175,10 @@
     def SetValues(self, values):
         for name, value in values.items():
             if name == "type":
-                item = self.FindTreeItem(self.TypeTree.GetRootItem(), value)
+                inputs = None
+                if "inputs" in values:
+                    inputs = values["inputs"]
+                item = self.FindTreeItem(self.TypeTree.GetRootItem(), value, inputs)
                 if item:
                     self.TypeTree.SelectItem(item)
             elif name == "name":
@@ -180,7 +189,9 @@
 
     def GetValues(self):
         values = {}
-        values["type"] = self.TypeTree.GetItemText(self.TypeTree.GetSelection())
+        item = self.TypeTree.GetSelection()
+        values["type"] = self.TypeTree.GetItemText(item)
+        values["inputs"] = self.TypeTree.GetPyData(item)["inputs"]
         if self.Name.GetValue() != "":
             values["name"] = self.Name.GetValue()
         values["width"], values["height"] = self.Block.GetSize()
@@ -190,8 +201,9 @@
     def OnTypeTreeItemSelected(self, event):
         self.Name.SetValue("")
         selected = event.GetItem()
-        if self.TypeTree.GetPyData(selected) != CATEGORY:
-            blocktype = GetBlockType(self.TypeTree.GetItemText(selected))
+        pydata = self.TypeTree.GetPyData(selected)
+        if pydata["type"] != CATEGORY:
+            blocktype = GetBlockType(self.TypeTree.GetItemText(selected), pydata["inputs"])
             if blocktype:
                 self.Inputs.SetValue(len(blocktype["inputs"]))
                 self.Inputs.Enable(blocktype["extensible"])
@@ -231,12 +243,13 @@
         dc = wxClientDC(self.Preview)
         dc.Clear()
         item = self.TypeTree.GetSelection()
-        if self.TypeTree.GetPyData(item) == CATEGORY:
+        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.Name.GetValue(), extension = self.Inputs.GetValue())
+                self.Block = FBD_Block(self.Preview, blocktype, self.Name.GetValue(), extension = self.Inputs.GetValue(), inputs = pydata["inputs"])
                 width, height = self.MinBlockSize
                 min_width, min_height = self.Block.GetMinSize()
                 width, height = max(min_width, width), max(min_height, height)
@@ -260,9 +273,10 @@
 
 [wxID_VARIABLEPROPERTIESDIALOG, wxID_VARIABLEPROPERTIESDIALOGMAINPANEL, 
  wxID_VARIABLEPROPERTIESDIALOGNAME, wxID_VARIABLEPROPERTIESDIALOGCLASS, 
- wxID_VARIABLEPROPERTIESDIALOGPREVIEW, wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT1,
- wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT2, wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT3, 
-] = [wx.NewId() for _init_ctrls in range(8)]
+ wxID_VARIABLEPROPERTIESDIALOGPREVIEW, wxID_VARIABLEPROPERTIESDIALOGEXPRESSION,
+ wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT1, wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT2,
+ wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT3, wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT4,
+] = [wx.NewId() for _init_ctrls in range(10)]
 
 class VariablePropertiesDialog(wx.Dialog):
     def _init_coll_flexGridSizer1_Items(self, parent):
@@ -282,9 +296,9 @@
         # generated method, don't edit
         wx.Dialog.__init__(self, id=wxID_VARIABLEPROPERTIESDIALOG,
               name='VariablePropertiesDialog', parent=prnt, pos=wx.Point(376, 223),
-              size=wx.Size(400, 320), style=wx.DEFAULT_DIALOG_STYLE,
+              size=wx.Size(400, 380), style=wx.DEFAULT_DIALOG_STYLE,
               title='Variable Properties')
-        self.SetClientSize(wx.Size(400, 320))
+        self.SetClientSize(wx.Size(400, 380))
 
         self.MainPanel = wx.Panel(id=wxID_VARIABLEPROPERTIESDIALOGMAINPANEL,
               name='MainPanel', parent=self, pos=wx.Point(0, 0),
@@ -296,25 +310,34 @@
               pos=wx.Point(24, 24), size=wx.Size(70, 17), style=0)
 
         self.staticText2 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT2,
-              label='Name:', name='staticText2', parent=self.MainPanel,
+              label='Expression:', name='staticText2', parent=self.MainPanel,
+              pos=wx.Point(24, 90), size=wx.Size(100, 17), style=0)
+
+        self.staticText3 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT3,
+              label='Name:', name='staticText3', parent=self.MainPanel,
               pos=wx.Point(204, 24), size=wx.Size(70, 17), style=0)
 
-        self.staticText3 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT3,
-              label='Preview:', name='staticText3', parent=self.MainPanel,
-              pos=wx.Point(24, 78), size=wx.Size(100, 17), style=0)
+        self.staticText4 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT4,
+              label='Preview:', name='staticText4', parent=self.MainPanel,
+              pos=wx.Point(24, 144), size=wx.Size(100, 17), style=0)
 
         self.Class = wx.Choice(id=wxID_VARIABLEPROPERTIESDIALOGCLASS,
               name='Class', parent=self.MainPanel, pos=wx.Point(24, 48),
               size=wx.Size(145, 24), style=0)
         EVT_CHOICE(self, wxID_VARIABLEPROPERTIESDIALOGCLASS, self.OnClassChanged)
         
-        self.Name = wx.Choice(id=wxID_VARIABLEPROPERTIESDIALOGNAME,
+        self.Name = wx.ListBox(id=wxID_VARIABLEPROPERTIESDIALOGNAME,
               name='Name', parent=self.MainPanel, pos=wx.Point(204, 48),
+              size=wx.Size(145, 90), style=wx.LB_SINGLE)
+        EVT_LISTBOX(self, wxID_VARIABLEPROPERTIESDIALOGNAME, self.OnNameChanged)
+
+        self.Expression = wx.TextCtrl(id=wxID_VARIABLEPROPERTIESDIALOGEXPRESSION,
+              name='Expression', parent=self.MainPanel, pos=wx.Point(24, 114),
               size=wx.Size(145, 24), style=0)
-        EVT_CHOICE(self, wxID_VARIABLEPROPERTIESDIALOGNAME, self.OnNameChanged)
+        EVT_TEXT(self, wxID_VARIABLEPROPERTIESDIALOGEXPRESSION, self.OnExpressionChanged)
 
         self.Preview = wx.Panel(id=wxID_VARIABLEPROPERTIESDIALOGPREVIEW,
-              name='Preview', parent=self.MainPanel, pos=wx.Point(24, 104),
+              name='Preview', parent=self.MainPanel, pos=wx.Point(24, 170),
               size=wx.Size(350, 150), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
         self.Preview.SetBackgroundColour(wxColour(255,255,255))
 
@@ -338,8 +361,9 @@
     def RefreshNameList(self):
         selected = self.Name.GetStringSelection()
         self.Name.Clear()
+        self.Name.Append("")
         for name, var_type, value_type in self.VarList:
-            if var_type in ["Local","Temp"]:
+            if var_type in ["Local","Temp","Global","External"]:
                 self.Name.Append(name)
             elif var_type == "Input" and self.Class.GetStringSelection() == "Input":
                 self.Name.Append(name)
@@ -349,6 +373,8 @@
                 self.Name.Append(name)
         if self.Name.FindString(selected) != wxNOT_FOUND:
             self.Name.SetStringSelection(selected)
+        else:
+            self.Name.SetStringSelection("")
         self.Name.Enable(self.Name.GetCount() > 0)
             
     def SetMinVariableSize(self, size):
@@ -367,8 +393,13 @@
                     self.Class.SetStringSelection("Output")
                 if value == INOUT:
                     self.Class.SetStringSelection("InOut")
-            elif name == "name":
-                self.Name.SetStringSelection(value)
+            elif name == "name" and value != "":
+                if self.Name.FindString(value) != wxNOT_FOUND:
+                    self.Name.SetStringSelection(value)
+                    self.Expression.Enable(False)
+                else:
+                    self.Expression.SetValue(value)
+                    self.Name.Enable(False)
         self.RefreshPreview()
         
     def GetValues(self):
@@ -380,7 +411,11 @@
             values["type"] = OUTPUT
         elif classtype == "InOut":
             values["type"] = INOUT
-        values["name"] = self.Name.GetStringSelection()
+        expression = self.Expression.GetValue()
+        if self.Expression.IsEnabled() and expression != "":
+            values["name"] = expression
+        else:
+            values["name"] = self.Name.GetStringSelection()
         values["value_type"] = ""
         for var_name, var_type, value_type in self.VarList:
             if var_name == values["name"]:
@@ -390,17 +425,37 @@
 
     def OnClassChanged(self, event):
         self.RefreshNameList()
+        if self.Class.GetStringSelection() == "Input":
+            self.Expression.Enable(True)
+        else:
+            self.Expression.Enable(False)
         self.RefreshPreview()
         event.Skip()
 
     def OnNameChanged(self, event):
-        self.RefreshPreview()
-        event.Skip()
-        
+        if self.Name.GetStringSelection() != "":
+            self.Expression.Enable(False)
+        elif self.Class.GetStringSelection() == "Input":
+            self.Expression.Enable(True)
+        self.RefreshPreview()
+        event.Skip()
+    
+    def OnExpressionChanged(self, event):
+        if self.Expression.GetValue() != "":
+            self.Name.Enable(False)
+        else:
+            self.Name.Enable(True)
+        self.RefreshPreview()
+        event.Skip()
+    
     def RefreshPreview(self):
         dc = wxClientDC(self.Preview)
         dc.Clear()
-        name = self.Name.GetStringSelection()
+        expression = self.Expression.GetValue()
+        if self.Expression.IsEnabled() and expression != "":
+            name = expression
+        else:
+            name = self.Name.GetStringSelection()
         type = ""
         for var_name, var_type, value_type in self.VarList:
             if var_name == name:
@@ -510,7 +565,18 @@
             
     def SetMinConnectionSize(self, size):
         self.MinConnectionSize = size
-        
+    
+    def SetValues(self, values):
+        for name, value in values.items():
+            if name == "type":
+                if value == CONNECTOR:
+                    self.radioButton1.SetValue(True)
+                elif value == CONTINUATION:
+                    self.radioButton2.SetValue(True)
+            elif name == "name":
+                self.Name.SetValue(value)
+        self.RefreshPreview()
+    
     def GetValues(self):
         values = {}
         if self.radioButton1.GetValue():
@@ -650,9 +716,9 @@
 
         EVT_PAINT(self, self.OnPaint)
 
-    def SetElementSize(self, width, height):
+    def SetElementSize(self, size):
         min_width, min_height = self.Element.GetMinSize()
-        width, height = max(min_width, width), max(min_height, height)
+        width, height = max(min_width, size[0]), max(min_height, size[1])
         self.Element.SetSize(width, height)
         self.Element.SetPosition((150 - width) / 2, (150 - height) / 2)
 
@@ -825,7 +891,7 @@
 
     def SetMinSize(self, size):
         self.PowerRailMinSize = size
-        self.RefreshPreview()
+        self.RefreshPreview()    
 
     def GetValues(self):
         values = {}