diff --git a/shell/currentcontainmentactionsmodel.cpp b/shell/currentcontainmentactionsmodel.cpp index 836f463ea..08317ed95 100644 --- a/shell/currentcontainmentactionsmodel.cpp +++ b/shell/currentcontainmentactionsmodel.cpp @@ -1,269 +1,278 @@ /* * Copyright 2013 Marco Martin * * 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 "currentcontainmentactionsmodel.h" #include #include #include #include #include +#include +#include +#include #include #include #include #include #include #include #include CurrentContainmentActionsModel::CurrentContainmentActionsModel(Plasma::Containment *cotainment, QObject *parent) : QStandardItemModel(parent), m_containment(cotainment), m_tempConfigParent(QString(), KConfig::SimpleConfig) { m_baseCfg = KConfigGroup(m_containment->corona()->config(), "ActionPlugins"); m_baseCfg = KConfigGroup(&m_baseCfg, QString::number(m_containment->containmentType())); QHash actions = cotainment->containmentActions(); QHashIterator i(actions); while (i.hasNext()) { i.next(); QStandardItem *item = new QStandardItem(); item->setData(i.key(), ActionRole); item->setData(i.value()->pluginInfo().pluginName(), PluginNameRole); m_plugins[i.key()] = Plasma::PluginLoader::self()->loadContainmentActions(m_containment, i.value()->pluginInfo().pluginName()); m_plugins[i.key()]->setContainment(m_containment); KConfigGroup cfg(&m_baseCfg, i.key()); m_plugins[i.key()]->restore(cfg); item->setData(m_plugins[i.key()]->pluginInfo().property(QStringLiteral("X-Plasma-HasConfigurationInterface")).toBool(), HasConfigurationInterfaceRole); appendRow(item); } } CurrentContainmentActionsModel::~CurrentContainmentActionsModel() { } QHash CurrentContainmentActionsModel::roleNames() const { return { { ActionRole, "action" }, { PluginNameRole, "pluginName" }, { HasConfigurationInterfaceRole, "hasConfigurationInterface" } }; } QString CurrentContainmentActionsModel::mouseEventString(int mouseButton, int modifiers) { QMouseEvent *mouse = new QMouseEvent(QEvent::MouseButtonRelease, QPoint(), (Qt::MouseButton)mouseButton, (Qt::MouseButton)mouseButton, (Qt::KeyboardModifiers) modifiers); QString string = Plasma::ContainmentActions::eventToString(mouse); delete mouse; return string; } QString CurrentContainmentActionsModel::wheelEventString(const QPointF &delta, int mouseButtons, int modifiers) { QWheelEvent *wheel = new QWheelEvent(QPointF(), QPointF(), delta.toPoint(), QPoint(), 0, qAbs(delta.x()) > qAbs(delta.y()) ? Qt::Horizontal : Qt::Vertical, (Qt::MouseButtons)mouseButtons, (Qt::KeyboardModifiers) modifiers); QString string = Plasma::ContainmentActions::eventToString(wheel); delete wheel; return string; } bool CurrentContainmentActionsModel::isTriggerUsed(const QString &trigger) { return m_plugins.contains(trigger); } bool CurrentContainmentActionsModel::append(const QString &action, const QString &plugin) { if (m_plugins.contains(action)) { return false; } QStandardItem *item = new QStandardItem(); item->setData(action, ActionRole); item->setData(plugin, PluginNameRole); Plasma::ContainmentActions *actions = Plasma::PluginLoader::self()->loadContainmentActions(m_containment, plugin); if (!actions) { return false; } m_plugins[action] = actions; m_plugins[action]->setContainment(m_containment); //empty config: the new one will ne in default state KConfigGroup tempConfig(&m_tempConfigParent, "test"); m_plugins[action]->restore(tempConfig); item->setData(m_plugins[action]->pluginInfo().property(QStringLiteral("X-Plasma-HasConfigurationInterface")).toBool(), HasConfigurationInterfaceRole); m_removedTriggers.removeAll(action); appendRow(item); return true; } void CurrentContainmentActionsModel::update(int row, const QString &action, const QString &plugin) { const QString oldPlugin = itemData(index(row, 0)).value(PluginNameRole).toString(); const QString oldTrigger = itemData(index(row, 0)).value(ActionRole).toString(); if (oldTrigger == action && oldPlugin == plugin) { return; } QModelIndex idx = index(row, 0); if (idx.isValid()) { setData(idx, action, ActionRole); setData(idx, plugin, PluginNameRole); delete m_plugins[oldTrigger]; m_plugins.remove(oldTrigger); if (oldPlugin != plugin) { m_removedTriggers << oldTrigger; } if (!m_plugins.contains(action) || oldPlugin != plugin) { delete m_plugins[action]; m_plugins[action] = Plasma::PluginLoader::self()->loadContainmentActions(m_containment, plugin); m_plugins[action]->setContainment(m_containment); //empty config: the new one will ne in default state KConfigGroup tempConfig(&m_tempConfigParent, "test"); m_plugins[action]->restore(tempConfig); setData(idx, m_plugins[action]->pluginInfo().property(QStringLiteral("X-Plasma-HasConfigurationInterface")).toBool(), HasConfigurationInterfaceRole); } } } void CurrentContainmentActionsModel::remove(int row) { const QString action = itemData(index(row, 0)).value(ActionRole).toString(); removeRows(row, 1); if (m_plugins.contains(action)) { delete m_plugins[action]; m_plugins.remove(action); m_removedTriggers << action; } } void CurrentContainmentActionsModel::showConfiguration(int row) { const QString action = itemData(index(row, 0)).value(ActionRole).toString(); if (!m_plugins.contains(action)) { return; } QDialog *configDlg = new QDialog(); configDlg->setAttribute(Qt::WA_DeleteOnClose); QLayout *lay = new QVBoxLayout(configDlg); configDlg->setLayout(lay); configDlg->setWindowModality(Qt::WindowModal); Plasma::ContainmentActions *pluginInstance = m_plugins[action]; //put the config in the dialog QWidget *w = pluginInstance->createConfigurationInterface(configDlg); QString title; if (w) { lay->addWidget(w); title = w->windowTitle(); } configDlg->setWindowTitle(title.isEmpty() ? i18n("Configure Mouse Actions Plugin") :title); //put buttons below QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, configDlg); lay->addWidget(buttons); connect(buttons, &QDialogButtonBox::accepted, configDlg, &QDialog::accept); connect(buttons, &QDialogButtonBox::rejected, configDlg, &QDialog::reject); QObject::connect(configDlg, &QDialog::accepted, pluginInstance, [configDlg, pluginInstance] () { pluginInstance->configurationAccepted(); }); connect(pluginInstance, &QObject::destroyed, configDlg, &QDialog::reject); configDlg->show(); } -void CurrentContainmentActionsModel::showAbout(int row) +void CurrentContainmentActionsModel::showAbout(int row, QQuickItem *ctx) { const QString action = itemData(index(row, 0)).value(ActionRole).toString(); if (!m_plugins.contains(action)) { return; } KPluginInfo info = m_plugins[action]->pluginInfo(); KAboutData aboutData(info.name().toUtf8(), ki18n(info.name().toUtf8()).toString(), info.version().toUtf8(), ki18n(info.comment().toUtf8()).toString(), KAboutLicense::byKeyword(info.license()).key(), QByteArray(), QByteArray(), info.website().toLatin1(), info.email().toLatin1()); aboutData.addAuthor(ki18n(info.author().toUtf8()).toString(), QByteArray(), info.email().toLatin1()); KAboutApplicationDialog *aboutDialog = new KAboutApplicationDialog(aboutData, qobject_cast(parent())); aboutDialog->setWindowIcon(QIcon::fromTheme(info.icon())); aboutDialog->setAttribute(Qt::WA_DeleteOnClose); + + if (ctx && ctx->window()) { + aboutDialog->setWindowModality(Qt::WindowModal); + aboutDialog->winId(); // so it creates the windowHandle(); + aboutDialog->windowHandle()->setTransientParent(ctx->window()); + } aboutDialog->show(); } void CurrentContainmentActionsModel::save() { foreach (const QString &removedTrigger, m_removedTriggers) { m_containment->setContainmentActions(removedTrigger, QString()); } m_removedTriggers.clear(); QHashIterator i(m_plugins); while (i.hasNext()) { i.next(); KConfigGroup cfg(&m_baseCfg, i.key()); i.value()->save(cfg); m_containment->setContainmentActions(i.key(), i.value()->pluginInfo().pluginName()); } } #include "private/moc_currentcontainmentactionsmodel.cpp" diff --git a/shell/currentcontainmentactionsmodel.h b/shell/currentcontainmentactionsmodel.h index a445d95b7..7c926e4b6 100644 --- a/shell/currentcontainmentactionsmodel.h +++ b/shell/currentcontainmentactionsmodel.h @@ -1,70 +1,72 @@ /* * Copyright 2013 Marco Martin * * 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 CURRENTCONTAINMENTACTIONSMODEL_H #define CURRENTCONTAINMENTACTIONSMODEL_H #include #include #include namespace Plasma { class Containment; class ContainmentActions; } +class QQuickItem; + //This model load the data about available containment actions plugins, such as context menus that can be loaded on mouse click //TODO: out of the library? class CurrentContainmentActionsModel : public QStandardItemModel { Q_OBJECT public: enum Roles { ActionRole = Qt::UserRole+1, PluginNameRole, HasConfigurationInterfaceRole }; CurrentContainmentActionsModel(Plasma::Containment *cotainment, QObject *parent = 0); ~CurrentContainmentActionsModel() override; QHash roleNames() const override; Q_INVOKABLE bool isTriggerUsed(const QString &trigger); Q_INVOKABLE QString mouseEventString(int mouseButtons, int modifiers); Q_INVOKABLE QString wheelEventString(const QPointF &delta, int mouseButtons, int modifiers); Q_INVOKABLE bool append(const QString &action, const QString &plugin); Q_INVOKABLE void update(int row, const QString &action, const QString &plugin); Q_INVOKABLE void remove(int row); Q_INVOKABLE void showConfiguration(int row); - Q_INVOKABLE void showAbout(int row); + Q_INVOKABLE void showAbout(int row, QQuickItem *ctx = nullptr); Q_INVOKABLE void save(); private: Plasma::Containment *m_containment; QHash m_plugins; KConfigGroup m_baseCfg; KConfigGroup m_tempConfig; KConfig m_tempConfigParent; QStringList m_removedTriggers; }; #endif