source: sasview/guiframe/local_perspectives/plotting/SlicerParameters.py @ e8c96f5

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 e8c96f5 was e8c96f5, checked in by Gervaise Alina <gervyh@…>, 15 years ago

working on slicer parameter panel

  • Property mode set to 100644
File size: 4.4 KB
Line 
1"""
2    Panel class to show the slicer parameters
3"""
4
5import wx
6import wx.lib.newevent
7from copy import deepcopy
8
9(SlicerEvent, EVT_SLICER)   = wx.lib.newevent.NewEvent()
10(SlicerParameterEvent, EVT_SLICER_PARS)   = wx.lib.newevent.NewEvent()
11
12def format_number(value, high=False):
13    """
14        Return a float in a standardized, human-readable formatted string
15    """
16    try: 
17        value = float(value)
18    except:
19        return "NaN"
20   
21    if high:
22        return "%-6.4g" % value
23    else:
24        return "%-5.3g" % value
25class SlicerParameterPanel(wx.Dialog):
26    #TODO: show units
27    #TODO: order parameters properly
28   
29    def __init__(self, parent, id, title):
30        wx.Dialog.__init__(self, parent, id, title, size=(400, 350))
31        self.params = {}
32        self.parent = parent
33        self.type = None
34        self.listeners = []
35        self.parameters = []
36        self.bck = wx.GridBagSizer(5,5)
37        self.SetSizer(self.bck)
38               
39        title = wx.StaticText(self, -1, "Right-click on 2D plot for slicer options", style=wx.ALIGN_LEFT)
40        self.bck.Add(title, (0,0), (1,2), flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=15)
41       
42        # Bindings
43        self.parent.Bind(EVT_SLICER, self.onEVT_SLICER)
44        self.parent.Bind(EVT_SLICER_PARS, self.onParamChange)
45       
46       
47
48    def onEVT_SLICER(self, event):
49        """
50            Process EVT_SLICER events
51            When the slicer changes, update the panel
52           
53            @param event: EVT_SLICER event
54        """
55        event.Skip()
56        print "on event slicer parameters"
57        if event.obj_class==None:
58            self.set_slicer(None, None)
59        else:
60            self.set_slicer(event.type, event.params)
61       
62    def set_slicer(self, type, params):
63        """
64            Rebuild the panel
65        """
66       
67        self.bck.Clear(True) 
68        self.type = type 
69       
70        if type==None:
71            title = wx.StaticText(self, -1, "Right-click on 2D plot for slicer options", style=wx.ALIGN_LEFT)
72            self.bck.Add(title, (0,0), (1,2), flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=15)
73
74        else:
75            title = wx.StaticText(self, -1, "Slicer Parameters", style=wx.ALIGN_LEFT)
76            self.bck.Add(title, (0,0), (1,2), flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=15)
77           
78            n = 1
79            self.parameters = []
80            #params = slicer.get_params()
81            keys = params.keys()
82            keys.sort()
83           
84            for item in keys:
85                n += 1
86                text = wx.StaticText(self, -1, item, style=wx.ALIGN_LEFT)
87                self.bck.Add(text, (n-1,0), flag = wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border = 15)
88                ctl = wx.TextCtrl(self, -1, size=(80,20), style=wx.TE_PROCESS_ENTER)
89               
90                ctl.SetToolTipString("Modify the value of %s to change the 2D slicer" % item)
91               
92               
93                ctl.SetValue(format_number(str(params[item])))
94                self.Bind(wx.EVT_TEXT_ENTER, self.onTextEnter)
95                ctl.Bind(wx.EVT_KILL_FOCUS, self.onTextEnter)
96                self.parameters.append([item, ctl])
97                self.bck.Add(ctl, (n-1,1), flag=wx.TOP|wx.BOTTOM, border = 0)
98
99        self.bck.Layout()
100        self.bck.Fit(self)
101        self.parent.GetSizer().Layout()
102
103    def onParamChange(self, evt):
104        evt.Skip()
105        if evt.type == "UPDATE":
106            for item in self.parameters:             
107                if item[0] in evt.params:
108                    item[1].SetValue("%-5.3g" %evt.params[item[0]])
109                    item[1].Refresh()
110       
111    def onTextEnter(self, evt): 
112        """
113            Parameters have changed
114        """ 
115        params = {}
116        has_error = False
117        for item in self.parameters:
118            try:
119                params[item[0]] = float(item[1].GetValue())
120                item[1].SetBackgroundColour(
121                        wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
122                item[1].Refresh()
123            except:
124                has_error = True
125                item[1].SetBackgroundColour("pink")
126                item[1].Refresh()
127
128        if has_error==False:
129            # Post parameter event
130            event = SlicerParameterEvent(type=self.type, params=params)
131            wx.PostEvent(self.parent, event)
132           
133 
134       
135
136       
Note: See TracBrowser for help on using the repository browser.