861bdb66477c86c88a4778f71ba1e277ef931cf6
[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 void BufferViewSettingsPage::reset() {
37   // currentId = 0;
38   ui.bufferViewList->clear();
39   _viewToListPos.clear();
40   _listPosToView.clear();
41 }
42
43 void BufferViewSettingsPage::load() {
44   reset();
45
46   if(!Client::bufferViewManager())
47     return;
48
49   const QList<BufferViewConfig *> bufferViewConfigs = Client::bufferViewManager()->bufferViewConfigs();
50   foreach(BufferViewConfig *bufferViewConfig, bufferViewConfigs) {
51     addBufferView(bufferViewConfig);
52   }
53 }
54
55 void BufferViewSettingsPage::save() {
56 }
57
58 void BufferViewSettingsPage::coreConnectionStateChanged(bool state) {
59   setEnabled(state);
60   if(state) {
61     load();
62     connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigAdded(int)), this, SLOT(addBufferView(int)));
63   } else {
64     reset();
65   }
66 }
67
68 void BufferViewSettingsPage::addBufferView(BufferViewConfig *config) {
69   _viewToListPos[config->bufferViewId()] = ui.bufferViewList->count();
70   _listPosToView[ui.bufferViewList->count()] = config->bufferViewId();
71   ui.bufferViewList->addItem(config->bufferViewName());
72   connect(config, SIGNAL(updatedRemotely()), this, SLOT(updateBufferView()));
73 }
74
75 void BufferViewSettingsPage::addBufferView(int bufferViewId) {
76   Q_ASSERT(Client::bufferViewManager());
77   addBufferView(Client::bufferViewManager()->bufferViewConfig(bufferViewId));
78 }
79
80 void BufferViewSettingsPage::newBufferView(const QString &bufferViewName) {
81   // id's of newly created bufferviews are negative (-1, -2... -n)
82   int fakeId = -1 * (_newBufferViews.count() + 1);
83   addBufferView(new BufferViewConfig(fakeId));
84 }
85       
86 int BufferViewSettingsPage::listPos(BufferViewConfig *config) {
87   if(_viewToListPos.contains(config->bufferViewId()))
88     return _viewToListPos[config->bufferViewId()];
89   else
90     return -1;
91 }
92
93 int BufferViewSettingsPage::bufferViewId(int listPos) {
94   if(_listPosToView.contains(listPos))
95     return _listPosToView[listPos];
96   else
97     return -1;
98 }
99
100 void BufferViewSettingsPage::updateBufferView() {
101   BufferViewConfig *config = qobject_cast<BufferViewConfig *>(sender());
102   if(!config)
103     return;
104
105   int itemPos = listPos(config);
106   if(itemPos == -1) {
107     qWarning() << "BufferViewSettingsPage::updateBufferView(): view is unknown:" << config->bufferViewId();
108     return;
109   }
110   ui.bufferViewList->item(itemPos)->setText(config->bufferViewName());
111 }
112
113 void BufferViewSettingsPage::on_addBufferView_clicked() {
114   if(!Client::bufferViewManager())
115     return;
116   
117   QStringList existing;
118   foreach(BufferViewConfig *bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) {
119     existing << bufferConfig->bufferViewName();
120   }
121
122   BufferViewEditDlg dlg(QString(), existing, this);
123   if(dlg.exec() == QDialog::Accepted) {
124     newBufferView(dlg.bufferViewName());
125   }
126 }
127
128 void BufferViewSettingsPage::on_renameBufferView_clicked() {
129   if(ui.bufferViewList->selectedItems().isEmpty())
130     return;
131
132   if(!Client::bufferViewManager())
133     return;
134   
135   BufferViewConfig *config = Client::bufferViewManager()->bufferViewConfig(bufferViewId(ui.bufferViewList->currentRow()));
136   if(!config)
137     return;
138
139   QStringList existing;
140   foreach(BufferViewConfig *bufferConfig, Client::bufferViewManager()->bufferViewConfigs()) {
141     existing << bufferConfig->bufferViewName();
142   }
143
144   BufferViewEditDlg dlg(config->bufferViewName(), existing, this);
145   if(dlg.exec() != QDialog::Accepted)
146     return;
147   
148   BufferViewConfig *changedConfig;
149   if(!_changedBufferViews.contains(config)) {
150     _changedBufferViews[config] = new BufferViewConfig(-1);
151     _changedBufferViews[config]->fromVariantMap(config->toVariantMap());
152   }
153   
154   changedConfig = _changedBufferViews[config];
155   changedConfig->setBufferViewName(dlg.bufferViewName());
156   changed();
157 }
158
159
160 /**************************************************************************
161  * BufferViewEditDlg
162  *************************************************************************/
163 BufferViewEditDlg::BufferViewEditDlg(const QString &old, const QStringList &exist, QWidget *parent) : QDialog(parent), existing(exist) {
164   ui.setupUi(this);
165
166   if(old.isEmpty()) {
167     // new buffer
168     setWindowTitle(tr("Add Buffer View"));
169     on_bufferViewEdit_textChanged(""); // disable ok button
170   } else {
171     ui.bufferViewEdit->setText(old);
172   }
173 }
174
175
176 void BufferViewEditDlg::on_bufferViewEdit_textChanged(const QString &text) {
177   ui.buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty() || existing.contains(text));
178 }
179