Mercurial > libervia-desktop-kivy
diff cagou/core/profile_manager.py @ 270:89ba66464329
profile manager: don't use anymore deprecated ListView + use dp() for sizes of buttons instead of relative size.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 20 Mar 2019 09:29:44 +0100 |
parents | b270fcc87304 |
children | 1b835bcfa663 |
line wrap: on
line diff
--- a/cagou/core/profile_manager.py Wed Mar 20 09:29:44 2019 +0100 +++ b/cagou/core/profile_manager.py Wed Mar 20 09:29:44 2019 +0100 @@ -23,53 +23,16 @@ from .constants import Const as C from sat_frontends.quick_frontend.quick_profile_manager import QuickProfileManager from kivy.uix.boxlayout import BoxLayout -from kivy.uix import listview -from kivy.uix.button import Button +from kivy.uix.togglebutton import ToggleButton from kivy.uix.screenmanager import ScreenManager, Screen -from kivy.adapters import listadapter from kivy.metrics import sp from kivy import properties from cagou import G -class ProfileItem(listview.ListItemButton): - pass - - -class ProfileListAdapter(listadapter.ListAdapter): - - def __init__(self, pm, *args, **kwargs): - super(ProfileListAdapter, self).__init__(*args, **kwargs) - self.pm = pm - - def closeUI(self, xmlui): - self.pm.screen_manager.transition.direction = 'right' - self.pm.screen_manager.current = 'profiles' - - def showUI(self, xmlui): - xmlui.setCloseCb(self.closeUI) - if xmlui.type == 'popup': - xmlui.bind(on_touch_up=lambda obj, value: self.closeUI(xmlui)) - self.pm.xmlui_screen.clear_widgets() - self.pm.xmlui_screen.add_widget(xmlui) - self.pm.screen_manager.transition.direction = 'left' - self.pm.screen_manager.current = 'xmlui' - - def select_item_view(self, view): - def authenticate_cb(data, cb_id, profile): - if C.bool(data.pop('validated', C.BOOL_FALSE)): - super(ProfileListAdapter, self).select_item_view(view) - G.host.actionManager(data, callback=authenticate_cb, ui_show_cb=self.showUI, profile=profile) - - G.host.launchAction(C.AUTHENTICATE_PROFILE_ID, callback=authenticate_cb, profile=view.text) - - -class ConnectButton(Button): - - def __init__(self, profile_screen): - self.profile_screen = profile_screen - self.pm = profile_screen.pm - super(ConnectButton, self).__init__() +class ProfileItem(ToggleButton): + ps = properties.ObjectProperty() + index = properties.NumericProperty(0) class NewProfileScreen(Screen): @@ -88,7 +51,10 @@ def onCreationSuccess(self, profile): self.pm.profiles_screen.reload() - G.host.bridge.profileStartSession(self.password.text, profile, callback=lambda dummy: self._sessionStarted(profile), errback=self.onCreationFailure) + G.host.bridge.profileStartSession( + self.password.text, profile, + callback=lambda dummy: self._sessionStarted(profile), + errback=self.onCreationFailure) def _sessionStarted(self, profile): jid = self.jid.text.strip() @@ -101,7 +67,10 @@ name = self.profile_name.text.strip() # XXX: we use XMPP password for profile password to simplify # if user want to change profile password, he can do it in preferences - G.host.bridge.profileCreate(name, self.password.text, u'', callback=lambda: self.onCreationSuccess(name), errback=self.onCreationFailure) + G.host.bridge.profileCreate( + name, self.password.text, u'', + callback=lambda: self.onCreationSuccess(name), + errback=self.onCreationFailure) class DeleteProfilesScreen(Screen): @@ -124,30 +93,25 @@ for profile in to_delete: log.info(u"Deleteing profile [{}]".format(profile)) - G.host.bridge.asyncDeleteProfile(profile, callback=deleteInc, errback=deleteInc) + G.host.bridge.asyncDeleteProfile( + profile, callback=deleteInc, errback=deleteInc) class ProfilesScreen(Screen): layout = properties.ObjectProperty(None) + profiles = properties.ListProperty() def __init__(self, pm): self.pm = pm - self.list_adapter = ProfileListAdapter(pm, - data=[], - cls=ProfileItem, - args_converter=self.converter, - selection_mode='multiple', - allow_empty_selection=True, - ) super(ProfilesScreen, self).__init__(name=u'profiles') - self.layout.add_widget(listview.ListView(adapter=self.list_adapter)) - connect_btn = ConnectButton(self) - self.layout.add_widget(connect_btn) self.reload() def _profilesListGetCb(self, profiles): profiles.sort() - self.list_adapter.data = profiles + self.profiles = profiles + for idx, profile in enumerate(profiles): + item = ProfileItem(ps=self, index=idx, text=profile, group='profiles') + self.layout.add_widget(item) def converter(self, row_idx, obj): return {'text': obj, @@ -156,10 +120,12 @@ def reload(self): """Reload profiles list""" + self.layout.clear_widgets() G.host.bridge.profilesListGet(callback=self._profilesListGetCb) class ProfileManager(QuickProfileManager, BoxLayout): + selected = properties.ObjectProperty(None) def __init__(self, autoconnect=None): QuickProfileManager.__init__(self, G.host, autoconnect) @@ -174,6 +140,40 @@ self.screen_manager.add_widget(self.new_profile_screen) self.screen_manager.add_widget(self.delete_profiles_screen) self.add_widget(self.screen_manager) + self.bind(selected=self.onProfileSelect) + + def closeUI(self, xmlui): + self.screen_manager.transition.direction = 'right' + self.screen_manager.current = 'profiles' + + def showUI(self, xmlui): + xmlui.setCloseCb(self.closeUI) + if xmlui.type == 'popup': + xmlui.bind(on_touch_up=lambda obj, value: self.closeUI(xmlui)) + self.xmlui_screen.clear_widgets() + self.xmlui_screen.add_widget(xmlui) + self.screen_manager.transition.direction = 'left' + self.screen_manager.current = 'xmlui' + + def onProfileSelect(self, __, selected): + if not selected: + return + def authenticate_cb(data, cb_id, profile): + if not C.bool(data.pop('validated', C.BOOL_FALSE)): + # profile didn't validate, we unselect it + selected.state = 'normal' + self.selected = '' + else: + # state may have been modified so we need to be sure it's down + selected.state = 'down' + self.selected = selected + G.host.actionManager(data, callback=authenticate_cb, ui_show_cb=self.showUI, + profile=profile) + + G.host.launchAction(C.AUTHENTICATE_PROFILE_ID, callback=authenticate_cb, + profile=selected.text) def getProfiles(self): - return [pi.text for pi in self.profiles_screen.list_adapter.selection] + # for now we restrict to a single profile in Cagou + # TODO: handle multi-profiles + return [self.selected.text] if self.selected else []