Skip to content

abstract

Full documentation pages are generated for docstring reference only and may contain symbols imported from other modules. Imported symbols are not distinguished from locally defined symbols and will appear in any module that they are imported into. For better information on where symbols should be imported from, review the sourcecode on the github.

FoSpy.ui.sliders.abstract

CTRL_ROWS module-attribute

CTRL_ROWS = 6

ControlPanel

Source code in FoSpy/ui/sliders/abstract.py
class ControlPanel:
    def __init__(self, rows=CTRL_ROWS):
        self._rowcol = self.row_col_iter()
        self._max_rows = rows

    def addWidget(self, w):
        pass

    def addGroup(self, label, rows=CTRL_ROWS):
        pass

    def row_col_iter(self):
        current_row = 0
        current_col = 0
        while True:
            if current_row >= self._max_rows-1:
                current_row = 0
                current_col += 1
            else:
                current_row += 1
            yield current_row, current_col


    def nextRowCol(self):
        return next(self._rowcol)

_max_rows instance-attribute

_max_rows = rows

_rowcol instance-attribute

_rowcol = self.row_col_iter()

__init__

__init__(rows=CTRL_ROWS)
Source code in FoSpy/ui/sliders/abstract.py
def __init__(self, rows=CTRL_ROWS):
    self._rowcol = self.row_col_iter()
    self._max_rows = rows

addGroup

addGroup(label, rows=CTRL_ROWS)
Source code in FoSpy/ui/sliders/abstract.py
def addGroup(self, label, rows=CTRL_ROWS):
    pass

addWidget

addWidget(w)
Source code in FoSpy/ui/sliders/abstract.py
def addWidget(self, w):
    pass

nextRowCol

nextRowCol()
Source code in FoSpy/ui/sliders/abstract.py
def nextRowCol(self):
    return next(self._rowcol)

row_col_iter

row_col_iter()
Source code in FoSpy/ui/sliders/abstract.py
def row_col_iter(self):
    current_row = 0
    current_col = 0
    while True:
        if current_row >= self._max_rows-1:
            current_row = 0
            current_col += 1
        else:
            current_row += 1
        yield current_row, current_col

SliderPlot

Source code in FoSpy/ui/sliders/abstract.py
class SliderPlot:
    color1 = 'b'
    color2 = 'magenta'
    color3 = 'darkgreen'
    def __init__(self, specs={}, cfg={}, x_label=None, y_label=None, x_ticks=True, y_ticks=True):
        self.specs = specs
        self._unpacked_specs = {}
        self._unpack_specs()
        self.cfg = cfg
        self.sl_rows = _count_sliders(self._unpacked_specs)
        self.sliders = {}
        self.checks = {}
        self.textboxes = {}
        self.plots = {}
        self.plotcolors = {}

        self.bg_color = 'w'
        self.fg_color = 'k'

        if x_label is not None:
            self.setXlabel(x_label)
        if y_label is not None:
            self.setYlabel(y_label)

        self.setXticks(x_ticks)
        self.setYticks(y_ticks)

    def _unpack_specs(self, specs=None):
        specs = specs or self.specs

        for name, spec in specs.items():
            if spec["type"] == "group":
                self._unpack_specs(spec["specs"])
            else:
                self._unpacked_specs[name] = spec

    def update_plot(self, val=None):
        self.update_cfg()

    def update_cfg(self):
        for name, spec in self._unpacked_specs.items():
            if spec["type"] == "scalar":
                NoneVal = spec.get("None", None)
                enabled = self.get_check_enabled(name)
                self.cfg[name] = self.get_slider_val(name) if enabled else NoneVal

            elif spec["type"] == "range":
                lo_enabled = self.get_check_enabled(name + "_min")
                hi_enabled = self.get_check_enabled(name + "_max")

                lo = self.get_slider_val(name + "_min") if lo_enabled else None
                hi = self.get_slider_val(name + "_max") if hi_enabled else None

                self.cfg[name] = [lo, hi]

    def _add_group(self, label, specs, rows=CTRL_ROWS):
        # cache current panel
        panel = self.panel

        # reassign panel to nested group
        self.panel = panel.addGroup(label, rows=rows)

        # build controls in nested group
        self._build_controls(specs)

        # restore cached panel
        self.panel = panel

    def _add_range(self, name, spec):
        lo, hi = spec['default']

        specs = {
            name + "_min": {
                "label": "(min)",
                "min": spec["min"],
                "max": spec["max"],
                "default": lo,
                "digits": _get_digits(spec),
                "type": "scalar"
            },
            name + "_max": {
                "label": "(max)",
                "min": spec["min"],
                "max": spec["max"],
                "default": hi,
                "digits": _get_digits(spec),
                "type": "scalar"
            }
        }

        self._add_group(spec["label"], specs)

    def _build_controls(self, specs=None):
        specs = specs or self.specs
        widget_calls = {
            "scalar": lambda name, spec:
                self._add_scalar(name, spec),
            "range": lambda name, spec:
                self._add_range(name, spec),
            "group": lambda name, spec:
                self._add_group(spec["label"], spec["specs"])
        }
        def skip(name, spec):
            return None

        for name, spec in specs.items():
            widget_calls.get(spec["type"], skip)(name, spec)

        if specs == self.specs:
            self._finish_buttons()

    def _add_button(self, label, callback):
        # TODO: unit test
        raise NotImplementedError("Override in UI subclass")

    def _finish_buttons(self):
        # TODO: unit test
        for label, callback in (
            ("OK", self._ok_clicked),
            ("Reset to defaults", self.revert_cfg),
            ("Save as default", self.save_cfg)
        ):
            self._add_button(label, callback)

    def save_cfg(self):
        # TODO: unit test
        # TODO: abstract config save
        pass

    def revert_cfg(self):
        # TODO: unit test
        # TODO: abstract config revert
        pass

    def _ok_clicked(self):
        raise NotImplementedError("Override in UI subclass")

    def _add_scalar(self, name, spec):
        raise NotImplementedError("Override in UI subclass")

    def get_slider_val(self, spec_name):
        raise NotImplementedError("Override in UI subclass")

    def get_check_enabled(self, spec_name):
        raise NotImplementedError("Override in UI subclass")

    def reset_sticks(self):
        raise NotImplementedError("Override in UI subclass")

    def add_sticks(self, segments):
        raise NotImplementedError("Override in UI subclass")

    def draw_sticks(self):
        raise NotImplementedError("Override in UI subclass")

    def plotXY(self, x, *y, plotset='static',**kwargs):
        raise NotImplementedError("Override in UI subclass")

    def reset_plotsets(self, *plotsets):
        raise NotImplementedError("Override in UI subclass")

    def main_loop(self):
        raise NotImplementedError("Override in UI subclass")

    def setXlabel(self, label):
        raise NotImplementedError("Override in UI subclass")

    def setYlabel(self, label):
        raise NotImplementedError("Override in UI subclass")

    def setXticks(self, on):
        raise NotImplementedError("Override in UI subclass")

    def setYticks(self, on):
        raise NotImplementedError("Override in UI subclass")

_unpacked_specs instance-attribute

_unpacked_specs = {}

bg_color instance-attribute

bg_color = 'w'

cfg instance-attribute

cfg = cfg

checks instance-attribute

checks = {}

color1 class-attribute instance-attribute

color1 = 'b'

color2 class-attribute instance-attribute

color2 = 'magenta'

color3 class-attribute instance-attribute

color3 = 'darkgreen'

fg_color instance-attribute

fg_color = 'k'

plotcolors instance-attribute

plotcolors = {}

plots instance-attribute

plots = {}

sl_rows instance-attribute

sl_rows = _count_sliders(self._unpacked_specs)

sliders instance-attribute

sliders = {}

specs instance-attribute

specs = specs

textboxes instance-attribute

textboxes = {}

__init__

__init__(
    specs={},
    cfg={},
    x_label=None,
    y_label=None,
    x_ticks=True,
    y_ticks=True,
)
Source code in FoSpy/ui/sliders/abstract.py
def __init__(self, specs={}, cfg={}, x_label=None, y_label=None, x_ticks=True, y_ticks=True):
    self.specs = specs
    self._unpacked_specs = {}
    self._unpack_specs()
    self.cfg = cfg
    self.sl_rows = _count_sliders(self._unpacked_specs)
    self.sliders = {}
    self.checks = {}
    self.textboxes = {}
    self.plots = {}
    self.plotcolors = {}

    self.bg_color = 'w'
    self.fg_color = 'k'

    if x_label is not None:
        self.setXlabel(x_label)
    if y_label is not None:
        self.setYlabel(y_label)

    self.setXticks(x_ticks)
    self.setYticks(y_ticks)

_add_button

_add_button(label, callback)
Source code in FoSpy/ui/sliders/abstract.py
def _add_button(self, label, callback):
    # TODO: unit test
    raise NotImplementedError("Override in UI subclass")

_add_group

_add_group(label, specs, rows=CTRL_ROWS)
Source code in FoSpy/ui/sliders/abstract.py
def _add_group(self, label, specs, rows=CTRL_ROWS):
    # cache current panel
    panel = self.panel

    # reassign panel to nested group
    self.panel = panel.addGroup(label, rows=rows)

    # build controls in nested group
    self._build_controls(specs)

    # restore cached panel
    self.panel = panel

_add_range

_add_range(name, spec)
Source code in FoSpy/ui/sliders/abstract.py
def _add_range(self, name, spec):
    lo, hi = spec['default']

    specs = {
        name + "_min": {
            "label": "(min)",
            "min": spec["min"],
            "max": spec["max"],
            "default": lo,
            "digits": _get_digits(spec),
            "type": "scalar"
        },
        name + "_max": {
            "label": "(max)",
            "min": spec["min"],
            "max": spec["max"],
            "default": hi,
            "digits": _get_digits(spec),
            "type": "scalar"
        }
    }

    self._add_group(spec["label"], specs)

_add_scalar

_add_scalar(name, spec)
Source code in FoSpy/ui/sliders/abstract.py
def _add_scalar(self, name, spec):
    raise NotImplementedError("Override in UI subclass")

_build_controls

_build_controls(specs=None)
Source code in FoSpy/ui/sliders/abstract.py
def _build_controls(self, specs=None):
    specs = specs or self.specs
    widget_calls = {
        "scalar": lambda name, spec:
            self._add_scalar(name, spec),
        "range": lambda name, spec:
            self._add_range(name, spec),
        "group": lambda name, spec:
            self._add_group(spec["label"], spec["specs"])
    }
    def skip(name, spec):
        return None

    for name, spec in specs.items():
        widget_calls.get(spec["type"], skip)(name, spec)

    if specs == self.specs:
        self._finish_buttons()

_finish_buttons

_finish_buttons()
Source code in FoSpy/ui/sliders/abstract.py
def _finish_buttons(self):
    # TODO: unit test
    for label, callback in (
        ("OK", self._ok_clicked),
        ("Reset to defaults", self.revert_cfg),
        ("Save as default", self.save_cfg)
    ):
        self._add_button(label, callback)

_ok_clicked

_ok_clicked()
Source code in FoSpy/ui/sliders/abstract.py
def _ok_clicked(self):
    raise NotImplementedError("Override in UI subclass")

_unpack_specs

_unpack_specs(specs=None)
Source code in FoSpy/ui/sliders/abstract.py
def _unpack_specs(self, specs=None):
    specs = specs or self.specs

    for name, spec in specs.items():
        if spec["type"] == "group":
            self._unpack_specs(spec["specs"])
        else:
            self._unpacked_specs[name] = spec

add_sticks

add_sticks(segments)
Source code in FoSpy/ui/sliders/abstract.py
def add_sticks(self, segments):
    raise NotImplementedError("Override in UI subclass")

draw_sticks

draw_sticks()
Source code in FoSpy/ui/sliders/abstract.py
def draw_sticks(self):
    raise NotImplementedError("Override in UI subclass")

get_check_enabled

get_check_enabled(spec_name)
Source code in FoSpy/ui/sliders/abstract.py
def get_check_enabled(self, spec_name):
    raise NotImplementedError("Override in UI subclass")

get_slider_val

get_slider_val(spec_name)
Source code in FoSpy/ui/sliders/abstract.py
def get_slider_val(self, spec_name):
    raise NotImplementedError("Override in UI subclass")

main_loop

main_loop()
Source code in FoSpy/ui/sliders/abstract.py
def main_loop(self):
    raise NotImplementedError("Override in UI subclass")

plotXY

plotXY(x, *y, plotset='static', **kwargs)
Source code in FoSpy/ui/sliders/abstract.py
def plotXY(self, x, *y, plotset='static',**kwargs):
    raise NotImplementedError("Override in UI subclass")

reset_plotsets

reset_plotsets(*plotsets)
Source code in FoSpy/ui/sliders/abstract.py
def reset_plotsets(self, *plotsets):
    raise NotImplementedError("Override in UI subclass")

reset_sticks

reset_sticks()
Source code in FoSpy/ui/sliders/abstract.py
def reset_sticks(self):
    raise NotImplementedError("Override in UI subclass")

revert_cfg

revert_cfg()
Source code in FoSpy/ui/sliders/abstract.py
def revert_cfg(self):
    # TODO: unit test
    # TODO: abstract config revert
    pass

save_cfg

save_cfg()
Source code in FoSpy/ui/sliders/abstract.py
def save_cfg(self):
    # TODO: unit test
    # TODO: abstract config save
    pass

setXlabel

setXlabel(label)
Source code in FoSpy/ui/sliders/abstract.py
def setXlabel(self, label):
    raise NotImplementedError("Override in UI subclass")

setXticks

setXticks(on)
Source code in FoSpy/ui/sliders/abstract.py
def setXticks(self, on):
    raise NotImplementedError("Override in UI subclass")

setYlabel

setYlabel(label)
Source code in FoSpy/ui/sliders/abstract.py
def setYlabel(self, label):
    raise NotImplementedError("Override in UI subclass")

setYticks

setYticks(on)
Source code in FoSpy/ui/sliders/abstract.py
def setYticks(self, on):
    raise NotImplementedError("Override in UI subclass")

update_cfg

update_cfg()
Source code in FoSpy/ui/sliders/abstract.py
def update_cfg(self):
    for name, spec in self._unpacked_specs.items():
        if spec["type"] == "scalar":
            NoneVal = spec.get("None", None)
            enabled = self.get_check_enabled(name)
            self.cfg[name] = self.get_slider_val(name) if enabled else NoneVal

        elif spec["type"] == "range":
            lo_enabled = self.get_check_enabled(name + "_min")
            hi_enabled = self.get_check_enabled(name + "_max")

            lo = self.get_slider_val(name + "_min") if lo_enabled else None
            hi = self.get_slider_val(name + "_max") if hi_enabled else None

            self.cfg[name] = [lo, hi]

update_plot

update_plot(val=None)
Source code in FoSpy/ui/sliders/abstract.py
def update_plot(self, val=None):
    self.update_cfg()

AssembleSlider

AssembleSlider(subcls, ui=None)
Source code in FoSpy/ui/sliders/abstract.py
def AssembleSlider(subcls, ui=None):
    from ..available import get_valid_ui, discover_ui_options

    # look for existing slider bindings
    ui_opts = discover_ui_options(__package__)

    # validate ui and route to correct module
    ui = get_valid_ui(ui, options=ui_opts.keys())
    plot_module = ui_opts[ui]

    # construct hybrid class with slider routines and ui bindings
    class SliderPlot(subcls, plot_module.SliderPlot):
        pass

    return SliderPlot

_count_sliders

_count_sliders(specs)
Source code in FoSpy/ui/sliders/abstract.py
def _count_sliders(specs):
    total = 0
    for sp in specs.values():
        if sp["type"] == "scalar":
            total += 1
        elif sp["type"] == "range":
            total += 2
    return total

_get_digits

_get_digits(spec)
Source code in FoSpy/ui/sliders/_utils.py
def _get_digits(spec):
    from ...config import values as cfg
    default = cfg.get("slider_digits.default", DEF_DIGITS)
    return spec.get("digits", default)