source: sasview/sansguiframe/src/sans/guiframe/local_perspectives/plotting/slicerpanel.py @ d4895dd

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since d4895dd was d555416, checked in by smk78, 12 years ago

Fix to Ticket #101; Modified Slicer Panel for Box Sum to display total sum and number of points summed; renamed captions for values accordingly

  • Property mode set to 100644
File size: 6.2 KB
Line 
1
2
3import wx
4import wx.lib.newevent
5#from copy import deepcopy
6from sans.guiframe.utils import format_number
7from sans.guiframe.events import SlicerParameterEvent
8from sans.guiframe.events import EVT_SLICER_PARS
9from sans.guiframe.events import EVT_SLICER
10
11from sans.guiframe.panel_base import PanelBase
12
13class SlicerPanel(wx.Panel, PanelBase):
14    """
15    Panel class to show the slicer parameters
16    """
17    #TODO: show units
18    #TODO: order parameters properly
19     ## Internal name for the AUI manager
20    window_name = "Slicer panel"
21    ## Title to appear on top of the window
22    window_caption = "Slicer Panel"
23    CENTER_PANE = False
24   
25    def __init__(self, parent, id=-1, type=None, base=None,
26                params=None, *args, **kwargs):
27        wx.Panel.__init__(self, parent, id, *args, **kwargs)
28        PanelBase.__init__(self)
29        ##  Initialization of the class     
30        self.base = base
31        if params is None:
32            params = {}
33        self.params = params
34        self.parent = parent
35        self.type = type
36        self.listeners = []
37        self.parameters = []
38        self.bck = wx.GridBagSizer(5, 5)
39        self.SetSizer(self.bck)
40        if type == None and params == None: 
41            label = "Right-click on 2D plot for slicer options" 
42            title = wx.StaticText(self, -1, label, style=wx.ALIGN_LEFT)
43            self.bck.Add(title, (0, 0), (1, 2), 
44                         flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=15)
45        else:
46            self.set_slicer(type, params)
47        ## Bindings
48        self.parent.Bind(EVT_SLICER, self.onEVT_SLICER)
49        self.parent.Bind(EVT_SLICER_PARS, self.onParamChange)
50
51    def onEVT_SLICER(self, event):
52        """
53        Process EVT_SLICER events
54        When the slicer changes, update the panel
55       
56        :param event: EVT_SLICER event
57       
58        """
59        event.Skip()
60        if event.obj_class == None:
61            self.set_slicer(None, None) 
62        else:
63            self.set_slicer(event.type, event.params)
64       
65    def set_slicer(self, type, params):
66        """
67        Rebuild the panel
68        """
69        self.bck.Clear(True) 
70        self.type = type 
71        if type == None:
72            label = "Right-click on 2D plot for slicer options"
73            title = wx.StaticText(self, -1, label, style=wx.ALIGN_LEFT)
74            self.bck.Add(title, (0, 0), (1, 2), 
75                         flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=15)
76        else:
77            title = wx.StaticText(self, -1, "Slicer Parameters", 
78                                  style=wx.ALIGN_LEFT)
79            self.bck.Add(title, (0, 0), (1, 2), 
80                         flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=15)
81            n = 1
82            self.parameters = []
83            keys = params.keys()
84            keys.sort()
85            for item in keys:
86                if not item.lower() in ["num_points", "avg", "avg_error", "sum",
87                                         "sum_error"]:
88                    n += 1
89                    text = wx.StaticText(self, -1, item, style=wx.ALIGN_LEFT)
90                    self.bck.Add(text, (n-1, 0), 
91                            flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=15)
92                    ctl = wx.TextCtrl(self, -1, size=(80, 20), 
93                                      style=wx.TE_PROCESS_ENTER)
94                    hint_msg = "Modify the value of %s to change " % item
95                    hint_msg += "the 2D slicer"
96                    ctl.SetToolTipString(hint_msg)
97                    ctl.SetValue(str(format_number(params[item])))
98                    self.Bind(wx.EVT_TEXT_ENTER, self.onTextEnter)
99                    ctl.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
100                    ctl.Bind(wx.EVT_KILL_FOCUS, self.onTextEnter)
101                    self.parameters.append([item, ctl])
102                    self.bck.Add(ctl, (n-1, 1), flag=wx.TOP|wx.BOTTOM, border=0)
103            for item in keys:
104                if  item.lower() in ["num_points", "avg", "avg_error", "sum",
105                                      "sum_error"]:
106                    n += 1
107                    text = wx.StaticText(self, -1, item + ": ", 
108                                         style=wx.ALIGN_LEFT)
109                    self.bck.Add(text, (n-1, 0), 
110                                 flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, 
111                                 border=15)
112                    ctl = wx.StaticText(self, -1, 
113                                        str(format_number(params[item])),
114                                        style=wx.ALIGN_LEFT)
115                    ctl.SetToolTipString("Result %s" % item)
116                    self.bck.Add(ctl, (n-1, 1), flag=wx.TOP|wx.BOTTOM, border=0)       
117        self.bck.Layout()
118        #self.bck.Fit(self)
119        self.Layout()
120        self.parent.GetSizer().Layout()
121       
122    def onSetFocus(self, evt):
123        """
124        Hightlight the textcrtl
125        """
126        # Get a handle to the TextCtrl
127        widget = evt.GetEventObject()
128        # Select the whole control, after this event resolves
129        wx.CallAfter(widget.SetSelection, -1, -1)
130        return
131   
132    def onParamChange(self, evt):
133        """
134        Receive and event and reset the text field contained in self.parameters
135           
136        """
137        evt.Skip()
138        for item in self.parameters:             
139            if item[0] in evt.params:
140                item[1].SetValue(format_number(evt.params[item[0]]))
141                item[1].Refresh()
142   
143    def onTextEnter(self, evt): 
144        """
145        Parameters have changed
146        """ 
147        params = {}
148        has_error = False
149        for item in self.parameters:
150            try:
151                params[item[0]] = float(item[1].GetValue())
152                item[1].SetBackgroundColour(
153                        wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
154                item[1].Refresh()
155            except:
156                has_error = True
157                item[1].SetBackgroundColour("pink")
158                item[1].Refresh()
159           
160        if has_error == False:
161            # Post parameter event
162            ## base is guiframe is this case
163            event = SlicerParameterEvent(type=self.type, params=params)
164            wx.PostEvent(self.base, event)
165           
166       
Note: See TracBrowser for help on using the repository browser.