forked from AustralianSynchrotron/pdviper
/
wavelength_editor.py
158 lines (131 loc) · 5.22 KB
/
wavelength_editor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
from traits.api import Str, List, Enum, Bool, Float, HasTraits, on_trait_change, Instance, \
Event
from traitsui.api import View, Item, TableEditor, EnumEditor, Group, VGroup, HGroup, \
Handler,Action
from traitsui.table_column import ObjectColumn
from fixes import fix_background_color
from processing_rescale import rescale_xye_datasets, write_xye_datasets
from traitsui.menu import CancelButton
fix_background_color()
# Note - to get window to autoclose, apparently do this:
# https://mail.enthought.com/pipermail/enthought-dev/2011-February/028509.html
#class ClosingHandler(Handler):
# def object_bt_rescale_changed(self, info):
# new_wui = WavelengthEditor(datasets=info.object.datasets, filename_field=info.object.filename_field)
# new_wui.edit_traits()
# # rescale all x's between theta/d/Q
# rescale_xye_datasets(self.datasets, self.target_value, self.convert_from, self.convert_to)
# write_xye_datasets(self.datasets, self.filename_field)
# # disable rescale button
# info.ui.dispose()
class WavelengthUI(HasTraits):
name = Str('')
x = Float(1.0)
dataset = Instance(object)
traits_view = View(
Item('name'),
Item(ur'\u200Bx'),
)
class WavelengthColumn(ObjectColumn):
pass
class WavelengthEditorHandler(Handler):
def do_rescale(self,info):
rescale_xye_datasets(info.object.datasets, info.object.target_value, info.object.convert_from, info.object.convert_to)
write_xye_datasets(info.object.datasets, info.object.filename_field)
# disable rescale button
#info.object.can_rescale = False
info.ui.dispose()
return
class WavelengthEditor(HasTraits):
datasets = List(WavelengthUI)
filename_field = Str
selected = List(WavelengthUI)
can_rescale = Bool(True)
x = Float(1.0)
target_value = Float(1.0)
#bt_rescale = Button("Rescale")
convert_from = Enum('theta', 'd', 'Q')('theta')
convert_to = Enum('theta', 'd', 'Q')('d')
table_click = Event
wavelength_editor = TableEditor(
auto_size=True,
selection_mode='rows',
sortable=False,
configurable=False,
editable=True,
edit_on_first_click=False,
cell_bg_color='white',
label_bg_color=(232,232,232),
selection_bg_color=(232,232,232),
columns=[
WavelengthColumn(name='name', cell_color='white', editable=False, width=0.9),
WavelengthColumn(name='x'),
]
)
rescale = Action(name = "Rescale",
action = "do_rescale")
traits_view = View(
VGroup(
Item('datasets', editor=wavelength_editor, show_label=False),
VGroup(
Item('x', label='Modify selected X:'),
HGroup(
Item('target_value'),
Group(
Item('convert_from',
style='custom',
editor=EnumEditor(values={
'theta' : ur'1:\u0398',
'd' : ur'2:\u200Bd',
'Q' : '3:Q',
}, cols=3),
label='From'),
),
Group(
Item('convert_to',
style='custom',
editor=EnumEditor(values={
'theta' : ur'1:\u0398',
'd' : ur'2:\u200Bd',
'Q' : '3:Q',
}, cols=3),
label='To'),
),
),
# UItem('bt_rescale', enabled_when='can_rescale'),
# enabled_when='can_rescale',
),
),
resizable=True, width=0.5, height=0.5, kind='livemodal',
title='Convert/scale abscissa',
handler=WavelengthEditorHandler(),
buttons=[rescale,CancelButton]
# handler = ClosingHandler(),
)
def __init__(self, *args, **kwargs):
self.datasets = map(lambda d: d.metadata['ui_w'], kwargs.pop('datasets'))
super(WavelengthEditor, self).__init__(*args, **kwargs)
self.wavelength_editor.on_select = self._selection_changed
self.selecting = False
def _selection_changed(self, selected_objs):
self.selected = selected_objs
self._update_ui()
def _table_click_changed(self, trait, value):
self._update_ui()
def _update_ui(self):
if not self.selected:
return
self.selecting = True
self.x = self.selected[0].x
self.selecting = False
def _bt_rescale_changed(self):
# rescale all x's between theta/d/Q
rescale_xye_datasets(self.datasets, self.target_value, self.convert_from, self.convert_to)
write_xye_datasets(self.datasets, self.filename_field)
# disable rescale button
self.can_rescale = False
@on_trait_change('x')
def _trait_changed(self, trait, value):
if not self.selecting:
for obj in self.selected:
setattr(obj, trait, value)