diff --git a/.gitignore b/.gitignore index 19fe61e82..c180c90cb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ *build*/ *flymake* CMakeLists.txt.user* -*.patch *~ *.autosave doc/_build/* diff --git a/shell_integration/dolphin/0001-KOverlayIconPlugin.patch b/shell_integration/dolphin/0001-KOverlayIconPlugin.patch new file mode 100644 index 000000000..25f9ceeea --- /dev/null +++ b/shell_integration/dolphin/0001-KOverlayIconPlugin.patch @@ -0,0 +1,256 @@ +From 3a26dc77f8e988ea99b23c4d5a2c831ecc31c920 Mon Sep 17 00:00:00 2001 +From: Olivier Goffart +Date: Thu, 17 Jul 2014 13:26:56 +0200 +Subject: [PATCH] WIP: add KOverlayIconPlugin + +--- + .../src/kitemviews/kfileitemmodelrolesupdater.cpp | 35 ++++++++++++- + .../src/kitemviews/kfileitemmodelrolesupdater.h | 9 ++++ + lib/konq/CMakeLists.txt | 4 +- + lib/konq/koverlayiconplugin.cpp | 30 ++++++++++++ + lib/konq/koverlayiconplugin.desktop | 4 ++ + lib/konq/koverlayiconplugin.h | 57 ++++++++++++++++++++++ + 6 files changed, 137 insertions(+), 2 deletions(-) + create mode 100644 lib/konq/koverlayiconplugin.cpp + create mode 100644 lib/konq/koverlayiconplugin.desktop + create mode 100644 lib/konq/koverlayiconplugin.h + +diff --git a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp +index 0865d40..840a65d 100644 +--- a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp ++++ b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp +@@ -28,9 +28,11 @@ + #include + #include + #include ++#include + + #include "private/kpixmapmodifier.h" + #include "private/kdirectorycontentscounter.h" ++#include + + #include + #include +@@ -129,6 +131,17 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO + m_directoryContentsCounter = new KDirectoryContentsCounter(m_model, this); + connect(m_directoryContentsCounter, SIGNAL(result(QString,int)), + this, SLOT(slotDirectoryContentsCountReceived(QString,int))); ++ ++ ++ const KService::List pluginServices = KServiceTypeTrader::self()->query("KOverlayIconPlugin"); ++ ++ for (KService::List::ConstIterator it = pluginServices.constBegin(); it != pluginServices.constEnd(); ++it) { ++ KOverlayIconPlugin* plugin = (*it)->createInstance(this); ++ if (plugin) { ++ m_overlayIconsPlugin.append(plugin); ++ connect(plugin, SIGNAL(overlaysChanged(KUrl,QStringList)), this, SLOT(slotOverlaysChanged(KUrl,QStringList))); ++ } ++ } + } + + KFileItemModelRolesUpdater::~KFileItemModelRolesUpdater() +@@ -1075,7 +1088,11 @@ QHash KFileItemModelRolesUpdater::rolesData(const KFileIte + data.insert("type", item.mimeComment()); + } + +- data.insert("iconOverlays", item.overlays()); ++ QStringList overlays = item.overlays(); ++ foreach(KOverlayIconPlugin *it, m_overlayIconsPlugin) { ++ overlays.append(it->getOverlays(item)); ++ } ++ data.insert("iconOverlays", overlays); + + #ifdef HAVE_BALOO + if (m_balooFileMonitor) { +@@ -1086,6 +1103,22 @@ QHash KFileItemModelRolesUpdater::rolesData(const KFileIte + return data; + } + ++void KFileItemModelRolesUpdater::slotOverlaysChanged(const KUrl& url, const QStringList &) ++{ ++ KFileItem item = m_model->fileItem(url); ++ if (item.isNull()) ++ return; ++ int index = m_model->index(item); ++ QHash data = m_model->data(index); ++ QStringList overlays = item.overlays(); ++ foreach(KOverlayIconPlugin *it, m_overlayIconsPlugin) { ++ overlays.append(it->getOverlays(item)); ++ } ++ data.insert("iconOverlays", overlays); ++ m_model->setData(index, data); ++} ++ ++ + void KFileItemModelRolesUpdater::updateAllPreviews() + { + if (m_state == Paused) { +diff --git a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h +index a9e979a..6d3add0 100644 +--- a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h ++++ b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h +@@ -32,6 +32,7 @@ + #include + #include + ++class KOverlayIconPlugin; + class KDirectoryContentsCounter; + class KFileItemModel; + class KJob; +@@ -180,6 +181,12 @@ private slots: + void slotPreviewJobFinished(); + + /** ++ * Is invoked when one of the KOverlayIconPlugin emit the signal that an overlay has changed ++ */ ++ void slotOverlaysChanged(const KUrl&, const QStringList&); ++ ++ ++ /** + * Resolves the sort role of the next item in m_pendingSortRole, applies it + * to the model, and invokes itself if there are any pending items left. If + * that is not the case, \a startUpdating() is called. +@@ -331,6 +338,8 @@ private: + + KDirectoryContentsCounter* m_directoryContentsCounter; + ++ QList m_overlayIconsPlugin; ++ + #ifdef HAVE_BALOO + Baloo::FileMonitor* m_balooFileMonitor; + #endif +diff --git a/lib/konq/CMakeLists.txt b/lib/konq/CMakeLists.txt +index 8ecbfa9..7381caf 100644 +--- a/lib/konq/CMakeLists.txt ++++ b/lib/konq/CMakeLists.txt +@@ -22,6 +22,7 @@ set(konq_LIB_SRCS + konq_historyprovider.cpp + kversioncontrolplugin.cpp # used by dolphin and its version control plugins (deprecated) + kversioncontrolplugin2.cpp # used by dolphin and its version control plugins ++ koverlayiconplugin.cpp + + konq_nameandurlinputdialog.cpp # deprecated (functionality has moved to kdelibs) + knewmenu.cpp # deprecated (functionality has moved to kdelibs) +@@ -67,8 +68,9 @@ install( FILES + konq_fileitemcapabilities.h + kversioncontrolplugin.h + kversioncontrolplugin2.h ++ koverlayiconplugin.h + konq_historyprovider.h + konq_historyentry.h + DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel + ) +-install( FILES konqpopupmenuplugin.desktop konqdndpopupmenuplugin.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} ) ++install( FILES konqpopupmenuplugin.desktop konqdndpopupmenuplugin.desktop koverlayiconplugin.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} ) +diff --git a/lib/konq/koverlayiconplugin.cpp b/lib/konq/koverlayiconplugin.cpp +new file mode 100644 +index 0000000..6125040 +--- /dev/null ++++ b/lib/konq/koverlayiconplugin.cpp +@@ -0,0 +1,30 @@ ++/***************************************************************************** ++ * Copyright (C) 2014 by Olivier Goffart * ++ * * ++ * This library is free software; you can redistribute it and/or * ++ * modify it under the terms of the GNU Library General Public * ++ * License version 2 as published by the Free Software Foundation. * ++ * * ++ * This library 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 * ++ * Library General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU Library General Public License * ++ * along with this library; see the file COPYING.LIB. If not, write to * ++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * ++ * Boston, MA 02110-1301, USA. * ++ *****************************************************************************/ ++ ++#include "koverlayiconplugin.h" ++#include ++ ++KOverlayIconPlugin::KOverlayIconPlugin(QObject* parent) : QObject(parent) ++{ ++} ++ ++KOverlayIconPlugin::~KOverlayIconPlugin() ++{ ++} ++ ++#include "koverlayiconplugin.moc" +diff --git a/lib/konq/koverlayiconplugin.desktop b/lib/konq/koverlayiconplugin.desktop +new file mode 100644 +index 0000000..65a1170 +--- /dev/null ++++ b/lib/konq/koverlayiconplugin.desktop +@@ -0,0 +1,4 @@ ++[Desktop Entry] ++Type=ServiceType ++X-KDE-ServiceType=KOverlayIconPlugin ++Comment=Plugin to add overlay icons in Dolphin +diff --git a/lib/konq/koverlayiconplugin.h b/lib/konq/koverlayiconplugin.h +new file mode 100644 +index 0000000..bcdf31b +--- /dev/null ++++ b/lib/konq/koverlayiconplugin.h +@@ -0,0 +1,57 @@ ++/***************************************************************************** ++ * Copyright (C) 2014 by Olivier Goffart * ++ * * ++ * This library is free software; you can redistribute it and/or * ++ * modify it under the terms of the GNU Library General Public * ++ * License version 2 as published by the Free Software Foundation. * ++ * * ++ * This library 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 * ++ * Library General Public License for more details. * ++ * * ++ * You should have received a copy of the GNU Library General Public License * ++ * along with this library; see the file COPYING.LIB. If not, write to * ++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * ++ * Boston, MA 02110-1301, USA. * ++ *****************************************************************************/ ++ ++ ++#ifndef OverlayIconPlugin_H ++#define OverlayIconPlugin_H ++ ++#include ++#include ++ ++class KUrl; ++class KFileItem; ++ ++/** ++ * @brief Base class for overlay icon plugins. ++ * ++ * Enables the file manager to show custom overlay icons on files. ++ * ++ * To write a custom plugin you need to create a .desktop file for your plugin with ++ * KDE-ServiceTypes=KOverlayIconPlugin ++ */ ++class LIBKONQ_EXPORT KOverlayIconPlugin : public QObject { ++ Q_OBJECT ++ void *d; ++public: ++ explicit KOverlayIconPlugin(QObject *parent = 0); ++ ~KOverlayIconPlugin(); ++ ++ /** ++ * Returns a list of overlay pixmap to add to a file ++ * This can be a path to an icon, or the icon name ++ */ ++ virtual QStringList getOverlays(const KFileItem &item) = 0; ++signals: ++ ++ /** ++ * Emit this signal when the list of overlay icon changed for a given URL ++ */ ++ void overlaysChanged(const KUrl &url, const QStringList &overlays); ++}; ++ ++#endif +-- +2.1.3 + diff --git a/shell_integration/dolphin/CMakeLists.txt b/shell_integration/dolphin/CMakeLists.txt new file mode 100644 index 000000000..0d70854ab --- /dev/null +++ b/shell_integration/dolphin/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 2.6) +project(dolphin-owncloud) +find_package(KDE4 REQUIRED) +include(KDE4Defaults) +include(MacroLibrary) +find_package(LibKonq REQUIRED) + +add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) +add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS) +include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES} ) +include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ${LIBKONQ_INCLUDE_DIR} ) + +kde4_add_plugin(ownclouddolphinplugin ownclouddolphinplugin.cpp) + +target_link_libraries(ownclouddolphinplugin ${KDE4_KIO_LIBS} ${LIBKONQ_LIBRARY}) +install(FILES ownclouddolphinplugin.desktop DESTINATION ${SERVICES_INSTALL_DIR}) +install(TARGETS ownclouddolphinplugin DESTINATION ${PLUGIN_INSTALL_DIR}) diff --git a/shell_integration/dolphin/README b/shell_integration/dolphin/README new file mode 100644 index 000000000..715adcbbf --- /dev/null +++ b/shell_integration/dolphin/README @@ -0,0 +1,18 @@ + + +- The patch 0001-KOverlayIconPlugin.patch should be applied to kde-baseapps git repository +(It should applies to both KDE/4.14 or Applications/14.12 branches) + +- Recompile and install dolphin + +- Build and install the plugin + +- After installing, run + kdeinit4 --noincremental + +- To test taht the plugin is well installed + ktraderclient --servicetype KOverlayIconPlugin + It should show the Owncloud plugin + +- restart dolphin (make sure to kill all instances) + diff --git a/shell_integration/dolphin/ownclouddolphinplugin.cpp b/shell_integration/dolphin/ownclouddolphinplugin.cpp new file mode 100644 index 000000000..def66573d --- /dev/null +++ b/shell_integration/dolphin/ownclouddolphinplugin.cpp @@ -0,0 +1,131 @@ +/****************************************************************************** + * Copyright (C) 2014 by Olivier Goffart +#include +#include +#include +#include +#include + + +class OwncloudDolphinPlugin : public KOverlayIconPlugin +{ + Q_OBJECT + QLocalSocket m_socket; + typedef QHash StatusMap; + StatusMap m_status; + QByteArray m_line; + +public: + explicit OwncloudDolphinPlugin(QObject* parent, const QList&) : KOverlayIconPlugin(parent) { + connect(&m_socket, SIGNAL(readyRead()), this, SLOT(readyRead())); + tryConnect(); + } + + virtual QStringList getOverlays(const KFileItem& item) { + KUrl url = item.url(); + if (!url.isLocalFile()) + return QStringList(); + const QByteArray localFile = url.toLocalFile().toUtf8(); + kDebug() << localFile; + + tryConnect(); + if (m_socket.state() == QLocalSocket::ConnectingState) { + if (!m_socket.waitForConnected(100)) { + kWarning() << "not connected" << m_socket.errorString(); + } + } + if (m_socket.state() == QLocalSocket::ConnectedState) { + m_socket.write("RETRIEVE_FILE_STATUS:"); + m_socket.write(localFile); + m_socket.write("\n"); + } + + StatusMap::iterator it = m_status.find(localFile); + if (it != m_status.constEnd()) { + return overlaysForString(*it); + } + return QStringList(); + } + + + +private: + void tryConnect() { + if (m_socket.state() != QLocalSocket::UnconnectedState) + return; + QString runtimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR")); + QString socketPath = runtimeDir + "/" + "ownCloud" + "/socket"; + m_socket.connectToServer(socketPath); + } + + QStringList overlaysForString(const QByteArray status) { + QStringList r; + if (status.startsWith("NOP")) + return r; + + if (status.startsWith("OK")) + r << "dialog-ok"; + if (status.startsWith("SYNC") || status.startsWith("NEW")) + r << "view-refresh"; + + if (status.contains("+SWM")) + r << "document-share"; + + kDebug() << status << r; + return r; + } + +private slots: + void readyRead() { + while (m_socket.bytesAvailable()) { + m_line += m_socket.readLine(); + if (!m_line.endsWith("\n")) + continue; + QByteArray line; + qSwap(line, m_line); + line.chop(1); + kDebug() << "got line " << line; + if (line.isEmpty()) + continue; + QList tokens = line.split(':'); + if (tokens.count() != 3) + continue; + if (tokens[0] != "STATUS" && tokens[0] != "BROADCAST") + continue; + if (tokens[2].isEmpty()) + continue; + + const QByteArray name = tokens[2]; + QByteArray &status = m_status[name]; // reference to the item in the hash + if (status == tokens[1]) + continue; + status = tokens[1]; + + emit this->overlaysChanged(KUrl::fromLocalFile(QString::fromUtf8(name)), overlaysForString(status)); + } + } +}; + +K_PLUGIN_FACTORY(OwncloudDolphinPluginFactory, registerPlugin();) +K_EXPORT_PLUGIN(OwncloudDolphinPluginFactory("ownclouddolhpinplugin")) + + +#include "ownclouddolphinplugin.moc" diff --git a/shell_integration/dolphin/ownclouddolphinplugin.desktop b/shell_integration/dolphin/ownclouddolphinplugin.desktop new file mode 100644 index 000000000..07fc63f33 --- /dev/null +++ b/shell_integration/dolphin/ownclouddolphinplugin.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Service +Name=Owncloud +X-KDE-ServiceTypes=KOverlayIconPlugin +MimeType=text/plain; +X-KDE-Library=ownclouddolphinplugin