source: sasview/src/sas/sasgui/guiframe/utils.py @ 3ec78a1

Last change on this file since 3ec78a1 was 5251ec6, checked in by Paul Kienzle <pkienzle@…>, 6 years ago

improved support for py37 in sasgui

  • Property mode set to 100644
File size: 6.3 KB
Line 
1"""
2Contains common classes and functions
3"""
4import wx
5import re
6
7def parse_name(name, expression):
8    """
9    remove "_" in front of a name
10    """
11    if re.match(expression, name) is not None:
12        word = re.split(expression, name, 1)
13        for item in word:           
14            if item.lstrip().rstrip() != '':
15                return item
16    else:
17        return name
18def format_number(value, high=False):
19    """
20    Return a float in a standardized, human-readable formatted string
21    """
22    try: 
23        value = float(value)
24    except:
25        output = "NaN"
26        return output.lstrip().rstrip()
27    if high:
28        output = "%-7.5g" % value
29    else:
30        output = "%-5.3g" % value
31    return output.lstrip().rstrip()
32
33def check_float(item):
34    """
35    :param item: txtcrtl containing a value
36    """
37    flag = True
38    try:
39        mini = float(item.GetValue())
40        item.SetBackgroundColour(wx.WHITE)
41        item.Refresh()
42    except:
43        flag = False
44        item.SetBackgroundColour("pink")
45        item.Refresh()
46    return flag
47
48
49def check_int(item):
50    """
51    :param item: txtcrtl containing a value
52    """
53    flag = True
54    try:
55        mini = int(item.GetValue())
56        item.SetBackgroundColour(wx.WHITE)
57        item.Refresh()
58    except:
59        flag = False
60        item.SetBackgroundColour("pink")
61        item.Refresh()
62    return flag
63
64
65class PanelMenu(wx.Menu):
66    """
67    """
68    plots = None
69    graph = None
70   
71    def set_plots(self, plots):
72        """
73        """
74        self.plots = plots
75   
76    def set_graph(self, graph):
77        """
78        """
79        self.graph = graph
80       
81
82def split_list(separator, mylist, n=0):
83    """
84    returns a list of string without white space of separator
85   
86    :param separator: the string to remove
87   
88    """
89    list = []
90    for item in mylist:
91        if re.search(separator,item)is not None:
92            if n > 0:
93                word = re.split(separator, item, int(n))
94            else:
95                word = re.split(separator, item)
96            for new_item in word: 
97                if new_item.lstrip().rstrip() != '':
98                    list.append(new_item.lstrip().rstrip())
99    return list
100
101def split_text(separator, string1, n=0):
102    """
103    return a list of string without white space of separator
104   
105    :param separator: the string to remove
106   
107    """
108    list = []
109    if re.search(separator, string1) is not None:
110        if n > 0:
111            word = re.split(separator,string1,int(n))
112        else:
113            word = re.split(separator,string1)
114        for item in word: 
115            if item.lstrip().rstrip() != '':
116                list.append(item.lstrip().rstrip())
117    return list
118
119def look_for_tag(string1, begin, end=None):
120    """
121    this method  remove the begin and end tags given by the user
122    from the string .
123   
124    :param begin: the initial tag
125    :param end: the final tag
126    :param string: the string to check
127   
128    :return: begin_flag==True if begin was found,
129     end_flag==if end was found else return false, false
130     
131    """
132    begin_flag = False
133    end_flag = False
134    if  re.search(begin,string1) is not None:
135        begin_flag = True
136    if end  is not None:
137        if  re.search(end,string1) is not None:
138            end_flag = True
139    return begin_flag, end_flag
140
141class IdList:
142    """
143    Create a list of wx ids that can be reused.
144
145    Ids for items need to be unique within their context.  In a dynamic
146    application where the number of ids needed different each time the
147    form is created, depending for example, on the number of items that
148    need to be shown in the context menu, you cannot preallocate the
149    ids that you are going to use for the form.  Instead, you can use
150    an IdList, which will reuse ids from context to context, adding new
151    ones if the new context requires more than a previous context.
152
153    IdList is set up as an iterator, which returns new ids forever
154    or until it runs out.  This makes it pretty useful for defining
155    menus::
156
157        class Form(wx.Dialog):
158            _form_id_pool = IdList()
159            def __init__(self):
160                ...
161                menu = wx.Menu()
162                for item, wx_id in zip(menu_items, self._form_id_pool):
163                    name, description, callback = item
164                    menu.Append(wx_id, name, description)
165                    wx.EVT_MENU(self, wx_id, callback)
166                ...
167
168    It is a little unusual to use an iterator outside of a loop, but it is
169    supported. For example, when defining a form, your class definition
170    might look something like::
171
172        class Form(wx.Dialog):
173            _form_id_pool = IdList()
174            def __init__(self, pairs, ...):
175                ids = iter(_form_id_pool)
176                ...
177                wx.StaticText(self, ids.next(), "Some key-value pairs")
178                for name, value in pairs:
179                    label = wx.StaticText(self, ids.next(), name)
180                    input = wx.TextCtrl(self, ids.next(), value=str(value))
181                    ...
182                ...
183
184    If the dialog is really dynamic, and not defined all in one place, then
185    save the id list iterator as *self._ids = iter(_form_id_pool)* in the
186    constructor.
187
188    The wx documentation is not clear on whether ids need to be unique.
189    Clearly different dialogs can use the same ids, as this is done for the
190    standard button ids such as wx.ID_HELP.  Presumably each widget on the
191    form needs its own id, but whether these ids can match the ids of menu
192    items is not indicated, or whether different submenus need their own
193    ids.  Using different id lists for menu items and widgets is safest,
194    but probably not necessary.  And what about notebook tabs.  Do the
195    ids need to be unique across all tabs?
196    """
197    def __init__(self):
198        self._ids = []
199    def __iter__(self):
200        return _IdListIterator(self)
201    def __getitem__(self, index):
202        while index >= len(self._ids):
203            self._ids.append(wx.NewId())
204        return self._ids[index]
205
206class _IdListIterator:
207    def __init__(self, id_list):
208        self.id_list = id_list
209        self.index = -1
210    def __next__(self):
211        self.index += 1
212        return self.id_list[self.index]
213    # CRUFT: python 2 uses next rather than __next__ for iterator
214    next = __next__
215
Note: See TracBrowser for help on using the repository browser.