X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fbufferviewsettingspage.cpp;h=233016b3ae9cdfb5a615f3b3c02fec350ffb9570;hp=76e461e9a7f4633d80787f49946430e1ef7e0d08;hb=1f21c1f9613031ae263eeed0c4883bfcd5488343;hpb=3af9d3aeccfac1218ad3342434e5fda0c4ad1266 diff --git a/src/qtui/settingspages/bufferviewsettingspage.cpp b/src/qtui/settingspages/bufferviewsettingspage.cpp index 76e461e9..233016b3 100644 --- a/src/qtui/settingspages/bufferviewsettingspage.cpp +++ b/src/qtui/settingspages/bufferviewsettingspage.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel IRC Team * + * Copyright (C) 2005-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,516 +15,566 @@ * 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., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "bufferviewsettingspage.h" +#include +#include + #include -#include "client.h" -#include "iconloader.h" -#include "network.h" +#include "buffermodel.h" #include "bufferviewconfig.h" #include "bufferviewfilter.h" -#include "bufferviewmanager.h" -#include "buffermodel.h" +#include "client.h" +#include "clientbufferviewmanager.h" +#include "icon.h" +#include "network.h" #include "networkmodel.h" +#include "util.h" -BufferViewSettingsPage::BufferViewSettingsPage(QWidget *parent) - : SettingsPage(tr("General"), tr("Buffer Views"), parent), - _ignoreWidgetChanges(false), - _useBufferViewHint(false), - _bufferViewHint(0) +BufferViewSettingsPage::BufferViewSettingsPage(QWidget* parent) + : SettingsPage(tr("Interface"), tr("Custom Chat Lists"), parent) { - ui.setupUi(this); - ui.renameBufferView->setIcon(SmallIcon("edit-rename")); - ui.addBufferView->setIcon(SmallIcon("list-add")); - ui.deleteBufferView->setIcon(SmallIcon("edit-delete")); - - reset(); - - ui.bufferViewList->setSortingEnabled(true); - ui.settingsGroupBox->setEnabled(false); - ui.bufferViewPreview->setEnabled(false); - - coreConnectionStateChanged(Client::isConnected()); // need a core connection! - connect(Client::instance(), SIGNAL(coreConnectionStateChanged(bool)), this, SLOT(coreConnectionStateChanged(bool))); - connect(ui.bufferViewList->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), - this, SLOT(bufferViewSelectionChanged(const QItemSelection &, const QItemSelection &))); - - connect(ui.onlyStatusBuffers, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.onlyChannelBuffers, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.onlyQueryBuffers, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.addNewBuffersAutomatically, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.sortAlphabetically, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.hideInactiveBuffers, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.networkSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged())); - connect(ui.minimumActivitySelector, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged())); - - connect(ui.networkSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(enableStatusBuffers(int))); -} + ui.setupUi(this); + // Hide the hide inactive networks feature on older cores (which won't save the setting) + if (!Client::isCoreFeatureEnabled(Quassel::Feature::HideInactiveNetworks)) + ui.hideInactiveNetworks->hide(); + + ui.renameBufferView->setIcon(icon::get("edit-rename")); + ui.addBufferView->setIcon(icon::get("list-add")); + ui.deleteBufferView->setIcon(icon::get("edit-delete")); + + reset(); -BufferViewSettingsPage::~BufferViewSettingsPage() { - reset(); + ui.bufferViewList->setSortingEnabled(true); + ui.settingsGroupBox->setEnabled(false); + ui.bufferViewPreview->setEnabled(false); + + coreConnectionStateChanged(Client::isConnected()); // need a core connection! + connect(Client::instance(), &Client::coreConnectionStateChanged, this, &BufferViewSettingsPage::coreConnectionStateChanged); + connect(ui.bufferViewList->selectionModel(), + &QItemSelectionModel::selectionChanged, + this, + &BufferViewSettingsPage::bufferViewSelectionChanged); + + connect(ui.onlyStatusBuffers, &QAbstractButton::clicked, this, &BufferViewSettingsPage::widgetHasChanged); + connect(ui.onlyChannelBuffers, &QAbstractButton::clicked, this, &BufferViewSettingsPage::widgetHasChanged); + connect(ui.onlyQueryBuffers, &QAbstractButton::clicked, this, &BufferViewSettingsPage::widgetHasChanged); + connect(ui.addNewBuffersAutomatically, &QAbstractButton::clicked, this, &BufferViewSettingsPage::widgetHasChanged); + connect(ui.sortAlphabetically, &QAbstractButton::clicked, this, &BufferViewSettingsPage::widgetHasChanged); + connect(ui.hideInactiveBuffers, &QAbstractButton::clicked, this, &BufferViewSettingsPage::widgetHasChanged); + connect(ui.hideInactiveNetworks, &QAbstractButton::clicked, this, &BufferViewSettingsPage::widgetHasChanged); + connect(ui.networkSelector, selectOverload(&QComboBox::currentIndexChanged), this, &BufferViewSettingsPage::widgetHasChanged); + connect(ui.minimumActivitySelector, selectOverload(&QComboBox::currentIndexChanged), this, &BufferViewSettingsPage::widgetHasChanged); + connect(ui.showSearch, &QAbstractButton::clicked, this, &BufferViewSettingsPage::widgetHasChanged); + + connect(ui.networkSelector, selectOverload(&QComboBox::currentIndexChanged), this, &BufferViewSettingsPage::enableStatusBuffers); } -void BufferViewSettingsPage::reset() { - ui.bufferViewList->clear(); - ui.deleteBufferView->setEnabled(false); +BufferViewSettingsPage::~BufferViewSettingsPage() +{ + reset(); +} - QHash::iterator changedConfigIter = _changedBufferViews.begin(); - QHash::iterator changedConfigIterEnd = _changedBufferViews.end(); - BufferViewConfig *config; - while(changedConfigIter != changedConfigIterEnd) { - config = changedConfigIter.value(); - changedConfigIter = _changedBufferViews.erase(changedConfigIter); - config->deleteLater(); - } +void BufferViewSettingsPage::reset() +{ + ui.bufferViewList->clear(); + ui.deleteBufferView->setEnabled(false); + + QHash::iterator changedConfigIter = _changedBufferViews.begin(); + QHash::iterator changedConfigIterEnd = _changedBufferViews.end(); + BufferViewConfig* config; + while (changedConfigIter != changedConfigIterEnd) { + config = changedConfigIter.value(); + changedConfigIter = _changedBufferViews.erase(changedConfigIter); + config->deleteLater(); + } - QList::iterator newConfigIter = _newBufferViews.begin(); - QList::iterator newConfigIterEnd = _newBufferViews.end(); - while(newConfigIter != newConfigIterEnd) { - config = *newConfigIter; - newConfigIter = _newBufferViews.erase(newConfigIter); - config->deleteLater(); - } + QList::iterator newConfigIter = _newBufferViews.begin(); + QList::iterator newConfigIterEnd = _newBufferViews.end(); + while (newConfigIter != newConfigIterEnd) { + config = *newConfigIter; + newConfigIter = _newBufferViews.erase(newConfigIter); + config->deleteLater(); + } - _deleteBufferViews.clear(); + _deleteBufferViews.clear(); - _useBufferViewHint = false; + _useBufferViewHint = false; - setChangedState(false); + setChangedState(false); } -void BufferViewSettingsPage::load() { - bool useBufferViewHint = _useBufferViewHint; - int bufferViewHint = _bufferViewHint; - reset(); - - if(!Client::bufferViewManager()) - return; - - const QList bufferViewConfigs = Client::bufferViewManager()->bufferViewConfigs(); - foreach(BufferViewConfig *bufferViewConfig, bufferViewConfigs) { - addBufferView(bufferViewConfig); - } - - _ignoreWidgetChanges = true; - // load network selector - ui.networkSelector->clear(); - ui.networkSelector->addItem(tr("All")); - ui.networkSelector->setItemData(0, qVariantFromValue(NetworkId())); - const Network *net; - foreach(NetworkId netId, Client::networkIds()) { - net = Client::network(netId); - ui.networkSelector->addItem(net->networkName()); - ui.networkSelector->setItemData(ui.networkSelector->count() - 1, qVariantFromValue(net->networkId())); - } - _ignoreWidgetChanges = false; - - - if(!useBufferViewHint || !selectBufferViewById(bufferViewHint)) - ui.bufferViewList->setCurrentRow(0); -} +void BufferViewSettingsPage::load() +{ + bool useBufferViewHint = _useBufferViewHint; + int bufferViewHint = _bufferViewHint; + reset(); + + if (!Client::bufferViewManager()) + return; -void BufferViewSettingsPage::save() { - setEnabled(false); - - BufferViewConfig *currentConfig = bufferView(ui.bufferViewList->currentRow()); - if(currentConfig) { - _useBufferViewHint = true; - _bufferViewHint = currentConfig->bufferViewId(); - } - - QVariantList newConfigs; - QVariantList deleteConfigs; - QVariantList changedConfigs; - - foreach(int bufferId, _deleteBufferViews) { - deleteConfigs << bufferId; - } - _deleteBufferViews.clear(); - if(Client::bufferViewManager()) { - Client::bufferViewManager()->requestDeleteBufferViews(deleteConfigs); - } - - QHash::iterator changedConfigIter = _changedBufferViews.begin(); - QHash::iterator changedConfigIterEnd = _changedBufferViews.end(); - BufferViewConfig *config, *changedConfig; - while(changedConfigIter != changedConfigIterEnd) { - config = changedConfigIter.key(); - changedConfig = changedConfigIter.value(); - changedConfigIter = _changedBufferViews.erase(changedConfigIter); - config->requestUpdate(changedConfig->toVariantMap()); - changedConfig->deleteLater(); - } - - QList::iterator newConfigIter = _newBufferViews.begin(); - QList::iterator newConfigIterEnd = _newBufferViews.end(); - while(newConfigIter != newConfigIterEnd) { - config = *newConfigIter; - newConfigIter = _newBufferViews.erase(newConfigIter); - newConfigs << config->toVariantMap(); - config->deleteLater(); - } - if(Client::bufferViewManager()) { - Client::bufferViewManager()->requestCreateBufferViews(newConfigs); - } - - load(); - setEnabled(true); + const QList bufferViewConfigs = Client::bufferViewManager()->bufferViewConfigs(); + foreach (BufferViewConfig* bufferViewConfig, bufferViewConfigs) { + addBufferView(bufferViewConfig); + } + + _ignoreWidgetChanges = true; + // load network selector + ui.networkSelector->clear(); + ui.networkSelector->addItem(tr("All")); + ui.networkSelector->setItemData(0, QVariant::fromValue(NetworkId())); + const Network* net; + foreach (NetworkId netId, Client::networkIds()) { + net = Client::network(netId); + ui.networkSelector->addItem(net->networkName()); + ui.networkSelector->setItemData(ui.networkSelector->count() - 1, QVariant::fromValue(net->networkId())); + } + _ignoreWidgetChanges = false; + + if (!useBufferViewHint || !selectBufferViewById(bufferViewHint)) + ui.bufferViewList->setCurrentRow(0); } -void BufferViewSettingsPage::coreConnectionStateChanged(bool state) { - setEnabled(state); - if(state) { +void BufferViewSettingsPage::save() +{ + setEnabled(false); + + BufferViewConfig* currentConfig = bufferView(ui.bufferViewList->currentRow()); + if (currentConfig) { + _useBufferViewHint = true; + _bufferViewHint = currentConfig->bufferViewId(); + } + + QVariantList newConfigs; + QVariantList deleteConfigs; + QVariantList changedConfigs; + + foreach (int bufferId, _deleteBufferViews) { + deleteConfigs << bufferId; + } + _deleteBufferViews.clear(); + if (Client::bufferViewManager()) { + Client::bufferViewManager()->requestDeleteBufferViews(deleteConfigs); + } + + QHash::iterator changedConfigIter = _changedBufferViews.begin(); + QHash::iterator changedConfigIterEnd = _changedBufferViews.end(); + BufferViewConfig *config, *changedConfig; + while (changedConfigIter != changedConfigIterEnd) { + config = changedConfigIter.key(); + changedConfig = changedConfigIter.value(); + changedConfigIter = _changedBufferViews.erase(changedConfigIter); + config->requestUpdate(changedConfig->toVariantMap()); + changedConfig->deleteLater(); + } + + QList::iterator newConfigIter = _newBufferViews.begin(); + QList::iterator newConfigIterEnd = _newBufferViews.end(); + while (newConfigIter != newConfigIterEnd) { + config = *newConfigIter; + newConfigIter = _newBufferViews.erase(newConfigIter); + newConfigs << config->toVariantMap(); + config->deleteLater(); + } + if (Client::bufferViewManager()) { + Client::bufferViewManager()->requestCreateBufferViews(newConfigs); + } + load(); - connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigAdded(int)), this, SLOT(addBufferView(int))); - } else { - reset(); - } + setEnabled(true); +} + +void BufferViewSettingsPage::coreConnectionStateChanged(bool state) +{ + setEnabled(state); + if (state) { + load(); + connect(Client::bufferViewManager(), + selectOverload(&BufferViewManager::bufferViewConfigAdded), + this, + selectOverload(&BufferViewSettingsPage::addBufferView)); + } + else { + reset(); + } } -void BufferViewSettingsPage::addBufferView(BufferViewConfig *config) { - QListWidgetItem *item = new QListWidgetItem(config->bufferViewName(), ui.bufferViewList); - item->setData(Qt::UserRole, qVariantFromValue(qobject_cast(config))); - connect(config, SIGNAL(updatedRemotely()), this, SLOT(updateBufferView())); - connect(config, SIGNAL(destroyed()), this, SLOT(bufferViewDeleted())); - ui.deleteBufferView->setEnabled(ui.bufferViewList->count() > 1); +void BufferViewSettingsPage::addBufferView(BufferViewConfig* config) +{ + auto* item = new QListWidgetItem(config->bufferViewName(), ui.bufferViewList); + item->setData(Qt::UserRole, QVariant::fromValue(qobject_cast(config))); + connect(config, &SyncableObject::updatedRemotely, this, &BufferViewSettingsPage::updateBufferView); + connect(config, &QObject::destroyed, this, &BufferViewSettingsPage::bufferViewDeleted); + ui.deleteBufferView->setEnabled(ui.bufferViewList->count() > 1); } -void BufferViewSettingsPage::addBufferView(int bufferViewId) { - // we are informed about a new bufferview from Client::bufferViewManager() - Q_ASSERT(Client::bufferViewManager()); - addBufferView(Client::bufferViewManager()->bufferViewConfig(bufferViewId)); - selectBufferViewById(bufferViewId); +void BufferViewSettingsPage::addBufferView(int bufferViewId) +{ + // we are informed about a new bufferview from Client::bufferViewManager() + Q_ASSERT(Client::bufferViewManager()); + addBufferView(Client::bufferViewManager()->bufferViewConfig(bufferViewId)); + selectBufferViewById(bufferViewId); } -void BufferViewSettingsPage::bufferViewDeleted() { - BufferViewConfig *config = static_cast(sender()); - QObject *obj; - for(int i = 0; i < ui.bufferViewList->count(); i++) { - obj = ui.bufferViewList->item(i)->data(Qt::UserRole).value(); - if(config == static_cast(obj)) { - QListWidgetItem *item = ui.bufferViewList->takeItem(i); - delete item; - break; +void BufferViewSettingsPage::bufferViewDeleted() +{ + auto* config = static_cast(sender()); + QObject* obj; + for (int i = 0; i < ui.bufferViewList->count(); i++) { + obj = ui.bufferViewList->item(i)->data(Qt::UserRole).value(); + if (config == static_cast(obj)) { + QListWidgetItem* item = ui.bufferViewList->takeItem(i); + delete item; + break; + } } - } - ui.deleteBufferView->setEnabled(ui.bufferViewList->count() > 1); + ui.deleteBufferView->setEnabled(ui.bufferViewList->count() > 1); } -void BufferViewSettingsPage::newBufferView(const QString &bufferViewName) { - // id's of newly created bufferviews are negative (-1, -2... -n) - int fakeId = -1 * (_newBufferViews.count() + 1); - BufferViewConfig *config = new BufferViewConfig(fakeId); - config->setBufferViewName(bufferViewName); - config->setInitialized(); - QList bufferIds; - if(config->addNewBuffersAutomatically()) { - if(config->sortAlphabetically()) - bufferIds = Client::networkModel()->allBufferIdsSorted(); - else - bufferIds = Client::networkModel()->allBufferIds(); - } - config->initSetBufferList(bufferIds); +void BufferViewSettingsPage::newBufferView(const QString& bufferViewName) +{ + // id's of newly created bufferviews are negative (-1, -2... -n) + int fakeId = -1 * (_newBufferViews.count() + 1); + auto* config = new BufferViewConfig(fakeId); + config->setBufferViewName(bufferViewName); + config->setInitialized(); + QList bufferIds; + if (config->addNewBuffersAutomatically()) { + if (config->sortAlphabetically()) { + bufferIds = Client::networkModel()->allBufferIdsSorted(); + } + else { + bufferIds = Client::networkModel()->allBufferIds(); + std::sort(bufferIds.begin(), bufferIds.end()); + config->setProperty("OriginalBufferList", toVariantList(bufferIds)); + } + } + config->setBufferList(bufferIds); - _newBufferViews << config; - addBufferView(config); - ui.bufferViewList->setCurrentRow(listPos(config)); + _newBufferViews << config; + addBufferView(config); + ui.bufferViewList->setCurrentRow(listPos(config)); } -int BufferViewSettingsPage::listPos(BufferViewConfig *config) { - QObject *obj; - for(int i = 0; i < ui.bufferViewList->count(); i++) { - obj = ui.bufferViewList->item(i)->data(Qt::UserRole).value(); - if(config == qobject_cast(obj)) - return i; - } - return -1; +int BufferViewSettingsPage::listPos(BufferViewConfig* config) +{ + QObject* obj; + for (int i = 0; i < ui.bufferViewList->count(); i++) { + obj = ui.bufferViewList->item(i)->data(Qt::UserRole).value(); + if (config == qobject_cast(obj)) + return i; + } + return -1; } -BufferViewConfig *BufferViewSettingsPage::bufferView(int listPos) { - if(listPos < ui.bufferViewList->count() && listPos >= 0) { - QObject *obj = ui.bufferViewList->item(listPos)->data(Qt::UserRole).value(); - return qobject_cast(obj); - } else { - return 0; - } +BufferViewConfig* BufferViewSettingsPage::bufferView(int listPos) +{ + if (listPos < ui.bufferViewList->count() && listPos >= 0) { + auto* obj = ui.bufferViewList->item(listPos)->data(Qt::UserRole).value(); + return qobject_cast(obj); + } + else { + return nullptr; + } } -bool BufferViewSettingsPage::selectBufferViewById(int bufferViewId) { - BufferViewConfig *config; - for(int i = 0; i < ui.bufferViewList->count(); i++) { - config = qobject_cast(ui.bufferViewList->item(i)->data(Qt::UserRole).value()); - if(config && config->bufferViewId() == bufferViewId) { - ui.bufferViewList->setCurrentRow(i); - return true; +bool BufferViewSettingsPage::selectBufferViewById(int bufferViewId) +{ + BufferViewConfig* config; + for (int i = 0; i < ui.bufferViewList->count(); i++) { + config = qobject_cast(ui.bufferViewList->item(i)->data(Qt::UserRole).value()); + if (config && config->bufferViewId() == bufferViewId) { + ui.bufferViewList->setCurrentRow(i); + return true; + } } - } - return false; + return false; } -void BufferViewSettingsPage::updateBufferView() { - BufferViewConfig *config = qobject_cast(sender()); - if(!config) - return; - - int itemPos = listPos(config); - if(itemPos == -1) { - qWarning() << "BufferViewSettingsPage::updateBufferView(): view is unknown:" << config->bufferViewId(); - return; - } - ui.bufferViewList->item(itemPos)->setText(config->bufferViewName()); - if(itemPos == ui.bufferViewList->currentRow()) - loadConfig(config); +void BufferViewSettingsPage::updateBufferView() +{ + auto* config = qobject_cast(sender()); + if (!config) + return; + + int itemPos = listPos(config); + if (itemPos == -1) { + qWarning() << "BufferViewSettingsPage::updateBufferView(): view is unknown:" << config->bufferViewId(); + return; + } + ui.bufferViewList->item(itemPos)->setText(config->bufferViewName()); + if (itemPos == ui.bufferViewList->currentRow()) + loadConfig(config); } -void BufferViewSettingsPage::enableStatusBuffers(int networkIdx) { - // we don't show a status buffer if we show multiple networks as selecting - // the network is the same as selecting the status buffer. - ui.onlyStatusBuffers->setEnabled(networkIdx != 0); +void BufferViewSettingsPage::enableStatusBuffers(int networkIdx) +{ + // we don't show a status buffer if we show multiple networks as selecting + // the network is the same as selecting the status buffer. + ui.onlyStatusBuffers->setEnabled(networkIdx != 0); } -void BufferViewSettingsPage::on_addBufferView_clicked() { - if(!Client::bufferViewManager()) - return; +void BufferViewSettingsPage::on_addBufferView_clicked() +{ + if (!Client::bufferViewManager()) + return; - QStringList existing; - foreach(BufferViewConfig *bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) { - existing << bufferConfig->bufferViewName(); - } + QStringList existing; + foreach (BufferViewConfig* bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) { + existing << bufferConfig->bufferViewName(); + } - BufferViewEditDlg dlg(QString(), existing, this); - if(dlg.exec() == QDialog::Accepted) { - newBufferView(dlg.bufferViewName()); - changed(); - } + BufferViewEditDlg dlg(QString(), existing, this); + if (dlg.exec() == QDialog::Accepted) { + newBufferView(dlg.bufferViewName()); + setChangedState(true); + } } -void BufferViewSettingsPage::on_renameBufferView_clicked() { - if(ui.bufferViewList->selectedItems().isEmpty()) - return; - - if(!Client::bufferViewManager()) - return; - - BufferViewConfig *config = bufferView(ui.bufferViewList->currentRow()); - if(!config) - return; - - QStringList existing; - foreach(BufferViewConfig *bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) { - existing << bufferConfig->bufferViewName(); - } - - BufferViewEditDlg dlg(config->bufferViewName(), existing, this); - if(dlg.exec() == QDialog::Accepted) { - BufferViewConfig *changedConfig = cloneConfig(config); - changedConfig->setBufferViewName(dlg.bufferViewName()); - ui.bufferViewList->item(listPos(config))->setText(dlg.bufferViewName()); - changed(); - } +void BufferViewSettingsPage::on_renameBufferView_clicked() +{ + if (ui.bufferViewList->selectedItems().isEmpty()) + return; + + if (!Client::bufferViewManager()) + return; + + BufferViewConfig* config = bufferView(ui.bufferViewList->currentRow()); + if (!config) + return; + + QStringList existing; + foreach (BufferViewConfig* bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) { + existing << bufferConfig->bufferViewName(); + } + + BufferViewEditDlg dlg(config->bufferViewName(), existing, this); + if (dlg.exec() == QDialog::Accepted) { + BufferViewConfig* changedConfig = cloneConfig(config); + changedConfig->setBufferViewName(dlg.bufferViewName()); + ui.bufferViewList->item(listPos(config))->setText(dlg.bufferViewName()); + setChangedState(true); + } } -void BufferViewSettingsPage::on_deleteBufferView_clicked() { - if(ui.bufferViewList->selectedItems().isEmpty()) - return; - - QListWidgetItem *currentItem = ui.bufferViewList->item(ui.bufferViewList->currentRow()); - QString viewName = currentItem->text(); - int viewId = bufferView(ui.bufferViewList->currentRow())->bufferViewId(); - int ret = QMessageBox::question(this, tr("Delete Buffer View?"), - tr("Do you really want to delete the buffer view \"%1\"?").arg(viewName), - QMessageBox::Yes|QMessageBox::No, QMessageBox::No); - - if(ret == QMessageBox::Yes) { - ui.bufferViewList->removeItemWidget(currentItem); - BufferViewConfig *config = qobject_cast(currentItem->data(Qt::UserRole).value()); - delete currentItem; - if(viewId >= 0) { - _deleteBufferViews << viewId; - changed(); - } else if(config) { - QList::iterator iter = _newBufferViews.begin(); - while(iter != _newBufferViews.end()) { - if(*iter == config) { - iter = _newBufferViews.erase(iter); - break; - } else { - iter++; - } - } - delete config; - if(_deleteBufferViews.isEmpty() && _changedBufferViews.isEmpty() && _newBufferViews.isEmpty()) - setChangedState(false); +void BufferViewSettingsPage::on_deleteBufferView_clicked() +{ + if (ui.bufferViewList->selectedItems().isEmpty()) + return; + + QListWidgetItem* currentItem = ui.bufferViewList->item(ui.bufferViewList->currentRow()); + QString viewName = currentItem->text(); + int viewId = bufferView(ui.bufferViewList->currentRow())->bufferViewId(); + int ret = QMessageBox::question(this, + tr("Delete Chat List?"), + tr("Do you really want to delete the chat list \"%1\"?").arg(viewName), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); + + if (ret == QMessageBox::Yes) { + ui.bufferViewList->removeItemWidget(currentItem); + auto* config = qobject_cast(currentItem->data(Qt::UserRole).value()); + delete currentItem; + if (viewId >= 0) { + _deleteBufferViews << viewId; + setChangedState(true); + } + else if (config) { + QList::iterator iter = _newBufferViews.begin(); + while (iter != _newBufferViews.end()) { + if (*iter == config) { + iter = _newBufferViews.erase(iter); + break; + } + else { + ++iter; + } + } + delete config; + if (_deleteBufferViews.isEmpty() && _changedBufferViews.isEmpty() && _newBufferViews.isEmpty()) + setChangedState(false); + } } - } } -void BufferViewSettingsPage::bufferViewSelectionChanged(const QItemSelection ¤t, const QItemSelection &previous) { - Q_UNUSED(previous) +void BufferViewSettingsPage::bufferViewSelectionChanged(const QItemSelection& current, const QItemSelection& previous) +{ + Q_UNUSED(previous) - if(!current.isEmpty()) { - ui.settingsGroupBox->setEnabled(true); - ui.bufferViewPreview->setEnabled(true); + if (!current.isEmpty()) { + ui.settingsGroupBox->setEnabled(true); + ui.bufferViewPreview->setEnabled(true); - loadConfig(configForDisplay(bufferView(ui.bufferViewList->currentRow()))); - } else { - ui.settingsGroupBox->setEnabled(false); - ui.bufferViewPreview->setEnabled(false); - } + loadConfig(configForDisplay(bufferView(ui.bufferViewList->currentRow()))); + } + else { + ui.settingsGroupBox->setEnabled(false); + ui.bufferViewPreview->setEnabled(false); + } } -void BufferViewSettingsPage::loadConfig(BufferViewConfig *config) { - if(!config) - return; - - _ignoreWidgetChanges = true; - ui.onlyStatusBuffers->setChecked(BufferInfo::StatusBuffer & config->allowedBufferTypes()); - ui.onlyChannelBuffers->setChecked(BufferInfo::ChannelBuffer & config->allowedBufferTypes()); - ui.onlyQueryBuffers->setChecked(BufferInfo::QueryBuffer & config->allowedBufferTypes()); - ui.addNewBuffersAutomatically->setChecked(config->addNewBuffersAutomatically()); - ui.sortAlphabetically->setChecked(config->sortAlphabetically()); - ui.hideInactiveBuffers->setChecked(config->hideInactiveBuffers()); - - int networkIndex = 0; - for(int i = 0; i < ui.networkSelector->count(); i++) { - if(ui.networkSelector->itemData(i).value() == config->networkId()) { - networkIndex = i; - break; +void BufferViewSettingsPage::loadConfig(BufferViewConfig* config) +{ + if (!config) + return; + + _ignoreWidgetChanges = true; + ui.onlyStatusBuffers->setChecked(BufferInfo::StatusBuffer & config->allowedBufferTypes()); + ui.onlyChannelBuffers->setChecked(BufferInfo::ChannelBuffer & config->allowedBufferTypes()); + ui.onlyQueryBuffers->setChecked(BufferInfo::QueryBuffer & config->allowedBufferTypes()); + ui.addNewBuffersAutomatically->setChecked(config->addNewBuffersAutomatically()); + ui.sortAlphabetically->setChecked(config->sortAlphabetically()); + ui.hideInactiveBuffers->setChecked(config->hideInactiveBuffers()); + ui.hideInactiveNetworks->setChecked(config->hideInactiveNetworks()); + ui.showSearch->setChecked(config->showSearch()); + + int networkIndex = 0; + for (int i = 0; i < ui.networkSelector->count(); i++) { + if (ui.networkSelector->itemData(i).value() == config->networkId()) { + networkIndex = i; + break; + } } - } - ui.networkSelector->setCurrentIndex(networkIndex); + ui.networkSelector->setCurrentIndex(networkIndex); - int activityIndex = 0; - int minimumActivity = config->minimumActivity(); - while(minimumActivity) { - activityIndex++; - minimumActivity = minimumActivity >> 1; - } - ui.minimumActivitySelector->setCurrentIndex(activityIndex); + int activityIndex = 0; + int minimumActivity = config->minimumActivity(); + while (minimumActivity) { + activityIndex++; + minimumActivity = minimumActivity >> 1; + } + ui.minimumActivitySelector->setCurrentIndex(activityIndex); - ui.bufferViewPreview->setFilteredModel(Client::bufferModel(), config); + ui.bufferViewPreview->setFilteredModel(Client::bufferModel(), config); - _ignoreWidgetChanges = false; + _ignoreWidgetChanges = false; } -void BufferViewSettingsPage::saveConfig(BufferViewConfig *config) { - if(!config) - return; - - int allowedBufferTypes = 0; - if(ui.onlyStatusBuffers->isChecked()) - allowedBufferTypes |= BufferInfo::StatusBuffer; - if(ui.onlyChannelBuffers->isChecked()) - allowedBufferTypes |= BufferInfo::ChannelBuffer; - if(ui.onlyQueryBuffers->isChecked()) - allowedBufferTypes |= BufferInfo::QueryBuffer; - config->setAllowedBufferTypes(allowedBufferTypes); - - config->setAddNewBuffersAutomatically(ui.addNewBuffersAutomatically->isChecked()); - config->setSortAlphabetically(ui.sortAlphabetically->isChecked()); - config->setHideInactiveBuffers(ui.hideInactiveBuffers->isChecked()); - config->setNetworkId(ui.networkSelector->itemData(ui.networkSelector->currentIndex()).value()); - - int minimumActivity = 0; - if(ui.minimumActivitySelector->currentIndex() > 0) - minimumActivity = 1 << (ui.minimumActivitySelector->currentIndex() - 1); - config->setMinimumActivity(minimumActivity); - - if(_newBufferViews.contains(config)) { - QList bufferIds; - if(config->addNewBuffersAutomatically()) { - if(config->sortAlphabetically()) - bufferIds = Client::networkModel()->allBufferIdsSorted(); - else - bufferIds = Client::networkModel()->allBufferIds(); - } - config->initSetBufferList(bufferIds); - } +void BufferViewSettingsPage::saveConfig(BufferViewConfig* config) +{ + if (!config) + return; + + int allowedBufferTypes = 0; + if (ui.onlyStatusBuffers->isChecked()) + allowedBufferTypes |= BufferInfo::StatusBuffer; + if (ui.onlyChannelBuffers->isChecked()) + allowedBufferTypes |= BufferInfo::ChannelBuffer; + if (ui.onlyQueryBuffers->isChecked()) + allowedBufferTypes |= BufferInfo::QueryBuffer; + config->setAllowedBufferTypes(allowedBufferTypes); + + config->setAddNewBuffersAutomatically(ui.addNewBuffersAutomatically->isChecked()); + config->setSortAlphabetically(ui.sortAlphabetically->isChecked()); + config->setHideInactiveBuffers(ui.hideInactiveBuffers->isChecked()); + config->setHideInactiveNetworks(ui.hideInactiveNetworks->isChecked()); + config->setNetworkId(ui.networkSelector->itemData(ui.networkSelector->currentIndex()).value()); + config->setShowSearch(ui.showSearch->isChecked()); + + int minimumActivity = 0; + if (ui.minimumActivitySelector->currentIndex() > 0) + minimumActivity = 1 << (ui.minimumActivitySelector->currentIndex() - 1); + config->setMinimumActivity(minimumActivity); + + QList bufferIds = fromVariantList(config->property("OriginalBufferList").toList()); + if (config->sortAlphabetically()) + Client::networkModel()->sortBufferIds(bufferIds); + + if (!_newBufferViews.contains(config) || config->addNewBuffersAutomatically()) + config->setBufferList(bufferIds); } -void BufferViewSettingsPage::widgetHasChanged() { - if(_ignoreWidgetChanges) - return; - setChangedState(testHasChanged()); +void BufferViewSettingsPage::widgetHasChanged() +{ + if (_ignoreWidgetChanges) + return; + setChangedState(testHasChanged()); } -bool BufferViewSettingsPage::testHasChanged() { - saveConfig(cloneConfig(bufferView(ui.bufferViewList->currentRow()))); - - if(!_newBufferViews.isEmpty()) - return true; - - bool changed = false; - QHash::iterator iter = _changedBufferViews.begin(); - QHash::iterator iterEnd = _changedBufferViews.end(); - while(iter != iterEnd) { - if(&(iter.key()) == &(iter.value())) { - iter.value()->deleteLater(); - iter = _changedBufferViews.erase(iter); - } else { - changed = true; - iter++; +bool BufferViewSettingsPage::testHasChanged() +{ + saveConfig(cloneConfig(bufferView(ui.bufferViewList->currentRow()))); + + if (!_newBufferViews.isEmpty()) + return true; + + bool changed = false; + QHash::iterator iter = _changedBufferViews.begin(); + QHash::iterator iterEnd = _changedBufferViews.end(); + while (iter != iterEnd) { + if (&(iter.key()) == &(iter.value())) { + iter.value()->deleteLater(); + iter = _changedBufferViews.erase(iter); + } + else { + changed = true; + ++iter; + } } - } - return changed; + return changed; } -BufferViewConfig *BufferViewSettingsPage::cloneConfig(BufferViewConfig *config) { - if(!config || config->bufferViewId() < 0) - return config; - - if(_changedBufferViews.contains(config)) - return _changedBufferViews[config]; - - BufferViewConfig *changedConfig = new BufferViewConfig(-1, this); - changedConfig->fromVariantMap(config->toVariantMap()); - changedConfig->setInitialized(); - _changedBufferViews[config] = changedConfig; - connect(config, SIGNAL(bufferAdded(const BufferId &, int)), changedConfig, SLOT(addBuffer(const BufferId &, int))); - connect(config, SIGNAL(bufferMoved(const BufferId &, int)), changedConfig, SLOT(moveBuffer(const BufferId &, int))); - connect(config, SIGNAL(bufferRemoved(const BufferId &)), changedConfig, SLOT(removeBuffer(const BufferId &))); - connect(config, SIGNAL(addBufferRequested(const BufferId &, int)), changedConfig, SLOT(addBuffer(const BufferId &, int))); - connect(config, SIGNAL(moveBufferRequested(const BufferId &, int)), changedConfig, SLOT(moveBuffer(const BufferId &, int))); - connect(config, SIGNAL(removeBufferRequested(const BufferId &)), changedConfig, SLOT(removeBuffer(const BufferId &))); - - // if this is the currently displayed view we have to change the config of the preview filter - BufferViewFilter *filter = qobject_cast(ui.bufferViewPreview->model()); - if(filter && filter->config() == config) - filter->setConfig(changedConfig); - ui.bufferViewPreview->setConfig(changedConfig); - - return changedConfig; +BufferViewConfig* BufferViewSettingsPage::cloneConfig(BufferViewConfig* config) +{ + if (!config || config->bufferViewId() < 0) + return config; + + if (_changedBufferViews.contains(config)) + return _changedBufferViews[config]; + + auto* changedConfig = new BufferViewConfig(-1, this); + changedConfig->fromVariantMap(config->toVariantMap()); + changedConfig->setInitialized(); + _changedBufferViews[config] = changedConfig; + connect(config, &BufferViewConfig::bufferAdded, changedConfig, &BufferViewConfig::addBuffer); + connect(config, &BufferViewConfig::bufferMoved, changedConfig, &BufferViewConfig::moveBuffer); + connect(config, &BufferViewConfig::bufferRemoved, changedConfig, &BufferViewConfig::removeBuffer); + // connect(config, &BufferViewConfig::addBufferRequested, changedConfig, &BufferViewConfig::addBuffer); + // connect(config, &BufferViewConfig::moveBufferRequested, changedConfig, &BufferViewConfig::moveBuffer); + // connect(config, &BufferViewconfig::removeBufferRequested, changedConfig, &BufferViewConfig::removeBuffer); + + changedConfig->setProperty("OriginalBufferList", toVariantList(config->bufferList())); + // if this is the currently displayed view we have to change the config of the preview filter + auto* filter = qobject_cast(ui.bufferViewPreview->model()); + if (filter && filter->config() == config) + filter->setConfig(changedConfig); + ui.bufferViewPreview->setConfig(changedConfig); + + return changedConfig; } -BufferViewConfig *BufferViewSettingsPage::configForDisplay(BufferViewConfig *config) { - if(_changedBufferViews.contains(config)) - return _changedBufferViews[config]; - else - return config; +BufferViewConfig* BufferViewSettingsPage::configForDisplay(BufferViewConfig* config) +{ + if (_changedBufferViews.contains(config)) + return _changedBufferViews[config]; + else + return config; } - /************************************************************************** * BufferViewEditDlg *************************************************************************/ -BufferViewEditDlg::BufferViewEditDlg(const QString &old, const QStringList &exist, QWidget *parent) : QDialog(parent), existing(exist) { - ui.setupUi(this); - - if(old.isEmpty()) { - // new buffer - setWindowTitle(tr("Add Buffer View")); - on_bufferViewEdit_textChanged(""); // disable ok button - } else { - ui.bufferViewEdit->setText(old); - } -} - +BufferViewEditDlg::BufferViewEditDlg(const QString& old, QStringList exist, QWidget* parent) + : QDialog(parent) + , existing(std::move(exist)) +{ + ui.setupUi(this); -void BufferViewEditDlg::on_bufferViewEdit_textChanged(const QString &text) { - ui.buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty() || existing.contains(text)); + if (old.isEmpty()) { + // new buffer + setWindowTitle(tr("Add Chat List")); + on_bufferViewEdit_textChanged(""); // disable ok button + } + else { + ui.bufferViewEdit->setText(old); + } } +void BufferViewEditDlg::on_bufferViewEdit_textChanged(const QString& text) +{ + ui.buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty() || existing.contains(text)); +}