mirror of
https://bitbucket.org/smil3y/kde-workspace.git
synced 2025-02-23 18:32:50 +00:00
198 lines
7.3 KiB
C++
198 lines
7.3 KiB
C++
/*
|
|
* Copyright (c) 2009 Chani Armitage <chani@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 "mouseplugins.h"
|
|
#include "mousepluginwidget.h"
|
|
#include "mouseinputbutton.h"
|
|
|
|
#include <KConfigDialog>
|
|
#include <KDebug>
|
|
#include <KMessageBox>
|
|
|
|
#include <Plasma/Containment>
|
|
#include <plasma/containmentactions.h>
|
|
|
|
MousePlugins::MousePlugins(Plasma::Containment *containment, KConfigDialog *parent)
|
|
:QWidget(parent),
|
|
m_containment(containment)
|
|
{
|
|
Q_ASSERT(m_containment);
|
|
m_ui.setupUi(this);
|
|
m_ui.addButton->setIcon(KIcon("list-add"));
|
|
m_ui.addButton->setDefaultText(i18n("Add Action..."), i18n("Add another mouse action"));
|
|
QGridLayout *lay = qobject_cast<QGridLayout*>(m_ui.pluginList->layout());
|
|
lay->setMargin(0);
|
|
lay->setColumnStretch(1, 1); //make the plugin list take the extra space
|
|
|
|
//stupid hack because you can't *insert* rows into a gridlayout
|
|
lay->removeWidget(m_ui.addButton);
|
|
lay->removeItem(m_ui.verticalSpacer);
|
|
|
|
foreach (const QString &trigger, m_containment->containmentActionsTriggers()) {
|
|
QString plugin = m_containment->containmentActions(trigger);
|
|
if (!plugin.isEmpty()) {
|
|
MousePluginWidget *item = new MousePluginWidget(plugin, trigger, lay, this);
|
|
item->setContainment(m_containment);
|
|
connect(parent, SIGNAL(containmentPluginChanged(Plasma::Containment*)), item, SLOT(setContainment(Plasma::Containment*)));
|
|
connect(item, SIGNAL(triggerChanged(QString,QString)), this, SLOT(setTrigger(QString,QString)));
|
|
connect(item, SIGNAL(configChanged(QString)), this, SLOT(configChanged(QString)));
|
|
m_plugins.insert(trigger, item); //FIXME what kind of pointer?
|
|
}
|
|
}
|
|
|
|
//stupid hack because you can't *insert* rows into a gridlayout
|
|
lay->addWidget(m_ui.addButton, lay->rowCount(), 0);
|
|
lay->addItem(m_ui.verticalSpacer, lay->rowCount(), 0);
|
|
|
|
connect(m_ui.addButton, SIGNAL(triggerChanged(QString,QString)), this, SLOT(addTrigger(QString,QString)));
|
|
connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
|
|
connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
|
|
connect(parent, SIGNAL(containmentPluginChanged(Plasma::Containment*)), this, SLOT(containmentPluginChanged(Plasma::Containment*)));
|
|
}
|
|
|
|
MousePlugins::~MousePlugins()
|
|
{
|
|
}
|
|
|
|
void MousePlugins::addTrigger(const QString&, const QString &trigger)
|
|
{
|
|
m_ui.addButton->reset();
|
|
|
|
//check for duplicate
|
|
if (m_plugins.contains(trigger)) {
|
|
int ret = KMessageBox::warningContinueCancel(this,
|
|
i18n("This trigger is already assigned to another action."), QString(), KGuiItem(i18nc("reassign to this action", "Reassign")));
|
|
if (ret == KMessageBox::Continue) {
|
|
//clear it from the UI
|
|
MousePluginWidget *w = m_plugins.value(trigger);
|
|
Q_ASSERT(w);
|
|
w->setTrigger(QString());
|
|
} else {
|
|
//don't add anything
|
|
return;
|
|
}
|
|
}
|
|
|
|
QGridLayout *lay = qobject_cast<QGridLayout*>(m_ui.pluginList->layout());
|
|
|
|
//stupid hack because you can't *insert* rows into a gridlayout
|
|
lay->removeWidget(m_ui.addButton);
|
|
lay->removeItem(m_ui.verticalSpacer);
|
|
|
|
//insert a new row
|
|
MousePluginWidget *item = new MousePluginWidget(QString(), trigger, lay, this);
|
|
item->setContainment(m_containment);
|
|
connect(parent(), SIGNAL(containmentPluginChanged(Plasma::Containment*)), item, SLOT(setContainment(Plasma::Containment*)));
|
|
connect(item, SIGNAL(triggerChanged(QString,QString)), this, SLOT(setTrigger(QString,QString)));
|
|
connect(item, SIGNAL(configChanged(QString)), this, SLOT(configChanged(QString)));
|
|
m_plugins.insert(trigger, item); //FIXME what kind of pointer?
|
|
m_modifiedKeys << trigger;
|
|
|
|
//stupid hack because you can't *insert* rows into a gridlayout
|
|
lay->addWidget(m_ui.addButton, lay->rowCount(), 0);
|
|
lay->addItem(m_ui.verticalSpacer, lay->rowCount(), 0);
|
|
|
|
emit modified(true);
|
|
}
|
|
|
|
void MousePlugins::configChanged(const QString &trigger)
|
|
{
|
|
m_modifiedKeys << trigger;
|
|
emit modified(true);
|
|
}
|
|
|
|
void MousePlugins::configAccepted()
|
|
{
|
|
//FIXME there has *got* to be a more efficient way...
|
|
//let them back up their config
|
|
foreach (const QString &trigger, m_modifiedKeys) {
|
|
MousePluginWidget *p = m_plugins.value(trigger);
|
|
if (p) {
|
|
p->prepareForSave();
|
|
}
|
|
}
|
|
|
|
KConfigGroup baseCfg = m_containment->containmentActionsConfig();
|
|
foreach (const QString &trigger, m_modifiedKeys) {
|
|
//delete any old config (who knows what it could be from)
|
|
KConfigGroup cfg = KConfigGroup(&baseCfg, trigger);
|
|
cfg.deleteGroup();
|
|
//save the new config
|
|
MousePluginWidget *p = m_plugins.value(trigger);
|
|
if (p) {
|
|
p->save();
|
|
} else {
|
|
m_containment->setContainmentActions(trigger, QString());
|
|
}
|
|
}
|
|
|
|
m_modifiedKeys.clear();
|
|
}
|
|
|
|
void MousePlugins::setTrigger(const QString &oldTrigger, const QString &newTrigger)
|
|
{
|
|
if (newTrigger == oldTrigger) {
|
|
return;
|
|
}
|
|
|
|
MousePluginWidget *plugin = qobject_cast<MousePluginWidget*>(sender());
|
|
Q_ASSERT(plugin);
|
|
if (!newTrigger.isEmpty() && m_plugins.contains(newTrigger)) {
|
|
int ret = KMessageBox::warningContinueCancel(this,
|
|
i18n("This trigger is assigned to another plugin."), QString(), KGuiItem(i18nc("reassign to this plugin", "Reassign")));
|
|
if (ret == KMessageBox::Continue) {
|
|
//clear it from the UI
|
|
MousePluginWidget *w = m_plugins.value(newTrigger);
|
|
Q_ASSERT(w);
|
|
w->setTrigger(QString());
|
|
} else {
|
|
//undo
|
|
plugin->setTrigger(oldTrigger);
|
|
return;
|
|
}
|
|
}
|
|
//FIXME we can't just remove them now, they're pointers!
|
|
//...or can we? can we get them back when they set a trigger again?
|
|
//er, that plugin string coming in.. that's not what we wanna set any more.
|
|
//tbh we never needed it.. unless there was no old trigger.
|
|
//so... uhm.. yes. we're now always going to yank the sender from this. feels wrong.
|
|
|
|
if (!oldTrigger.isEmpty()) {
|
|
m_plugins.remove(oldTrigger);
|
|
m_modifiedKeys << oldTrigger;
|
|
}
|
|
if (!newTrigger.isEmpty()) {
|
|
m_plugins.insert(newTrigger, plugin);
|
|
m_modifiedKeys << newTrigger;
|
|
}
|
|
|
|
emit modified(true);
|
|
}
|
|
|
|
|
|
//FIXME this function assumes only the containment plugin is changing, not the config.
|
|
//so, no switching activities.
|
|
//if the config location *was* changed we'd have to figure out what to do with unsaved changes!
|
|
void MousePlugins::containmentPluginChanged(Plasma::Containment *c)
|
|
{
|
|
kDebug() << "!!!!!!!!!";
|
|
Q_ASSERT(c);
|
|
m_containment=c;
|
|
}
|
|
|