/***************************************************************************
- * 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 *
#include <QMessageBox>
#include "client.h"
+#include "iconloader.h"
#include "network.h"
#include "bufferviewconfig.h"
#include "bufferviewfilter.h"
-#include "bufferviewmanager.h"
#include "buffermodel.h"
+#include "clientbufferviewmanager.h"
#include "networkmodel.h"
+#include "util.h"
BufferViewSettingsPage::BufferViewSettingsPage(QWidget *parent)
- : SettingsPage(tr("General"), tr("Buffer Views"), parent),
- _ignoreWidgetChanges(false)
+ : 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();
ui.bufferViewList->setSortingEnabled(true);
ui.settingsGroupBox->setEnabled(false);
ui.bufferViewPreview->setEnabled(false);
- setEnabled(Client::isConnected()); // need a core connection!
+ 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.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() {
void BufferViewSettingsPage::reset() {
ui.bufferViewList->clear();
+ ui.deleteBufferView->setEnabled(false);
QHash<BufferViewConfig *, BufferViewConfig *>::iterator changedConfigIter = _changedBufferViews.begin();
QHash<BufferViewConfig *, BufferViewConfig *>::iterator changedConfigIterEnd = _changedBufferViews.end();
}
_deleteBufferViews.clear();
-
+
+ _useBufferViewHint = false;
+
setChangedState(false);
}
void BufferViewSettingsPage::load() {
+ bool useBufferViewHint = _useBufferViewHint;
+ int bufferViewHint = _bufferViewHint;
reset();
if(!Client::bufferViewManager())
_ignoreWidgetChanges = true;
// load network selector
ui.networkSelector->clear();
- ui.networkSelector->addItem("All");
+ ui.networkSelector->addItem(tr("All"));
ui.networkSelector->setItemData(0, qVariantFromValue<NetworkId>(NetworkId()));
const Network *net;
foreach(NetworkId netId, Client::networkIds()) {
ui.networkSelector->setItemData(ui.networkSelector->count() - 1, qVariantFromValue<NetworkId>(net->networkId()));
}
_ignoreWidgetChanges = false;
-
- ui.bufferViewList->setCurrentRow(0);
+
+
+ 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;
if(Client::bufferViewManager()) {
Client::bufferViewManager()->requestDeleteBufferViews(deleteConfigs);
}
-
+
QHash<BufferViewConfig *, BufferViewConfig *>::iterator changedConfigIter = _changedBufferViews.begin();
QHash<BufferViewConfig *, BufferViewConfig *>::iterator changedConfigIterEnd = _changedBufferViews.end();
BufferViewConfig *config, *changedConfig;
item->setData(Qt::UserRole, qVariantFromValue<QObject *>(qobject_cast<QObject *>(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() {
if(config == static_cast<BufferViewConfig *>(obj)) {
QListWidgetItem *item = ui.bufferViewList->takeItem(i);
delete item;
- return;
+ break;
}
}
+ ui.deleteBufferView->setEnabled(ui.bufferViewList->count() > 1);
}
void BufferViewSettingsPage::newBufferView(const QString &bufferViewName) {
int fakeId = -1 * (_newBufferViews.count() + 1);
BufferViewConfig *config = new BufferViewConfig(fakeId);
config->setBufferViewName(bufferViewName);
-
+ config->setInitialized();
QList<BufferId> bufferIds;
if(config->addNewBuffersAutomatically()) {
- foreach(BufferInfo bufferInfo, Client::allBufferInfos()) {
- bufferIds << bufferInfo.bufferId();
+ if(config->sortAlphabetically()) {
+ bufferIds = Client::networkModel()->allBufferIdsSorted();
+ } else {
+ bufferIds = Client::networkModel()->allBufferIds();
+ qSort(bufferIds);
+ config->setProperty("OriginalBufferList", toVariantList<BufferId>(bufferIds));
}
- if(config->sortAlphabetically())
- qSort(bufferIds.begin(), bufferIds.end(), bufferIdLessThan);
}
config->initSetBufferList(bufferIds);
addBufferView(config);
ui.bufferViewList->setCurrentRow(listPos(config));
}
-
+
int BufferViewSettingsPage::listPos(BufferViewConfig *config) {
QObject *obj;
for(int i = 0; i < ui.bufferViewList->count(); i++) {
}
}
+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)
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();
if(!Client::bufferViewManager())
return;
-
+
BufferViewConfig *config = bufferView(ui.bufferViewList->currentRow());
if(!config)
return;
if(ret == QMessageBox::Yes) {
ui.bufferViewList->removeItemWidget(currentItem);
+ BufferViewConfig *config = qobject_cast<BufferViewConfig *>(currentItem->data(Qt::UserRole).value<QObject *>());
delete currentItem;
- if(viewId >= 0)
+ if(viewId >= 0) {
_deleteBufferViews << viewId;
- changed();
+ 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::loadConfig(BufferViewConfig *config) {
if(!config)
return;
-
+
_ignoreWidgetChanges = true;
ui.onlyStatusBuffers->setChecked(BufferInfo::StatusBuffer & config->allowedBufferTypes());
ui.onlyChannelBuffers->setChecked(BufferInfo::ChannelBuffer & config->allowedBufferTypes());
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;
minimumActivity = 1 << (ui.minimumActivitySelector->currentIndex() - 1);
config->setMinimumActivity(minimumActivity);
- if(_newBufferViews.contains(config)) {
- QList<BufferId> bufferIds;
- if(config->addNewBuffersAutomatically()) {
- foreach(BufferInfo bufferInfo, Client::allBufferInfos()) {
- bufferIds << bufferInfo.bufferId();
- }
- if(config->sortAlphabetically())
- qSort(bufferIds.begin(), bufferIds.end(), bufferIdLessThan);
- }
+ 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() {
while(iter != iterEnd) {
if(&(iter.key()) == &(iter.value())) {
iter.value()->deleteLater();
- _changedBufferViews.erase(iter);
+ iter = _changedBufferViews.erase(iter);
} else {
changed = true;
iter++;
BufferViewConfig *BufferViewSettingsPage::cloneConfig(BufferViewConfig *config) {
if(!config || config->bufferViewId() < 0)
return config;
-
+
if(_changedBufferViews.contains(config))
return _changedBufferViews[config];
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)