move the alternatives dialog in the shell

it belong here: it's something that should be pure decision of the shell
wilder-5.14
Marco Martin 12 years ago
parent ad1485e7f9
commit 74abdffbf4
  1. 1
      shell/CMakeLists.txt
  2. 97
      shell/alternativesdialog.cpp
  3. 55
      shell/alternativesdialog.h
  4. 207
      shell/plasmaquick/dialog.h
  5. 12
      shell/shellcorona.cpp
  6. 2
      shell/shellcorona.h

@ -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

@ -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"

@ -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

@ -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

@ -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()
{

@ -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

Loading…
Cancel
Save