Source code for zelfred.item

# -*- coding: utf-8 -*-

"""
Item is the basic building block of the terminal UI. It represents a single
selectable item in the dropdown menu. User can move or scroll selector up and down
to select an item, and then perform :mod:`~zelfred.action`.
"""

import typing as T
import uuid
import dataclasses

from .constants import DEFAULT_TITLE, DEFAULT_SUBTITLE
from .exc import EndOfInputError


if T.TYPE_CHECKING:  # pragma: no cover
    from .ui import UI


def gen_uid() -> str:
    return uuid.uuid4().hex


[docs]@dataclasses.dataclass class Item: """ Represent an item in the terminal UI. In the example below, the ``[x] Beautiful is better than ugly`` and ``subtitle 01`` is one item. .. code-block:: bash (Query): [x] Beautiful is better than ugly. subtitle 01 [ ] Explicit is better than implicit. subtitle 02 [ ] Simple is better than complex. subtitle 03 :param uid: item unique id. The UI use this to distinguish different items. :param title: first line of the item. It has a checkbox in front of it to indicate whether it is selected. :param subtitle: second line of the item. :param arg: argument that will be passed to the action. :param autocomplete: the text that will be filled in the input box when user hits ``TAB`` key. :param variables: arbitrary dictionary object, it can be used in the action. """ title: str = dataclasses.field() subtitle: T.Optional[str] = dataclasses.field(default=None) uid: str = dataclasses.field(default_factory=gen_uid) arg: T.Optional[str] = dataclasses.field(default=None) autocomplete: T.Optional[str] = dataclasses.field(default=None) variables: T.Dict[str, T.Any] = dataclasses.field(default_factory=dict) @property def title_text(self) -> str: return self.title or DEFAULT_TITLE @property def subtitle_text(self) -> str: return self.subtitle or DEFAULT_SUBTITLE
[docs] def enter_handler(self, ui: "UI"): """ This is the abstract method that will perform user defined action when user hits ``Enter`` on this item. Develop should inherit this class and override this method to perform user defined action. :param ui: the :class:`~zelfred.ui.UI` object. """ pass
[docs] def post_enter_handler(self, ui: "UI"): # pragma: no cover """ This is the abstract method that will update the UI after taking user action. :param ui: the :class:`~zelfred.ui.UI` object. """ # ui.render.clear_n_lines(1) ui.need_run_handler = False raise EndOfInputError(selection=self)
[docs] def ctrl_a_handler(self, ui: "UI"): """ This is the abstract method that will perform user defined action when user hits ``Ctrl + A`` on this item. Develop should inherit this class and override this method to perform user defined action. :param ui: the :class:`~zelfred.ui.UI` object. """ pass
[docs] def post_ctrl_a_handler(self, ui: "UI"): # pragma: no cover """ This is the abstract method that will update the UI after taking user action. :param ui: the :class:`~zelfred.ui.UI` object. """ ui.need_run_handler = False raise EndOfInputError(selection=self)
[docs] def ctrl_w_handler(self, ui: "UI"): """ This is the abstract method that will perform user defined action when user hits ``Ctrl + W`` on this item. Develop should inherit this class and override this method to perform user defined action. :param ui: the :class:`~zelfred.ui.UI` object. """ pass
[docs] def post_ctrl_w_handler(self, ui: "UI"): # pragma: no cover """ This is the abstract method that will update the UI after taking user action. :param ui: the :class:`~zelfred.ui.UI` object. """ ui.need_run_handler = False raise EndOfInputError(selection=self)
[docs] def ctrl_u_handler(self, ui: "UI"): """ This is the abstract method that will perform user defined action when user hits ``Ctrl + U`` on this item. Develop should inherit this class and override this method to perform user defined action. :param ui: the :class:`~zelfred.ui.UI` object. """ pass
[docs] def post_ctrl_u_handler(self, ui: "UI"): # pragma: no cover """ This is the abstract method that will update the UI after taking user action. :param ui: the :class:`~zelfred.ui.UI` object. """ ui.need_run_handler = False raise EndOfInputError(selection=self)
[docs] def ctrl_p_handler(self, ui: "UI"): """ This is the abstract method that will perform user defined action when user hits ``Ctrl + P`` on this item. Develop should inherit this class and override this method to perform user defined action. :param ui: the :class:`~zelfred.ui.UI` object. """ pass
[docs] def post_ctrl_p_handler(self, ui: "UI"): # pragma: no cover """ This is the abstract method that will update the UI after taking user action. :param ui: the :class:`~zelfred.ui.UI` object. """ ui.need_run_handler = False raise EndOfInputError(selection=self)
T_ITEM = T.TypeVar("T_ITEM", bound=Item)