diff cagou/plugins/plugin_transfer_file.py @ 279:aea973de55d9

transfer (file): use native file chooser on desktop: native file chooser is nicer and often more powerful than Kivy FileChooser. Kivy FileChooser is still activable with an option, for platforms where native file chooser is not easy/possible to use. Kivy FileChooser is used on Android. downloads_dir is now used as starting path on Android.
author Goffi <goffi@goffi.org>
date Wed, 20 Mar 2019 09:29:44 +0100
parents cd99f70ea592
children 1b835bcfa663
line wrap: on
line diff
--- a/cagou/plugins/plugin_transfer_file.py	Wed Mar 20 09:29:44 2019 +0100
+++ b/cagou/plugins/plugin_transfer_file.py	Wed Mar 20 09:29:44 2019 +0100
@@ -17,12 +17,17 @@
 # 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/>.
 
-
+import threading
+import sys
+from functools import partial
 from sat.core import log as logging
-log = logging.getLogger(__name__)
 from sat.core.i18n import _
 from kivy.uix.boxlayout import BoxLayout
 from kivy import properties
+from kivy.clock import Clock
+from plyer import filechooser, storagepath
+
+log = logging.getLogger(__name__)
 
 
 PLUGIN_INFO = {
@@ -33,11 +38,44 @@
 }
 
 
+class FileChooserBox(BoxLayout):
+    callback = properties.ObjectProperty()
+    cancel_cb = properties.ObjectProperty()
+    default_path = properties.StringProperty()
+
+
 class FileTransmitter(BoxLayout):
     callback = properties.ObjectProperty()
     cancel_cb = properties.ObjectProperty()
+    native_filechooser = True
+    default_path = storagepath.get_home_dir()
 
-    def onTransmitOK(self, filechooser):
-        if filechooser.selection:
-            file_path = filechooser.selection[0]
-            self.callback(file_path)
+    def __init__(self, *args, **kwargs):
+        if sys.platform == 'android':
+            self.native_filechooser = False
+            self.default_path = storagepath.get_downloads_dir()
+
+        super(FileTransmitter, self).__init__(*args, **kwargs)
+
+        if self.native_filechooser:
+            thread = threading.Thread(target=self._nativeFileChooser)
+            thread.start()
+        else:
+            self.add_widget(FileChooserBox(default_path = self.default_path,
+                                           callback=self.onFiles,
+                                           cancel_cb=partial(self.cancel_cb, self)))
+
+    def _nativeFileChooser(self, *args, **kwargs):
+        title=_(u"Please select a file to upload")
+        files = filechooser.open_file(title=title,
+                                      path=self.default_path,
+                                      multiple=False,
+                                      preview=True)
+        # we want to leave the thread when calling onFiles, so we use Clock
+        Clock.schedule_once(lambda *args: self.onFiles(files=files), 0)
+
+    def onFiles(self, files):
+        if files:
+            self.callback(files[0])
+        else:
+            self.cancel_cb(self)