dialogs/SFCDivergenceDialog.py
changeset 1251 d9ed42e44a50
parent 814 5743cbdff669
child 1259 8350222a81c3
equal deleted inserted replaced
1250:7e6de17c687a 1251:d9ed42e44a50
    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()