Skip to content

Commit 2a55d49

Browse files
committed
Disable non-selected x-ray source pick paths
If "Show picks from all x-ray sources" is not checked, picks for the non-selected x-ray source are now grayed out and not editable. This is much better than before, where an error would simply occur if users tried to edit non-selected x-ray source picks (or worse, in structureless calibration, the point would be added inadvertently to the wrong source). Signed-off-by: Patrick Avery <[email protected]>
1 parent d80b1b6 commit 2a55d49

File tree

5 files changed

+64
-1
lines changed

5 files changed

+64
-1
lines changed

hexrdgui/calibration/calibration_runner.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,8 +981,11 @@ def clear_drawn_picks(self):
981981

982982
def on_edit_picks_clicked(self):
983983
dialog = self.edit_picks_dialog
984+
tree_view = dialog.tree_view
985+
model = tree_view.model()
986+
model.disabled_paths.clear()
987+
984988
dialog.button_box_visible = True
985-
dialog.ui.show()
986989

987990
def on_finished():
988991
self.dialog.show()
@@ -994,6 +997,24 @@ def on_finished():
994997
self.draw_picks_on_canvas()
995998
self.dialog.hide()
996999

1000+
# After the tree view is updated, disable paths that
1001+
# don't match this XRS.
1002+
if (
1003+
HexrdConfig().has_multi_xrs and
1004+
not self.showing_picks_from_all_xray_sources
1005+
):
1006+
# Disable paths that don't match this XRS
1007+
for item in model.root_item.child_items:
1008+
overlay_name = item.data(0)
1009+
overlay = Overlay.from_name(overlay_name)
1010+
1011+
if overlay.xray_source != HexrdConfig().active_beam_name:
1012+
model.disabled_paths.append((overlay_name,))
1013+
1014+
tree_view.collapse_disabled_paths()
1015+
1016+
dialog.ui.show()
1017+
9971018
def save_picks_to_file(self, selected_file):
9981019
# Reuse the same logic from the HKLPicksTreeViewDialog
9991020
self.edit_picks_dialog.export_picks(selected_file)

hexrdgui/calibration/structureless/runner.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ def draw_picks_on_canvas(self):
499499
def on_edit_picks_clicked(self):
500500
# Convert to polar lines
501501
data = cart_to_polar_lines(self.calibrator_lines, self.instr)
502+
disabled_paths = []
502503

503504
# Now convert to a dictionary for the line labels
504505
dictionary = {}
@@ -510,6 +511,12 @@ def on_edit_picks_clicked(self):
510511
this_xrs[name] = v.tolist()
511512
ring_indices[xray_source] = ring_idx
512513

514+
if (
515+
not self.showing_picks_from_all_xray_sources and
516+
xray_source != HexrdConfig().active_beam_name
517+
):
518+
disabled_paths.append((xray_source,))
519+
513520
def new_line_name_generator(path):
514521
# Get the x-ray source
515522
xray_source = path[0]
@@ -519,12 +526,14 @@ def new_line_name_generator(path):
519526
dialog = GenericPicksTreeViewDialog(dictionary, canvas=self.canvas,
520527
parent=self.canvas)
521528
dialog.tree_view.new_line_name_generator = new_line_name_generator
529+
dialog.tree_view.model().disabled_paths = disabled_paths
522530
dialog.accepted.connect(self.on_edit_picks_accepted)
523531
dialog.finished.connect(self.on_edit_picks_finished)
524532
dialog.show()
525533

526534
self.edit_picks_dictionary = dictionary
527535
self.edit_picks_dialog = dialog
536+
dialog.tree_view.collapse_disabled_paths()
528537

529538
self.clear_drawn_picks()
530539
self.dialog.hide()

hexrdgui/tree_views/base_dict_tree_item_model.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def __init__(self, dictionary, parent=None):
2222
# These can be modified anytime
2323
self.lists_resizable = True
2424
self._blacklisted_paths = []
25+
self.disabled_paths = []
2526
self.editable = True
2627

2728
self.config = dictionary
@@ -101,6 +102,12 @@ def flags(self, index):
101102
flags = super().flags(index)
102103
item = self.get_item(index)
103104

105+
if self.has_disabled_paths:
106+
path = self.path_to_item(item)
107+
if self.is_disabled_path(path):
108+
flags = flags & ~Qt.ItemIsEnabled
109+
return flags
110+
104111
# Items are selectable if they have no children
105112
# and none of the data values in the row are `None`.
106113
is_selectable = all((
@@ -246,6 +253,18 @@ def blacklisted_paths(self, v):
246253
self._blacklisted_paths = [list(x) for x in v]
247254
self.rebuild_tree()
248255

256+
@property
257+
def has_disabled_paths(self) -> bool:
258+
return bool(self.disabled_paths)
259+
260+
def is_disabled_path(self, path: list[str] | tuple[str]) -> bool:
261+
path = tuple(path)
262+
for disabled_path in self.disabled_paths:
263+
if path[:len(disabled_path)] == disabled_path:
264+
return True
265+
266+
return False
267+
249268

250269
class BaseDictTreeView(QTreeView):
251270

@@ -285,6 +304,12 @@ def expand_rows(self, parent=QModelIndex(), rows=None):
285304
self.expand(index)
286305
self.expand_rows(index)
287306

307+
def collapse_disabled_paths(self):
308+
model = self.model()
309+
for path in model.disabled_paths:
310+
index = model.create_index(path)
311+
self.collapse(index)
312+
288313
@property
289314
def lists_resizable(self):
290315
return self.model().lists_resizable

hexrdgui/tree_views/generic_picks_tree_view.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,10 @@ def contextMenuEvent(self, event):
411411
num_selected = len(selected_items)
412412
is_hand_pickable = self.is_hand_pickable
413413

414+
if self.model().is_disabled_path(path):
415+
# If it is a disabled path, do not create the context menu
416+
return
417+
414418
menu = QMenu(self)
415419

416420
# Helper functions

hexrdgui/tree_views/hkl_picks_tree_view.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ def contextMenuEvent(self, event):
9999
num_selected = len(selected_items)
100100
is_hand_pickable = self.is_hand_pickable
101101

102+
if self.model().is_disabled_path(path):
103+
# If it is a disabled path, do not create the context menu
104+
return
105+
102106
menu = QMenu(self)
103107

104108
# Helper functions

0 commit comments

Comments
 (0)