Changeset 6f16e25 in sasview for src/sas/guiframe


Ignore:
Timestamp:
Oct 21, 2015 8:35:00 AM (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:
85130cb
Parents:
2d88fc4
Message:

clean up wx id handling in fitting perspective

Location:
src/sas/guiframe
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/sas/guiframe/gui_toolbar.py

    r79492222 r6f16e25  
    3636    Implement toolbar for guiframe 
    3737    """ 
     38    ID_BOOKMARK = wx.NewId() 
    3839    def __init__(self, parent,  *args, **kwds): 
    3940        Tbar.__init__(self, parent,  *args, **kwds) 
     
    133134        Add default items in bookmark menu 
    134135        """ 
    135         id = wx.NewId() 
    136         self._bookmark_menu.Append(id, 'Bookmark This Page State') 
     136        self._bookmark_menu.Append(self.ID_BOOKMARK, 'Bookmark This Page State') 
    137137        self._bookmark_menu.AppendSeparator() 
    138         wx.EVT_MENU(self, id, self.on_bookmark) 
     138        wx.EVT_MENU(self, self.ID_BOOKMARK, self.on_bookmark) 
    139139    
    140140    def on_bind_button(self): 
  • src/sas/guiframe/local_perspectives/plotting/Plotter1D.py

    r2d88fc4 r6f16e25  
    1919from sas.guiframe.events import StatusEvent 
    2020from sas.guiframe.events import PanelOnFocusEvent 
    21 from sas.guiframe.utils import PanelMenu 
     21from sas.guiframe.utils import PanelMenu, IdList 
    2222from sas.guiframe.panel_base import PanelBase 
    2323from sas.guiframe.gui_style import GUIFRAME_ICON 
     
    3535    """return the key of dictionary dic given the value""" 
    3636    return [k for k, v in dic.iteritems() if v == val][0] 
    37  
    38 class IdCollection: 
    39     def __init__(self): 
    40         self._ids = [] 
    41         self._index = 0 
    42     def next(self): 
    43         if len(self._ids) == self._index: 
    44            self._ids.append(wx.NewId()) 
    45         self._index += 1 
    46         return self._ids[self._index-1] 
    47     def reset(self): 
    48         self._index = 0 
    49  
    5037 
    5138class ModelPanel1D(PlotPanel, PanelBase): 
     
    6350    ## Group ID 
    6451    group_id = None 
    65     _menu_ids = IdCollection() 
     52    _menu_ids = IdList() 
    6653 
    6754    def __init__(self, parent, id=-1, color=None, 
     
    8067 
    8168        self._available_data = [] 
    82         self._menu_add_ids = [] 
    8369        self._symbol_labels = self.get_symbol_label() 
    8470        self._color_labels = self.get_color_label() 
     
    568554        self._slicerpop.set_plots(self.plots) 
    569555        self._slicerpop.set_graph(self.graph) 
    570         self._menu_ids.reset() 
     556        ids = iter(self._menu_ids) 
    571557        if not self.graph.selected_plottable in self.plots: 
    572558            # Various plot options 
    573             wx_id = self._menu_ids.next() 
     559            wx_id = ids.next() 
    574560            self._slicerpop.Append(wx_id, '&Save Image', 'Save image as PNG') 
    575561            wx.EVT_MENU(self, wx_id, self.onSaveImage) 
    576             wx_id = self._menu_ids.next() 
     562            wx_id = ids.next() 
    577563            self._slicerpop.Append(wx_id, '&Print Image', 'Print image ') 
    578564            wx.EVT_MENU(self, wx_id, self.onPrint) 
    579565 
    580             wx_id = self._menu_ids.next() 
     566            wx_id = ids.next() 
    581567            self._slicerpop.Append(wx_id, '&Copy to Clipboard', 
    582568                                   'Copy to the clipboard') 
     
    595581                    continue 
    596582 
    597             wx_id = self._menu_ids.next() 
     583            wx_id = ids.next() 
    598584            plot_menu.Append(wx_id, "&DataInfo", name) 
    599585            wx.EVT_MENU(self, wx_id, self. _onDataShow) 
    600             wx_id = self._menu_ids.next() 
     586            wx_id = ids.next() 
    601587            plot_menu.Append(wx_id, "&Save Points as a File", name) 
    602588            wx.EVT_MENU(self, wx_id, self._onSave) 
     
    605591            # add menu of other plugins 
    606592            item_list = self.parent.get_current_context_menu(self) 
    607  
    608593            if (not item_list == None) and (not len(item_list) == 0): 
    609                 for item in item_list: 
     594                # Note: reusing menu ids in submenu.  This code works because 
     595                # IdItems is set up as a lazy iterator returning each id in 
     596                # sequence, creating new ids as needed so it never runs out. 
     597                # zip() is set up to stop when any iterator is empty, so it 
     598                # only asks for the number of ids in item_list. 
     599                for item, wx_id in zip(item_list, self._menu_ids): 
    610600 
    611601                    try: 
    612                         wx_id = self._menu_ids.next() 
    613602                        plot_menu.Append(wx_id, item[0], name) 
    614603                        wx.EVT_MENU(self, wx_id, item[2]) 
     
    620609 
    621610            if self.parent.ClassName.count('wxDialog') == 0: 
    622                 wx_id = self._menu_ids.next() 
     611                wx_id = ids.next() 
    623612                plot_menu.Append(wx_id, '&Linear Fit', name) 
    624613                wx.EVT_MENU(self, wx_id, self.onFitting) 
    625614                plot_menu.AppendSeparator() 
    626615 
    627                 wx_id = self._menu_ids.next() 
     616                wx_id = ids.next() 
    628617                plot_menu.Append(wx_id, "Remove", name) 
    629618                wx.EVT_MENU(self, wx_id, self._onRemove) 
    630619                if not plot.is_data: 
    631                     wx_id = self._menu_ids.next() 
     620                    wx_id = ids.next() 
    632621                    plot_menu.Append(wx_id, '&Freeze', name) 
    633622                    wx.EVT_MENU(self, wx_id, self.onFreeze) 
     
    635624 
    636625                if plot.is_data: 
    637                     wx_id = self._menu_ids.next() 
     626                    wx_id = ids.next() 
    638627                    self.hide_menu = plot_menu.Append(wx_id, "Hide Error Bar", name) 
    639628 
     
    649638                    plot_menu.AppendSeparator() 
    650639 
    651                 wx_id = self._menu_ids.next() 
     640                wx_id = ids.next() 
    652641                plot_menu.Append(wx_id, '&Modify Plot Property', name) 
    653642                wx.EVT_MENU(self, wx_id, self.createAppDialog) 
    654             wx_id = self._menu_ids.next() 
     643            wx_id = ids.next() 
    655644            # plot_menu.SetTitle(name) 
    656645            self._slicerpop.AppendMenu(wx_id, '&%s' % name, plot_menu) 
     
    661650            loc_menu = wx.Menu() 
    662651            for label in self._loc_labels: 
    663                 wx_id = self._menu_ids.next() 
     652                wx_id = ids.next() 
    664653                loc_menu.Append(wx_id, str(label), str(label)) 
    665654                wx.EVT_MENU(self, wx_id, self.onChangeLegendLoc) 
    666655 
    667             wx_id = self._menu_ids.next() 
     656            wx_id = ids.next() 
    668657            self._slicerpop.Append(wx_id, '&Modify Graph Appearance', 
    669658                                   'Modify graph appearance') 
     
    673662 
    674663            if self.position != None: 
    675                 wx_id = self._menu_ids.next() 
     664                wx_id = ids.next() 
    676665                self._slicerpop.Append(wx_id, '&Add Text') 
    677666                wx.EVT_MENU(self, wx_id, self._on_addtext) 
    678                 wx_id = self._menu_ids.next() 
     667                wx_id = ids.next() 
    679668                self._slicerpop.Append(wx_id, '&Remove Text') 
    680669                wx.EVT_MENU(self, wx_id, self._on_removetext) 
    681670                self._slicerpop.AppendSeparator() 
    682             wx_id = self._menu_ids.next() 
     671            wx_id = ids.next() 
    683672            self._slicerpop.Append(wx_id, '&Change Scale') 
    684673            wx.EVT_MENU(self, wx_id, self._onProperties) 
    685674            self._slicerpop.AppendSeparator() 
    686             wx_id = self._menu_ids.next() 
     675            wx_id = ids.next() 
    687676            self._slicerpop.Append(wx_id, '&Reset Graph Range') 
    688677            wx.EVT_MENU(self, wx_id, self.onResetGraph) 
     
    690679            if self.parent.ClassName.count('wxDialog') == 0: 
    691680                self._slicerpop.AppendSeparator() 
    692                 wx_id = self._menu_ids.next() 
     681                wx_id = ids.next() 
    693682                self._slicerpop.Append(wx_id, '&Window Title') 
    694683                wx.EVT_MENU(self, wx_id, self.onChangeCaption) 
  • src/sas/guiframe/local_perspectives/plotting/Plotter2D.py

    r2d88fc4 r6f16e25  
    287287 
    288288        """ 
    289         self._menu_ids.reset() 
     289        ids = iter(self._menu_ids) 
    290290        slicerpop = PanelMenu() 
    291291        slicerpop.set_plots(self.plots) 
    292292        slicerpop.set_graph(self.graph) 
    293293 
    294         wx_id = self._menu_ids.next() 
     294        wx_id = ids.next() 
    295295        slicerpop.Append(wx_id, '&Save Image') 
    296296        wx.EVT_MENU(self, wx_id, self.onSaveImage) 
    297297 
    298         wx_id = self._menu_ids.next() 
     298        wx_id = ids.next() 
    299299        slicerpop.Append(wx_id, '&Print Image', 'Print image') 
    300300        wx.EVT_MENU(self, wx_id, self.onPrint) 
    301301 
    302         wx_id = self._menu_ids.next() 
     302        wx_id = ids.next() 
    303303        slicerpop.Append(wx_id, '&Copy to Clipboard', 'Copy to the clipboard') 
    304304        wx.EVT_MENU(self, wx_id, self.OnCopyFigureMenu) 
     
    306306        # saving data 
    307307        plot = self.data2D 
    308         wx_id = self._menu_ids.next() 
     308        wx_id = ids.next() 
    309309        slicerpop.Append(wx_id, "&Data Info") 
    310310        wx.EVT_MENU(self, wx_id, self._onDataShow) 
    311311 
    312         wx_id = self._menu_ids.next() 
     312        wx_id = ids.next() 
    313313        slicerpop.Append(wx_id, "&Save as a File (DAT)") 
    314314        self.action_ids[str(wx_id)] = plot 
     
    321321                self.data2D.name.split(" ")[0] != 'Residuals': 
    322322                # The line above; Not for trunk 
    323                 for item in item_list: 
     323                # Note: reusing menu ids for the sub-menus.  See Plotter1D. 
     324                for item, wx_id in zip(item_list, self._menu_ids): 
    324325                    try: 
    325                         wx_id = self._menu_ids.next() 
    326326                        slicerpop.Append(wx_id, item[0], item[1]) 
    327327                        wx.EVT_MENU(self, wx_id, item[2]) 
     
    332332                slicerpop.AppendSeparator() 
    333333 
    334             wx_id = self._menu_ids.next() 
     334            wx_id = ids.next() 
    335335            slicerpop.Append(wx_id, '&Perform Circular Average') 
    336336            wx.EVT_MENU(self, wx_id, self.onCircular) \ 
    337337            # For Masked Data 
    338338            if not plot.mask.all(): 
    339                 wx_id = self._menu_ids.next() 
     339                wx_id = ids.next() 
    340340                slicerpop.Append(wx_id, '&Masked Circular Average') 
    341341                wx.EVT_MENU(self, wx_id, self.onMaskedCircular) 
    342             wx_id = self._menu_ids.next() 
     342            wx_id = ids.next() 
    343343            slicerpop.Append(wx_id, '&Sector [Q View]') 
    344344            wx.EVT_MENU(self, wx_id, self.onSectorQ) 
    345             wx_id = self._menu_ids.next() 
     345            wx_id = ids.next() 
    346346            slicerpop.Append(wx_id, '&Annulus [Phi View ]') 
    347347            wx.EVT_MENU(self, wx_id, self.onSectorPhi) 
    348             wx_id = self._menu_ids.next() 
     348            wx_id = ids.next() 
    349349            slicerpop.Append(wx_id, '&Box Sum') 
    350350            wx.EVT_MENU(self, wx_id, self.onBoxSum) 
    351             wx_id = self._menu_ids.next() 
     351            wx_id = ids.next() 
    352352            slicerpop.Append(wx_id, '&Box Averaging in Qx') 
    353353            wx.EVT_MENU(self, wx_id, self.onBoxavgX) 
    354             wx_id = self._menu_ids.next() 
     354            wx_id = ids.next() 
    355355            slicerpop.Append(wx_id, '&Box Averaging in Qy') 
    356356            wx.EVT_MENU(self, wx_id, self.onBoxavgY) 
    357357            if self.slicer != None: 
    358                 wx_id = self._menu_ids.next() 
     358                wx_id = ids.next() 
    359359                slicerpop.Append(wx_id, '&Clear Slicer') 
    360360                wx.EVT_MENU(self, wx_id, self.onClearSlicer) 
    361361                if self.slicer.__class__.__name__ != "BoxSum": 
    362                     wx_id = self._menu_ids.next() 
     362                    wx_id = ids.next() 
    363363                    slicerpop.Append(wx_id, '&Edit Slicer Parameters') 
    364364                    wx.EVT_MENU(self, wx_id, self._onEditSlicer) 
    365365            slicerpop.AppendSeparator() 
    366366 
    367         wx_id = self._menu_ids.next() 
     367        wx_id = ids.next() 
    368368        slicerpop.Append(wx_id, '&Edit Graph Label', 'Edit Graph Label') 
    369369        wx.EVT_MENU(self, wx_id, self.onEditLabels) 
     
    372372        # ILL mod here 
    373373 
    374         wx_id = self._menu_ids.next() 
     374        wx_id = ids.next() 
    375375        slicerpop.Append(wx_id, '&Modify graph appearance', 'Modify graph appearance') 
    376376        wx.EVT_MENU(self, wx_id, self.modifyGraphAppearance) 
    377377        slicerpop.AppendSeparator() 
    378378 
    379         wx_id = self._menu_ids.next() 
     379        wx_id = ids.next() 
    380380        slicerpop.Append(wx_id, '&2D Color Map') 
    381381        wx.EVT_MENU(self, wx_id, self._onEditDetector) 
    382382        slicerpop.AppendSeparator() 
    383383 
    384         wx_id = self._menu_ids.next() 
     384        wx_id = ids.next() 
    385385        slicerpop.Append(wx_id, '&Toggle Linear/Log Scale') 
    386386        wx.EVT_MENU(self, wx_id, self._onToggleScale) 
    387387 
    388388        slicerpop.AppendSeparator() 
    389         wx_id = self._menu_ids.next() 
     389        wx_id = ids.next() 
    390390        slicerpop.Append(wx_id, '&Window Title') 
    391391        wx.EVT_MENU(self, wx_id, self.onChangeCaption) 
  • src/sas/guiframe/utils.py

    r79492222 r6f16e25  
    123123    return begin_flag, end_flag 
    124124 
     125class IdList: 
     126    """ 
     127    Create a list of wx ids that can be reused. 
     128 
     129    Ids for items need to be unique within their context.  In a dynamic 
     130    application where the number of ids needed different each time the 
     131    form is created, depending for example, on the number of items that 
     132    need to be shown in the context menu, you cannot preallocate the 
     133    ids that you are going to use for the form.  Instead, you can use 
     134    an IdList, which will reuse ids from context to context, adding new 
     135    ones if the new context requires more than a previous context. 
     136 
     137    IdList is set up as an iterator, which returns new ids forever 
     138    or until it runs out.  This makes it pretty useful for defining 
     139    menus:: 
     140 
     141        class Form(wx.Dialog): 
     142            _form_id_pool = IdList() 
     143            def __init__(self): 
     144                ... 
     145                menu = wx.Menu() 
     146                for item, wx_id in zip(menu_items, self._form_id_pool): 
     147                    name, description, callback = item 
     148                    menu.Append(wx_id, name, description) 
     149                    wx.EVT_MENU(self, wx_id, callback) 
     150                ... 
     151 
     152    It is a little unusual to use an iterator outside of a loop, but it is 
     153    supported. For example, when defining a form, your class definition 
     154    might look something like:: 
     155 
     156        class Form(wx.Dialog): 
     157            _form_id_pool = IdList() 
     158            def __init__(self, pairs, ...): 
     159                ids = iter(_form_id_pool) 
     160                ... 
     161                wx.StaticText(self, ids.next(), "Some key-value pairs") 
     162                for name, value in pairs: 
     163                    label = wx.StaticText(self, ids.next(), name) 
     164                    input = wx.TextCtrl(self, ids.next(), value=str(value)) 
     165                    ... 
     166                ... 
     167 
     168    If the dialog is really dynamic, and not defined all in one place, then 
     169    save the id list iterator as *self._ids = iter(_form_id_pool)* in the 
     170    constructor. 
     171 
     172    The wx documentation is not clear on whether ids need to be unique. 
     173    Clearly different dialogs can use the same ids, as this is done for the 
     174    standard button ids such as wx.ID_HELP.  Presumably each widget on the 
     175    form needs its own id, but whether these ids can match the ids of menu 
     176    items is not indicated, or whether different submenus need their own 
     177    ids.  Using different id lists for menu items and widgets is safest, 
     178    but probably not necessary.  And what about notebook tabs.  Do the 
     179    ids need to be unique across all tabs? 
     180    """ 
     181    def __init__(self): 
     182        self._ids = [] 
     183    def __iter__(self): 
     184        return _IdListIterator(self) 
     185    def __getitem__(self, index): 
     186        while index >= len(self._ids): 
     187            self._ids.append(wx.NewId()) 
     188        return self._ids[index] 
     189 
     190class _IdListIterator: 
     191    def __init__(self, id_list): 
     192        self.id_list = id_list 
     193        self.index = -1 
     194    def next(self): 
     195        self.index += 1 
     196        return self.id_list[self.index] 
     197 
Note: See TracChangeset for help on using the changeset viewer.