3fe64dff7a1d1daa0c49746b7d11ff816c3a84d8
[quassel.git] / src / qtui / settingspages / bufferviewsettingspage.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-08 by the Quassel IRC Team                         *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
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.                                           *
9  *                                                                         *
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.                          *
14  *                                                                         *
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  ***************************************************************************/
20
21 #include "bufferviewsettingspage.h"
22
23 #include "client.h"
24 #include "bufferviewmanager.h"
25 #include "bufferviewconfig.h"
26
27 BufferViewSettingsPage::BufferViewSettingsPage(QWidget *parent)
28   : SettingsPage(tr("General"), tr("Buffer Views"), parent)
29 {
30   ui.setupUi(this);
31   reset();
32   setEnabled(Client::isConnected());  // need a core connection!
33   connect(Client::instance(), SIGNAL(coreConnectionStateChanged(bool)), this, SLOT(coreConnectionStateChanged(bool)));
34 }
35
36 BufferViewSettingsPage::~BufferViewSettingsPage() {
37   reset();
38 }
39
40 void BufferViewSettingsPage::reset() {
41   ui.bufferViewList->clear();
42   _viewToListPos.clear();
43   _listPosToView.clear();
44
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();
52   }
53
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();
60   }
61
62   setChangedState(false);
63 }
64
65 void BufferViewSettingsPage::load() {
66   reset();
67
68   if(!Client::bufferViewManager())
69     return;
70
71   const QList<BufferViewConfig *> bufferViewConfigs = Client::bufferViewManager()->bufferViewConfigs();
72   foreach(BufferViewConfig *bufferViewConfig, bufferViewConfigs) {
73     addBufferView(bufferViewConfig);
74   }
75 }
76
77 void BufferViewSettingsPage::save() {
78 }
79
80 void BufferViewSettingsPage::coreConnectionStateChanged(bool state) {
81   setEnabled(state);
82   if(state) {
83     load();
84     connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigAdded(int)), this, SLOT(addBufferView(int)));
85   } else {
86     reset();
87   }
88 }
89
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()));
95 }
96
97 void BufferViewSettingsPage::addBufferView(int bufferViewId) {
98   Q_ASSERT(Client::bufferViewManager());
99   addBufferView(Client::bufferViewManager()->bufferViewConfig(bufferViewId));
100 }
101
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);
109 }
110       
111 int BufferViewSettingsPage::listPos(BufferViewConfig *config) {
112   if(_viewToListPos.contains(config->bufferViewId()))
113     return _viewToListPos[config->bufferViewId()];
114   else
115     return -1;
116 }
117
118 int BufferViewSettingsPage::bufferViewId(int listPos) {
119   if(_listPosToView.contains(listPos))
120     return _listPosToView[listPos];
121   else
122     return -1;
123 }
124
125 void BufferViewSettingsPage::updateBufferView() {
126   BufferViewConfig *config = qobject_cast<BufferViewConfig *>(sender());
127   if(!config)
128     return;
129
130   int itemPos = listPos(config);
131   if(itemPos == -1) {
132     qWarning() << "BufferViewSettingsPage::updateBufferView(): view is unknown:" << config->bufferViewId();
133     return;
134   }
135   ui.bufferViewList->item(itemPos)->setText(config->bufferViewName());
136 }
137
138 void BufferViewSettingsPage::on_addBufferView_clicked() {
139   if(!Client::bufferViewManager())
140     return;
141   
142   QStringList existing;
143   foreach(BufferViewConfig *bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) {
144     existing << bufferConfig->bufferViewName();
145   }
146
147   BufferViewEditDlg dlg(QString(), existing, this);
148   if(dlg.exec() == QDialog::Accepted) {
149     newBufferView(dlg.bufferViewName());
150     changed();
151   }
152 }
153
154 void BufferViewSettingsPage::on_renameBufferView_clicked() {
155   if(ui.bufferViewList->selectedItems().isEmpty())
156     return;
157
158   if(!Client::bufferViewManager())
159     return;
160   
161   BufferViewConfig *config = Client::bufferViewManager()->bufferViewConfig(bufferViewId(ui.bufferViewList->currentRow()));
162   if(!config)
163     return;
164
165   QStringList existing;
166   foreach(BufferViewConfig *bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) {
167     existing << bufferConfig->bufferViewName();
168   }
169
170   BufferViewEditDlg dlg(config->bufferViewName(), existing, this);
171   if(dlg.exec() == QDialog::Accepted) {
172     BufferViewConfig *changedConfig = cloneConfig(config);
173     changedConfig->setBufferViewName(dlg.bufferViewName());
174     changed();
175   }
176 }
177
178 BufferViewConfig *BufferViewSettingsPage::cloneConfig(BufferViewConfig *config) {
179   if(_changedBufferViews.contains(config))
180     return _changedBufferViews[config];
181
182   BufferViewConfig *changedConfig = new BufferViewConfig(-1, this);
183   changedConfig->fromVariantMap(config->toVariantMap());
184   return changedConfig;
185 }
186
187 BufferViewConfig *BufferViewSettingsPage::configForDisplay(BufferViewConfig *config) {
188   if(_changedBufferViews.contains(config))
189     return _changedBufferViews[config];
190   else
191     return config;
192 }
193
194
195 /**************************************************************************
196  * BufferViewEditDlg
197  *************************************************************************/
198 BufferViewEditDlg::BufferViewEditDlg(const QString &old, const QStringList &exist, QWidget *parent) : QDialog(parent), existing(exist) {
199   ui.setupUi(this);
200
201   if(old.isEmpty()) {
202     // new buffer
203     setWindowTitle(tr("Add Buffer View"));
204     on_bufferViewEdit_textChanged(""); // disable ok button
205   } else {
206     ui.bufferViewEdit->setText(old);
207   }
208 }
209
210
211 void BufferViewEditDlg::on_bufferViewEdit_textChanged(const QString &text) {
212   ui.buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty() || existing.contains(text));
213 }
214