Changeset 6bbeacd4 in sasview for sansview/perspectives/fitting/fitpanel.py
- Timestamp:
- Feb 28, 2011 4:04:10 PM (13 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- a07e72f
- Parents:
- 1584fff
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sansview/perspectives/fitting/fitpanel.py
r90a7bbd r6bbeacd4 3 3 import string 4 4 import wx 5 import wx. aui5 import wx.lib.flatnotebook as fnb 6 6 7 7 from sans.guiframe.panel_base import PanelBase 8 8 from sans.guiframe.events import PanelOnFocusEvent 9 from sans.guiframe.events import StatusEvent 9 10 import basepage 10 11 import models 11 12 _BOX_WIDTH = 80 12 13 13 14 14 class PageInfo(object): 15 """ 16 this class contains the minimum numbers of data members 17 a fitpage or model page need to be initialized. 18 """ 19 data = None 20 model = None 21 manager = None 22 event_owner= None 23 model_list_box = None 24 name = None 25 ## Internal name for the AUI manager 26 window_name = "Page" 27 ## Title to appear on top of the window 28 window_caption = "Page" 29 #type of page can be real data , theory 1D or therory2D 30 type = "Data" 31 def __init__(self, model=None, data=None, manager=None, 32 event_owner=None, model_list_box=None, name=None): 33 """ 34 Initialize data members 35 """ 36 self.data = data 37 self.model= model 38 self._manager= manager 39 self.event_owner= event_owner 40 self.model_list_box = model_list_box 41 self.name=None 42 self.window_name = "Page" 43 self.window_caption = "Page" 44 self.type = "Data" 45 46 class FitPanel(wx.aui.AuiNotebook, PanelBase): 15 class FitPanel(fnb.FlatNotebook, PanelBase): 47 16 48 17 """ … … 59 28 CENTER_PANE = True 60 29 61 def __init__(self, parent, *args, **kwargs):62 """ 63 """ 64 wx.aui.AuiNotebook.__init__(self, parent, -1,30 def __init__(self, parent, manager=None, *args, **kwargs): 31 """ 32 """ 33 fnb.FlatNotebook.__init__(self, parent, -1, 65 34 style= wx.aui.AUI_NB_WINDOWLIST_BUTTON| 66 35 wx.aui.AUI_NB_DEFAULT_STYLE| 67 36 wx.CLIP_CHILDREN) 68 37 PanelBase.__init__(self, parent) 69 70 self._manager = None38 self.SetWindowStyleFlag(style=fnb.FNB_FANCY_TABS) 39 self._manager = manager 71 40 self.parent = parent 72 41 self.event_owner = None 73 74 pageClosedEvent = wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE75 self.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.on_close_page)76 77 42 #dictionary of miodel {model class name, model class} 78 self.model_list_box = {} 79 ## save the title of the last page tab added 43 self.menu_mng = models.ModelManager() 44 self.model_list_box = self.menu_mng.get_model_list().get_list() 45 #pageClosedEvent = fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING 46 self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING , self.on_close_page) 47 ## save the title of the last page tab added 80 48 self.fit_page_name = {} 81 49 ## list of existing fit page … … 91 59 #add default pages 92 60 self.add_default_pages() 93 94 # increment number for model name 95 self.count = 0 96 #updating the panel 97 self.Update() 98 self.Center() 61 62 def get_page_by_id(self, id): 63 """ 64 """ 65 if id not in self.opened_pages: 66 msg = "Fitpanel cannot find ID: %s in self.opened_pages" % str(id) 67 raise ValueError, msg 68 else: 69 return self.opened_pages[id] 99 70 100 71 def on_page_changing(self, event): 72 """ 73 """ 101 74 pos = self.GetSelection() 102 75 if pos != -1: 103 76 selected_page = self.GetPage(pos) 104 77 wx.PostEvent(self.parent, PanelOnFocusEvent(panel=selected_page)) 78 105 79 def on_set_focus(self, event): 106 80 """ … … 136 110 from hint_fitpage import HintFitPage 137 111 self.hint_page = HintFitPage(self) 138 self.AddPage( page=self.hint_page, caption="Hint")112 self.AddPage(self.hint_page,"Hint") 139 113 self.hint_page.set_manager(self._manager) 140 #Add the first fit page 141 self.add_empty_page() 142 143 114 144 115 def close_all(self): 145 116 """ … … 170 141 page_is_opened = False 171 142 if state is not None: 172 page_info = self.get_page_info(data=state.data) 173 for name, panel in self.opened_pages.values(): 143 for id, panel in self.opened_pages.values(): 174 144 #Don't return any panel is the exact same page is created 175 if name == page_info.window_name:145 if id == panel.id: 176 146 # the page is still opened 177 147 panel.reset_page(state=state) … … 182 152 # add data associated to the page created 183 153 if panel is not None: 184 self._manager.store_page(page=panel , data=state.data)154 self._manager.store_page(page=panel.id, data=state.data) 185 155 panel.reset_page(state=state) 186 156 panel.save_current_state() … … 241 211 page.set_manager(self._manager) 242 212 243 244 def set_owner(self,owner):245 """246 set and owner for fitpanel247 248 :param owner: the class responsible of plotting249 250 """251 self.event_owner = owner252 253 213 def set_model_list(self, dict): 254 214 """ … … 265 225 266 226 """ 267 return self.GetPage(self.GetSelection() 227 return self.GetPage(self.GetSelection()) 268 228 269 229 def add_sim_page(self): … … 274 234 page_finder= self._manager.get_page_finder() 275 235 self.sim_page = SimultaneousFitPage(self,page_finder=page_finder, id=-1) 276 277 self.AddPage(self.sim_page, caption="Simultaneous Fit",select=True)236 self.sim_page.id = wx.NewId() 237 self.AddPage(self.sim_page,"Simultaneous Fit", True) 278 238 self.sim_page.set_manager(self._manager) 279 239 return self.sim_page 280 240 281 def get_page_info(self, data=None): 282 """ 283 fill information required to add a page in the fit panel 284 """ 285 name = "Fit Page" 286 type = 'empty' 287 if data is not None: 288 if data.is_data: 289 name = data.name 290 type = 'Data' 291 else: 292 if data.__class__.__name__ == "Data2D": 293 name = 'Model 2D Fit' 294 type = 'Theory2D' 295 else: 296 name = 'Model 1D Fit' 297 type = 'Theory1D' 298 page_info = PageInfo(data=data, name=name) 299 page_info.event_owner = self.event_owner 300 page_info.manager = self._manager 301 page_info.window_name = name 302 page_info.window_caption = name 303 page_info.type = type 304 return page_info 241 242 def add_empty_page(self): 243 """ 244 add an empty page 245 """ 246 from fitpage import FitPage 247 panel = FitPage(parent=self) 248 panel.id = wx.NewId() 249 panel.populate_box(dict=self.model_list_box) 250 panel.set_manager(self._manager) 251 self.AddPage(panel, panel.window_name, select=True) 252 self.opened_pages[panel.id] = panel 253 return panel 305 254 306 def add_empty_page(self): 307 """ 308 add an empty page 309 """ 310 page_info = self.get_page_info() 311 from fitpage import FitPage 312 panel = FitPage(parent=self, page_info=page_info) 313 panel.set_manager(self._manager) 314 self.AddPage(page=panel, caption=page_info.window_name, select=True) 315 self.opened_pages[page_info.type] = [page_info.window_name, panel] 316 return panel 317 318 def add_page(self, page_info): 319 """ 320 add a new page 321 """ 322 from fitpage import FitPage 323 panel = FitPage(parent=self, page_info=page_info) 324 panel.set_manager(self._manager) 325 self.AddPage(page=panel, caption=page_info.window_name, select=True) 326 index = self.GetPageIndex(panel) 327 self.change_page_content(data=page_info.data, index=index) 328 return panel 329 330 def change_page_content(self, data, index): 331 """ 332 replace the contains of an existing page 333 """ 334 page_info = self.get_page_info(data=data) 335 self.SetPageText(index, page_info.window_name) 336 panel = self.GetPage(index) 337 panel.set_data(data) 338 if panel.model_list_box is None or len(panel.model_list_box) == 0: 339 page_info.model_list_box = self.model_list_box.get_list() 340 panel.populate_box(dict=page_info.model_list_box) 341 panel.initialize_combox() 342 panel.set_page_info(page_info=page_info) 343 self.opened_pages[page_info.type] = [page_info.window_name, panel] 344 return panel 345 346 def replace_page(self, index, page_info, type): 347 """ 348 replace an existing page 349 """ 350 self.DeletePage(index) 351 del self.opened_pages[type] 352 return self.add_page(page_info=page_info) 353 354 def add_fit_page(self, data, reset=False): 255 256 def set_data(self, data): 355 257 """ 356 258 Add a fitting page on the notebook contained by fitpanel … … 363 265 if data is None: 364 266 return None 365 page_info = self.get_page_info(data=data) 366 type = page_info.type 367 npages = len(self.opened_pages.keys()) 368 #check if only and empty page is opened 369 if len(self.opened_pages.keys()) > 0: 370 first_page_type = self.opened_pages.keys()[0] 371 if npages == 1 and first_page_type in ['empty']: 372 #replace the first empty page 373 name, panel = self.opened_pages[first_page_type] 374 index = self.GetPageIndex(panel) 375 panel = self.change_page_content(data=data, index=index) 376 del self.opened_pages[first_page_type] 377 return panel 378 if type in self.opened_pages.keys(): 379 #this type of page is already created but it is a theory 380 # meaning the same page is just to fit different data 381 if not type.lower() in ['data']: 382 #delete the previous theory page and add a new one 383 name, panel = self.opened_pages[type] 384 #self._manager.reset_plot_panel(panel.get_data()) 385 #delete the existing page and replace it 386 index = self.GetPageIndex(panel) 387 panel = self.replace_page(index=index, page_info=page_info, type=type) 388 return panel 389 else: 390 for name, panel in self.opened_pages.values(): 391 #Don't return any panel is the exact same page is created 392 if name == page_info.window_name: 393 return None 394 else: 395 panel = self.add_page(page_info=page_info) 396 return panel 397 else: 398 #a new type of page is created 399 panel = self.add_page(page_info=page_info) 400 return panel 401 402 def _onGetstate(self, event): 267 for page in self.opened_pages.values(): 268 #check if the selected data existing in the fitpanel 269 pos = self.GetPageIndex(page) 270 if page.get_data() is None: 271 page.set_data(data) 272 self.SetPageText(pos, str(data.name)) 273 self.SetSelection(pos) 274 return page 275 elif page.get_data().id == data.id: 276 msg = "Data already existing in the fitting panel" 277 wx.PostEvent(self._manager.parent, 278 StatusEvent(status=msg, info='warning')) 279 self.SetSelection(pos) 280 return page 281 282 page = self.add_empty_page() 283 page.id = wx.NewId() 284 page.set_data(data) 285 self.SetPageText(pos, str(data.name)) 286 self.opened_pages[page.id] = page 287 return page 288 289 def _onGetstate(self, event): 403 290 """ 404 291 copy the state of a page 405 292 """ 406 page = event.page407 if page. window_namein self.fit_page_name:408 self.fit_page_name[page.window_name].appendItem(page.createMemento())293 page = event.page 294 if page.id in self.fit_page_name: 295 self.fit_page_name[page.id].appendItem(page.createMemento()) 409 296 410 297 def _onUndo(self, event ): … … 413 300 """ 414 301 page = event.page 415 if page. window_namein self.fit_page_name:416 if self.fit_page_name[page. window_name].getCurrentPosition()==0:302 if page.id in self.fit_page_name: 303 if self.fit_page_name[page.id].getCurrentPosition()==0: 417 304 state = None 418 305 else: 419 state = self.fit_page_name[page. window_name].getPreviousItem()306 state = self.fit_page_name[page.id].getPreviousItem() 420 307 page._redo.Enable(True) 421 308 page.reset_page(state) … … 426 313 """ 427 314 page = event.page 428 if page. window_namein self.fit_page_name:429 length= len(self.fit_page_name[page. window_name])430 if self.fit_page_name[page. window_name].getCurrentPosition()== length -1:315 if page.id in self.fit_page_name: 316 length= len(self.fit_page_name[page.id]) 317 if self.fit_page_name[page.id].getCurrentPosition()== length -1: 431 318 state = None 432 319 page._redo.Enable(False) 433 320 page._redo.Enable(True) 434 321 else: 435 state = self.fit_page_name[page.window_name].getNextItem()322 state =self.fit_page_name[page.id].getNextItem() 436 323 page.reset_page(state) 437 324 … … 441 328 """ 442 329 #remove hint page 443 if selected_page == self.hint_page:330 if selected_page.id == self.hint_page.id: 444 331 return 445 332 ## removing sim_page … … 461 348 if selected_page in page_finder: 462 349 #Delete the name of the page into the list of open page 463 for type, list in self.opened_pages.iteritems():350 for id, list in self.opened_pages.iteritems(): 464 351 #Don't return any panel is the exact same page is created 465 name = str(list[0]) 466 if flag and selected_page.window_name == name: 467 if type.lower() in ['theory1d', 'theory2d']: 468 self._manager.remove_plot(selected_page, theory=True) 469 else: 470 self._manager.remove_plot(selected_page, theory=False) 352 353 if flag and selected_page.id == id: 354 self._manager.remove_plot(id, theory=False) 471 355 break 472 356 del page_finder[selected_page] … … 480 364 481 365 #Delete the name of the page into the list of open page 482 for type, list in self.opened_pages.iteritems():366 for id, list in self.opened_pages.iteritems(): 483 367 #Don't return any panel is the exact same page is created 484 name = str(list[0])485 if selected_page. window_name == name:368 369 if selected_page.id == id: 486 370 del self.opened_pages[type] 487 371 break
Note: See TracChangeset
for help on using the changeset viewer.