X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fbufferviewsettingspage.cpp;h=9e95996045099bd118d2443ba0e3fa53bde48358;hp=3fe64dff7a1d1daa0c49746b7d11ff816c3a84d8;hb=f2e4609f070221a010eef8be98524c5ce88d228b;hpb=4b600109a862705eaf44e59ca7bddb56b0663732 diff --git a/src/qtui/settingspages/bufferviewsettingspage.cpp b/src/qtui/settingspages/bufferviewsettingspage.cpp index 3fe64dff..9e959960 100644 --- a/src/qtui/settingspages/bufferviewsettingspage.cpp +++ b/src/qtui/settingspages/bufferviewsettingspage.cpp @@ -20,17 +20,40 @@ #include "bufferviewsettingspage.h" +#include + #include "client.h" -#include "bufferviewmanager.h" +#include "network.h" #include "bufferviewconfig.h" +#include "bufferviewfilter.h" +#include "bufferviewmanager.h" +#include "buffermodel.h" +#include "networkmodel.h" BufferViewSettingsPage::BufferViewSettingsPage(QWidget *parent) - : SettingsPage(tr("General"), tr("Buffer Views"), parent) + : SettingsPage(tr("General"), tr("Buffer Views"), parent), + _ignoreWidgetChanges(false) { ui.setupUi(this); reset(); + + ui.bufferViewList->setSortingEnabled(true); + ui.settingsGroupBox->setEnabled(false); + ui.bufferViewPreview->setEnabled(false); + setEnabled(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())); } BufferViewSettingsPage::~BufferViewSettingsPage() { @@ -39,14 +62,12 @@ BufferViewSettingsPage::~BufferViewSettingsPage() { void BufferViewSettingsPage::reset() { ui.bufferViewList->clear(); - _viewToListPos.clear(); - _listPosToView.clear(); QHash::iterator changedConfigIter = _changedBufferViews.begin(); QHash::iterator changedConfigIterEnd = _changedBufferViews.end(); BufferViewConfig *config; while(changedConfigIter != changedConfigIterEnd) { - config = (*changedConfigIter); + config = changedConfigIter.value(); changedConfigIter = _changedBufferViews.erase(changedConfigIter); config->deleteLater(); } @@ -59,6 +80,8 @@ void BufferViewSettingsPage::reset() { config->deleteLater(); } + _deleteBufferViews.clear(); + setChangedState(false); } @@ -72,9 +95,62 @@ void BufferViewSettingsPage::load() { foreach(BufferViewConfig *bufferViewConfig, bufferViewConfigs) { addBufferView(bufferViewConfig); } + + _ignoreWidgetChanges = true; + // load network selector + ui.networkSelector->clear(); + ui.networkSelector->addItem("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; + + ui.bufferViewList->setCurrentRow(0); } void BufferViewSettingsPage::save() { + setEnabled(false); + 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); } void BufferViewSettingsPage::coreConnectionStateChanged(bool state) { @@ -88,10 +164,10 @@ void BufferViewSettingsPage::coreConnectionStateChanged(bool state) { } void BufferViewSettingsPage::addBufferView(BufferViewConfig *config) { - _viewToListPos[config->bufferViewId()] = ui.bufferViewList->count(); - _listPosToView[ui.bufferViewList->count()] = config->bufferViewId(); - ui.bufferViewList->addItem(config->bufferViewName()); + 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())); } void BufferViewSettingsPage::addBufferView(int bufferViewId) { @@ -99,27 +175,57 @@ void BufferViewSettingsPage::addBufferView(int bufferViewId) { addBufferView(Client::bufferViewManager()->bufferViewConfig(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; + return; + } + } +} + 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); + + QList bufferIds; + if(config->addNewBuffersAutomatically()) { + foreach(BufferInfo bufferInfo, Client::allBufferInfos()) { + bufferIds << bufferInfo.bufferId(); + } + if(config->sortAlphabetically()) + qSort(bufferIds.begin(), bufferIds.end(), bufferIdLessThan); + } + config->initSetBufferList(bufferIds); + _newBufferViews << config; addBufferView(config); + ui.bufferViewList->setCurrentRow(listPos(config)); } int BufferViewSettingsPage::listPos(BufferViewConfig *config) { - if(_viewToListPos.contains(config->bufferViewId())) - return _viewToListPos[config->bufferViewId()]; - else - return -1; + 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::bufferViewId(int listPos) { - if(_listPosToView.contains(listPos)) - return _listPosToView[listPos]; - else - 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; + } } void BufferViewSettingsPage::updateBufferView() { @@ -133,6 +239,8 @@ void BufferViewSettingsPage::updateBufferView() { return; } ui.bufferViewList->item(itemPos)->setText(config->bufferViewName()); + if(itemPos == ui.bufferViewList->currentRow()) + loadConfig(config); } void BufferViewSettingsPage::on_addBufferView_clicked() { @@ -158,7 +266,7 @@ void BufferViewSettingsPage::on_renameBufferView_clicked() { if(!Client::bufferViewManager()) return; - BufferViewConfig *config = Client::bufferViewManager()->bufferViewConfig(bufferViewId(ui.bufferViewList->currentRow())); + BufferViewConfig *config = bufferView(ui.bufferViewList->currentRow()); if(!config) return; @@ -171,16 +279,159 @@ void BufferViewSettingsPage::on_renameBufferView_clicked() { 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_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); + delete currentItem; + if(viewId >= 0) + _deleteBufferViews << viewId; + changed(); + } +} + +void BufferViewSettingsPage::bufferViewSelectionChanged(const QItemSelection ¤t, const QItemSelection &previous) { + Q_UNUSED(previous) + + 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); + } +} + +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; + } + } + ui.networkSelector->setCurrentIndex(networkIndex); + + int activityIndex = 0; + int minimumActivity = config->minimumActivity(); + while(minimumActivity) { + activityIndex++; + minimumActivity = minimumActivity >> 1; + } + ui.minimumActivitySelector->setCurrentIndex(activityIndex); + + ui.bufferViewPreview->setFilteredModel(Client::bufferModel(), config); + + _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()) { + foreach(BufferInfo bufferInfo, Client::allBufferInfos()) { + bufferIds << bufferInfo.bufferId(); + } + if(config->sortAlphabetically()) + qSort(bufferIds.begin(), bufferIds.end(), bufferIdLessThan); + } + config->initSetBufferList(bufferIds); + } +} + +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(); + _changedBufferViews.erase(iter); + } else { + changed = true; + iter++; + } + } + 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()); + _changedBufferViews[config] = changedConfig; + + // 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; }