forked from AustralianSynchrotron/pdviper
-
Notifications
You must be signed in to change notification settings - Fork 0
/
wavelength_editor.py
138 lines (118 loc) · 4.63 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
from traits.api import Str, List, Enum, Bool, Float, HasTraits, on_trait_change, Instance, \
Event, Button
from traitsui.api import View, Item, UItem, TableEditor, EnumEditor, Group, VGroup, HGroup, \
Label, Handler
from traitsui.table_column import ObjectColumn
from fixes import fix_background_color
from processing_rescale import rescale_xye_datasets, write_xye_datasets
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 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'),
]
)
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 = 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)