_bufferViewIds << viewId;
if(config->isInitialized()) {
- update();
+ viewInitialized(config);
} else {
disconnect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()));
connect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()));
return;
_bufferViewIds.remove(viewId);
+ BufferViewConfig *config = qobject_cast<BufferViewConfig *>(sender());
+ if(config)
+ disconnect(config, 0, this, 0);
update();
}
-void BufferViewOverlay::viewInitialized() {
- BufferViewConfig *config = qobject_cast<BufferViewConfig *>(sender());
- Q_ASSERT(config);
-
+void BufferViewOverlay::viewInitialized(BufferViewConfig *config) {
+ if(!config) {
+ qWarning() << "BufferViewOverlay::viewInitialized() received invalid view!";
+ return;
+ }
disconnect(config, SIGNAL(initDone()), this, SLOT(viewInitialized()));
+ connect(config, SIGNAL(networkIdSet(const NetworkId &)), this, SLOT(update()));
+ connect(config, SIGNAL(addNewBuffersAutomaticallySet(bool)), this, SLOT(update()));
+ connect(config, SIGNAL(sortAlphabeticallySet(bool)), this, SLOT(update()));
+ connect(config, SIGNAL(hideInactiveBuffersSet(bool)), this, SLOT(update()));
+ connect(config, SIGNAL(allowedBufferTypesSet(int)), this, SLOT(update()));
+ connect(config, SIGNAL(minimumActivitySet(int)), this, SLOT(update()));
+ connect(config, SIGNAL(bufferListSet()), this, SLOT(update()));
+ connect(config, SIGNAL(bufferAdded(const BufferId &, int)), this, SLOT(update()));
+ connect(config, SIGNAL(bufferRemoved(const BufferId &)), this, SLOT(update()));
+ connect(config, SIGNAL(bufferPermanentlyRemoved(const BufferId &)), this, SLOT(update()));
+
// check if the view was removed in the meantime...
if(_bufferViewIds.contains(config->bufferViewId()))
update();
}
+void BufferViewOverlay::viewInitialized() {
+ BufferViewConfig *config = qobject_cast<BufferViewConfig *>(sender());
+ Q_ASSERT(config);
+
+ viewInitialized(config);
+}
+
void BufferViewOverlay::update() {
if(_aboutToUpdate) {
return;
}
_aboutToUpdate = true;
+ QCoreApplication::postEvent(this, new QEvent((QEvent::Type)_updateEventId));
}
void BufferViewOverlay::updateHelper() {
QSet<BufferId> buffers;
QSet<BufferId> removedBuffers;
QSet<BufferId> tempRemovedBuffers;
-
+
BufferViewConfig *config = 0;
QSet<int>::const_iterator viewIter;
for(viewIter = _bufferViewIds.constBegin(); viewIter != _bufferViewIds.constEnd(); viewIter++) {
networkIds << config->networkId();
buffers += config->bufferList().toSet();
- removedBuffers += config->removedBuffers();
tempRemovedBuffers += config->temporarilyRemovedBuffers();
+ // in the overlay a buffer is removed it is removed from all views
+ if(removedBuffers.isEmpty())
+ removedBuffers = config->removedBuffers();
+ else
+ removedBuffers.intersect(config->removedBuffers());
+
+
addBuffersAutomatically |= config->addNewBuffersAutomatically();
hideInactiveBuffers &= config->hideInactiveBuffers();
allowedBufferTypes |= config->allowedBufferTypes();
_buffers = buffers;
_removedBuffers = removedBuffers;
_tempRemovedBuffers = tempRemovedBuffers;
-
+
if(changed)
emit hasChanged();
}
#include "types.h"
+class BufferViewConfig;
class ClientBufferViewConfig;
class BufferViewOverlay : public QObject {
public:
BufferViewOverlay(QObject *parent = 0);
+ inline bool allNetworks() const { return _networkIds.contains(NetworkId()); }
+
+ inline const QSet<NetworkId> &networkIds() const { return _networkIds; }
+ inline const QSet<BufferId> &bufferIds() const { return _buffers; }
+ inline const QSet<BufferId> &removedBufferIds() const { return _removedBuffers; }
+ inline const QSet<BufferId> &tempRemovedBufferIds() const { return _tempRemovedBuffers; }
+
+ inline bool addBuffersAutomatically() const { return _addBuffersAutomatically; }
+ inline bool hideInactiveBuffers() const { return _hideInactiveBuffers; }
+ inline int allowedBufferTypes() const { return _allowedBufferTypes; }
+ inline int minimumActivity() const { return _minimumActivity; }
+
public slots:
void addView(int viewId);
void removeView(int viewId);
private slots:
void viewInitialized();
+ void viewInitialized(BufferViewConfig *config);
private:
- inline bool allNetworks() const { return _networkIds.contains(NetworkId()); }
-
void updateHelper();
bool _aboutToUpdate;
#include "clientbufferviewmanager.h"
+#include "bufferviewoverlay.h"
#include "clientbufferviewconfig.h"
ClientBufferViewManager::ClientBufferViewManager(SignalProxy *proxy, QObject *parent)
: BufferViewManager(proxy, parent),
- _bufferViewOverlay(0)
+ _bufferViewOverlay(new BufferViewOverlay(this))
{
- connect(this, SIGNAL(bufferViewConfigAdded(int)), this, SLOT(updateBufferViewOverlay()));
- connect(this, SIGNAL(bufferViewConfigDeleted(int)), this, SLOT(updateBufferViewOverlay()));
}
BufferViewConfig *ClientBufferViewManager::bufferViewConfigFactory(int bufferViewConfigId) {
ClientBufferViewConfig *ClientBufferViewManager::clientBufferViewConfig(int bufferViewId) const {
return static_cast<ClientBufferViewConfig *>(bufferViewConfig(bufferViewId));
}
-
-void ClientBufferViewManager::updateBufferViewOverlay() {
-
-}
QList<ClientBufferViewConfig *> clientBufferViewConfigs() const;
ClientBufferViewConfig *clientBufferViewConfig(int bufferViewId) const;
- inline const BufferViewOverlay *bufferViewOverlay() const { return _bufferViewOverlay; }
+ inline BufferViewOverlay *bufferViewOverlay() const { return _bufferViewOverlay; }
protected:
virtual BufferViewConfig *bufferViewConfigFactory(int bufferViewConfigId);
-private slots:
- void updateBufferViewOverlay();
-
private:
BufferViewOverlay *_bufferViewOverlay;
};
#include "actioncollection.h"
#include "buffermodel.h"
#include "bufferview.h"
+#include "bufferviewoverlay.h"
+#include "bufferviewoverlayfilter.h"
#include "bufferwidget.h"
#include "channellistdlg.h"
#include "chatlinemodel.h"
qApp, SLOT(aboutQt())));
coll->addAction("DebugNetworkModel", new Action(SmallIcon("tools-report-bug"), tr("Debug &NetworkModel"), coll,
this, SLOT(on_actionDebugNetworkModel_triggered())));
+ coll->addAction("DebugBufferViewOverlay", new Action(SmallIcon("tools-report-bug"), tr("Debug &BufferViewOverlay"), coll,
+ this, SLOT(on_actionDebugBufferViewOverlay_triggered())));
coll->addAction("DebugMessageModel", new Action(SmallIcon("tools-report-bug"), tr("Debug &MessageModel"), coll,
this, SLOT(on_actionDebugMessageModel_triggered())));
coll->addAction("DebugLog", new Action(SmallIcon("tools-report-bug"), tr("Debug &Log"), coll,
_helpMenu->addSeparator();
_helpDebugMenu = _helpMenu->addMenu(SmallIcon("tools-report-bug"), tr("Debug"));
_helpDebugMenu->addAction(coll->action("DebugNetworkModel"));
+ _helpDebugMenu->addAction(coll->action("DebugBufferViewOverlay"));
_helpDebugMenu->addAction(coll->action("DebugMessageModel"));
_helpDebugMenu->addAction(coll->action("DebugLog"));
}
addDockWidget(Qt::LeftDockWidgetArea, dock);
_bufferViewsMenu->addAction(dock->toggleViewAction());
+ connect(dock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(bufferViewToggled(bool)));
_bufferViews.append(dock);
}
}
}
+void MainWin::bufferViewToggled(bool enabled) {
+ QAction *action = qobject_cast<QAction *>(sender());
+ Q_ASSERT(action);
+ BufferViewDock *dock = qobject_cast<BufferViewDock *>(action->parent());
+ Q_ASSERT(dock);
+ if(enabled) {
+ Client::bufferViewManager()->bufferViewOverlay()->addView(dock->bufferViewId());
+ } else {
+ Client::bufferViewManager()->bufferViewOverlay()->removeView(dock->bufferViewId());
+ }
+}
+
BufferView *MainWin::allBuffersView() const {
// "All Buffers" is always the first dock created
if(_bufferViews.count() > 0)
view->show();
}
+void MainWin::on_actionDebugBufferViewOverlay_triggered() {
+ QTreeView *view = new QTreeView;
+ view->setAttribute(Qt::WA_DeleteOnClose);
+ view->setWindowTitle("Debug BufferViewOverlay View");
+ BufferViewOverlayFilter *filter = new BufferViewOverlayFilter(Client::bufferModel(), Client::bufferViewManager()->bufferViewOverlay());
+ filter->setParent(view);
+ view->setModel(filter);
+ view->setColumnWidth(0, 250);
+ view->setColumnWidth(1, 250);
+ view->setColumnWidth(2, 80);
+ view->resize(610, 300);
+ view->show();
+}
+
void MainWin::on_actionDebugMessageModel_triggered() {
QTableView *view = new QTableView(0);
DebugMessageModelFilter *filter = new DebugMessageModelFilter(view);
void on_actionConfigureViews_triggered();
void on_actionLockLayout_toggled(bool lock);
void on_actionDebugNetworkModel_triggered();
+ void on_actionDebugBufferViewOverlay_triggered();
void on_actionDebugMessageModel_triggered();
void on_actionDebugLog_triggered();
void loadLayout();
void saveLayout();
+ void bufferViewToggled(bool enabled);
+
signals:
void connectToCore(const QVariantMap &connInfo);
void disconnectFromCore();
actioncollection.cpp
bufferview.cpp
bufferviewfilter.cpp
+ bufferviewoverlayfilter.cpp
clearablelineedit.cpp
clickablelabel.cpp
colorbutton.cpp
actioncollection.h
bufferview.h
bufferviewfilter.h
+ bufferviewoverlayfilter.h
clearablelineedit.h
clickablelabel.h
colorbutton.h
setWindowTitle(newName);
toggleViewAction()->setText(newName);
}
+
+int BufferViewDock::bufferViewId() const {
+ BufferView *view = bufferView();
+ if(!view)
+ return 0;
+
+ if(view->config())
+ return view->config()->bufferViewId();
+ else
+ return 0;
+}
public:
BufferViewDock(BufferViewConfig *config, QWidget *parent);
+ int bufferViewId() const;
inline BufferView *bufferView() const { return qobject_cast<BufferView *>(widget()); }
public slots:
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2005-09 by the Quassel Project *
+ * devel@quassel-irc.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) version 3. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "bufferviewoverlayfilter.h"
+
+#include "bufferviewoverlay.h"
+#include "networkmodel.h"
+#include "types.h"
+
+BufferViewOverlayFilter::BufferViewOverlayFilter(QAbstractItemModel *model, BufferViewOverlay *overlay)
+ : QSortFilterProxyModel(model),
+ _overlay(0)
+{
+ setOverlay(overlay);
+ setSourceModel(model);
+
+ setDynamicSortFilter(true);
+}
+
+void BufferViewOverlayFilter::setOverlay(BufferViewOverlay *overlay) {
+ if(_overlay == overlay)
+ return;
+
+ if(_overlay) {
+ disconnect(_overlay, 0, this, 0);
+ }
+
+ _overlay = overlay;
+
+ if(!overlay) {
+ invalidate();
+ return;
+ }
+
+ connect(overlay, SIGNAL(destroyed()), this, SLOT(overlayDestroyed()));
+ connect(overlay, SIGNAL(hasChanged()), this, SLOT(invalidate()));
+ invalidate();
+}
+
+void BufferViewOverlayFilter::overlayDestroyed() {
+ setOverlay(0);
+}
+
+bool BufferViewOverlayFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
+ if(!_overlay)
+ return false;
+
+ QModelIndex source_bufferIndex = sourceModel()->index(source_row, 0, source_parent);
+
+ if(!source_bufferIndex.isValid()) {
+ qWarning() << "filterAcceptsRow has been called with an invalid Child";
+ return false;
+ }
+
+ NetworkId networkId = sourceModel()->data(source_bufferIndex, NetworkModel::NetworkIdRole).value<NetworkId>();
+ if(!_overlay->networkIds().contains(networkId) && ! _overlay->allNetworks())
+ return false;
+
+ int activityLevel = sourceModel()->data(source_bufferIndex, NetworkModel::BufferActivityRole).toInt();
+ if(_overlay->minimumActivity() > activityLevel)
+ return false;
+
+ bool isActive = sourceModel()->data(source_bufferIndex, NetworkModel::ItemActiveRole).toBool();
+ if(_overlay->hideInactiveBuffers() && !isActive && activityLevel <= BufferInfo::OtherActivity)
+ return false;
+
+ int bufferType = sourceModel()->data(source_bufferIndex, NetworkModel::BufferTypeRole).toInt();
+ if(!(_overlay->allowedBufferTypes() & bufferType))
+ return false;
+
+ BufferId bufferId = sourceModel()->data(source_bufferIndex, NetworkModel::BufferIdRole).value<BufferId>();
+ Q_ASSERT(bufferId.isValid());
+
+ if(_overlay->bufferIds().contains(bufferId))
+ return true;
+
+ if(_overlay->tempRemovedBufferIds().contains(bufferId))
+ return activityLevel > BufferInfo::OtherActivity;
+
+ if(_overlay->removedBufferIds().contains(bufferId))
+ return false;
+
+ // the buffer is not known to us
+ return _overlay->addBuffersAutomatically();
+}
+
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2005-09 by the Quassel Project *
+ * devel@quassel-irc.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) version 3. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef BUFFERVIEWOVERLAYFILTER_H_
+#define BUFFERVIEWOVERLAYFILTER_H_
+
+#include <QSortFilterProxyModel>
+
+#include "types.h"
+
+class BufferViewOverlay;
+
+class BufferViewOverlayFilter : public QSortFilterProxyModel {
+ Q_OBJECT
+
+public:
+ BufferViewOverlayFilter(QAbstractItemModel *model, BufferViewOverlay *overlay = 0);
+
+ void setOverlay(BufferViewOverlay *overlay);
+
+protected:
+ bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
+
+private slots:
+ void overlayDestroyed();
+
+private:
+ BufferViewOverlay *_overlay;
+};
+
+#endif // BUFFERVIEWOVERLAYFILTER_H_