Beispiel #1
0
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
Beispiel #2
0
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))