kwin/kcmkwin/kwinrules/ruleslist.cpp
Henri Chain 518c85e91e Remove default button on kwinrules KCM
Summary:
The "default" button was behaving the same as "reset" which was unnecessary and confusing.

As the only settings are the list of rules, the only meaning "default" could have is to clear all the rules, which is probably not what the user would want. So I think the best course of action is to remove the button.

Reviewers: zzag, meven, crossi, bport, ervin

Reviewed By: zzag

Subscribers: kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D28071
2020-03-16 17:11:01 +01:00

233 lines
7.2 KiB
C++

/*
* Copyright (c) 2004 Lubos Lunak <l.lunak@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.
*/
#include "ruleslist.h"
#include <QDebug>
#include <kconfig.h>
#include <QFileDialog>
#include "../../rules.h"
#include "rulesettings.h"
#include "ruleswidget.h"
namespace KWin
{
KCMRulesList::KCMRulesList(QWidget* parent)
: QWidget(parent)
{
setupUi(this);
// connect both current/selected, so that current==selected (stupid QListBox :( )
connect(rules_listbox, SIGNAL(itemChanged(QListWidgetItem*)),
SLOT(activeChanged()));
connect(rules_listbox, SIGNAL(itemSelectionChanged()),
SLOT(activeChanged()));
connect(new_button, SIGNAL(clicked()),
SLOT(newClicked()));
connect(modify_button, SIGNAL(clicked()),
SLOT(modifyClicked()));
connect(delete_button, SIGNAL(clicked()),
SLOT(deleteClicked()));
connect(moveup_button, SIGNAL(clicked()),
SLOT(moveupClicked()));
connect(movedown_button, SIGNAL(clicked()),
SLOT(movedownClicked()));
connect(export_button, SIGNAL(clicked()),
SLOT(exportClicked()));
connect(import_button, SIGNAL(clicked()),
SLOT(importClicked()));
connect(rules_listbox, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
SLOT(modifyClicked()));
load();
}
KCMRulesList::~KCMRulesList()
{
qDeleteAll(m_rules);
m_rules.clear();
}
void KCMRulesList::activeChanged()
{
QListWidgetItem *item = rules_listbox->currentItem();
int itemRow = rules_listbox->row(item);
if (item != nullptr) // make current==selected
rules_listbox->setCurrentItem(item, QItemSelectionModel::ClearAndSelect);
modify_button->setEnabled(item != nullptr);
delete_button->setEnabled(item != nullptr);
export_button->setEnabled(item != nullptr);
moveup_button->setEnabled(item != nullptr && itemRow > 0);
movedown_button->setEnabled(item != nullptr && itemRow < (rules_listbox->count() - 1));
}
void KCMRulesList::newClicked()
{
RulesDialog dlg(this);
Rules* rule = dlg.edit(nullptr, {}, false);
if (rule == nullptr)
return;
int pos = rules_listbox->currentRow() + 1;
rules_listbox->insertItem(pos , rule->description);
rules_listbox->setCurrentRow(pos, QItemSelectionModel::ClearAndSelect);
m_rules.insert(m_rules.begin() + pos, rule);
emit changed(true);
}
void KCMRulesList::modifyClicked()
{
int pos = rules_listbox->currentRow();
if (pos == -1)
return;
RulesDialog dlg(this);
Rules *rule = dlg.edit(m_rules[pos], {}, false);
if (rule == m_rules[pos])
return;
delete m_rules[pos];
m_rules[pos] = rule;
rules_listbox->item(pos)->setText(rule->description);
emit changed(true);
}
void KCMRulesList::deleteClicked()
{
int pos = rules_listbox->currentRow();
Q_ASSERT(pos != -1);
delete rules_listbox->takeItem(pos);
m_rules.erase(m_rules.begin() + pos);
emit changed(true);
}
void KCMRulesList::moveupClicked()
{
int pos = rules_listbox->currentRow();
Q_ASSERT(pos != -1);
if (pos > 0) {
QListWidgetItem * item = rules_listbox->takeItem(pos);
rules_listbox->insertItem(pos - 1 , item);
rules_listbox->setCurrentItem(item, QItemSelectionModel::ClearAndSelect);
Rules *rule = m_rules[pos];
m_rules[pos] = m_rules[pos - 1];
m_rules[pos - 1] = rule;
}
emit changed(true);
}
void KCMRulesList::movedownClicked()
{
int pos = rules_listbox->currentRow();
Q_ASSERT(pos != -1);
if (pos < int(rules_listbox->count()) - 1) {
QListWidgetItem * item = rules_listbox->takeItem(pos);
rules_listbox->insertItem(pos + 1 , item);
rules_listbox->setCurrentItem(item, QItemSelectionModel::ClearAndSelect);
Rules *rule = m_rules[pos];
m_rules[pos] = m_rules[pos + 1];
m_rules[pos + 1] = rule;
}
emit changed(true);
}
void KCMRulesList::exportClicked()
{
int pos = rules_listbox->currentRow();
Q_ASSERT(pos != -1);
QString path = QFileDialog::getSaveFileName(this, i18n("Export Rules"), QDir::home().absolutePath(),
i18n("KWin Rules (*.kwinrule)"));
if (path.isEmpty())
return;
const auto cfg = KSharedConfig::openConfig(path, KConfig::SimpleConfig);
RuleSettings settings(cfg, m_rules[pos]->description);
settings.setDefaults();
m_rules[pos]->write(&settings);
settings.save();
}
void KCMRulesList::importClicked()
{
QString path = QFileDialog::getOpenFileName(this, i18n("Import Rules"), QDir::home().absolutePath(),
i18n("KWin Rules (*.kwinrule)"));
if (path.isEmpty())
return;
const auto config = KSharedConfig::openConfig(path, KConfig::SimpleConfig);
QStringList groups = config->groupList();
if (groups.isEmpty())
return;
int pos = qMax(0, rules_listbox->currentRow());
for (const QString &group : groups) {
RuleSettings settings(config, group);
const bool remove = settings.deleteRule();
Rules *new_rule = new Rules(&settings);
// try to replace existing rule first
for (int i = 0; i < m_rules.count(); ++i) {
if (m_rules[i]->description == new_rule->description) {
delete m_rules[i];
if (remove) {
m_rules.remove(i);
delete rules_listbox->takeItem(i);
delete new_rule;
pos = qMax(0, rules_listbox->currentRow()); // might have changed!
} else
m_rules[i] = new_rule;
new_rule = nullptr;
break;
}
}
// don't add "to be deleted" if not present
if (remove) {
delete new_rule;
new_rule = nullptr;
}
// plain insertion
if (new_rule) {
m_rules.insert(pos, new_rule);
rules_listbox->insertItem(pos++, new_rule->description);
}
}
emit changed(true);
}
void KCMRulesList::load()
{
rules_listbox->clear();
m_settings.load();
m_rules = m_settings.rules();
for (const auto rule : qAsConst(m_rules)) {
rules_listbox->addItem(rule->description);
}
if (m_rules.count() > 0)
rules_listbox->setCurrentItem(rules_listbox->item(0));
else
rules_listbox->setCurrentItem(nullptr);
activeChanged();
}
void KCMRulesList::save()
{
m_settings.setRules(m_rules);
m_settings.save();
}
} // namespace