Mercurial > libervia-desktop-kivy
view cagou/core/common.py @ 352:434f770fe55b
core (Cagou): add debug log for widget visibility + ignore_missing:
- debug log are now use to show which widget are made (in)visible, and to show the list of
currently visible widgets
- "ignore_missing" can be used in _removeVisibleWidget when we can expect that a widget is
missing in visible widgets list.
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 17 Jan 2020 18:44:35 +0100 |
parents | 38fd457b2158 |
children | 4d660b252487 |
line wrap: on
line source
#!/usr/bin/env python3 # Cagou: desktop/mobile frontend for Salut à Toi XMPP client # Copyright (C) 2016-2019 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/>. """common simple widgets""" import json from functools import partial from sat.core.i18n import _ from sat.core import log as logging from kivy.uix.image import Image from kivy.uix.label import Label from kivy.uix.behaviors import ButtonBehavior from kivy.uix.behaviors import ToggleButtonBehavior from kivy.uix.boxlayout import BoxLayout from kivy.uix.scrollview import ScrollView from kivy.event import EventDispatcher from kivy.metrics import dp from kivy import properties from cagou.core.constants import Const as C from cagou import G log = logging.getLogger(__name__) UNKNOWN_SYMBOL = 'Unknown symbol name' class IconButton(ButtonBehavior, Image): pass class Avatar(Image): pass class ContactItem(BoxLayout): """An item from ContactList The item will drawn as an icon (JID avatar) with its jid below """ base_width = dp(150) profile = properties.StringProperty() data = properties.DictProperty() jid = properties.StringProperty('') class ContactButton(ButtonBehavior, ContactItem): pass class JidItem(BoxLayout): bg_color = properties.ListProperty([0.2, 0.2, 0.2, 1]) color = properties.ListProperty([1, 1, 1, 1]) jid = properties.StringProperty() profile = properties.StringProperty() nick = properties.StringProperty() avatar = properties.ObjectProperty() def on_avatar(self, wid, jid_): if self.jid and self.profile: self.getImage() def on_jid(self, wid, jid_): if self.profile and self.avatar: self.getImage() def on_profile(self, wid, profile): if self.jid and self.avatar: self.getImage() def getImage(self): host = G.host if host.contact_lists[self.profile].isRoom(self.jid.bare): self.avatar.opacity = 0 self.avatar.source = "" else: self.avatar.source = ( host.getAvatar(self.jid, profile=self.profile) or host.getDefaultAvatar(self.jid) ) class JidButton(ButtonBehavior, JidItem): pass class JidToggle(ToggleButtonBehavior, JidItem): selected_color = properties.ListProperty(C.COLOR_SEC_DARK) class Symbol(Label): symbol_map = None symbol = properties.StringProperty() def __init__(self, **kwargs): if self.symbol_map is None: with open(G.host.app.expand('{media}/fonts/fontello/config.json')) as f: fontello_conf = json.load(f) Symbol.symbol_map = {g['css']:g['code'] for g in fontello_conf['glyphs']} super(Symbol, self).__init__(**kwargs) def on_symbol(self, instance, symbol): try: code = self.symbol_map[symbol] except KeyError: log.warning(_("Invalid symbol {symbol}").format(symbol=symbol)) else: self.text = chr(code) class SymbolButton(ButtonBehavior, Symbol): pass class SymbolLabel(ButtonBehavior, BoxLayout): symbol = properties.StringProperty("") text = properties.StringProperty("") color = properties.ListProperty(C.COLOR_SEC) bold = properties.BooleanProperty(True) symbol_wid = properties.ObjectProperty() label = properties.ObjectProperty() class ActionSymbol(Symbol): pass class ActionIcon(BoxLayout): plugin_info = properties.DictProperty() def on_plugin_info(self, instance, plugin_info): self.clear_widgets() try: symbol = plugin_info['icon_symbol'] except KeyError: icon_src = plugin_info['icon_medium'] icon_wid = Image(source=icon_src, allow_stretch=True) self.add_widget(icon_wid) else: icon_wid = ActionSymbol(symbol=symbol) self.add_widget(icon_wid) class JidSelector(ScrollView, EventDispatcher): layout = properties.ObjectProperty(None) def __init__(self, **kwargs): self.register_event_type('on_select') super().__init__(**kwargs) def on_kv_post(self, wid): self.addRosterContacts() def on_select(self, wid): pass def on_parent(self, wid, parent): if parent is None: log.debug("removing contactsFilled listener") G.host.removeListener("contactsFilled", self.onContactsFilled) else: G.host.addListener("contactsFilled", self.onContactsFilled) def onContactsFilled(self, profile): log.debug("onContactsFilled event received") self.addRosterContacts() def addRosterContacts(self): log.debug("starting addRosterContacts") self.layout.clear_widgets() for profile in G.host.profiles: contact_list = G.host.contact_lists[profile] for entity_jid in sorted(contact_list.roster): item = ContactButton( jid=entity_jid, data=contact_list.getItem(entity_jid), profile=profile, ) item.bind(on_press=partial(self.dispatch, 'on_select')) self.layout.add_widget(item)