changeset 237:059c5b39032d

plugin file sharing: moved common discovery widgets to new core.common_widgets module
author Goffi <goffi@goffi.org>
date Fri, 31 Aug 2018 16:59:38 +0200
parents ca86954b3788
children 7918a5668304
files cagou/core/common.py cagou/core/common_widgets.py cagou/kv/common_widgets.kv cagou/plugins/plugin_wid_file_sharing.kv cagou/plugins/plugin_wid_file_sharing.py
diffstat 5 files changed, 154 insertions(+), 101 deletions(-) [+]
line wrap: on
line diff
--- a/cagou/core/common.py	Fri Aug 31 16:58:15 2018 +0200
+++ b/cagou/core/common.py	Fri Aug 31 16:59:38 2018 +0200
@@ -17,7 +17,7 @@
 # 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/>.
 
-"""common widgets, which can be reused everywhere"""
+"""common simple widgets"""
 
 from sat.core.i18n import _
 from kivy.uix.image import Image
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cagou/core/common_widgets.py	Fri Aug 31 16:59:38 2018 +0200
@@ -0,0 +1,103 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+
+# Cagou: desktop/mobile frontend for Salut à Toi XMPP client
+# Copyright (C) 2016-2018 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/>.
+
+"""common advanced widgets, which can be reused everywhere."""
+
+from sat.core.i18n import _
+from kivy.uix.label import Label
+from kivy.uix.boxlayout import BoxLayout
+from cagou.core.menu import TouchMenuItemBehaviour
+from kivy import properties
+from kivy.metrics import dp
+from cagou import G
+from sat.core import log as logging
+
+log = logging.getLogger(__name__)
+
+
+class Identities(object):
+
+    def __init__(self, entity_ids):
+        identities = {}
+        for cat, type_, name in entity_ids:
+            identities.setdefault(cat, {}).setdefault(type_, []).append(name)
+        client = identities.get('client', {})
+        if 'pc' in client:
+            self.type = 'desktop'
+        elif 'phone' in client:
+            self.type = 'phone'
+        elif 'web' in client:
+            self.type = 'web'
+        elif 'console' in client:
+            self.type = 'console'
+        else:
+            self.type = 'desktop'
+
+        self.identities = identities
+
+    @property
+    def name(self):
+        return self.identities.values()[0].values()[0][0]
+
+
+class ItemWidget(TouchMenuItemBehaviour, BoxLayout):
+    name = properties.StringProperty()
+    base_width = properties.NumericProperty(dp(100))
+
+
+class DeviceWidget(ItemWidget):
+
+    def __init__(self, main_wid, entity_jid, identities, **kw):
+        self.entity_jid = entity_jid
+        self.identities = identities
+        own_jid = next(G.host.profiles.itervalues()).whoami
+        self.own_device = entity_jid.bare == own_jid
+        if self.own_device:
+            name = self.identities.name
+        elif self.entity_jid.node:
+            name = self.entity_jid.node
+        elif self.entity_jid == own_jid.domain:
+            name = _(u"your server")
+        else:
+            name = entity_jid
+
+        super(DeviceWidget, self).__init__(name=name, main_wid=main_wid, **kw)
+
+    @property
+    def profile(self):
+        return self.main_wid.profile
+
+    def getSymbol(self):
+        if self.identities.type == 'desktop':
+            return 'desktop'
+        elif self.identities.type == 'phone':
+            return 'mobile'
+        elif self.identities.type == 'web':
+            return 'globe'
+        elif self.identities.type == 'console':
+            return 'terminal'
+        else:
+            return 'desktop'
+
+    def do_item_action(self, touch):
+        pass
+
+
+class CategorySeparator(Label):
+    pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cagou/kv/common_widgets.kv	Fri Aug 31 16:59:38 2018 +0200
@@ -0,0 +1,44 @@
+# Cagou: desktop/mobile frontend for Salut à Toi XMPP client
+# Copyright (C) 2016-2018 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/>.
+
+
+<ItemWidget>:
+    size_hint: None, None
+    width: self.base_width
+    height: self.minimum_height
+    orientation: 'vertical'
+
+
+<DeviceWidget>:
+    Symbol:
+        size_hint: 1, None
+        height: dp(80)
+        symbol: root.getSymbol()
+        margin: dp(40)
+        color: 0, 0, 0, 1
+    Label:
+        size_hint: None, None
+        width: dp(100)
+        font_size: sp(14)
+        text_size: dp(95), None
+        size: self.texture_size
+        text: root.name
+        halign: 'center'
+
+
+<CategorySeparator>:
+    size_hint: 1, None
+    height: sp(20)
--- a/cagou/plugins/plugin_wid_file_sharing.kv	Fri Aug 31 16:58:15 2018 +0200
+++ b/cagou/plugins/plugin_wid_file_sharing.kv	Fri Aug 31 16:59:38 2018 +0200
@@ -40,13 +40,6 @@
                 spacing: 0
 
 
-<ItemWidget>:
-    size_hint: None, None
-    width: self.base_width
-    height: self.minimum_height
-    orientation: 'vertical'
-
-
 <PathWidget>:
     shared: False
     Symbol:
@@ -67,25 +60,3 @@
 
 <LocalPathWidget>:
     shared: root.filepath in root.main_wid.shared_paths
-
-
-<DeviceWidget>:
-    Symbol:
-        size_hint: 1, None
-        height: dp(80)
-        symbol: root.getSymbol()
-        margin: dp(40)
-        color: 0, 0, 0, 1
-    Label:
-        size_hint: None, None
-        width: dp(100)
-        font_size: sp(14)
-        text_size: dp(95), None
-        size: self.texture_size
-        text: root.name
-        halign: 'center'
-
-
-<CategorySeparator>:
-    size_hint: 1, None
-    height: sp(20)
--- a/cagou/plugins/plugin_wid_file_sharing.py	Fri Aug 31 16:58:15 2018 +0200
+++ b/cagou/plugins/plugin_wid_file_sharing.py	Fri Aug 31 16:59:38 2018 +0200
@@ -27,15 +27,14 @@
 from sat_frontends.tools import jid
 from cagou.core.constants import Const as C
 from cagou.core import cagou_widget
-from cagou.core.menu import (EntitiesSelectorMenu, TouchMenuBehaviour,
-                             TouchMenuItemBehaviour)
+from cagou.core.menu import EntitiesSelectorMenu, TouchMenuBehaviour
 from cagou.core.utils import FilterBehavior
+from cagou.core.common_widgets import (Identities, ItemWidget, DeviceWidget,
+                                       CategorySeparator)
 from cagou import G
 from kivy import properties
 from kivy.uix.label import Label
 from kivy.uix.button import Button
-from kivy.uix.boxlayout import BoxLayout
-from kivy.metrics import dp
 from kivy import utils as kivy_utils
 from functools import partial
 import os.path
@@ -80,36 +79,6 @@
             exceptions.InternalError(u"Unknown mode: {mode}".format(mode=new_mode))
 
 
-class Identities(object):
-
-    def __init__(self, entity_ids):
-        identities = {}
-        for cat, type_, name in entity_ids:
-            identities.setdefault(cat, {}).setdefault(type_, []).append(name)
-        client = identities.get('client', {})
-        if 'pc' in client:
-            self.type = 'desktop'
-        elif 'phone' in client:
-            self.type = 'phone'
-        elif 'web' in client:
-            self.type = 'web'
-        elif 'console' in client:
-            self.type = 'console'
-        else:
-            self.type = 'desktop'
-
-        self.identities = identities
-
-    @property
-    def name(self):
-        return self.identities.values()[0].values()[0][0]
-
-
-class ItemWidget(TouchMenuItemBehaviour, BoxLayout):
-    name = properties.StringProperty()
-    base_width = properties.NumericProperty(dp(100))
-
-
 class PathWidget(ItemWidget):
 
     def __init__(self, filepath, main_wid, **kw):
@@ -171,46 +140,13 @@
             self.main_wid.request_item(self)
             return True
 
-
-class DeviceWidget(ItemWidget):
-
-    def __init__(self, main_wid, entity_jid, identities, **kw):
-        self.entity_jid = entity_jid
-        self.identities = identities
-        own_jid = next(G.host.profiles.itervalues()).whoami
-        self.own_device = entity_jid.bare == own_jid
-        if self.own_device:
-            name = self.identities.name
-        elif self.entity_jid.node:
-            name = self.entity_jid.node
-        elif self.entity_jid.domain.endswith(own_jid.domain):
-            name = _(u"your server")
-        else:
-            name = _(u"sharing component")
-
-        super(DeviceWidget, self).__init__(name=name, main_wid=main_wid, **kw)
-
-    def getSymbol(self):
-        if self.identities.type == 'desktop':
-            return 'desktop'
-        elif self.identities.type == 'phone':
-            return 'mobile'
-        elif self.identities.type == 'web':
-            return 'globe'
-        elif self.identities.type == 'console':
-            return 'terminal'
-        else:
-            return 'desktop'
+class SharingDeviceWidget(DeviceWidget):
 
     def do_item_action(self, touch):
         self.main_wid.remote_entity = self.entity_jid
         self.main_wid.remote_dir = u''
 
 
-class CategorySeparator(Label):
-    pass
-
-
 class FileSharing(quick_widgets.QuickWidget, cagou_widget.CagouWidget, FilterBehavior,
                   TouchMenuBehaviour):
     SINGLE=False
@@ -302,9 +238,8 @@
                 self.layout.add_widget(CategorySeparator(text=title))
                 for entity_str, entity_ids in entities_map.iteritems():
                     entity_jid = jid.JID(entity_str)
-                    item = DeviceWidget(self,
-                                        entity_jid,
-                                        Identities(entity_ids))
+                    item = SharingDeviceWidget(
+                        self, entity_jid, Identities(entity_ids))
                     self.layout.add_widget(item)
         if not entities_services and not entities_own and not entities_roster:
             self.layout.add_widget(Label(