source: sasview/guiframe/data_panel.py @ 7a8faf8

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

remove unused code

  • Property mode set to 100644
File size: 44.8 KB
Line 
1################################################################################
2#This software was developed by the University of Tennessee as part of the
3#Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
4#project funded by the US National Science Foundation.
5#
6#See the license text in license.txt
7#
8#copyright 2010, University of Tennessee
9################################################################################
10"""
11This module provides Graphic interface for the data_manager module.
12"""
13import os
14import wx
15import sys
16import warnings
17import logging
18from wx.lib.scrolledpanel import ScrolledPanel
19import  wx.lib.agw.customtreectrl as CT
20from sans.guiframe.dataFitting import Data1D
21from sans.guiframe.dataFitting import Data2D
22from sans.guiframe.panel_base import PanelBase
23from sans.guiframe.events import StatusEvent
24from sans.guiframe.events import EVT_DELETE_PLOTPANEL
25from sans.guiframe.events import NewLoadDataEvent
26from sans.guiframe.events import NewPlotEvent
27from sans.guiframe.gui_style import GUIFRAME
28from DataLoader.loader import Loader
29
30try:
31    # Try to find a local config
32    import imp
33    path = os.getcwd()
34    if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \
35        (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))):
36        fObj, path, descr = imp.find_module('local_config', [path])
37        config = imp.load_module('local_config', fObj, path, descr) 
38    else:
39        # Try simply importing local_config
40        import local_config as config
41except:
42    # Didn't find local config, load the default
43    import config
44 
45extension_list = []
46if config.APPLICATION_STATE_EXTENSION is not None:
47    extension_list.append(config.APPLICATION_STATE_EXTENSION)
48EXTENSIONS = config.PLUGIN_STATE_EXTENSIONS + extension_list   
49PLUGINS_WLIST = config.PLUGINS_WLIST
50APPLICATION_WLIST = config.APPLICATION_WLIST
51
52#Control panel width
53if sys.platform.count("win32") > 0:
54    PANEL_WIDTH = 235
55    PANEL_HEIGHT = 700
56    CBOX_WIDTH = 140
57    BUTTON_WIDTH = 80
58    FONT_VARIANT = 0
59else:
60    PANEL_WIDTH = 255
61    PANEL_HEIGHT = 750
62    CBOX_WIDTH = 155
63    BUTTON_WIDTH = 100
64    FONT_VARIANT = 1
65
66STYLE_FLAG =wx.RAISED_BORDER|CT.TR_HAS_BUTTONS| CT.TR_HIDE_ROOT|\
67                    wx.WANTS_CHARS|CT.TR_HAS_VARIABLE_ROW_HEIGHT
68                   
69                   
70class DataTreeCtrl(CT.CustomTreeCtrl):
71    """
72    Check list control to be used for Data Panel
73    """
74    def __init__(self, parent,*args, **kwds):
75        #agwstyle is introduced in wx.2.8.11 but is not working for mac
76        if sys.platform.count("darwin") != 0:
77            try:
78                kwds['style'] = STYLE_FLAG
79                CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
80            except:
81                del kwds['style']
82                CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
83        else:
84            #agwstyle is introduced in wx.2.8.11 .argument working only for windows
85            try:
86                kwds['agwStyle'] = STYLE_FLAG
87                CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
88            except:
89                try:
90                    del kwds['agwStyle']
91                    kwds['style'] = STYLE_FLAG
92                    CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
93                except:
94                    del kwds['style']
95                    CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
96        self.root = self.AddRoot("Available Data")
97       
98class DataPanel(ScrolledPanel, PanelBase):
99    """
100    This panel displays data available in the application and widgets to
101    interact with data.
102    """
103    ## Internal name for the AUI manager
104    window_name = "Data Panel"
105    ## Title to appear on top of the window
106    window_caption = "Data Explorer"
107    #type of window
108    window_type = "Data Panel"
109    ## Flag to tell the GUI manager that this panel is not
110    #  tied to any perspective
111    #ALWAYS_ON = True
112    def __init__(self, parent, 
113                 list=None,
114                 size=(PANEL_WIDTH, PANEL_HEIGHT),
115                 list_of_perspective=None, manager=None, *args, **kwds):
116        print "size", size
117        kwds['size']= size
118        kwds['style'] = STYLE_FLAG
119        ScrolledPanel.__init__(self, parent=parent, *args, **kwds)
120        PanelBase.__init__(self)
121        self.SetupScrolling()
122        #Set window's font size
123        self.SetWindowVariant(variant=FONT_VARIANT)
124        self.loader = Loader() 
125        #Default location
126        self._default_save_location = None 
127        self.all_data1d = True
128        self.parent = parent
129        self.manager = manager
130        if list is None:
131            list = []
132        self.list_of_data = list
133        if list_of_perspective is None:
134            list_of_perspective = []
135        self.list_of_perspective = list_of_perspective
136        self.list_rb_perspectives= []
137        self.list_cb_data = {}
138        self.list_cb_theory = {}
139        self.tree_ctrl = None
140        self.tree_ctrl_theory = None
141        self.perspective_cbox = None
142       
143        self.owner = None
144        self.do_layout()
145        self.fill_cbox_analysis(self.list_of_perspective)
146        self.Bind(wx.EVT_SHOW, self.on_close_page)
147        if self.parent is not None:
148            self.parent.Bind(EVT_DELETE_PLOTPANEL, self._on_delete_plot_panel)
149       
150       
151    def do_layout(self):
152        """
153        """
154        self.define_panel_structure()
155        self.layout_selection()
156        self.layout_data_list()
157        self.layout_button()
158        #self.layout_batch()
159   
160    def define_panel_structure(self):
161        """
162        Define the skeleton of the panel
163        """
164        w, h = self.parent.GetSize()
165        self.vbox  = wx.BoxSizer(wx.VERTICAL)
166        self.sizer1 = wx.BoxSizer(wx.VERTICAL)
167        self.sizer1.SetMinSize((w/13, h*2/5))
168     
169        self.sizer2 = wx.BoxSizer(wx.VERTICAL)
170        self.sizer3 = wx.FlexGridSizer(7, 2, 4, 1)
171        self.sizer4 = wx.BoxSizer(wx.HORIZONTAL)
172        self.sizer5 = wx.BoxSizer(wx.VERTICAL)
173       
174        self.vbox.Add(self.sizer5, 0, wx.EXPAND|wx.ALL,1)
175        self.vbox.Add(self.sizer1, 0, wx.EXPAND|wx.ALL,0)
176        self.vbox.Add(self.sizer2, 0, wx.EXPAND|wx.ALL,1)
177        self.vbox.Add(self.sizer3, 0, wx.EXPAND|wx.ALL,1)
178        self.vbox.Add(self.sizer4, 0, wx.EXPAND|wx.ALL,5)
179       
180        self.SetSizer(self.vbox)
181       
182    def layout_selection(self):
183        """
184        """
185        select_txt = wx.StaticText(self, -1, 'Selection Options')
186        select_txt.SetForegroundColour('blue')
187        self.selection_cbox = wx.ComboBox(self, -1, style=wx.CB_READONLY)
188        list_of_options = ['Select all Data',
189                            'Unselect all Data',
190                           'Select all Data 1D',
191                           'Unselect all Data 1D',
192                           'Select all Data 2D',
193                           'Unselect all Data 2D' ]
194        for option in list_of_options:
195            self.selection_cbox.Append(str(option))
196        self.selection_cbox.SetValue('Select all Data')
197        wx.EVT_COMBOBOX(self.selection_cbox,-1, self._on_selection_type)
198        self.sizer5.AddMany([(select_txt,0, wx.ALL,5),
199                            (self.selection_cbox,0, wx.ALL,5)])
200        self.enable_selection()
201       
202   
203    def _on_selection_type(self, event):
204        """
205        Select data according to patterns
206        """
207       
208        list_of_options = ['Select all Data',
209                            'Unselect all Data',
210                           'Select all Data 1D',
211                           'Unselect all Data 1D',
212                           'Select all Data 2D',
213                           'Unselect all Data 2D' ]
214        option = self.selection_cbox.GetValue()
215       
216        pos = self.selection_cbox.GetSelection()
217        if pos == wx.NOT_FOUND:
218            return 
219        option = self.selection_cbox.GetString(pos)
220        for item in self.list_cb_data.values():
221            data_ctrl, _, _, _,_, _ = item
222            data_id, data_class, _ = self.tree_ctrl.GetItemPyData(data_ctrl) 
223            if option == 'Select all Data':
224                self.tree_ctrl.CheckItem(data_ctrl, True) 
225            elif option == 'Unselect all Data':
226                self.tree_ctrl.CheckItem(data_ctrl, False)
227            elif option == 'Select all Data 1D':
228                if data_class == 'Data1D':
229                    self.tree_ctrl.CheckItem(data_ctrl, True) 
230            elif option == 'Unselect all Data 1D':
231                if data_class == 'Data1D':
232                    self.tree_ctrl.CheckItem(data_ctrl, False) 
233            elif option == 'Select all Data 1D':
234                if data_class == 'Data1D':
235                    self.tree_ctrl.CheckItem(data_ctrl, True) 
236            elif option == 'Select all Data 2D':
237                if data_class == 'Data2D':
238                    self.tree_ctrl.CheckItem(data_ctrl, True) 
239            elif option == 'Unselect all Data 2D':
240                if data_class == 'Data2D':
241                    self.tree_ctrl.CheckItem(data_ctrl, False) 
242        self.enable_append()
243        self.enable_freeze()
244        self.enable_plot()
245        self.enable_import()
246        self.enable_remove()
247               
248    def layout_button(self):
249        """
250        Layout widgets related to buttons
251        """
252        w, _ = self.GetSize()
253       
254        self.bt_add = wx.Button(self, wx.NewId(), "Load Data", 
255                                size=(BUTTON_WIDTH, -1))
256        self.bt_add.SetToolTipString("Load data files")
257        wx.EVT_BUTTON(self, self.bt_add.GetId(), self._load_data)
258        self.bt_remove = wx.Button(self, wx.NewId(), "Remove Data",
259         size=(BUTTON_WIDTH, -1))
260        self.bt_remove.SetToolTipString("Remove data from the application")
261        wx.EVT_BUTTON(self, self.bt_remove.GetId(), self.on_remove)
262        self.bt_import = wx.Button(self, wx.NewId(), "Send To",
263                                    size=(BUTTON_WIDTH, -1))
264        self.bt_import.SetToolTipString("Send set of Data to active perspective")
265        wx.EVT_BUTTON(self, self.bt_import.GetId(), self.on_import)
266        self.perspective_cbox = wx.ComboBox(self, -1,
267                                style=wx.CB_READONLY)
268        #self.perspective_cbox.SetMinSize((CBOX_WIDTH, -1))
269        wx.EVT_COMBOBOX(self.perspective_cbox,-1, 
270                        self._on_perspective_selection)
271   
272        self.bt_append_plot = wx.Button(self, wx.NewId(), "Append Plot To",
273                                        size=(BUTTON_WIDTH, -1))
274        self.bt_append_plot.SetToolTipString("Plot the selected data in the active panel")
275        wx.EVT_BUTTON(self, self.bt_append_plot.GetId(), self.on_append_plot)
276       
277        self.bt_plot = wx.Button(self, wx.NewId(), "New Plot", 
278                                 size=(BUTTON_WIDTH, -1))
279        self.bt_plot.SetToolTipString("To trigger plotting")
280        wx.EVT_BUTTON(self, self.bt_plot.GetId(), self.on_plot)
281       
282        self.bt_freeze = wx.Button(self, wx.NewId(), "Freeze Theory", 
283                                   size=(BUTTON_WIDTH, -1))
284        self.bt_freeze.SetToolTipString("To trigger freeze a theory")
285        wx.EVT_BUTTON(self, self.bt_freeze.GetId(), self.on_freeze)
286        #hide plot
287        self.bt_close_plot = wx.Button(self, wx.NewId(), "Delete Plot", 
288                                   size=(BUTTON_WIDTH, -1))
289        self.bt_freeze.SetToolTipString("Delete the plot panel on focus")
290        wx.EVT_BUTTON(self, self.bt_close_plot.GetId(), self.on_close_plot)
291       
292        self.cb_plotpanel = wx.ComboBox(self, -1, 
293                                style=wx.CB_READONLY|wx.CB_SORT)
294        #self.cb_plotpanel.SetMinSize((CBOX_WIDTH, -1))
295        wx.EVT_COMBOBOX(self.cb_plotpanel,-1, self._on_plot_selection)
296        self.cb_plotpanel.Disable()
297
298        self.sizer3.AddMany([(self.bt_add),
299                             ((10, 10)),
300                             (self.bt_remove),
301                             ((10, 10)),
302                             (self.bt_import, 0, wx.EXPAND|wx.RIGHT, 5),
303                              (self.perspective_cbox, wx.EXPAND|wx.ADJUST_MINSIZE, 5),
304                              (self.bt_append_plot),
305                              (self.cb_plotpanel, wx.EXPAND|wx.ADJUST_MINSIZE, 5),
306                              (self.bt_plot),
307                              ((10, 10)),
308                              (self.bt_freeze),
309                              ((10, 10)),
310                              (self.bt_close_plot),
311                              ((10, 10))])
312
313        self.sizer3.AddGrowableCol(1, 1)
314        self.show_data_button()
315        self.enable_remove()
316        self.enable_import()
317        self.enable_plot()
318        self.enable_append()
319        self.enable_freeze()
320        self.enable_remove_plot()
321       
322    def layout_batch(self):
323        """
324        """
325        self.rb_single_mode = wx.RadioButton(self, -1, 'Single Mode',
326                                             style=wx.RB_GROUP)
327        self.rb_batch_mode = wx.RadioButton(self, -1, 'Batch Mode')
328       
329        self.rb_single_mode.SetValue(True)
330        self.rb_batch_mode.SetValue(False)
331        self.sizer4.AddMany([(self.rb_single_mode,0, wx.ALL,5),
332                            (self.rb_batch_mode,0, wx.ALL,5)])
333     
334    def layout_data_list(self):
335        """
336        Add a listcrtl in the panel
337        """
338        tree_ctrl_label = wx.StaticText(self, -1, "Data")
339        tree_ctrl_label.SetForegroundColour('blue')
340        self.tree_ctrl = DataTreeCtrl(parent=self)
341        self.tree_ctrl.Bind(CT.EVT_TREE_ITEM_CHECKING, self.on_check_item)
342        tree_ctrl_theory_label = wx.StaticText(self, -1, "Theory")
343        tree_ctrl_theory_label.SetForegroundColour('blue')
344        self.tree_ctrl_theory = DataTreeCtrl(parent=self)
345        self.tree_ctrl_theory.Bind(CT.EVT_TREE_ITEM_CHECKING, self.on_check_item)
346        self.sizer1.Add(tree_ctrl_label, 0, wx.LEFT, 10)
347        self.sizer1.Add(self.tree_ctrl, 1, wx.EXPAND|wx.ALL, 10)
348        self.sizer1.Add(tree_ctrl_theory_label, 0,  wx.LEFT, 10)
349        self.sizer1.Add(self.tree_ctrl_theory, 1, wx.EXPAND|wx.ALL, 10)
350           
351    def onContextMenu(self, event): 
352        """
353        Retrieve the state selected state
354        """
355        # Skipping the save state functionality for release 0.9.0
356        #return
357        pos = event.GetPosition()
358        pos = self.ScreenToClient(pos)
359        self.PopupMenu(self.popUpMenu, pos) 
360     
361 
362    def on_check_item(self, event):
363        """
364        """
365        item = event.GetItem()
366        item.Check(not item.IsChecked()) 
367        self.enable_append()
368        self.enable_freeze()
369        self.enable_plot()
370        self.enable_import()
371        self.enable_remove()
372        event.Skip()
373       
374    def fill_cbox_analysis(self, plugin):
375        """
376        fill the combobox with analysis name
377        """
378        self.list_of_perspective = plugin
379        if self.parent is None or \
380            not hasattr(self.parent, "get_current_perspective") or \
381            len(self.list_of_perspective) == 0:
382            return
383        if self.parent is not None and self.perspective_cbox  is not None:
384            for plug in self.list_of_perspective:
385                if plug.get_perspective():
386                    self.perspective_cbox.Append(plug.sub_menu, plug)
387           
388            curr_pers = self.parent.get_current_perspective()
389            self.perspective_cbox.SetStringSelection(curr_pers.sub_menu)
390        self.enable_import()
391                       
392    def load_data_list(self, list):
393        """
394        add need data with its theory under the tree
395        """
396        if list:
397            for state_id, dstate in list.iteritems():
398                data = dstate.get_data()
399                theory_list = dstate.get_theory()
400                if data is not None:
401                    data_name = data.name
402                    data_class = data.__class__.__name__
403                    path = dstate.get_path() 
404                    process_list = data.process
405                    data_id = data.id
406                   
407                    if state_id not in self.list_cb_data:
408                        #new state
409                        data_c = self.tree_ctrl.InsertItem(self.tree_ctrl.root,0,
410                                                           data_name, ct_type=1, 
411                                             data=(data_id, data_class, state_id))
412                        data_c.Check(True)
413                        d_i_c = self.tree_ctrl.AppendItem(data_c, 'Info')
414                        i_c_c = self.tree_ctrl.AppendItem(d_i_c, 
415                                                      'Type: %s' % data_class)
416                        p_c_c = self.tree_ctrl.AppendItem(d_i_c,
417                                                      'Path: %s' % str(path))
418                        d_p_c = self.tree_ctrl.AppendItem(d_i_c, 'Process')
419                       
420                        for process in process_list:
421                            i_t_c = self.tree_ctrl.AppendItem(d_p_c,
422                                                              process.__str__())
423                        theory_child = self.tree_ctrl.AppendItem(data_c, "THEORIES")
424                       
425                        self.list_cb_data[state_id] = [data_c, 
426                                                       d_i_c,
427                                                       i_c_c,
428                                                        p_c_c,
429                                                         d_p_c,
430                                                         theory_child]
431                    else:
432                        data_ctrl_list =  self.list_cb_data[state_id]
433                        #This state is already display replace it contains
434                        data_c, d_i_c, i_c_c, p_c_c, d_p_c, t_c = data_ctrl_list
435                        self.tree_ctrl.SetItemText(data_c, data_name) 
436                        temp = (data_id, data_class, state_id)
437                        self.tree_ctrl.SetItemPyData(data_c, temp) 
438                        self.tree_ctrl.SetItemText(i_c_c, 'Type: %s' % data_class)
439                        self.tree_ctrl.SetItemText(p_c_c, 'Path: %s' % str(path)) 
440                        self.tree_ctrl.DeleteChildren(d_p_c) 
441                        for process in process_list:
442                            i_t_c = self.tree_ctrl.AppendItem(d_p_c,
443                                                              process.__str__())
444                self.append_theory(state_id, theory_list)
445        self.enable_remove()
446        self.enable_import()
447        self.enable_plot()
448        self.enable_freeze()
449        self.enable_selection()
450       
451    def _uncheck_all(self):
452        """
453        Uncheck all check boxes
454        """
455        for item in self.list_cb_data.values():
456            data_ctrl, _, _, _,_, _ = item
457            self.tree_ctrl.CheckItem(data_ctrl, False) 
458        self.enable_append()
459        self.enable_freeze()
460        self.enable_plot()
461        self.enable_import()
462        self.enable_remove()
463   
464    def append_theory(self, state_id, theory_list):
465        """
466        append theory object under data from a state of id = state_id
467        replace that theory if  already displayed
468        """
469        if not theory_list:
470            return 
471        if state_id not in self.list_cb_data.keys():
472            root = self.tree_ctrl_theory.root
473            tree = self.tree_ctrl_theory
474        else:
475            item = self.list_cb_data[state_id]
476            data_c, _, _, _, _, _ = item
477            root = data_c
478            tree = self.tree_ctrl
479        if root is not None:
480             self.append_theory_helper(tree=tree, root=root, 
481                                       state_id=state_id, 
482                                       theory_list=theory_list)
483     
484     
485    def append_theory_helper(self, tree, root, state_id, theory_list):
486        """
487        """
488        if state_id in self.list_cb_theory.keys():
489            #update current list of theory for this data
490            theory_list_ctrl = self.list_cb_theory[state_id]
491
492            for theory_id, item in theory_list.iteritems():
493                theory_data, theory_state = item
494                if theory_data is None:
495                    name = "Unknown"
496                    theory_class = "Unknown"
497                    theory_id = "Unknown"
498                    temp = (None, None, None)
499                else:
500                    name = theory_data.name
501                    theory_class = theory_data.__class__.__name__
502                    theory_id = theory_data.id
503                    #if theory_state is not None:
504                    #    name = theory_state.model.name
505                    temp = (theory_id, theory_class, state_id)
506                if theory_id not in theory_list_ctrl:
507                    #add new theory
508                    t_child = tree.AppendItem(root,
509                                                    name, ct_type=1, data=temp)
510                    t_i_c = tree.AppendItem(t_child, 'Info')
511                    i_c_c = tree.AppendItem(t_i_c, 
512                                                  'Type: %s' % theory_class)
513                    t_p_c = tree.AppendItem(t_i_c, 'Process')
514                   
515                    for process in theory_data.process:
516                        i_t_c = tree.AppendItem(t_p_c,
517                                                          process.__str__())
518                    theory_list_ctrl[theory_id] = [t_child, 
519                                                   i_c_c, 
520                                                   t_p_c]
521                else:
522                    #replace theory
523                    t_child, i_c_c, t_p_c = theory_list_ctrl[theory_id]
524                    tree.SetItemText(t_child, name) 
525                    tree.SetItemPyData(t_child, temp) 
526                    tree.SetItemText(i_c_c, 'Type: %s' % theory_class) 
527                    tree.DeleteChildren(t_p_c) 
528                    for process in theory_data.process:
529                        i_t_c = tree.AppendItem(t_p_c,
530                                                          process.__str__())
531             
532        else:
533            #data didn't have a theory associated it before
534            theory_list_ctrl = {}
535            for theory_id, item in theory_list.iteritems():
536                theory_data, theory_state = item
537                if theory_data is not None:
538                    name = theory_data.name
539                    theory_class = theory_data.__class__.__name__
540                    theory_id = theory_data.id
541                    #if theory_state is not None:
542                    #    name = theory_state.model.name
543                    temp = (theory_id, theory_class, state_id)
544                    t_child = tree.AppendItem(root,
545                            name, ct_type=1, 
546                            data=(theory_data.id, theory_class, state_id))
547                    t_i_c = tree.AppendItem(t_child, 'Info')
548                    i_c_c = tree.AppendItem(t_i_c, 
549                                                  'Type: %s' % theory_class)
550                    t_p_c = tree.AppendItem(t_i_c, 'Process')
551                   
552                    for process in theory_data.process:
553                        i_t_c = tree.AppendItem(t_p_c,
554                                                          process.__str__())
555           
556                    theory_list_ctrl[theory_id] = [t_child, i_c_c, t_p_c]
557                #self.list_cb_theory[data_id] = theory_list_ctrl
558                self.list_cb_theory[state_id] = theory_list_ctrl
559       
560           
561   
562    def set_data_helper(self):
563        """
564        """
565        data_to_plot = []
566        state_to_plot = []
567        theory_to_plot = []
568        for value in self.list_cb_data.values():
569            item, _, _, _, _, _ = value
570            if item.IsChecked():
571                data_id, _, state_id = self.tree_ctrl.GetItemPyData(item)
572                data_to_plot.append(data_id)
573                if state_id not in state_to_plot:
574                    state_to_plot.append(state_id)
575           
576        for theory_dict in self.list_cb_theory.values():
577            for key, value in theory_dict.iteritems():
578                item, _, _ = value
579                if item.IsChecked():
580                    theory_id, _, state_id = self.tree_ctrl.GetItemPyData(item)
581                    theory_to_plot.append(theory_id)
582                    if state_id not in state_to_plot:
583                        state_to_plot.append(state_id)
584        return data_to_plot, theory_to_plot, state_to_plot
585   
586    def remove_by_id(self, id):
587        """
588        """
589        for item in self.list_cb_data.values():
590            data_c, _, _, _, _, theory_child = item
591            data_id, _, state_id = self.tree_ctrl.GetItemPyData(data_c) 
592            if id == data_id:
593                self.tree_ctrl.Delete(data_c)
594                del self.list_cb_data[state_id]
595                del self.list_cb_theory[data_id]
596             
597    def load_error(self, error=None):
598        """
599        Pop up an error message.
600       
601        :param error: details error message to be displayed
602        """
603        if error is not None or str(error).strip() != "":
604            dial = wx.MessageDialog(self.parent, str(error), 'Error Loading File',
605                                wx.OK | wx.ICON_EXCLAMATION)
606            dial.ShowModal() 
607       
608    def _load_data(self, event):
609        """
610        send an event to the parent to trigger load from plugin module
611        """
612        if self.parent is not None:
613            wx.PostEvent(self.parent, NewLoadDataEvent())
614           
615
616    def on_remove(self, event):
617        """
618        Get a list of item checked and remove them from the treectrl
619        Ask the parent to remove reference to this item
620        """
621        data_to_remove, theory_to_remove, _ = self.set_data_helper()
622        data_key = []
623        theory_key = []
624        #remove  data from treectrl
625        for d_key, item in self.list_cb_data.iteritems():
626            data_c, d_i_c, i_c_c, p_c_c, d_p_c, t_c = item
627            if data_c.IsChecked():
628                self.tree_ctrl.Delete(data_c)
629                data_key.append(d_key)
630                if d_key in self.list_cb_theory.keys():
631                    theory_list_ctrl = self.list_cb_theory[d_key]
632                    theory_to_remove += theory_list_ctrl.keys()
633        # Remove theory from treectrl       
634        for t_key, theory_dict in self.list_cb_theory.iteritems():
635            for  key, value in theory_dict.iteritems():
636                item, _, _ = value
637                if item.IsChecked():
638                    try:
639                        self.tree_ctrl.Delete(item)
640                    except:
641                        pass
642                    theory_key.append(key)
643                   
644        #Remove data and related theory references
645        for key in data_key:
646            del self.list_cb_data[key]
647            if key in theory_key:
648                del self.list_cb_theory[key]
649        #remove theory  references independently of data
650        for key in theory_key:
651            for t_key, theory_dict in self.list_cb_theory.iteritems():
652                if key in theory_dict:
653                    for  key, value in theory_dict.iteritems():
654                        item, _, _ = value
655                        if item.IsChecked():
656                            try:
657                                self.tree_ctrl_theory.Delete(item)
658                            except:
659                                pass
660                    del theory_dict[key]
661                   
662           
663        self.parent.remove_data(data_id=data_to_remove,
664                                  theory_id=theory_to_remove)
665        self.enable_remove()
666        self.enable_freeze()
667        self.enable_remove_plot()
668       
669    def on_import(self, event=None):
670        """
671        Get all select data and set them to the current active perspetive
672        """
673        data_id, theory_id, state_id = self.set_data_helper()
674        temp = data_id + state_id
675        self.parent.set_data(data_id=temp, theory_id=theory_id)
676       
677    def on_append_plot(self, event=None):
678        """
679        append plot to plot panel on focus
680        """
681        self._on_plot_selection()
682        data_id, theory_id, state_id = self.set_data_helper()
683        self.parent.plot_data(data_id=data_id, 
684                              state_id=state_id,
685                              theory_id=theory_id,
686                              append=True)
687   
688    def on_plot(self, event=None):
689        """
690        Send a list of data names to plot
691        """
692        data_id, theory_id, state_id = self.set_data_helper()
693        self.parent.plot_data(data_id=data_id, 
694                              state_id=state_id,
695                              theory_id=theory_id,
696                              append=False)
697        self.enable_remove_plot()
698         
699    def on_close_page(self, event=None):
700        """
701        On close
702        """
703        if event != None:
704            event.Skip()
705        # send parent to update menu with no show nor hide action
706        self.parent.show_data_panel(action=False)
707   
708    def on_freeze(self, event):
709        """
710        """
711        _, theory_id, state_id = self.set_data_helper()
712        self.parent.freeze(data_id=state_id, theory_id=theory_id)
713       
714    def set_active_perspective(self, name):
715        """
716        set the active perspective
717        """
718        self.perspective_cbox.SetStringSelection(name)
719        self.enable_import()
720       
721    def _on_delete_plot_panel(self, event):
722        """
723        get an event with attribute name and caption to delete existing name
724        from the combobox of the current panel
725        """
726        name = event.name
727        caption = event.caption
728        if self.cb_plotpanel is not None:
729            pos = self.cb_plotpanel.FindString(str(caption)) 
730            if pos != wx.NOT_FOUND:
731                self.cb_plotpanel.Delete(pos)
732        self.enable_append()
733       
734    def set_panel_on_focus(self, name=None):
735        """
736        set the plot panel on focus
737        """
738        for key, value in self.parent.plot_panels.iteritems():
739            name_plot_panel = str(value.window_caption)
740            if name_plot_panel not in self.cb_plotpanel.GetItems():
741                self.cb_plotpanel.Append(name_plot_panel, value)
742            if name != None and name == name_plot_panel:
743                self.cb_plotpanel.SetStringSelection(name_plot_panel)
744                break
745        self.enable_append()
746        self.enable_remove_plot()
747       
748    def _on_perspective_selection(self, event=None):
749        """
750        select the current perspective for guiframe
751        """
752        selection = self.perspective_cbox.GetSelection()
753
754        if self.perspective_cbox.GetValue() != 'None':
755            perspective = self.perspective_cbox.GetClientData(selection)
756            perspective.on_perspective(event=None)
757       
758    def _on_plot_selection(self, event=None):
759        """
760        On source combobox selection
761        """
762        if event != None:
763            combo = event.GetEventObject()
764            event.Skip()
765        else:
766            combo = self.cb_plotpanel
767        selection = combo.GetSelection()
768
769        if combo.GetValue() != 'None':
770            panel = combo.GetClientData(selection)
771            self.parent.on_set_plot_focus(panel)   
772           
773    def on_close_plot(self, event):
774        """
775        clseo the panel on focus
776        """ 
777        self.enable_append()
778        selection = self.cb_plotpanel.GetSelection()
779        if self.cb_plotpanel.GetValue() != 'None':
780            panel = self.cb_plotpanel.GetClientData(selection)
781            if self.parent is not None and panel is not None:
782                wx.PostEvent(self.parent, 
783                             NewPlotEvent(group_id=panel.group_id,
784                                          action="delete"))
785        self.enable_remove_plot()
786       
787    def enable_remove_plot(self):
788        """
789        enable remove plot button if there is a plot panel on focus
790        """
791        if self.cb_plotpanel.GetCount() == 0:
792            self.bt_close_plot.Disable()
793        else:
794            self.bt_close_plot.Enable()
795           
796    def enable_remove(self):
797        """
798        enable or disable remove button
799        """
800        n_t = self.tree_ctrl.GetCount()
801        n_t_t = self.tree_ctrl_theory.GetCount()
802        if n_t + n_t_t <= 0:
803            self.bt_remove.Disable()
804        else:
805            self.bt_remove.Enable()
806           
807    def enable_import(self):
808        """
809        enable or disable send button
810        """
811        n_t = 0
812        if self.tree_ctrl != None:
813            n_t = self.tree_ctrl.GetCount()
814        if n_t > 0 and len(self.list_of_perspective) > 0:
815            self.bt_import.Enable()
816        else:
817            self.bt_import.Disable()
818        if len(self.list_of_perspective) <= 0 or \
819            self.perspective_cbox.GetValue()  in ["None",
820                                                "No Active Application"]:
821            self.perspective_cbox.Disable()
822        else:
823            self.perspective_cbox.Enable()
824           
825    def enable_plot(self):
826        """
827        enable or disable plot button
828        """
829        n_t = 0 
830        n_t_t = 0
831        if self.tree_ctrl != None:
832            n_t = self.tree_ctrl.GetCount()
833        if self.tree_ctrl_theory != None:
834            n_t_t = self.tree_ctrl_theory.GetCount()
835        if n_t + n_t_t <= 0:
836            self.bt_plot.Disable()
837        else:
838            self.bt_plot.Enable()
839        self.enable_append()
840       
841    def enable_append(self):
842        """
843        enable or disable append button
844        """
845        n_t = 0 
846        n_t_t = 0
847        if self.tree_ctrl != None:
848            n_t = self.tree_ctrl.GetCount()
849        if self.tree_ctrl_theory != None:
850            n_t_t = self.tree_ctrl_theory.GetCount()
851        if n_t + n_t_t <= 0: 
852            self.bt_append_plot.Disable()
853            self.cb_plotpanel.Disable()
854        elif self.cb_plotpanel.GetCount() <= 0:
855                self.cb_plotpanel.Disable()
856                self.bt_append_plot.Disable()
857        else:
858            self.bt_append_plot.Enable()
859            self.cb_plotpanel.Enable()
860           
861    def check_theory_to_freeze(self):
862        """
863        """
864    def enable_freeze(self):
865        """
866        enable or disable the freeze button
867        """
868        n_t_t = 0
869        n_l = 0
870        if self.tree_ctrl_theory != None:
871            n_t_t = self.tree_ctrl_theory.GetCount()
872        n_l = len(self.list_cb_theory)
873        if (n_t_t + n_l > 0):
874            self.bt_freeze.Enable()
875        else:
876            self.bt_freeze.Disable()
877       
878    def enable_selection(self):
879        """
880        enable or disable combobo box selection
881        """
882        n_t = 0
883        n_t_t = 0
884        if self.tree_ctrl != None:
885            n_t = self.tree_ctrl.GetCount()
886        if self.tree_ctrl_theory != None:
887            n_t_t = self.tree_ctrl_theory.GetCount()
888        if n_t + n_t_t > 0 and self.selection_cbox != None:
889            self.selection_cbox.Enable()
890        else:
891            self.selection_cbox.Disable()
892           
893    def show_data_button(self):
894        """
895        show load data and remove data button if
896        dataloader on else hide them
897        """
898        try:
899            gui_style = self.parent.get_style()
900            style = gui_style & GUIFRAME.DATALOADER_ON
901            if style == GUIFRAME.DATALOADER_ON: 
902                #self.bt_remove.Show(True)
903                self.bt_add.Show(True) 
904            else:
905                #self.bt_remove.Hide()
906                self.bt_add.Hide()
907        except: 
908            #self.bt_remove.Hide()
909            self.bt_add.Hide() 
910   
911
912
913WIDTH = 400
914HEIGHT = 300
915
916
917class DataDialog(wx.Dialog):
918    """
919    Allow file selection at loading time
920    """
921    def __init__(self, data_list, parent=None, text='', *args, **kwds):
922        wx.Dialog.__init__(self, parent, *args, **kwds)
923        self.SetTitle("Data Selection")
924        self.SetSize((WIDTH, HEIGHT))
925        self.list_of_ctrl = []
926        if not data_list:
927            return 
928        self._sizer_main = wx.BoxSizer(wx.VERTICAL)
929        self._sizer_txt = wx.BoxSizer(wx.VERTICAL)
930        self._sizer_button = wx.BoxSizer(wx.HORIZONTAL)
931        self.sizer = wx.GridBagSizer(5, 5)
932        self._panel = ScrolledPanel(self, style=wx.RAISED_BORDER,
933                               size=(WIDTH-20, HEIGHT-50))
934        self._panel.SetupScrolling()
935        self.__do_layout(data_list, text=text)
936       
937    def __do_layout(self, data_list, text=''):
938        """
939        layout the dialog
940        """
941        if not data_list or len(data_list) <= 1:
942            return 
943        #add text
944       
945        text = "Deleting these file reset some panels.\n"
946        text += "Do you want to proceed?\n"
947        text_ctrl = wx.StaticText(self, -1, str(text))
948        self._sizer_txt.Add(text_ctrl)
949        iy = 0
950        ix = 0
951        data_count = 0
952        for (data_name, in_use, sub_menu) in range(len(data_list)):
953            if in_use == True:
954                ctrl_name = wx.StaticBox(self, -1, str(data_name))
955                ctrl_in_use = wx.StaticBox(self, -1, " is used by ")
956                plug_name = str(sub_menu) + "\n"
957                ctrl_sub_menu = wx.StaticBox(self, -1, plug_name)
958                self.sizer.Add(ctrl_name, (iy, ix),
959                           (1, 1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
960                ix += 1
961                self._sizer_button.Add(ctrl_in_use, 1,
962                                        wx.EXPAND|wx.ADJUST_MINSIZE, 0)
963                ix += 1
964                self._sizer_button.Add(plug_name, 1,
965                                        wx.EXPAND|wx.ADJUST_MINSIZE, 0)
966            iy += 1
967        self._panel.SetSizer(self.sizer)
968        #add sizer
969        self._sizer_button.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
970        button_cancel = wx.Button(self, wx.ID_CANCEL, "Cancel")
971        self._sizer_button.Add(button_cancel, 0,
972                          wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
973        button_OK = wx.Button(self, wx.ID_OK, "Ok")
974        button_OK.SetFocus()
975        self._sizer_button.Add(button_OK, 0,
976                                wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
977        static_line = wx.StaticLine(self, -1)
978       
979        self._sizer_txt.Add(self._panel, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5)
980        self._sizer_main.Add(self._sizer_txt, 1, wx.EXPAND|wx.ALL, 10)
981        self._sizer_main.Add(self._data_text_ctrl, 0, 
982                             wx.EXPAND|wx.LEFT|wx.RIGHT, 10)
983        self._sizer_main.Add(static_line, 0, wx.EXPAND, 0)
984        self._sizer_main.Add(self._sizer_button, 0, wx.EXPAND|wx.ALL, 10)
985        self.SetSizer(self._sizer_main)
986        self.Layout()
987       
988    def get_data(self):
989        """
990        return the selected data
991        """
992        temp = []
993        for item in self.list_of_ctrl:
994            cb, data = item
995            if cb.GetValue():
996                temp.append(data)
997        return temp
998   
999    def _count_selected_data(self, event):
1000        """
1001        count selected data
1002        """
1003        if event.GetEventObject().GetValue():
1004            self._nb_selected_data += 1
1005        else:
1006            self._nb_selected_data -= 1
1007        select_data_text = " %s Data selected.\n" % str(self._nb_selected_data)
1008        self._data_text_ctrl.SetLabel(select_data_text)
1009        if self._nb_selected_data <= self._max_data:
1010            self._data_text_ctrl.SetForegroundColour('blue')
1011        else:
1012            self._data_text_ctrl.SetForegroundColour('red')
1013       
1014                 
1015       
1016class DataFrame(wx.Frame):
1017    ## Internal name for the AUI manager
1018    window_name = "Data Panel"
1019    ## Title to appear on top of the window
1020    window_caption = "Data Panel"
1021    ## Flag to tell the GUI manager that this panel is not
1022    #  tied to any perspective
1023    ALWAYS_ON = True
1024   
1025    def __init__(self, parent=None, owner=None, manager=None,size=(300, 800),
1026                         list_of_perspective=[],list=[], *args, **kwds):
1027        kwds['size'] = size
1028        kwds['id'] = -1
1029        kwds['title']= "Loaded Data"
1030        wx.Frame.__init__(self, parent=parent, *args, **kwds)
1031        self.parent = parent
1032        self.owner = owner
1033        self.manager = manager
1034        self.panel = DataPanel(parent=self, 
1035                               #size=size,
1036                               list_of_perspective=list_of_perspective)
1037     
1038    def load_data_list(self, list=[]):
1039        """
1040        Fill the list inside its panel
1041        """
1042        self.panel.load_data_list(list=list)
1043       
1044   
1045   
1046from dataFitting import Data1D
1047from dataFitting import Data2D, Theory1D
1048from data_state import DataState
1049import sys
1050class State():
1051    def __init__(self):
1052        self.msg = ""
1053    def __str__(self):
1054        self.msg = "model mane : model1\n"
1055        self.msg += "params : \n"
1056        self.msg += "name  value\n"
1057        return msg
1058def set_data_state(data=None, path=None, theory=None, state=None):
1059    dstate = DataState(data=data)
1060    dstate.set_path(path=path)
1061    dstate.set_theory(theory, state)
1062 
1063    return dstate
1064"""'
1065data_list = [1:('Data1', 'Data1D', '07/01/2010', "theory1d", "state1"),
1066            ('Data2', 'Data2D', '07/03/2011', "theory2d", "state1"),
1067            ('Data3', 'Theory1D', '06/01/2010', "theory1d", "state1"),
1068            ('Data4', 'Theory2D', '07/01/2010', "theory2d", "state1"),
1069            ('Data5', 'Theory2D', '07/02/2010', "theory2d", "state1")]
1070"""     
1071if __name__ == "__main__":
1072   
1073    app = wx.App()
1074    try:
1075        list_of_perspective = [('perspective2', False), ('perspective1', True)]
1076        data_list = {}
1077        # state 1
1078        data = Data2D()
1079        data.name = "data2"
1080        data.id = 1
1081        data.append_empty_process()
1082        process = data.process[len(data.process)-1]
1083        process.data = "07/01/2010"
1084        theory = Data2D()
1085        theory.id = 34
1086        theory.name = "theory1"
1087        path = "path1"
1088        state = State()
1089        data_list['1']=set_data_state(data, path,theory, state)
1090        #state 2
1091        data = Data2D()
1092        data.name = "data2"
1093        data.id = 76
1094        theory = Data2D()
1095        theory.id = 78
1096        theory.name = "CoreShell 07/24/25"
1097        path = "path2"
1098        #state3
1099        state = State()
1100        data_list['2']=set_data_state(data, path,theory, state)
1101        data = Data1D()
1102        data.id = 3
1103        data.name = "data2"
1104        theory = Theory1D()
1105        theory.name = "CoreShell"
1106        theory.id = 4
1107        theory.append_empty_process()
1108        process = theory.process[len(theory.process)-1]
1109        process.description = "this is my description"
1110        path = "path3"
1111        data.append_empty_process()
1112        process = data.process[len(data.process)-1]
1113        process.data = "07/22/2010"
1114        data_list['4']=set_data_state(data, path,theory, state)
1115        #state 4
1116        temp_data_list = {}
1117        data.name = "data5 erasing data2"
1118        temp_data_list['4'] = set_data_state(data, path,theory, state)
1119        #state 5
1120        data = Data2D()
1121        data.name = "data3"
1122        data.id = 5
1123        data.append_empty_process()
1124        process = data.process[len(data.process)-1]
1125        process.data = "07/01/2010"
1126        theory = Theory1D()
1127        theory.name = "Cylinder"
1128        path = "path2"
1129        state = State()
1130        dstate= set_data_state(data, path,theory, state)
1131        theory = Theory1D()
1132        theory.id = 6
1133        theory.name = "CoreShell"
1134        dstate.set_theory(theory)
1135        theory = Theory1D()
1136        theory.id = 6
1137        theory.name = "CoreShell replacing coreshell in data3"
1138        dstate.set_theory(theory)
1139        data_list['3'] = dstate
1140        #state 6
1141        data_list['6']=set_data_state(None, path,theory, state)
1142        data_list['6']=set_data_state(theory=theory, state=None)
1143        theory = Theory1D()
1144        theory.id = 7
1145        data_list['6']=set_data_state(theory=theory, state=None)
1146        data_list['7']=set_data_state(theory=theory, state=None)
1147        window = DataFrame(list=data_list)
1148        window.load_data_list(list=data_list)
1149        window.Show(True)
1150        window.load_data_list(list=temp_data_list)
1151    except:
1152        #raise
1153        print "error",sys.exc_value
1154       
1155    app.MainLoop() 
1156   
1157   
Note: See TracBrowser for help on using the repository browser.