changeset 354:aa860c10acfc

chat: new chat selector: Using the new ScreenManager feature, a widget to select a chat to display is shown when a user opens the chat (except if an entity jid is specified, in which case it opens directly the Chat widget), or when user presses ESC. When on ChatSelector, pressing ESC brings to the root widget (i.e. default widget). The ChatSelect is a first draft, it is planned to show opened chats, rooms, and a way to create new chats.
author Goffi <goffi@goffi.org>
date Fri, 17 Jan 2020 18:44:35 +0100
parents 19422bbd9c8e
children 8b6621cc142c
files cagou/plugins/plugin_wid_chat.kv cagou/plugins/plugin_wid_chat.py
diffstat 2 files changed, 73 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/cagou/plugins/plugin_wid_chat.kv	Fri Jan 17 18:44:35 2020 +0100
+++ b/cagou/plugins/plugin_wid_chat.kv	Fri Jan 17 18:44:35 2020 +0100
@@ -22,6 +22,15 @@
 #:import ScrollEffect kivy.effects.scroll.ScrollEffect
 
 
+# Chat Selector
+
+<ChatSelector>:
+    JidSelector:
+        on_select: root.on_select(args[1])
+
+
+# Chat
+
 <MessAvatar>:
     size_hint: None, None
     size: dp(30), dp(30)
--- a/cagou/plugins/plugin_wid_chat.py	Fri Jan 17 18:44:35 2020 +0100
+++ b/cagou/plugins/plugin_wid_chat.py	Fri Jan 17 18:44:35 2020 +0100
@@ -22,6 +22,8 @@
 import sys
 from kivy.uix.boxlayout import BoxLayout
 from kivy.uix.textinput import TextInput
+from kivy.uix.screenmanager import Screen, NoTransition
+from kivy.uix import screenmanager
 from kivy.metrics import sp, dp
 from kivy.clock import Clock
 from kivy import properties
@@ -380,10 +382,12 @@
     message_input = properties.ObjectProperty()
     messages_widget = properties.ObjectProperty()
     history_scroll = properties.ObjectProperty()
+    global_screen_manager = True
     collection_carousel = True
 
     def __init__(self, host, target, type_=C.CHAT_ONE2ONE, nick=None, occupants=None,
                  subject=None, statuses=None, profiles=None):
+        self.show_chat_selector = False
         if statuses is None:
             statuses = {}
         quick_chat.QuickChat.__init__(
@@ -412,6 +416,18 @@
     def on_kv_post(self, __):
         self.postInit()
 
+    def screenManagerInit(self, screen_manager):
+        screen_manager.transition = screenmanager.SlideTransition(direction='down')
+        sel_screen = Screen(name='chat_selector')
+        chat_selector = ChatSelector(profile=self.profile)
+        sel_screen.add_widget(chat_selector)
+        screen_manager.add_widget(sel_screen)
+        if self.show_chat_selector:
+            transition = screen_manager.transition
+            screen_manager.transition = NoTransition()
+            screen_manager.current = 'chat_selector'
+            screen_manager.transition = transition
+
     def __str__(self):
         return "Chat({})".format(self.target)
 
@@ -424,15 +440,29 @@
         if len(profiles) > 1:
             raise NotImplementedError("Multi-profiles is not available yet for chat")
         if target is None:
+            show_chat_selector = True
             target = G.host.profiles[profiles[0]].whoami
-        return G.host.widgets.getOrCreateWidget(cls, target, on_new_widget=None,
-                                                on_existing_widget=G.host.getOrClone,
-                                                profiles=profiles)
+        else:
+            show_chat_selector = False
+        wid = G.host.widgets.getOrCreateWidget(cls, target, on_new_widget=None,
+                                               on_existing_widget=G.host.getOrClone,
+                                               profiles=profiles)
+        wid.show_chat_selector = show_chat_selector
+        return wid
 
     @property
     def message_widgets_rev(self):
         return self.messages_widget.children
 
+    ## keyboard ##
+    def key_input(self, window, key, scancode, codepoint, modifier):
+        if key == 27:
+            screen_manager = self.screen_manager
+            screen_manager.transition.direction = 'down'
+            screen_manager.current = 'chat_selector'
+            return True
+
+
     ## header ##
 
     def changeWidget(self, jid_):
@@ -836,5 +866,36 @@
             )
 
 
+class ChatSelector(cagou_widget.CagouWidget):
+    profile = properties.StringProperty()
+    plugin_info_class = Chat
+
+    def on_select(self, contact_button):
+        contact_jid = jid.JID(contact_button.jid)
+        plugin_info = G.host.getPluginInfo(main=Chat)
+        factory = plugin_info['factory']
+        self.screen_manager.transition.direction = 'up'
+        carousel = self.whwrapper.carousel
+        current_slides = {w.target: w for w in carousel.slides}
+        if contact_jid in current_slides:
+            slide = current_slides[contact_jid]
+            idx = carousel.slides.index(slide)
+            carousel.index = idx
+            self.screen_manager.current = ''
+        else:
+            G.host.switchWidget(
+                self, factory(plugin_info, contact_jid, profiles=[self.profile]))
+
+    @property
+    def profiles(self):
+        return [self.profile]
+
+    def key_input(self, window, key, scancode, codepoint, modifier):
+        if key == 27:
+            # we go back to root screen
+            G.host.switchWidget(self)
+            return True
+
+
 PLUGIN_INFO["factory"] = Chat.factory
 quick_widgets.register(quick_chat.QuickChat, Chat)