Hello community,

here is the log from the commit of package milou5 for openSUSE:Factory checked 
in at 2016-04-07 13:30:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/milou5 (Old)
 and      /work/SRC/openSUSE:Factory/.milou5.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "milou5"

Changes:
--------
--- /work/SRC/openSUSE:Factory/milou5/milou5.changes    2016-03-03 
15:14:59.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.milou5.new/milou5.changes       2016-04-07 
13:30:14.000000000 +0200
@@ -1,0 +2,16 @@
+Tue Mar 29 16:21:02 UTC 2016 - hrvoje.sen...@gmail.com
+
+- Update to 5.6.1
+  * New bugfix release
+  * For more details please see:
+    https://www.kde.org/announcements/plasma-5.6.1.php
+
+-------------------------------------------------------------------
+Sun Mar 20 09:19:56 UTC 2016 - hrvoje.sen...@gmail.com
+
+- Update to 5.6.0
+  * New feature release
+  * For more details please see:
+    https://www.kde.org/announcements/plasma-5.6.0.php
+
+-------------------------------------------------------------------

Old:
----
  milou-5.5.5.tar.xz

New:
----
  milou-5.6.1.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ milou5.spec ++++++
--- /var/tmp/diff_new_pack.DgcOzB/_old  2016-04-07 13:30:15.000000000 +0200
+++ /var/tmp/diff_new_pack.DgcOzB/_new  2016-04-07 13:30:15.000000000 +0200
@@ -18,7 +18,7 @@
 
 %bcond_without lang
 Name:           milou5
-Version:        5.5.5
+Version:        5.6.1
 Release:        0
 Summary:        Dedicated search application built on top of Baloo
 License:        GPL-2.0+ and LGPL-2.1+

++++++ milou-5.5.5.tar.xz -> milou-5.6.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/milou-5.5.5/CMakeLists.txt 
new/milou-5.6.1/CMakeLists.txt
--- old/milou-5.5.5/CMakeLists.txt      2016-03-01 14:38:51.000000000 +0100
+++ new/milou-5.6.1/CMakeLists.txt      2016-03-29 16:16:01.000000000 +0200
@@ -1,5 +1,5 @@
 project(Milou)
-set(PROJECT_VERSION "5.5.5")
+set(PROJECT_VERSION "5.6.1")
 set(PROJECT_VERSION_MAJOR 5)
 cmake_minimum_required(VERSION 2.8.12)
 
@@ -13,7 +13,7 @@
 include(ECMAddTests)
 include(KDEInstallDirs)
 include(KDECMakeSettings)
-include(KDECompilerSettings)
+include(KDECompilerSettings NO_POLICY_SCOPE)
 include(GenerateExportHeader)
 
 # find_package(KdepimLibs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/milou-5.5.5/lib/CMakeLists.txt 
new/milou-5.6.1/lib/CMakeLists.txt
--- old/milou-5.5.5/lib/CMakeLists.txt  2016-03-01 14:38:13.000000000 +0100
+++ new/milou-5.6.1/lib/CMakeLists.txt  2016-03-29 16:15:28.000000000 +0200
@@ -4,6 +4,7 @@
     preview.cpp
     previewplugin.cpp
     sourcesmodel.cpp
+    draghelper.cpp
 )
 
 add_library(milou SHARED ${lib_SRCS})
@@ -12,6 +13,7 @@
 target_link_libraries (milou
     Qt5::Qml
     Qt5::Quick
+    Qt5::Widgets # for QAction...
     KF5::Service
     KF5::Plasma
     KF5::Runner
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/milou-5.5.5/lib/draghelper.cpp 
new/milou-5.6.1/lib/draghelper.cpp
--- old/milou-5.5.5/lib/draghelper.cpp  1970-01-01 01:00:00.000000000 +0100
+++ new/milou-5.6.1/lib/draghelper.cpp  2016-03-29 16:15:28.000000000 +0200
@@ -0,0 +1,80 @@
+/***************************************************************************
+ *   Copyright (C) 2013 by Eike Hein <h...@kde.org>                        *
+ *                                                                         *
+ *   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) 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 General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
+ ***************************************************************************/
+
+#include "draghelper.h"
+
+#include <QApplication>
+#include <QDrag>
+#include <QMimeData>
+#include <QQuickItem>
+
+using namespace Milou;
+
+DragHelper::DragHelper(QObject* parent) : QObject(parent)
+, m_dragIconSize(32)
+{
+    qmlRegisterType<QMimeData>();
+}
+
+DragHelper::~DragHelper()
+{
+}
+
+int DragHelper::dragIconSize() const
+{
+    return m_dragIconSize;
+}
+
+void DragHelper::setDragIconSize(int size)
+{
+    if (m_dragIconSize != size) {
+        m_dragIconSize = size;
+
+        emit dragIconSizeChanged();
+    }
+}
+
+bool DragHelper::isDrag(int oldX, int oldY, int newX, int newY) const
+{
+    return ((QPoint(oldX, oldY) - QPoint(newX, newY)).manhattanLength() >= 
QApplication::startDragDistance());
+}
+
+void DragHelper::startDrag(QQuickItem *item, QMimeData *mimeData, const QIcon 
&icon)
+{
+    // This allows the caller to return, making sure we don't crash if
+    // the caller is destroyed mid-drag
+
+    QMetaObject::invokeMethod(this, "doDrag", Qt::QueuedConnection,
+        Q_ARG(QQuickItem*, item), Q_ARG(QMimeData*, mimeData), Q_ARG(QIcon, 
icon));
+}
+
+void DragHelper::doDrag(QQuickItem *item, QMimeData *mimeData, const QIcon 
&icon) const
+{
+    QDrag *drag = new QDrag(item);
+    drag->setMimeData(mimeData);
+
+    if (!icon.isNull()) {
+        drag->setPixmap(icon.pixmap(m_dragIconSize, m_dragIconSize));
+    }
+
+    drag->exec();
+
+    emit dropped();
+}
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/milou-5.5.5/lib/draghelper.h 
new/milou-5.6.1/lib/draghelper.h
--- old/milou-5.5.5/lib/draghelper.h    1970-01-01 01:00:00.000000000 +0100
+++ new/milou-5.6.1/lib/draghelper.h    2016-03-29 16:15:28.000000000 +0200
@@ -0,0 +1,59 @@
+/***************************************************************************
+ *   Copyright (C) 2013 by Eike Hein <h...@kde.org>                        *
+ *                                                                         *
+ *   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) 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 General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
+ ***************************************************************************/
+
+#ifndef DRAGHELPER_H
+#define DRAGHELPER_H
+
+#include <QObject>
+#include <QIcon>
+
+#include "milou_export.h"
+
+class QQuickItem;
+class QMimeData;
+
+namespace Milou {
+
+class MILOU_EXPORT DragHelper : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int dragIconSize READ dragIconSize WRITE setDragIconSize NOTIFY 
dragIconSizeChanged)
+
+    public:
+        DragHelper(QObject *parent = 0);
+        ~DragHelper();
+
+        int dragIconSize() const;
+        void setDragIconSize(int size);
+
+        Q_INVOKABLE bool isDrag(int oldX, int oldY, int newX, int newY) const;
+        Q_INVOKABLE void startDrag(QQuickItem* item, QMimeData *mimeData, 
const QIcon &icon = QIcon());
+
+    Q_SIGNALS:
+        void dragIconSizeChanged() const;
+        void dropped() const;
+
+    private:
+        int m_dragIconSize;
+        Q_INVOKABLE void doDrag(QQuickItem* item, QMimeData *mimeData, const 
QIcon &icon = QIcon()) const;
+};
+
+}
+
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/milou-5.5.5/lib/qml/ResultDelegate.qml 
new/milou-5.6.1/lib/qml/ResultDelegate.qml
--- old/milou-5.5.5/lib/qml/ResultDelegate.qml  2016-03-01 14:38:13.000000000 
+0100
+++ new/milou-5.6.1/lib/qml/ResultDelegate.qml  2016-03-29 16:15:28.000000000 
+0200
@@ -1,6 +1,7 @@
 /*
  * This file is part of the KDE Milou Project
  * Copyright (C) 2013-2014 Vishesh Handa <m...@vhanda.in>
+ * Copyright (C) 2015-2016 Kai Uwe Broulik <k...@privat.broulik.de>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -23,35 +24,101 @@
 import QtQuick 2.1
 import QtQuick.Layouts 1.1
 
+import org.kde.plasma.core 2.0 as PlasmaCore
 import org.kde.plasma.components 2.0 as PlasmaComponents
 import org.kde.kquickcontrolsaddons 2.0 as QtExtra
+
 import "globals.js" as Globals
 
 MouseArea {
     id: resultDelegate
+
     property variant theModel: model
 
-    property string typeText: {
-        var currentType = model.type
-        var reversed = resultDelegate.ListView.view.reversed
-        var nextIndex = model.index + (reversed ? 1 : -1)
-        var nextType = resultDelegate.ListView.view.model.getType(nextIndex)
-
-        if (nextType != currentType) {
-            return String(currentType)
-        } else {
-            return ""
+    readonly property bool isCurrent: ListView.isCurrentItem // cannot 
properly Connect {} to this
+    readonly property bool sectionHasChanged: (reversed && ListView.section != 
ListView.nextSection)
+                                              || (!reversed && 
ListView.section != ListView.previousSection)
+
+    property int activeAction: -1
+
+    property string typeText: sectionHasChanged ? ListView.section : ""
+
+    property bool __pressed: false
+    property int __pressX: -1
+    property int __pressY: -1
+
+    onIsCurrentChanged: {
+        if (!isCurrent) {
+            activeAction = -1
+        }
+    }
+
+    function activateNextAction() {
+        if (activeAction === actionsRepeater.count - 1) { // last action, do 
nothing
+            return false
+        }
+        ++activeAction
+        return true
+    }
+
+    function activatePreviousAction() {
+        if (activeAction < 0) { // no action, do nothing
+            return false
         }
+        --activeAction
+        return true
+    }
+
+    function activateLastAction() {
+        activeAction = actionsRepeater.count - 1
     }
 
     width: listItem.implicitWidth
     height: listItem.implicitHeight
 
+    acceptedButtons: Qt.LeftButton
     hoverEnabled: true
     onEntered: {
         listView.currentIndex = index
     }
 
+    onPressed: {
+        __pressed = true;
+        __pressX = mouse.x;
+        __pressY = mouse.y;
+    }
+
+    onReleased: {
+        if (__pressed) {
+            listView.currentIndex = model.index
+            listView.runCurrentIndex()
+        }
+
+        __pressed = false;
+        __pressX = -1;
+        __pressY = -1;
+    }
+
+    onPositionChanged: {
+        if (__pressX != -1 && typeof dragHelper !== "undefined" && 
dragHelper.isDrag(__pressX, __pressY, mouse.x, mouse.y)) {
+            var mimeData = ListView.view.model.getMimeData(index);
+            if (mimeData) {
+                dragHelper.startDrag(root, mimeData, model.decoration);
+                __pressed = false;
+                __pressX = -1;
+                __pressY = -1;
+            }
+        }
+    }
+
+    onContainsMouseChanged: {
+        if (!containsMouse) {
+            __pressed = false;
+            __pressX = -1;
+            __pressY = -1;
+        }
+    }
+
     PlasmaComponents.Label {
         id: typeText
         text: resultDelegate.typeText
@@ -71,52 +138,95 @@
 
     PlasmaComponents.ListItem {
         id: listItem
-        enabled: true
-
-        onClicked: {
-            listView.currentIndex = model.index
-            listView.runCurrentIndex()
-        }
-
-        RowLayout {
-            anchors.left: parent.left
-            anchors.right: parent.right
-            anchors.leftMargin: Globals.CategoryWidth
-            height: typePixmap.height
 
-            QtExtra.QIconItem {
-                id: typePixmap
-                width: Globals.IconSize
-                height: Globals.IconSize
-
-                icon: model.decoration
-                smooth: true
+        // fake pressed look
+        checked: resultDelegate.pressed
+        separatorVisible: resultDelegate.sectionHasChanged
+                       && !resultDelegate.isCurrent
+                       && (index === 0 || 
resultDelegate.ListView.view.currentIndex !== (index - 1))
+
+        Item {
+            anchors {
+                left: parent.left
+                right: parent.right
+                leftMargin: Globals.CategoryWidth
             }
+            height: typePixmap.height
 
-            PlasmaComponents.Label {
-                id: displayLabel
-                text: String(typeof modelData !== "undefined" ? modelData : 
model.display)
-
-                height: typePixmap.height
-
-                elide: Text.ElideMiddle
-                maximumLineCount: 1
-
-                Layout.maximumWidth: parent.width - displayLabel.x
+            RowLayout {
+                anchors {
+                    left: parent.left
+                    right: actionsRow.left
+                    rightMargin: units.smallSpacing
+                }
+
+                QtExtra.QIconItem {
+                    id: typePixmap
+                    width: Globals.IconSize
+                    height: Globals.IconSize
+
+                    icon: model.decoration
+                    smooth: true
+                }
+
+                PlasmaComponents.Label {
+                    id: displayLabel
+                    text: String(typeof modelData !== "undefined" ? modelData 
: model.display)
+
+                    height: typePixmap.height
+
+                    elide: Text.ElideMiddle
+                    wrapMode: Text.NoWrap
+
+                    Layout.maximumWidth: parent.width - displayLabel.x
+                }
+
+                PlasmaComponents.Label {
+                    id: subtextLabel
+                    text: model.isDuplicate > 1 ? String(model.subtext) : ""
+
+                    color: theme.textColor
+                    opacity: 0.3
+
+                    height: typePixmap.height
+
+                    elide: Text.ElideMiddle
+                    wrapMode: Text.NoWrap
+                    Layout.fillWidth: true
+                }
             }
 
-            PlasmaComponents.Label {
-                id: subtextLabel
-                text: model.isDuplicate > 1 ? String(model.subtext) : ""
-
-                color: theme.textColor
-                opacity: 0.3
-
-                height: typePixmap.height
-
-                elide: Text.ElideRight
-                maximumLineCount: 1
-                Layout.fillWidth: true
+            Row {
+                id: actionsRow
+                anchors.right: parent.right
+                anchors.verticalCenter: parent.verticalCenter
+                visible: resultDelegate.isCurrent
+
+                Repeater {
+                    id: actionsRepeater
+                    model: typeof actions !== "undefined" ? actions : 0
+
+                    PlasmaComponents.ToolButton {
+                        width: height
+                        height: listItem.height
+                        visible: modelData.visible
+                        enabled: modelData.enabled
+                        tooltip: modelData.text
+                        checkable: checked
+                        checked: resultDelegate.activeAction === index
+
+                        PlasmaCore.IconItem {
+                            anchors.centerIn: parent
+                            width: Globals.IconSize
+                            height: Globals.IconSize
+                            // ToolButton cannot cope with QIcon
+                            source: modelData.icon
+                            active: parent.hovered || parent.checked
+                        }
+
+                        onClicked: listView.runAction(index)
+                    }
+                }
             }
         }
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/milou-5.5.5/lib/qml/ResultsView.qml 
new/milou-5.6.1/lib/qml/ResultsView.qml
--- old/milou-5.5.5/lib/qml/ResultsView.qml     2016-03-01 14:38:13.000000000 
+0100
+++ new/milou-5.6.1/lib/qml/ResultsView.qml     2016-03-29 16:15:28.000000000 
+0200
@@ -24,7 +24,7 @@
 
 import org.kde.plasma.components 2.0 as PlasmaComponents
 import org.kde.plasma.core 2.0 as PlasmaCore
-import org.kde.milou 0.1 as Milou
+import org.kde.milou 0.2 as Milou
 
 import "globals.js" as Globals
 
@@ -32,20 +32,33 @@
     id: listView
     property alias queryString: resultModel.queryString
     property alias runner: resultModel.runner
+    property alias runnerName: resultModel.runnerName
+    property alias runnerIcon: resultModel.runnerIcon
     property bool reversed
     signal activated
     signal updateQueryString(string text, int cursorPosition)
 
+    // NOTE this also flips increment/decrementCurrentIndex (Bug 360789)
     verticalLayoutDirection: reversed ? ListView.BottomToTop : 
ListView.TopToBottom
     keyNavigationWraps: true
     highlight: PlasmaComponents.Highlight {}
     highlightMoveDuration: 0
 
+    section {
+        criteria: ViewSection.FullString
+        property: "type"
+    }
+
     // This is used to keep track if the user has pressed enter before
     // the first result has been shown, in the case the first result should
     // be run when the model is populated
     property bool runAutomatically
 
+    Milou.DragHelper {
+        id: dragHelper
+        dragIconSize: units.iconSizes.medium
+    }
+
     model: Milou.SourcesModel {
         id: resultModel
         queryLimit: 20
@@ -80,8 +93,12 @@
         if (!currentItem) {
             runAutomatically = true
             return;
-        }
-        else {
+        } else {
+            if (currentItem.activeAction > -1) {
+                runAction(currentItem.activeAction)
+                return
+            }
+
             if (resultModel.run(currentIndex)) {
                 activated()
             }
@@ -89,10 +106,39 @@
         }
     }
 
-    Keys.onTabPressed: incrementCurrentIndex()
-    Keys.onBacktabPressed: decrementCurrentIndex()
-    Keys.onUpPressed: decrementCurrentIndex();
-    Keys.onDownPressed: incrementCurrentIndex();
+    function runAction(index) {
+        if (resultModel.runAction(currentIndex, index)) {
+            activated()
+        }
+    }
+
+    Keys.onTabPressed: {
+        if (!currentItem || !currentItem.activateNextAction()) {
+            if (reversed) {
+                decrementCurrentIndex()
+            } else {
+                incrementCurrentIndex()
+            }
+        }
+    }
+    Keys.onBacktabPressed: {
+        if (!currentItem || !currentItem.activatePreviousAction()) {
+            if (reversed) {
+                incrementCurrentIndex()
+            } else {
+                decrementCurrentIndex()
+            }
+
+            // activate previous action cannot know whether we want to back 
tab from an action
+            // to the main result or back tab from another search result, so 
we explicitly highlight
+            // the last action here to provide a consistent navigation 
experience
+            if (currentItem) {
+                currentItem.activateLastAction()
+            }
+        }
+    }
+    Keys.onUpPressed: reversed ? incrementCurrentIndex() : 
decrementCurrentIndex();
+    Keys.onDownPressed: reversed ? decrementCurrentIndex() : 
incrementCurrentIndex();
 
     boundsBehavior: Flickable.StopAtBounds
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/milou-5.5.5/lib/qml/qmlplugins.cpp 
new/milou-5.6.1/lib/qml/qmlplugins.cpp
--- old/milou-5.5.5/lib/qml/qmlplugins.cpp      2016-03-01 14:38:13.000000000 
+0100
+++ new/milou-5.6.1/lib/qml/qmlplugins.cpp      2016-03-29 16:15:28.000000000 
+0200
@@ -24,6 +24,7 @@
 
 #include "sourcesmodel.h"
 #include "preview.h"
+#include "draghelper.h"
 
 #include <QtQml/qqml.h>
 
@@ -35,5 +36,6 @@
 {
     qmlRegisterType<Milou::SourcesModel> (uri, 0, 1, "SourcesModel");
     qmlRegisterType<Milou::Preview> (uri, 0, 1, "Preview");
+    qmlRegisterType<Milou::DragHelper> (uri, 0, 2, "DragHelper");
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/milou-5.5.5/lib/sourcesmodel.cpp 
new/milou-5.6.1/lib/sourcesmodel.cpp
--- old/milou-5.5.5/lib/sourcesmodel.cpp        2016-03-01 14:38:13.000000000 
+0100
+++ new/milou-5.6.1/lib/sourcesmodel.cpp        2016-03-29 16:15:28.000000000 
+0200
@@ -26,7 +26,9 @@
 #include <KDirWatch>
 #include <KSharedConfig>
 
+#include <QAction>
 #include <QModelIndex>
+#include <QMimeData>
 #include <QSet>
 
 using namespace Milou;
@@ -58,6 +60,7 @@
     QHash<int, QByteArray> roles = QAbstractListModel::roleNames();
     roles.insert(TypeRole, "type");
     roles.insert(SubtextRole, "subtext");
+    roles.insert(ActionsRole, "actions");
     roles.insert(DuplicateRole, "isDuplicate");
     roles.insert(PreviewTypeRole, "previewType");
     roles.insert(PreviewUrlRole, "previewUrl");
@@ -108,6 +111,21 @@
         case SubtextRole:
             return m.subtext();
 
+        case ActionsRole: {
+            const auto &actions = m_manager->actionsForMatch(m);
+            if (actions.isEmpty()) {
+                return QVariantList();
+            }
+
+            QVariantList actionsList;
+            actionsList.reserve(actions.size());
+
+            for (QAction *action : actions) {
+                actionsList.append(QVariant::fromValue(action));
+            }
+
+            return actionsList;
+        }
         case DuplicateRole:
             return m_duplicates.value(m.text());
 
@@ -151,7 +169,34 @@
 
 void SourcesModel::setRunner(const QString& runner)
 {
-    m_runner = runner;
+    if (m_runner != runner) {
+        m_runner = runner;
+
+        m_manager->setSingleModeRunnerId(m_runner);
+        m_manager->setSingleMode(!m_runner.isEmpty());
+
+        emit runnerChanged();
+    }
+}
+
+QString SourcesModel::runnerName() const
+{
+    auto *singleRunner = m_manager->singleModeRunner();
+    if (!singleRunner) {
+        return QString();
+    }
+
+    return singleRunner->name();
+}
+
+QIcon SourcesModel::runnerIcon() const
+{
+    auto *singleRunner = m_manager->singleModeRunner();
+    if (!singleRunner) {
+        return QIcon();
+    }
+
+    return singleRunner->icon();
 }
 
 void SourcesModel::setQueryLimit(int limit)
@@ -176,8 +221,6 @@
     }
 
     m_modelPopulated = false;
-    m_manager->setSingleModeRunnerId(m_runner);
-    m_manager->setSingleMode(!m_runner.isEmpty());
     m_manager->launchQuery(m_queryString, m_runner);
 
     // We avoid clearing the model instantly, and instead wait for the results
@@ -380,8 +423,36 @@
     return true;
 }
 
+bool SourcesModel::runAction(int index, int actionIndex)
+{
+    Plasma::QueryMatch match = fetchMatch(index);
+    Q_ASSERT(match.runner());
+
+    const auto &actions = m_manager->actionsForMatch(match);
+    if (actionIndex < 0 || actionIndex >= actions.count()) {
+        return false;
+    }
+
+    QAction *action = actions.at(actionIndex);
+    match.setSelectedAction(action);
+    m_manager->run(match);
+    return true;
+}
+
 void SourcesModel::reloadConfiguration()
 {
     KSharedConfig::openConfig("krunnerrc")->reparseConfiguration();
     m_manager->reloadConfiguration();
 }
+
+QMimeData *SourcesModel::getMimeData(int index) const
+{
+    Plasma::QueryMatch match = fetchMatch(index);
+    Q_ASSERT(match.runner());
+
+    // we're returning a parent-less QObject from a Q_INVOKABLE
+    // which means the QML engine will take care of deleting it eventually
+    QMimeData *mimeData = m_manager->mimeDataForMatch(match);
+
+    return mimeData;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/milou-5.5.5/lib/sourcesmodel.h 
new/milou-5.6.1/lib/sourcesmodel.h
--- old/milou-5.5.5/lib/sourcesmodel.h  2016-03-01 14:38:13.000000000 +0100
+++ new/milou-5.6.1/lib/sourcesmodel.h  2016-03-29 16:15:28.000000000 +0200
@@ -38,7 +38,10 @@
     Q_OBJECT
     Q_PROPERTY(QString queryString READ queryString WRITE setQueryString)
     Q_PROPERTY(int queryLimit READ queryLimit WRITE setQueryLimit)
-    Q_PROPERTY(QString runner READ runner WRITE setRunner)
+    Q_PROPERTY(QString runner READ runner WRITE setRunner NOTIFY runnerChanged)
+
+    Q_PROPERTY(QString runnerName READ runnerName NOTIFY runnerChanged)
+    Q_PROPERTY(QIcon runnerIcon READ runnerIcon NOTIFY runnerChanged)
 
 public:
     explicit SourcesModel(QObject* parent = 0);
@@ -47,6 +50,7 @@
     enum Roles {
         TypeRole = Qt::UserRole + 1,
         SubtextRole,
+        ActionsRole,
         DuplicateRole,
         PreviewTypeRole,
         PreviewUrlRole,
@@ -62,6 +66,9 @@
     QString runner() const;
     void setRunner(const QString& runner);
 
+    QString runnerName() const;
+    QIcon runnerIcon() const;
+
     QString queryString() const;
     int queryLimit() const;
 
@@ -75,6 +82,8 @@
      */
     void updateSearchTerm(const QString& text, int pos);
 
+    void runnerChanged();
+
 public slots:
     void reloadConfiguration();
     void setQueryString(const QString& str);
@@ -82,11 +91,13 @@
     void clear();
 
     bool run(int index);
+    bool runAction(int index, int actionIndex);
 
     Q_INVOKABLE QString getType(int index) const {
         return data(createIndex(index, 0), TypeRole).toString();
     }
 
+    Q_INVOKABLE QMimeData *getMimeData(int index) const;
 
 private slots:
     void slotMatchesChanged(const QList<Plasma::QueryMatch>& list);
Files old/milou-5.5.5/po/ar/messages.mo and new/milou-5.6.1/po/ar/messages.mo 
differ
Files old/milou-5.5.5/po/ast/messages.mo and new/milou-5.6.1/po/ast/messages.mo 
differ
Files old/milou-5.5.5/po/bs/messages.mo and new/milou-5.6.1/po/bs/messages.mo 
differ
Files old/milou-5.5.5/po/ca/messages.mo and new/milou-5.6.1/po/ca/messages.mo 
differ
Files old/milou-5.5.5/po/ca@valencia/messages.mo and 
new/milou-5.6.1/po/ca@valencia/messages.mo differ
Files old/milou-5.5.5/po/cs/messages.mo and new/milou-5.6.1/po/cs/messages.mo 
differ
Files old/milou-5.5.5/po/da/messages.mo and new/milou-5.6.1/po/da/messages.mo 
differ
Files old/milou-5.5.5/po/de/messages.mo and new/milou-5.6.1/po/de/messages.mo 
differ
Files old/milou-5.5.5/po/el/messages.mo and new/milou-5.6.1/po/el/messages.mo 
differ
Files old/milou-5.5.5/po/en_GB/messages.mo and 
new/milou-5.6.1/po/en_GB/messages.mo differ
Files old/milou-5.5.5/po/es/messages.mo and new/milou-5.6.1/po/es/messages.mo 
differ
Files old/milou-5.5.5/po/et/messages.mo and new/milou-5.6.1/po/et/messages.mo 
differ
Files old/milou-5.5.5/po/fi/messages.mo and new/milou-5.6.1/po/fi/messages.mo 
differ
Files old/milou-5.5.5/po/fr/messages.mo and new/milou-5.6.1/po/fr/messages.mo 
differ
Files old/milou-5.5.5/po/gl/messages.mo and new/milou-5.6.1/po/gl/messages.mo 
differ
Files old/milou-5.5.5/po/hu/messages.mo and new/milou-5.6.1/po/hu/messages.mo 
differ
Files old/milou-5.5.5/po/ia/messages.mo and new/milou-5.6.1/po/ia/messages.mo 
differ
Files old/milou-5.5.5/po/it/messages.mo and new/milou-5.6.1/po/it/messages.mo 
differ
Files old/milou-5.5.5/po/ja/messages.mo and new/milou-5.6.1/po/ja/messages.mo 
differ
Files old/milou-5.5.5/po/ko/messages.mo and new/milou-5.6.1/po/ko/messages.mo 
differ
Files old/milou-5.5.5/po/lt/messages.mo and new/milou-5.6.1/po/lt/messages.mo 
differ
Files old/milou-5.5.5/po/nb/messages.mo and new/milou-5.6.1/po/nb/messages.mo 
differ
Files old/milou-5.5.5/po/nds/messages.mo and new/milou-5.6.1/po/nds/messages.mo 
differ
Files old/milou-5.5.5/po/nl/messages.mo and new/milou-5.6.1/po/nl/messages.mo 
differ
Files old/milou-5.5.5/po/nn/messages.mo and new/milou-5.6.1/po/nn/messages.mo 
differ
Files old/milou-5.5.5/po/pa/messages.mo and new/milou-5.6.1/po/pa/messages.mo 
differ
Files old/milou-5.5.5/po/pl/messages.mo and new/milou-5.6.1/po/pl/messages.mo 
differ
Files old/milou-5.5.5/po/pt/messages.mo and new/milou-5.6.1/po/pt/messages.mo 
differ
Files old/milou-5.5.5/po/pt_BR/messages.mo and 
new/milou-5.6.1/po/pt_BR/messages.mo differ
Files old/milou-5.5.5/po/ro/messages.mo and new/milou-5.6.1/po/ro/messages.mo 
differ
Files old/milou-5.5.5/po/ru/messages.mo and new/milou-5.6.1/po/ru/messages.mo 
differ
Files old/milou-5.5.5/po/sk/messages.mo and new/milou-5.6.1/po/sk/messages.mo 
differ
Files old/milou-5.5.5/po/sl/messages.mo and new/milou-5.6.1/po/sl/messages.mo 
differ
Files old/milou-5.5.5/po/sr/messages.mo and new/milou-5.6.1/po/sr/messages.mo 
differ
Files old/milou-5.5.5/po/sr@ijekavian/messages.mo and 
new/milou-5.6.1/po/sr@ijekavian/messages.mo differ
Files old/milou-5.5.5/po/sr@ijekavianlatin/messages.mo and 
new/milou-5.6.1/po/sr@ijekavianlatin/messages.mo differ
Files old/milou-5.5.5/po/sr@latin/messages.mo and 
new/milou-5.6.1/po/sr@latin/messages.mo differ
Files old/milou-5.5.5/po/sv/messages.mo and new/milou-5.6.1/po/sv/messages.mo 
differ
Files old/milou-5.5.5/po/tr/messages.mo and new/milou-5.6.1/po/tr/messages.mo 
differ
Files old/milou-5.5.5/po/uk/messages.mo and new/milou-5.6.1/po/uk/messages.mo 
differ
Files old/milou-5.5.5/po/zh_CN/messages.mo and 
new/milou-5.6.1/po/zh_CN/messages.mo differ
Files old/milou-5.5.5/po/zh_TW/messages.mo and 
new/milou-5.6.1/po/zh_TW/messages.mo differ


Reply via email to