Mercurial > libervia-desktop-kivy
annotate cagou/core/cagou_main.py @ 246:15e47bbb192c
about: show full version of SàT
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 04 Jan 2019 13:20:29 +0100 |
parents | 5bd94bc08f5c |
children | cf61a011f731 |
rev | line source |
---|---|
6
85649eca9f9b
core (logs): integrate Kivy logs with SàT:
Goffi <goffi@goffi.org>
parents:
0
diff
changeset
|
1 #!/usr//bin/env python2 |
0 | 2 # -*- coding: utf-8 -*- |
3 | |
4 # Cagou: desktop/mobile frontend for Salut à Toi XMPP client | |
126 | 5 # Copyright (C) 2016-2018 Jérôme Poisson (goffi@goffi.org) |
0 | 6 |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 | |
14 | 21 from sat.core.i18n import _ |
119
1bbbe26846f4
buildozer: moved sat.conf in a specific dir (platform/android), so it's not used on desktop
Goffi <goffi@goffi.org>
parents:
112
diff
changeset
|
22 from . import kivy_hack |
48
028a98983e46
core: avoid kivy arguments hijacking so QuickApp arguments parsing can be used
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
23 kivy_hack.do_hack() |
6
85649eca9f9b
core (logs): integrate Kivy logs with SàT:
Goffi <goffi@goffi.org>
parents:
0
diff
changeset
|
24 from constants import Const as C |
0 | 25 from sat.core import log as logging |
26 log = logging.getLogger(__name__) | |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
27 from sat.core import exceptions |
0 | 28 from sat_frontends.quick_frontend.quick_app import QuickApp |
34
02acbb297a61
handler, widget: deleteWidget is now properly called when a QuickWidget is deleted
Goffi <goffi@goffi.org>
parents:
33
diff
changeset
|
29 from sat_frontends.quick_frontend import quick_widgets |
43
12fdc7d1feb1
core: newWidget implementation, it only display a not when a MUC room has been joined
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
30 from sat_frontends.quick_frontend import quick_chat |
48
028a98983e46
core: avoid kivy arguments hijacking so QuickApp arguments parsing can be used
Goffi <goffi@goffi.org>
parents:
44
diff
changeset
|
31 from sat_frontends.quick_frontend import quick_utils |
244
5bd94bc08f5c
plugin chat: fixed OTR State filtering + removed some legacy code
Goffi <goffi@goffi.org>
parents:
240
diff
changeset
|
32 from sat_frontends.tools import jid |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
33 from sat.tools import config |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
34 from sat.tools.common import dynamic_import |
0 | 35 import kivy |
142 | 36 kivy.require('1.10.0') |
0 | 37 import kivy.support |
63 | 38 main_config = config.parseMainConf() |
39 bridge_name = config.getConfig(main_config, '', 'bridge', 'dbus') | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
40 # FIXME: event loop is choosen according to bridge_name, a better way should be used |
63 | 41 if 'dbus' in bridge_name: |
42 kivy.support.install_gobject_iteration() | |
43 elif bridge_name in ('pb', 'embedded'): | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
44 kivy.support.install_twisted_reactor() |
0 | 45 from kivy.app import App |
14 | 46 from kivy.lang import Builder |
29 | 47 from kivy import properties |
0 | 48 import xmlui |
49 from profile_manager import ProfileManager | |
29 | 50 from kivy.clock import Clock |
51 from kivy.uix.label import Label | |
9 | 52 from kivy.uix.boxlayout import BoxLayout |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
53 from kivy.uix.floatlayout import FloatLayout |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
54 from kivy.uix.screenmanager import (ScreenManager, Screen, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
55 FallOutTransition, RiseInTransition) |
29 | 56 from kivy.uix.dropdown import DropDown |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
57 from kivy.core.window import Window |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
58 from kivy.animation import Animation |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
59 from kivy.metrics import dp |
11
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
60 from cagou_widget import CagouWidget |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
61 from . import widgets_handler |
29 | 62 from .common import IconButton |
86 | 63 from . import menu |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
64 from . import dialog |
14 | 65 from importlib import import_module |
9 | 66 import os.path |
14 | 67 import glob |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
68 import cagou.plugins |
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
69 import cagou.kv |
61 | 70 from kivy import utils as kivy_utils |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
71 import sys |
184
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
72 try: |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
73 from plyer import notification |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
74 except ImportError: |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
75 notification = None |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
76 log.warning(_(u"Can't import plyer, some features disabled")) |
131
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
77 |
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
78 # we want white background by default |
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
79 Window.clearcolor = (1, 1, 1, 1) |
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
80 |
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
81 |
61 | 82 if kivy_utils.platform == "android": |
83 # FIXME: move to separate android module | |
84 # sys.platform is "linux" on android by default | |
85 # so we change it to allow backend to detect android | |
86 sys.platform = "android" | |
73
674b1fa3c945
core: use memory map on a file to indicate pause/resume status, so backend can now it
Goffi <goffi@goffi.org>
parents:
72
diff
changeset
|
87 import mmap |
87
17094a075fd2
core: use C.PLUGIN_EXT to know which plugin extension to use
Goffi <goffi@goffi.org>
parents:
86
diff
changeset
|
88 C.PLUGIN_EXT = 'pyo' |
9 | 89 |
90 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
91 class NotifsIcon(IconButton): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
92 notifs = properties.ListProperty() |
29 | 93 |
94 def on_release(self): | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
95 callback, args, kwargs = self.notifs.pop(0) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
96 callback(*args, **kwargs) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
97 |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
98 def addNotif(self, callback, *args, **kwargs): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
99 self.notifs.append((callback, args, kwargs)) |
29 | 100 |
101 | |
102 class Note(Label): | |
103 title = properties.StringProperty() | |
104 message = properties.StringProperty() | |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
105 level = properties.OptionProperty(C.XMLUI_DATA_LVL_DEFAULT, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
106 options=list(C.XMLUI_DATA_LVLS)) |
29 | 107 |
108 | |
208 | 109 class NoteDrop(Label): |
110 title = properties.StringProperty() | |
111 message = properties.StringProperty() | |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
112 level = properties.OptionProperty(C.XMLUI_DATA_LVL_DEFAULT, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
113 options=list(C.XMLUI_DATA_LVLS)) |
29 | 114 |
115 | |
116 class NotesDrop(DropDown): | |
117 clear_btn = properties.ObjectProperty() | |
118 | |
119 def __init__(self, notes): | |
120 super(NotesDrop, self).__init__() | |
121 self.notes = notes | |
122 | |
123 def open(self, widget): | |
124 self.clear_widgets() | |
125 for n in self.notes: | |
126 self.add_widget(NoteDrop(title=n.title, message=n.message, level=n.level)) | |
127 self.add_widget(self.clear_btn) | |
128 super(NotesDrop, self).open(widget) | |
129 | |
130 | |
131 class RootHeadWidget(BoxLayout): | |
132 """Notifications widget""" | |
133 manager = properties.ObjectProperty() | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
134 notifs_icon = properties.ObjectProperty() |
29 | 135 notes = properties.ListProperty() |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
136 HEIGHT = dp(35) |
29 | 137 |
138 def __init__(self): | |
139 super(RootHeadWidget, self).__init__() | |
140 self.notes_last = None | |
141 self.notes_event = None | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
142 self.notes_drop = NotesDrop(self.notes) |
29 | 143 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
144 def addNotif(self, callback, *args, **kwargs): |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
145 """add a notification with a callback attached |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
146 |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
147 when notification is pressed, callback is called |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
148 @param *args, **kwargs: arguments of callback |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
149 """ |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
150 self.notifs_icon.addNotif(callback, *args, **kwargs) |
29 | 151 |
152 def addNote(self, title, message, level): | |
153 note = Note(title=title, message=message, level=level) | |
154 self.notes.append(note) | |
155 if self.notes_event is None: | |
156 self.notes_event = Clock.schedule_interval(self._displayNextNote, 5) | |
157 self._displayNextNote() | |
158 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
159 def addNotifUI(self, ui): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
160 self.notifs_icon.addNotif(ui.show, force=True) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
161 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
162 def addNotifWidget(self, widget): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
163 app = App.get_running_app() |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
164 self.notifs_icon.addNotif(app.host.showExtraUI, widget=widget) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
165 |
29 | 166 def _displayNextNote(self, dummy=None): |
167 screen = Screen() | |
168 try: | |
169 idx = self.notes.index(self.notes_last) + 1 | |
170 except ValueError: | |
171 idx = 0 | |
172 try: | |
173 note = self.notes_last = self.notes[idx] | |
174 except IndexError: | |
175 self.notes_event.cancel() | |
176 self.notes_event = None | |
177 else: | |
178 screen.add_widget(note) | |
179 self.manager.switch_to(screen) | |
180 | |
181 | |
86 | 182 class RootMenus(menu.MenusWidget): |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
183 HEIGHT = dp(30) |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
184 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
185 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
186 class RootBody(BoxLayout): |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
187 pass |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
188 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
189 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
190 class CagouRootWidget(FloatLayout): |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
191 root_menus = properties.ObjectProperty() |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
192 root_body = properties.ObjectProperty |
9 | 193 |
29 | 194 def __init__(self, main_widget): |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
195 super(CagouRootWidget, self).__init__() |
29 | 196 # header |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
197 self.head_widget = RootHeadWidget() |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
198 self.root_body.add_widget(self.head_widget) |
29 | 199 # body |
200 self._manager = ScreenManager() | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
201 # main widgets |
29 | 202 main_screen = Screen(name='main') |
203 main_screen.add_widget(main_widget) | |
204 self._manager.add_widget(main_screen) | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
205 # backend XMLUI (popups, forms, etc) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
206 xmlui_screen = Screen(name='xmlui') |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
207 self._manager.add_widget(xmlui_screen) |
78 | 208 # extra (file chooser, audio record, etc) |
209 extra_screen = Screen(name='extra') | |
210 self._manager.add_widget(extra_screen) | |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
211 self.root_body.add_widget(self._manager) |
29 | 212 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
213 def changeWidget(self, widget, screen_name="main"): |
29 | 214 """change main widget""" |
52
647f32d0a004
core: workaround issue happening when root widget is changed too quickly (during a transition)
Goffi <goffi@goffi.org>
parents:
51
diff
changeset
|
215 if self._manager.transition.is_active: |
647f32d0a004
core: workaround issue happening when root widget is changed too quickly (during a transition)
Goffi <goffi@goffi.org>
parents:
51
diff
changeset
|
216 # FIXME: workaround for what seems a Kivy bug |
647f32d0a004
core: workaround issue happening when root widget is changed too quickly (during a transition)
Goffi <goffi@goffi.org>
parents:
51
diff
changeset
|
217 # TODO: report this upstream |
647f32d0a004
core: workaround issue happening when root widget is changed too quickly (during a transition)
Goffi <goffi@goffi.org>
parents:
51
diff
changeset
|
218 self._manager.transition.stop() |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
219 screen = self._manager.get_screen(screen_name) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
220 screen.clear_widgets() |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
221 screen.add_widget(widget) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
222 |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
223 def show(self, screen="main"): |
52
647f32d0a004
core: workaround issue happening when root widget is changed too quickly (during a transition)
Goffi <goffi@goffi.org>
parents:
51
diff
changeset
|
224 if self._manager.transition.is_active: |
647f32d0a004
core: workaround issue happening when root widget is changed too quickly (during a transition)
Goffi <goffi@goffi.org>
parents:
51
diff
changeset
|
225 # FIXME: workaround for what seems a Kivy bug |
647f32d0a004
core: workaround issue happening when root widget is changed too quickly (during a transition)
Goffi <goffi@goffi.org>
parents:
51
diff
changeset
|
226 # TODO: report this upstream |
647f32d0a004
core: workaround issue happening when root widget is changed too quickly (during a transition)
Goffi <goffi@goffi.org>
parents:
51
diff
changeset
|
227 self._manager.transition.stop() |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
228 if self._manager.current == screen: |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
229 return |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
230 if screen == "main": |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
231 self._manager.transition = FallOutTransition() |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
232 else: |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
233 self._manager.transition = RiseInTransition() |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
234 self._manager.current = screen |
29 | 235 |
236 def newAction(self, handler, action_data, id_, security_limit, profile): | |
237 """Add a notification for an action""" | |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
238 self.head_widget.addNotif(handler, action_data, id_, security_limit, profile) |
29 | 239 |
240 def addNote(self, title, message, level): | |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
241 self.head_widget.addNote(title, message, level) |
0 | 242 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
243 def addNotifUI(self, ui): |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
244 self.head_widget.addNotifUI(ui) |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
245 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
246 def addNotifWidget(self, widget): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
247 self.head_widget.addNotifWidget(widget) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
248 |
0 | 249 |
250 class CagouApp(App): | |
251 """Kivy App for Cagou""" | |
176
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
252 c_prim = properties.ListProperty(C.COLOR_PRIM) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
253 c_prim_light = properties.ListProperty(C.COLOR_PRIM_LIGHT) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
254 c_prim_dark = properties.ListProperty(C.COLOR_PRIM_DARK) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
255 c_sec = properties.ListProperty(C.COLOR_SEC) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
256 c_sec_light = properties.ListProperty(C.COLOR_SEC_LIGHT) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
257 c_sec_dark = properties.ListProperty(C.COLOR_SEC_DARK) |
0 | 258 |
152
b9fd83292fc4
core: disabled Kivy's default behaviour of displaying settings on F1
Goffi <goffi@goffi.org>
parents:
143
diff
changeset
|
259 def _install_settings_keys(self, window): |
b9fd83292fc4
core: disabled Kivy's default behaviour of displaying settings on F1
Goffi <goffi@goffi.org>
parents:
143
diff
changeset
|
260 # we don't want default Kivy's behaviour of displaying |
b9fd83292fc4
core: disabled Kivy's default behaviour of displaying settings on F1
Goffi <goffi@goffi.org>
parents:
143
diff
changeset
|
261 # a settings screen when pressing F1 or platform specific key |
b9fd83292fc4
core: disabled Kivy's default behaviour of displaying settings on F1
Goffi <goffi@goffi.org>
parents:
143
diff
changeset
|
262 return |
b9fd83292fc4
core: disabled Kivy's default behaviour of displaying settings on F1
Goffi <goffi@goffi.org>
parents:
143
diff
changeset
|
263 |
0 | 264 def build(self): |
143
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
265 Window.bind(on_keyboard=self.key_input) |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
266 wid = CagouRootWidget(Label(text=u"Loading please wait")) |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
267 if sys.platform == 'android': |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
268 # we don't want menu on Android |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
269 wid.root_menus.height = 0 |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
270 return wid |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
271 |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
272 def showWidget(self): |
49
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
273 self._profile_manager = ProfileManager() |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
274 self.root.changeWidget(self._profile_manager) |
0 | 275 |
31
4f9e701d76b4
core: expand now accepts extra arguments, which will be used in format
Goffi <goffi@goffi.org>
parents:
29
diff
changeset
|
276 def expand(self, path, *args, **kwargs): |
28
9f9532eb835f
core: added expand method to expand filename with magic values, specially useful in kv
Goffi <goffi@goffi.org>
parents:
25
diff
changeset
|
277 """expand path and replace known values |
9f9532eb835f
core: added expand method to expand filename with magic values, specially useful in kv
Goffi <goffi@goffi.org>
parents:
25
diff
changeset
|
278 |
32 | 279 useful in kv. Values which can be used: |
280 - {media}: media dir | |
31
4f9e701d76b4
core: expand now accepts extra arguments, which will be used in format
Goffi <goffi@goffi.org>
parents:
29
diff
changeset
|
281 @param path(unicode): path to expand |
4f9e701d76b4
core: expand now accepts extra arguments, which will be used in format
Goffi <goffi@goffi.org>
parents:
29
diff
changeset
|
282 @param *args: additional arguments used in format |
4f9e701d76b4
core: expand now accepts extra arguments, which will be used in format
Goffi <goffi@goffi.org>
parents:
29
diff
changeset
|
283 @param **kwargs: additional keyword arguments used in format |
28
9f9532eb835f
core: added expand method to expand filename with magic values, specially useful in kv
Goffi <goffi@goffi.org>
parents:
25
diff
changeset
|
284 """ |
31
4f9e701d76b4
core: expand now accepts extra arguments, which will be used in format
Goffi <goffi@goffi.org>
parents:
29
diff
changeset
|
285 return os.path.expanduser(path).format(*args, media=self.host.media_dir, **kwargs) |
28
9f9532eb835f
core: added expand method to expand filename with magic values, specially useful in kv
Goffi <goffi@goffi.org>
parents:
25
diff
changeset
|
286 |
73
674b1fa3c945
core: use memory map on a file to indicate pause/resume status, so backend can now it
Goffi <goffi@goffi.org>
parents:
72
diff
changeset
|
287 def on_start(self): |
75
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
288 if sys.platform == "android": |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
289 # XXX: we use memory map instead of bridge because if we |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
290 # try to call a bridge method in on_pause method, the call data |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
291 # is not written before the actual pause |
75
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
292 # we create a memory map on .cagou_status file with a 1 byte status |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
293 # status is: |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
294 # R => running |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
295 # P => paused |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
296 # S => stopped |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
297 self._first_pause = True |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
298 self.cagou_status_fd = open('.cagou_status', 'wb+') |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
299 self.cagou_status_fd.write('R') |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
300 self.cagou_status_fd.flush() |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
301 self.cagou_status = mmap.mmap(self.cagou_status_fd.fileno(), 1, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
302 prot=mmap.PROT_WRITE) |
73
674b1fa3c945
core: use memory map on a file to indicate pause/resume status, so backend can now it
Goffi <goffi@goffi.org>
parents:
72
diff
changeset
|
303 |
65
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
304 def on_pause(self): |
73
674b1fa3c945
core: use memory map on a file to indicate pause/resume status, so backend can now it
Goffi <goffi@goffi.org>
parents:
72
diff
changeset
|
305 self.cagou_status[0] = 'P' |
65
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
306 return True |
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
307 |
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
308 def on_resume(self): |
73
674b1fa3c945
core: use memory map on a file to indicate pause/resume status, so backend can now it
Goffi <goffi@goffi.org>
parents:
72
diff
changeset
|
309 self.cagou_status[0] = 'R' |
674b1fa3c945
core: use memory map on a file to indicate pause/resume status, so backend can now it
Goffi <goffi@goffi.org>
parents:
72
diff
changeset
|
310 |
674b1fa3c945
core: use memory map on a file to indicate pause/resume status, so backend can now it
Goffi <goffi@goffi.org>
parents:
72
diff
changeset
|
311 def on_stop(self): |
77
bc170ccca744
core: added forgotten platfom check in on_stop
Goffi <goffi@goffi.org>
parents:
75
diff
changeset
|
312 if sys.platform == "android": |
bc170ccca744
core: added forgotten platfom check in on_stop
Goffi <goffi@goffi.org>
parents:
75
diff
changeset
|
313 self.cagou_status[0] = 'S' |
bc170ccca744
core: added forgotten platfom check in on_stop
Goffi <goffi@goffi.org>
parents:
75
diff
changeset
|
314 self.cagou_status.flush() |
bc170ccca744
core: added forgotten platfom check in on_stop
Goffi <goffi@goffi.org>
parents:
75
diff
changeset
|
315 self.cagou_status_fd.close() |
65
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
316 |
143
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
317 def key_input(self, window, key, scancode, codepoint, modifier): |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
318 if key == 27: |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
319 # we disable [esc] handling, because default action is to quit app |
143
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
320 return True |
165 | 321 elif key == 292: |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
322 # F11: full screen |
165 | 323 if not Window.fullscreen: |
324 window.fullscreen = 'auto' | |
325 else: | |
326 window.fullscreen = False | |
327 return True | |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
328 elif key == 109 and modifier == ['alt']: |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
329 # M-m we hide/show menu |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
330 menu = self.root.root_menus |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
331 if menu.height: |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
332 Animation(height=0, duration=0.3).start(menu) |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
333 else: |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
334 Animation(height=menu.HEIGHT, duration=0.3).start(menu) |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
335 return True |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
336 elif key == 110 and modifier == ['alt']: |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
337 # M-n we hide/show notifications |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
338 head = self.root.head_widget |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
339 if head.height: |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
340 Animation(height=0, opacity=0, duration=0.3).start(head) |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
341 else: |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
342 Animation(height=head.HEIGHT, opacity=1, duration=0.3).start(head) |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
343 return True |
143
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
344 else: |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
345 return False |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
346 |
0 | 347 |
348 class Cagou(QuickApp): | |
349 MB_HANDLE = False | |
350 | |
351 def __init__(self): | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
352 if bridge_name == 'embedded': |
63 | 353 from sat.core import sat_main |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
354 self.sat = sat_main.SAT() |
64
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
355 if sys.platform == 'android': |
141
8a0019ce3632
core (android): service is now launched using pyjnius, as recommended in doc
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
356 from jnius import autoclass |
240 | 357 service = autoclass('org.salutatoi.cagou.ServiceBackend') |
141
8a0019ce3632
core (android): service is now launched using pyjnius, as recommended in doc
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
358 mActivity = autoclass('org.kivy.android.PythonActivity').mActivity |
8a0019ce3632
core (android): service is now launched using pyjnius, as recommended in doc
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
359 argument = '' |
8a0019ce3632
core (android): service is now launched using pyjnius, as recommended in doc
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
360 service.start(mActivity, argument) |
64
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
361 self.service = service |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
362 |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
363 bridge_module = dynamic_import.bridge(bridge_name, 'sat_frontends.bridge') |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
364 if bridge_module is None: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
365 log.error(u"Can't import {} bridge".format(bridge_name)) |
72
1a324c682d8a
core: use onBridgeConnected and exit code 3 when bridge can't be imported
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
366 sys.exit(3) |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
367 else: |
72
1a324c682d8a
core: use onBridgeConnected and exit code 3 when bridge can't be imported
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
368 log.debug(u"Loading {} bridge".format(bridge_name)) |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
369 super(Cagou, self).__init__(bridge_factory=bridge_module.Bridge, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
370 xmlui=xmlui, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
371 check_options=quick_utils.check_options, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
372 connect_bridge=False) |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
373 self._import_kv() |
0 | 374 self.app = CagouApp() |
29 | 375 self.app.host = self |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
376 self.media_dir = self.app.media_dir = config.getConfig(main_config, '', |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
377 'media_dir') |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
378 self.downloads_dir = self.app.downloads_dir = config.getConfig(main_config, '', |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
379 'downloads_dir') |
188
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
380 if not os.path.exists(self.downloads_dir): |
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
381 try: |
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
382 os.makedirs(self.downloads_dir) |
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
383 except OSError as e: |
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
384 log.warnings(_(u"Can't create downloads dir: {reason}").format(reason=e)) |
25
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
385 self.app.default_avatar = os.path.join(self.media_dir, "misc/default_avatar.png") |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
386 self.app.icon = os.path.join(self.media_dir, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
387 "icons/muchoslava/png/cagou_profil_bleu_96.png") |
86 | 388 self._plg_wids = [] # main widgets plugins |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
389 self._plg_wids_transfer = [] # transfer widgets plugins |
14 | 390 self._import_plugins() |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
391 self._visible_widgets = {} # visible widgets by classes |
246 | 392 self.version = C.APP_VERSION # will be replaced by getVersion() |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
393 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
394 @property |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
395 def visible_widgets(self): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
396 for w_list in self._visible_widgets.itervalues(): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
397 for w in w_list: |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
398 yield w |
0 | 399 |
72
1a324c682d8a
core: use onBridgeConnected and exit code 3 when bridge can't be imported
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
400 def onBridgeConnected(self): |
189
a91abcd6d9a5
core: call QuickApp.onBridgeConnected (so ns_map is filled)
Goffi <goffi@goffi.org>
parents:
188
diff
changeset
|
401 super(Cagou, self).onBridgeConnected() |
122
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
402 self.registerSignal("otrState", iface="plugin") |
63 | 403 self.bridge.getReady(self.onBackendReady) |
404 | |
64
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
405 def _bridgeEb(self, failure): |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
406 if bridge_name == "pb" and sys.platform == "android": |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
407 try: |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
408 self.retried += 1 |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
409 except AttributeError: |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
410 self.retried = 1 |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
411 from twisted.internet.error import ConnectionRefusedError |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
412 if failure.check(ConnectionRefusedError) and self.retried < 100: |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
413 if self.retried % 20 == 0: |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
414 log.debug("backend not ready, retrying ({})".format(self.retried)) |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
415 Clock.schedule_once(lambda dummy: self.connectBridge(), 0.05) |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
416 return |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
417 super(Cagou, self)._bridgeEb(failure) |
8e16abcadbb8
core: launch SàT backend as a service on Android and wait for it on pb bridge connection.
Goffi <goffi@goffi.org>
parents:
63
diff
changeset
|
418 |
0 | 419 def run(self): |
63 | 420 self.connectBridge() |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
421 self.app.bind(on_stop=self.onStop) |
0 | 422 self.app.run() |
423 | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
424 def onStop(self, obj): |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
425 try: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
426 sat_instance = self.sat |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
427 except AttributeError: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
428 pass |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
429 else: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
430 sat_instance.stopService() |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
431 |
246 | 432 def _getVersionCb(self, version): |
433 self.version = version | |
434 | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
435 def onBackendReady(self): |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
436 self.app.showWidget() |
246 | 437 self.bridge.getVersion(callback=self._getVersionCb) |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
438 self.postInit() |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
439 |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
440 def postInit(self, dummy=None): |
61 | 441 # FIXME: resize seem to bug on android, so we use below_target for now |
442 self.app.root_window.softinput_mode = "below_target" | |
49
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
443 profile_manager = self.app._profile_manager |
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
444 del self.app._profile_manager |
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
445 super(Cagou, self).postInit(profile_manager) |
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
446 |
86 | 447 def _defaultFactoryMain(self, plugin_info, target, profiles): |
448 """default factory used to create main widgets instances | |
449 | |
450 used when PLUGIN_INFO["factory"] is not set | |
451 @param plugin_info(dict): plugin datas | |
452 @param target: QuickWidget target | |
453 @param profiles(iterable): list of profiles | |
454 """ | |
14 | 455 main_cls = plugin_info['main'] |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
456 return self.widgets.getOrCreateWidget(main_cls, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
457 target, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
458 on_new_widget=None, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
459 profiles=iter(self.profiles)) |
14 | 460 |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
461 def _defaultFactoryTransfer(self, plugin_info, callback, cancel_cb, profiles): |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
462 """default factory used to create transfer widgets instances |
86 | 463 |
464 @param plugin_info(dict): plugin datas | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
465 @param callback(callable): method to call with path to file to transfer |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
466 @param cancel_cb(callable): call when transfer is cancelled |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
467 transfer widget must be used as first argument |
86 | 468 @param profiles(iterable): list of profiles |
469 None if not specified | |
470 """ | |
471 main_cls = plugin_info['main'] | |
472 return main_cls(callback=callback, cancel_cb=cancel_cb) | |
473 | |
29 | 474 ## plugins & kv import ## |
475 | |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
476 def _import_kv(self): |
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
477 """import all kv files in cagou.kv""" |
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
478 path = os.path.dirname(cagou.kv.__file__) |
130
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
479 kv_files = glob.glob(os.path.join(path, "*.kv")) |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
480 # we want to be sure that base.kv is loaded first |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
481 # as it override some Kivy widgets properties |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
482 for kv_file in kv_files: |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
483 if kv_file.endswith('base.kv'): |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
484 kv_files.remove(kv_file) |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
485 kv_files.insert(0, kv_file) |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
486 break |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
487 else: |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
488 raise exceptions.InternalError("base.kv is missing") |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
489 |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
490 for kv_file in kv_files: |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
491 Builder.load_file(kv_file) |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
492 log.debug(u"kv file {} loaded".format(kv_file)) |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
493 |
14 | 494 def _import_plugins(self): |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
495 """import all plugins""" |
14 | 496 self.default_wid = None |
87
17094a075fd2
core: use C.PLUGIN_EXT to know which plugin extension to use
Goffi <goffi@goffi.org>
parents:
86
diff
changeset
|
497 plugins_path = os.path.dirname(cagou.plugins.__file__) |
17094a075fd2
core: use C.PLUGIN_EXT to know which plugin extension to use
Goffi <goffi@goffi.org>
parents:
86
diff
changeset
|
498 plugin_glob = u"plugin*." + C.PLUGIN_EXT |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
499 plug_lst = [os.path.splitext(p)[0] for p in |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
500 map(os.path.basename, glob.glob(os.path.join(plugins_path, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
501 plugin_glob)))] |
61 | 502 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
503 imported_names_main = set() # used to avoid loading 2 times |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
504 # plugin with same import name |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
505 imported_names_transfer = set() |
14 | 506 for plug in plug_lst: |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
507 plugin_path = 'cagou.plugins.' + plug |
86 | 508 |
509 # we get type from plugin name | |
510 suff = plug[7:] | |
511 if u'_' not in suff: | |
512 log.error(u"invalid plugin name: {}, skipping".format(plug)) | |
513 continue | |
514 plugin_type = suff[:suff.find(u'_')] | |
515 | |
516 # and select the variable to use according to type | |
517 if plugin_type == C.PLUG_TYPE_WID: | |
518 imported_names = imported_names_main | |
519 default_factory = self._defaultFactoryMain | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
520 elif plugin_type == C.PLUG_TYPE_TRANSFER: |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
521 imported_names = imported_names_transfer |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
522 default_factory = self._defaultFactoryTransfer |
86 | 523 else: |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
524 log.error(u"unknown plugin type {type_} for plugin {file_}, skipping" |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
525 .format( |
86 | 526 type_ = plugin_type, |
527 file_ = plug | |
528 )) | |
529 continue | |
530 plugins_set = self._getPluginsSet(plugin_type) | |
531 | |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
532 mod = import_module(plugin_path) |
14 | 533 try: |
534 plugin_info = mod.PLUGIN_INFO | |
535 except AttributeError: | |
536 plugin_info = {} | |
537 | |
86 | 538 plugin_info['plugin_file'] = plug |
539 plugin_info['plugin_type'] = plugin_type | |
540 | |
541 if 'platforms' in plugin_info: | |
542 if sys.platform not in plugin_info['platforms']: | |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
543 log.info(u"{plugin_file} is not used on this platform, skipping" |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
544 .format(**plugin_info)) |
86 | 545 continue |
546 | |
14 | 547 # import name is used to differentiate plugins |
548 if 'import_name' not in plugin_info: | |
549 plugin_info['import_name'] = plug | |
86 | 550 if plugin_info['import_name'] in imported_names: |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
551 log.warning(_(u"there is already a plugin named {}, " |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
552 u"ignoring new one").format(plugin_info['import_name'])) |
14 | 553 continue |
554 if plugin_info['import_name'] == C.WID_SELECTOR: | |
86 | 555 if plugin_type != C.PLUG_TYPE_WID: |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
556 log.error(u"{import_name} import name can only be used with {type_} " |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
557 u"type, skipping {name}".format(type_=C.PLUG_TYPE_WID, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
558 **plugin_info)) |
86 | 559 continue |
14 | 560 # if WidgetSelector exists, it will be our default widget |
561 self.default_wid = plugin_info | |
562 | |
563 # we want everything optional, so we use plugin file name | |
564 # if actual name is not found | |
565 if 'name' not in plugin_info: | |
86 | 566 name_start = 8 + len(plugin_type) |
567 plugin_info['name'] = plug[name_start:] | |
14 | 568 |
569 # we need to load the kv file | |
570 if 'kv_file' not in plugin_info: | |
571 plugin_info['kv_file'] = u'{}.kv'.format(plug) | |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
572 kv_path = os.path.join(plugins_path, plugin_info['kv_file']) |
89
d249df379fa3
core: kv files are not mandatory anymore for plugins
Goffi <goffi@goffi.org>
parents:
87
diff
changeset
|
573 if not os.path.exists(kv_path): |
d249df379fa3
core: kv files are not mandatory anymore for plugins
Goffi <goffi@goffi.org>
parents:
87
diff
changeset
|
574 log.debug(u"no kv found for {plugin_file}".format(**plugin_info)) |
d249df379fa3
core: kv files are not mandatory anymore for plugins
Goffi <goffi@goffi.org>
parents:
87
diff
changeset
|
575 else: |
d249df379fa3
core: kv files are not mandatory anymore for plugins
Goffi <goffi@goffi.org>
parents:
87
diff
changeset
|
576 Builder.load_file(kv_path) |
14 | 577 |
578 # what is the main class ? | |
579 main_cls = getattr(mod, plugin_info['main']) | |
580 plugin_info['main'] = main_cls | |
581 | |
582 # factory is used to create the instance | |
583 # if not found, we use a defaut one with getOrCreateWidget | |
584 if 'factory' not in plugin_info: | |
86 | 585 plugin_info['factory'] = default_factory |
14 | 586 |
25
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
587 # icons |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
588 for size in ('small', 'medium'): |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
589 key = u'icon_{}'.format(size) |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
590 try: |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
591 path = plugin_info[key] |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
592 except KeyError: |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
593 path = C.DEFAULT_WIDGET_ICON.format(media=self.media_dir) |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
594 else: |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
595 path = path.format(media=self.media_dir) |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
596 if not os.path.isfile(path): |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
597 path = C.DEFAULT_WIDGET_ICON.format(media=self.media_dir) |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
598 plugin_info[key] = path |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
599 |
86 | 600 plugins_set.append(plugin_info) |
14 | 601 if not self._plg_wids: |
602 log.error(_(u"no widget plugin found")) | |
603 return | |
604 | |
605 # we want widgets sorted by names | |
606 self._plg_wids.sort(key=lambda p: p['name'].lower()) | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
607 self._plg_wids_transfer.sort(key=lambda p: p['name'].lower()) |
14 | 608 |
609 if self.default_wid is None: | |
610 # we have no selector widget, we use the first widget as default | |
611 self.default_wid = self._plg_wids[0] | |
612 | |
86 | 613 def _getPluginsSet(self, type_): |
614 if type_ == C.PLUG_TYPE_WID: | |
615 return self._plg_wids | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
616 elif type_ == C.PLUG_TYPE_TRANSFER: |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
617 return self._plg_wids_transfer |
86 | 618 else: |
619 raise KeyError(u"{} plugin type is unknown".format(type_)) | |
620 | |
621 def getPluggedWidgets(self, type_=C.PLUG_TYPE_WID, except_cls=None): | |
14 | 622 """get available widgets plugin infos |
623 | |
86 | 624 @param type_(unicode): type of widgets to get |
625 one of C.PLUG_TYPE_* constant | |
14 | 626 @param except_cls(None, class): if not None, |
627 widgets from this class will be excluded | |
41
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
628 @return (iter[dict]): available widgets plugin infos |
14 | 629 """ |
86 | 630 plugins_set = self._getPluginsSet(type_) |
631 for plugin_data in plugins_set: | |
19
c58b522607f4
main: fixed profiles value in _defaultFactory + getPluggedWidgets is now a generator
Goffi <goffi@goffi.org>
parents:
16
diff
changeset
|
632 if plugin_data['main'] == except_cls: |
c58b522607f4
main: fixed profiles value in _defaultFactory + getPluggedWidgets is now a generator
Goffi <goffi@goffi.org>
parents:
16
diff
changeset
|
633 continue |
c58b522607f4
main: fixed profiles value in _defaultFactory + getPluggedWidgets is now a generator
Goffi <goffi@goffi.org>
parents:
16
diff
changeset
|
634 yield plugin_data |
14 | 635 |
86 | 636 def getPluginInfo(self, type_=C.PLUG_TYPE_WID, **kwargs): |
41
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
637 """get first plugin info corresponding to filters |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
638 |
86 | 639 @param type_(unicode): type of widgets to get |
640 one of C.PLUG_TYPE_* constant | |
41
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
641 @param **kwargs: filter(s) to use, each key present here must also |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
642 exist and be of the same value in requested plugin info |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
643 @return (dict, None): found plugin info or None |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
644 """ |
86 | 645 plugins_set = self._getPluginsSet(type_) |
646 for plugin_info in plugins_set: | |
41
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
647 for k, w in kwargs.iteritems(): |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
648 try: |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
649 if plugin_info[k] != w: |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
650 continue |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
651 except KeyError: |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
652 continue |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
653 return plugin_info |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
654 |
29 | 655 ## widgets handling |
9 | 656 |
43
12fdc7d1feb1
core: newWidget implementation, it only display a not when a MUC room has been joined
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
657 def newWidget(self, widget): |
12fdc7d1feb1
core: newWidget implementation, it only display a not when a MUC room has been joined
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
658 log.debug(u"new widget created: {}".format(widget)) |
12fdc7d1feb1
core: newWidget implementation, it only display a not when a MUC room has been joined
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
659 if isinstance(widget, quick_chat.QuickChat) and widget.type == C.CHAT_GROUP: |
12fdc7d1feb1
core: newWidget implementation, it only display a not when a MUC room has been joined
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
660 self.addNote(u"", _(u"room {} has been joined").format(widget.target)) |
12fdc7d1feb1
core: newWidget implementation, it only display a not when a MUC room has been joined
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
661 |
11
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
662 def switchWidget(self, old, new): |
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
663 """Replace old widget by new one |
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
664 |
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
665 old(CagouWidget): CagouWidget instance or a child |
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
666 new(CagouWidget): new widget instance |
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
667 """ |
14 | 668 to_change = None |
669 if isinstance(old, CagouWidget): | |
670 to_change = old | |
671 else: | |
672 for w in old.walk_reverse(): | |
673 if isinstance(w, CagouWidget): | |
674 to_change = w | |
675 break | |
676 | |
677 if to_change is None: | |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
678 raise exceptions.InternalError(u"no CagouWidget found when " |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
679 u"trying to switch widget") |
154 | 680 |
681 wrapper = to_change.parent | |
682 while wrapper is not None and not(isinstance(wrapper, widgets_handler.WHWrapper)): | |
683 wrapper = wrapper.parent | |
684 | |
685 if wrapper is None: | |
686 raise exceptions.InternalError(u"no wrapper found") | |
687 | |
688 wrapper.changeWidget(new) | |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
689 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
690 def addVisibleWidget(self, widget): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
691 """declare a widget visible |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
692 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
693 for internal use only! |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
694 """ |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
695 assert isinstance(widget, quick_widgets.QuickWidget) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
696 self._visible_widgets.setdefault(widget.__class__, []).append(widget) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
697 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
698 def removeVisibleWidget(self, widget): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
699 """declare a widget not visible anymore |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
700 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
701 for internal use only! |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
702 """ |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
703 self._visible_widgets[widget.__class__].remove(widget) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
704 self.widgets.deleteWidget(widget) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
705 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
706 def getVisibleList(self, cls): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
707 """get list of visible widgets for a given class |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
708 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
709 @param cls(QuickWidget class): type of widgets to get |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
710 @return (list[QuickWidget class]): visible widgets of this class |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
711 """ |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
712 try: |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
713 return self._visible_widgets[cls] |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
714 except KeyError: |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
715 return [] |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
716 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
717 def getOrClone(self, widget): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
718 """Get a QuickWidget if it has not parent set else clone it""" |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
719 if widget.parent is None: |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
720 return widget |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
721 targets = list(widget.targets) |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
722 w = self.widgets.getOrCreateWidget(widget.__class__, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
723 targets[0], |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
724 on_new_widget=None, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
725 on_existing_widget=C.WIDGET_RECREATE, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
726 profiles=widget.profiles) |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
727 for t in targets[1:]: |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
728 w.addTarget(t) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
729 return w |
29 | 730 |
51 | 731 ## menus ## |
732 | |
112
d654bdfeb404
core: changes menu bridge call, to follow backend
Goffi <goffi@goffi.org>
parents:
97
diff
changeset
|
733 def _menusGetCb(self, backend_menus): |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
734 main_menu = self.app.root.root_menus |
51 | 735 self.menus.addMenus(backend_menus) |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
736 self.menus.addMenu(C.MENU_GLOBAL, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
737 (_(u"Help"), _(u"About")), |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
738 callback=main_menu.onAbout) |
51 | 739 main_menu.update(C.MENU_GLOBAL) |
740 | |
122
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
741 ## bridge handlers ## |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
742 |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
743 def otrStateHandler(self, state, dest_jid, profile): |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
744 """OTR state has changed for on destinee""" |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
745 # XXX: this method could be in QuickApp but it's here as |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
746 # it's only used by Cagou so far |
244
5bd94bc08f5c
plugin chat: fixed OTR State filtering + removed some legacy code
Goffi <goffi@goffi.org>
parents:
240
diff
changeset
|
747 dest_jid = jid.JID(dest_jid) |
5bd94bc08f5c
plugin chat: fixed OTR State filtering + removed some legacy code
Goffi <goffi@goffi.org>
parents:
240
diff
changeset
|
748 bare_jid = dest_jid.bare |
122
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
749 for widget in self.widgets.getWidgets(quick_chat.QuickChat, profiles=(profile,)): |
244
5bd94bc08f5c
plugin chat: fixed OTR State filtering + removed some legacy code
Goffi <goffi@goffi.org>
parents:
240
diff
changeset
|
750 if widget.type == C.CHAT_ONE2ONE and widget.target == bare_jid: |
5bd94bc08f5c
plugin chat: fixed OTR State filtering + removed some legacy code
Goffi <goffi@goffi.org>
parents:
240
diff
changeset
|
751 widget.onOTRState(state, dest_jid, profile) |
122
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
752 |
29 | 753 ## misc ## |
754 | |
755 def plugging_profiles(self): | |
154 | 756 self.app.root.changeWidget(widgets_handler.WidgetsHandler()) |
112
d654bdfeb404
core: changes menu bridge call, to follow backend
Goffi <goffi@goffi.org>
parents:
97
diff
changeset
|
757 self.bridge.menusGet("", C.NO_SECURITY_LIMIT, callback=self._menusGetCb) |
29 | 758 |
759 def setPresenceStatus(self, show='', status=None, profile=C.PROF_KEY_NONE): | |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
760 log.info(u"Profile presence status set to {show}/{status}".format(show=show, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
761 status=status)) |
29 | 762 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
763 def errback(self, failure_, title=_('error'), |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
764 message=_(u'error while processing: {msg}')): |
190
33ac2d2ce5d7
core: new errback method which can be use as a generic way to show error as notes
Goffi <goffi@goffi.org>
parents:
189
diff
changeset
|
765 self.addNote(title, message.format(msg=failure_), level=C.XMLUI_DATA_LVL_WARNING) |
33ac2d2ce5d7
core: new errback method which can be use as a generic way to show error as notes
Goffi <goffi@goffi.org>
parents:
189
diff
changeset
|
766 |
43
12fdc7d1feb1
core: newWidget implementation, it only display a not when a MUC room has been joined
Goffi <goffi@goffi.org>
parents:
41
diff
changeset
|
767 def addNote(self, title, message, level=C.XMLUI_DATA_LVL_INFO): |
29 | 768 """add a note (message which disappear) to root widget's header""" |
769 self.app.root.addNote(title, message, level) | |
770 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
771 def addNotifUI(self, ui): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
772 """add a notification with a XMLUI attached |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
773 |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
774 @param ui(xmlui.XMLUIPanel): XMLUI instance to show when notification is selected |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
775 """ |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
776 self.app.root.addNotifUI(ui) |
29 | 777 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
778 def addNotifWidget(self, widget): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
779 """add a notification with a Kivy widget attached |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
780 |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
781 @param widget(kivy.uix.Widget): widget to attach to notification |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
782 """ |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
783 self.app.root.addNotifWidget(widget) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
784 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
785 def showUI(self, ui): |
78 | 786 """show a XMLUI""" |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
787 self.app.root.changeWidget(ui, "xmlui") |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
788 self.app.root.show("xmlui") |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
789 |
78 | 790 def showExtraUI(self, widget): |
791 """show any extra widget""" | |
792 self.app.root.changeWidget(widget, "extra") | |
793 self.app.root.show("extra") | |
794 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
795 def closeUI(self): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
796 self.app.root.show() |
44
7819e9efa250
chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents:
43
diff
changeset
|
797 |
7819e9efa250
chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents:
43
diff
changeset
|
798 def getDefaultAvatar(self, entity=None): |
7819e9efa250
chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents:
43
diff
changeset
|
799 return self.app.default_avatar |
61 | 800 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
801 def _dialog_cb(self, cb, *args, **kwargs): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
802 """generic dialog callback |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
803 |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
804 close dialog then call the callback with given arguments |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
805 """ |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
806 def callback(): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
807 self.closeUI() |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
808 cb(*args, **kwargs) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
809 return callback |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
810 |
61 | 811 def showDialog(self, message, title, type="info", answer_cb=None, answer_data=None): |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
812 if type in ('info', 'warning', 'error'): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
813 self.addNote(title, message, type) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
814 elif type == "yes/no": |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
815 wid = dialog.ConfirmDialog(title=title, message=message, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
816 yes_cb=self._dialog_cb(answer_cb, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
817 True, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
818 answer_data), |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
819 no_cb=self._dialog_cb(answer_cb, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
820 False, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
821 answer_data) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
822 ) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
823 self.addNotifWidget(wid) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
824 else: |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
825 log.warning(_(u"unknown dialog type: {dialog_type}").format(dialog_type=type)) |
184
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
826 |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
827 |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
828 def desktop_notif(self, message, title=u'', duration=5000): |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
829 if notification is not None: |
229
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
830 try: |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
831 notification.notify(title=title, |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
832 message=message, |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
833 app_name=C.APP_NAME, |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
834 app_icon=self.app.icon, |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
835 timeout = duration) |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
836 except Exception as e: |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
837 log.warning(_(u"Can't use notifications, disabling: {msg}").format( |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
838 msg = e)) |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
839 global notification |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
840 notification = None |