annotate cagou/core/menu.py @ 265:805c4103dac5

core: resync widgets only when they are visible: using AUTO_RESYNC from QuickApp was causing performance trouble (resynchronising all widgets was freezing the frontend for a little while). By resynchronising only when the widget is visible, this should be greatly improved.
author Goffi <goffi@goffi.org>
date Mon, 11 Mar 2019 08:39:43 +0100
parents 15e47bbb192c
children 1b835bcfa663
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/python
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
3
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # Cagou: desktop/mobile frontend for Salut à Toi XMPP client
126
cd99f70ea592 global file reorganisation:
Goffi <goffi@goffi.org>
parents: 98
diff changeset
5 # Copyright (C) 2016-2018 Jérôme Poisson (goffi@goffi.org)
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
11
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
16
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
19
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 from sat.core.i18n import _
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from sat.core import log as logging
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 log = logging.getLogger(__name__)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from cagou.core.constants import Const as C
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
25 from cagou.core.common import JidToggle
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
26 from kivy.uix.boxlayout import BoxLayout
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from kivy.uix.label import Label
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from kivy.uix.popup import Popup
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
29 from cagou.core.utils import FilterBehavior
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from kivy import properties
222
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
31 from kivy.garden import contextmenu, modernmenu
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 from sat_frontends.quick_frontend import quick_menus
168
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
33 from kivy.core.window import Window
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
34 from kivy.animation import Animation
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
35 from kivy.metrics import dp
222
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
36 from kivy.clock import Clock
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 from cagou import G
222
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
38 from functools import partial
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 import webbrowser
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
40
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 ABOUT_TITLE = _(u"About {}".format(C.APP_NAME))
184
c63922860f80 chat: show desktop notification and/or note when suitable
Goffi <goffi@goffi.org>
parents: 173
diff changeset
42 ABOUT_CONTENT = _(u"""Cagou (Salut à Toi) v{version}
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
43
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 Cagou is a libre communication tool based on libre standard XMPP.
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
45
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 Cagou is part of the "Salut à Toi" project
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 more informations at [color=5500ff][ref=website]salut-a-toi.org[/ref][/color]
246
15e47bbb192c about: show full version of SàT
Goffi <goffi@goffi.org>
parents: 222
diff changeset
48 """)
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
49
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
50
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 class AboutContent(Label):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
52
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 def on_ref_press(self, value):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 if value == "website":
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 webbrowser.open("https://salut-a-toi.org")
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
56
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
57
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 class AboutPopup(Popup):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
59
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 def on_touch_down(self, touch):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
61 if self.collide_point(*touch.pos):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 self.dismiss()
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 return super(AboutPopup, self).on_touch_down(touch)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
64
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
65
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
66 class MainMenu(contextmenu.AppMenu):
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
67 pass
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
68
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
69
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
70 class MenuItem(contextmenu.ContextMenuTextItem):
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 item = properties.ObjectProperty()
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
72
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
73 def on_item(self, instance, item):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 self.text = item.name
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
75
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 def on_release(self):
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
77 super(MenuItem, self).on_release()
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
78 self.parent.hide()
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
79 selected = G.host.selected_widget
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 profile = None
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 if selected is not None:
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 try:
222
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
83 # FIXME: handle multi-profiles
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
84 profile = next(iter(selected.profiles))
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 except AttributeError:
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
86 pass
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
87
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 if profile is None:
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
89 try:
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
90 profile = list(selected.profiles)[0]
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
91 except (AttributeError, IndexError):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
92 try:
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
93 profile = list(G.host.profiles)[0]
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 except IndexError:
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
95 log.warning(u"Can't find profile")
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
96 self.item.call(selected, profile)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
97
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
98
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
99 class MenuSeparator(contextmenu.ContextMenuDivider):
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
100 pass
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
101
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
102
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
103 class RootMenuContainer(contextmenu.AppMenuTextItem):
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
104 pass
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
105
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
106
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
107 class MenuContainer(contextmenu.ContextMenuTextItem):
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
108 pass
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
109
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
110
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
111 class MenusWidget(BoxLayout):
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
112
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
113 def update(self, type_, caller=None):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 """Method to call when menus have changed
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
115
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 @param type_(unicode): menu type like in sat.core.sat_main.importMenu
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
117 @param caller(Widget): instance linked to the menus
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 """
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 self.menus_container = G.host.menus.getMainContainer(type_)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 self.createMenus(caller)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
121
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 def _buildMenus(self, container, caller=None):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 """Recursively build menus of the container
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
124
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 @param container(quick_menus.MenuContainer): menu container
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 @param caller(Widget): instance linked to the menus
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 """
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
128 if caller is None:
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
129 main_menu = MainMenu()
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
130 self.add_widget(main_menu)
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
131 caller = main_menu
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
132 else:
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
133 context_menu = contextmenu.ContextMenu()
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
134 caller.add_widget(context_menu)
222
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
135 # FIXME: next line is needed after parent is set to avoid
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
136 # a display bug in contextmenu
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
137 # TODO: fix this upstream
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
138 context_menu._on_visible(False)
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
139
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
140 caller = context_menu
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
141
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 for child in container.getActiveMenus():
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
143 if isinstance(child, quick_menus.MenuContainer):
85
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
144 if isinstance(caller, MainMenu):
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
145 menu_container = RootMenuContainer()
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
146 else:
c2a7234d13d2 menu: use of garden's contextmenu for menus
Goffi <goffi@goffi.org>
parents: 53
diff changeset
147 menu_container = MenuContainer()
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 menu_container.text = child.name
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 caller.add_widget(menu_container)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 self._buildMenus(child, caller=menu_container)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 elif isinstance(child, quick_menus.MenuSeparator):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 wid = MenuSeparator()
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 caller.add_widget(wid)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 elif isinstance(child, quick_menus.MenuItem):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 wid = MenuItem(item=child)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 caller.add_widget(wid)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 else:
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 log.error(u"Unknown child type: {}".format(child))
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
159
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 def createMenus(self, caller):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 self.clear_widgets()
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
162 self._buildMenus(self.menus_container, caller)
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
163
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
164 def onAbout(self):
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 about = AboutPopup()
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 about.title = ABOUT_TITLE
246
15e47bbb192c about: show full version of SàT
Goffi <goffi@goffi.org>
parents: 222
diff changeset
167 about.content = AboutContent(text=ABOUT_CONTENT.format(version=G.host.version),
15e47bbb192c about: show full version of SàT
Goffi <goffi@goffi.org>
parents: 222
diff changeset
168 markup=True)
51
3f8599d9a766 core: menus first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
169 about.open()
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
170
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
171
97
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
172 class TransferItem(BoxLayout):
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
173 plug_info = properties.DictProperty()
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
174
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
175 def on_touch_up(self, touch):
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
176 if not self.collide_point(*touch.pos):
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
177 return super(TransferItem, self).on_touch_up(touch)
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
178 else:
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
179 transfer_menu = self.parent
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
180 while not isinstance(transfer_menu, TransferMenu):
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
181 transfer_menu = transfer_menu.parent
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
182 transfer_menu.do_callback(self.plug_info)
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
183 return True
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
184
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
185
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
186 class SideMenu(BoxLayout):
216
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
187 size_hint_close = (0, 1)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
188 size_hint_open = (0.4, 1)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
189 size_close = (100, 100)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
190 size_open = (0, 0)
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
191 bg_color = properties.ListProperty([0, 0, 0, 1])
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
192 # callback will be called with arguments relevant to menu
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
193 callback = properties.ObjectProperty()
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
194 # call do_callback even when menu is cancelled
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
195 callback_on_close = properties.BooleanProperty(False)
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
196 # cancel callback need to remove the widget for UI
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
197 # will be called with the widget to remove as argument
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
198 cancel_cb = properties.ObjectProperty()
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
199
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
200 def __init__(self, **kwargs):
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
201 super(SideMenu, self).__init__(**kwargs)
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
202 if self.cancel_cb is None:
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
203 self.cancel_cb = self.onMenuCancelled
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
204
216
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
205 def _set_anim_kw(self, kw, size_hint, size):
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
206 """Set animation keywords
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
207
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
208 for each value of size_hint it is used if not None,
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
209 else size is used.
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
210 If one value of size is bigger than the respective one of Window
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
211 the one of Window is used
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
212 """
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
213 size_hint_x, size_hint_y = size_hint
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
214 width, height = size
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
215 if size_hint_x is not None:
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
216 kw['size_hint_x'] = size_hint_x
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
217 elif width is not None:
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
218 kw['width'] = min(width, Window.width)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
219
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
220 if size_hint_y is not None:
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
221 kw['size_hint_y'] = size_hint_y
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
222 elif height is not None:
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
223 kw['height'] = min(height, Window.height)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
224
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
225 def show(self, caller_wid=None):
168
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
226 Window.bind(on_keyboard=self.key_input)
97
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
227 G.host.app.root.add_widget(self)
216
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
228 kw = {'d': 0.3, 't': 'out_back'}
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
229 self._set_anim_kw(kw, self.size_hint_open, self.size_open)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
230 Animation(**kw).start(self)
168
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
231
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
232 def hide(self):
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
233 Window.unbind(on_keyboard=self.key_input)
216
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
234 kw = {'d': 0.2}
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
235 self._set_anim_kw(kw, self.size_hint_close, self.size_close)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
236 anim = Animation(**kw)
168
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
237 anim.bind(on_complete=lambda anim, menu: self.parent.remove_widget(self))
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
238 anim.start(self)
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
239 if self.callback_on_close:
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
240 self.do_callback()
97
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
241
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
242 def on_touch_down(self, touch):
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
243 # we remove the menu if we click outside
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
244 # else we want to handle the event, but not
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
245 # transmit it to parents
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
246 if not self.collide_point(*touch.pos):
168
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
247 self.hide()
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
248 else:
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
249 return super(SideMenu, self).on_touch_down(touch)
97
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
250 return True
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
251
168
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
252 def key_input(self, window, key, scancode, codepoint, modifier):
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
253 if key == 27:
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
254 self.hide()
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
255 return True
397f2fb67aab core (menu): animate transfer menu opening/closing + close it on [ESC]/back
Goffi <goffi@goffi.org>
parents: 126
diff changeset
256
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
257 def onMenuCancelled(self, wid, cleaning_cb=None):
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
258 self._closeUI(wid)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
259 if cleaning_cb is not None:
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
260 cleaning_cb()
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
261
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
262 def _closeUI(self, wid):
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
263 G.host.closeUI()
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
264
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
265 def do_callback(self, *args, **kwargs):
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
266 log.warning(u"callback not implemented")
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
267
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
268
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
269 class TransferMenu(SideMenu):
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
270 """transfer menu which handle display and callbacks"""
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
271 # callback will be called with path to file to transfer
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
272 # profiles if set will be sent to transfer widget, may be used to get specific files
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
273 profiles = properties.ObjectProperty()
222
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
274 transfer_txt = _(u"Beware! The file will be sent to your server and stay unencrypted "
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
275 u"there\nServer admin(s) can see the file, and they choose how, "
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
276 u"when and if it will be deleted")
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
277 send_txt = _(u"The file will be sent unencrypted directly to your contact "
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
278 u"(without transiting by the server), except in some cases")
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
279 items_layout = properties.ObjectProperty()
216
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
280 size_hint_close = (1, 0)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
281 size_hint_open = (1, 0.5)
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
282
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
283 def __init__(self, **kwargs):
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
284 super(TransferMenu, self).__init__(**kwargs)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
285 if self.profiles is None:
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
286 self.profiles = iter(G.host.profiles)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
287 for plug_info in G.host.getPluggedWidgets(type_=C.PLUG_TYPE_TRANSFER):
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
288 item = TransferItem(
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
289 plug_info = plug_info
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
290 )
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
291 self.items_layout.add_widget(item)
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
292
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
293 def do_callback(self, plug_info):
97
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
294 self.parent.remove_widget(self)
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
295 if self.callback is None:
97
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
296 log.warning(u"TransferMenu callback is not set")
86
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
297 else:
c711be670ecd core, chat: upload plugin system:
Goffi <goffi@goffi.org>
parents: 85
diff changeset
298 wid = None
88
3dc526bb4a5a upload: plugin android gallery, first draft:
Goffi <goffi@goffi.org>
parents: 86
diff changeset
299 external = plug_info.get('external', False)
97
5d2289127bb7 menu (upload): better menu using dedicated widget:
Goffi <goffi@goffi.org>
parents: 88
diff changeset
300 def onTransferCb(file_path, cleaning_cb=None):
88
3dc526bb4a5a upload: plugin android gallery, first draft:
Goffi <goffi@goffi.org>
parents: 86
diff changeset
301 if not external:
3dc526bb4a5a upload: plugin android gallery, first draft:
Goffi <goffi@goffi.org>
parents: 86
diff changeset
302 self._closeUI(wid)
98
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
303 self.callback(
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
304 file_path,
4d8c122b86a6 menu (upload): send transfer (i.e. P2P transfer) is now working
Goffi <goffi@goffi.org>
parents: 97
diff changeset
305 cleaning_cb,
222
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
306 transfer_type = (C.TRANSFER_UPLOAD
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
307 if self.ids['upload_btn'].state == "down" else C.TRANSFER_SEND))
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
308 wid = plug_info['factory'](plug_info,
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
309 onTransferCb,
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
310 self.cancel_cb,
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
311 self.profiles)
88
3dc526bb4a5a upload: plugin android gallery, first draft:
Goffi <goffi@goffi.org>
parents: 86
diff changeset
312 if not external:
3dc526bb4a5a upload: plugin android gallery, first draft:
Goffi <goffi@goffi.org>
parents: 86
diff changeset
313 G.host.showExtraUI(wid)
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
314
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
315
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
316 class EntitiesSelectorMenu(SideMenu, FilterBehavior):
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
317 """allow to select entities from roster"""
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
318 profiles = properties.ObjectProperty()
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
319 layout = properties.ObjectProperty()
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
320 instructions = properties.StringProperty(_(u"Please select entities"))
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
321 filter_input = properties.ObjectProperty()
216
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
322 size_hint_close = (None, 1)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
323 size_hint_open = (None, 1)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
324 size_open = (dp(250), 100)
e42e0c45d384 core (menu): allow to specify size in SideMenu:
Goffi <goffi@goffi.org>
parents: 197
diff changeset
325 size_close = (0, 100)
197
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
326
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
327 def __init__(self, **kwargs):
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
328 super(EntitiesSelectorMenu, self).__init__(**kwargs)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
329 self.filter_input.bind(text=self.do_filter_input)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
330 if self.profiles is None:
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
331 self.profiles = iter(G.host.profiles)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
332 for profile in self.profiles:
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
333 for jid_, jid_data in G.host.contact_lists[profile].all_iter:
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
334 jid_wid = JidToggle(
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
335 jid=jid_,
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
336 profile=profile)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
337 self.layout.add_widget(jid_wid)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
338
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
339 def do_callback(self):
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
340 if self.callback is not None:
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
341 jids = [c.jid for c in self.layout.children if c.state == 'down']
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
342 self.callback(jids)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
343
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
344 def do_filter_input(self, filter_input, text):
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
345 self.layout.spacing = 0 if text else dp(5)
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
346 self.do_filter(self.layout.children,
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
347 text,
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
348 lambda c: c.jid,
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
349 width_cb=lambda c: c.width,
c7d15ef4bfa8 core (menu): new EntitiesSelectorMenu:
Goffi <goffi@goffi.org>
parents: 184
diff changeset
350 height_cb=lambda c: dp(70))
222
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
351
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
352
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
353 class TouchMenu(modernmenu.ModernMenu):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
354 pass
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
355
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
356
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
357 class TouchMenuItemBehaviour(object):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
358 """Class to use on every item where a menu may appear
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
359
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
360 main_wid attribute must be set to the class inheriting from TouchMenuBehaviour
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
361 do_item_action is the method called on simple click
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
362 getMenuChoices must return a list of menus for long press
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
363 menus there are dict as expected by ModernMenu
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
364 (translated text, index and callback)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
365 """
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
366 main_wid = properties.ObjectProperty()
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
367 click_timeout = properties.NumericProperty(0.4)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
368
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
369 def on_touch_down(self, touch):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
370 if not self.collide_point(*touch.pos):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
371 return
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
372 t = partial(self.open_menu, touch)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
373 touch.ud['menu_timeout'] = t
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
374 Clock.schedule_once(t, self.click_timeout)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
375 return super(TouchMenuItemBehaviour, self).on_touch_down(touch)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
376
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
377 def do_item_action(self, touch):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
378 pass
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
379
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
380 def on_touch_up(self, touch):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
381 if touch.ud.get('menu_timeout'):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
382 Clock.unschedule(touch.ud['menu_timeout'])
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
383 if self.collide_point(*touch.pos) and self.main_wid.menu is None:
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
384 self.do_item_action(touch)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
385 return super(TouchMenuItemBehaviour, self).on_touch_up(touch)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
386
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
387 def open_menu(self, touch, dt):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
388 self.main_wid.open_menu(self, touch)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
389 del touch.ud['menu_timeout']
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
390
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
391 def getMenuChoices(self):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
392 """return choice adapted to selected item
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
393
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
394 @return (list[dict]): choices ad expected by ModernMenu
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
395 """
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
396 return []
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
397
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
398
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
399 class TouchMenuBehaviour(object):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
400 """Class to handle a menu appearing on long press on items
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
401
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
402 classes using this behaviour need to have a float_layout property
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
403 pointing the main FloatLayout.
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
404 """
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
405 float_layout = properties.ObjectProperty()
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
406
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
407 def __init__(self, *args, **kwargs):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
408 super(TouchMenuBehaviour, self).__init__(*args, **kwargs)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
409 self.menu = None
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
410 self.menu_item = None
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
411
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
412 ## menu methods ##
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
413
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
414 def clean_fl_children(self, layout, children):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
415 """insure that self.menu and self.menu_item are None when menu is dimissed"""
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
416 if self.menu is not None and self.menu not in children:
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
417 self.menu = self.menu_item = None
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
418
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
419 def clear_menu(self):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
420 """remove menu if there is one"""
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
421 if self.menu is not None:
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
422 self.menu.dismiss()
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
423 self.menu = None
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
424 self.menu_item = None
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
425
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
426 def open_menu(self, item, touch):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
427 """open menu for item
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
428
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
429 @param item(PathWidget): item when the menu has been requested
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
430 @param touch(kivy.input.MotionEvent): touch data
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
431 """
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
432 if self.menu_item == item:
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
433 return
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
434 self.clear_menu()
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
435 pos = self.to_widget(*touch.pos)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
436 choices = item.getMenuChoices()
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
437 if not choices:
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
438 return
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
439 self.menu = TouchMenu(choices=choices,
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
440 center=pos,
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
441 size_hint=(None, None))
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
442 self.float_layout.add_widget(self.menu)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
443 self.menu.start_display(touch)
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
444 self.menu_item = item
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
445
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
446 def on_float_layout(self, wid, float_layout):
a676cb07c1cb core (menu): TouchMenuBehaviour:
Goffi <goffi@goffi.org>
parents: 216
diff changeset
447 float_layout.bind(children=self.clean_fl_children)