Mercurial > libervia-backend
diff libervia/tui/widget.py @ 4076:b620a8e882e1
refactoring: rename `libervia.frontends.primitivus` to `libervia.tui`
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 02 Jun 2023 16:25:25 +0200 |
parents | libervia/frontends/primitivus/widget.py@26b7ed2817da |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libervia/tui/widget.py Fri Jun 02 16:25:25 2023 +0200 @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 + + +# Libervia TUI +# Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from libervia.backend.core import log as logging + +log = logging.getLogger(__name__) +import urwid +from urwid_satext import sat_widgets +from libervia.tui.keys import action_key_map as a_key + + +class LiberviaTUIWidget(urwid.WidgetWrap): + """Base widget for LiberviaTUI""" + + def __init__(self, w, title=""): + self._title = title + self._title_dynamic = None + self._original_widget = w + urwid.WidgetWrap.__init__(self, self._get_decoration(w)) + + @property + def title(self): + """Text shown in title bar of the widget""" + + # profiles currently managed by frontend + try: + all_profiles = self.host.profiles + except AttributeError: + all_profiles = [] + + # profiles managed by the widget + try: + profiles = self.profiles + except AttributeError: + try: + profiles = [self.profile] + except AttributeError: + profiles = [] + + title_elts = [] + if self._title: + title_elts.append(self._title) + if self._title_dynamic: + title_elts.append(self._title_dynamic) + if len(all_profiles) > 1 and profiles: + title_elts.append("[{}]".format(", ".join(profiles))) + return sat_widgets.SurroundedText(" ".join(title_elts)) + + @title.setter + def title(self, value): + self._title = value + if self.decoration_visible: + self.show_decoration() + + @property + def title_dynamic(self): + """Dynamic part of title""" + return self._title_dynamic + + @title_dynamic.setter + def title_dynamic(self, value): + self._title_dynamic = value + if self.decoration_visible: + self.show_decoration() + + @property + def decoration_visible(self): + """True if the decoration is visible""" + return isinstance(self._w, sat_widgets.LabelLine) + + def keypress(self, size, key): + if key == a_key["DECORATION_HIDE"]: # user wants to (un)hide widget decoration + show = not self.decoration_visible + self.show_decoration(show) + else: + return super(LiberviaTUIWidget, self).keypress(size, key) + + def _get_decoration(self, widget): + return sat_widgets.LabelLine(widget, self.title) + + def show_decoration(self, show=True): + """Show/Hide the decoration around the window""" + self._w = ( + self._get_decoration(self._original_widget) if show else self._original_widget + ) + + def get_menu(self): + raise NotImplementedError