Example #1
0
class ReferenceWidget:
    "Dropdown for choosing the reference"
    __files: FileList
    __theme: ReferenceWidgetTheme
    __widget: Dropdown

    def __init__(self, ctrl, model) -> None:
        self.__theme = ctrl.theme.swapmodels(ReferenceWidgetTheme())
        self.__model = model
        self.__files = FileList(ctrl)

    def addtodoc(self, mainview, ctrl, *_) -> List[Widget]:
        "creates the widget"

        self.__widget = Dropdown(name='HS:reference',
                                 width=self.__theme.width,
                                 height=self.__theme.height,
                                 **self.__data())

        @mainview.actionifactive(ctrl)
        def _py_cb(new):
            inew = int(new.item)
            val = None if inew < 0 else [i for _, i in self.__files()][inew]
            self.__model.fittoreference.reference = val

        def _observe(old=None, **_):
            if 'reference' in old and mainview.isactive():
                data = self.__data()
                mainview.calllater(lambda: self.__widget.update(**data))

        ctrl.display.observe(FitToReferenceStore().name, _observe)

        self.__widget.on_click(_py_cb)
        return [self.__widget]

    def reset(self, resets):
        "updates the widget"
        resets[self.__widget].update(**self.__data())

    @property
    def widget(self):
        "returns the widget"
        return self.__widget

    def __data(self) -> dict:
        lst = list(self.__files())
        menu: list = [(j, str(i)) for i, j in enumerate(i for i, _ in lst)]
        menu += [None, (self.__theme.title, '-1')]

        key = self.__model.fittoreference.reference
        index = -1 if key is None else [i for _, i in lst].index(key)
        return dict(menu=menu, label=menu[index][0], value=str(index))