diff --git a/CMakeLists.txt b/CMakeLists.txt index 82821070..4d5d0229 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,70 +1,71 @@ cmake_minimum_required(VERSION 3.0) project(kdeconnect) set(KDECONNECT_VERSION_MAJOR 1) set(KDECONNECT_VERSION_MINOR 2) set(KDECONNECT_VERSION_PATCH 1) set(KDECONNECT_VERSION "${KDECONNECT_VERSION_MAJOR}.${KDECONNECT_VERSION_MINOR}.${KDECONNECT_VERSION_PATCH}") set(QT_MIN_VERSION "5.7.0") set(KF5_MIN_VERSION "5.42.0") find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_SOURCE_DIR}/cmake) find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS Quick) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS I18n ConfigWidgets DBusAddons IconThemes Notifications KIO KCMUtils) find_package(KF5 ${KF5_MIN_VERSION} COMPONENTS DocTools) find_package(Qca-qt5 2.1.0 REQUIRED) include_directories(${CMAKE_SOURCE_DIR}) configure_file(kdeconnect-version.h.in ${CMAKE_CURRENT_BINARY_DIR}/kdeconnect-version.h) include(KDEInstallDirs) include(KDECompilerSettings NO_POLICY_SCOPE) include(KDECMakeSettings) include(ECMAddTests) include(ECMSetupVersion) include(ECMInstallIcons) include(FeatureSummary) include(KDEConnectMacros.cmake) add_definitions(-DQT_NO_URL_CAST_FROM_STRING -DQT_NO_KEYWORDS) include(GenerateExportHeader) include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(core) add_subdirectory(kcm) add_subdirectory(kcmplugin) if(NOT WIN32) add_subdirectory(kio) add_subdirectory(plasmoid) endif() add_subdirectory(icon) add_subdirectory(interfaces) option(EXPERIMENTALAPP_ENABLED OFF) if(EXPERIMENTALAPP_ENABLED) add_subdirectory(app) endif() add_subdirectory(daemon) add_subdirectory(plugins) add_subdirectory(cli) add_subdirectory(indicator) add_subdirectory(fileitemactionplugin) add_subdirectory(urlhandler) +add_subdirectory(nautilus-extension) if(KF5DocTools_FOUND) add_subdirectory(doc) endif() if(BUILD_TESTING) add_subdirectory(tests) endif() install(FILES org.kde.kdeconnect.kcm.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/nautilus-extension/CMakeLists.txt b/nautilus-extension/CMakeLists.txt new file mode 100644 index 00000000..77594070 --- /dev/null +++ b/nautilus-extension/CMakeLists.txt @@ -0,0 +1,4 @@ + +set(NAUTILUS_PYTHON_EXTENSIONS_INSTALL_DIR "share/nautilus-python/extensions" CACHE PATH "Path for python-nautilus extensions") + +install(FILES kdeconnect-share.py DESTINATION ${NAUTILUS_PYTHON_EXTENSIONS_INSTALL_DIR}) diff --git a/nautilus-extension/Messages.sh b/nautilus-extension/Messages.sh new file mode 100644 index 00000000..d6e61be7 --- /dev/null +++ b/nautilus-extension/Messages.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +$XGETTEXT `find . -name '*.py'` -o $podir/kdeconnect-nautilus-extension.pot diff --git a/nautilus-extension/kdeconnect-share.py b/nautilus-extension/kdeconnect-share.py new file mode 100644 index 00000000..c8822262 --- /dev/null +++ b/nautilus-extension/kdeconnect-share.py @@ -0,0 +1,118 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +""" + * Copyright 2018 Albert Vaca Cintora + * Copyright 2018 Andy Holmes + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +""" + +__author__ = "Albert Vaca Cintora " +__version__ = "1.0" +__appname__ = "kdeconnect-share" +__app_disp_name__ = "Share files to your phone via KDE Connect" +__website__ = "https://community.kde.org/KDEConnect" + +import gettext +import locale + +from gi.repository import Nautilus, Gio, GLib, GObject + +_ = gettext.gettext + +class KdeConnectShareExtension(GObject.GObject, Nautilus.MenuProvider): + """A context menu for sending files via KDE Connect.""" + + def __init__(self): + GObject.GObject.__init__(self) + + try: + locale.setlocale(locale.LC_ALL, '') + gettext.bindtextdomain('kdeconnect-nautilus-extension') + except Exception as e: + print(e) + pass + + self.dbus = Gio.DBusProxy.new_for_bus_sync( + Gio.BusType.SESSION, + Gio.DBusProxyFlags.NONE, + None, + 'org.kde.kdeconnect', + '/modules/kdeconnect', + 'org.kde.kdeconnect.daemon', + None) + + def send_files(self, menu, files, deviceId): + device_proxy = Gio.DBusProxy.new_for_bus_sync( + Gio.BusType.SESSION, + Gio.DBusProxyFlags.NONE, + None, + 'org.kde.kdeconnect', + '/modules/kdeconnect/devices/'+deviceId+'/share', + 'org.kde.kdeconnect.device.share', + None) + + for file in files: + variant = GLib.Variant('(s)', (file.get_uri(),)) + device_proxy.call_sync('shareUrl', variant, 0, -1, None) + + def get_file_items(self, window, files): + + #We can only send regular files + for uri in files: + if uri.get_uri_scheme() != 'file' or uri.is_directory(): + return + + try: + onlyReachable = True + onlyPaired = True + variant = GLib.Variant('(bb)', (onlyReachable, onlyPaired)) + devices = self.dbus.call_sync('deviceNames', variant, 0, -1, None) + devices = devices.unpack()[0] + except Exception as e: + raise Exception('Error while getting reachable devices') + + if len(devices) == 0: + return + + if len(devices) == 1: + deviceId, deviceName = devices.items()[0] + item = Nautilus.MenuItem( + name='KdeConnectShareExtension::Devices::' + deviceId, + label=_("Send to %s via KDE Connect") % deviceName, + ) + item.connect('activate', self.send_files, files, deviceId) + return item, + else: + menu = Nautilus.MenuItem( + name='KdeConnectShareExtension::Devices', + label=_('Send via KDE Connect'), + ) + submenu = Nautilus.Menu() + menu.set_submenu(submenu) + + for deviceId, deviceName in devices.items(): + item = Nautilus.MenuItem( + name='KdeConnectShareExtension::Devices::' + deviceId, + label=deviceName, + ) + item.connect('activate', self.send_files, files, deviceId) + submenu.append_item(item) + + return menu, +