21 #License along with this library; if not, write to the Free Software |
21 #License along with this library; if not, write to the Free Software |
22 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
23 |
23 |
24 import wx |
24 import wx |
25 |
25 |
26 from graphics import * |
26 from graphics.GraphicCommons import SELECTION_DIVERGENCE, \ |
|
27 SELECTION_CONVERGENCE, SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE |
|
28 from graphics.SFC_Objects import SFC_Divergence |
|
29 from BlockPreviewDialog import BlockPreviewDialog |
27 |
30 |
28 #------------------------------------------------------------------------------- |
31 #------------------------------------------------------------------------------- |
29 # Create New Divergence Dialog |
32 # Create New Divergence Dialog |
30 #------------------------------------------------------------------------------- |
33 #------------------------------------------------------------------------------- |
31 |
34 |
32 class SFCDivergenceDialog(wx.Dialog): |
35 """ |
|
36 Class that implements a dialog for defining parameters for creating a new |
|
37 divergence graphic element |
|
38 """ |
|
39 |
|
40 class SFCDivergenceDialog(BlockPreviewDialog): |
33 |
41 |
34 def __init__(self, parent, controller): |
42 def __init__(self, parent, controller, tagname): |
35 wx.Dialog.__init__(self, parent, size=wx.Size(500, 300), |
43 """ |
|
44 Constructor |
|
45 @param parent: Parent wx.Window of dialog for modal |
|
46 @param controller: Reference to project controller |
|
47 @param tagname: Tagname of project POU edited |
|
48 """ |
|
49 BlockPreviewDialog.__init__(self, parent, controller, tagname, |
|
50 size=wx.Size(500, 300), |
36 title=_('Create a new divergence or convergence')) |
51 title=_('Create a new divergence or convergence')) |
37 |
52 |
38 main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
53 # Init common sizers |
39 main_sizer.AddGrowableCol(0) |
54 self._init_sizers(2, 0, 7, None, 2, 1) |
40 main_sizer.AddGrowableRow(0) |
|
41 |
55 |
42 column_sizer = wx.BoxSizer(wx.HORIZONTAL) |
56 # Create label for divergence type |
43 main_sizer.AddSizer(column_sizer, border=20, |
57 type_label = wx.StaticText(self, label=_('Type:')) |
44 flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT) |
58 self.LeftGridSizer.AddWindow(type_label, flag=wx.GROW) |
45 |
59 |
46 left_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=7, vgap=5) |
60 # Create radio buttons for selecting divergence type |
47 left_gridsizer.AddGrowableCol(0) |
61 self.TypeRadioButtons = {} |
48 column_sizer.AddSizer(left_gridsizer, 1, border=5, |
62 first = True |
49 flag=wx.GROW|wx.RIGHT) |
63 for type, label in [ |
50 |
64 (SELECTION_DIVERGENCE, _('Selection Divergence')), |
51 type_label = wx.StaticText(self, label=_('Type:')) |
65 (SELECTION_CONVERGENCE, _('Selection Convergence')), |
52 left_gridsizer.AddWindow(type_label, flag=wx.GROW) |
66 (SIMULTANEOUS_DIVERGENCE, _('Simultaneous Divergence')), |
|
67 (SIMULTANEOUS_CONVERGENCE, _('Simultaneous Convergence'))]: |
|
68 radio_button = wx.RadioButton(self, label=label, |
|
69 style=(wx.RB_GROUP if first else 0)) |
|
70 radio_button.SetValue(first) |
|
71 self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button) |
|
72 self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW) |
|
73 self.TypeRadioButtons[type] = radio_button |
|
74 first = False |
53 |
75 |
54 self.SelectionDivergence = wx.RadioButton(self, |
76 # Create label for number of divergence sequences |
55 label=_('Selection Divergence'), style=wx.RB_GROUP) |
|
56 self.SelectionDivergence.SetValue(True) |
|
57 self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, |
|
58 self.SelectionDivergence) |
|
59 left_gridsizer.AddWindow(self.SelectionDivergence, flag=wx.GROW) |
|
60 |
|
61 self.SelectionConvergence = wx.RadioButton(self, |
|
62 label=_('Selection Convergence')) |
|
63 self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, |
|
64 self.SelectionConvergence) |
|
65 left_gridsizer.AddWindow(self.SelectionConvergence, flag=wx.GROW) |
|
66 |
|
67 self.SimultaneousDivergence = wx.RadioButton(self, |
|
68 label=_('Simultaneous Divergence')) |
|
69 self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, |
|
70 self.SimultaneousDivergence) |
|
71 left_gridsizer.AddWindow(self.SimultaneousDivergence, flag=wx.GROW) |
|
72 |
|
73 self.SimultaneousConvergence = wx.RadioButton(self, |
|
74 label=_('Simultaneous Convergence')) |
|
75 self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, |
|
76 self.SimultaneousConvergence) |
|
77 left_gridsizer.AddWindow(self.SimultaneousConvergence, flag=wx.GROW) |
|
78 |
|
79 sequences_label = wx.StaticText(self, |
77 sequences_label = wx.StaticText(self, |
80 label=_('Number of sequences:')) |
78 label=_('Number of sequences:')) |
81 left_gridsizer.AddWindow(sequences_label, flag=wx.GROW) |
79 self.LeftGridSizer.AddWindow(sequences_label, flag=wx.GROW) |
82 |
80 |
|
81 # Create spin control for defining number of divergence sequences |
83 self.Sequences = wx.SpinCtrl(self, min=2, max=20) |
82 self.Sequences = wx.SpinCtrl(self, min=2, max=20) |
84 self.Bind(wx.EVT_SPINCTRL, self.OnSequencesChanged, self.Sequences) |
83 self.Bind(wx.EVT_SPINCTRL, self.OnSequencesChanged, self.Sequences) |
85 left_gridsizer.AddWindow(self.Sequences, flag=wx.GROW) |
84 self.LeftGridSizer.AddWindow(self.Sequences, flag=wx.GROW) |
86 |
85 |
87 right_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) |
86 # Add preview panel and associated label to sizers |
88 right_gridsizer.AddGrowableCol(0) |
87 self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW) |
89 right_gridsizer.AddGrowableRow(1) |
88 self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW) |
90 column_sizer.AddSizer(right_gridsizer, 1, border=5, |
|
91 flag=wx.GROW|wx.LEFT) |
|
92 |
89 |
93 preview_label = wx.StaticText(self, label=_('Preview:')) |
90 # Add buttons sizer to sizers |
94 right_gridsizer.AddWindow(preview_label, flag=wx.GROW) |
91 self.MainSizer.AddSizer(self.ButtonSizer, border=20, |
|
92 flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
95 |
93 |
96 self.Preview = wx.Panel(self, style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER) |
94 # Selection divergence radio button is default control having keyboard |
97 self.Preview.SetBackgroundColour(wx.Colour(255,255,255)) |
95 # focus |
98 self.Preview.Bind(wx.EVT_PAINT, self.OnPaint) |
96 self.TypeRadioButtons[SELECTION_DIVERGENCE].SetFocus() |
99 setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE) |
|
100 setattr(self.Preview, "IsOfType", controller.IsOfType) |
|
101 right_gridsizer.AddWindow(self.Preview, flag=wx.GROW) |
|
102 |
|
103 button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE) |
|
104 main_sizer.AddSizer(button_sizer, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
|
105 |
|
106 self.SetSizer(main_sizer) |
|
107 |
|
108 self.Divergence = None |
|
109 self.MinSize = (0, 0) |
|
110 |
|
111 self.SelectionDivergence.SetFocus() |
|
112 |
97 |
113 def SetPreviewFont(self, font): |
98 def GetMinElementSize(self): |
114 self.Preview.SetFont(font) |
99 """ |
|
100 Get minimal graphic element size |
|
101 @return: Tuple containing minimal size (width, height) or None if no |
|
102 element defined |
|
103 """ |
|
104 return self.Element.GetSize() |
|
105 |
|
106 def GetDivergenceType(self): |
|
107 """ |
|
108 Return type selected for SFC divergence |
|
109 @return: Type selected (None if not found) |
|
110 """ |
|
111 # Go through radio buttons and return type associated to the one that |
|
112 # is selected |
|
113 for type, control in self.TypeRadioButtons.iteritems(): |
|
114 if control.GetValue(): |
|
115 return type |
|
116 return None |
115 |
117 |
116 def GetValues(self): |
118 def GetValues(self): |
117 values = {} |
119 """ |
118 if self.SelectionDivergence.GetValue(): |
120 Set default SFC divergence parameters |
119 values["type"] = SELECTION_DIVERGENCE |
121 @param values: Divergence parameters values |
120 elif self.SelectionConvergence.GetValue(): |
122 """ |
121 values["type"] = SELECTION_CONVERGENCE |
123 return {"type": self.GetDivergenceType(), |
122 elif self.SimultaneousDivergence.GetValue(): |
124 "number": self.Sequences.GetValue()} |
123 values["type"] = SIMULTANEOUS_DIVERGENCE |
|
124 else: |
|
125 values["type"] = SIMULTANEOUS_CONVERGENCE |
|
126 values["number"] = self.Sequences.GetValue() |
|
127 return values |
|
128 |
|
129 def SetMinSize(self, size): |
|
130 self.MinSize = size |
|
131 |
125 |
132 def OnTypeChanged(self, event): |
126 def OnTypeChanged(self, event): |
|
127 """ |
|
128 Called when SFC divergence type changed |
|
129 @param event: wx.RadioButtonEvent |
|
130 """ |
133 self.RefreshPreview() |
131 self.RefreshPreview() |
134 event.Skip() |
132 event.Skip() |
135 |
133 |
136 def OnSequencesChanged(self, event): |
134 def OnSequencesChanged(self, event): |
|
135 """ |
|
136 Called when SFC divergence number of sequences changed |
|
137 @param event: wx.SpinEvent |
|
138 """ |
137 self.RefreshPreview() |
139 self.RefreshPreview() |
138 event.Skip() |
140 event.Skip() |
139 |
141 |
140 def RefreshPreview(self): |
142 def RefreshPreview(self): |
141 dc = wx.ClientDC(self.Preview) |
143 """ |
142 dc.SetFont(self.Preview.GetFont()) |
144 Refresh preview panel of graphic element |
143 dc.Clear() |
145 Override BlockPreviewDialog function |
144 if self.SelectionDivergence.GetValue(): |
146 """ |
145 self.Divergence = SFC_Divergence(self.Preview, SELECTION_DIVERGENCE, self.Sequences.GetValue()) |
147 # Set graphic element displayed, creating a SFC divergence |
146 elif self.SelectionConvergence.GetValue(): |
148 self.Element = SFC_Divergence(self.Preview, |
147 self.Divergence = SFC_Divergence(self.Preview, SELECTION_CONVERGENCE, self.Sequences.GetValue()) |
149 self.GetDivergenceType(), |
148 elif self.SimultaneousDivergence.GetValue(): |
150 self.Sequences.GetValue()) |
149 self.Divergence = SFC_Divergence(self.Preview, SIMULTANEOUS_DIVERGENCE, self.Sequences.GetValue()) |
151 |
150 else: |
152 # Call BlockPreviewDialog function |
151 self.Divergence = SFC_Divergence(self.Preview, SIMULTANEOUS_CONVERGENCE, self.Sequences.GetValue()) |
153 BlockPreviewDialog.RefreshPreview(self) |
152 width, height = self.Divergence.GetSize() |
154 |
153 min_width, min_height = max(width, self.MinSize[0]), max(height, self.MinSize[1]) |
|
154 self.Divergence.SetSize(min_width, min_height) |
|
155 clientsize = self.Preview.GetClientSize() |
|
156 x = (clientsize.width - min_width) / 2 |
|
157 y = (clientsize.height - min_height) / 2 |
|
158 self.Divergence.SetPosition(x, y) |
|
159 self.Divergence.Draw(dc) |
|
160 |
|
161 def OnPaint(self, event): |
|
162 self.RefreshPreview() |
|
163 event.Skip() |
|