1 /***************************************************************************
2 * Copyright (C) 2005-08 by the Quassel Project *
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 "bufferviewoverlay.h"
25 #include "bufferviewconfig.h"
27 #include "clientbufferviewmanager.h"
28 #include "networkmodel.h"
30 const int BufferViewOverlay::_updateEventId = QEvent::registerEventType();
32 BufferViewOverlay::BufferViewOverlay(QObject *parent)
34 _aboutToUpdate(false),
35 _uninitializedViewCount(0),
36 _addBuffersAutomatically(false),
37 _hideInactiveBuffers(false),
38 _allowedBufferTypes(0),
43 void BufferViewOverlay::addView(int viewId) {
44 if(_bufferViewIds.contains(viewId))
47 BufferViewConfig *config = Client::bufferViewManager()->bufferViewConfig(viewId);
49 qDebug() << "BufferViewOverlay::addView(): no such buffer view:" << viewId;
53 _bufferViewIds << viewId;
54 _uninitializedViewCount++;
55 if(config->isInitialized()) {
56 viewInitialized(config);
58 disconnect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()));
59 // we use a queued connection here since manipulating the connection list of a sending object
60 // doesn't seem to be such a good idea while executing a connected slots.
61 connect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()), Qt::QueuedConnection);
65 void BufferViewOverlay::removeView(int viewId) {
66 if(!_bufferViewIds.contains(viewId))
69 _bufferViewIds.remove(viewId);
70 BufferViewConfig *config = Client::bufferViewManager()->bufferViewConfig(viewId);
72 disconnect(config, 0, this, 0);
74 // update initialized State:
75 bool wasInitialized = isInitialized();
76 _uninitializedViewCount = 0;
77 QSet<int>::iterator viewIter = _bufferViewIds.begin();
78 while(viewIter != _bufferViewIds.end()) {
79 config = Client::bufferViewManager()->bufferViewConfig(*viewIter);
81 viewIter = _bufferViewIds.erase(viewIter);
83 if(!config->isInitialized())
84 _uninitializedViewCount++;
90 if(!wasInitialized && isInitialized())
94 void BufferViewOverlay::viewInitialized(BufferViewConfig *config) {
96 qWarning() << "BufferViewOverlay::viewInitialized() received invalid view!";
99 disconnect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()));
101 connect(config, SIGNAL(configChanged()), this, SLOT(update()));
102 // connect(config, SIGNAL(networkIdSet(const NetworkId &)), this, SLOT(update()));
103 // connect(config, SIGNAL(addNewBuffersAutomaticallySet(bool)), this, SLOT(update()));
104 // connect(config, SIGNAL(sortAlphabeticallySet(bool)), this, SLOT(update()));
105 // connect(config, SIGNAL(hideInactiveBuffersSet(bool)), this, SLOT(update()));
106 // connect(config, SIGNAL(allowedBufferTypesSet(int)), this, SLOT(update()));
107 // connect(config, SIGNAL(minimumActivitySet(int)), this, SLOT(update()));
108 // connect(config, SIGNAL(bufferListSet()), this, SLOT(update()));
109 // connect(config, SIGNAL(bufferAdded(const BufferId &, int)), this, SLOT(update()));
110 // connect(config, SIGNAL(bufferRemoved(const BufferId &)), this, SLOT(update()));
111 // connect(config, SIGNAL(bufferPermanentlyRemoved(const BufferId &)), this, SLOT(update()));
113 // check if the view was removed in the meantime...
114 if(_bufferViewIds.contains(config->bufferViewId()))
117 _uninitializedViewCount--;
122 void BufferViewOverlay::viewInitialized() {
123 BufferViewConfig *config = qobject_cast<BufferViewConfig *>(sender());
126 viewInitialized(config);
129 void BufferViewOverlay::update() {
133 _aboutToUpdate = true;
134 QCoreApplication::postEvent(this, new QEvent((QEvent::Type)_updateEventId));
137 void BufferViewOverlay::updateHelper() {
141 bool changed = false;
143 bool addBuffersAutomatically = false;
144 bool hideInactiveBuffers = true;
145 int allowedBufferTypes = 0;
146 int minimumActivity = -1;
147 QSet<NetworkId> networkIds;
148 QSet<BufferId> buffers;
149 QSet<BufferId> removedBuffers;
150 QSet<BufferId> tempRemovedBuffers;
152 if(Client::bufferViewManager()) {
153 BufferViewConfig *config = 0;
154 QSet<int>::const_iterator viewIter;
155 for(viewIter = _bufferViewIds.constBegin(); viewIter != _bufferViewIds.constEnd(); viewIter++) {
156 config = Client::bufferViewManager()->bufferViewConfig(*viewIter);
160 networkIds << config->networkId();
161 if(config->networkId().isValid()) {
162 NetworkId networkId = config->networkId();
163 // we have to filter out all the buffers that don't belong to this net... :/
164 QSet<BufferId> bufferIds;
165 foreach(BufferId bufferId, config->bufferList()) {
166 if(Client::networkModel()->networkId(bufferId) == networkId)
167 bufferIds << bufferId;
169 buffers += bufferIds;
172 foreach(BufferId bufferId, config->temporarilyRemovedBuffers()) {
173 if(Client::networkModel()->networkId(bufferId) == networkId)
174 bufferIds << bufferId;
176 tempRemovedBuffers += bufferIds;
178 buffers += config->bufferList().toSet();
179 tempRemovedBuffers += config->temporarilyRemovedBuffers();
182 // in the overlay a buffer is removed it is removed from all views
183 if(removedBuffers.isEmpty())
184 removedBuffers = config->removedBuffers();
186 removedBuffers.intersect(config->removedBuffers());
189 addBuffersAutomatically |= config->addNewBuffersAutomatically();
190 hideInactiveBuffers &= config->hideInactiveBuffers();
191 allowedBufferTypes |= config->allowedBufferTypes();
192 if(minimumActivity == -1 || config->minimumActivity() < minimumActivity)
193 minimumActivity = config->minimumActivity();
195 QSet<BufferId> availableBuffers = Client::networkModel()->allBufferIds().toSet();
196 buffers.intersect(availableBuffers);
197 tempRemovedBuffers.intersect(availableBuffers);
200 changed |= (addBuffersAutomatically != _addBuffersAutomatically);
201 changed |= (hideInactiveBuffers != _hideInactiveBuffers);
202 changed |= (allowedBufferTypes != _allowedBufferTypes);
203 changed |= (minimumActivity != _minimumActivity);
204 changed |= (networkIds != _networkIds);
205 changed |= (buffers != _buffers);
206 changed |= (removedBuffers != _removedBuffers);
207 changed |= (tempRemovedBuffers != _tempRemovedBuffers);
209 _addBuffersAutomatically = addBuffersAutomatically;
210 _hideInactiveBuffers = hideInactiveBuffers;
211 _allowedBufferTypes = allowedBufferTypes;
212 _minimumActivity = minimumActivity;
213 _networkIds = networkIds;
215 _removedBuffers = removedBuffers;
216 _tempRemovedBuffers = tempRemovedBuffers;
218 _aboutToUpdate = false;
224 void BufferViewOverlay::customEvent(QEvent *event) {
225 if(event->type() == _updateEventId) {
230 bool BufferViewOverlay::allNetworks() {
232 return _networkIds.contains(NetworkId());
235 const QSet<NetworkId> &BufferViewOverlay::networkIds() {
240 const QSet<BufferId> &BufferViewOverlay::bufferIds() {
245 const QSet<BufferId> &BufferViewOverlay::removedBufferIds() {
247 return _removedBuffers;
250 const QSet<BufferId> &BufferViewOverlay::tempRemovedBufferIds() {
252 return _tempRemovedBuffers;
255 bool BufferViewOverlay::addBuffersAutomatically() {
257 return _addBuffersAutomatically;
260 bool BufferViewOverlay::hideInactiveBuffers() {
262 return _hideInactiveBuffers;
265 int BufferViewOverlay::allowedBufferTypes() {
267 return _allowedBufferTypes;
270 int BufferViewOverlay::minimumActivity() {
272 return _minimumActivity;