source: sasview/sansview/perspectives/fitting/fitpanel.py @ de7b4cf

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 de7b4cf was 1b1bbf9, checked in by Jae Cho <jhjcho@…>, 14 years ago

focus color (plots) and adjust panel sizes a bit

  • Property mode set to 100644
File size: 14.3 KB
Line 
1
2import numpy
3import string 
4import wx
5#from wx.lib.flatnotebook import FlatNotebook as nb
6from wx.aui import AuiNotebook as nb
7
8from sans.guiframe.panel_base import PanelBase
9from sans.guiframe.events import PanelOnFocusEvent
10from sans.guiframe.events import StatusEvent
11
12import basepage
13import models
14_BOX_WIDTH = 80
15
16
17class FitPanel(nb, PanelBase):   
18
19    """
20    FitPanel class contains fields allowing to fit  models and  data
21   
22    :note: For Fit to be performed the user should check at least one parameter
23        on fit Panel window.
24       
25    """
26    ## Internal name for the AUI manager
27    window_name = "Fit panel"
28    ## Title to appear on top of the window
29    window_caption = "Fit Panel "
30    CENTER_PANE = True
31   
32    def __init__(self, parent, manager=None, *args, **kwargs):
33        """
34        """
35        nb.__init__(self, parent, -1,
36                    style= wx.aui.AUI_NB_WINDOWLIST_BUTTON|
37                    wx.aui.AUI_NB_DEFAULT_STYLE|
38                    wx.CLIP_CHILDREN)
39        PanelBase.__init__(self, parent)
40        #self.SetWindowStyleFlag(style=nb.FNB_FANCY_TABS)
41        self._manager = manager
42        self.parent = parent
43        self.event_owner = None
44        #dictionary of miodel {model class name, model class}
45        self.menu_mng = models.ModelManager()
46        self.model_list_box = self.menu_mng.get_model_list()
47        #pageClosedEvent = nb.EVT_FLATNOTEBOOK_PAGE_CLOSING
48        pageClosedEvent = wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE
49       
50        self.Bind(pageClosedEvent, self.on_close_page)
51         ## save the title of the last page tab added
52        self.fit_page_name = {}
53        ## list of existing fit page
54        self.opened_pages = {}
55        #page of simultaneous fit
56        self.sim_page = None
57        self.fit_engine_type = "scipy"
58        ## get the state of a page
59        self.Bind(basepage.EVT_PAGE_INFO, self._onGetstate)
60        self.Bind(basepage.EVT_PREVIOUS_STATE, self._onUndo)
61        self.Bind(basepage.EVT_NEXT_STATE, self._onRedo)
62        self.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.on_page_changing)
63
64        #add default pages
65        self.add_default_pages()
66
67   
68    def _on_engine_change(self, name='scipy'):
69        """
70        """
71        for panel in self.opened_pages.values():
72            self.set_engine_helper(panel=panel, name=name)
73           
74    def set_engine_helper(self, panel, name='scipy'):
75        """
76        """
77        self.fit_engine_type = name
78        if panel != self.sim_page:
79            panel._on_engine_change(name=self.fit_engine_type)
80               
81    def update_model_list(self):
82        """
83        """
84        temp = self.menu_mng.update()
85        if len(temp):
86            self.model_list_box = temp
87        return temp
88       
89       
90    def get_page_by_id(self, uid): 
91        """
92        """
93        if uid not in self.opened_pages:
94            msg = "Fitpanel cannot find ID: %s in self.opened_pages" % str(uid)
95            raise ValueError, msg
96        else:
97            return self.opened_pages[uid]
98       
99    def on_page_changing(self, event):
100        """
101        """
102        pos = self.GetSelection()
103        if pos != -1:
104            selected_page = self.GetPage(pos)
105            wx.PostEvent(self.parent, PanelOnFocusEvent(panel=selected_page))
106           
107    def on_set_focus(self, event):
108        """
109        """
110        pos = self.GetSelection()
111        if pos != -1:
112            selected_page = self.GetPage(pos)
113            wx.PostEvent(self.parent, PanelOnFocusEvent(panel=selected_page))
114       
115    def get_data(self):
116        """
117        get the data in the current page
118        """
119        pos = self.GetSelection()
120        if pos != -1:
121            selected_page = self.GetPage(pos)
122            return selected_page.get_data()
123   
124    def set_model_state(state):
125        """
126        receive a state to reset the model in the current page
127        """
128        pos = self.GetSelection()
129        if pos != -1:
130            selected_page = self.GetPage(pos)
131            selected_page.set_model_state(state)
132           
133    def get_state(self):
134        """
135         return the state of the current selected page
136        """
137        pos = self.GetSelection()
138        if pos != -1:
139            selected_page = self.GetPage(pos)
140            return selected_page.get_state()
141   
142    def add_default_pages(self):
143        """
144        Add default pages such as a hint page and an empty fit page
145        """
146        pass
147        #add default page
148        #from hint_fitpage import HintFitPage
149        #self.hint_page = HintFitPage(self)
150        #self.AddPage(self.hint_page,"Hint")
151        #self.hint_page.set_manager(self._manager)
152 
153    def close_all(self):
154        """
155        remove all pages, used when a svs file is opened
156        """
157       
158        #get number of pages
159        nop = self.GetPageCount()
160        #use while-loop, for-loop will not do the job well.
161        while (nop>0):
162            #delete the first page until no page exists
163            page = self.GetPage(0)
164            if self._manager.parent.panel_on_focus == page:
165                self._manager.parent.panel_on_focus = None
166            self._close_helper(selected_page=page)
167            self.DeletePage(0)
168            nop = nop - 1
169           
170        ## save the title of the last page tab added
171        self.fit_page_name = {}
172        ## list of existing fit page
173        self.opened_pages = {} 
174         
175    def set_state(self, state):
176        """
177        Restore state of the panel
178        """
179        page_is_opened = False
180        if state is not None:
181            for uid, panel in self.opened_pages.iteritems():
182                #Don't return any panel is the exact same page is created
183                if uid == panel.uid:
184                    # the page is still opened
185                    panel.reset_page(state=state)
186                    panel.save_current_state() 
187                    page_is_opened = True
188            if not page_is_opened:
189                panel = self._manager.add_fit_page(data=state.data)
190                # add data associated to the page created
191                if panel is not None: 
192                    self._manager.store_page(page=panel.uid, data=state.data)
193                    panel.reset_page(state=state)
194                    panel.save_current_state()
195                   
196    def clear_panel(self):
197        """
198        Clear and close all panels, used by guimanager
199        """
200       
201        #close all panels only when svs file opened
202        self.close_all()
203        self._manager.mypanels = []
204       
205                       
206    def on_close_page(self, event=None):
207        """
208        close page and remove all references to the closed page
209        """
210        nbr_page = self.GetPageCount()
211        if nbr_page == 1:
212           
213            event.Veto()
214            return 
215        selected_page = self.GetPage(self.GetSelection())
216        self._close_helper(selected_page=selected_page)
217       
218    def close_page_with_data(self, deleted_data):
219        """
220        close a fit page when its data is completely remove from the graph
221        """
222        if deleted_data is None:
223            return
224        for index in range(self.GetPageCount()):
225            selected_page = self.GetPage(index) 
226            if hasattr(selected_page,"get_data"):
227                data = selected_page.get_data()
228               
229                if data is None:
230                    #the fitpanel exists and only the initial fit page is open
231                    #with no selected data
232                    return
233                if data.name == deleted_data.name:
234                    self._close_helper(selected_page)
235                    self.DeletePage(index)
236                    break
237       
238    def set_manager(self, manager):
239        """
240        set panel manager
241       
242        :param manager: instance of plugin fitting
243       
244        """
245        self._manager = manager
246        for pos in range(self.GetPageCount()):
247            page = self.GetPage(pos)
248            if page is not None:
249                page.set_manager(self._manager)
250
251    def set_model_list(self, dict):
252         """
253         copy a dictionary of model into its own dictionary
254         
255         :param dict: dictionnary made of model name as key and model class
256             as value
257         """
258         self.model_list_box = dict
259       
260    def get_current_page(self):
261        """
262        :return: the current page selected
263       
264        """
265        return self.GetPage(self.GetSelection())
266   
267    def add_sim_page(self):
268        """
269        Add the simultaneous fit page
270        """
271        from simfitpage import SimultaneousFitPage
272        page_finder= self._manager.get_page_finder()
273        self.sim_page = SimultaneousFitPage(self,page_finder=page_finder, id=-1)
274        self.sim_page.uid = wx.NewId()
275        self.AddPage(self.sim_page,"Simultaneous Fit", True)
276        self.sim_page.set_manager(self._manager)
277        return self.sim_page
278       
279 
280    def add_empty_page(self):
281        """
282        add an empty page
283        """
284        from fitpage import FitPage
285        panel = FitPage(parent=self)
286        panel.uid = wx.NewId()
287        panel.populate_box(dict=self.model_list_box)
288        panel.set_manager(self._manager)
289        caption = str(panel.window_name) + " " + str(self._manager.index_model)
290        self.AddPage(panel, caption, select=True)
291        self.opened_pages[panel.uid] = panel
292        self.set_engine_helper(panel=panel)
293        return panel
294   
295    def delete_data(self, data):
296        """
297        Delete the given data
298        """
299        if data is None:
300            return None
301    def set_data(self, data):
302        """
303        Add a fitting page on the notebook contained by fitpanel
304       
305        :param data: data to fit
306       
307        :return panel : page just added for further used. is used by fitting module
308       
309        """
310        if data is None:
311            return None
312        for page in self.opened_pages.values():
313            #check if the selected data existing in the fitpanel
314            pos = self.GetPageIndex(page)
315            if page.get_data() is None:
316                enable2D = page.get_view_mode()
317                if (data.__class__.__name__ == "Data2D" and enable2D)\
318                or (data.__class__.__name__ == "Data1D" and not enable2D):
319                    page.set_data(data)
320                    self.SetPageText(pos, str(data.name))
321                    self.SetSelection(pos)
322                    return page
323               
324            elif page.get_data().id == data.id:
325                msg = "Data already existing in the fitting panel"
326                wx.PostEvent(self._manager.parent, 
327                             StatusEvent(status=msg, info='warning')) 
328                self.SetSelection(pos)
329                return page
330       
331        page = self.add_empty_page()
332        pos = self.GetPageIndex(page)
333        page.set_data(data)
334        self.SetPageText(pos, str(data.name))
335        self.opened_pages[page.uid] = page
336       
337        return page
338       
339    def _onGetstate(self, event):
340        """
341        copy the state of a page
342        """
343        page = event.page
344        if page.uid in self.fit_page_name:
345           self.fit_page_name[page.uid].appendItem(page.createMemento()) 
346           
347    def _onUndo(self, event ):
348        """
349        return the previous state of a given page is available
350        """
351        page = event.page
352        if page.uid in self.fit_page_name:
353            if self.fit_page_name[page.uid].getCurrentPosition()==0:
354                state = None
355            else:
356                state = self.fit_page_name[page.uid].getPreviousItem()
357                page._redo.Enable(True)
358            page.reset_page(state)
359       
360    def _onRedo(self, event): 
361        """
362        return the next state available
363        """       
364        page = event.page
365        if page.uid in self.fit_page_name:
366            length= len(self.fit_page_name[page.uid])
367            if self.fit_page_name[page.uid].getCurrentPosition()== length -1:
368                state = None
369                page._redo.Enable(False)
370                page._redo.Enable(True)
371            else:
372                state =self.fit_page_name[page.uid].getNextItem()
373            page.reset_page(state) 
374                 
375    def _close_helper(self, selected_page):
376        """
377        Delete the given page from the notebook
378        """
379        #remove hint page
380        #if selected_page == self.hint_page:
381        #    return
382        ## removing sim_page
383        if selected_page == self.sim_page :
384            self._manager.sim_page=None 
385            return
386       
387        ## closing other pages
388        state = selected_page.createMemento()
389        page_name = selected_page.window_name
390        page_finder = self._manager.get_page_finder() 
391        fitproblem = None
392        ## removing fit page
393        data = selected_page.get_data()
394        #Don' t remove plot for 2D
395        flag = True
396        if data.__class__.__name__ == 'Data2D':
397            flag = False
398        if selected_page in page_finder:
399            #Delete the name of the page into the list of open page
400            for uid, list in self.opened_pages.iteritems():
401                #Don't return any panel is the exact same page is created
402               
403                if flag and selected_page.uid == uid:
404                    self._manager.remove_plot(uid, theory=False)
405                    break 
406            del page_finder[selected_page]
407        ##remove the check box link to the model name of this page (selected_page)
408        try:
409            self.sim_page.draw_page()
410        except:
411            ## that page is already deleted no need to remove check box on
412            ##non existing page
413            pass
414               
415        #Delete the name of the page into the list of open page
416        for uid, list in self.opened_pages.iteritems():
417            #Don't return any panel is the exact same page is created
418           
419            if selected_page.uid == uid:
420                del self.opened_pages[selected_page.uid]
421                break 
422     
423 
Note: See TracBrowser for help on using the repository browser.