From 9ea4b8576ee7d1909bc93e8dc08dc33fc961f7f4 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Fri, 20 Dec 2024 09:22:09 -0500 Subject: [PATCH 1/4] logic to connect visibilities of child/parent layers from data-menu --- jdaviz/configs/default/plugins/data_menu/data_menu.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/jdaviz/configs/default/plugins/data_menu/data_menu.py b/jdaviz/configs/default/plugins/data_menu/data_menu.py index 8a0fab6e22..c609e831e0 100644 --- a/jdaviz/configs/default/plugins/data_menu/data_menu.py +++ b/jdaviz/configs/default/plugins/data_menu/data_menu.py @@ -358,6 +358,15 @@ def set_layer_visibility(self, layer_label, visible=True): layer.visible = visible elif hasattr(layer.layer, 'data') and layer.layer.data.label == layer_label: layer.visible = layer.layer.label in self.visible_layers + if not visible and self.app._get_assoc_data_parent(layer.layer.label) == layer_label: + # then this is a child-layer of a parent-layer that is being hidden + # so also hide the child-layer + layer.visible = False + + if visible and (parent_label := self.app._get_assoc_data_parent(layer_label)): + # ensure the parent layer is also visible + self.set_layer_visibility(parent_label, visible=True) + return self.visible_layers def toggle_layer_visibility(self, layer_label): From afa8c0341c7c6c8037a9d314c85ab35444285047 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Fri, 20 Dec 2024 09:31:01 -0500 Subject: [PATCH 2/4] add to existing changelog entry --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 42ea4afcec..ceab64aa8f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,7 @@ New Features ------------ -- New design for viewer legend and data-menu. [#3220, #3254, #3263, #3264, #3271, #3272, #3274, #3289, #3310] +- New design for viewer legend and future data-menu. [#3220, #3254, #3263, #3264, #3271, #3272, #3274, #3289, #3310, #3370] - Improve performance while importing multiple regions. [#3321] From c2f1ba66010cfb62fa65d215872f45c9fb108930 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Fri, 20 Dec 2024 10:24:25 -0500 Subject: [PATCH 3/4] test coverage --- .../configs/default/tests/test_data_menu.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/jdaviz/configs/default/tests/test_data_menu.py b/jdaviz/configs/default/tests/test_data_menu.py index 8d83ff4427..7e98164419 100644 --- a/jdaviz/configs/default/tests/test_data_menu.py +++ b/jdaviz/configs/default/tests/test_data_menu.py @@ -1,3 +1,4 @@ +from astropy.io import fits import pytest import numpy as np from specutils import SpectralRegion @@ -146,6 +147,35 @@ def test_data_menu_remove_subset(specviz_helper, spectrum1d): # assert dm.layer.choices == ['test', 'test2', 'Subset 2'] +def test_data_menu_dq_layers(imviz_helper): + imviz_helper.load_data(np.zeros((2, 2)), data_label='image', show_in_viewer=True) + + hdu = fits.ImageHDU(np.zeros(shape=(2, 2), dtype=np.int32)) + hdu.name = 'DQ' + dq = fits.HDUList([fits.PrimaryHDU(), hdu]) + + imviz_helper.load_data(dq, data_label="dq", show_in_viewer=True) + # manually link this DQ to the parent image + imviz_helper.app._set_assoc_data_as_child("dq[DQ,1]", new_parent_label='image') + + dm = imviz_helper.viewers['imviz-0']._obj.data_menu + assert dm.layer.choices == ['dq[DQ,1]', 'image'] + assert len(dm._obj.visible_layers) == 2 + + # turning off image (parent) data-layer should also turn off DQ + dm.set_layer_visibility('image', False) + assert len(dm._obj.visible_layers) == 0 + + # turning on image (parent) should leave DQ off + dm.set_layer_visibility('image', True) + assert len(dm._obj.visible_layers) == 1 + + # turning on DQ (child, when parent off) should show parent + dm.set_layer_visibility('image', False) + dm.set_layer_visibility('dq[DQ,1]', True) + assert len(dm._obj.visible_layers) == 2 + + @pytest.mark.skip(reason="known issue") def test_data_menu_subset_appearance(specviz_helper, spectrum1d): # NOTE: this test is similar to above - the subset is appearing in time IF there From f34f062f01c89f0d32b26da18a02589e131cd6f6 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Fri, 20 Dec 2024 15:33:00 -0500 Subject: [PATCH 4/4] load image data and DQ together --- .../configs/default/tests/test_data_menu.py | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/jdaviz/configs/default/tests/test_data_menu.py b/jdaviz/configs/default/tests/test_data_menu.py index 7e98164419..ad952aed70 100644 --- a/jdaviz/configs/default/tests/test_data_menu.py +++ b/jdaviz/configs/default/tests/test_data_menu.py @@ -148,31 +148,29 @@ def test_data_menu_remove_subset(specviz_helper, spectrum1d): def test_data_menu_dq_layers(imviz_helper): - imviz_helper.load_data(np.zeros((2, 2)), data_label='image', show_in_viewer=True) - - hdu = fits.ImageHDU(np.zeros(shape=(2, 2), dtype=np.int32)) - hdu.name = 'DQ' - dq = fits.HDUList([fits.PrimaryHDU(), hdu]) + hdu_data = fits.ImageHDU(np.zeros(shape=(2, 2))) + hdu_data.name = 'SCI' + hdu_dq = fits.ImageHDU(np.zeros(shape=(2, 2), dtype=np.int32)) + hdu_dq.name = 'DQ' + data = fits.HDUList([fits.PrimaryHDU(), hdu_data, hdu_dq]) - imviz_helper.load_data(dq, data_label="dq", show_in_viewer=True) - # manually link this DQ to the parent image - imviz_helper.app._set_assoc_data_as_child("dq[DQ,1]", new_parent_label='image') + imviz_helper.load_data(data, data_label="image", ext=('SCI', 'DQ'), show_in_viewer=True) dm = imviz_helper.viewers['imviz-0']._obj.data_menu - assert dm.layer.choices == ['dq[DQ,1]', 'image'] + assert dm.layer.choices == ['image[DQ,1]', 'image[SCI,1]'] assert len(dm._obj.visible_layers) == 2 # turning off image (parent) data-layer should also turn off DQ - dm.set_layer_visibility('image', False) + dm.set_layer_visibility('image[SCI,1]', False) assert len(dm._obj.visible_layers) == 0 # turning on image (parent) should leave DQ off - dm.set_layer_visibility('image', True) + dm.set_layer_visibility('image[SCI,1]', True) assert len(dm._obj.visible_layers) == 1 # turning on DQ (child, when parent off) should show parent - dm.set_layer_visibility('image', False) - dm.set_layer_visibility('dq[DQ,1]', True) + dm.set_layer_visibility('image[SCI,1]', False) + dm.set_layer_visibility('image[DQ,1]', True) assert len(dm._obj.visible_layers) == 2