X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fbufferviewsettingspage.cpp;h=c23e6af7722fa892d7849b6384c55443f8975dc7;hp=861bdb66477c86c88a4778f71ba1e277ef931cf6;hb=dcac65fc4beeb1167de8ebec5cc54608fc314fd3;hpb=4e0445e459c690cfa6013c5ad574e94f9214827b diff --git a/src/qtui/settingspages/bufferviewsettingspage.cpp b/src/qtui/settingspages/bufferviewsettingspage.cpp index 861bdb66..c23e6af7 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-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -20,27 +20,87 @@ #include "bufferviewsettingspage.h" +#include + #include "client.h" -#include "bufferviewmanager.h" +#include "iconloader.h" +#include "network.h" #include "bufferviewconfig.h" +#include "bufferviewfilter.h" +#include "buffermodel.h" +#include "clientbufferviewmanager.h" +#include "networkmodel.h" +#include "util.h" BufferViewSettingsPage::BufferViewSettingsPage(QWidget *parent) - : SettingsPage(tr("General"), tr("Buffer Views"), parent) + : SettingsPage(tr("Appearance"), tr("Buffer Views"), parent), + _ignoreWidgetChanges(false), + _useBufferViewHint(false), + _bufferViewHint(0) { ui.setupUi(this); + ui.renameBufferView->setIcon(SmallIcon("edit-rename")); + ui.addBufferView->setIcon(SmallIcon("list-add")); + ui.deleteBufferView->setIcon(SmallIcon("edit-delete")); + reset(); - setEnabled(Client::isConnected()); // need a core connection! + + 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))); +} + +BufferViewSettingsPage::~BufferViewSettingsPage() { + reset(); } void BufferViewSettingsPage::reset() { - // currentId = 0; ui.bufferViewList->clear(); - _viewToListPos.clear(); - _listPosToView.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(); + } + + _deleteBufferViews.clear(); + + _useBufferViewHint = false; + + setChangedState(false); } void BufferViewSettingsPage::load() { + bool useBufferViewHint = _useBufferViewHint; + int bufferViewHint = _bufferViewHint; reset(); if(!Client::bufferViewManager()) @@ -50,9 +110,71 @@ void BufferViewSettingsPage::load() { 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::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); } void BufferViewSettingsPage::coreConnectionStateChanged(bool state) { @@ -66,35 +188,86 @@ 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())); + 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::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; + } + } + 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); - addBufferView(new BufferViewConfig(fakeId)); + 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(); + qSort(bufferIds); + config->setProperty("OriginalBufferList", toVariantList(bufferIds)); + } + } + 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; + } +} + +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; } void BufferViewSettingsPage::updateBufferView() { @@ -108,12 +281,20 @@ void BufferViewSettingsPage::updateBufferView() { 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::on_addBufferView_clicked() { if(!Client::bufferViewManager()) return; - + QStringList existing; foreach(BufferViewConfig *bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) { existing << bufferConfig->bufferViewName(); @@ -122,6 +303,7 @@ void BufferViewSettingsPage::on_addBufferView_clicked() { BufferViewEditDlg dlg(QString(), existing, this); if(dlg.exec() == QDialog::Accepted) { newBufferView(dlg.bufferViewName()); + changed(); } } @@ -131,8 +313,8 @@ 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; @@ -142,18 +324,188 @@ void BufferViewSettingsPage::on_renameBufferView_clicked() { } BufferViewEditDlg dlg(config->bufferViewName(), existing, this); - if(dlg.exec() != QDialog::Accepted) + 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); + 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::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; - - BufferViewConfig *changedConfig; - if(!_changedBufferViews.contains(config)) { - _changedBufferViews[config] = new BufferViewConfig(-1); - _changedBufferViews[config]->fromVariantMap(config->toVariantMap()); - } - - changedConfig = _changedBufferViews[config]; - changedConfig->setBufferViewName(dlg.bufferViewName()); - changed(); + + 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); + + QList bufferIds = fromVariantList(config->property("OriginalBufferList").toList()); + if(config->sortAlphabetically()) + Client::networkModel()->sortBufferIds(bufferIds); + + if(!_newBufferViews.contains(config) || config->addNewBuffersAutomatically()) + 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(); + iter = _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()); + 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 &))); + + changedConfig->setProperty("OriginalBufferList", toVariantList(config->bufferList())); + // 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::configForDisplay(BufferViewConfig *config) { + if(_changedBufferViews.contains(config)) + return _changedBufferViews[config]; + else + return config; }