comparison libervia/desktop_kivy/core/profile_manager.py @ 493:b3cedbee561d

refactoring: rename `cagou` to `libervia.desktop_kivy` + update imports and names following backend changes
author Goffi <goffi@goffi.org>
date Fri, 02 Jun 2023 18:26:16 +0200
parents cagou/core/profile_manager.py@203755bbe0fe
children
comparison
equal deleted inserted replaced
492:5114bbb5daa3 493:b3cedbee561d
1 #!/usr/bin/env python3
2
3
4 #Libervia Desktop-Kivy
5 # Copyright (C) 2016-2021 Jérôme Poisson (goffi@goffi.org)
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
21 from libervia.backend.core import log as logging
22 log = logging.getLogger(__name__)
23 from .constants import Const as C
24 from libervia.frontends.quick_frontend.quick_profile_manager import QuickProfileManager
25 from kivy.uix.boxlayout import BoxLayout
26 from kivy.uix.togglebutton import ToggleButton
27 from kivy.uix.screenmanager import ScreenManager, Screen
28 from kivy.metrics import sp
29 from kivy import properties
30 from libervia.desktop_kivy import G
31
32
33 class ProfileItem(ToggleButton):
34 ps = properties.ObjectProperty()
35 index = properties.NumericProperty(0)
36
37
38 class NewProfileScreen(Screen):
39 profile_name = properties.ObjectProperty(None)
40 jid = properties.ObjectProperty(None)
41 password = properties.ObjectProperty(None)
42 error_msg = properties.StringProperty('')
43
44 def __init__(self, pm):
45 super(NewProfileScreen, self).__init__(name='new_profile')
46 self.pm = pm
47
48 def on_creation_failure(self, failure):
49 msg = [l for l in str(failure).split('\n') if l][-1]
50 self.error_msg = str(msg)
51
52 def on_creation_success(self, profile):
53 self.pm.profiles_screen.reload()
54 G.host.bridge.profile_start_session(
55 self.password.text, profile,
56 callback=lambda __: self._session_started(profile),
57 errback=self.on_creation_failure)
58
59 def _session_started(self, profile):
60 jid = self.jid.text.strip()
61 G.host.bridge.param_set("JabberID", jid, "Connection", -1, profile)
62 G.host.bridge.param_set("Password", self.password.text, "Connection", -1, profile)
63 self.pm.screen_manager.transition.direction = 'right'
64 self.pm.screen_manager.current = 'profiles'
65
66 def doCreate(self):
67 name = self.profile_name.text.strip()
68 # XXX: we use XMPP password for profile password to simplify
69 # if user want to change profile password, he can do it in preferences
70 G.host.bridge.profile_create(
71 name, self.password.text, '',
72 callback=lambda: self.on_creation_success(name),
73 errback=self.on_creation_failure)
74
75
76 class DeleteProfilesScreen(Screen):
77
78 def __init__(self, pm):
79 self.pm = pm
80 super(DeleteProfilesScreen, self).__init__(name='delete_profiles')
81
82 def do_delete(self):
83 """This method will delete *ALL* selected profiles"""
84 to_delete = self.pm.get_profiles()
85 deleted = [0]
86
87 def delete_inc():
88 deleted[0] += 1
89 if deleted[0] == len(to_delete):
90 self.pm.profiles_screen.reload()
91 self.pm.screen_manager.transition.direction = 'right'
92 self.pm.screen_manager.current = 'profiles'
93
94 for profile in to_delete:
95 log.info("Deleteing profile [{}]".format(profile))
96 G.host.bridge.profile_delete_async(
97 profile, callback=delete_inc, errback=delete_inc)
98
99
100 class ProfilesScreen(Screen):
101 layout = properties.ObjectProperty(None)
102 profiles = properties.ListProperty()
103
104 def __init__(self, pm):
105 self.pm = pm
106 super(ProfilesScreen, self).__init__(name='profiles')
107 self.reload()
108
109 def _profiles_list_get_cb(self, profiles):
110 profiles.sort()
111 self.profiles = profiles
112 for idx, profile in enumerate(profiles):
113 item = ProfileItem(ps=self, index=idx, text=profile, group='profiles')
114 self.layout.add_widget(item)
115
116 def converter(self, row_idx, obj):
117 return {'text': obj,
118 'size_hint_y': None,
119 'height': sp(40)}
120
121 def reload(self):
122 """Reload profiles list"""
123 self.layout.clear_widgets()
124 G.host.bridge.profiles_list_get(callback=self._profiles_list_get_cb)
125
126
127 class ProfileManager(QuickProfileManager, BoxLayout):
128 selected = properties.ObjectProperty(None)
129
130 def __init__(self, autoconnect=None):
131 QuickProfileManager.__init__(self, G.host, autoconnect)
132 BoxLayout.__init__(self, orientation="vertical")
133 self.screen_manager = ScreenManager()
134 self.profiles_screen = ProfilesScreen(self)
135 self.new_profile_screen = NewProfileScreen(self)
136 self.delete_profiles_screen = DeleteProfilesScreen(self)
137 self.xmlui_screen = Screen(name='xmlui')
138 self.screen_manager.add_widget(self.profiles_screen)
139 self.screen_manager.add_widget(self.xmlui_screen)
140 self.screen_manager.add_widget(self.new_profile_screen)
141 self.screen_manager.add_widget(self.delete_profiles_screen)
142 self.add_widget(self.screen_manager)
143
144 def close_ui(self, xmlui, reason=None):
145 self.screen_manager.transition.direction = 'right'
146 self.screen_manager.current = 'profiles'
147
148 def show_ui(self, xmlui):
149 xmlui.set_close_cb(self.close_ui)
150 if xmlui.type == 'popup':
151 xmlui.bind(on_touch_up=lambda obj, value: self.close_ui(xmlui))
152 self.xmlui_screen.clear_widgets()
153 self.xmlui_screen.add_widget(xmlui)
154 self.screen_manager.transition.direction = 'left'
155 self.screen_manager.current = 'xmlui'
156
157 def select_profile(self, profile_item):
158 if not profile_item.selected:
159 return
160 def authenticate_cb(data, cb_id, profile):
161 if not C.bool(data.pop('validated', C.BOOL_FALSE)):
162 # profile didn't validate, we unselect it
163 profile_item.state = 'normal'
164 self.selected = ''
165 else:
166 # state may have been modified so we need to be sure it's down
167 profile_item.state = 'down'
168 self.selected = profile_item
169 G.host.action_manager(data, callback=authenticate_cb, ui_show_cb=self.show_ui,
170 profile=profile)
171
172 G.host.action_launch(C.AUTHENTICATE_PROFILE_ID, callback=authenticate_cb,
173 profile=profile_item.text)
174
175 def get_profiles(self):
176 # for now we restrict to a single profile in LiberviaDesktopKivy
177 # TODO: handle multi-profiles
178 return [self.selected.text] if self.selected else []