def __init__(self, label='vector_file', **kwargs): # save the df for column naming (not using a gdf as geometry are useless) self.df = None # set the 3 wigets self.w_file = FileInput(['.shp', '.geojson', '.gpkg', '.kml'], label=label) self.w_column = v.Select(_metadata={'name': 'column'}, items=self.column_base_items, label='Column', v_model='ALL') self.w_value = v.Select(_metadata={'name': 'value'}, items=[], label='Value', v_model=None) su.hide_component(self.w_value) # create the Col Field self.children = [self.w_file, self.w_column, self.w_value] self.v_model = self.default_v_model super().__init__(**kwargs) # events self.w_file.observe(self._update_file, 'v_model') self.w_column.observe(self._update_column, 'v_model') self.w_value.observe(self._update_value, 'v_model')
def test_hide_component(self): # hide a normal v component widget = v.Btn() su.hide_component(widget) self.assertIn('d-none', widget.class_) # hide a sepalwidget widget = sw.Btn() su.hide_component(widget) self.assertFalse(widget.viz) return
def test_show_component(self): # show a normal v component widget = v.Btn() su.hide_component(widget) su.show_component(widget) self.assertNotIn('d-none', widget.class_) # show a sepalwidget widget = sw.Btn() su.hide_component(widget) su.show_component(widget) self.assertTrue(widget.viz) return
def toggle_inputs(self, fields_2_show, fields): """ Display only the widgets that are part of the input_list. the widget_list is the list of all the widgets of the tile. Args: fields_2_show ([v.widget]) : the list of input to be display fields ([v.widget]) : the list of the tile widget Return: self """ for field in fields: if field in fields_2_show: su.show_component(field) else: su.hide_component(field) return self
def _update_column(self, change): """Update the column name and empty the value list""" # reset value widget self.w_value.items = [] self.w_value.v_model = None # set the value self.v_model['column'] = change['new'] # hide value if "ALL" or none if change['new'] in ['ALL', None]: su.hide_component(self.w_value) return self # read the colmun self.w_value.items = sorted(set(self.df[change['new']].to_list())) su.show_component(self.w_value) return self
def _on_driver_change(self, change): """adapt the inputs to the requested sources""" # empty the datas self.reset_inputs() if change['new'] == 'planet': # remove source su.hide_component(self.sources) # display password self.planet_key.show() # display semesters su.show_component(self.semester) self.semester.v_model = 'S1' # change bands options and select the default rgb self.bands.items = [*cp.planet_bands_combo] self.bands.v_model = [*cp.planet_bands_combo][0] # adapt dates to available data and default to all available self.start.items = [ y for y in range(cp.planet_min_start_year, cp.planet_max_end_year+1) ] self.start.v_model = cp.planet_min_start_year self.end.items = [ y for y in range(cp.planet_min_start_year, cp.planet_max_end_year+1) ] self.end.v_model = cp.planet_max_end_year elif change['new'] == 'gee': # remove password self.planet_key.hide() # remove semester su.hide_component(self.semester) # add source and default to landsat su.show_component(self.sources) self.sources.v_model = [cp.sources[0]] # change band options self.bands.items = [*cp.getAvailableBands()] self.bands.v_model = [*cp.getAvailableBands()][0] # adapt dates to available data self.start.items = [ y for y in range(cp.gee_min_start_year, cp.gee_max_end_year+1) ] self.start.v_model = 2005 self.end.items = [ y for y in range(cp.gee_min_start_year, cp.gee_max_end_year+1) ] self.end.v_model = 2018 return
def __init__(self, viz_model, tb_model): # gather model self.viz_model = viz_model self.tb_model = tb_model # Create alert self.alert = sw.Alert() # create the widgets self.driver = v.RadioGroup( label = cm.viz.driver, row= True, v_model = self.viz_model.driver, children = [ v.Radio(key=i, label=n, value=n) for i, n in enumerate(cp.drivers) ] ) self.sources = v.Select( items=cp.sources, label=cm.viz.sources, v_model=self.viz_model.sources, multiple=True, chips=True ) self.planet_key = sw.PasswordField( label = cm.planet.key_label ).hide() self.semester = v.RadioGroup( label = cm.viz.semester, row= True, v_model = None, children = [ v.Radio(label=cp.planet_semesters[n], value=n) for n in [*cp.planet_date_ranges[cp.planet_min_start_year]] ] ) su.hide_component(self.semester) self.bands = v.Select( items=[*cp.getAvailableBands()], label=cm.viz.bands, v_model=self.viz_model.bands ) self.start = v.Select( class_='mr-5 ml-5', items=[ y for y in range(cp.gee_min_start_year, cp.gee_max_end_year+1) ], label=cm.viz.start_year, v_model=self.viz_model.start_year ) self.end = v.Select( class_='ml-5 mr-5', items=[y for y in range(cp.gee_min_start_year, cp.gee_max_end_year+1) ], label=cm.viz.end_year, v_model=self.viz_model.end_year ) years = v.Layout( xs=12, row=True, children=[self.start, self.end] ) image_size = v.Slider( step=500, min=cp.min_image, max=cp.max_image, label=cm.viz.image_size, v_model=self.viz_model.image_size, thumb_label='always', class_='mt-5' ) square_size = v.Slider( step=10, min=cp.min_square, max=cp.max_square, label=cm.viz.square_size, v_model=self.viz_model.square_size, thumb_label='always', class_='mt-5' ) # bind the inputs self.viz_model.bind(self.sources, 'sources') \ .bind(self.planet_key, 'planet_key') \ .bind(self.bands, 'bands') \ .bind(self.start, 'start_year') \ .bind(self.end, 'end_year') \ .bind(self.driver, 'driver') \ .bind(image_size, 'image_size') \ .bind(square_size, 'square_size') \ .bind(self.semester, 'semester') # create the tile super().__init__( id_ = "viz_widget", title = cm.viz.title, btn = sw.Btn(cm.viz.btn), inputs = [ self.driver, self.sources, self.planet_key, self.bands, years, self.semester, image_size, square_size ], alert = self.alert ) # js behaviour self.btn.on_event('click', self._display_data) self.driver.observe(self._on_driver_change, 'v_model')