/* * Copyright (c) 2004 Lubos Lunak * * 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 #include #include #include #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() { for (QVector< Rules* >::Iterator it = rules.begin(); it != rules.end(); ++it) delete *it; 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); rules.insert(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(rules[ pos ], {}, false); if (rule == rules[ pos ]) return; delete rules[ pos ]; rules[ pos ] = rule; rules_listbox->item(pos)->setText(rule->description); emit changed(true); } void KCMRulesList::deleteClicked() { int pos = rules_listbox->currentRow(); assert(pos != -1); delete rules_listbox->takeItem(pos); rules.erase(rules.begin() + pos); emit changed(true); } void KCMRulesList::moveupClicked() { int pos = rules_listbox->currentRow(); 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 = rules[ pos ]; rules[ pos ] = rules[ pos - 1 ]; rules[ pos - 1 ] = rule; } emit changed(true); } void KCMRulesList::movedownClicked() { int pos = rules_listbox->currentRow(); 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 = rules[ pos ]; rules[ pos ] = rules[ pos + 1 ]; rules[ pos + 1 ] = rule; } emit changed(true); } void KCMRulesList::exportClicked() { int pos = rules_listbox->currentRow(); assert(pos != -1); QString path = QFileDialog::getSaveFileName(this, i18n("Export Rules"), QDir::home().absolutePath(), i18n("KWin Rules (*.kwinrule)")); if (path.isEmpty()) return; KConfig config(path, KConfig::SimpleConfig); KConfigGroup group(&config, rules[pos]->description); group.deleteGroup(); rules[pos]->write(group); } void KCMRulesList::importClicked() { QString path = QFileDialog::getOpenFileName(this, i18n("Import Rules"), QDir::home().absolutePath(), i18n("KWin Rules (*.kwinrule)")); if (path.isEmpty()) return; KConfig config(path, KConfig::SimpleConfig); QStringList groups = config.groupList(); if (groups.isEmpty()) return; int pos = qMax(0, rules_listbox->currentRow()); foreach (const QString &group, groups) { KConfigGroup grp(&config, group); const bool remove = grp.readEntry("DeleteRule", false); Rules* new_rule = new Rules(grp); // try to replace existing rule first for (int i = 0; i < rules.count(); ++i) { if (rules[i]->description == new_rule->description) { delete rules[i]; if (remove) { rules.remove(i); delete rules_listbox->takeItem(i); delete new_rule; pos = qMax(0, rules_listbox->currentRow()); // might have changed! } else 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) { rules.insert(pos, new_rule); rules_listbox->insertItem(pos++, new_rule->description); } } emit changed(true); } void KCMRulesList::load() { rules_listbox->clear(); for (QVector< Rules* >::Iterator it = rules.begin(); it != rules.end(); ++it) delete *it; rules.clear(); KConfig _cfg("kwinrulesrc"); KConfigGroup cfg(&_cfg, "General"); int count = cfg.readEntry("count", 0); rules.reserve(count); for (int i = 1; i <= count; ++i) { cfg = KConfigGroup(&_cfg, QString::number(i)); Rules* rule = new Rules(cfg); rules.append(rule); rules_listbox->addItem(rule->description); } if (rules.count() > 0) rules_listbox->setCurrentItem(rules_listbox->item(0)); else rules_listbox->setCurrentItem(nullptr); activeChanged(); } void KCMRulesList::save() { KConfig cfg(QLatin1String("kwinrulesrc")); QStringList groups = cfg.groupList(); for (QStringList::ConstIterator it = groups.constBegin(); it != groups.constEnd(); ++it) cfg.deleteGroup(*it); cfg.group("General").writeEntry("count", rules.count()); int i = 1; for (QVector< Rules* >::ConstIterator it = rules.constBegin(); it != rules.constEnd(); ++it) { KConfigGroup cg(&cfg, QString::number(i)); (*it)->write(cg); ++i; } } void KCMRulesList::defaults() { load(); } } // namespace