#!/usr/bin/env python # version __id__ = "$Id: aboutdialog.py 1193 2007-05-03 17:29:59Z dmitriy $" __revision__ = "$Revision: 1193 $" import wx from sans.guiframe.utils import format_number from sans.guicomm.events import StatusEvent ,NewPlotEvent,SlicerEvent class DetectorDialog(wx.Dialog): """ Dialog box to let the user edit detector settings """ def __init__(self,parent,id=1,base=None, *args, **kwds): kwds["style"] = wx.DEFAULT_DIALOG_STYLE wx.Dialog.__init__(self,parent,id=1, *args, **kwds) self.parent=base self.label_xnpts = wx.StaticText(self, -1, "Detector width in pixels") self.label_ynpts = wx.StaticText(self, -1, "Detector Height in pixels") self.label_qmax = wx.StaticText(self, -1, "Q max") self.label_zmin = wx.StaticText(self, -1, "Min amplitude for color map (optional)") self.label_zmax = wx.StaticText(self, -1, "Max amplitude for color map (optional)") self.label_beam = wx.StaticText(self, -1, "Beam stop radius in units of q") self.xnpts_ctl = wx.StaticText(self, -1, "") self.ynpts_ctl = wx.StaticText(self, -1, "") self.qmax_ctl = wx.StaticText(self, -1, "") self.beam_ctl = wx.StaticText(self, -1, "") self.zmin_ctl = wx.TextCtrl(self, -1, size=(60,20)) self.zmax_ctl = wx.TextCtrl(self, -1, size=(60,20)) self.static_line_3 = wx.StaticLine(self, -1) self.button_OK = wx.Button(self, wx.ID_OK, "OK") self.button_Cancel = wx.Button(self, wx.ID_CANCEL, "Cancel") self.Bind(wx.EVT_BUTTON, self.checkValues, self.button_OK) self.__set_properties() self.__do_layout() self.Fit() class Event: xnpts = 0 ynpts = 0 qpax = 0 beam = 0 zmin = 0 zmax = 0 sym4 = False def checkValues(self, event): """ Check the valitidity of zmin and zmax value zmax should be a float and zmin less than zmax """ flag = True try: value=self.zmin_ctl.GetValue() if value and float( value)==0.0: flag = False wx.PostEvent(self.parent, StatusEvent(status="Enter number greater than zero")) self.zmin_ctl.SetBackgroundColour("pink") self.zmin_ctl.Refresh() else: self.zmin_ctl.SetBackgroundColour(wx.WHITE) self.zmin_ctl.Refresh() except: flag = False wx.PostEvent(self.parent, StatusEvent(status="Enter float value")) self.zmin_ctl.SetBackgroundColour("pink") self.zmin_ctl.Refresh() try: value=self.zmax_ctl.GetValue() if value and int(value)==0.0: flag = False wx.PostEvent(self.parent, StatusEvent(status="Enter number greater than zero")) self.zmax_ctl.SetBackgroundColour("pink") self.zmax_ctl.Refresh() else: self.zmax_ctl.SetBackgroundColour(wx.WHITE) self.zmax_ctl.Refresh() except: flag = False wx.PostEvent(self.parent, StatusEvent(status="Enter Integer value")) self.zmax_ctl.SetBackgroundColour("pink") self.zmax_ctl.Refresh() if flag: event.Skip(True) def setContent(self, xnpts,ynpts, qmax, beam,zmin=None,zmax=None, sym=False): """ received value and displayed them @param xnpts: the number of point of the x_bins of data @param ynpts: the number of point of the y_bins of data @param qmax: the maxmimum value of data pixel @param beam : the radius of the beam @param zmin: the value to get the minimum color @param zmax: the value to get the maximum color @param sym: """ self.xnpts_ctl.SetLabel(str(format_number(xnpts))) self.ynpts_ctl.SetLabel(str(format_number(ynpts))) self.qmax_ctl.SetLabel(str(format_number(qmax))) self.beam_ctl.SetLabel(str(format_number(beam))) if zmin !=None: self.zmin_ctl.SetValue(str(format_number(zmin))) if zmax !=None: self.zmax_ctl.SetValue(str(format_number(zmax))) def getContent(self): """ @return event containing value to reset the detector of a given data """ event = self.Event() t_min = self.zmin_ctl.GetValue() t_max = self.zmax_ctl.GetValue() v_min = None v_max = None if len(t_min.lstrip())>0: try: v_min = float(t_min) except: v_min = None if len(t_max.lstrip())>0: try: v_max = float(t_max) except: v_max = None event.zmin = v_min event.zmax = v_max return event def __set_properties(self): """ set proprieties of the dialog window """ self.SetTitle("Detector parameters") self.SetSize((600, 595)) def __do_layout(self): """ fill the dialog window . """ sizer_main = wx.BoxSizer(wx.VERTICAL) sizer_button = wx.BoxSizer(wx.HORIZONTAL) sizer_params = wx.GridBagSizer(5,5) iy = 0 sizer_params.Add(self.label_xnpts, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) sizer_params.Add(self.xnpts_ctl, (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) iy += 1 sizer_params.Add(self.label_ynpts, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) sizer_params.Add(self.ynpts_ctl, (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) iy += 1 sizer_params.Add(self.label_qmax, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) sizer_params.Add(self.qmax_ctl, (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) iy += 1 sizer_params.Add(self.label_beam, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) sizer_params.Add(self.beam_ctl, (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) iy += 1 sizer_params.Add(self.label_zmin, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) sizer_params.Add(self.zmin_ctl, (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) iy += 1 sizer_params.Add(self.label_zmax, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) sizer_params.Add(self.zmax_ctl, (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) iy += 1 sizer_main.Add(sizer_params, 0, wx.EXPAND|wx.ALL, 10) sizer_main.Add(self.static_line_3, 0, wx.EXPAND, 0) sizer_button.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) sizer_button.Add(self.button_OK, 0, wx.LEFT|wx.ADJUST_MINSIZE, 10) sizer_button.Add(self.button_Cancel, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10) sizer_main.Add(sizer_button, 0, wx.EXPAND|wx.BOTTOM|wx.TOP, 10) self.SetAutoLayout(True) self.SetSizer(sizer_main) self.Layout() self.Centre() # end wxGlade # end of class DialogAbout ##### testing code ############################################################ class MyApp(wx.App): def OnInit(self): wx.InitAllImageHandlers() dialog = DetectorDialog(None, -1, "") self.SetTopWindow(dialog) dialog.setContent(128, 0.05) print dialog.ShowModal() evt = dialog.getContent() print evt.npts, evt.qmax dialog.Destroy() return 1 # end of class MyApp if __name__ == "__main__": app = MyApp(0) app.MainLoop() ##### end of testing code #####################################################