dialogs/LDPowerRailDialog.py
changeset 1249 b956c924cbbd
parent 814 5743cbdff669
child 1250 7e6de17c687a
equal deleted inserted replaced
1248:2f08985625c0 1249:b956c924cbbd
    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 LEFTRAIL, RIGHTRAIL, LD_LINE_SIZE
       
    27 from graphics.LD_Objects import LD_PowerRail
       
    28 from BlockPreviewDialog import BlockPreviewDialog
    27 
    29 
    28 #-------------------------------------------------------------------------------
    30 #-------------------------------------------------------------------------------
    29 #                      Edit Ladder Power Rail Properties Dialog
    31 #                    Set Ladder Power Rail Parameters Dialog
    30 #-------------------------------------------------------------------------------
    32 #-------------------------------------------------------------------------------
    31 
    33 
    32 class LDPowerRailDialog(wx.Dialog):
    34 """
       
    35 Class that implements a dialog for defining parameters of a power rail graphic
       
    36 element
       
    37 """
       
    38 
       
    39 class LDPowerRailDialog(BlockPreviewDialog):
    33     
    40     
    34     def __init__(self, parent, controller, type = LEFTRAIL, number = 1):
    41     def __init__(self, parent, controller, tagname):
    35         wx.Dialog.__init__(self, parent, size=wx.Size(350, 260),
    42         """
    36               title=_('Power Rail Properties'))
    43         Constructor
       
    44         @param parent: Parent wx.Window of dialog for modal
       
    45         @param controller: Reference to project controller
       
    46         @param tagname: Tagname of project POU edited
       
    47         """
       
    48         BlockPreviewDialog.__init__(self, parent, controller, tagname,
       
    49               size=wx.Size(350, 260), title=_('Power Rail Properties'))
    37         
    50         
       
    51         # Create dialog main sizer
    38         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
    52         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
    39         main_sizer.AddGrowableCol(0)
    53         main_sizer.AddGrowableCol(0)
    40         main_sizer.AddGrowableRow(0)
    54         main_sizer.AddGrowableRow(0)
    41         
    55         
       
    56         # Create a sizer for dividing power rail parameters in two columns
    42         column_sizer = wx.BoxSizer(wx.HORIZONTAL)
    57         column_sizer = wx.BoxSizer(wx.HORIZONTAL)
    43         main_sizer.AddSizer(column_sizer, border=20, 
    58         main_sizer.AddSizer(column_sizer, border=20, 
    44               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
    59               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
    45         
    60         
       
    61         # Create a sizer for left column
    46         left_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=5)
    62         left_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=5)
    47         left_gridsizer.AddGrowableCol(0)
    63         left_gridsizer.AddGrowableCol(0)
    48         column_sizer.AddSizer(left_gridsizer, 1, border=5, 
    64         column_sizer.AddSizer(left_gridsizer, 1, border=5, 
    49               flag=wx.GROW|wx.RIGHT)
    65               flag=wx.GROW|wx.RIGHT)
    50         
    66         
       
    67         # Create label for connection type
    51         type_label = wx.StaticText(self, label=_('Type:'))
    68         type_label = wx.StaticText(self, label=_('Type:'))
    52         left_gridsizer.AddWindow(type_label, flag=wx.GROW)
    69         left_gridsizer.AddWindow(type_label, flag=wx.GROW)
    53         
    70         
    54         self.LeftPowerRail = wx.RadioButton(self,
    71         # Create radio buttons for selecting power rail type
    55               label=_('Left PowerRail'), style=wx.RB_GROUP)
    72         self.TypeRadioButtons = {}
    56         self.LeftPowerRail.SetValue(True)
    73         first = True
    57         self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, self.LeftPowerRail)
    74         for type, label in [(LEFTRAIL, _('Left PowerRail')),
    58         left_gridsizer.AddWindow(self.LeftPowerRail, flag=wx.GROW)
    75                             (RIGHTRAIL, _('Right PowerRail'))]:
       
    76             radio_button = wx.RadioButton(self, label=label, 
       
    77                   style=(wx.RB_GROUP if first else 0))
       
    78             radio_button.SetValue(first)
       
    79             self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button)
       
    80             left_gridsizer.AddWindow(radio_button, flag=wx.GROW)
       
    81             self.TypeRadioButtons[type] = radio_button
       
    82             first = False
    59         
    83         
    60         self.RightPowerRail = wx.RadioButton(self, label=_('Right PowerRail'))
    84         # Create label for power rail pin number
    61         self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, self.RightPowerRail)
       
    62         left_gridsizer.AddWindow(self.RightPowerRail, flag=wx.GROW)
       
    63         
       
    64         pin_number_label = wx.StaticText(self, label=_('Pin number:'))
    85         pin_number_label = wx.StaticText(self, label=_('Pin number:'))
    65         left_gridsizer.AddWindow(pin_number_label, flag=wx.GROW)
    86         left_gridsizer.AddWindow(pin_number_label, flag=wx.GROW)
    66         
    87         
       
    88         # Create spin control for defining power rail pin number
    67         self.PinNumber = wx.SpinCtrl(self, min=1, max=50,
    89         self.PinNumber = wx.SpinCtrl(self, min=1, max=50,
    68               style=wx.SP_ARROW_KEYS)
    90               style=wx.SP_ARROW_KEYS)
    69         self.Bind(wx.EVT_SPINCTRL, self.OnPinNumberChanged, self.PinNumber)
    91         self.Bind(wx.EVT_SPINCTRL, self.OnPinNumberChanged, self.PinNumber)
    70         left_gridsizer.AddWindow(self.PinNumber, flag=wx.GROW)
    92         left_gridsizer.AddWindow(self.PinNumber, flag=wx.GROW)
    71         
    93         
       
    94         # Create a sizer for right column
    72         right_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
    95         right_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
    73         right_gridsizer.AddGrowableCol(0)
    96         right_gridsizer.AddGrowableCol(0)
    74         right_gridsizer.AddGrowableRow(1)
    97         right_gridsizer.AddGrowableRow(1)
    75         column_sizer.AddSizer(right_gridsizer, 1, border=5, 
    98         column_sizer.AddSizer(right_gridsizer, 1, border=5, 
    76               flag=wx.GROW|wx.LEFT)
    99               flag=wx.GROW|wx.LEFT)
    77         
   100         
    78         preview_label = wx.StaticText(self, label=_('Preview:'))
   101         # Add preview panel and associated label to sizers
    79         right_gridsizer.AddWindow(preview_label, flag=wx.GROW)
   102         right_gridsizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
    80         
       
    81         self.Preview = wx.Panel(self,
       
    82               style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
       
    83         self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
       
    84         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
       
    85         setattr(self.Preview, "GetScaling", lambda:None)
       
    86         setattr(self.Preview, "IsOfType", controller.IsOfType)
       
    87         self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
       
    88         right_gridsizer.AddWindow(self.Preview, flag=wx.GROW)
   103         right_gridsizer.AddWindow(self.Preview, flag=wx.GROW)
    89         
   104         
    90         button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
   105         # Add buttons sizer to sizers
    91         main_sizer.AddSizer(button_sizer, border=20, 
   106         main_sizer.AddSizer(self.ButtonSizer, border=20, 
    92               flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   107               flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
    93         
   108         
    94         self.SetSizer(main_sizer)
   109         self.SetSizer(main_sizer)
    95         
   110         
    96         self.Type = type
   111         # Left Power Rail radio button is default control having keyboard focus
    97         if type == LEFTRAIL:
   112         self.TypeRadioButtons[LEFTRAIL].SetFocus()
    98             self.LeftPowerRail.SetValue(True)
   113     
    99         elif type == RIGHTRAIL:
   114     def GetMinElementSize(self):
   100             self.RightPowerRail.SetValue(True)
   115         """
   101         self.PinNumber.SetValue(number)
   116         Get minimal graphic element size
   102         
   117         @return: Tuple containing minimal size (width, height) or None if no
   103         self.PowerRailMinSize = (0, 0)
   118         element defined
   104         self.PowerRail = None
   119         May be overridden by inherited classes
   105         
   120         """
   106         self.LeftPowerRail.SetFocus()
   121         return (2, LD_LINE_SIZE * self.PinNumber.GetValue())
   107 
   122     
   108     def SetPreviewFont(self, font):
   123     def GetPowerRailType(self):
   109         self.Preview.SetFont(font)
   124         """
   110 
   125         Return type selected for power rail
   111     def SetMinSize(self, size):
   126         @return: Type selected (LEFTRAIL or RIGHTRAIL)
   112         self.PowerRailMinSize = size
   127         """
   113         self.RefreshPreview()    
   128         return (LEFTRAIL
       
   129                 if self.TypeRadioButtons[LEFTRAIL].GetValue()
       
   130                 else RIGHTRAIL)
       
   131     
       
   132     def SetValues(self, values):
       
   133         """
       
   134         Set default power rail parameters
       
   135         @param values: Power rail parameters values
       
   136         """
       
   137         # For each parameters defined, set corresponding control value
       
   138         for name, value in values.items():
       
   139             
       
   140             # Parameter is power rail type
       
   141             if name == "type":
       
   142                 self.TypeRadioButtons[value].SetValue(True)
       
   143             
       
   144             # Parameter is power rail pin number
       
   145             elif name == "pin_number":
       
   146                 self.PinNumber.SetValue(value)
   114 
   147 
   115     def GetValues(self):
   148     def GetValues(self):
   116         values = {}
   149         """
   117         values["type"] = self.Type
   150         Return power rail parameters defined in dialog
   118         values["number"] = self.PinNumber.GetValue()
   151         @return: {parameter_name: parameter_value,...}
   119         values["width"], values["height"] = self.PowerRail.GetSize()
   152         """
       
   153         values = {
       
   154             "type": self.GetPowerRailType(),
       
   155             "pin_number": self.PinNumber.GetValue()}
       
   156         values["width"], values["height"] = self.Element.GetSize()
   120         return values
   157         return values
   121 
   158 
   122     def OnTypeChanged(self, event):
   159     def OnTypeChanged(self, event):
   123         if self.LeftPowerRail.GetValue():
   160         """
   124             self.Type = LEFTRAIL
   161         Called when power rail type changed
   125         elif self.RightPowerRail.GetValue():
   162         @param event: wx.RadioButtonEvent
   126             self.Type = RIGHTRAIL
   163         """
   127         self.RefreshPreview()
   164         self.RefreshPreview()
   128         event.Skip()
   165         event.Skip()
   129 
   166 
   130     def OnPinNumberChanged(self, event):
   167     def OnPinNumberChanged(self, event):
       
   168         """
       
   169         Called when power rail pin number value changed
       
   170         @param event: wx.SpinEvent
       
   171         """
   131         self.RefreshPreview()
   172         self.RefreshPreview()
   132         event.Skip()
   173         event.Skip()
   133 
   174 
   134     def RefreshPreview(self):
   175     def RefreshPreview(self):
   135         dc = wx.ClientDC(self.Preview)
   176         """
   136         dc.SetFont(self.Preview.GetFont())
   177         Refresh preview panel of graphic element
   137         dc.Clear()
   178         Override BlockPreviewDialog function
   138         self.PowerRail = LD_PowerRail(self.Preview, self.Type, connectors = self.PinNumber.GetValue())
   179         """
   139         min_width, min_height = 2, LD_LINE_SIZE * self.PinNumber.GetValue()
   180         
   140         width, height = max(min_width, self.PowerRailMinSize[0]), max(min_height, self.PowerRailMinSize[1])
   181         # Set graphic element displayed, creating a power rail element
   141         self.PowerRail.SetSize(width, height)
   182         self.Element = LD_PowerRail(self.Preview, 
   142         clientsize = self.Preview.GetClientSize()
   183                 self.GetPowerRailType(), 
   143         self.PowerRail.SetPosition((clientsize.width - width) / 2, (clientsize.height - height) / 2)
   184                 connectors = self.PinNumber.GetValue())
   144         self.PowerRail.Draw(dc)
   185         
   145 
   186         # Call BlockPreviewDialog function
   146     def OnPaint(self, event):
   187         BlockPreviewDialog.RefreshPreview(self)
   147         self.RefreshPreview()
       
   148         event.Skip()