source: trunk/GSASIIElemGUI.py @ 2195

Last change on this file since 2195 was 1972, checked in by toby, 10 years ago

Element selection workaround for wx>2.8 on mac

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 13.8 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2015-09-16 22:35:18 +0000 (Wed, 16 Sep 2015) $
4# $Author: vondreele $
5# $Revision: 1972 $
6# $URL: trunk/GSASIIElemGUI.py $
7# $Id: GSASIIElemGUI.py 1972 2015-09-16 22:35:18Z vondreele $
8########### SVN repository information ###################
9'''
10*GSASIIElemGUI: GUI to select and delete element lists*
11-------------------------------------------------------
12
13Module to select elements from a periodic table and
14to delete an element from a list of selected elements.
15'''
16"""ElementGUI: class defn. for element GUIs
17   Copyright: 2008, Robert B. Von Dreele & Brian H. Toby (Argonne National Laboratory)
18"""
19
20import GSASIIpath
21GSASIIpath.SetVersionNumber("$Revision: 1972 $")
22import wx
23import os
24import wx.lib.colourselect as wscs
25class PickElement(wx.Dialog):
26    "Makes periodic table widget for picking element - caller maintains element list"
27    Elem=None
28    def _init_ctrls(self, prnt):
29        wx.Dialog.__init__(self, id=-1, name='PickElement',
30              parent=prnt, pos=wx.DefaultPosition, 
31              style=wx.DEFAULT_DIALOG_STYLE, title='Pick Element')
32        import ElementTable as ET
33        self.butWid = 60
34        if 'nt' in os.name:
35            self.butWid = 40
36        self.SetClientSize(wx.Size(50+18*self.butWid, 250))
37       
38        i=0
39        for E in ET.ElTable:
40            if E[1] < 0: continue
41            if self.oneOnly:
42                color=E[4]
43            else:
44                color=E[6]
45            self.ElButton(name=E[0],
46               pos=wx.Point(E[1]*self.butWid+25,E[2]*24+24),
47               tip=E[3],color=color)
48            i+=1
49
50    def __init__(self, parent,oneOnly=False,ifNone=False):
51        'Needs a doc string'
52        self.oneOnly = oneOnly
53        self.ifNone = ifNone
54        self._init_ctrls(parent)
55       
56    def ElButton(self, name, pos, tip, color):
57        'Creates an element button widget'
58        Black = wx.Colour(0,0,0)
59        if not self.ifNone and name[0] == 'None':
60            return
61        if self.oneOnly:
62            El = wscs.ColourSelect(label=name[0], parent=self,colour=color,
63                pos=pos, size=wx.Size(self.butWid,23), style=wx.RAISED_BORDER)
64            El.Bind(wx.EVT_BUTTON, self.OnElButton)
65        else:
66            butWid = self.butWid
67            if name[0] == 'None':
68                butWid *= 2
69            # patch for wx 2.9+ on Mac where EVT_COMBOBOX happens only on
70            # value change. Not ideal because wx.CB_READONLY is better.
71            i,j= wx.__version__.split('.')[0:2]
72            if int(i)+int(j)/10. > 2.8 and 'wxOSX' in wx.PlatformInfo:
73
74                El = wx.ComboBox(choices=name, parent=self, pos=pos, size=wx.Size(butWid,23),
75                    style=wx.CB_DROPDOWN, value=name[0]+' ') # add an invisible space
76            else:
77                El = wx.ComboBox(choices=name, parent=self, pos=pos, size=wx.Size(butWid,23),
78                    style=wx.CB_READONLY, value=name[0]) 
79            El.Bind(wx.EVT_COMBOBOX,self.OnElButton)
80       
81        El.SetBackgroundColour(color)
82        El.SetToolTipString(tip)
83
84    def OnElButton(self, event):
85        if self.oneOnly:
86            El = event.GetEventObject().GetLabel()
87        else:
88            El = event.GetEventObject().GetValue()
89        self.Elem = El
90        self.EndModal(wx.ID_OK)       
91       
92class PickElements(wx.Dialog):
93    """Makes periodic table widget for picking elements - caller maintains element list"""
94    Elem = []
95    def _init_ctrls(self, prnt,list):
96        wx.Dialog.__init__(self, id=-1, name='PickElements',
97              parent=prnt, pos=wx.DefaultPosition, size=wx.Size(580, 360),
98              style=wx.DEFAULT_DIALOG_STYLE, title='Pick Elements')
99        panel = wx.Panel(self)
100       
101        REcolor = wx.Colour(128, 128, 255)
102        Metcolor = wx.Colour(192, 192, 192)
103        Noblecolor = wx.Colour(255, 128, 255)
104        Alkcolor = wx.Colour(255, 255, 128)
105        AlkEcolor = wx.Colour(255, 128, 0)
106        SemMetcolor = wx.Colour(128, 255, 0)
107        NonMetcolor = wx.Colour(0, 255, 255)
108        White = wx.Colour(255, 255, 255)
109        self.Elem = []
110        for El in list:
111            self.Elem.append(El.lower().capitalize())
112       
113        self.ElTable = [
114            ("H",   0,0, "Hydrogen",    White,           0.0000),
115            ("He", 17,0, "Helium",      Noblecolor,      0.0000),
116            ("Li",  0,1, "Lithium",     Alkcolor,        0.0004),
117            ("Be",  1,1, "Beryllium",   AlkEcolor,       0.0006),
118            ("B",  12,1, "Boron",       NonMetcolor,     0.0012),
119            ("C",  13,1, "Carbon",      NonMetcolor,     0.0018),
120            ("N",  14,1, "Nitrogen",    NonMetcolor,     0.0030),
121            ("O",  15,1, "Oxygen",      NonMetcolor,     0.0042),
122            ("F",  16,1, "Fluorine",    NonMetcolor,     0.0054),
123            ("Ne", 17,1, "Neon",        Noblecolor,      0.0066),
124            ("Na",  0,2, "Sodium",      Alkcolor,        0.0084),
125            ("Mg",  1,2, "Magnesium",   AlkEcolor,       0.0110),
126            ("Al", 12,2, "Aluminum",    SemMetcolor,     0.0125),
127            ("Si", 13,2, "Silicon",     NonMetcolor,     0.0158),
128            ("P",  14,2, "Phosphorus",  NonMetcolor,     0.0180),
129            ("S",  15,2, "Sulphur",     NonMetcolor,     0.0210),
130            ("Cl", 16,2, "Chlorine",    NonMetcolor,     0.0250),
131            ("Ar", 17,2, "Argon",       Noblecolor,      0.0285),
132            ("K",   0,3, "Potassium",   Alkcolor,        0.0320),
133            ("Ca",  1,3, "Calcium",     AlkEcolor,       0.0362),
134            ("Sc",  2,3, "Scandium",    Metcolor,        0.0410),
135            ("Ti",  3,3, "Titanium",    Metcolor,        0.0460),
136            ("V",   4,3, "Vanadium",    Metcolor,        0.0510),
137            ("Cr",  5,3, "Chromium",    Metcolor,        0.0560),
138            ("Mn",  6,3, "Manganese",   Metcolor,        0.0616),
139            ("Fe",  7,3, "Iron",        Metcolor,        0.0680),
140            ("Co",  8,3, "Cobalt",      Metcolor,        0.0740),
141            ("Ni",  9,3, "Nickel",      Metcolor,        0.0815),
142            ("Cu", 10,3, "Copper",      Metcolor,        0.0878),
143            ("Zn", 11,3, "Zinc",        Metcolor,        0.0960),
144            ("Ga", 12,3, "Gallium",     SemMetcolor,      0.104),
145            ("Ge", 13,3, "Germanium",   SemMetcolor,      0.114),
146            ("As", 14,3, "Arsenic",     NonMetcolor,      0.120),
147            ("Se", 15,3, "Selenium",    NonMetcolor,      0.132),
148            ("Br", 16,3, "Bromine",     NonMetcolor,      0.141),
149            ("Kr", 17,3, "Krypton",     Noblecolor,       0.150),
150            ("Rb",  0,4, "Rubidium",    Alkcolor,         0.159),
151            ("Sr",  1,4, "Strontium",   AlkEcolor,        0.171),
152            ("Y",   2,4, "Yittrium",    Metcolor,         0.180),
153            ("Zr",  3,4, "Zirconium",   Metcolor,         0.192),
154            ("Nb",  4,4, "Niobium",     Metcolor,         0.204),
155            ("Mo",  5,4, "Molybdenium", Metcolor,         0.216),
156            ("Tc",  6,4, "Technetium",  Metcolor,         0.228),
157            ("Ru",  7,4, "Ruthenium",   Metcolor,         0.246),
158            ("Rh",  8,4, "Rhodium",     Metcolor,         0.258),
159            ("Pd",  9,4, "Palladium",   Metcolor,         0.270),
160            ("Ag", 10,4, "Silver",      Metcolor,         0.285),
161            ("Cd", 11,4, "Cadmium",     Metcolor,         0.300),
162            ("In", 12,4, "Indium",      SemMetcolor,      0.318),
163            ("Sn", 13,4, "Tin",         SemMetcolor,      0.330),
164            ("Sb", 14,4, "Antimony",    SemMetcolor,      0.348),
165            ("Te", 15,4, "Tellurium",   NonMetcolor,      0.363),
166            ("I",  16,4, "Iodine",      NonMetcolor,      0.384),
167            ("Xe", 17,4, "Xenon",       Noblecolor,       0.396),
168            ("Cs",  0,5, "Caesium",     Alkcolor,         0.414),
169            ("Ba",  1,5, "Barium",      AlkEcolor,        0.438),
170            ("La",  2,5, "Lanthanium",  Metcolor,         0.456),
171            ("Ce",  3.5,6.5, "Cerium",      REcolor,      0.474),
172            ("Pr",  4.5,6.5, "Praseodymium",REcolor,      0.492),
173            ("Nd",  5.5,6.5, "Neodymium",   REcolor,      0.516),
174            ("Pm",  6.5,6.5, "Promethium",  REcolor,      0.534),
175            ("Sm",  7.5,6.5, "Samarium",    REcolor,      0.558),
176            ("Eu",  8.5,6.5, "Europium",    REcolor,      0.582),
177            ("Gd",  9.5,6.5, "Gadolinium",  REcolor,      0.610),
178            ("Tb", 10.5,6.5, "Terbium",     REcolor,      0.624),
179            ("Dy", 11.5,6.5, "Dysprosium",  REcolor,      0.648),
180            ("Ho", 12.5,6.5, "Holmium",     REcolor,      0.672),
181            ("Er", 13.5,6.5, "Erbium",      REcolor,      0.696),
182            ("Tm", 14.5,6.5, "Thulium",     REcolor,      0.723),
183            ("Yb", 15.5,6.5, "Ytterbium",   REcolor,      0.750),
184            ("Lu", 16.5,6.5, "Lutetium",    REcolor,      0.780),
185            ("Hf",  3,5, "Hafnium",     Metcolor,         0.804),
186            ("Ta",  4,5, "Tantalum",    Metcolor,         0.834),
187            ("W",   5,5, "Tungsten",    Metcolor,         0.864),
188            ("Re",  6,5, "Rhenium",     Metcolor,         0.900),
189            ("Os",  7,5, "Osmium",      Metcolor,         0.919),
190            ("Ir",  8,5, "Iridium",     Metcolor,         0.948),
191            ("Pt",  9,5, "Platinium",   Metcolor,         0.984),
192            ("Au", 10,5, "Gold",        Metcolor,         1.014),
193            ("Hg", 11,5, "Mercury",     Metcolor,         1.046),
194            ("Tl", 12,5, "Thallium",    SemMetcolor,      1.080),
195            ("Pb", 13,5, "Lead",        SemMetcolor,      1.116),
196            ("Bi", 14,5, "Bismuth",     SemMetcolor,      1.149),
197            ("Po", 15,5, "Polonium",    SemMetcolor,      1.189),
198            ("At", 16,5, "Astatine",    NonMetcolor,      1.224),
199            ("Rn", 17,5, "Radon",       Noblecolor,       1.260),
200            ("Fr",  0,6, "Francium",    Alkcolor,         1.296),
201            ("Ra",  1,6, "Radium",      AlkEcolor,        1.332),
202            ("Ac",  2,6, "Actinium",    Metcolor,         1.374),
203            ("Th",  3.5,7.5, "Thorium",     REcolor,      1.416),
204            ("Pa",  4.5,7.5, "Protactinium",REcolor,      1.458),
205            ("U",   5.5,7.5, "Uranium",     REcolor,      1.470),
206            ("Np",  6.5,7.5, "Neptunium",   REcolor,      1.536),
207            ("Pu",  7.5,7.5, "Plutonium",   REcolor,      1.584),
208            ("Am",  8.5,7.5, "Americium",   REcolor,      1.626),
209            ("Cm",  9.5,7.5, "Curium",      REcolor,      1.669),
210            ("Bk", 10.5,7.5, "Berkelium",   REcolor,      1.716),
211            ("Cf", 11.5,7.5, "Californium", REcolor,      1.764)]
212           
213        mainSizer = wx.BoxSizer(wx.VERTICAL)
214        elPanel = wx.Panel(panel)
215           
216        i=0
217        for E in self.ElTable:
218            PickElements.ElButton(self,parent=elPanel,name=E[0],
219                pos=wx.Point(E[1]*30+20,E[2]*30+25),tip=E[3],color=E[4])
220            i+=1
221        mainSizer.Add(elPanel,0,wx.EXPAND)
222        mainSizer.Add((10,10),0)
223       
224        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
225        OkBtn = wx.Button(panel,-1,"Ok")
226        OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
227        cancelBtn = wx.Button(panel,-1,"Cancel")
228        cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
229        btnSizer.Add((20,20),1)
230        btnSizer.Add(OkBtn)
231        btnSizer.Add((20,20),1)
232        btnSizer.Add(cancelBtn)
233        btnSizer.Add((20,20),1)
234        mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM, 10)
235        panel.SetSizer(mainSizer)
236        panel.Fit()
237                 
238    def OnOk(self,event):
239        if self.Elem:
240            self.EndModal(wx.ID_OK)
241        else:       
242            self.EndModal(wx.ID_CANCEL)       
243       
244    def OnCancel(self,event):
245        self.EndModal(wx.ID_CANCEL)       
246
247    def __init__(self, parent,list):
248        self._init_ctrls(parent,list)
249       
250    def ElButton(self, parent, name, pos, tip, color):
251        Black = wx.Colour(0,0,0)
252        if name in self.Elem:
253            color = Black
254        El = wscs.ColourSelect(label=name, parent=parent,colour=color,
255            pos=pos, size=wx.Size(32, 32), style=wx.RAISED_BORDER)
256        El.SetBackgroundColour(color)
257        El.SetLabel(name)
258        El.SetToolTipString(tip)
259        El.Bind(wx.EVT_BUTTON, self.OnElButton)
260
261    def OnElButton(self, event):
262        Black = wx.Colour(0,0,0)
263        btn = event.GetEventObject()
264        El = btn.GetLabel()
265        if btn.GetColour() != Black:
266            for Elem in self.ElTable:
267                if El in Elem:
268                    ElColor = Elem[4]
269            if El in self.Elem:
270                btn.SetColour(ElColor)
271                self.Elem.remove(El)
272            else:
273                btn.SetColour(wx.Colour(255,0,0))
274                self.Elem.append(El)
275       
276class DeleteElement(wx.Dialog):
277    "Delete element from selected set widget"
278    def _init_ctrls(self, parent,choice):
279        l = len(choice)-1
280        wx.Dialog.__init__(self, id=-1, name='Delete', parent=parent, 
281              pos=wx.DefaultPosition, size=wx.Size(max(128,64+l*24), 87),
282              style=wx.DEFAULT_DIALOG_STYLE, title='Delete Element')
283        self.Show(True)
284        self.SetAutoLayout(True)
285        self.SetHelpText('Select element to delete')
286        self.SetWindowVariant(wx.WINDOW_VARIANT_SMALL)
287
288        i = 0
289        Elem = []
290        for Elem in choice:
291            self.ElButton(id=-1,name=Elem,pos=wx.Point(16+i*24, 16))
292            i+=1
293             
294    def __init__(self, parent,choice):
295        DeleteElement.El = ' '
296        self._init_ctrls(parent,choice)
297
298    def ElButton(self, id, name, pos):
299        'Needs a doc string'
300        White = wx.Colour(255, 255, 255)
301        El = wscs.ColourSelect(label=name, parent=self, colour = White,
302            pos=pos, size=wx.Size(24, 23), style=wx.RAISED_BORDER)
303        El.Bind(wx.EVT_BUTTON, self.OnDeleteButton)
304   
305    def OnDeleteButton(self, event):
306        DeleteElement.El=event.GetEventObject().GetLabel()
307        self.EndModal(wx.ID_OK)
308       
309    def GetDeleteElement(self):
310        return DeleteElement.El
311       
312
Note: See TracBrowser for help on using the repository browser.