[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [plasma-workspace/mart/alternativesConfig] shell: move the alternatives dialog in the shell
From:       Marco Martin <notmart () gmail ! com>
Date:       2014-07-22 13:58:32
Message-ID: E1X9aaO-0004PW-Ni () scm ! kde ! org
[Download RAW message or body]

Git commit 74abdffbf43fd84f903e428ebaf03e8a627e1173 by Marco Martin.
Committed on 22/07/2014 at 13:55.
Pushed by mart into branch 'mart/alternativesConfig'.

move the alternatives dialog in the shell

it belong here: it's something that should be pure decision of the shell

M  +1    -0    shell/CMakeLists.txt
A  +97   -0    shell/alternativesdialog.cpp     [License: LGPL (v2+)]
A  +55   -0    shell/alternativesdialog.h     [License: LGPL (v2+)]
A  +207  -0    shell/plasmaquick/dialog.h     [License: GPL (v2+)]
M  +11   -1    shell/shellcorona.cpp
M  +2    -0    shell/shellcorona.h

http://commits.kde.org/plasma-workspace/74abdffbf43fd84f903e428ebaf03e8a627e1173

diff --git a/shell/CMakeLists.txt b/shell/CMakeLists.txt
index f69f1d2..529e543 100644
--- a/shell/CMakeLists.txt
+++ b/shell/CMakeLists.txt
@@ -48,6 +48,7 @@ qt5_add_dbus_adaptor(scripting_SRC ${plasmashell_dbusXML} \
shellcorona.h ShellCor  
 set (plasma_shell_SRCS
     activity.cpp
+    alternativesdialog.cpp
     main.cpp
     containmentconfigview.cpp
     currentcontainmentactionsmodel.cpp
diff --git a/shell/alternativesdialog.cpp b/shell/alternativesdialog.cpp
new file mode 100644
index 0000000..8a7c6fd
--- /dev/null
+++ b/shell/alternativesdialog.cpp
@@ -0,0 +1,97 @@
+/*
+ *   Copyright 2014 Marco Martin <mart@kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU Library General Public License as
+ *   published by the Free Software Foundation; either version 2, 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 Library 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 "alternativesdialog.h"
+
+#include <QQmlEngine>
+#include <QQmlContext>
+
+#include <kdeclarative/qmlobject.h>
+#include <Plasma/Package>
+#include <Plasma/Containment>
+#include <Plasma/PluginLoader>
+
+AlternativesDialog::AlternativesDialog(Plasma::Applet *applet, QQuickItem *parent)
+    : PlasmaQuick::Dialog(parent),
+      m_applet(applet)
+{
+    setVisualParent(applet->property("_plasma_graphicObject").value<QQuickItem \
*>()); +    connect(applet, &QObject::destroyed, this, &AlternativesDialog::close);
+    setLocation(applet->location());
+    setFlags(flags()|Qt::WindowStaysOnTopHint);
+    //We already have the proper shellpluginloader
+    Plasma::Package pkg = Plasma::PluginLoader::self()->loadPackage("Plasma/Shell");
+    //TODO: use the proper package: we must be in the corona
+    pkg.setPath("org.kde.plasma.desktop");
+
+    m_qmlObj = new KDeclarative::QmlObject(this);
+    m_qmlObj->setInitializationDelayed(true);
+    m_qmlObj->setSource(QUrl::fromLocalFile(pkg.filePath("explorer", \
"AppletAlternatives.qml"))); +    \
m_qmlObj->engine()->rootContext()->setContextProperty("alternativesDialog", this); +  \
m_qmlObj->completeInitialization(); +    setMainItem(qobject_cast<QQuickItem \
*>(m_qmlObj->rootObject())); +}
+
+AlternativesDialog::~AlternativesDialog()
+{
+}
+
+QStringList AlternativesDialog::appletProvides() const
+{
+    return m_applet->pluginInfo().property("X-Plasma-Provides").value<QStringList>();
 +}
+
+QString AlternativesDialog::currentPlugin() const
+{
+    return m_applet->pluginInfo().pluginName();
+}
+
+void AlternativesDialog::loadAlternative(const QString &plugin)
+{
+    if (plugin == m_applet->pluginInfo().pluginName() || m_applet->isContainment()) \
{ +        return;
+    }
+
+    Plasma::Containment *cont = m_applet->containment();
+    if (!cont) {
+        return;
+    }
+
+    QQuickItem *appletItem = \
m_applet->property("_plasma_graphicObject").value<QQuickItem *>(); +    QQuickItem \
*contItem = cont->property("_plasma_graphicObject").value<QQuickItem *>(); +    if \
(!appletItem || !contItem) { +        return;
+    }
+
+    //TODO: map the position to containment coordinates
+    QMetaObject::invokeMethod(contItem, "createApplet", Q_ARG(QString, plugin), \
Q_ARG(QVariantList, QVariantList()), Q_ARG(QPoint, appletItem->mapToItem(contItem, \
QPointF(0,0)).toPoint())); +
+    m_applet->destroy();
+}
+
+//To emulate Qt::WA_DeleteOnClose that QWindow doesn't have
+void AlternativesDialog::hideEvent(QHideEvent *ev)
+{
+    QQuickWindow::hideEvent(ev);
+    deleteLater();
+}
+
+#include "moc_alternativesdialog.cpp"
+
diff --git a/shell/alternativesdialog.h b/shell/alternativesdialog.h
new file mode 100644
index 0000000..195b69a
--- /dev/null
+++ b/shell/alternativesdialog.h
@@ -0,0 +1,55 @@
+/*
+ *   Copyright 2014 Marco Martin <mart@kde.org>
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU Library General Public License as
+ *   published by the Free Software Foundation; either version 2, 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 Library 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 ALTERNATIVESDIALOG_H
+#define ALTERNATIVESDIALOG_H
+
+#include <Plasma/Applet>
+
+#include <plasmaquick/dialog.h>
+
+namespace KDeclarative {
+    class QmlObject;
+}
+
+//FIXME: this thing really ought to be in the shell
+class AlternativesDialog : public PlasmaQuick::Dialog
+{
+    Q_OBJECT
+    Q_PROPERTY(QStringList appletProvides READ appletProvides CONSTANT)
+    Q_PROPERTY(QString currentPlugin READ currentPlugin CONSTANT)
+
+public:
+    AlternativesDialog(Plasma::Applet *applet, QQuickItem *parent = 0);
+    ~AlternativesDialog();
+
+    QStringList appletProvides() const;
+    QString currentPlugin() const;
+
+    Q_INVOKABLE void loadAlternative(const QString &plugin);
+
+protected:
+    void hideEvent(QHideEvent *ev);
+
+private:
+    Plasma::Applet *m_applet;
+    KDeclarative::QmlObject *m_qmlObj;
+};
+
+#endif
diff --git a/shell/plasmaquick/dialog.h b/shell/plasmaquick/dialog.h
new file mode 100644
index 0000000..6759a6e
--- /dev/null
+++ b/shell/plasmaquick/dialog.h
@@ -0,0 +1,207 @@
+/***************************************************************************
+ *   Copyright 2011 Marco Martin <mart@kde.org>                            *
+ *   Copyright 2013 Sebastian Kügler <sebas@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 DIALOG_PROXY_P
+#define DIALOG_PROXY_P
+
+#include <QQuickItem>
+#include <QQuickWindow>
+#include <QWeakPointer>
+#include <QPoint>
+#include <QQmlParserStatus>
+
+#include <Plasma/Plasma>
+#include <Plasma/Theme>
+
+#include <netwm_def.h>
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the public Plasma API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+class QQuickItem;
+class QScreen;
+
+
+namespace PlasmaQuick {
+
+class DialogPrivate;
+
+/**
+ * QML wrapper for dialogs
+ *
+ * Exposed as `PlasmaCore.Dialog` in QML.
+ */
+class Dialog : public QQuickWindow, public QQmlParserStatus
+{
+    Q_OBJECT
+    Q_INTERFACES(QQmlParserStatus)
+
+    /**
+     * The main QML item that will be displayed in the Dialog
+     */
+    Q_PROPERTY(QQuickItem *mainItem READ mainItem WRITE setMainItem NOTIFY \
mainItemChanged) +
+    /**
+     * The main QML item that will be displayed in the Dialog
+     */
+    Q_PROPERTY(QQuickItem *visualParent READ visualParent WRITE setVisualParent \
NOTIFY visualParentChanged) +
+    /**
+     * Margins of the dialog around the mainItem.
+     * @see DialogMargins
+     */
+    Q_PROPERTY(QObject *margins READ margins CONSTANT)
+
+    /**
+     * Plasma Location of the dialog window. Useful if this dialog is a popup for a \
panel +     */
+    Q_PROPERTY(Plasma::Types::Location location READ location WRITE setLocation \
NOTIFY locationChanged) +
+    /**
+     * Type of the window
+     */
+    Q_PROPERTY(WindowType type READ type WRITE setType NOTIFY typeChanged)
+
+    /**
+     * Whether the dialog should be hidden when the dialog loses focus.
+     *
+     * The default value is @c false.
+     **/
+    Q_PROPERTY(bool hideOnWindowDeactivate READ hideOnWindowDeactivate WRITE \
setHideOnWindowDeactivate NOTIFY hideOnWindowDeactivateChanged) +
+    /**
+     * Whether the dialog is output only. Default value is @c false. If it is @c \
true +     * the dialog does not accept input and all pointer events are not \
accepted, thus the dialog +     * is click through.
+     *
+     * This property is currently only supported on the X11 platform. On any other \
platform the +     * property has no effect.
+     **/
+    Q_PROPERTY(bool outputOnly READ isOutputOnly WRITE setOutputOnly NOTIFY \
outputOnlyChanged) +
+    /**
+     * This property holds the window flags of the window.
+     * The window flags control the window's appearance in the windowing system,
+     * whether it's a dialog, popup, or a regular window, and whether it should
+     * have a title bar, etc.
+     * Regardless to what the user sets, the flags will always have the
+     * FramelessWindowHint flag set
+     */
+    Q_PROPERTY(Qt::WindowFlags flags READ flags WRITE setFramelessFlags NOTIFY \
flagsChanged) +
+    Q_CLASSINFO("DefaultProperty", "mainItem")
+
+public:
+    enum WindowType {
+        Normal = NET::Normal,
+        Dock = NET::Dock,
+        DialogWindow = NET::Dialog,
+        PopupMenu = NET::PopupMenu,
+        Tooltip = NET::Tooltip,
+        Notification = NET::Notification
+    };
+    Q_ENUMS(WindowType)
+
+    Dialog(QQuickItem *parent = 0);
+    ~Dialog();
+
+    //PROPERTIES ACCESSORS
+    QQuickItem *mainItem() const;
+    void setMainItem(QQuickItem *mainItem);
+
+    QQuickItem *visualParent() const;
+    void setVisualParent(QQuickItem *visualParent);
+
+    Plasma::Types::Location location() const;
+    void setLocation(Plasma::Types::Location location);
+
+    QObject *margins() const;
+
+    void setFramelessFlags(Qt::WindowFlags flags);
+
+    void setType(WindowType type);
+    WindowType type() const;
+
+    bool hideOnWindowDeactivate() const;
+    void setHideOnWindowDeactivate(bool hide);
+
+    void setOutputOnly(bool outputOnly);
+    bool isOutputOnly() const;
+
+    /**
+     * @returns The suggested screen position for the popup
+     * @arg item the item the popup has to be positioned relatively to. if null, the \
popup will be positioned in the center of the window +     * @arg alignment alignment \
of the popup compared to the item +     */
+    virtual QPoint popupPosition(QQuickItem *item, const QSize &size);
+
+Q_SIGNALS:
+    void mainItemChanged();
+    void locationChanged();
+    void visualParentChanged();
+    void typeChanged();
+    void hideOnWindowDeactivateChanged();
+    void outputOnlyChanged();
+    void flagsChanged();
+
+protected:
+    /*
+     * set the dialog position. subclasses may change it. ToolTipDialog adjusts the \
position in an animated way +     */
+    virtual void adjustGeometry(const QRect &geom);
+
+    //Reimplementations
+    virtual void classBegin();
+    virtual void componentComplete();
+    virtual void resizeEvent(QResizeEvent *re);
+    virtual void focusInEvent(QFocusEvent *ev);
+    virtual void focusOutEvent(QFocusEvent *ev);
+    virtual void showEvent(QShowEvent *event);
+    virtual void hideEvent(QHideEvent *event);
+    virtual bool event(QEvent *event);
+
+private:
+    friend class DialogPrivate;
+    DialogPrivate *const d;
+
+    Q_PRIVATE_SLOT(d, void syncBorders())
+    Q_PRIVATE_SLOT(d, void updateContrast())
+    Q_PRIVATE_SLOT(d, void updateVisibility(bool visible))
+
+    Q_PRIVATE_SLOT(d, void updateMinimumWidth())
+    Q_PRIVATE_SLOT(d, void updateMinimumHeight())
+    Q_PRIVATE_SLOT(d, void updateMaximumWidth())
+    Q_PRIVATE_SLOT(d, void updateMaximumHeight())
+
+    Q_PRIVATE_SLOT(d, void syncMainItemToSize())
+    Q_PRIVATE_SLOT(d, void syncToMainItemSize())
+    Q_PRIVATE_SLOT(d, void requestSyncToMainItemSize(bool delayed))
+};
+
+}
+
+#endif
diff --git a/shell/shellcorona.cpp b/shell/shellcorona.cpp
index 60de8ff..9bb7076 100644
--- a/shell/shellcorona.cpp
+++ b/shell/shellcorona.cpp
@@ -48,7 +48,7 @@
 
 #include "config-ktexteditor.h" // HAVE_KTEXTEDITOR
 
-
+#include "alternativesdialog.h"
 #include "activity.h"
 #include "desktopview.h"
 #include "panelview.h"
@@ -107,6 +107,7 @@ public:
     QWeakPointer<InteractiveConsole> console;
 #endif
 
+    QPointer <AlternativesDialog> alternativesDialog;
     KScreen::Config *screenConfiguration;
     QTimer waitingPanelsTimer;
     QTimer appConfigSyncTimer;
@@ -415,6 +416,15 @@ void ShellCorona::screenInvariants() const
     }
 }
 
+void ShellCorona::showAlternativesForApplet(Plasma::Applet *applet)
+{
+    if (!d->alternativesDialog) {
+        d->alternativesDialog = new AlternativesDialog(applet);
+    }
+
+    d->alternativesDialog->show();
+}
+
 
 void ShellCorona::unload()
 {
diff --git a/shell/shellcorona.h b/shell/shellcorona.h
index 2f9de03..59aaed1 100644
--- a/shell/shellcorona.h
+++ b/shell/shellcorona.h
@@ -86,6 +86,8 @@ public:
     
     Q_INVOKABLE void screenInvariants() const;
 
+    Q_INVOKABLE void showAlternativesForApplet(Plasma::Applet *applet);
+
 public Q_SLOTS:
     /**
      * Request saving applicationConfig on disk, it's event compressed, not \
immediate


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic