Mercurial > libervia-desktop-kivy
annotate cagou/core/cagou_main.py @ 154:a5e8833184c6
widget handler: refactoring:
- replaced proof of concept implementation with cleaner one based on custom layout
- removed proof of concept big bars in favor of thin line to separate widgets, with a 3 dots area in the center where user can touch/click more easily
- when in delete zone, the line + half circle become red, so user knows that she's about to delete a widget
- carousel is now created in kv
- ignore perpendicular swipes. This was not working before but is know working well, and the swipe is far more easy to do on desktop or mobile
- each new widget of the handler has an id (its creation number), which is displayed in debug logs on touch
- handler's widgets keep track of which widgets are on sides (left, top, right, bottom)
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 27 Apr 2018 16:45:09 +0200 |
parents | b9fd83292fc4 |
children | e6ec8ff62d87 |
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 |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
32 from sat.tools import config |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
33 from sat.tools.common import dynamic_import |
0 | 34 import kivy |
142 | 35 kivy.require('1.10.0') |
0 | 36 import kivy.support |
63 | 37 main_config = config.parseMainConf() |
38 bridge_name = config.getConfig(main_config, '', 'bridge', 'dbus') | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
39 # FIXME: event loop is choosen according to bridge_name, a better way should be used |
63 | 40 if 'dbus' in bridge_name: |
41 kivy.support.install_gobject_iteration() | |
42 elif bridge_name in ('pb', 'embedded'): | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
43 kivy.support.install_twisted_reactor() |
0 | 44 from kivy.app import App |
14 | 45 from kivy.lang import Builder |
29 | 46 from kivy import properties |
0 | 47 import xmlui |
48 from profile_manager import ProfileManager | |
29 | 49 from kivy.clock import Clock |
50 from kivy.uix.label import Label | |
9 | 51 from kivy.uix.boxlayout import BoxLayout |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
52 from kivy.uix.floatlayout import FloatLayout |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
53 from kivy.uix.screenmanager import ScreenManager, Screen, FallOutTransition, RiseInTransition |
29 | 54 from kivy.uix.dropdown import DropDown |
11
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
55 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
|
56 from . import widgets_handler |
29 | 57 from .common import IconButton |
86 | 58 from . import menu |
14 | 59 from importlib import import_module |
9 | 60 import os.path |
14 | 61 import glob |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
62 import cagou.plugins |
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
63 import cagou.kv |
61 | 64 from kivy import utils as kivy_utils |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
65 import sys |
131
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
66 from kivy.core.window import Window |
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
67 |
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
68 # we want white background by default |
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
69 Window.clearcolor = (1, 1, 1, 1) |
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
70 |
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
71 |
61 | 72 if kivy_utils.platform == "android": |
73 # FIXME: move to separate android module | |
74 # sys.platform is "linux" on android by default | |
75 # so we change it to allow backend to detect android | |
76 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
|
77 import mmap |
87
17094a075fd2
core: use C.PLUGIN_EXT to know which plugin extension to use
Goffi <goffi@goffi.org>
parents:
86
diff
changeset
|
78 C.PLUGIN_EXT = 'pyo' |
9 | 79 |
80 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
81 class NotifsIcon(IconButton): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
82 notifs = properties.ListProperty() |
29 | 83 |
84 def on_release(self): | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
85 callback, args, kwargs = self.notifs.pop(0) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
86 callback(*args, **kwargs) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
87 |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
88 def addNotif(self, callback, *args, **kwargs): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
89 self.notifs.append((callback, args, kwargs)) |
29 | 90 |
91 | |
92 class Note(Label): | |
93 title = properties.StringProperty() | |
94 message = properties.StringProperty() | |
95 level = properties.OptionProperty(C.XMLUI_DATA_LVL_DEFAULT, options=list(C.XMLUI_DATA_LVLS)) | |
96 | |
97 | |
98 class NoteDrop(Note): | |
99 pass | |
100 | |
101 | |
102 class NotesDrop(DropDown): | |
103 clear_btn = properties.ObjectProperty() | |
104 | |
105 def __init__(self, notes): | |
106 super(NotesDrop, self).__init__() | |
107 self.notes = notes | |
108 | |
109 def open(self, widget): | |
110 self.clear_widgets() | |
111 for n in self.notes: | |
112 self.add_widget(NoteDrop(title=n.title, message=n.message, level=n.level)) | |
113 self.add_widget(self.clear_btn) | |
114 super(NotesDrop, self).open(widget) | |
115 | |
116 | |
117 class RootHeadWidget(BoxLayout): | |
118 """Notifications widget""" | |
119 manager = properties.ObjectProperty() | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
120 notifs_icon = properties.ObjectProperty() |
29 | 121 notes = properties.ListProperty() |
122 | |
123 def __init__(self): | |
124 super(RootHeadWidget, self).__init__() | |
125 self.notes_last = None | |
126 self.notes_event = None | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
127 self.notes_drop = NotesDrop(self.notes) |
29 | 128 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
129 def addNotif(self, callback, *args, **kwargs): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
130 self.notifs_icon.addNotif(callback, *args, **kwargs) |
29 | 131 |
132 def addNote(self, title, message, level): | |
133 note = Note(title=title, message=message, level=level) | |
134 self.notes.append(note) | |
135 if len(self.notes) > 10: | |
136 del self.notes[:-10] | |
137 if self.notes_event is None: | |
138 self.notes_event = Clock.schedule_interval(self._displayNextNote, 5) | |
139 self._displayNextNote() | |
140 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
141 def addNotifUI(self, ui): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
142 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
|
143 |
29 | 144 def _displayNextNote(self, dummy=None): |
145 screen = Screen() | |
146 try: | |
147 idx = self.notes.index(self.notes_last) + 1 | |
148 except ValueError: | |
149 idx = 0 | |
150 try: | |
151 note = self.notes_last = self.notes[idx] | |
152 except IndexError: | |
153 self.notes_event.cancel() | |
154 self.notes_event = None | |
155 else: | |
156 screen.add_widget(note) | |
157 self.manager.switch_to(screen) | |
158 | |
159 | |
86 | 160 class RootMenus(menu.MenusWidget): |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
161 pass |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
162 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
163 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
164 class RootBody(BoxLayout): |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
165 pass |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
166 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
167 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
168 class CagouRootWidget(FloatLayout): |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
169 root_menus = properties.ObjectProperty() |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
170 root_body = properties.ObjectProperty |
9 | 171 |
29 | 172 def __init__(self, main_widget): |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
173 super(CagouRootWidget, self).__init__() |
29 | 174 # header |
175 self._head_widget = RootHeadWidget() | |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
176 self.root_body.add_widget(self._head_widget) |
29 | 177 # body |
178 self._manager = ScreenManager() | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
179 # main widgets |
29 | 180 main_screen = Screen(name='main') |
181 main_screen.add_widget(main_widget) | |
182 self._manager.add_widget(main_screen) | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
183 # backend XMLUI (popups, forms, etc) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
184 xmlui_screen = Screen(name='xmlui') |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
185 self._manager.add_widget(xmlui_screen) |
78 | 186 # extra (file chooser, audio record, etc) |
187 extra_screen = Screen(name='extra') | |
188 self._manager.add_widget(extra_screen) | |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
189 self.root_body.add_widget(self._manager) |
29 | 190 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
191 def changeWidget(self, widget, screen_name="main"): |
29 | 192 """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
|
193 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
|
194 # 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
|
195 # 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
|
196 self._manager.transition.stop() |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
197 screen = self._manager.get_screen(screen_name) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
198 screen.clear_widgets() |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
199 screen.add_widget(widget) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
200 |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
201 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
|
202 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
|
203 # 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
|
204 # 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
|
205 self._manager.transition.stop() |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
206 if self._manager.current == screen: |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
207 return |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
208 if screen == "main": |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
209 self._manager.transition = FallOutTransition() |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
210 else: |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
211 self._manager.transition = RiseInTransition() |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
212 self._manager.current = screen |
29 | 213 |
214 def newAction(self, handler, action_data, id_, security_limit, profile): | |
215 """Add a notification for an action""" | |
216 self._head_widget.addNotif(handler, action_data, id_, security_limit, profile) | |
217 | |
218 def addNote(self, title, message, level): | |
219 self._head_widget.addNote(title, message, level) | |
0 | 220 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
221 def addNotifUI(self, ui): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
222 self._head_widget.addNotifUI(ui) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
223 |
0 | 224 |
225 class CagouApp(App): | |
226 """Kivy App for Cagou""" | |
227 | |
152
b9fd83292fc4
core: disabled Kivy's default behaviour of displaying settings on F1
Goffi <goffi@goffi.org>
parents:
143
diff
changeset
|
228 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
|
229 # 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
|
230 # 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
|
231 return |
b9fd83292fc4
core: disabled Kivy's default behaviour of displaying settings on F1
Goffi <goffi@goffi.org>
parents:
143
diff
changeset
|
232 |
0 | 233 def build(self): |
143
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
234 Window.bind(on_keyboard=self.key_input) |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
235 return CagouRootWidget(Label(text=u"Loading please wait")) |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
236 |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
237 def showWidget(self): |
49
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
238 self._profile_manager = ProfileManager() |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
239 self.root.changeWidget(self._profile_manager) |
0 | 240 |
31
4f9e701d76b4
core: expand now accepts extra arguments, which will be used in format
Goffi <goffi@goffi.org>
parents:
29
diff
changeset
|
241 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
|
242 """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
|
243 |
32 | 244 useful in kv. Values which can be used: |
245 - {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
|
246 @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
|
247 @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
|
248 @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
|
249 """ |
31
4f9e701d76b4
core: expand now accepts extra arguments, which will be used in format
Goffi <goffi@goffi.org>
parents:
29
diff
changeset
|
250 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
|
251 |
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
|
252 def on_start(self): |
75
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
253 if sys.platform == "android": |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
254 # XXX: we use memory map instead of bridge because if we try to call a bridge method |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
255 # in on_pause method, the call data is not written before the actual pause |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
256 # 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
|
257 # status is: |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
258 # R => running |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
259 # P => paused |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
260 # S => stopped |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
261 self._first_pause = True |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
262 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
|
263 self.cagou_status_fd.write('R') |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
264 self.cagou_status_fd.flush() |
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
265 self.cagou_status = mmap.mmap(self.cagou_status_fd.fileno(), 1, 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
|
266 |
65
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
267 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
|
268 self.cagou_status[0] = 'P' |
65
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
269 return True |
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
270 |
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
271 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
|
272 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
|
273 |
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
|
274 def on_stop(self): |
77
bc170ccca744
core: added forgotten platfom check in on_stop
Goffi <goffi@goffi.org>
parents:
75
diff
changeset
|
275 if sys.platform == "android": |
bc170ccca744
core: added forgotten platfom check in on_stop
Goffi <goffi@goffi.org>
parents:
75
diff
changeset
|
276 self.cagou_status[0] = 'S' |
bc170ccca744
core: added forgotten platfom check in on_stop
Goffi <goffi@goffi.org>
parents:
75
diff
changeset
|
277 self.cagou_status.flush() |
bc170ccca744
core: added forgotten platfom check in on_stop
Goffi <goffi@goffi.org>
parents:
75
diff
changeset
|
278 self.cagou_status_fd.close() |
65
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
279 |
143
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
280 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
|
281 # we disable [esc] handling, because default action is to quit app |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
282 if key == 27: |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
283 return True |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
284 else: |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
285 return False |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
286 |
0 | 287 |
288 class Cagou(QuickApp): | |
289 MB_HANDLE = False | |
290 | |
291 def __init__(self): | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
292 if bridge_name == 'embedded': |
63 | 293 from sat.core import sat_main |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
294 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
|
295 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
|
296 from jnius import autoclass |
8a0019ce3632
core (android): service is now launched using pyjnius, as recommended in doc
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
297 service = autoclass('org.goffi.cagou.cagou.ServiceBackend') |
8a0019ce3632
core (android): service is now launched using pyjnius, as recommended in doc
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
298 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
|
299 argument = '' |
8a0019ce3632
core (android): service is now launched using pyjnius, as recommended in doc
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
300 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
|
301 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
|
302 |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
303 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
|
304 if bridge_module is None: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
305 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
|
306 sys.exit(3) |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
307 else: |
72
1a324c682d8a
core: use onBridgeConnected and exit code 3 when bridge can't be imported
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
308 log.debug(u"Loading {} bridge".format(bridge_name)) |
63 | 309 super(Cagou, self).__init__(bridge_factory=bridge_module.Bridge, xmlui=xmlui, check_options=quick_utils.check_options, 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
|
310 self._import_kv() |
0 | 311 self.app = CagouApp() |
29 | 312 self.app.host = self |
63 | 313 self.media_dir = self.app.media_dir = config.getConfig(main_config, '', 'media_dir') |
25
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
314 self.app.default_avatar = os.path.join(self.media_dir, "misc/default_avatar.png") |
91
520a9e1a659b
use of cagou_profile_bleu as Cagou's main icon
Goffi <goffi@goffi.org>
parents:
89
diff
changeset
|
315 self.app.icon = os.path.join(self.media_dir, "icons/muchoslava/png/cagou_profil_bleu_96.png") |
86 | 316 self._plg_wids = [] # main widgets plugins |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
317 self._plg_wids_transfer = [] # transfer widgets plugins |
14 | 318 self._import_plugins() |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
319 self._visible_widgets = {} # visible widgets by classes |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
320 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
321 @property |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
322 def visible_widgets(self): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
323 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
|
324 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
|
325 yield w |
0 | 326 |
72
1a324c682d8a
core: use onBridgeConnected and exit code 3 when bridge can't be imported
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
327 def onBridgeConnected(self): |
122
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
328 self.registerSignal("otrState", iface="plugin") |
63 | 329 self.bridge.getReady(self.onBackendReady) |
330 | |
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
|
331 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
|
332 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
|
333 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
|
334 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
|
335 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
|
336 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
|
337 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
|
338 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
|
339 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
|
340 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
|
341 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
|
342 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
|
343 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
|
344 |
0 | 345 def run(self): |
63 | 346 self.connectBridge() |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
347 self.app.bind(on_stop=self.onStop) |
0 | 348 self.app.run() |
349 | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
350 def onStop(self, obj): |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
351 try: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
352 sat_instance = self.sat |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
353 except AttributeError: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
354 pass |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
355 else: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
356 sat_instance.stopService() |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
357 |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
358 def onBackendReady(self): |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
359 self.app.showWidget() |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
360 self.postInit() |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
361 |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
362 def postInit(self, dummy=None): |
61 | 363 # FIXME: resize seem to bug on android, so we use below_target for now |
364 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
|
365 profile_manager = self.app._profile_manager |
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
366 del self.app._profile_manager |
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
367 super(Cagou, self).postInit(profile_manager) |
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
368 |
86 | 369 def _defaultFactoryMain(self, plugin_info, target, profiles): |
370 """default factory used to create main widgets instances | |
371 | |
372 used when PLUGIN_INFO["factory"] is not set | |
373 @param plugin_info(dict): plugin datas | |
374 @param target: QuickWidget target | |
375 @param profiles(iterable): list of profiles | |
376 """ | |
14 | 377 main_cls = plugin_info['main'] |
19
c58b522607f4
main: fixed profiles value in _defaultFactory + getPluggedWidgets is now a generator
Goffi <goffi@goffi.org>
parents:
16
diff
changeset
|
378 return self.widgets.getOrCreateWidget(main_cls, target, on_new_widget=None, profiles=iter(self.profiles)) |
14 | 379 |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
380 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
|
381 """default factory used to create transfer widgets instances |
86 | 382 |
383 @param plugin_info(dict): plugin datas | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
384 @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
|
385 @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
|
386 transfer widget must be used as first argument |
86 | 387 @param profiles(iterable): list of profiles |
388 None if not specified | |
389 """ | |
390 main_cls = plugin_info['main'] | |
391 return main_cls(callback=callback, cancel_cb=cancel_cb) | |
392 | |
29 | 393 ## plugins & kv import ## |
394 | |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
395 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
|
396 """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
|
397 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
|
398 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
|
399 # 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
|
400 # 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
|
401 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
|
402 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
|
403 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
|
404 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
|
405 break |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
406 else: |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
407 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
|
408 |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
409 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
|
410 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
|
411 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
|
412 |
14 | 413 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
|
414 """import all plugins""" |
14 | 415 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
|
416 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
|
417 plugin_glob = u"plugin*." + C.PLUGIN_EXT |
61 | 418 plug_lst = [os.path.splitext(p)[0] for p in map(os.path.basename, glob.glob(os.path.join(plugins_path, plugin_glob)))] |
419 | |
86 | 420 imported_names_main = set() # used to avoid loading 2 times plugin with same import name |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
421 imported_names_transfer = set() |
14 | 422 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
|
423 plugin_path = 'cagou.plugins.' + plug |
86 | 424 |
425 # we get type from plugin name | |
426 suff = plug[7:] | |
427 if u'_' not in suff: | |
428 log.error(u"invalid plugin name: {}, skipping".format(plug)) | |
429 continue | |
430 plugin_type = suff[:suff.find(u'_')] | |
431 | |
432 # and select the variable to use according to type | |
433 if plugin_type == C.PLUG_TYPE_WID: | |
434 imported_names = imported_names_main | |
435 default_factory = self._defaultFactoryMain | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
436 elif plugin_type == C.PLUG_TYPE_TRANSFER: |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
437 imported_names = imported_names_transfer |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
438 default_factory = self._defaultFactoryTransfer |
86 | 439 else: |
440 log.error(u"unknown plugin type {type_} for plugin {file_}, skipping".format( | |
441 type_ = plugin_type, | |
442 file_ = plug | |
443 )) | |
444 continue | |
445 plugins_set = self._getPluginsSet(plugin_type) | |
446 | |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
447 mod = import_module(plugin_path) |
14 | 448 try: |
449 plugin_info = mod.PLUGIN_INFO | |
450 except AttributeError: | |
451 plugin_info = {} | |
452 | |
86 | 453 plugin_info['plugin_file'] = plug |
454 plugin_info['plugin_type'] = plugin_type | |
455 | |
456 if 'platforms' in plugin_info: | |
457 if sys.platform not in plugin_info['platforms']: | |
458 log.info(u"{plugin_file} is not used on this platform, skipping".format(**plugin_info)) | |
459 continue | |
460 | |
14 | 461 # import name is used to differentiate plugins |
462 if 'import_name' not in plugin_info: | |
463 plugin_info['import_name'] = plug | |
86 | 464 if plugin_info['import_name'] in imported_names: |
14 | 465 log.warning(_(u"there is already a plugin named {}, ignoring new one").format(plugin_info['import_name'])) |
466 continue | |
467 if plugin_info['import_name'] == C.WID_SELECTOR: | |
86 | 468 if plugin_type != C.PLUG_TYPE_WID: |
469 log.error(u"{import_name} import name can only be used with {type_} type, skipping {name}".format(type_=C.PLUG_TYPE_WID, **plugin_info)) | |
470 continue | |
14 | 471 # if WidgetSelector exists, it will be our default widget |
472 self.default_wid = plugin_info | |
473 | |
474 # we want everything optional, so we use plugin file name | |
475 # if actual name is not found | |
476 if 'name' not in plugin_info: | |
86 | 477 name_start = 8 + len(plugin_type) |
478 plugin_info['name'] = plug[name_start:] | |
14 | 479 |
480 # we need to load the kv file | |
481 if 'kv_file' not in plugin_info: | |
482 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
|
483 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
|
484 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
|
485 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
|
486 else: |
d249df379fa3
core: kv files are not mandatory anymore for plugins
Goffi <goffi@goffi.org>
parents:
87
diff
changeset
|
487 Builder.load_file(kv_path) |
14 | 488 |
489 # what is the main class ? | |
490 main_cls = getattr(mod, plugin_info['main']) | |
491 plugin_info['main'] = main_cls | |
492 | |
493 # factory is used to create the instance | |
494 # if not found, we use a defaut one with getOrCreateWidget | |
495 if 'factory' not in plugin_info: | |
86 | 496 plugin_info['factory'] = default_factory |
14 | 497 |
25
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
498 # icons |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
499 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
|
500 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
|
501 try: |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
502 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
|
503 except KeyError: |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
504 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
|
505 else: |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
506 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
|
507 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
|
508 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
|
509 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
|
510 |
86 | 511 plugins_set.append(plugin_info) |
14 | 512 if not self._plg_wids: |
513 log.error(_(u"no widget plugin found")) | |
514 return | |
515 | |
516 # we want widgets sorted by names | |
517 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
|
518 self._plg_wids_transfer.sort(key=lambda p: p['name'].lower()) |
14 | 519 |
520 if self.default_wid is None: | |
521 # we have no selector widget, we use the first widget as default | |
522 self.default_wid = self._plg_wids[0] | |
523 | |
86 | 524 def _getPluginsSet(self, type_): |
525 if type_ == C.PLUG_TYPE_WID: | |
526 return self._plg_wids | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
527 elif type_ == C.PLUG_TYPE_TRANSFER: |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
528 return self._plg_wids_transfer |
86 | 529 else: |
530 raise KeyError(u"{} plugin type is unknown".format(type_)) | |
531 | |
532 def getPluggedWidgets(self, type_=C.PLUG_TYPE_WID, except_cls=None): | |
14 | 533 """get available widgets plugin infos |
534 | |
86 | 535 @param type_(unicode): type of widgets to get |
536 one of C.PLUG_TYPE_* constant | |
14 | 537 @param except_cls(None, class): if not None, |
538 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
|
539 @return (iter[dict]): available widgets plugin infos |
14 | 540 """ |
86 | 541 plugins_set = self._getPluginsSet(type_) |
542 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
|
543 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
|
544 continue |
c58b522607f4
main: fixed profiles value in _defaultFactory + getPluggedWidgets is now a generator
Goffi <goffi@goffi.org>
parents:
16
diff
changeset
|
545 yield plugin_data |
14 | 546 |
86 | 547 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
|
548 """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
|
549 |
86 | 550 @param type_(unicode): type of widgets to get |
551 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
|
552 @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
|
553 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
|
554 @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
|
555 """ |
86 | 556 plugins_set = self._getPluginsSet(type_) |
557 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
|
558 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
|
559 try: |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
560 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
|
561 continue |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
562 except KeyError: |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
563 continue |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
564 return plugin_info |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
565 |
29 | 566 ## widgets handling |
9 | 567 |
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
|
568 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
|
569 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
|
570 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
|
571 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
|
572 |
11
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
573 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
|
574 """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
|
575 |
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
576 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
|
577 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
|
578 """ |
14 | 579 to_change = None |
580 if isinstance(old, CagouWidget): | |
581 to_change = old | |
582 else: | |
583 for w in old.walk_reverse(): | |
584 if isinstance(w, CagouWidget): | |
585 to_change = w | |
586 break | |
587 | |
588 if to_change is None: | |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
589 raise exceptions.InternalError(u"no CagouWidget found when trying to switch widget") |
154 | 590 |
591 wrapper = to_change.parent | |
592 while wrapper is not None and not(isinstance(wrapper, widgets_handler.WHWrapper)): | |
593 wrapper = wrapper.parent | |
594 | |
595 if wrapper is None: | |
596 raise exceptions.InternalError(u"no wrapper found") | |
597 | |
598 wrapper.changeWidget(new) | |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
599 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
600 def addVisibleWidget(self, widget): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
601 """declare a widget visible |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
602 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
603 for internal use only! |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
604 """ |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
605 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
|
606 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
|
607 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
608 def removeVisibleWidget(self, widget): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
609 """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
|
610 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
611 for internal use only! |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
612 """ |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
613 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
|
614 self.widgets.deleteWidget(widget) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
615 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
616 def getVisibleList(self, cls): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
617 """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
|
618 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
619 @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
|
620 @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
|
621 """ |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
622 try: |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
623 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
|
624 except KeyError: |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
625 return [] |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
626 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
627 def getOrClone(self, widget): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
628 """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
|
629 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
|
630 return widget |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
631 targets = list(widget.targets) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
632 w = self.widgets.getOrCreateWidget(widget.__class__, targets[0], on_new_widget=None, on_existing_widget=C.WIDGET_RECREATE, profiles=widget.profiles) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
633 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
|
634 w.addTarget(t) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
635 return w |
29 | 636 |
51 | 637 ## menus ## |
638 | |
112
d654bdfeb404
core: changes menu bridge call, to follow backend
Goffi <goffi@goffi.org>
parents:
97
diff
changeset
|
639 def _menusGetCb(self, backend_menus): |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
640 main_menu = self.app.root.root_menus |
51 | 641 self.menus.addMenus(backend_menus) |
642 self.menus.addMenu(C.MENU_GLOBAL, (_(u"Help"), _(u"About")), callback=main_menu.onAbout) | |
643 main_menu.update(C.MENU_GLOBAL) | |
644 | |
122
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
645 ## bridge handlers ## |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
646 |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
647 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
|
648 """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
|
649 # 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
|
650 # it's only used by Cagou so far |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
651 for widget in self.widgets.getWidgets(quick_chat.QuickChat, profiles=(profile,)): |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
652 widget.onOTRState(state, dest_jid, profile) |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
653 |
29 | 654 ## misc ## |
655 | |
656 def plugging_profiles(self): | |
154 | 657 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
|
658 self.bridge.menusGet("", C.NO_SECURITY_LIMIT, callback=self._menusGetCb) |
29 | 659 |
660 def setPresenceStatus(self, show='', status=None, profile=C.PROF_KEY_NONE): | |
661 log.info(u"Profile presence status set to {show}/{status}".format(show=show, status=status)) | |
662 | |
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
|
663 def addNote(self, title, message, level=C.XMLUI_DATA_LVL_INFO): |
29 | 664 """add a note (message which disappear) to root widget's header""" |
665 self.app.root.addNote(title, message, level) | |
666 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
667 def addNotifUI(self, ui): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
668 """add a notification with a XMLUI attached |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
669 |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
670 @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
|
671 """ |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
672 self.app.root.addNotifUI(ui) |
29 | 673 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
674 def showUI(self, ui): |
78 | 675 """show a XMLUI""" |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
676 self.app.root.changeWidget(ui, "xmlui") |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
677 self.app.root.show("xmlui") |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
678 |
78 | 679 def showExtraUI(self, widget): |
680 """show any extra widget""" | |
681 self.app.root.changeWidget(widget, "extra") | |
682 self.app.root.show("extra") | |
683 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
684 def closeUI(self): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
685 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
|
686 |
7819e9efa250
chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents:
43
diff
changeset
|
687 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
|
688 return self.app.default_avatar |
61 | 689 |
690 def showDialog(self, message, title, type="info", answer_cb=None, answer_data=None): | |
691 # TODO | |
692 log.info(u"FIXME: showDialog not implemented") | |
693 log.info(u"message: {} -- {}".format(title, message)) |