-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #107 from Carifio24/jupyter-export-dialogs
Add save hover dialog for Jupyter exporters
- Loading branch information
Showing
19 changed files
with
454 additions
and
245 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
from echo import SelectionCallbackProperty | ||
from glue import config | ||
from glue.core.data_combo_helper import ComponentIDComboHelper, DataCollectionComboHelper | ||
from glue.core.state_objects import State | ||
|
||
|
||
class SaveHoverState(State): | ||
|
||
data = SelectionCallbackProperty() | ||
subset = SelectionCallbackProperty() | ||
component = SelectionCallbackProperty() | ||
exporter = SelectionCallbackProperty() | ||
|
||
def __init__(self, data_collection=None): | ||
|
||
super(SaveHoverState, self).__init__() | ||
|
||
self.data_helper = DataCollectionComboHelper(self, 'data', data_collection) | ||
self.component_helper = ComponentIDComboHelper(self, 'component', | ||
data_collection=data_collection) | ||
|
||
self.add_callback('data', self._on_data_change) | ||
self._on_data_change() | ||
|
||
self._sync_data_exporters() | ||
|
||
def _sync_data_exporters(self): | ||
|
||
exporters = list(config.data_exporter) | ||
|
||
def display_func(exporter): | ||
if exporter.extension == '': | ||
return "{0} (*)".format(exporter.label) | ||
else: | ||
return "{0} ({1})".format(exporter.label, ' '.join('*.' + ext for ext in exporter.extension)) | ||
|
||
SaveHoverState.exporter.set_choices(self, exporters) | ||
SaveHoverState.exporter.set_display_func(self, display_func) | ||
|
||
def _on_data_change(self, event=None): | ||
self.component_helper.set_multiple_data([self.data]) | ||
self._sync_subsets() | ||
|
||
def _sync_subsets(self): | ||
|
||
def display_func(subset): | ||
if subset is None: | ||
return "All data (no subsets applied)" | ||
else: | ||
return subset.label | ||
|
||
subsets = [None] + list(self.data.subsets) | ||
|
||
SaveHoverState.subset.set_choices(self, subsets) | ||
SaveHoverState.subset.set_display_func(self, display_func) | ||
|
||
|
||
class BaseSaveHoverDialog: | ||
|
||
def __init__(self, data_collection, checked_dictionary=None): | ||
|
||
if checked_dictionary is not None: | ||
self.checked_dictionary = checked_dictionary | ||
else: | ||
self.checked_dictionary = { | ||
data.label: {component.label: False for component in data.components} | ||
for data in data_collection | ||
} | ||
self.state = SaveHoverState(data_collection=data_collection) | ||
|
||
self.state.add_callback('component', self._on_component_change) | ||
self.state.add_callback('data', self._on_data_change) | ||
|
||
def _on_component_change(self, *args): | ||
pass | ||
|
||
def _on_data_change(self, *args): | ||
pass |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
from glue.core import Data, DataCollection | ||
from numpy import ones | ||
|
||
|
||
def hover_dummy_data(data_or_subset): | ||
components = {} | ||
for component in data_or_subset.components: | ||
components[component.label] = ones(10) | ||
|
||
dummy_data = Data(**components, label=data_or_subset.label) | ||
|
||
seen = set() | ||
for component in dummy_data.components: | ||
if component.label in seen: | ||
dummy_data.remove_component(component) | ||
else: | ||
seen.add(component.label) | ||
return dummy_data | ||
|
||
|
||
def default_layer_condition(layer): | ||
return layer.enabled and layer.state.visible | ||
|
||
|
||
def hover_data_collection_for_viewer(viewer, | ||
layer_condition=None): | ||
if layer_condition is None: | ||
layer_condition = default_layer_condition | ||
|
||
return DataCollection([hover_dummy_data(layer.layer) for layer in viewer.layers if layer_condition(layer)]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
from ipyvuetify.VuetifyTemplate import VuetifyTemplate | ||
from traitlets import Bool, Int, List, observe | ||
|
||
from glue_jupyter.vuetify_helpers import link_glue_choices | ||
|
||
from ..base_save_hover import BaseSaveHoverDialog | ||
|
||
|
||
class JupyterSaveHoverDialog(BaseSaveHoverDialog, VuetifyTemplate): | ||
|
||
template_file = (__file__, "save_hover.vue") | ||
dialog_open = Bool().tag(sync=True) | ||
|
||
data_items = List().tag(sync=True) | ||
data_selected = Int().tag(sync=True) | ||
|
||
component_items = List().tag(sync=True) | ||
component_selected = List().tag(sync=True) | ||
|
||
def __init__(self, | ||
data_collection, | ||
checked_dictionary=None, | ||
on_cancel=None, | ||
on_export=None, | ||
display=False): | ||
|
||
BaseSaveHoverDialog.__init__(self, data_collection=data_collection, checked_dictionary=checked_dictionary) | ||
VuetifyTemplate.__init__(self) | ||
|
||
self.on_cancel = on_cancel | ||
self.on_export = on_export | ||
|
||
if display: | ||
self.dialog_open = True | ||
|
||
link_glue_choices(self, self.state, 'data') | ||
|
||
self._on_data_change() | ||
|
||
def _on_data_change(self, *args): | ||
super()._on_data_change(*args) | ||
data_components = self.state.data.components | ||
self.component_items = [ | ||
{"text": component.label, "value": index} | ||
for index, component in enumerate(data_components) | ||
] | ||
current_selections = self.checked_dictionary.get(self.state.data.label, | ||
{component.label: False for component in data_components}) | ||
self.component_selected = [i for i, component in enumerate(data_components) | ||
if current_selections[component.label]] | ||
|
||
@observe('component_selected') | ||
def _on_component_selected_changed(self, change): | ||
selections = change["new"] | ||
current_layer = self.state.data.label | ||
self.checked_dictionary[current_layer] = {component.label: i in selections | ||
for i, component in enumerate(self.state.data.components)} | ||
|
||
def vue_select_none(self, *args): | ||
self.component_selected = [] | ||
|
||
def vue_select_all(self, *args): | ||
self.component_selected = list(range(len(self.component_items))) | ||
|
||
def vue_cancel_dialog(self, *args): | ||
self.checked_dictionary = {} | ||
self.dialog_open = False | ||
if self.on_cancel is not None: | ||
self.on_cancel() | ||
|
||
def vue_export_viewer(self, *args): | ||
self.dialog_open = False | ||
if self.on_export is not None: | ||
self.on_export() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
<template> | ||
<v-dialog | ||
v-model="dialog_open" | ||
width="600px" | ||
> | ||
<v-card class="pa-3"> | ||
<v-card-title> | ||
Save Hover | ||
</v-card-title> | ||
|
||
<p>Choose the layer you want to add hover info to:</p> | ||
<v-select | ||
v-model="data_selected" | ||
:items="data_items" | ||
> | ||
</v-select> | ||
|
||
<p>Choose component of the layer you want to appear in hover over:</p> | ||
<v-list> | ||
<v-list-item-group | ||
v-model="component_selected" | ||
multiple | ||
> | ||
<v-list-item | ||
v-for="(component, index) in component_items" | ||
:key="index" | ||
:value="index" | ||
> | ||
{{ component.text }} | ||
</v-list-item> | ||
</v-list-item-group> | ||
</v-list> | ||
<v-row class="d-flex justify-space-around"> | ||
<v-btn @click="select_none"> | ||
Select None | ||
</v-btn> | ||
<v-btn @click="select_all"> | ||
Select All | ||
</v-btn> | ||
</v-row> | ||
<v-row class="py-3"> | ||
<p>Once you click on "Export" you will be prompted to choose the filename. | ||
</v-row> | ||
<v-row> | ||
<v-spacer></v-spacer> | ||
<v-btn @click="cancel_dialog">Cancel</v-btn> | ||
<v-btn @click="export_viewer">Export</v-btn> | ||
</v-row> | ||
|
||
</v-card> | ||
<v-dialog> | ||
</template> |
Oops, something went wrong.