Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions hexrdgui/masking/mask_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ def write_single_mask(self, name):
}
self.export_masks_to_file.emit(d)

def write_all_masks(self, h5py_group=None):
def write_masks(self, h5py_group=None):
d = {
'__boundary_color': self.boundary_color,
'__boundary_style': self.boundary_style,
Expand All @@ -385,7 +385,7 @@ def save_state(self, h5py_group):
if 'masks' not in h5py_group:
h5py_group.create_group('masks')

self.write_all_masks(h5py_group['masks'])
self.write_masks(h5py_group['masks'])

def load_masks(self, h5py_group):
items = load_masks(h5py_group)
Expand Down Expand Up @@ -481,3 +481,6 @@ def apply_masks_to_panel_buffers(self, instr):
# This is the same as the panel buffer, which is why we are
# doing a `np.logical_and()`.
panel.panel_buffer = np.logical_and(mask, panel.panel_buffer)

def get_mask_by_name(self, name):
return self.masks[name]
81 changes: 68 additions & 13 deletions hexrdgui/masking/mask_manager_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def setup_connections(self):
self.ui.masks_tree.itemChanged.connect(self.update_mask_name)
self.ui.masks_tree.customContextMenuRequested.connect(
self.context_menu_event)
self.ui.export_masks.clicked.connect(MaskManager().write_all_masks)
self.ui.export_masks.clicked.connect(MaskManager().write_masks)
self.ui.import_masks.clicked.connect(self.import_masks)
self.ui.panel_buffer.clicked.connect(self.masks_to_panel_buffer)
self.ui.view_masks.clicked.connect(self.show_masks)
Expand All @@ -66,6 +66,11 @@ def setup_connections(self):
self.ui.border_style.clicked.connect(self.edit_style)
self.ui.apply_changes.clicked.connect(self.apply_changes)
HexrdConfig().active_beam_switched.connect(self.update_collapsed)
self.ui.masks_tree.itemSelectionChanged.connect(self.selected_changed)
self.ui.presentation_selector.currentTextChanged.connect(
self.change_presentation_for_selected)
self.ui.export_selected.clicked.connect(self.export_selected)
self.ui.remove_selected.clicked.connect(self.remove_selected_masks)

def create_mode_source_string(self, mode, source):
if mode is None:
Expand Down Expand Up @@ -154,7 +159,6 @@ def remove_mask_item(self, name):
MaskManager().masks_changed()
self.ui.masks_tree.verticalScrollBar().setValue(scroll_value)


def _alphanumeric_sort(self, value):
# Split the string into text and number parts so that we
# sort by string value lexicographically and the number
Expand Down Expand Up @@ -286,11 +290,11 @@ def context_menu_event(self, event):
item = self.ui.masks_tree.itemAt(event)
if item and item.parent(): # Only for mask items, not mode items
menu = QMenu(self.ui.masks_tree)
export = menu.addAction('Export Mask')
export = menu.addAction('Export Selected Masks')
action = menu.exec(QCursor.pos())
if action == export:
selection = item.text(0)
MaskManager().write_single_mask(selection)
selections = self.ui.masks_tree.selectedItems()
MaskManager().write_masks([i.text(0) for i in selections])

def export_masks_to_file(self, data):
output_file, _ = QFileDialog.getSaveFileName(
Expand Down Expand Up @@ -385,27 +389,31 @@ def update_presentation_selector(self):
with block_signals(cb):
cb.setCurrentIndex(idx)

def change_mask_visibility(self, mask_names, visible):
for name in mask_names:
MaskManager().update_mask_visibility(name, visible)

def hide_all_masks(self):
for name in MaskManager().mask_names:
MaskManager().update_mask_visibility(name, False)
self.change_mask_visibility(MaskManager().mask_names, False)
self.update_presentation_selector()
MaskManager().masks_changed()

def show_all_masks(self):
for name in MaskManager().mask_names:
MaskManager().update_mask_visibility(name, True)
self.change_mask_visibility(MaskManager().mask_names, True)
self.update_presentation_selector()
MaskManager().masks_changed()

def change_mask_boundaries(self, mask_names, visible):
for name in mask_names:
MaskManager().update_border_visibility(name, visible)

def hide_all_boundaries(self):
for name in MaskManager().mask_names:
MaskManager().update_border_visibility(name, False)
self.change_mask_boundaries(MaskManager().mask_names, False)
self.update_presentation_selector()
MaskManager().masks_changed()

def show_all_boundaries(self):
for name in MaskManager().mask_names:
MaskManager().update_border_visibility(name, True)
self.change_mask_boundaries(MaskManager().mask_names, True)
self.update_presentation_selector()
MaskManager().masks_changed()

Expand All @@ -427,3 +435,50 @@ def apply_changes(self):
self.change_mask_presentation(index, name)
self.changed_masks = {}
self.ui.apply_changes.setEnabled(False)

def selected_changed(self):
with block_signals(self.ui.presentation_selector):
selected = self.ui.masks_tree.selectedItems()
self.ui.presentation_selector.setEnabled(len(selected) > 1)
self.ui.export_selected.setEnabled(len(selected) > 1)
self.ui.remove_selected.setEnabled(len(selected) > 1)
if len(selected) == 0:
return

boundary_masks = [MaskType.region, MaskType.polygon, MaskType.pinhole]
masks_from_names = [MaskManager().get_mask_by_name(i.text(0)) for i in selected]
vis_only = any(mask.type not in boundary_masks for mask in masks_from_names)
self.ui.presentation_selector.clear()
self.ui.presentation_selector.addItem('None')
self.ui.presentation_selector.addItem('Visible')
if not vis_only:
self.ui.presentation_selector.addItem('Boundary Only')
self.ui.presentation_selector.addItem('Visible + Boundary')

def change_presentation_for_selected(self, text):
if len(self.ui.masks_tree.selectedItems()) <= 1:
return

mask_names = [i.text(0) for i in self.ui.masks_tree.selectedItems()]
if 'Boundary' in text:
self.change_mask_boundaries(mask_names, True)
else:
self.change_mask_boundaries(mask_names, False)

if 'Visible' in text:
self.change_mask_visibility(mask_names, True)
else:
self.change_mask_visibility(mask_names, False)

self.update_presentation_selector()
MaskManager().masks_changed()

def export_selected(self):
mask_names = [i.text(0) for i in self.ui.masks_tree.selectedItems()]
MaskManager().write_masks(mask_names)

def remove_selected_masks(self):
with block_signals(self.ui.masks_tree):
mask_names = [i.text(0) for i in self.ui.masks_tree.selectedItems()]
for name in mask_names:
self.remove_mask_item(name)
5 changes: 5 additions & 0 deletions hexrdgui/resources/ui/mask_border_style_picker.ui
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@
<header>scientificspinbox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>border_style</tabstop>
<tabstop>border_style</tabstop>
<tabstop>border_size</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
Expand Down
Loading
Loading