+
+BufferViewConfig *BufferViewSettingsPage::bufferView(int listPos)
+{
+ if (listPos < ui.bufferViewList->count() && listPos >= 0) {
+ QObject *obj = ui.bufferViewList->item(listPos)->data(Qt::UserRole).value<QObject *>();
+ return qobject_cast<BufferViewConfig *>(obj);
+ }
+ else {
+ return 0;
+ }
+}
+
+
+bool BufferViewSettingsPage::selectBufferViewById(int bufferViewId)
+{
+ BufferViewConfig *config;
+ for (int i = 0; i < ui.bufferViewList->count(); i++) {
+ config = qobject_cast<BufferViewConfig *>(ui.bufferViewList->item(i)->data(Qt::UserRole).value<QObject *>());
+ if (config && config->bufferViewId() == bufferViewId) {
+ ui.bufferViewList->setCurrentRow(i);
+ return true;
+ }
+ }
+ return false;
+}
+
+
+void BufferViewSettingsPage::updateBufferView()
+{
+ BufferViewConfig *config = qobject_cast<BufferViewConfig *>(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::on_addBufferView_clicked()
+{
+ if (!Client::bufferViewManager())
+ return;
+
+ 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();
+ }
+}
+
+
+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_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);
+ BufferViewConfig *config = qobject_cast<BufferViewConfig *>(currentItem->data(Qt::UserRole).value<QObject *>());
+ delete currentItem;
+ if (viewId >= 0) {
+ _deleteBufferViews << viewId;
+ changed();
+ }
+ else if (config) {
+ QList<BufferViewConfig *>::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());
+ 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<NetworkId>() == 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->setHideInactiveNetworks(ui.hideInactiveNetworks->isChecked());
+ config->setNetworkId(ui.networkSelector->itemData(ui.networkSelector->currentIndex()).value<NetworkId>());
+ config->setShowSearch(ui.showSearch->isChecked());
+
+ int minimumActivity = 0;
+ if (ui.minimumActivitySelector->currentIndex() > 0)
+ minimumActivity = 1 << (ui.minimumActivitySelector->currentIndex() - 1);
+ config->setMinimumActivity(minimumActivity);
+
+ QList<BufferId> bufferIds = fromVariantList<BufferId>(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<BufferViewConfig *, BufferViewConfig *>::iterator iter = _changedBufferViews.begin();
+ QHash<BufferViewConfig *, BufferViewConfig *>::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<BufferId>(config->bufferList()));
+ // if this is the currently displayed view we have to change the config of the preview filter
+ BufferViewFilter *filter = qobject_cast<BufferViewFilter *>(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;