Changeset d7b4decd in sasview


Ignore:
Timestamp:
Oct 27, 2015 4:11:12 PM (9 years ago)
Author:
Paul Kienzle <pkienzle@…>
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:
40c69b3
Parents:
88d7032
Message:

fix constraint Remove button. Fixes #468. Refs #448.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/sas/perspectives/fitting/simfitpage.py

    r6f16e25 rd7b4decd  
    22    Simultaneous fit page 
    33""" 
    4 import sys, re, string, wx 
     4import sys 
     5from collections import namedtuple 
     6 
     7import wx 
    58import wx.lib.newevent 
     9from wx.lib.scrolledpanel import ScrolledPanel 
     10 
    611from sas.guiframe.events import StatusEvent 
    712from sas.guiframe.panel_base import PanelBase 
    8 from wx.lib.scrolledpanel import ScrolledPanel 
    913from sas.guiframe.events import PanelOnFocusEvent 
     14from sas.guiframe.utils import IdList 
     15 
    1016#Control panel width  
    1117if sys.platform.count("darwin") == 0: 
     
    1723 
    1824 
     25# Each constraint requires five widgets and sizer.  Package them in 
     26# a named tuple for easy access. 
     27ConstraintLine = namedtuple('ConstraintLine', 
     28        'model_cbox param_cbox egal_txt constraint btRemove sizer') 
     29 
    1930def get_fittableParam(model): 
    2031    """ 
     
    3445 
    3546    return fittable_param 
    36  
    3747 
    3848class SimultaneousFitPage(ScrolledPanel, PanelBase): 
     
    4757    window_caption = "Simultaneous Fit Page" 
    4858    ID_SET_ALL = wx.NewId() 
    49     ID_REMOVE = wx.NewId() 
    5059    ID_FIT = wx.NewId() 
    5160    ID_ADD = wx.NewId() 
    52  
    53     def __init__(self, parent, page_finder={}, id= wx.ID_ANY, batch_on=False, 
    54                      *args, **kwargs): 
     61    _id_pool = IdList() 
     62 
     63    def __init__(self, parent, page_finder={}, id=wx.ID_ANY, batch_on=False, 
     64                 *args, **kwargs): 
    5565        ScrolledPanel.__init__(self, parent, id=id, 
    5666                               style=wx.FULL_REPAINT_ON_RESIZE, 
     
    6070        Simultaneous page display 
    6171        """ 
     72        self._ids = iter(self._id_pool) 
    6273        self.SetupScrolling() 
    6374        ##Font size 
     
    129140        if len(self.constraints_list) == 0: 
    130141            return 
     142        wx.CallAfter(self._remove_after, event.GetId()) 
     143        #self._onAdd_constraint(None) 
     144 
     145    def _remove_after(self, id): 
    131146        for item in self.constraints_list: 
    132             length = len(item) 
    133             if event.GetId() == item[length - 2].GetId(): 
    134                 sizer = item[length - 1] 
    135                 sizer.Clear(True) 
    136                 self.sizer_constraints.Remove(sizer) 
    137                 #self.SetScrollbars(20,20,25,65) 
     147            if id == item.btRemove.GetId(): 
     148                self.sizer_constraints.Hide(item.sizer) 
     149                item.sizer.Clear(True) 
     150                self.sizer_constraints.Remove(item.sizer) 
     151                ##self.SetScrollbars(20,20,25,65) 
    138152                self.constraints_list.remove(item) 
    139153                self.nb_constraint -= 1 
     
    141155                self.Layout() 
    142156                break 
    143  
    144         #self._onAdd_constraint(None) 
    145157 
    146158    def onFit(self, event): 
     
    198210            if not self.batch_on: 
    199211                ## display constraint fields 
    200                 if self.show_constraint.GetValue() and\ 
    201                                  len(self.constraints_list) == 0: 
     212                if (self.show_constraint.GetValue() and 
     213                                 len(self.constraints_list) == 0): 
    202214                    self._show_all_constraint() 
    203215                    self._show_constraint() 
     
    206218                item[0].SetValue(False) 
    207219 
    208             self.model_toFit = [] 
    209220            if not self.batch_on: 
    210221                ##constraint info 
     
    255266        Update easy setup combobox on selecting a model 
    256267        """ 
    257         if self.model_cbox_left != None and self.model_cbox_right != None: 
    258             try: 
    259                 # when there is something 
    260                 self.model_cbox_left.Clear() 
    261                 self.model_cbox_right.Clear() 
    262                 self.model_cbox.Clear() 
    263             except: 
    264                 # when there is nothing 
    265                 pass 
    266             #for id, model in self.constraint_dict.iteritems(): 
    267             for item in self.model_toFit: 
    268                 model = item[3] 
    269                 ## check if all parameters have been selected for constraint 
    270                 ## then do not allow add constraint on parameters 
    271                 if str(model.name) not in self.model_cbox_left.GetItems(): 
    272                     self.model_cbox_left.Append(str(model.name), model) 
    273                 if str(model.name) not in self.model_cbox_right.GetItems(): 
    274                     self.model_cbox_right.Append(str(model.name), model) 
    275                 if str(model.name) not in self.model_cbox.GetItems(): 
    276                     self.model_cbox.Append(str(model.name), model) 
     268        if self.model_cbox_left == None or self.model_cbox_right == None: 
     269            return 
     270 
     271        models = [(item[3].name, item[3]) for item in self.model_toFit] 
     272        setComboBoxItems(self.model_cbox_left, models) 
     273        setComboBoxItems(self.model_cbox_right, models) 
     274        for item in self.constraints_list: 
     275            setComboBoxItems(item[0], models) 
     276        if self.model_cbox_left.GetSelection() == wx.NOT_FOUND: 
    277277            self.model_cbox_left.SetSelection(0) 
    278             self.sizer2.Layout() 
    279             self.sizer3.Layout() 
     278        self.sizer2.Layout() 
     279        self.sizer3.Layout() 
    280280 
    281281    def draw_page(self): 
     
    402402        boxsizer.Add(self.model_cbox_left, 
    403403                             flag=wx.RIGHT | wx.EXPAND, border=10) 
    404         boxsizer.Add(wx.StaticText(self, wx.ID_ANY, ".parameters"), 
    405                              flag=wx.RIGHT | wx.EXPAND, border=5) 
     404        #boxsizer.Add(wx.StaticText(self, wx.ID_ANY, ".parameters"), 
     405        #                     flag=wx.RIGHT | wx.EXPAND, border=5) 
    406406        boxsizer.Add(egal_txt, flag=wx.RIGHT | wx.EXPAND, border=5) 
    407407        boxsizer.Add(self.model_cbox_right, 
    408408                             flag=wx.RIGHT | wx.EXPAND, border=10) 
    409         boxsizer.Add(wx.StaticText(self, wx.ID_ANY, ".parameters"), 
    410                              flag=wx.RIGHT | wx.EXPAND, border=5) 
     409        #boxsizer.Add(wx.StaticText(self, wx.ID_ANY, ".parameters"), 
     410        #                     flag=wx.RIGHT | wx.EXPAND, border=5) 
    411411        boxsizer.Add((20, -1)) 
    412412        boxsizer.Add(self.set_button, flag=wx.RIGHT | wx.EXPAND, border=5) 
     
    430430        if self.model_cbox_right.GetValue().strip() == '': 
    431431            flag = False 
    432         if self.model_cbox_left.GetValue() == \ 
    433                 self.model_cbox_right.GetValue(): 
     432        if (self.model_cbox_left.GetValue() == 
     433                self.model_cbox_right.GetValue()): 
    434434            flag = False 
    435435        self.set_button.Enable(flag) 
     
    463463            num_cbox += 1 
    464464            if param in param_listB: 
    465                 self.model_cbox.SetStringSelection(model_left) 
     465                item = self.constraints_list[-1] 
     466                item.model_cbox.SetStringSelection(model_left) 
    466467                self._on_select_model(None) 
    467                 self.param_cbox.Clear() 
    468                 self.param_cbox.Append(str(param), model) 
    469                 self.param_cbox.SetStringSelection(str(param)) 
    470                 self.ctl2.SetValue(str(model_right + "." + str(param))) 
     468                item.param_cbox.Clear() 
     469                item.param_cbox.Append(str(param), model) 
     470                item.param_cbox.SetStringSelection(str(param)) 
     471                item.constraint.SetValue(str(model_right + "." + str(param))) 
    471472                has_param = True 
    472473                if num_cbox == (len(param_list) + 1): 
     
    499500            ##Don't add anymore 
    500501            if len(self.constraints_list) == nb_fit_param: 
    501                 msg = "Cannot add another constraint .Maximum of number " 
     502                msg = "Cannot add another constraint. Maximum of number " 
    502503                msg += "Parameters name reached %s" % str(nb_fit_param) 
    503504                wx.PostEvent(self.parent.parent, StatusEvent(status=msg)) 
     
    513514 
    514515        sizer_constraint = wx.BoxSizer(wx.HORIZONTAL) 
     516 
     517        # Model list 
    515518        model_cbox = wx.ComboBox(self, wx.ID_ANY, style=wx.CB_READONLY) 
    516519        model_cbox.Clear() 
    517         param_cbox = wx.ComboBox(self, wx.ID_ANY, style=wx.CB_READONLY, size=(100, -1),) 
    518         param_cbox.Hide() 
    519  
    520         #This is for GetCLientData() _on_select_param: Was None return on MAC. 
    521         self.param_cbox = param_cbox 
    522  
    523         wx.EVT_COMBOBOX(param_cbox, wx.ID_ANY, self._on_select_param) 
    524         self.ctl2 = wx.TextCtrl(self, wx.ID_ANY) 
    525         egal_txt = wx.StaticText(self, wx.ID_ANY, " = ") 
    526         self.btRemove = wx.Button(self, self.ID_REMOVE, 'Remove') 
    527         self.btRemove.Bind(wx.EVT_BUTTON, self.onRemove, 
    528                            id=self.btRemove.GetId()) 
    529         self.btRemove.SetToolTipString("Remove constraint.") 
    530         self.btRemove.Hide() 
    531         if hasattr(self, "btAdd"): 
    532             self.btAdd.Hide() 
    533520        for id, model in self.constraint_dict.iteritems(): 
    534521            ## check if all parameters have been selected for constraint 
    535522            ## then do not allow add constraint on parameters 
    536523            model_cbox.Append(str(model.name), model) 
    537  
    538         #This is for GetCLientData() passing to self._on_select_param: Was None return on MAC. 
    539         self.model_cbox = model_cbox 
    540  
    541524        wx.EVT_COMBOBOX(model_cbox, wx.ID_ANY, self._on_select_model) 
    542         sizer_constraint.Add((5, wx.ID_ANY)) 
     525 
     526        # Parameters in model 
     527        param_cbox = wx.ComboBox(self, wx.ID_ANY, style=wx.CB_READONLY, 
     528                                 size=(100, -1)) 
     529        param_cbox.Hide() 
     530        wx.EVT_COMBOBOX(param_cbox, wx.ID_ANY, self._on_select_param) 
     531 
     532        egal_txt = wx.StaticText(self, wx.ID_ANY, " = ") 
     533 
     534        # Parameter constraint 
     535        constraint = wx.TextCtrl(self, wx.ID_ANY) 
     536 
     537        # Remove button 
     538        #btRemove = wx.Button(self, self.ID_REMOVE, 'Remove') 
     539        btRemove = wx.Button(self, self._ids.next(), 'Remove') 
     540        btRemove.Bind(wx.EVT_BUTTON, self.onRemove, 
     541                      id=btRemove.GetId()) 
     542        btRemove.SetToolTipString("Remove constraint.") 
     543        btRemove.Hide() 
     544 
     545        # Hid the add button, if it exists 
     546        if hasattr(self, "btAdd"): 
     547            self.btAdd.Hide() 
     548 
     549        sizer_constraint.Add((5, -1)) 
    543550        sizer_constraint.Add(model_cbox, flag=wx.RIGHT | wx.EXPAND, border=10) 
    544551        sizer_constraint.Add(param_cbox, flag=wx.RIGHT | wx.EXPAND, border=5) 
    545552        sizer_constraint.Add(egal_txt, flag=wx.RIGHT | wx.EXPAND, border=5) 
    546         sizer_constraint.Add(self.ctl2, flag=wx.RIGHT | wx.EXPAND, border=10) 
    547         sizer_constraint.Add(self.btRemove, flag=wx.RIGHT | wx.EXPAND, border=10) 
     553        sizer_constraint.Add(constraint, flag=wx.RIGHT | wx.EXPAND, border=10) 
     554        sizer_constraint.Add(btRemove, flag=wx.RIGHT | wx.EXPAND, border=10) 
    548555 
    549556        self.sizer_constraints.Insert(before=self.nb_constraint, 
    550                         item=sizer_constraint, flag=wx.TOP | wx.BOTTOM | wx.EXPAND, 
    551                         border=5) 
    552         self.constraints_list.append([model_cbox, param_cbox, egal_txt, 
    553                                     self.ctl2, self.btRemove, sizer_constraint]) 
     557                item=sizer_constraint, flag=wx.TOP | wx.BOTTOM | wx.EXPAND, 
     558                border=5) 
     559        c = ConstraintLine(model_cbox, param_cbox, egal_txt, 
     560                           constraint, btRemove, sizer_constraint) 
     561        self.constraints_list.append(c) 
    554562 
    555563        self.nb_constraint += 1 
     
    561569        hide buttons related constraint 
    562570        """ 
    563         for id in  self.page_finder.iterkeys(): 
     571        for id in self.page_finder.iterkeys(): 
    564572            self.page_finder[id].clear_model_param() 
    565573 
     
    569577            self.btAdd.Hide() 
    570578        self._store_model() 
    571         if self.model_cbox_left != None: 
    572             try: 
    573                 self.model_cbox_left.Clear() 
    574             except: 
    575                 pass 
     579        if self.model_cbox_left is not None: 
     580            self.model_cbox_left.Clear() 
    576581            self.model_cbox_left = None 
    577         if self.model_cbox_right != None: 
    578             try: 
    579                 self.model_cbox_right.Clear() 
    580             except: 
    581                 pass 
     582        if self.model_cbox_right is not None: 
     583            self.model_cbox_right.Clear() 
    582584            self.model_cbox_right = None 
    583585        self.constraints_list = [] 
     
    592594        fill combox box with list of parameters 
    593595        """ 
     596        if not self.constraints_list: 
     597            return 
     598 
     599        ##This way PC/MAC both work, instead of using event.GetClientData(). 
     600        model_cbox = self.constraints_list[-1].model_cbox 
     601        n = model_cbox.GetCurrentSelection() 
     602        if n == wx.NOT_FOUND: 
     603            return 
     604 
     605        model = model_cbox.GetClientData(n) 
    594606        param_list = [] 
    595         ##This way PC/MAC both work, instead of using event.GetClientData(). 
    596         n = self.model_cbox.GetCurrentSelection() 
    597         model = self.model_cbox.GetClientData(n) 
    598607        for id, dic_model in self.constraint_dict.iteritems(): 
    599608            if model == dic_model: 
    600609                param_list = self.page_finder[id].get_param2fit() 
    601                 #break 
    602         length = len(self.constraints_list) 
    603         if length < 1: 
    604             return 
    605         param_cbox = self.constraints_list[length - 1][1] 
     610                break 
     611 
     612        param_cbox = self.constraints_list[-1].param_cbox 
    606613        param_cbox.Clear() 
    607614        ## insert only fittable paramaters 
    608615        for param in param_list: 
    609616            param_cbox.Append(str(param), model) 
    610  
    611617        param_cbox.Show(True) 
    612         self.btRemove.Show(True) 
     618 
     619        btRemove = self.constraints_list[-1].btRemove 
     620        btRemove.Show(True) 
    613621        self.btAdd.Show(True) 
    614622        self.sizer2.Layout() 
     
    623631        #param = event.GetString() 
    624632 
    625         length = len(self.constraints_list) 
    626         if length < 1: 
    627             return 
    628         egal_txt = self.constraints_list[length - 1][2] 
    629         egal_txt.Show(True) 
    630  
    631         ctl2 = self.constraints_list[length - 1][3] 
    632         ctl2.Show(True) 
     633        if self.constraints_list: 
     634            self.constraints_list[-1].egal_txt.Show(True) 
     635            self.constraints_list[-1].constraint.Show(True) 
    633636 
    634637    def _onAdd_constraint(self, event): 
     
    643646        # before allow to add another constraint 
    644647        for item in self.constraints_list: 
    645             model_cbox = item[0] 
    646             if model_cbox.GetString(0) == "": 
     648            if item.model_cbox.GetString(0) == "": 
    647649                msg = " Select a model Name! " 
    648650                wx.PostEvent(self.parent.parent, StatusEvent(status=msg)) 
    649651                return 
    650             param_cbox = item[1] 
    651             if param_cbox.GetString(0) == "": 
     652            if item.param_cbox.GetString(0) == "": 
    652653                msg = " Select a parameter Name! " 
    653654                wx.PostEvent(self.parent.parent, StatusEvent(status=msg)) 
    654655                return 
    655             ctl2 = item[3] 
    656             if ctl2.GetValue().lstrip().rstrip() == "": 
    657                 model = param_cbox.GetClientData(\ 
    658                                             param_cbox.GetCurrentSelection()) 
     656            if item.constraint.GetValue().lstrip().rstrip() == "": 
     657                model = item.param_cbox.GetClientData( 
     658                                        item.param_cbox.GetCurrentSelection()) 
    659659                if model != None: 
    660660                    msg = " Enter a constraint for %s.%s! " % (model.name, 
    661                                                         param_cbox.GetString(0)) 
     661                                        item.param_cbox.GetString(0)) 
    662662                else: 
    663                      msg = " Enter a constraint" 
     663                    msg = " Enter a constraint" 
    664664                wx.PostEvent(self.parent.parent, StatusEvent(status=msg)) 
    665665                return 
     
    746746        text_hint = wx.StaticText(self, wx.ID_ANY, 
    747747                                  "Example: [M0][paramter] = M1.parameter") 
    748         sizer_button.Add(text_hint, 0 , wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 10) 
    749         sizer_button.Add(self.btAdd, 0, wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 10) 
     748        sizer_button.Add(text_hint, 0, 
     749                         wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 10) 
     750        sizer_button.Add(self.btAdd, 0, 
     751                         wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 10) 
    750752 
    751753        boxsizer1.Add(sizer_title, flag=wx.TOP | wx.BOTTOM, border=10) 
     
    770772        """ 
    771773        for item in self.constraints_list: 
    772             select0 = item[0].GetSelection() 
     774            select0 = item.model_cbox.GetSelection() 
    773775            if select0 == wx.NOT_FOUND: 
    774776                continue 
    775             model = item[0].GetClientData(select0) 
    776             select1 = item[1].GetSelection() 
     777            model = item.model_cbox.GetClientData(select0) 
     778            select1 = item.param_cbox.GetSelection() 
    777779            if select1 == wx.NOT_FOUND: 
    778780                continue 
    779             param = item[1].GetString(select1) 
    780             constraint = item[3].GetValue().lstrip().rstrip() 
     781            param = item.param_cbox.GetString(select1) 
     782            constraint = item.constraint.GetValue().lstrip().rstrip() 
    781783            if param.lstrip().rstrip() == "": 
    782784                param = None 
     
    811813                        # wrap in param/constraint in str() to remove unicode 
    812814                        self.page_finder[id].set_model_param(str(param), 
    813                                                         str(constraint), fid=fid) 
     815                                str(constraint), fid=fid) 
    814816                    break 
    815817        return True 
     
    847849        tab_used.SetForegroundColour(wx.WHITE) 
    848850        sizer.Add(tab_used, (iy, ix), (1, 1), 
    849                             wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
     851                  wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    850852        for id, value in self.page_finder.iteritems(): 
    851853            if id not in self.parent.opened_pages: 
     
    886888            cb.Enable(model is not None and data.is_data) 
    887889            sizer.Add(cb, (iy, ix), (1, 1), 
    888                        wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 
     890                      wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 
    889891            wx.EVT_CHECKBOX(self, cb.GetId(), self.check_model_name) 
    890892            ix += 2 
    891             type = model.__class__.__name__ 
    892             model_type = wx.StaticText(self, wx.ID_ANY, str(type)) 
     893            model_type = wx.StaticText(self, wx.ID_ANY, 
     894                                       model.__class__.__name__) 
    893895            sizer.Add(model_type, (iy, ix), (1, 1), 
    894896                      wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
     
    924926                wx.PostEvent(self.parent.parent, PanelOnFocusEvent(panel=self)) 
    925927            self.page_finder = self.parent._manager.get_page_finder() 
     928 
     929 
     930def setComboBoxItems(cbox, items): 
     931    assert isinstance(cbox, wx.ComboBox) 
     932    selected = cbox.GetStringSelection() 
     933    cbox.Clear() 
     934    for k, (name, value) in enumerate(items): 
     935        cbox.Append(name, value) 
     936    cbox.SetStringSelection(selected) 
Note: See TracChangeset for help on using the changeset viewer.