1 /***************************************************************************
2 * Copyright (C) 2005-08 by the Quassel IRC Team *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
21 #include "bufferviewsettingspage.h"
24 #include "bufferviewmanager.h"
25 #include "bufferviewconfig.h"
27 BufferViewSettingsPage::BufferViewSettingsPage(QWidget *parent)
28 : SettingsPage(tr("General"), tr("Buffer Views"), parent)
32 setEnabled(Client::isConnected()); // need a core connection!
33 connect(Client::instance(), SIGNAL(coreConnectionStateChanged(bool)), this, SLOT(coreConnectionStateChanged(bool)));
36 BufferViewSettingsPage::~BufferViewSettingsPage() {
40 void BufferViewSettingsPage::reset() {
41 ui.bufferViewList->clear();
42 _viewToListPos.clear();
43 _listPosToView.clear();
45 QHash<BufferViewConfig *, BufferViewConfig *>::iterator changedConfigIter = _changedBufferViews.begin();
46 QHash<BufferViewConfig *, BufferViewConfig *>::iterator changedConfigIterEnd = _changedBufferViews.end();
47 BufferViewConfig *config;
48 while(changedConfigIter != changedConfigIterEnd) {
49 config = (*changedConfigIter);
50 changedConfigIter = _changedBufferViews.erase(changedConfigIter);
51 config->deleteLater();
54 QList<BufferViewConfig *>::iterator newConfigIter = _newBufferViews.begin();
55 QList<BufferViewConfig *>::iterator newConfigIterEnd = _newBufferViews.end();
56 while(newConfigIter != newConfigIterEnd) {
57 config = *newConfigIter;
58 newConfigIter = _newBufferViews.erase(newConfigIter);
59 config->deleteLater();
62 setChangedState(false);
65 void BufferViewSettingsPage::load() {
68 if(!Client::bufferViewManager())
71 const QList<BufferViewConfig *> bufferViewConfigs = Client::bufferViewManager()->bufferViewConfigs();
72 foreach(BufferViewConfig *bufferViewConfig, bufferViewConfigs) {
73 addBufferView(bufferViewConfig);
77 void BufferViewSettingsPage::save() {
80 void BufferViewSettingsPage::coreConnectionStateChanged(bool state) {
84 connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigAdded(int)), this, SLOT(addBufferView(int)));
90 void BufferViewSettingsPage::addBufferView(BufferViewConfig *config) {
91 _viewToListPos[config->bufferViewId()] = ui.bufferViewList->count();
92 _listPosToView[ui.bufferViewList->count()] = config->bufferViewId();
93 ui.bufferViewList->addItem(config->bufferViewName());
94 connect(config, SIGNAL(updatedRemotely()), this, SLOT(updateBufferView()));
97 void BufferViewSettingsPage::addBufferView(int bufferViewId) {
98 Q_ASSERT(Client::bufferViewManager());
99 addBufferView(Client::bufferViewManager()->bufferViewConfig(bufferViewId));
102 void BufferViewSettingsPage::newBufferView(const QString &bufferViewName) {
103 // id's of newly created bufferviews are negative (-1, -2... -n)
104 int fakeId = -1 * (_newBufferViews.count() + 1);
105 BufferViewConfig *config = new BufferViewConfig(fakeId);
106 config->setBufferViewName(bufferViewName);
107 _newBufferViews << config;
108 addBufferView(config);
111 int BufferViewSettingsPage::listPos(BufferViewConfig *config) {
112 if(_viewToListPos.contains(config->bufferViewId()))
113 return _viewToListPos[config->bufferViewId()];
118 int BufferViewSettingsPage::bufferViewId(int listPos) {
119 if(_listPosToView.contains(listPos))
120 return _listPosToView[listPos];
125 void BufferViewSettingsPage::updateBufferView() {
126 BufferViewConfig *config = qobject_cast<BufferViewConfig *>(sender());
130 int itemPos = listPos(config);
132 qWarning() << "BufferViewSettingsPage::updateBufferView(): view is unknown:" << config->bufferViewId();
135 ui.bufferViewList->item(itemPos)->setText(config->bufferViewName());
138 void BufferViewSettingsPage::on_addBufferView_clicked() {
139 if(!Client::bufferViewManager())
142 QStringList existing;
143 foreach(BufferViewConfig *bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) {
144 existing << bufferConfig->bufferViewName();
147 BufferViewEditDlg dlg(QString(), existing, this);
148 if(dlg.exec() == QDialog::Accepted) {
149 newBufferView(dlg.bufferViewName());
154 void BufferViewSettingsPage::on_renameBufferView_clicked() {
155 if(ui.bufferViewList->selectedItems().isEmpty())
158 if(!Client::bufferViewManager())
161 BufferViewConfig *config = Client::bufferViewManager()->bufferViewConfig(bufferViewId(ui.bufferViewList->currentRow()));
165 QStringList existing;
166 foreach(BufferViewConfig *bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) {
167 existing << bufferConfig->bufferViewName();
170 BufferViewEditDlg dlg(config->bufferViewName(), existing, this);
171 if(dlg.exec() == QDialog::Accepted) {
172 BufferViewConfig *changedConfig = cloneConfig(config);
173 changedConfig->setBufferViewName(dlg.bufferViewName());
178 BufferViewConfig *BufferViewSettingsPage::cloneConfig(BufferViewConfig *config) {
179 if(_changedBufferViews.contains(config))
180 return _changedBufferViews[config];
182 BufferViewConfig *changedConfig = new BufferViewConfig(-1, this);
183 changedConfig->fromVariantMap(config->toVariantMap());
184 return changedConfig;
187 BufferViewConfig *BufferViewSettingsPage::configForDisplay(BufferViewConfig *config) {
188 if(_changedBufferViews.contains(config))
189 return _changedBufferViews[config];
195 /**************************************************************************
197 *************************************************************************/
198 BufferViewEditDlg::BufferViewEditDlg(const QString &old, const QStringList &exist, QWidget *parent) : QDialog(parent), existing(exist) {
203 setWindowTitle(tr("Add Buffer View"));
204 on_bufferViewEdit_textChanged(""); // disable ok button
206 ui.bufferViewEdit->setText(old);
211 void BufferViewEditDlg::on_bufferViewEdit_textChanged(const QString &text) {
212 ui.buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty() || existing.contains(text));