annotate cagou/plugins/plugin_wid_chat.py @ 354:aa860c10acfc

chat: new chat selector: Using the new ScreenManager feature, a widget to select a chat to display is shown when a user opens the chat (except if an entity jid is specified, in which case it opens directly the Chat widget), or when user presses ESC. When on ChatSelector, pressing ESC brings to the root widget (i.e. default widget). The ChatSelect is a first draft, it is planned to show opened chats, rooms, and a way to create new chats.
author Goffi <goffi@goffi.org>
date Fri, 17 Jan 2020 18:44:35 +0100
parents 19422bbd9c8e
children 307c2501d8b2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/python
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # Cagou: desktop/mobile frontend for Salut à Toi XMPP client
282
1b835bcfa663 date update
Goffi <goffi@goffi.org>
parents: 281
diff changeset
4 # Copyright (C) 2016-2019 Jérôme Poisson (goffi@goffi.org)
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
19
276
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
20 from functools import partial
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
21 import mimetypes
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
22 import sys
78
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
23 from kivy.uix.boxlayout import BoxLayout
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from kivy.uix.textinput import TextInput
354
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
25 from kivy.uix.screenmanager import Screen, NoTransition
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
26 from kivy.uix import screenmanager
185
ab3f5173ef5c chat, simple XHTML: font size adjustement
Goffi <goffi@goffi.org>
parents: 184
diff changeset
27 from kivy.metrics import sp, dp
276
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
28 from kivy.clock import Clock
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 from kivy import properties
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
30 from kivy.uix.dropdown import DropDown
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
31 from kivy.core.window import Window
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
32 from sat.core import log as logging
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
33 from sat.core.i18n import _
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
34 from sat.core import exceptions
333
69d2a96ce26f chat: serialise `options` in `fileUpload` following change in backend
Goffi <goffi@goffi.org>
parents: 332
diff changeset
35 from sat.tools.common import data_format
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 from sat_frontends.quick_frontend import quick_widgets
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 from sat_frontends.quick_frontend import quick_chat
106
9909ed7a7a20 moved SimpleXHTMLWidget to a dedicated module
Goffi <goffi@goffi.org>
parents: 105
diff changeset
38 from sat_frontends.tools import jid
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
39 from cagou import G
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
40 from cagou.core.constants import Const as C
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 from cagou.core import cagou_widget
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
42 from cagou.core import xmlui
106
9909ed7a7a20 moved SimpleXHTMLWidget to a dedicated module
Goffi <goffi@goffi.org>
parents: 105
diff changeset
43 from cagou.core.image import Image
193
284cb5c467b0 core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents: 186
diff changeset
44 from cagou.core.common import SymbolButton, JidButton
278
444ba439530f chat: moved transfer button to header_box
Goffi <goffi@goffi.org>
parents: 277
diff changeset
45 from cagou.core import menu
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
46
276
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
47 log = logging.getLogger(__name__)
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
48
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 PLUGIN_INFO = {
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
50 "name": _("chat"),
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 "main": "Chat",
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
52 "description": _("instant messaging with one person or a group"),
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
53 "icon_symbol": "chat",
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 }
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
55
244
5bd94bc08f5c plugin chat: fixed OTR State filtering + removed some legacy code
Goffi <goffi@goffi.org>
parents: 242
diff changeset
56 # FIXME: OTR specific code is legacy, and only used nowadays for lock color
5bd94bc08f5c plugin chat: fixed OTR State filtering + removed some legacy code
Goffi <goffi@goffi.org>
parents: 242
diff changeset
57 # we can probably get rid of them.
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
58 OTR_STATE_UNTRUSTED = 'untrusted'
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
59 OTR_STATE_TRUSTED = 'trusted'
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
60 OTR_STATE_TRUST = (OTR_STATE_UNTRUSTED, OTR_STATE_TRUSTED)
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
61 OTR_STATE_UNENCRYPTED = 'unencrypted'
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
62 OTR_STATE_ENCRYPTED = 'encrypted'
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
63 OTR_STATE_ENCRYPTION = (OTR_STATE_UNENCRYPTED, OTR_STATE_ENCRYPTED)
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
64
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
65 SYMBOL_UNENCRYPTED = 'lock-open'
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
66 SYMBOL_ENCRYPTED = 'lock'
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
67 SYMBOL_ENCRYPTED_TRUSTED = 'lock-filled'
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
68 COLOR_UNENCRYPTED = (0.4, 0.4, 0.4, 1)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
69 COLOR_ENCRYPTED = (0.4, 0.4, 0.4, 1)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
70 COLOR_ENCRYPTED_TRUSTED = (0.29,0.87,0.0,1)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
71
326
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
72 # below this limit, new messages will be prepended
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
73 INFINITE_SCROLL_LIMIT = dp(600)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
74
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
75
44
7819e9efa250 chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents: 42
diff changeset
76 class MessAvatar(Image):
7819e9efa250 chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents: 42
diff changeset
77 pass
7819e9efa250 chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents: 42
diff changeset
78
7819e9efa250 chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents: 42
diff changeset
79
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
80 class MessageWidget(quick_chat.MessageWidget, BoxLayout):
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 mess_data = properties.ObjectProperty()
57
a51ea7874e43 chat: XHTML parsing first draft:
Goffi <goffi@goffi.org>
parents: 54
diff changeset
82 mess_xhtml = properties.ObjectProperty()
45
b0595a33465d chat: design improvments:
Goffi <goffi@goffi.org>
parents: 44
diff changeset
83 mess_padding = (dp(5), dp(5))
47
abb81efef3bb chat: update avatar following quick frontend improvments
Goffi <goffi@goffi.org>
parents: 46
diff changeset
84 avatar = properties.ObjectProperty()
103
c601e3d40342 chat: display delivery receipt (with a green check mark)
Goffi <goffi@goffi.org>
parents: 102
diff changeset
85 delivery = properties.ObjectProperty()
185
ab3f5173ef5c chat, simple XHTML: font size adjustement
Goffi <goffi@goffi.org>
parents: 184
diff changeset
86 font_size = properties.NumericProperty(sp(12))
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
87 right_part = properties.ObjectProperty()
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
88 header_box = properties.ObjectProperty()
47
abb81efef3bb chat: update avatar following quick frontend improvments
Goffi <goffi@goffi.org>
parents: 46
diff changeset
89
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
90 def on_mess_data(self, wid, mess_data):
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
91 mess_data.widgets.add(self)
44
7819e9efa250 chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents: 42
diff changeset
92
7819e9efa250 chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents: 42
diff changeset
93 @property
7819e9efa250 chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents: 42
diff changeset
94 def chat(self):
7819e9efa250 chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents: 42
diff changeset
95 """return parent Chat instance"""
7819e9efa250 chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents: 42
diff changeset
96 return self.mess_data.parent
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
97
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
98 def _get_from_mess_data(self, name, default):
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
99 if self.mess_data is None:
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
100 return default
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
101 return getattr(self.mess_data, name)
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
102
289
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
103 def _get_message(self):
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 """Return currently displayed message"""
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
105 if self.mess_data is None:
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
106 return ""
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 return self.mess_data.main_message
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
108
289
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
109 def _set_message(self, message):
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
110 if self.mess_data is None:
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
111 return False
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
112 if message == self.mess_data.message.get(""):
289
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
113 return False
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
114 self.mess_data.message = {"": message}
289
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
115 return True
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
116
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
117 message = properties.AliasProperty(
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
118 partial(_get_from_mess_data, name="main_message", default=""),
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
119 _set_message,
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
120 bind=['mess_data'],
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
121 )
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
122 message_xhtml = properties.AliasProperty(
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
123 partial(_get_from_mess_data, name="main_message_xhtml", default=""),
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
124 bind=['mess_data'])
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
125 mess_type = properties.AliasProperty(
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
126 partial(_get_from_mess_data, name="type", default=""), bind=['mess_data'])
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
127 own_mess = properties.AliasProperty(
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
128 partial(_get_from_mess_data, name="own_mess", default=False), bind=['mess_data'])
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
129 nick = properties.AliasProperty(
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
130 partial(_get_from_mess_data, name="nick", default=""), bind=['mess_data'])
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
131 time_text = properties.AliasProperty(
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
132 partial(_get_from_mess_data, name="time_text", default=""), bind=['mess_data'])
57
a51ea7874e43 chat: XHTML parsing first draft:
Goffi <goffi@goffi.org>
parents: 54
diff changeset
133
289
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
134 @property
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
135 def info_type(self):
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
136 return self.mess_data.info_type
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
137
54
514c187afebc chat: changed udpate to use dict instead of single key/value
Goffi <goffi@goffi.org>
parents: 47
diff changeset
138 def update(self, update_dict):
514c187afebc chat: changed udpate to use dict instead of single key/value
Goffi <goffi@goffi.org>
parents: 47
diff changeset
139 if 'avatar' in update_dict:
514c187afebc chat: changed udpate to use dict instead of single key/value
Goffi <goffi@goffi.org>
parents: 47
diff changeset
140 self.avatar.source = update_dict['avatar']
103
c601e3d40342 chat: display delivery receipt (with a green check mark)
Goffi <goffi@goffi.org>
parents: 102
diff changeset
141 if 'status' in update_dict:
c601e3d40342 chat: display delivery receipt (with a green check mark)
Goffi <goffi@goffi.org>
parents: 102
diff changeset
142 status = update_dict['status']
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
143 self.delivery.text = '\u2714' if status == 'delivered' else ''
47
abb81efef3bb chat: update avatar following quick frontend improvments
Goffi <goffi@goffi.org>
parents: 46
diff changeset
144
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
145
276
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
146 class SendButton(SymbolButton):
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
147 message_input_box = properties.ObjectProperty()
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
148
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
149
78
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
150 class MessageInputBox(BoxLayout):
276
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
151 message_input = properties.ObjectProperty()
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
152
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
153 def __init__(self, *args, **kwargs):
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
154 super(MessageInputBox, self).__init__(*args, **kwargs)
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
155 Clock.schedule_once(self.post_init, 0)
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
156
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
157 def post_init(self, *args):
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
158 if sys.platform == 'android':
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
159 self.add_widget(SendButton(message_input_box=self), 0)
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
160
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
161 def send_text(self):
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
162 self.message_input.send_text()
78
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
163
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
164
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 class MessageInputWidget(TextInput):
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
166
276
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
167 def keyboard_on_key_down(self, window, keycode, text, modifiers):
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
168 # We don't send text when shift is pressed to be able to add line feeds
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
169 # (i.e. multi-lines messages). We don't send on Android either as the
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
170 # send button appears on this platform.
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
171 if (keycode[-1] == "enter"
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
172 and "shift" not in modifiers
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
173 and sys.platform != 'android'):
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
174 self.send_text()
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 else:
276
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
176 return super(MessageInputWidget, self).keyboard_on_key_down(
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
177 window, keycode, text, modifiers)
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
178
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
179 def send_text(self):
a0835f0212d8 chat: multi-lines input:
Goffi <goffi@goffi.org>
parents: 265
diff changeset
180 self.dispatch('on_text_validate')
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
181
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
182
278
444ba439530f chat: moved transfer button to header_box
Goffi <goffi@goffi.org>
parents: 277
diff changeset
183 class TransferButton(SymbolButton):
444ba439530f chat: moved transfer button to header_box
Goffi <goffi@goffi.org>
parents: 277
diff changeset
184 chat = properties.ObjectProperty()
444ba439530f chat: moved transfer button to header_box
Goffi <goffi@goffi.org>
parents: 277
diff changeset
185
444ba439530f chat: moved transfer button to header_box
Goffi <goffi@goffi.org>
parents: 277
diff changeset
186 def on_release(self, *args):
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents: 312
diff changeset
187 menu.TransferMenu(callback=self.chat.transferFile).show(self)
278
444ba439530f chat: moved transfer button to header_box
Goffi <goffi@goffi.org>
parents: 277
diff changeset
188
444ba439530f chat: moved transfer button to header_box
Goffi <goffi@goffi.org>
parents: 277
diff changeset
189
287
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
190 class ExtraMenu(DropDown):
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
191 chat = properties.ObjectProperty()
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
192
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
193 def on_select(self, menu):
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
194 if menu == 'bookmark':
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
195 G.host.bridge.menuLaunch(C.MENU_GLOBAL, ("groups", "bookmarks"),
287
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
196 {}, C.NO_SECURITY_LIMIT, self.chat.profile,
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
197 callback=partial(
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
198 G.host.actionManager, profile=self.chat.profile),
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
199 errback=G.host.errback)
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
200 else:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
201 raise exceptions.InternalError("Unknown menu: {}".format(menu))
287
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
202
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
203
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
204 class ExtraButton(SymbolButton):
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
205 chat = properties.ObjectProperty()
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
206
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
207
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
208 class EncryptionMainButton(SymbolButton):
117
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
209
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
210 def __init__(self, chat, **kwargs):
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
211 """
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
212 @param chat(Chat): Chat instance
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
213 """
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
214 self.chat = chat
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
215 self.encryption_menu = EncryptionMenu(chat)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
216 super(EncryptionMainButton, self).__init__(**kwargs)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
217 self.bind(on_release=self.encryption_menu.open)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
218
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
219 def selectAlgo(self, name):
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
220 """Mark an encryption algorithm as selected.
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
221
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
222 This will also deselect all other button
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
223 @param name(unicode, None): encryption plugin name
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
224 None for plain text
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
225 """
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
226 buttons = self.encryption_menu.container.children
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
227 buttons[-1].selected = name is None
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
228 for button in buttons[:-1]:
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
229 button.selected = button.text == name
117
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
230
135
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
231 def getColor(self):
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
232 if self.chat.otr_state_encryption == OTR_STATE_UNENCRYPTED:
135
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
233 return (0.4, 0.4, 0.4, 1)
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
234 elif self.chat.otr_state_trust == OTR_STATE_TRUSTED:
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
235 return (0.29,0.87,0.0,1)
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
236 else:
135
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
237 return (0.4, 0.4, 0.4, 1)
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
238
135
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
239 def getSymbol(self):
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
240 if self.chat.otr_state_encryption == OTR_STATE_UNENCRYPTED:
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
241 return 'lock-open'
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
242 elif self.chat.otr_state_trust == OTR_STATE_TRUSTED:
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
243 return 'lock-filled'
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
244 else:
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
245 return 'lock'
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
246
117
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
247
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
248 class TrustManagementButton(SymbolButton):
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
249 pass
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
250
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
251
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
252 class EncryptionButton(BoxLayout):
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
253 selected = properties.BooleanProperty(False)
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
254 text = properties.StringProperty()
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
255 trust_button = properties.BooleanProperty(False)
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
256 best_width = properties.NumericProperty(0)
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
257 bold = properties.BooleanProperty(True)
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
258
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
259 def __init__(self, **kwargs):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
260 super(EncryptionButton, self).__init__(**kwargs)
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
261 self.register_event_type('on_release')
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
262 self.register_event_type('on_trust_release')
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
263 if self.trust_button:
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
264 self.add_widget(TrustManagementButton())
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
265
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
266 def on_release(self):
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
267 pass
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
268
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
269 def on_trust_release(self):
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
270 pass
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
271
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
272
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
273 class EncryptionMenu(DropDown):
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
274 # best with to display all algorithms buttons + trust buttons
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
275 best_width = properties.NumericProperty(0)
117
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
276
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
277 def __init__(self, chat, **kwargs):
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
278 """
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
279 @param chat(Chat): Chat instance
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
280 """
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
281 self.chat = chat
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
282 super(EncryptionMenu, self).__init__(**kwargs)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
283 btn = EncryptionButton(
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
284 text=_("unencrypted (plain text)"),
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
285 on_release=self.unencrypted,
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
286 selected=True,
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
287 bold=False,
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
288 )
332
13bc00b9743a chat: use `bind` for EncryptionButton events:
Goffi <goffi@goffi.org>
parents: 329
diff changeset
289 btn.bind(
13bc00b9743a chat: use `bind` for EncryptionButton events:
Goffi <goffi@goffi.org>
parents: 329
diff changeset
290 on_release=self.unencrypted,
13bc00b9743a chat: use `bind` for EncryptionButton events:
Goffi <goffi@goffi.org>
parents: 329
diff changeset
291 )
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
292 self.add_widget(btn)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
293 for plugin in G.host.encryption_plugins:
339
63cdabdd032e chat: show encryption button with group chats:
Goffi <goffi@goffi.org>
parents: 338
diff changeset
294 if chat.type == C.CHAT_GROUP and plugin["directed"]:
63cdabdd032e chat: show encryption button with group chats:
Goffi <goffi@goffi.org>
parents: 338
diff changeset
295 # directed plugins can't work with group chat
63cdabdd032e chat: show encryption button with group chats:
Goffi <goffi@goffi.org>
parents: 338
diff changeset
296 continue
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
297 btn = EncryptionButton(
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
298 text=plugin['name'],
332
13bc00b9743a chat: use `bind` for EncryptionButton events:
Goffi <goffi@goffi.org>
parents: 329
diff changeset
299 trust_button=True,
13bc00b9743a chat: use `bind` for EncryptionButton events:
Goffi <goffi@goffi.org>
parents: 329
diff changeset
300 )
13bc00b9743a chat: use `bind` for EncryptionButton events:
Goffi <goffi@goffi.org>
parents: 329
diff changeset
301 btn.bind(
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
302 on_release=partial(self.startEncryption, plugin=plugin),
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
303 on_trust_release=partial(self.getTrustUI, plugin=plugin),
332
13bc00b9743a chat: use `bind` for EncryptionButton events:
Goffi <goffi@goffi.org>
parents: 329
diff changeset
304 )
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
305 self.add_widget(btn)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
306 log.info("added encryption: {}".format(plugin['name']))
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
307
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
308 def messageEncryptionStopCb(self):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
309 log.info(_("Session with {destinee} is now in plain text").format(
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
310 destinee = self.chat.target))
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
311
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
312 def messageEncryptionStopEb(self, failure_):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
313 msg = _("Error while stopping encryption with {destinee}: {reason}").format(
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
314 destinee = self.chat.target,
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
315 reason = failure_)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
316 log.warning(msg)
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
317 G.host.addNote(_("encryption problem"), msg, C.XMLUI_DATA_LVL_ERROR)
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
318
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
319 def unencrypted(self, button):
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
320 self.dismiss()
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
321 G.host.bridge.messageEncryptionStop(
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
322 str(self.chat.target),
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
323 self.chat.profile,
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
324 callback=self.messageEncryptionStopCb,
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
325 errback=self.messageEncryptionStopEb)
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
326
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
327 def messageEncryptionStartCb(self, plugin):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
328 log.info(_("Session with {destinee} is now encrypted with {encr_name}").format(
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
329 destinee = self.chat.target,
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
330 encr_name = plugin['name']))
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
331
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
332 def messageEncryptionStartEb(self, failure_):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
333 msg = _("Session can't be encrypted with {destinee}: {reason}").format(
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
334 destinee = self.chat.target,
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
335 reason = failure_)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
336 log.warning(msg)
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
337 G.host.addNote(_("encryption problem"), msg, C.XMLUI_DATA_LVL_ERROR)
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
338
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
339 def startEncryption(self, button, plugin):
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
340 """Request encryption with given plugin for this session
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
341
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
342 @param button(EncryptionButton): button which has been pressed
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
343 @param plugin(dict): plugin data
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
344 """
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
345 self.dismiss()
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
346 G.host.bridge.messageEncryptionStart(
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
347 str(self.chat.target),
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
348 plugin['namespace'],
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
349 True,
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
350 self.chat.profile,
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
351 callback=partial(self.messageEncryptionStartCb, plugin=plugin),
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
352 errback=self.messageEncryptionStartEb)
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
353
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
354 def encryptionTrustUIGetCb(self, xmlui_raw):
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
355 xml_ui = xmlui.create(
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
356 G.host, xmlui_raw, profile=self.chat.profile)
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
357 xml_ui.show()
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
358
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
359 def encryptionTrustUIGetEb(self, failure_):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
360 msg = _("Trust manager interface can't be retrieved: {reason}").format(
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
361 reason = failure_)
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
362 log.warning(msg)
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
363 G.host.addNote(_("encryption trust management problem"), msg,
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
364 C.XMLUI_DATA_LVL_ERROR)
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
365
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
366 def getTrustUI(self, button, plugin):
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
367 """Request and display trust management UI
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
368
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
369 @param button(EncryptionButton): button which has been pressed
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
370 @param plugin(dict): plugin data
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
371 """
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
372 self.dismiss()
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
373 G.host.bridge.encryptionTrustUIGet(
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
374 str(self.chat.target),
242
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
375 plugin['namespace'],
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
376 self.chat.profile,
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
377 callback=self.encryptionTrustUIGetCb,
c2503168fab7 plugin chat (encryption): added a button to display trust management UI.
Goffi <goffi@goffi.org>
parents: 233
diff changeset
378 errback=self.encryptionTrustUIGetEb)
117
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
379
f0291755b07c chat: OTR integration first draft:
Goffi <goffi@goffi.org>
parents: 111
diff changeset
380
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
381 class Chat(quick_chat.QuickChat, cagou_widget.CagouWidget):
78
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
382 message_input = properties.ObjectProperty()
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 78
diff changeset
383 messages_widget = properties.ObjectProperty()
326
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
384 history_scroll = properties.ObjectProperty()
354
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
385 global_screen_manager = True
353
19422bbd9c8e core (widgets handler): refactoring:
Goffi <goffi@goffi.org>
parents: 340
diff changeset
386 collection_carousel = True
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
387
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
388 def __init__(self, host, target, type_=C.CHAT_ONE2ONE, nick=None, occupants=None,
338
d4883f9576db chat: handle room statuses following backend change
Goffi <goffi@goffi.org>
parents: 334
diff changeset
389 subject=None, statuses=None, profiles=None):
354
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
390 self.show_chat_selector = False
353
19422bbd9c8e core (widgets handler): refactoring:
Goffi <goffi@goffi.org>
parents: 340
diff changeset
391 if statuses is None:
19422bbd9c8e core (widgets handler): refactoring:
Goffi <goffi@goffi.org>
parents: 340
diff changeset
392 statuses = {}
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
393 quick_chat.QuickChat.__init__(
338
d4883f9576db chat: handle room statuses following backend change
Goffi <goffi@goffi.org>
parents: 334
diff changeset
394 self, host, target, type_, nick, occupants, subject, statuses,
d4883f9576db chat: handle room statuses following backend change
Goffi <goffi@goffi.org>
parents: 334
diff changeset
395 profiles=profiles)
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
396 self.otr_state_encryption = OTR_STATE_UNENCRYPTED
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
397 self.otr_state_trust = OTR_STATE_UNTRUSTED
225
a3162b29cda1 plugin chat: fixed AttributeError when message is receved and a corresponding ChatWidget is not created yet
Goffi <goffi@goffi.org>
parents: 193
diff changeset
398 # completion attributes
a3162b29cda1 plugin chat: fixed AttributeError when message is receved and a corresponding ChatWidget is not created yet
Goffi <goffi@goffi.org>
parents: 193
diff changeset
399 self._hi_comp_data = None
a3162b29cda1 plugin chat: fixed AttributeError when message is receved and a corresponding ChatWidget is not created yet
Goffi <goffi@goffi.org>
parents: 193
diff changeset
400 self._hi_comp_last = None
a3162b29cda1 plugin chat: fixed AttributeError when message is receved and a corresponding ChatWidget is not created yet
Goffi <goffi@goffi.org>
parents: 193
diff changeset
401 self._hi_comp_dropdown = DropDown()
a3162b29cda1 plugin chat: fixed AttributeError when message is receved and a corresponding ChatWidget is not created yet
Goffi <goffi@goffi.org>
parents: 193
diff changeset
402 self._hi_comp_allowed = True
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
403 cagou_widget.CagouWidget.__init__(self)
278
444ba439530f chat: moved transfer button to header_box
Goffi <goffi@goffi.org>
parents: 277
diff changeset
404 transfer_btn = TransferButton(chat=self)
444ba439530f chat: moved transfer button to header_box
Goffi <goffi@goffi.org>
parents: 277
diff changeset
405 self.headerInputAddExtra(transfer_btn)
339
63cdabdd032e chat: show encryption button with group chats:
Goffi <goffi@goffi.org>
parents: 338
diff changeset
406 if (type_ == C.CHAT_ONE2ONE or "REALJID_PUBLIC" in statuses):
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
407 self.encryption_btn = EncryptionMainButton(self)
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
408 self.headerInputAddExtra(self.encryption_btn)
287
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
409 self.extra_menu = ExtraMenu(chat=self)
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
410 extra_btn = ExtraButton(chat=self)
5d96bcd3bfec chat: added an extra menu (3 dots menu):
Goffi <goffi@goffi.org>
parents: 284
diff changeset
411 self.headerInputAddExtra(extra_btn)
325
5868a5575e01 chat: cleaning + some improvments:
Goffi <goffi@goffi.org>
parents: 322
diff changeset
412 self.header_input.hint_text = target
326
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
413 self._history_prepend_lock = False
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
414 self.history_count = 0
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
415
353
19422bbd9c8e core (widgets handler): refactoring:
Goffi <goffi@goffi.org>
parents: 340
diff changeset
416 def on_kv_post(self, __):
19422bbd9c8e core (widgets handler): refactoring:
Goffi <goffi@goffi.org>
parents: 340
diff changeset
417 self.postInit()
19422bbd9c8e core (widgets handler): refactoring:
Goffi <goffi@goffi.org>
parents: 340
diff changeset
418
354
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
419 def screenManagerInit(self, screen_manager):
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
420 screen_manager.transition = screenmanager.SlideTransition(direction='down')
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
421 sel_screen = Screen(name='chat_selector')
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
422 chat_selector = ChatSelector(profile=self.profile)
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
423 sel_screen.add_widget(chat_selector)
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
424 screen_manager.add_widget(sel_screen)
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
425 if self.show_chat_selector:
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
426 transition = screen_manager.transition
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
427 screen_manager.transition = NoTransition()
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
428 screen_manager.current = 'chat_selector'
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
429 screen_manager.transition = transition
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
430
156
826e7b17a19b chat: added __unicode__ and __str__
Goffi <goffi@goffi.org>
parents: 145
diff changeset
431 def __str__(self):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
432 return "Chat({})".format(self.target)
156
826e7b17a19b chat: added __unicode__ and __str__
Goffi <goffi@goffi.org>
parents: 145
diff changeset
433
826e7b17a19b chat: added __unicode__ and __str__
Goffi <goffi@goffi.org>
parents: 145
diff changeset
434 def __repr__(self):
826e7b17a19b chat: added __unicode__ and __str__
Goffi <goffi@goffi.org>
parents: 145
diff changeset
435 return self.__str__()
826e7b17a19b chat: added __unicode__ and __str__
Goffi <goffi@goffi.org>
parents: 145
diff changeset
436
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
437 @classmethod
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
438 def factory(cls, plugin_info, target, profiles):
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
439 profiles = list(profiles)
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
440 if len(profiles) > 1:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
441 raise NotImplementedError("Multi-profiles is not available yet for chat")
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
442 if target is None:
354
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
443 show_chat_selector = True
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
444 target = G.host.profiles[profiles[0]].whoami
354
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
445 else:
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
446 show_chat_selector = False
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
447 wid = G.host.widgets.getOrCreateWidget(cls, target, on_new_widget=None,
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
448 on_existing_widget=G.host.getOrClone,
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
449 profiles=profiles)
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
450 wid.show_chat_selector = show_chat_selector
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
451 return wid
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
452
289
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
453 @property
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
454 def message_widgets_rev(self):
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
455 return self.messages_widget.children
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
456
354
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
457 ## keyboard ##
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
458 def key_input(self, window, key, scancode, codepoint, modifier):
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
459 if key == 27:
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
460 screen_manager = self.screen_manager
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
461 screen_manager.transition.direction = 'down'
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
462 screen_manager.current = 'chat_selector'
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
463 return True
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
464
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
465
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
466 ## header ##
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
467
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
468 def changeWidget(self, jid_):
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
469 """change current widget for a new one with given jid
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
470
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
471 @param jid_(jid.JID): jid of the widget to create
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
472 """
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
473 plugin_info = G.host.getPluginInfo(main=Chat)
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
474 factory = plugin_info['factory']
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
475 G.host.switchWidget(self, factory(plugin_info, jid_, profiles=[self.profile]))
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
476 self.header_input.text = ''
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
477
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
478 def onHeaderInput(self):
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
479 text = self.header_input.text.strip()
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
480 try:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
481 if text.count('@') != 1 or text.count(' '):
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
482 raise ValueError
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
483 jid_ = jid.JID(text)
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
484 except ValueError:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
485 log.info("entered text is not a jid")
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
486 return
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
487
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
488 def discoCb(disco):
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
489 # TODO: check if plugin XEP-0045 is activated
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
490 if "conference" in [i[0] for i in disco[1]]:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
491 G.host.bridge.mucJoin(str(jid_), "", "", self.profile,
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
492 callback=self._mucJoinCb, errback=self._mucJoinEb)
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
493 else:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
494 self.changeWidget(jid_)
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
495
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
496 def discoEb(failure):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
497 log.warning("Disco failure, ignore this text: {}".format(failure))
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
498
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
499 G.host.bridge.discoInfos(jid_.domain, self.profile, callback=discoCb,
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
500 errback=discoEb)
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
501
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
502 def onHeaderInputCompleted(self, input_wid, completed_text):
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
503 self._hi_comp_allowed = False
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
504 input_wid.text = completed_text
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
505 self._hi_comp_allowed = True
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
506 self._hi_comp_dropdown.dismiss()
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
507 self.onHeaderInput()
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
508
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
509 def onHeaderInputComplete(self, wid, text):
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
510 if not self._hi_comp_allowed:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
511 return
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
512 text = text.lstrip()
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
513 if not text:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
514 self._hi_comp_data = None
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
515 self._hi_comp_last = None
144
ae58f84fe4e6 plugin chat: fixed dropdown:
Goffi <goffi@goffi.org>
parents: 138
diff changeset
516 self._hi_comp_dropdown.dismiss()
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
517 return
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
518
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
519 profile = list(self.profiles)[0]
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
520
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
521 if self._hi_comp_data is None:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
522 # first completion, we build the initial list
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
523 comp_data = self._hi_comp_data = []
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
524 self._hi_comp_last = ''
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
525 for jid_, jid_data in G.host.contact_lists[profile].all_iter:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
526 comp_data.append((jid_, jid_data))
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
527 comp_data.sort(key=lambda datum: datum[0])
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
528 else:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
529 comp_data = self._hi_comp_data
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
530
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
531 # XXX: dropdown is rebuilt each time backspace is pressed or if the text is changed,
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
532 # it works OK, but some optimisation may be done here
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
533 dropdown = self._hi_comp_dropdown
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
534
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
535 if not text.startswith(self._hi_comp_last) or not self._hi_comp_last:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
536 # text has changed or backspace has been pressed, we restart
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
537 dropdown.clear_widgets()
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
538
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
539 for jid_, jid_data in comp_data:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
540 nick = jid_data.get('nick', '')
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
541 if text in jid_.bare or text in nick.lower():
193
284cb5c467b0 core (common): split JidItem in 3 classes:
Goffi <goffi@goffi.org>
parents: 186
diff changeset
542 btn = JidButton(
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
543 jid = jid_.bare,
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
544 profile = profile,
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
545 size_hint = (0.5, None),
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
546 nick = nick,
284
ca4daced4638 misc: replaced "dummy" by "__"
Goffi <goffi@goffi.org>
parents: 283
diff changeset
547 on_release=lambda __, txt=jid_.bare: self.onHeaderInputCompleted(wid, txt)
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
548 )
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
549 dropdown.add_widget(btn)
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
550 else:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
551 # more chars, we continue completion by removing unwanted widgets
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
552 to_remove = []
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
553 for c in dropdown.children[0].children:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
554 if text not in c.jid and text not in (c.nick or ''):
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
555 to_remove.append(c)
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
556 for c in to_remove:
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
557 dropdown.remove_widget(c)
144
ae58f84fe4e6 plugin chat: fixed dropdown:
Goffi <goffi@goffi.org>
parents: 138
diff changeset
558 if dropdown.attach_to is None:
ae58f84fe4e6 plugin chat: fixed dropdown:
Goffi <goffi@goffi.org>
parents: 138
diff changeset
559 dropdown.open(wid)
109
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
560 self._hi_comp_last = text
7631325e11f4 chat: added completion of header's input, any entity in cache containing the entered text is shown
Goffi <goffi@goffi.org>
parents: 106
diff changeset
561
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
562 def messageDataConverter(self, idx, mess_id):
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
563 return {"mess_data": self.messages[mess_id]}
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
564
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
565 def _onHistoryPrinted(self):
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
566 """Refresh or scroll down the focus after the history is printed"""
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
567 # self.adapter.data = self.messages
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
568 for mess_data in self.messages.values():
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
569 self.appendMessage(mess_data)
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
570 super(Chat, self)._onHistoryPrinted()
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
571
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
572 def createMessage(self, message):
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
573 self.appendMessage(message)
329
51520ce98154 common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents: 326
diff changeset
574 # we need to render immediatly next 2 layouts to avoid an unpleasant flickering
51520ce98154 common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents: 326
diff changeset
575 # when sending or receiving a message
51520ce98154 common_widgets (DelayedBoxLayout), chat: don't delay layout on new message:
Goffi <goffi@goffi.org>
parents: 326
diff changeset
576 self.messages_widget.dont_delay_next_layouts = 2
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
577
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
578 def appendMessage(self, mess_data):
289
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
579 """Append a message Widget to the history
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
580
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
581 @param mess_data(quick_chat.Message): message data
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
582 """
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
583 if self.handleUserMoved(mess_data):
717c6c368f70 chat: merge user moved info messages:
Goffi <goffi@goffi.org>
parents: 287
diff changeset
584 return
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
585 self.messages_widget.add_widget(MessageWidget(mess_data=mess_data))
184
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
586 self.notify(mess_data)
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
587
326
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
588 def prependMessage(self, mess_data):
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
589 """Prepend a message Widget to the history
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
590
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
591 @param mess_data(quick_chat.Message): message data
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
592 """
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
593 mess_wid = self.messages_widget
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
594 last_idx = len(mess_wid.children)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
595 mess_wid.add_widget(MessageWidget(mess_data=mess_data), index=last_idx)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
596
184
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
597 def _get_notif_msg(self, mess_data):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
598 return _("{nick}: {message}").format(
184
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
599 nick=mess_data.nick,
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
600 message=mess_data.main_message)
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
601
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
602 def notify(self, mess_data):
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
603 """Notify user when suitable
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
604
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
605 For one2one chat, notification will happen when window has not focus
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
606 or when one2one chat is not visible. A note is also there when widget
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
607 is not visible.
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
608 For group chat, note will be added on mention, with a desktop notification if
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
609 window has not focus.
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
610 """
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
611 visible_clones = [w for w in G.host.getVisibleList(self.__class__)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
612 if w.target == self.target]
186
a826c70beda2 chat: avoid multiple notifications when there are several cloned chats (i.e. with same target)
Goffi <goffi@goffi.org>
parents: 185
diff changeset
613 if len(visible_clones) > 1 and visible_clones.index(self) > 0:
a826c70beda2 chat: avoid multiple notifications when there are several cloned chats (i.e. with same target)
Goffi <goffi@goffi.org>
parents: 185
diff changeset
614 # to avoid multiple notifications in case of multiple cloned widgets
a826c70beda2 chat: avoid multiple notifications when there are several cloned chats (i.e. with same target)
Goffi <goffi@goffi.org>
parents: 185
diff changeset
615 # we only handle first clone
a826c70beda2 chat: avoid multiple notifications when there are several cloned chats (i.e. with same target)
Goffi <goffi@goffi.org>
parents: 185
diff changeset
616 return
a826c70beda2 chat: avoid multiple notifications when there are several cloned chats (i.e. with same target)
Goffi <goffi@goffi.org>
parents: 185
diff changeset
617 is_visible = bool(visible_clones)
184
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
618 if self.type == C.CHAT_ONE2ONE:
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
619 if (not Window.focus or not is_visible) and not mess_data.history:
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
620 notif_msg = self._get_notif_msg(mess_data)
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
621 G.host.desktop_notif(
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
622 notif_msg,
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
623 title=_("private message"))
184
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
624 if not is_visible:
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
625 G.host.addNote(
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
626 _("private message"),
250
ff1efdeff53f core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents: 244
diff changeset
627 notif_msg,
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
628 symbol = "chat",
250
ff1efdeff53f core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents: 244
diff changeset
629 action = {
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
630 "action": 'chat',
250
ff1efdeff53f core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents: 244
diff changeset
631 "target": self.target,
ff1efdeff53f core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents: 244
diff changeset
632 "profiles": self.profiles}
184
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
633 )
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
634 else:
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
635 if mess_data.mention and not mess_data.history:
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
636 notif_msg = self._get_notif_msg(mess_data)
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
637 G.host.addNote(
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
638 _("mention"),
250
ff1efdeff53f core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents: 244
diff changeset
639 notif_msg,
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
640 symbol = "chat",
250
ff1efdeff53f core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents: 244
diff changeset
641 action = {
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
642 "action": 'chat',
250
ff1efdeff53f core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents: 244
diff changeset
643 "target": self.target,
ff1efdeff53f core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents: 244
diff changeset
644 "profiles": self.profiles}
184
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
645 )
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
646 if not Window.focus:
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
647 G.host.desktop_notif(
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
648 notif_msg,
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
649 title=_("mention ({room_jid})").format(
184
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
650 room_jid=self.target)
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 180
diff changeset
651 )
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
652
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
653 def onSend(self, input_widget):
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
654 G.host.messageSend(
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
655 self.target,
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
656 {'': input_widget.text}, # TODO: handle language
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
657 mess_type = (C.MESS_TYPE_GROUPCHAT
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
658 if self.type == C.CHAT_GROUP else C.MESS_TYPE_CHAT), # TODO: put this in QuickChat
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
659 profile_key=self.profile
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
660 )
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
661 input_widget.text = ''
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
662
277
f5302d57fb09 chat: use the new progress_cb and progress_eb methods of actionManager:
Goffi <goffi@goffi.org>
parents: 276
diff changeset
663 def fileTransferEb(self, err_msg, cleaning_cb, profile):
88
3dc526bb4a5a upload: plugin android gallery, first draft:
Goffi <goffi@goffi.org>
parents: 86
diff changeset
664 if cleaning_cb is not None:
3dc526bb4a5a upload: plugin android gallery, first draft:
Goffi <goffi@goffi.org>
parents: 86
diff changeset
665 cleaning_cb()
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
666 msg = _("can't transfer file: {reason}").format(reason=err_msg)
283
c73a7cd36b54 chat: show warning note on failing fileUpload + added forgotten "profile" argument
Goffi <goffi@goffi.org>
parents: 282
diff changeset
667 log.warning(msg)
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
668 G.host.addNote(_("File transfer error"),
295
fdbb07f1e373 we are in dev version again
Goffi <goffi@goffi.org>
parents: 289
diff changeset
669 msg,
fdbb07f1e373 we are in dev version again
Goffi <goffi@goffi.org>
parents: 289
diff changeset
670 level=C.XMLUI_DATA_LVL_WARNING)
78
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
671
277
f5302d57fb09 chat: use the new progress_cb and progress_eb methods of actionManager:
Goffi <goffi@goffi.org>
parents: 276
diff changeset
672 def fileTransferCb(self, metadata, cleaning_cb, profile):
97
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 90
diff changeset
673 log.debug("file transfered: {}".format(metadata))
111
c3952922ca56 chat: uploaded images are now sent with XHTML, so they are shown inline
Goffi <goffi@goffi.org>
parents: 109
diff changeset
674 extra = {}
c3952922ca56 chat: uploaded images are now sent with XHTML, so they are shown inline
Goffi <goffi@goffi.org>
parents: 109
diff changeset
675
c3952922ca56 chat: uploaded images are now sent with XHTML, so they are shown inline
Goffi <goffi@goffi.org>
parents: 109
diff changeset
676 # FIXME: Q&D way of getting file type, upload plugins shouls give it
c3952922ca56 chat: uploaded images are now sent with XHTML, so they are shown inline
Goffi <goffi@goffi.org>
parents: 109
diff changeset
677 mime_type = mimetypes.guess_type(metadata['url'])[0]
c3952922ca56 chat: uploaded images are now sent with XHTML, so they are shown inline
Goffi <goffi@goffi.org>
parents: 109
diff changeset
678 if mime_type is not None:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
679 if mime_type.split('/')[0] == 'image':
111
c3952922ca56 chat: uploaded images are now sent with XHTML, so they are shown inline
Goffi <goffi@goffi.org>
parents: 109
diff changeset
680 # we generate url ourselves, so this formatting is safe
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
681 extra['xhtml'] = "<img src='{url}' />".format(**metadata)
111
c3952922ca56 chat: uploaded images are now sent with XHTML, so they are shown inline
Goffi <goffi@goffi.org>
parents: 109
diff changeset
682
78
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
683 G.host.messageSend(
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
684 self.target,
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
685 {'': metadata['url']},
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
686 mess_type = (C.MESS_TYPE_GROUPCHAT
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
687 if self.type == C.CHAT_GROUP else C.MESS_TYPE_CHAT),
111
c3952922ca56 chat: uploaded images are now sent with XHTML, so they are shown inline
Goffi <goffi@goffi.org>
parents: 109
diff changeset
688 extra = extra,
78
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
689 profile_key=profile
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
690 )
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
691
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents: 312
diff changeset
692 if cleaning_cb is not None:
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents: 312
diff changeset
693 cleaning_cb()
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents: 312
diff changeset
694
283
c73a7cd36b54 chat: show warning note on failing fileUpload + added forgotten "profile" argument
Goffi <goffi@goffi.org>
parents: 282
diff changeset
695
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents: 312
diff changeset
696 def transferFile(self, file_path, transfer_type=C.TRANSFER_UPLOAD, cleaning_cb=None):
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents: 312
diff changeset
697 if transfer_type == C.TRANSFER_UPLOAD:
333
69d2a96ce26f chat: serialise `options` in `fileUpload` following change in backend
Goffi <goffi@goffi.org>
parents: 332
diff changeset
698 options = {
69d2a96ce26f chat: serialise `options` in `fileUpload` following change in backend
Goffi <goffi@goffi.org>
parents: 332
diff changeset
699 "ignore_tls_errors": not G.host.tls_validation,
69d2a96ce26f chat: serialise `options` in `fileUpload` following change in backend
Goffi <goffi@goffi.org>
parents: 332
diff changeset
700 }
334
36d6763af547 chat: encrypt uploaded file if the session is encrypted
Goffi <goffi@goffi.org>
parents: 333
diff changeset
701 if self.encrypted:
36d6763af547 chat: encrypt uploaded file if the session is encrypted
Goffi <goffi@goffi.org>
parents: 333
diff changeset
702 options['encryption'] = C.ENC_AES_GCM
98
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
703 G.host.bridge.fileUpload(
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents: 312
diff changeset
704 str(file_path),
98
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
705 "",
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
706 "",
333
69d2a96ce26f chat: serialise `options` in `fileUpload` following change in backend
Goffi <goffi@goffi.org>
parents: 332
diff changeset
707 data_format.serialise(options),
98
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
708 self.profile,
277
f5302d57fb09 chat: use the new progress_cb and progress_eb methods of actionManager:
Goffi <goffi@goffi.org>
parents: 276
diff changeset
709 callback = partial(
f5302d57fb09 chat: use the new progress_cb and progress_eb methods of actionManager:
Goffi <goffi@goffi.org>
parents: 276
diff changeset
710 G.host.actionManager,
f5302d57fb09 chat: use the new progress_cb and progress_eb methods of actionManager:
Goffi <goffi@goffi.org>
parents: 276
diff changeset
711 progress_cb = partial(self.fileTransferCb, cleaning_cb=cleaning_cb),
281
ef77423ce500 core: store tls_validation flag in host and use if for file upload.
Goffi <goffi@goffi.org>
parents: 278
diff changeset
712 progress_eb = partial(self.fileTransferEb, cleaning_cb=cleaning_cb),
283
c73a7cd36b54 chat: show warning note on failing fileUpload + added forgotten "profile" argument
Goffi <goffi@goffi.org>
parents: 282
diff changeset
713 profile = self.profile,
c73a7cd36b54 chat: show warning note on failing fileUpload + added forgotten "profile" argument
Goffi <goffi@goffi.org>
parents: 282
diff changeset
714 ),
c73a7cd36b54 chat: show warning note on failing fileUpload + added forgotten "profile" argument
Goffi <goffi@goffi.org>
parents: 282
diff changeset
715 errback = partial(G.host.errback,
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
716 message=_("can't upload file: {msg}"))
277
f5302d57fb09 chat: use the new progress_cb and progress_eb methods of actionManager:
Goffi <goffi@goffi.org>
parents: 276
diff changeset
717 )
98
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
718 elif transfer_type == C.TRANSFER_SEND:
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
719 if self.type == C.CHAT_GROUP:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
720 log.warning("P2P transfer is not possible for group chat")
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
721 # TODO: show an error dialog to user, or better hide the send button for
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
722 # MUC
98
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
723 else:
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
724 jid_ = self.target
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
725 if not jid_.resource:
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
726 jid_ = G.host.contact_lists[self.profile].getFullJid(jid_)
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents: 312
diff changeset
727 G.host.bridge.fileSend(str(jid_), str(file_path), "", "", {},
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
728 profile=self.profile)
98
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
729 # TODO: notification of sending/failing
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
730 else:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
731 raise log.error("transfer of type {} are not handled".format(transfer_type))
98
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
732
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
733 def messageEncryptionStarted(self, plugin_data):
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
734 quick_chat.QuickChat.messageEncryptionStarted(self, plugin_data)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
735 self.encryption_btn.symbol = SYMBOL_ENCRYPTED
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
736 self.encryption_btn.color = COLOR_ENCRYPTED
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
737 self.encryption_btn.selectAlgo(plugin_data['name'])
233
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
738
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
739 def messageEncryptionStopped(self, plugin_data):
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
740 quick_chat.QuickChat.messageEncryptionStopped(self, plugin_data)
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
741 self.encryption_btn.symbol = SYMBOL_UNENCRYPTED
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
742 self.encryption_btn.color = COLOR_UNENCRYPTED
ba8f3a4a5ac7 plugin chat: e2e encryption improvments:
Goffi <goffi@goffi.org>
parents: 225
diff changeset
743 self.encryption_btn.selectAlgo(None)
78
46d962910801 chat: file upload first draft:
Goffi <goffi@goffi.org>
parents: 68
diff changeset
744
46
d6a63942d5ad chat: fixed MUC joining following changes in backend
Goffi <goffi@goffi.org>
parents: 45
diff changeset
745 def _mucJoinCb(self, joined_data):
338
d4883f9576db chat: handle room statuses following backend change
Goffi <goffi@goffi.org>
parents: 334
diff changeset
746 joined, room_jid_s, occupants, user_nick, subject, statuses, profile = joined_data
46
d6a63942d5ad chat: fixed MUC joining following changes in backend
Goffi <goffi@goffi.org>
parents: 45
diff changeset
747 self.host.mucRoomJoinedHandler(*joined_data[1:])
d6a63942d5ad chat: fixed MUC joining following changes in backend
Goffi <goffi@goffi.org>
parents: 45
diff changeset
748 jid_ = jid.JID(room_jid_s)
42
286865bc013a chat: joining MUC using header input is now working:
Goffi <goffi@goffi.org>
parents: 41
diff changeset
749 self.changeWidget(jid_)
286865bc013a chat: joining MUC using header input is now working:
Goffi <goffi@goffi.org>
parents: 41
diff changeset
750
286865bc013a chat: joining MUC using header input is now working:
Goffi <goffi@goffi.org>
parents: 41
diff changeset
751 def _mucJoinEb(self, failure):
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
752 log.warning("Can't join room: {}".format(failure))
42
286865bc013a chat: joining MUC using header input is now working:
Goffi <goffi@goffi.org>
parents: 41
diff changeset
753
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
754 def onOTRState(self, state, dest_jid, profile):
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
755 assert profile in self.profiles
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
756 if state in OTR_STATE_ENCRYPTION:
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
757 self.otr_state_encryption = state
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
758 elif state in OTR_STATE_TRUST:
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
759 self.otr_state_trust = state
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
760 else:
312
772c170b47a9 Python3 port:
Goffi <goffi@goffi.org>
parents: 303
diff changeset
761 log.error(_("Unknown OTR state received: {}".format(state)))
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
762 return
135
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
763 self.encryption_btn.symbol = self.encryption_btn.getSymbol()
091e288838e1 plugin chat: use new Symbol widget to display encryption button
Goffi <goffi@goffi.org>
parents: 126
diff changeset
764 self.encryption_btn.color = self.encryption_btn.getColor()
122
dcd6fbb3f010 chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents: 121
diff changeset
765
265
805c4103dac5 core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents: 261
diff changeset
766 def onVisible(self):
805c4103dac5 core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents: 261
diff changeset
767 if not self.sync:
805c4103dac5 core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents: 261
diff changeset
768 self.resync()
805c4103dac5 core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents: 261
diff changeset
769
261
a579eda31f4f chat: don't use "force" argument anymore
Goffi <goffi@goffi.org>
parents: 260
diff changeset
770 def onDelete(self):
a579eda31f4f chat: don't use "force" argument anymore
Goffi <goffi@goffi.org>
parents: 260
diff changeset
771 # we always keep one widget, so it's available when swiping
a579eda31f4f chat: don't use "force" argument anymore
Goffi <goffi@goffi.org>
parents: 260
diff changeset
772 # TODO: delete all widgets when chat is closed
a579eda31f4f chat: don't use "force" argument anymore
Goffi <goffi@goffi.org>
parents: 260
diff changeset
773 nb_instances = sum(1 for _ in self.host.widgets.getWidgetInstances(self))
a579eda31f4f chat: don't use "force" argument anymore
Goffi <goffi@goffi.org>
parents: 260
diff changeset
774 if nb_instances > 1:
a579eda31f4f chat: don't use "force" argument anymore
Goffi <goffi@goffi.org>
parents: 260
diff changeset
775 return super(Chat, self).onDelete()
a579eda31f4f chat: don't use "force" argument anymore
Goffi <goffi@goffi.org>
parents: 260
diff changeset
776 else:
a579eda31f4f chat: don't use "force" argument anymore
Goffi <goffi@goffi.org>
parents: 260
diff changeset
777 return False
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
778
326
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
779 def _history_unlock(self, __):
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
780 self._history_prepend_lock = False
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
781 log.debug("history prepend unlocked")
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
782 # we call manually onScroll, to check if we are still in the scrolling zone
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
783 self.onScroll(self.history_scroll, self.history_scroll.scroll_y)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
784
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
785 def _history_scroll_adjust(self, __, scroll_start_height):
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
786 # history scroll position must correspond to where it was before new messages
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
787 # have been appended
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
788 self.history_scroll.scroll_y = (
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
789 scroll_start_height / self.messages_widget.height
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
790 )
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
791
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
792 # we want a small delay before unlocking, to avoid re-fetching history
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
793 # again
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
794 Clock.schedule_once(self._history_unlock, 1.5)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
795
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
796 def _backHistoryGetCb_post(self, __, history, scroll_start_height):
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
797 if len(history) == 0:
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
798 # we don't unlock self._history_prepend_lock if there is no history, as there
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
799 # is no sense to try to retrieve more in this case.
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
800 log.debug(f"we've reached top of history for {self.target.bare} chat")
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
801 else:
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
802 # we have to schedule again for _history_scroll_adjust, else messages_widget
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
803 # is not resized (self.messages_widget.height is not yet updated)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
804 # as a result, the scroll_to can't work correctly
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
805 Clock.schedule_once(partial(
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
806 self._history_scroll_adjust,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
807 scroll_start_height=scroll_start_height))
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
808 log.debug(
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
809 f"{len(history)} messages prepended to history (last: {history[0][0]})")
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
810
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
811 def _backHistoryGetCb(self, history):
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
812 # TODO: factorise with QuickChat._historyGetCb
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
813 scroll_start_height = self.messages_widget.height * self.history_scroll.scroll_y
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
814 for data in reversed(history):
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
815 uid, timestamp, from_jid, to_jid, message, subject, type_, extra = data
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
816 from_jid = jid.JID(from_jid)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
817 to_jid = jid.JID(to_jid)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
818 extra["history"] = True
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
819 self.messages[uid] = message = quick_chat.Message(
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
820 self,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
821 uid,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
822 timestamp,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
823 from_jid,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
824 to_jid,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
825 message,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
826 subject,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
827 type_,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
828 extra,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
829 self.profile,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
830 )
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
831 self.messages.move_to_end(uid, last=False)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
832 self.prependMessage(message)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
833 Clock.schedule_once(partial(
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
834 self._backHistoryGetCb_post,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
835 history=history,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
836 scroll_start_height=scroll_start_height))
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
837
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
838 def _backHistoryGetEb(self, failure_):
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
839 G.host.addNote(
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
840 _("Problem while getting back history"),
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
841 _("Can't back history for {target}: {problem}").format(
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
842 target=self.target, problem=failure_),
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
843 C.XMLUI_DATA_LVL_ERROR)
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
844 # we don't unlock self._history_prepend_lock on purpose, no need
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
845 # to try to get more history if something is wrong
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
846
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
847 def onScroll(self, scroll_view, scroll_y):
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
848 if self._history_prepend_lock:
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
849 return
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
850 if (1-scroll_y) * self.messages_widget.height < INFINITE_SCROLL_LIMIT:
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
851 self._history_prepend_lock = True
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
852 log.debug(f"Retrieving back history for {self} [{self.history_count}]")
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
853 self.history_count += 1
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
854 first_uid = next(iter(self.messages.keys()))
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
855 filters = self.history_filters.copy()
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
856 filters['before_uid'] = first_uid
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
857 self.host.bridge.historyGet(
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
858 str(self.host.profiles[self.profile].whoami.bare),
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
859 str(self.target),
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
860 30,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
861 True,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
862 {k: str(v) for k,v in filters.items()},
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
863 self.profile,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
864 callback=self._backHistoryGetCb,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
865 errback=self._backHistoryGetEb,
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
866 )
d9d2b56f46db plugin chat: infinite scroll:
Goffi <goffi@goffi.org>
parents: 325
diff changeset
867
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
868
354
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
869 class ChatSelector(cagou_widget.CagouWidget):
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
870 profile = properties.StringProperty()
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
871 plugin_info_class = Chat
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
872
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
873 def on_select(self, contact_button):
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
874 contact_jid = jid.JID(contact_button.jid)
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
875 plugin_info = G.host.getPluginInfo(main=Chat)
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
876 factory = plugin_info['factory']
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
877 self.screen_manager.transition.direction = 'up'
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
878 carousel = self.whwrapper.carousel
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
879 current_slides = {w.target: w for w in carousel.slides}
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
880 if contact_jid in current_slides:
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
881 slide = current_slides[contact_jid]
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
882 idx = carousel.slides.index(slide)
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
883 carousel.index = idx
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
884 self.screen_manager.current = ''
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
885 else:
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
886 G.host.switchWidget(
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
887 self, factory(plugin_info, contact_jid, profiles=[self.profile]))
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
888
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
889 @property
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
890 def profiles(self):
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
891 return [self.profile]
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
892
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
893 def key_input(self, window, key, scancode, codepoint, modifier):
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
894 if key == 27:
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
895 # we go back to root screen
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
896 G.host.switchWidget(self)
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
897 return True
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
898
aa860c10acfc chat: new chat selector:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
899
22
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
900 PLUGIN_INFO["factory"] = Chat.factory
74117b733bac plugin chat: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
901 quick_widgets.register(quick_chat.QuickChat, Chat)