Mercurial > libervia-desktop-kivy
diff src/cagou/core/profile_manager.py @ 15:56838ad5c84b
files reorganisation, cagou is now launched with python2 cagou.py in src/
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 09 Jul 2016 17:24:01 +0200 |
parents | src/profile_manager.py@33b619506832 |
children | ba14b596b90e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cagou/core/profile_manager.py Sat Jul 09 17:24:01 2016 +0200 @@ -0,0 +1,173 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Cagou: desktop/mobile frontend for Salut à Toi XMPP client +# Copyright (C) 2016 Jérôme Poisson (goffi@goffi.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +from sat.core import log as logging +log = logging.getLogger(__name__) +from sat_frontends.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.screenmanager import ScreenManager, Screen +from kivy.adapters import listadapter +from kivy import properties + + +class ProfileItem(listview.ListItemButton): + pass + + +class ProfileListAdapter(listadapter.ListAdapter): + + def __init__(self, pm, *args, **kwargs): + super(ProfileListAdapter, self).__init__(*args, **kwargs) + self.pm = pm + self.host = pm.host + + 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) + self.host.actionManager(data, callback=authenticate_cb, ui_show_cb=self.showUI, profile=profile) + + self.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 NewProfileScreen(Screen): + profile_name = properties.ObjectProperty(None) + jid = properties.ObjectProperty(None) + password = properties.ObjectProperty(None) + error_msg = properties.StringProperty('') + + def __init__(self, pm): + super(NewProfileScreen, self).__init__(name=u'new_profile') + self.pm = pm + self.host = pm.host + + def onCreationFailure(self, failure): + msg = [l for l in unicode(failure).split('\n') if l][-1] + self.error_msg = unicode(msg) + + def onCreationSuccess(self, profile): + self.pm.profiles_screen.reload() + self.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() + self.host.bridge.setParam("JabberID", jid, "Connection", -1, profile) + self.host.bridge.setParam("Password", self.password.text, "Connection", -1, profile) + self.pm.screen_manager.transition.direction = 'right' + self.pm.screen_manager.current = 'profiles' + + def doCreate(self): + 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 + self.host.bridge.asyncCreateProfile(name, self.password.text, callback=lambda: self.onCreationSuccess(name), errback=self.onCreationFailure) + + +class DeleteProfilesScreen(Screen): + + def __init__(self, pm): + self.pm = pm + self.host = pm.host + super(DeleteProfilesScreen, self).__init__(name=u'delete_profiles') + + def doDelete(self): + """This method will delete *ALL* selected profiles""" + to_delete = self.pm.getProfiles() + deleted = [0] + + def deleteInc(): + deleted[0] += 1 + if deleted[0] == len(to_delete): + self.pm.profiles_screen.reload() + self.pm.screen_manager.transition.direction = 'right' + self.pm.screen_manager.current = 'profiles' + + for profile in to_delete: + log.info(u"Deleteing profile [{}]".format(profile)) + self.host.bridge.asyncDeleteProfile(profile, callback=deleteInc, errback=deleteInc) + + +class ProfilesScreen(Screen): + layout = properties.ObjectProperty(None) + + def __init__(self, pm): + self.pm = pm + profiles = pm.host.bridge.getProfilesList() + profiles.sort() + self.list_adapter = ProfileListAdapter(pm, + data=profiles, + cls=ProfileItem, + 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) + + def reload(self): + """Reload profiles list""" + profiles = self.pm.host.bridge.getProfilesList() + profiles.sort() + self.list_adapter.data = profiles + + +class ProfileManager(QuickProfileManager, BoxLayout): + + def __init__(self, host, autoconnect=None): + QuickProfileManager.__init__(self, host, autoconnect) + BoxLayout.__init__(self, orientation="vertical") + self.screen_manager = ScreenManager() + self.profiles_screen = ProfilesScreen(self) + self.new_profile_screen = NewProfileScreen(self) + self.delete_profiles_screen = DeleteProfilesScreen(self) + self.xmlui_screen = Screen(name=u'xmlui') + self.screen_manager.add_widget(self.profiles_screen) + self.screen_manager.add_widget(self.xmlui_screen) + self.screen_manager.add_widget(self.new_profile_screen) + self.screen_manager.add_widget(self.delete_profiles_screen) + self.add_widget(self.screen_manager) + + def getProfiles(self): + return [pi.text for pi in self.profiles_screen.list_adapter.selection]