diff --git a/psy_view/ds_widget.py b/psy_view/ds_widget.py index a295d4e..e235ce9 100644 --- a/psy_view/ds_widget.py +++ b/psy_view/ds_widget.py @@ -34,7 +34,6 @@ def get_dims_to_iterate(arr): if size > 1 and arr[dim].ndim == 0] - class DatasetWidget(QtWidgets.QSplitter): """A widget to control the visualization of the variables in a dataset""" @@ -150,6 +149,8 @@ def __init__(self, ds=None, *args, **kwargs): self.addWidget(self.dimension_table) self.disable_navigation() + if self.ds is not None: + self.refresh() self.cids = {} @@ -385,8 +386,9 @@ def disable_variables(self): btn.setEnabled(False) def enable_variables(self): - for btn in self.variable_buttons.values(): - btn.setEnabled(True) + valid_variables = self.plotmethod_widget.valid_variables(self.ds) + for v, btn in self.variable_buttons.items(): + btn.setEnabled(v in valid_variables) def start_animation(self): self._animating = True @@ -724,6 +726,7 @@ def show_fig(self): def switch_tab(self): with self.silence_variable_buttons(): + ds = self.ds if self.sp: name = self.data.name else: @@ -917,7 +920,15 @@ def get_slice(self, x, y): return None def valid_variables(self, ds): - return list(ds) + ret = [] + plotmethod = getattr(ds.psy.plot, self.plotmethod) + for v in list(ds): + init_kws = self.init_dims(ds[v]) + dims = init_kws.get('dims', {}) + decoder = init_kws.get('decoder') + if plotmethod.check_data(ds, v, dims, decoder)[0][0]: + ret.append(v) + return ret class MapPlotWidget(PlotMethodWidget): @@ -1039,7 +1050,7 @@ def init_dims(self, var): missing = [dim for dim in var.dims if dim not in dims] for dim in missing: dims[dim] = 0 - if len(dims) == 1: + if len(dims) == 1 and xdim != ydim: if xdim is None: xdim = missing[-1] else: @@ -1056,7 +1067,8 @@ def init_dims(self, var): ret.setdefault('decoder', {}) ret['decoder']['y'] = {ycoord} - if xdim is not None and xdim in var.dims: + if (xdim is not None and xdim in var.dims and + ydim is not None and ydim in var.dims): ret['transpose'] = var.dims.index(xdim) < var.dims.index(ydim) return ret @@ -1502,7 +1514,7 @@ def block_combos(self): self.combo_lines.blockSignals(False) def valid_variables(self, ds): - valid = super().valid_variables(ds) + valid = list(ds) if not self.sp or len(self.sp[0]) < 2: return valid else: diff --git a/tests/test_ds_widget.py b/tests/test_ds_widget.py index 49c61c4..18f5c16 100644 --- a/tests/test_ds_widget.py +++ b/tests/test_ds_widget.py @@ -49,7 +49,7 @@ def test_plot2d(qtbot, ds_widget): assert not ds_widget.sp -def test_plot2d_dim_switch(qtbot, ds_widget, test_ds): +def test_plot2d_dim_switch(qtbot, ds_widget, test_ds, test_file): arr = test_ds['t2m'] ds_widget.plotmethod = 'plot2d' @@ -258,3 +258,26 @@ def animation_finished(): # stop animation qtbot.mouseClick(btn, Qt.LeftButton) assert not ds_widget._animating + + +def test_enable_disable_variables(test_ds, qtbot): + from psy_view.ds_widget import DatasetWidget + import numpy as np + test_ds['line'] = ('xtest', np.zeros(7)) + test_ds['xtest'] = ('xtest', np.arange(7)) + + ds_widget = DatasetWidget(test_ds) + qtbot.addWidget(ds_widget) + + assert ds_widget.variable_buttons['t2m'].isEnabled() + assert not ds_widget.variable_buttons['line'].isEnabled() + + ds_widget.plotmethod = 'lineplot' + + assert ds_widget.variable_buttons['t2m'].isEnabled() + assert ds_widget.variable_buttons['line'].isEnabled() + + ds_widget.plotmethod = 'plot2d' + + assert ds_widget.variable_buttons['t2m'].isEnabled() + assert not ds_widget.variable_buttons['line'].isEnabled()