Mercurial > libervia-desktop-kivy
annotate cagou/core/cagou_main.py @ 286:4772ba26623f
xmlui: many improvments:
- use a white background to be coherent with the rest of the UI
- cancel button is added on "window" XMLUIs
- use color for submit/save buttons
- VerticalContainer is not a ScrollView anymore, XMLUIPanel now has the main ScrollView
- when a TabsContainer is used as main container, main XMLUIPanel ScrollView touch events are disabled, to improve user experience (Kivy doesn't support well ScrollView inside an other ScrollView)
- use BoxLayout instead of GridLayout in AdvancedList*, as they use one row/col only
- fixed DividerWidget line location
- added margins in XMLUI panels
- renamed Settings main class to CagouSettings, to avoid conflict with Kivy's Settings class (which is causing troubles with kv)
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 27 Mar 2019 22:22:51 +0100 |
parents | 3f7e227aab00 |
children | a7b80552ca8d |
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 | |
282 | 5 # Copyright (C) 2016-2019 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 | |
285
3f7e227aab00
core: disable multitouch emulation with mouse
Goffi <goffi@goffi.org>
parents:
284
diff
changeset
|
21 import os.path |
3f7e227aab00
core: disable multitouch emulation with mouse
Goffi <goffi@goffi.org>
parents:
284
diff
changeset
|
22 import glob |
3f7e227aab00
core: disable multitouch emulation with mouse
Goffi <goffi@goffi.org>
parents:
284
diff
changeset
|
23 import sys |
14 | 24 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
|
25 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
|
26 kivy_hack.do_hack() |
6
85649eca9f9b
core (logs): integrate Kivy logs with SàT:
Goffi <goffi@goffi.org>
parents:
0
diff
changeset
|
27 from constants import Const as C |
0 | 28 from sat.core import log as logging |
29 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
|
30 from sat.core import exceptions |
0 | 31 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
|
32 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
|
33 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
|
34 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
|
35 from sat_frontends.tools import jid |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
36 from sat.tools import config |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
37 from sat.tools.common import dynamic_import |
0 | 38 import kivy |
142 | 39 kivy.require('1.10.0') |
0 | 40 import kivy.support |
63 | 41 main_config = config.parseMainConf() |
42 bridge_name = config.getConfig(main_config, '', 'bridge', 'dbus') | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
43 # FIXME: event loop is choosen according to bridge_name, a better way should be used |
63 | 44 if 'dbus' in bridge_name: |
45 kivy.support.install_gobject_iteration() | |
46 elif bridge_name in ('pb', 'embedded'): | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
47 kivy.support.install_twisted_reactor() |
0 | 48 from kivy.app import App |
14 | 49 from kivy.lang import Builder |
29 | 50 from kivy import properties |
0 | 51 import xmlui |
52 from profile_manager import ProfileManager | |
29 | 53 from kivy.clock import Clock |
54 from kivy.uix.label import Label | |
9 | 55 from kivy.uix.boxlayout import BoxLayout |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
56 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
|
57 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
|
58 FallOutTransition, RiseInTransition) |
29 | 59 from kivy.uix.dropdown import DropDown |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
60 from kivy.uix.behaviors import ButtonBehavior |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
61 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
|
62 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
|
63 from kivy.metrics import dp |
285
3f7e227aab00
core: disable multitouch emulation with mouse
Goffi <goffi@goffi.org>
parents:
284
diff
changeset
|
64 from kivy import utils as kivy_utils |
3f7e227aab00
core: disable multitouch emulation with mouse
Goffi <goffi@goffi.org>
parents:
284
diff
changeset
|
65 from kivy.config import Config as KivyConfig |
11
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
66 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
|
67 from . import widgets_handler |
29 | 68 from .common import IconButton |
86 | 69 from . import menu |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
70 from . import dialog |
14 | 71 from importlib import import_module |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
72 import cagou.plugins |
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
73 import cagou.kv |
184
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
74 try: |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
75 from plyer import notification |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
76 except ImportError: |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
77 notification = None |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
78 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
|
79 |
286 | 80 |
81 ## platform specific settings ## | |
82 | |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
83 if kivy_utils.platform == "android": |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
84 import socket |
131
36fc269e2a32
core: changed default background color to white
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
85 |
61 | 86 # FIXME: move to separate android module |
87 # sys.platform is "linux" on android by default | |
88 # so we change it to allow backend to detect android | |
89 sys.platform = "android" | |
87
17094a075fd2
core: use C.PLUGIN_EXT to know which plugin extension to use
Goffi <goffi@goffi.org>
parents:
86
diff
changeset
|
90 C.PLUGIN_EXT = 'pyo' |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
91 SOCKET_DIR = "/data/data/org.salutatoi.cagou/" |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
92 SOCKET_FILE = ".socket" |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
93 STATE_RUNNING = "running" |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
94 STATE_PAUSED = "paused" |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
95 STATE_STOPPED = "stopped" |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
96 |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
97 |
286 | 98 ## General Configuration ## |
99 | |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
100 # we want white background by default |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
101 Window.clearcolor = (1, 1, 1, 1) |
285
3f7e227aab00
core: disable multitouch emulation with mouse
Goffi <goffi@goffi.org>
parents:
284
diff
changeset
|
102 # we don't want multi-touch emulation with mouse |
3f7e227aab00
core: disable multitouch emulation with mouse
Goffi <goffi@goffi.org>
parents:
284
diff
changeset
|
103 KivyConfig.set('input', 'mouse', 'mouse,disable_multitouch') |
9 | 104 |
105 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
106 class NotifsIcon(IconButton): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
107 notifs = properties.ListProperty() |
29 | 108 |
109 def on_release(self): | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
110 callback, args, kwargs = self.notifs.pop(0) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
111 callback(*args, **kwargs) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
112 |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
113 def addNotif(self, callback, *args, **kwargs): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
114 self.notifs.append((callback, args, kwargs)) |
29 | 115 |
116 | |
117 class Note(Label): | |
118 title = properties.StringProperty() | |
119 message = properties.StringProperty() | |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
120 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
|
121 options=list(C.XMLUI_DATA_LVLS)) |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
122 symbol = properties.StringProperty() |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
123 action = properties.ObjectProperty() |
29 | 124 |
125 | |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
126 class NoteDrop(ButtonBehavior, BoxLayout): |
208 | 127 title = properties.StringProperty() |
128 message = properties.StringProperty() | |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
129 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
|
130 options=list(C.XMLUI_DATA_LVLS)) |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
131 symbol = properties.StringProperty() |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
132 action = properties.ObjectProperty() |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
133 |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
134 def on_press(self): |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
135 if self.action is not None: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
136 self.parent.parent.select(self.action) |
29 | 137 |
138 | |
139 class NotesDrop(DropDown): | |
140 clear_btn = properties.ObjectProperty() | |
141 | |
142 def __init__(self, notes): | |
143 super(NotesDrop, self).__init__() | |
144 self.notes = notes | |
145 | |
146 def open(self, widget): | |
147 self.clear_widgets() | |
148 for n in self.notes: | |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
149 kwargs = { |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
150 u'title': n.title, |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
151 u'message': n.message, |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
152 u'level': n.level |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
153 } |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
154 if n.symbol is not None: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
155 kwargs[u'symbol'] = n.symbol |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
156 if n.action is not None: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
157 kwargs[u'action'] = n.action |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
158 self.add_widget(NoteDrop(title=n.title, message=n.message, level=n.level, |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
159 symbol=n.symbol, action=n.action)) |
29 | 160 self.add_widget(self.clear_btn) |
161 super(NotesDrop, self).open(widget) | |
162 | |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
163 def on_select(self, action_kwargs): |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
164 app = App.get_running_app() |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
165 app.host.doAction(**action_kwargs) |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
166 |
29 | 167 |
168 class RootHeadWidget(BoxLayout): | |
169 """Notifications widget""" | |
170 manager = properties.ObjectProperty() | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
171 notifs_icon = properties.ObjectProperty() |
29 | 172 notes = properties.ListProperty() |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
173 HEIGHT = dp(35) |
29 | 174 |
175 def __init__(self): | |
176 super(RootHeadWidget, self).__init__() | |
177 self.notes_last = None | |
178 self.notes_event = None | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
179 self.notes_drop = NotesDrop(self.notes) |
29 | 180 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
181 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
|
182 """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
|
183 |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
184 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
|
185 @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
|
186 """ |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
187 self.notifs_icon.addNotif(callback, *args, **kwargs) |
29 | 188 |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
189 def addNote(self, title, message, level, symbol, action): |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
190 kwargs = { |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
191 u'title': title, |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
192 u'message': message, |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
193 u'level': level |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
194 } |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
195 if symbol is not None: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
196 kwargs[u'symbol'] = symbol |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
197 if action is not None: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
198 kwargs[u'action'] = action |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
199 note = Note(**kwargs) |
29 | 200 self.notes.append(note) |
201 if self.notes_event is None: | |
202 self.notes_event = Clock.schedule_interval(self._displayNextNote, 5) | |
203 self._displayNextNote() | |
204 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
205 def addNotifUI(self, ui): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
206 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
|
207 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
208 def addNotifWidget(self, widget): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
209 app = App.get_running_app() |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
210 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
|
211 |
284 | 212 def _displayNextNote(self, __=None): |
29 | 213 screen = Screen() |
214 try: | |
215 idx = self.notes.index(self.notes_last) + 1 | |
216 except ValueError: | |
217 idx = 0 | |
218 try: | |
219 note = self.notes_last = self.notes[idx] | |
220 except IndexError: | |
221 self.notes_event.cancel() | |
222 self.notes_event = None | |
223 else: | |
224 screen.add_widget(note) | |
225 self.manager.switch_to(screen) | |
226 | |
227 | |
86 | 228 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
|
229 HEIGHT = dp(30) |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
230 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
231 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
232 class RootBody(BoxLayout): |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
233 pass |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
234 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
235 |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
236 class CagouRootWidget(FloatLayout): |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
237 root_menus = properties.ObjectProperty() |
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
238 root_body = properties.ObjectProperty |
9 | 239 |
29 | 240 def __init__(self, main_widget): |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
241 super(CagouRootWidget, self).__init__() |
29 | 242 # header |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
243 self.head_widget = RootHeadWidget() |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
244 self.root_body.add_widget(self.head_widget) |
29 | 245 # body |
246 self._manager = ScreenManager() | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
247 # main widgets |
29 | 248 main_screen = Screen(name='main') |
249 main_screen.add_widget(main_widget) | |
250 self._manager.add_widget(main_screen) | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
251 # backend XMLUI (popups, forms, etc) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
252 xmlui_screen = Screen(name='xmlui') |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
253 self._manager.add_widget(xmlui_screen) |
78 | 254 # extra (file chooser, audio record, etc) |
255 extra_screen = Screen(name='extra') | |
256 self._manager.add_widget(extra_screen) | |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
257 self.root_body.add_widget(self._manager) |
29 | 258 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
259 def changeWidget(self, widget, screen_name="main"): |
29 | 260 """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
|
261 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
|
262 # 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
|
263 # 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
|
264 self._manager.transition.stop() |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
265 screen = self._manager.get_screen(screen_name) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
266 screen.clear_widgets() |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
267 screen.add_widget(widget) |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
268 |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
269 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
|
270 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
|
271 # 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
|
272 # 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
|
273 self._manager.transition.stop() |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
274 if self._manager.current == screen: |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
275 return |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
276 if screen == "main": |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
277 self._manager.transition = FallOutTransition() |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
278 else: |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
279 self._manager.transition = RiseInTransition() |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
280 self._manager.current = screen |
29 | 281 |
282 def newAction(self, handler, action_data, id_, security_limit, profile): | |
283 """Add a notification for an action""" | |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
284 self.head_widget.addNotif(handler, action_data, id_, security_limit, profile) |
29 | 285 |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
286 def addNote(self, title, message, level, symbol, action): |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
287 self.head_widget.addNote(title, message, level, symbol, action) |
0 | 288 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
289 def addNotifUI(self, ui): |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
290 self.head_widget.addNotifUI(ui) |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
291 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
292 def addNotifWidget(self, widget): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
293 self.head_widget.addNotifWidget(widget) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
294 |
0 | 295 |
296 class CagouApp(App): | |
297 """Kivy App for Cagou""" | |
176
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
298 c_prim = properties.ListProperty(C.COLOR_PRIM) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
299 c_prim_light = properties.ListProperty(C.COLOR_PRIM_LIGHT) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
300 c_prim_dark = properties.ListProperty(C.COLOR_PRIM_DARK) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
301 c_sec = properties.ListProperty(C.COLOR_SEC) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
302 c_sec_light = properties.ListProperty(C.COLOR_SEC_LIGHT) |
2cfef8fbfd4e
core: moved main colors to constants
Goffi <goffi@goffi.org>
parents:
174
diff
changeset
|
303 c_sec_dark = properties.ListProperty(C.COLOR_SEC_DARK) |
274 | 304 # we have to put those constants here and not in core/constants.py |
305 # because of the use of dp(), which would import Kivy too early | |
306 # and prevent the log hack | |
307 MARGIN_LEFT = MARGIN_RIGHT = dp(10) | |
0 | 308 |
152
b9fd83292fc4
core: disabled Kivy's default behaviour of displaying settings on F1
Goffi <goffi@goffi.org>
parents:
143
diff
changeset
|
309 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
|
310 # 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
|
311 # 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
|
312 return |
b9fd83292fc4
core: disabled Kivy's default behaviour of displaying settings on F1
Goffi <goffi@goffi.org>
parents:
143
diff
changeset
|
313 |
0 | 314 def build(self): |
143
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
315 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
|
316 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
|
317 if sys.platform == 'android': |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
318 # 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
|
319 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
|
320 return wid |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
321 |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
322 def showWidget(self): |
49
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
323 self._profile_manager = ProfileManager() |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
324 self.root.changeWidget(self._profile_manager) |
0 | 325 |
31
4f9e701d76b4
core: expand now accepts extra arguments, which will be used in format
Goffi <goffi@goffi.org>
parents:
29
diff
changeset
|
326 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
|
327 """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
|
328 |
32 | 329 useful in kv. Values which can be used: |
330 - {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
|
331 @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
|
332 @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
|
333 @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
|
334 """ |
31
4f9e701d76b4
core: expand now accepts extra arguments, which will be used in format
Goffi <goffi@goffi.org>
parents:
29
diff
changeset
|
335 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
|
336 |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
337 def initFrontendState(self): |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
338 """Init state to handle paused/stopped/running on mobile OSes""" |
75
b84dadbab62b
core: added a platform check in on_start:
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
339 if sys.platform == "android": |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
340 # XXX: we use a separated socket instead of bridge because if we |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
341 # 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
|
342 # is not written before the actual pause |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
343 s = self._frontend_status_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
344 s.connect(os.path.join(SOCKET_DIR, SOCKET_FILE)) |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
345 s.sendall(STATE_RUNNING) |
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
|
346 |
65
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
347 def on_pause(self): |
262
825e8c91b703
core: (de)activate sync flag when the frontend is being paused or resumed
Goffi <goffi@goffi.org>
parents:
260
diff
changeset
|
348 self.host.sync = False |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
349 self._frontend_status_socket.sendall(STATE_PAUSED) |
65
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
350 return True |
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
351 |
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
352 def on_resume(self): |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
353 self._frontend_status_socket.sendall(STATE_RUNNING) |
262
825e8c91b703
core: (de)activate sync flag when the frontend is being paused or resumed
Goffi <goffi@goffi.org>
parents:
260
diff
changeset
|
354 self.host.sync = True |
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
|
355 |
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
|
356 def on_stop(self): |
77
bc170ccca744
core: added forgotten platfom check in on_stop
Goffi <goffi@goffi.org>
parents:
75
diff
changeset
|
357 if sys.platform == "android": |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
358 self._frontend_status_socket.sendall(STATE_STOPPED) |
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
359 self._frontend_status_socket.close() |
65
1c738621bc8d
core: on_pause/on_resume handling (needed for Android)
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
360 |
143
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
361 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
|
362 if key == 27: |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
363 # 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
|
364 return True |
165 | 365 elif key == 292: |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
366 # F11: full screen |
165 | 367 if not Window.fullscreen: |
368 window.fullscreen = 'auto' | |
369 else: | |
370 window.fullscreen = False | |
371 return True | |
166
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
372 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
|
373 # 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
|
374 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
|
375 if menu.height: |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
376 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
|
377 else: |
37220459e93d
core: hide/show menu on M-m + disable menu on Android
Goffi <goffi@goffi.org>
parents:
165
diff
changeset
|
378 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
|
379 return True |
172
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
380 elif key == 110 and modifier == ['alt']: |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
381 # M-n we hide/show notifications |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
382 head = self.root.head_widget |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
383 if head.height: |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
384 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
|
385 else: |
7103655647aa
core: hide notifications header on M-n
Goffi <goffi@goffi.org>
parents:
166
diff
changeset
|
386 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
|
387 return True |
143
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
388 else: |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
389 return False |
05d602be0120
core: [esc] key handling is disabled (for now)
Goffi <goffi@goffi.org>
parents:
142
diff
changeset
|
390 |
0 | 391 |
392 class Cagou(QuickApp): | |
393 MB_HANDLE = False | |
265
805c4103dac5
core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents:
264
diff
changeset
|
394 AUTO_RESYNC = False |
0 | 395 |
396 def __init__(self): | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
397 if bridge_name == 'embedded': |
63 | 398 from sat.core import sat_main |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
399 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
|
400 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
|
401 from jnius import autoclass |
240 | 402 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
|
403 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
|
404 argument = '' |
8a0019ce3632
core (android): service is now launched using pyjnius, as recommended in doc
Goffi <goffi@goffi.org>
parents:
131
diff
changeset
|
405 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
|
406 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
|
407 |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
408 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
|
409 if bridge_module is None: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
410 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
|
411 sys.exit(3) |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
412 else: |
72
1a324c682d8a
core: use onBridgeConnected and exit code 3 when bridge can't be imported
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
413 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
|
414 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
|
415 xmlui=xmlui, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
416 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
|
417 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
|
418 self._import_kv() |
0 | 419 self.app = CagouApp() |
29 | 420 self.app.host = self |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
421 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
|
422 'media_dir') |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
423 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
|
424 'downloads_dir') |
188
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
425 if not os.path.exists(self.downloads_dir): |
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
426 try: |
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
427 os.makedirs(self.downloads_dir) |
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
428 except OSError as e: |
0abd24ab81b1
core: retrieve downloads_dir on startup
Goffi <goffi@goffi.org>
parents:
184
diff
changeset
|
429 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
|
430 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
|
431 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
|
432 "icons/muchoslava/png/cagou_profil_bleu_96.png") |
86 | 433 self._plg_wids = [] # main widgets plugins |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
434 self._plg_wids_transfer = [] # transfer widgets plugins |
14 | 435 self._import_plugins() |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
436 self._visible_widgets = {} # visible widgets by classes |
246 | 437 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
|
438 |
281
ef77423ce500
core: store tls_validation flag in host and use if for file upload.
Goffi <goffi@goffi.org>
parents:
280
diff
changeset
|
439 self.tls_validation = not C.bool(config.getConfig(main_config, |
ef77423ce500
core: store tls_validation flag in host and use if for file upload.
Goffi <goffi@goffi.org>
parents:
280
diff
changeset
|
440 C.CONFIG_SECTION, |
ef77423ce500
core: store tls_validation flag in host and use if for file upload.
Goffi <goffi@goffi.org>
parents:
280
diff
changeset
|
441 'no_certificate_validation', |
ef77423ce500
core: store tls_validation flag in host and use if for file upload.
Goffi <goffi@goffi.org>
parents:
280
diff
changeset
|
442 C.BOOL_FALSE)) |
ef77423ce500
core: store tls_validation flag in host and use if for file upload.
Goffi <goffi@goffi.org>
parents:
280
diff
changeset
|
443 if not self.tls_validation: |
280
b0461363bc65
core: certificate validation can be disabled:
Goffi <goffi@goffi.org>
parents:
276
diff
changeset
|
444 from cagou.core import patches |
b0461363bc65
core: certificate validation can be disabled:
Goffi <goffi@goffi.org>
parents:
276
diff
changeset
|
445 patches.apply() |
b0461363bc65
core: certificate validation can be disabled:
Goffi <goffi@goffi.org>
parents:
276
diff
changeset
|
446 log.warning(u"SSL certificate validation is disabled, this is unsecure!") |
b0461363bc65
core: certificate validation can be disabled:
Goffi <goffi@goffi.org>
parents:
276
diff
changeset
|
447 |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
448 @property |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
449 def visible_widgets(self): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
450 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
|
451 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
|
452 yield w |
0 | 453 |
265
805c4103dac5
core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents:
264
diff
changeset
|
454 @QuickApp.sync.setter |
805c4103dac5
core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents:
264
diff
changeset
|
455 def sync(self, state): |
805c4103dac5
core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents:
264
diff
changeset
|
456 QuickApp.sync.fset(self, state) |
805c4103dac5
core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents:
264
diff
changeset
|
457 # widget are resynchronised in onVisible event, |
805c4103dac5
core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents:
264
diff
changeset
|
458 # so we must call resync for widgets which are already visible |
805c4103dac5
core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents:
264
diff
changeset
|
459 if state: |
805c4103dac5
core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents:
264
diff
changeset
|
460 for w in self.visible_widgets: |
272
c4990a7d5dbd
core: check if resync exist in widget before calling it
Goffi <goffi@goffi.org>
parents:
267
diff
changeset
|
461 try: |
c4990a7d5dbd
core: check if resync exist in widget before calling it
Goffi <goffi@goffi.org>
parents:
267
diff
changeset
|
462 resync = w.resync |
c4990a7d5dbd
core: check if resync exist in widget before calling it
Goffi <goffi@goffi.org>
parents:
267
diff
changeset
|
463 except AttributeError: |
c4990a7d5dbd
core: check if resync exist in widget before calling it
Goffi <goffi@goffi.org>
parents:
267
diff
changeset
|
464 pass |
c4990a7d5dbd
core: check if resync exist in widget before calling it
Goffi <goffi@goffi.org>
parents:
267
diff
changeset
|
465 else: |
c4990a7d5dbd
core: check if resync exist in widget before calling it
Goffi <goffi@goffi.org>
parents:
267
diff
changeset
|
466 resync() |
265
805c4103dac5
core: resync widgets only when they are visible:
Goffi <goffi@goffi.org>
parents:
264
diff
changeset
|
467 |
72
1a324c682d8a
core: use onBridgeConnected and exit code 3 when bridge can't be imported
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
468 def onBridgeConnected(self): |
189
a91abcd6d9a5
core: call QuickApp.onBridgeConnected (so ns_map is filled)
Goffi <goffi@goffi.org>
parents:
188
diff
changeset
|
469 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
|
470 self.registerSignal("otrState", iface="plugin") |
63 | 471 self.bridge.getReady(self.onBackendReady) |
472 | |
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
|
473 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
|
474 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
|
475 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
|
476 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
|
477 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
|
478 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
|
479 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
|
480 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
|
481 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
|
482 log.debug("backend not ready, retrying ({})".format(self.retried)) |
284 | 483 Clock.schedule_once(lambda __: self.connectBridge(), 0.05) |
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
|
484 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
|
485 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
|
486 |
0 | 487 def run(self): |
63 | 488 self.connectBridge() |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
489 self.app.bind(on_stop=self.onStop) |
0 | 490 self.app.run() |
491 | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
492 def onStop(self, obj): |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
493 try: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
494 sat_instance = self.sat |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
495 except AttributeError: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
496 pass |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
497 else: |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
498 sat_instance.stopService() |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
499 |
246 | 500 def _getVersionCb(self, version): |
501 self.version = version | |
502 | |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
503 def onBackendReady(self): |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
504 self.app.showWidget() |
246 | 505 self.bridge.getVersion(callback=self._getVersionCb) |
259
4601793b0dee
core: use new unix socket mechanism to set frontend state
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
506 self.app.initFrontendState() |
60
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
507 self.postInit() |
35abe494e6c7
core: bridge selection + improvments for android
Goffi <goffi@goffi.org>
parents:
52
diff
changeset
|
508 |
284 | 509 def postInit(self, __=None): |
276 | 510 # FIXME: resize doesn't work with SDL2 on android, so we use below_target for now |
61 | 511 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
|
512 profile_manager = self.app._profile_manager |
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
513 del self.app._profile_manager |
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
514 super(Cagou, self).postInit(profile_manager) |
fd9cbf6ae663
core: postInit() is now called, allowing automatic profile connection
Goffi <goffi@goffi.org>
parents:
48
diff
changeset
|
515 |
86 | 516 def _defaultFactoryMain(self, plugin_info, target, profiles): |
517 """default factory used to create main widgets instances | |
518 | |
519 used when PLUGIN_INFO["factory"] is not set | |
520 @param plugin_info(dict): plugin datas | |
521 @param target: QuickWidget target | |
522 @param profiles(iterable): list of profiles | |
523 """ | |
14 | 524 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
|
525 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
|
526 target, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
527 on_new_widget=None, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
528 profiles=iter(self.profiles)) |
14 | 529 |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
530 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
|
531 """default factory used to create transfer widgets instances |
86 | 532 |
533 @param plugin_info(dict): plugin datas | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
534 @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
|
535 @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
|
536 transfer widget must be used as first argument |
86 | 537 @param profiles(iterable): list of profiles |
538 None if not specified | |
539 """ | |
540 main_cls = plugin_info['main'] | |
541 return main_cls(callback=callback, cancel_cb=cancel_cb) | |
542 | |
29 | 543 ## plugins & kv import ## |
544 | |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
545 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
|
546 """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
|
547 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
|
548 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
|
549 # 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
|
550 # 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
|
551 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
|
552 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
|
553 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
|
554 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
|
555 break |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
556 else: |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
557 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
|
558 |
0ec3c3c0ed92
core (kv): new base.kv to handle default properties overriding on Kivy widgets
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
559 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
|
560 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
|
561 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
|
562 |
14 | 563 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
|
564 """import all plugins""" |
14 | 565 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
|
566 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
|
567 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
|
568 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
|
569 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
|
570 plugin_glob)))] |
61 | 571 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
572 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
|
573 # plugin with same import name |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
574 imported_names_transfer = set() |
14 | 575 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
|
576 plugin_path = 'cagou.plugins.' + plug |
86 | 577 |
578 # we get type from plugin name | |
579 suff = plug[7:] | |
580 if u'_' not in suff: | |
581 log.error(u"invalid plugin name: {}, skipping".format(plug)) | |
582 continue | |
583 plugin_type = suff[:suff.find(u'_')] | |
584 | |
585 # and select the variable to use according to type | |
586 if plugin_type == C.PLUG_TYPE_WID: | |
587 imported_names = imported_names_main | |
588 default_factory = self._defaultFactoryMain | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
589 elif plugin_type == C.PLUG_TYPE_TRANSFER: |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
590 imported_names = imported_names_transfer |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
591 default_factory = self._defaultFactoryTransfer |
86 | 592 else: |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
593 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
|
594 .format( |
86 | 595 type_ = plugin_type, |
596 file_ = plug | |
597 )) | |
598 continue | |
599 plugins_set = self._getPluginsSet(plugin_type) | |
600 | |
15
56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
601 mod = import_module(plugin_path) |
14 | 602 try: |
603 plugin_info = mod.PLUGIN_INFO | |
604 except AttributeError: | |
605 plugin_info = {} | |
606 | |
86 | 607 plugin_info['plugin_file'] = plug |
608 plugin_info['plugin_type'] = plugin_type | |
609 | |
610 if 'platforms' in plugin_info: | |
611 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
|
612 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
|
613 .format(**plugin_info)) |
86 | 614 continue |
615 | |
14 | 616 # import name is used to differentiate plugins |
617 if 'import_name' not in plugin_info: | |
618 plugin_info['import_name'] = plug | |
86 | 619 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
|
620 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
|
621 u"ignoring new one").format(plugin_info['import_name'])) |
14 | 622 continue |
623 if plugin_info['import_name'] == C.WID_SELECTOR: | |
86 | 624 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
|
625 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
|
626 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
|
627 **plugin_info)) |
86 | 628 continue |
14 | 629 # if WidgetSelector exists, it will be our default widget |
630 self.default_wid = plugin_info | |
631 | |
632 # we want everything optional, so we use plugin file name | |
633 # if actual name is not found | |
634 if 'name' not in plugin_info: | |
86 | 635 name_start = 8 + len(plugin_type) |
636 plugin_info['name'] = plug[name_start:] | |
14 | 637 |
638 # we need to load the kv file | |
639 if 'kv_file' not in plugin_info: | |
640 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
|
641 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
|
642 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
|
643 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
|
644 else: |
d249df379fa3
core: kv files are not mandatory anymore for plugins
Goffi <goffi@goffi.org>
parents:
87
diff
changeset
|
645 Builder.load_file(kv_path) |
14 | 646 |
647 # what is the main class ? | |
648 main_cls = getattr(mod, plugin_info['main']) | |
649 plugin_info['main'] = main_cls | |
650 | |
651 # factory is used to create the instance | |
652 # if not found, we use a defaut one with getOrCreateWidget | |
653 if 'factory' not in plugin_info: | |
86 | 654 plugin_info['factory'] = default_factory |
14 | 655 |
25
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
656 # icons |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
657 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
|
658 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
|
659 try: |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
660 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
|
661 except KeyError: |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
662 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
|
663 else: |
d09bd16dbbe2
code (cagou widget), selector: icons handling + use of new muchoslava icon set
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
664 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
|
665 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
|
666 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
|
667 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
|
668 |
86 | 669 plugins_set.append(plugin_info) |
14 | 670 if not self._plg_wids: |
671 log.error(_(u"no widget plugin found")) | |
672 return | |
673 | |
674 # we want widgets sorted by names | |
675 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
|
676 self._plg_wids_transfer.sort(key=lambda p: p['name'].lower()) |
14 | 677 |
678 if self.default_wid is None: | |
679 # we have no selector widget, we use the first widget as default | |
680 self.default_wid = self._plg_wids[0] | |
681 | |
86 | 682 def _getPluginsSet(self, type_): |
683 if type_ == C.PLUG_TYPE_WID: | |
684 return self._plg_wids | |
97
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
685 elif type_ == C.PLUG_TYPE_TRANSFER: |
5d2289127bb7
menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents:
91
diff
changeset
|
686 return self._plg_wids_transfer |
86 | 687 else: |
688 raise KeyError(u"{} plugin type is unknown".format(type_)) | |
689 | |
690 def getPluggedWidgets(self, type_=C.PLUG_TYPE_WID, except_cls=None): | |
14 | 691 """get available widgets plugin infos |
692 | |
86 | 693 @param type_(unicode): type of widgets to get |
694 one of C.PLUG_TYPE_* constant | |
14 | 695 @param except_cls(None, class): if not None, |
696 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
|
697 @return (iter[dict]): available widgets plugin infos |
14 | 698 """ |
86 | 699 plugins_set = self._getPluginsSet(type_) |
700 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
|
701 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
|
702 continue |
c58b522607f4
main: fixed profiles value in _defaultFactory + getPluggedWidgets is now a generator
Goffi <goffi@goffi.org>
parents:
16
diff
changeset
|
703 yield plugin_data |
14 | 704 |
86 | 705 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
|
706 """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
|
707 |
86 | 708 @param type_(unicode): type of widgets to get |
709 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
|
710 @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
|
711 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
|
712 @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
|
713 """ |
86 | 714 plugins_set = self._getPluginsSet(type_) |
715 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
|
716 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
|
717 try: |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
718 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
|
719 continue |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
720 except KeyError: |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
721 continue |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
722 return plugin_info |
7cac2d1a6f20
core: new getPluginInfo method to retrieve plugin info corresponding to filter(s)
Goffi <goffi@goffi.org>
parents:
40
diff
changeset
|
723 |
29 | 724 ## widgets handling |
9 | 725 |
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
|
726 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
|
727 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
|
728 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
|
729 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
|
730 |
11
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
731 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
|
732 """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
|
733 |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
734 old(CagouWidgetn None): CagouWidget instance or a child |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
735 None to select automatically widget to switch |
11
49d30fc15884
core: added switchWidget method, to change a CagouWidget for an other one
Goffi <goffi@goffi.org>
parents:
9
diff
changeset
|
736 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
|
737 """ |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
738 if old is None: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
739 old = self.getWidgetToSwitch() |
14 | 740 to_change = None |
741 if isinstance(old, CagouWidget): | |
742 to_change = old | |
743 else: | |
744 for w in old.walk_reverse(): | |
745 if isinstance(w, CagouWidget): | |
746 to_change = w | |
747 break | |
748 | |
749 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
|
750 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
|
751 u"trying to switch widget") |
154 | 752 |
753 wrapper = to_change.parent | |
754 while wrapper is not None and not(isinstance(wrapper, widgets_handler.WHWrapper)): | |
755 wrapper = wrapper.parent | |
756 | |
757 if wrapper is None: | |
758 raise exceptions.InternalError(u"no wrapper found") | |
759 | |
760 wrapper.changeWidget(new) | |
249
5d69e4cab925
core: when switching to a new widget, it becomes the selected one.
Goffi <goffi@goffi.org>
parents:
248
diff
changeset
|
761 self.selected_widget = new |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
762 |
248
b6e33b35538b
core, widgets handler: visible_widgets now keep all CagouWidgets, not only QuickWidgets. visible_quick_widgets can be used if only QuickWidgets are desired.
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
763 def _addVisibleWidget(self, widget): |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
764 """declare a widget visible |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
765 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
766 for internal use only! |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
767 """ |
248
b6e33b35538b
core, widgets handler: visible_widgets now keep all CagouWidgets, not only QuickWidgets. visible_quick_widgets can be used if only QuickWidgets are desired.
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
768 assert isinstance(widget, CagouWidget) |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
769 self._visible_widgets.setdefault(widget.__class__, []).append(widget) |
264
3e11b5d923e2
core: call new methods onVisible and onNotVisible when a widget is displayed or hidden + fixed a deletion bug on _removeVisibleWidget
Goffi <goffi@goffi.org>
parents:
262
diff
changeset
|
770 widget.onVisible() |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
771 |
248
b6e33b35538b
core, widgets handler: visible_widgets now keep all CagouWidgets, not only QuickWidgets. visible_quick_widgets can be used if only QuickWidgets are desired.
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
772 def _removeVisibleWidget(self, widget): |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
773 """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
|
774 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
775 for internal use only! |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
776 """ |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
777 self._visible_widgets[widget.__class__].remove(widget) |
264
3e11b5d923e2
core: call new methods onVisible and onNotVisible when a widget is displayed or hidden + fixed a deletion bug on _removeVisibleWidget
Goffi <goffi@goffi.org>
parents:
262
diff
changeset
|
778 if isinstance(widget, CagouWidget): |
3e11b5d923e2
core: call new methods onVisible and onNotVisible when a widget is displayed or hidden + fixed a deletion bug on _removeVisibleWidget
Goffi <goffi@goffi.org>
parents:
262
diff
changeset
|
779 widget.onNotVisible() |
3e11b5d923e2
core: call new methods onVisible and onNotVisible when a widget is displayed or hidden + fixed a deletion bug on _removeVisibleWidget
Goffi <goffi@goffi.org>
parents:
262
diff
changeset
|
780 if isinstance(widget, quick_widgets.QuickWidget): |
248
b6e33b35538b
core, widgets handler: visible_widgets now keep all CagouWidgets, not only QuickWidgets. visible_quick_widgets can be used if only QuickWidgets are desired.
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
781 self.widgets.deleteWidget(widget) |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
782 |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
783 def getVisibleList(self, cls): |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
784 """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
|
785 |
248
b6e33b35538b
core, widgets handler: visible_widgets now keep all CagouWidgets, not only QuickWidgets. visible_quick_widgets can be used if only QuickWidgets are desired.
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
786 @param cls(type): type of widgets to get |
b6e33b35538b
core, widgets handler: visible_widgets now keep all CagouWidgets, not only QuickWidgets. visible_quick_widgets can be used if only QuickWidgets are desired.
Goffi <goffi@goffi.org>
parents:
247
diff
changeset
|
787 @return (list[type]): visible widgets of this class |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
788 """ |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
789 try: |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
790 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
|
791 except KeyError: |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
792 return [] |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
793 |
260
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
794 def deleteUnusedWidgetInstances(self, widget): |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
795 """Delete instance of this widget without parent |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
796 |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
797 @param widget(quick_widgets.QuickWidget): reference widget |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
798 other instance of this widget will be deleted if they have no parent |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
799 """ |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
800 # FIXME: unused for now |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
801 to_delete = [] |
267
896f78760b63
core: fixed crash when calling deleteUnusedWidgetInstances on widgets not inheriting from QuickWidget
Goffi <goffi@goffi.org>
parents:
266
diff
changeset
|
802 if isinstance(widget, quick_widgets.QuickWidget): |
896f78760b63
core: fixed crash when calling deleteUnusedWidgetInstances on widgets not inheriting from QuickWidget
Goffi <goffi@goffi.org>
parents:
266
diff
changeset
|
803 for w in self.widgets.getWidgetInstances(widget): |
896f78760b63
core: fixed crash when calling deleteUnusedWidgetInstances on widgets not inheriting from QuickWidget
Goffi <goffi@goffi.org>
parents:
266
diff
changeset
|
804 if w.parent is None and w != widget: |
896f78760b63
core: fixed crash when calling deleteUnusedWidgetInstances on widgets not inheriting from QuickWidget
Goffi <goffi@goffi.org>
parents:
266
diff
changeset
|
805 to_delete.append(w) |
896f78760b63
core: fixed crash when calling deleteUnusedWidgetInstances on widgets not inheriting from QuickWidget
Goffi <goffi@goffi.org>
parents:
266
diff
changeset
|
806 for w in to_delete: |
896f78760b63
core: fixed crash when calling deleteUnusedWidgetInstances on widgets not inheriting from QuickWidget
Goffi <goffi@goffi.org>
parents:
266
diff
changeset
|
807 log.debug(u"cleaning widget: {wid}".format(wid=w)) |
896f78760b63
core: fixed crash when calling deleteUnusedWidgetInstances on widgets not inheriting from QuickWidget
Goffi <goffi@goffi.org>
parents:
266
diff
changeset
|
808 self.widgets.deleteWidget(w) |
260
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
809 |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
810 def getOrClone(self, widget): |
260
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
811 """Get a QuickWidget if it has not parent set else clone it |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
812 |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
813 if an other instance of this widget exist without parent, it will be used. |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
814 """ |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
815 if widget.parent is None: |
260
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
816 self.deleteUnusedWidgetInstances(widget) |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
817 return widget |
260
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
818 for w in self.widgets.getWidgetInstances(widget): |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
819 if w.parent is None: |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
820 self.deleteUnusedWidgetInstances(w) |
145c29b5f2b5
core: improved getOrClone + use in chat and widgets_handler:
Goffi <goffi@goffi.org>
parents:
259
diff
changeset
|
821 return w |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
822 targets = list(widget.targets) |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
823 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
|
824 targets[0], |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
825 on_new_widget=None, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
826 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
|
827 profiles=widget.profiles) |
38
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
828 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
|
829 w.addTarget(t) |
9f45098289cc
widgets handler, core: hidden widgets can now be shown with swipes:
Goffi <goffi@goffi.org>
parents:
34
diff
changeset
|
830 return w |
29 | 831 |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
832 def getWidgetToSwitch(self): |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
833 """Choose best candidate when we need to switch widget and old is not specified |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
834 |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
835 @return (CagouWidget): widget to switch |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
836 """ |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
837 if self.selected_widget is not None: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
838 return self.selected_widget |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
839 # no widget is selected we check if we have any default widget |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
840 default_cls = self.default_wid['main'] |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
841 for w in self.visible_widgets: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
842 if isinstance(w, default_cls): |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
843 return w |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
844 |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
845 # no default widget found, we return the first widget |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
846 return next(iter(self.visible_widgets)) |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
847 |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
848 def doAction(self, action, target, profiles): |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
849 """Launch an action handler by a plugin |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
850 |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
851 @param action(unicode): action to do, can be: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
852 - chat: open a chat widget |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
853 @param target(unicode): target of the action |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
854 @param profiles(list[unicode]): profiles to use |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
855 """ |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
856 try: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
857 # FIXME: Q&D way to get chat plugin, should be replaced by a clean method |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
858 # in host |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
859 plg_infos = [p for p in self.getPluggedWidgets() |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
860 if action in p['import_name']][0] |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
861 except IndexError: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
862 log.warning(u"No plugin widget found to do {action}".format(action=action)) |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
863 else: |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
864 factory = plg_infos['factory'] |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
865 self.switchWidget(None, |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
866 factory(plg_infos, target=target, profiles=profiles)) |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
867 |
51 | 868 ## menus ## |
869 | |
112
d654bdfeb404
core: changes menu bridge call, to follow backend
Goffi <goffi@goffi.org>
parents:
97
diff
changeset
|
870 def _menusGetCb(self, backend_menus): |
85
c2a7234d13d2
menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents:
78
diff
changeset
|
871 main_menu = self.app.root.root_menus |
51 | 872 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
|
873 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
|
874 (_(u"Help"), _(u"About")), |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
875 callback=main_menu.onAbout) |
51 | 876 main_menu.update(C.MENU_GLOBAL) |
877 | |
122
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
878 ## bridge handlers ## |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
879 |
dcd6fbb3f010
chat: handle new OTR state signal and change encryption icon consequently
Goffi <goffi@goffi.org>
parents:
119
diff
changeset
|
880 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
|
881 """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
|
882 # 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
|
883 # 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
|
884 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
|
885 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
|
886 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
|
887 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
|
888 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
|
889 |
266
b3f97729e983
core (debug): added "visible_widgets_dump" action to new _debug signal
Goffi <goffi@goffi.org>
parents:
265
diff
changeset
|
890 def _debugHandler(self, action, parameters, profile): |
b3f97729e983
core (debug): added "visible_widgets_dump" action to new _debug signal
Goffi <goffi@goffi.org>
parents:
265
diff
changeset
|
891 if action == u"visible_widgets_dump": |
b3f97729e983
core (debug): added "visible_widgets_dump" action to new _debug signal
Goffi <goffi@goffi.org>
parents:
265
diff
changeset
|
892 from pprint import pformat |
b3f97729e983
core (debug): added "visible_widgets_dump" action to new _debug signal
Goffi <goffi@goffi.org>
parents:
265
diff
changeset
|
893 log.info(u"Visible widgets dump:\n{data}".format( |
b3f97729e983
core (debug): added "visible_widgets_dump" action to new _debug signal
Goffi <goffi@goffi.org>
parents:
265
diff
changeset
|
894 data=pformat(self._visible_widgets))) |
b3f97729e983
core (debug): added "visible_widgets_dump" action to new _debug signal
Goffi <goffi@goffi.org>
parents:
265
diff
changeset
|
895 else: |
b3f97729e983
core (debug): added "visible_widgets_dump" action to new _debug signal
Goffi <goffi@goffi.org>
parents:
265
diff
changeset
|
896 return super(Cagou, self)._debugHandler(action, parameters, profile) |
b3f97729e983
core (debug): added "visible_widgets_dump" action to new _debug signal
Goffi <goffi@goffi.org>
parents:
265
diff
changeset
|
897 |
29 | 898 ## misc ## |
899 | |
900 def plugging_profiles(self): | |
154 | 901 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
|
902 self.bridge.menusGet("", C.NO_SECURITY_LIMIT, callback=self._menusGetCb) |
29 | 903 |
904 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
|
905 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
|
906 status=status)) |
29 | 907 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
908 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
|
909 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
|
910 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
|
911 |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
912 def addNote(self, title, message, level=C.XMLUI_DATA_LVL_INFO, symbol=None, |
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
913 action=None): |
29 | 914 """add a note (message which disappear) to root widget's header""" |
250
ff1efdeff53f
core: notifs can now have a custom icon and be clickable:
Goffi <goffi@goffi.org>
parents:
249
diff
changeset
|
915 self.app.root.addNote(title, message, level, symbol, action) |
29 | 916 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
917 def addNotifUI(self, ui): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
918 """add a notification with a XMLUI attached |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
919 |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
920 @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
|
921 """ |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
922 self.app.root.addNotifUI(ui) |
29 | 923 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
924 def addNotifWidget(self, widget): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
925 """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
|
926 |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
927 @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
|
928 """ |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
929 self.app.root.addNotifWidget(widget) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
930 |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
931 def showUI(self, ui): |
78 | 932 """show a XMLUI""" |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
933 self.app.root.changeWidget(ui, "xmlui") |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
934 self.app.root.show("xmlui") |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
935 |
78 | 936 def showExtraUI(self, widget): |
937 """show any extra widget""" | |
938 self.app.root.changeWidget(widget, "extra") | |
939 self.app.root.show("extra") | |
940 | |
33
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
941 def closeUI(self): |
c21d1be2e54c
core: XMLUI notifications coming from backend are handled:
Goffi <goffi@goffi.org>
parents:
32
diff
changeset
|
942 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
|
943 |
7819e9efa250
chat: avatar and nick are now displayed, need further aesthetic improvments
Goffi <goffi@goffi.org>
parents:
43
diff
changeset
|
944 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
|
945 return self.app.default_avatar |
61 | 946 |
220
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
947 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
|
948 """generic dialog callback |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
949 |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
950 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
|
951 """ |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
952 def callback(): |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
953 self.closeUI() |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
954 cb(*args, **kwargs) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
955 return callback |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
956 |
61 | 957 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
|
958 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
|
959 self.addNote(title, message, type) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
960 elif type == "yes/no": |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
961 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
|
962 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
|
963 True, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
964 answer_data), |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
965 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
|
966 False, |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
967 answer_data) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
968 ) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
969 self.addNotifWidget(wid) |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
970 else: |
24f8ab7c08be
core: implemented showDialog so message/dialogs from QuickFrontend are displayed
Goffi <goffi@goffi.org>
parents:
208
diff
changeset
|
971 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
|
972 |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
973 |
c63922860f80
chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
974 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
|
975 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
|
976 try: |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
977 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
|
978 message=message, |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
979 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
|
980 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
|
981 timeout = duration) |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
982 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
|
983 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
|
984 msg = e)) |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
985 global notification |
ab523cc967bb
core(notification): display a warning and disable notifications if something is going wrong
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
986 notification = None |