[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