class FilteredListPanel(ListPanel): def __init__(self, parent, items, parent_window): super().__init__(parent, items) self.parent_window = parent_window self.textBox = TextBox(self) self.removeChild(self.textBox) self.addChild(0, self.textBox) self.textBox.setFixedSize((self.item_width, 25)) self.textBox.setEditable(True) self.textBox.setValue('*') self.textBox.setFontSize(20) self.textBox.setAlignment(TextBox.Alignment.Right) def cb_text(value): used_items = [] indices = [] for i, item in enumerate(self.items): if pathlib.PurePath(item.lower()).match(value.lower()): used_items.append(item) indices.append(i) self.setItems(used_items, indices) self.parent_window.performLayout() return True self.textBox.setCallback(cb_text) self.items = items
class LabeledSlider(Widget): def __init__(self, variable_scope, widget, variable_name, min_val, max_val, dtype, callback=None, logspace=False, slider_width=120, warp_fun=None, inv_warp_fun=None): super().__init__(widget) if logspace: warp_fun = np.log inv_warp_fun = np.exp if warp_fun is None: def warp_fun(x): return x def inv_warp_fun(x): return x self.warp_fun = warp_fun self.inv_warp_fun = inv_warp_fun self.variable_scope = variable_scope self.variable_name = variable_name self.logspace = logspace self.min_val = min_val self.max_val = max_val self.dtype = dtype Label(widget, variable_name) widget = Widget(widget) widget.setLayout( BoxLayout(Orientation.Horizontal, Alignment.Middle, 0, 20)) self.slider = Slider(widget) diff = warp_fun(max_val) - warp_fun(min_val) self.slider.setValue( (warp_fun(variable_scope.__dict__[variable_name]) - warp_fun(min_val)) / diff) self.slider.setFixedWidth(slider_width) self.textBox = TextBox(widget) self.textBox.setFixedSize((60, 25)) self.textBox.setEditable(True) if dtype == int: self.textBox.setValue('{:d}'.format( variable_scope.__dict__[variable_name])) else: self.textBox.setValue('{:.3f}'.format( variable_scope.__dict__[variable_name])) self.textBox.setFontSize(20) self.textBox.setAlignment(TextBox.Alignment.Right) def cb(value): try: value = dtype(value) except ValueError: return False if value < min_val or value > max_val: return False self.slider.setValue( float((warp_fun(value) - warp_fun(min_val)) / diff)) variable_scope.__dict__[variable_name] = value if callback: callback() return True self.textBox.setCallback(cb) def cb(value): format_str = {int: r'{:d}', float: r'{:.3f}'} self.textBox.setValue(format_str[dtype].format( dtype(inv_warp_fun(diff * value + warp_fun(min_val))))) self.slider.setCallback(cb) def cb(value): variable_scope.__dict__[variable_name] = dtype( inv_warp_fun(diff * value + warp_fun(min_val))) if callback: callback() self.slider.setFinalCallback(cb) def set_value(self, value): self.variable_scope.__dict__[self.variable_name] = value diff = self.warp_fun(self.max_val) - self.warp_fun(self.min_val) self.slider.setValue( (self.warp_fun(value) - self.warp_fun(self.min_val)) / diff) if self.dtype == int: self.textBox.setValue('{:d}'.format(value)) else: self.textBox.setValue('{:.3f}'.format(value))