Mercurial > libervia-desktop-kivy
annotate cagou/core/common.py @ 400:71f51198478c
android: handle runtime permissions:
- some mandatory permissions are requested on Cagou start, Cagou won't start at all and
display a warning message if they are not granted (we request 5 times before showing the
warning)
- transfer plugin can now use "android_permissions" in plugin_info, to indicate what is
necessary. The permissions will then be requested, and the plugin widget won't be shown
if they are not granted (and a warning not will then be displayed)
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 09 Feb 2020 23:47:29 +0100 |
parents | 54f6a47cc60a |
children | f7476818f9fb |
rev | line source |
---|---|
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
1 #!/usr/bin/env python3 |
26
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # Cagou: desktop/mobile frontend for Salut à Toi XMPP client |
378 | 4 # Copyright (C) 2016-2020 Jérôme Poisson (goffi@goffi.org) |
26
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
237
059c5b39032d
plugin file sharing: moved common discovery widgets to new core.common_widgets module
Goffi <goffi@goffi.org>
parents:
220
diff
changeset
|
19 """common simple widgets""" |
26
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
21 import json |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
22 from functools import partial |
134 | 23 from sat.core.i18n import _ |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
24 from sat.core import log as logging |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
25 from kivy.uix.widget import Widget |
26
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from kivy.uix.image import Image |
134 | 27 from kivy.uix.label import Label |
26
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from kivy.uix.behaviors import ButtonBehavior |
193
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
29 from kivy.uix.behaviors import ToggleButtonBehavior |
107 | 30 from kivy.uix.boxlayout import BoxLayout |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
31 from kivy.uix.scrollview import ScrollView |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
32 from kivy.event import EventDispatcher |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
33 from kivy.metrics import dp |
134 | 34 from kivy import properties |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
35 from sat_frontends.quick_frontend import quick_chat |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
36 from cagou.core.constants import Const as C |
107 | 37 from cagou import G |
134 | 38 |
39 log = logging.getLogger(__name__) | |
40 | |
312 | 41 UNKNOWN_SYMBOL = 'Unknown symbol name' |
26
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 class IconButton(ButtonBehavior, Image): |
3efca1b10b2f
common: first draft of a module were common widgets will be put
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 pass |
107 | 46 |
47 | |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
48 class Avatar(Image): |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
49 pass |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
50 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
51 |
397
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
52 class NotifLabel(Label): |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
53 pass |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
54 |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
55 |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
56 class ContactItem(BoxLayout): |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
57 """An item from ContactList |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
58 |
397
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
59 The item will drawn as an icon (JID avatar) with its jid below. |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
60 If "notifs" are present in data, a notification counter will be drawn above the |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
61 avatar. |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
62 """ |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
63 base_width = dp(150) |
397
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
64 avatar_layout = properties.ObjectProperty() |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
65 avatar = properties.ObjectProperty() |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
66 profile = properties.StringProperty() |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
67 data = properties.DictProperty() |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
68 jid = properties.StringProperty('') |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
69 |
397
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
70 def on_kv_post(self, __): |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
71 if self.data and self.data.get('notifs'): |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
72 notif = NotifLabel( |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
73 pos_hint={"right": 0.8, "y": 0}, |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
74 text=str(len(self.data['notifs'])) |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
75 ) |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
76 self.avatar_layout.add_widget(notif) |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
77 |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
312
diff
changeset
|
78 |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
79 class ContactButton(ButtonBehavior, ContactItem): |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
80 pass |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
81 |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
82 |
193
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
83 class JidItem(BoxLayout): |
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
84 bg_color = properties.ListProperty([0.2, 0.2, 0.2, 1]) |
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
85 color = properties.ListProperty([1, 1, 1, 1]) |
256
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
86 jid = properties.StringProperty() |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
87 profile = properties.StringProperty() |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
88 nick = properties.StringProperty() |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
89 avatar = properties.ObjectProperty() |
107 | 90 |
256
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
91 def on_avatar(self, wid, jid_): |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
92 if self.jid and self.profile: |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
93 self.getImage() |
107 | 94 |
256
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
95 def on_jid(self, wid, jid_): |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
96 if self.profile and self.avatar: |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
97 self.getImage() |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
98 |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
99 def on_profile(self, wid, profile): |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
100 if self.jid and self.avatar: |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
101 self.getImage() |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
102 |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
103 def getImage(self): |
107 | 104 host = G.host |
105 if host.contact_lists[self.profile].isRoom(self.jid.bare): | |
256
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
106 self.avatar.opacity = 0 |
ba7b8cb7ddcd
common: don't use anymore positional argument in JidItem
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
107 self.avatar.source = "" |
107 | 108 else: |
273
0ef216091f2b
core: removed forgotten debugging code
Goffi <goffi@goffi.org>
parents:
256
diff
changeset
|
109 self.avatar.source = ( |
0ef216091f2b
core: removed forgotten debugging code
Goffi <goffi@goffi.org>
parents:
256
diff
changeset
|
110 host.getAvatar(self.jid, profile=self.profile) |
0ef216091f2b
core: removed forgotten debugging code
Goffi <goffi@goffi.org>
parents:
256
diff
changeset
|
111 or host.getDefaultAvatar(self.jid) |
0ef216091f2b
core: removed forgotten debugging code
Goffi <goffi@goffi.org>
parents:
256
diff
changeset
|
112 ) |
134 | 113 |
114 | |
193
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
115 class JidButton(ButtonBehavior, JidItem): |
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
116 pass |
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
117 |
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
118 |
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
119 class JidToggle(ToggleButtonBehavior, JidItem): |
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
120 selected_color = properties.ListProperty(C.COLOR_SEC_DARK) |
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
121 |
284cb5c467b0
core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents:
179
diff
changeset
|
122 |
134 | 123 class Symbol(Label): |
124 symbol_map = None | |
125 symbol = properties.StringProperty() | |
126 | |
127 def __init__(self, **kwargs): | |
128 if self.symbol_map is None: | |
129 with open(G.host.app.expand('{media}/fonts/fontello/config.json')) as f: | |
130 fontello_conf = json.load(f) | |
131 Symbol.symbol_map = {g['css']:g['code'] for g in fontello_conf['glyphs']} | |
132 | |
133 super(Symbol, self).__init__(**kwargs) | |
134 | |
135 def on_symbol(self, instance, symbol): | |
136 try: | |
137 code = self.symbol_map[symbol] | |
138 except KeyError: | |
312 | 139 log.warning(_("Invalid symbol {symbol}").format(symbol=symbol)) |
134 | 140 else: |
312 | 141 self.text = chr(code) |
135
091e288838e1
plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
142 |
091e288838e1
plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
143 |
091e288838e1
plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
144 class SymbolButton(ButtonBehavior, Symbol): |
091e288838e1
plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
145 pass |
178
11ff8cd93659
common: new ActionSymbol widget, which use a symbol to show an action
Goffi <goffi@goffi.org>
parents:
145
diff
changeset
|
146 |
11ff8cd93659
common: new ActionSymbol widget, which use a symbol to show an action
Goffi <goffi@goffi.org>
parents:
145
diff
changeset
|
147 |
218
30be583dbabc
core (common): new SymbolLabel class to have a clickable area with a symbol and a label next to it.
Goffi <goffi@goffi.org>
parents:
193
diff
changeset
|
148 class SymbolLabel(ButtonBehavior, BoxLayout): |
30be583dbabc
core (common): new SymbolLabel class to have a clickable area with a symbol and a label next to it.
Goffi <goffi@goffi.org>
parents:
193
diff
changeset
|
149 symbol = properties.StringProperty("") |
30be583dbabc
core (common): new SymbolLabel class to have a clickable area with a symbol and a label next to it.
Goffi <goffi@goffi.org>
parents:
193
diff
changeset
|
150 text = properties.StringProperty("") |
30be583dbabc
core (common): new SymbolLabel class to have a clickable area with a symbol and a label next to it.
Goffi <goffi@goffi.org>
parents:
193
diff
changeset
|
151 color = properties.ListProperty(C.COLOR_SEC) |
30be583dbabc
core (common): new SymbolLabel class to have a clickable area with a symbol and a label next to it.
Goffi <goffi@goffi.org>
parents:
193
diff
changeset
|
152 bold = properties.BooleanProperty(True) |
30be583dbabc
core (common): new SymbolLabel class to have a clickable area with a symbol and a label next to it.
Goffi <goffi@goffi.org>
parents:
193
diff
changeset
|
153 symbol_wid = properties.ObjectProperty() |
30be583dbabc
core (common): new SymbolLabel class to have a clickable area with a symbol and a label next to it.
Goffi <goffi@goffi.org>
parents:
193
diff
changeset
|
154 label = properties.ObjectProperty() |
30be583dbabc
core (common): new SymbolLabel class to have a clickable area with a symbol and a label next to it.
Goffi <goffi@goffi.org>
parents:
193
diff
changeset
|
155 |
30be583dbabc
core (common): new SymbolLabel class to have a clickable area with a symbol and a label next to it.
Goffi <goffi@goffi.org>
parents:
193
diff
changeset
|
156 |
178
11ff8cd93659
common: new ActionSymbol widget, which use a symbol to show an action
Goffi <goffi@goffi.org>
parents:
145
diff
changeset
|
157 class ActionSymbol(Symbol): |
11ff8cd93659
common: new ActionSymbol widget, which use a symbol to show an action
Goffi <goffi@goffi.org>
parents:
145
diff
changeset
|
158 pass |
179
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
159 |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
160 |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
161 class ActionIcon(BoxLayout): |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
162 plugin_info = properties.DictProperty() |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
163 |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
164 def on_plugin_info(self, instance, plugin_info): |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
165 self.clear_widgets() |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
166 try: |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
167 symbol = plugin_info['icon_symbol'] |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
168 except KeyError: |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
169 icon_src = plugin_info['icon_medium'] |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
170 icon_wid = Image(source=icon_src, allow_stretch=True) |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
171 self.add_widget(icon_wid) |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
172 else: |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
173 icon_wid = ActionSymbol(symbol=symbol) |
7177fe2d9725
common: new ActionIcon widget which display symbol or image icon according to what is specified in plugin_info
Goffi <goffi@goffi.org>
parents:
178
diff
changeset
|
174 self.add_widget(icon_wid) |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
175 |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
176 |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
177 class JidSelector(ScrollView, EventDispatcher): |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
178 layout = properties.ObjectProperty(None) |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
179 # list of item to show, can be: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
180 # - a well-known string like: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
181 # * "roster": to show all roster jids |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
182 # * "opened_chats": to show jids of all opened chat widgets |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
183 # - a kivy Widget, which will be added to the layout (notable useful with |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
184 # common_widgets.CategorySeparator) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
185 # - a callable, which must return an iterable of kwargs for ContactButton |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
186 to_show = properties.ListProperty(['roster']) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
187 # if True, update() is called automatically when widget is created |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
188 # if False, you'll have to call update() at least once manually |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
189 implicit_update = properties.ObjectProperty(True) |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
190 |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
191 def __init__(self, **kwargs): |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
192 self.register_event_type('on_select') |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
193 super().__init__(**kwargs) |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
194 |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
195 def on_kv_post(self, wid): |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
196 if self.implicit_update: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
197 self.update() |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
198 |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
199 def on_select(self, wid): |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
200 pass |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
201 |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
202 def on_parent(self, wid, parent): |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
203 if parent is None: |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
204 log.debug("removing contactsFilled listener") |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
205 G.host.removeListener("contactsFilled", self.onContactsFilled) |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
206 else: |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
207 G.host.addListener("contactsFilled", self.onContactsFilled) |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
208 |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
209 def onContactsFilled(self, profile): |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
210 log.debug("onContactsFilled event received") |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
211 self.update() |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
212 |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
213 def update(self): |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
214 log.debug("starting update") |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
215 self.layout.clear_widgets() |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
216 for item in self.to_show: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
217 if isinstance(item, str): |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
218 if item == 'roster': |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
219 self.addRosterItems() |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
220 elif item == 'bookmarks': |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
221 self.addBookmarksItems() |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
222 elif item == 'opened_chats': |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
223 self.addOpenedChatsItems() |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
224 else: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
225 log.error(f'unknown "to_show" magic string {item!r}') |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
226 elif isinstance(item, Widget): |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
227 self.layout.add_widget(item) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
228 elif callable(item): |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
229 items_kwargs = item() |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
230 for item_kwargs in items_kwargs: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
231 item = ContactButton(**item_kwargs) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
232 item.bind(on_press=partial(self.dispatch, 'on_select')) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
233 self.layout.add_widget(item) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
234 else: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
235 log.error(f"unmanaged to_show item type: {item!r}") |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
236 |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
237 def addOpenedChatsItems(self): |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
238 opened_chats = G.host.widgets.getWidgets( |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
239 quick_chat.QuickChat, |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
240 profiles = G.host.profiles) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
241 |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
242 for wid in opened_chats: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
243 contact_list = G.host.contact_lists[wid.profile] |
397
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
244 data=contact_list.getItem(wid.target) |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
245 notifs = list(G.host.getNotifs(wid.target, profile=wid.profile)) |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
246 if notifs: |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
247 # we shallow copy the dict to have the notification displayed only with |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
248 # opened chats (otherwise, the counter would appear on each other |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
249 # instance of ContactButton for this entity, i.e. in roster too). |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
250 data = data.copy() |
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
251 data['notifs'] = notifs |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
252 try: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
253 item = ContactButton( |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
254 jid=wid.target, |
397
54f6a47cc60a
core (common): added a notifications counter on ContactButton and use it in JidSelector:
Goffi <goffi@goffi.org>
parents:
389
diff
changeset
|
255 data=data, |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
256 profile=wid.profile, |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
257 ) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
258 except Exception as e: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
259 log.warning(f"Can't add contact {wid.target}: {e}") |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
260 continue |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
261 item.bind(on_press=partial(self.dispatch, 'on_select')) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
262 self.layout.add_widget(item) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
263 |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
264 def addRosterItems(self): |
348
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
265 for profile in G.host.profiles: |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
266 contact_list = G.host.contact_lists[profile] |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
267 for entity_jid in sorted(contact_list.roster): |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
268 item = ContactButton( |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
269 jid=entity_jid, |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
270 data=contact_list.getItem(entity_jid), |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
271 profile=profile, |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
272 ) |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
273 item.bind(on_press=partial(self.dispatch, 'on_select')) |
38fd457b2158
core (common, share_widget): new JidSelector widget:
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
274 self.layout.add_widget(item) |
389
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
275 |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
276 def addBookmarksItems(self): |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
277 for profile in G.host.profiles: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
278 profile_manager = G.host.profiles[profile] |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
279 try: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
280 bookmarks = profile_manager._bookmarks |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
281 except AttributeError: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
282 log.warning(f"no bookmark in cache for profile {profile}") |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
283 continue |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
284 |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
285 contact_list = G.host.contact_lists[profile] |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
286 for entity_jid in bookmarks: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
287 try: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
288 cache = contact_list.getItem(entity_jid) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
289 except KeyError: |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
290 cache = {} |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
291 item = ContactButton( |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
292 jid=entity_jid, |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
293 data=cache, |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
294 profile=profile, |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
295 ) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
296 item.bind(on_press=partial(self.dispatch, 'on_select')) |
442756495a96
core (common): improved flexibility of jid selector:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
297 self.layout.add_widget(item) |