From: Marcus Eggenberger Date: Mon, 16 Mar 2009 18:38:47 +0000 (+0100) Subject: first working BufferViewOverlay X-Git-Tag: 0.5-rc1~250^2~5 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=71ef3ec0c4c4d02431aa560ed83b379c416798c5;hp=f48d855945219c3a1897a17bf15830dfee104f0b first working BufferViewOverlay --- diff --git a/src/client/bufferviewoverlay.cpp b/src/client/bufferviewoverlay.cpp index f07c4a3a..93af395e 100644 --- a/src/client/bufferviewoverlay.cpp +++ b/src/client/bufferviewoverlay.cpp @@ -50,7 +50,7 @@ void BufferViewOverlay::addView(int viewId) { _bufferViewIds << viewId; if(config->isInitialized()) { - update(); + viewInitialized(config); } else { disconnect(config, SIGNAL(initDone()), this, SLOT(viewInitialized())); connect(config, SIGNAL(initDone()), this, SLOT(viewInitialized())); @@ -62,25 +62,48 @@ void BufferViewOverlay::removeView(int viewId) { return; _bufferViewIds.remove(viewId); + BufferViewConfig *config = qobject_cast(sender()); + if(config) + disconnect(config, 0, this, 0); update(); } -void BufferViewOverlay::viewInitialized() { - BufferViewConfig *config = qobject_cast(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(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() { @@ -94,7 +117,7 @@ void BufferViewOverlay::updateHelper() { QSet buffers; QSet removedBuffers; QSet tempRemovedBuffers; - + BufferViewConfig *config = 0; QSet::const_iterator viewIter; for(viewIter = _bufferViewIds.constBegin(); viewIter != _bufferViewIds.constEnd(); viewIter++) { @@ -104,9 +127,15 @@ void BufferViewOverlay::updateHelper() { 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(); @@ -131,7 +160,7 @@ void BufferViewOverlay::updateHelper() { _buffers = buffers; _removedBuffers = removedBuffers; _tempRemovedBuffers = tempRemovedBuffers; - + if(changed) emit hasChanged(); } diff --git a/src/client/bufferviewoverlay.h b/src/client/bufferviewoverlay.h index d5287136..483a3302 100644 --- a/src/client/bufferviewoverlay.h +++ b/src/client/bufferviewoverlay.h @@ -25,6 +25,7 @@ #include "types.h" +class BufferViewConfig; class ClientBufferViewConfig; class BufferViewOverlay : public QObject { @@ -33,6 +34,18 @@ class BufferViewOverlay : public QObject { public: BufferViewOverlay(QObject *parent = 0); + inline bool allNetworks() const { return _networkIds.contains(NetworkId()); } + + inline const QSet &networkIds() const { return _networkIds; } + inline const QSet &bufferIds() const { return _buffers; } + inline const QSet &removedBufferIds() const { return _removedBuffers; } + inline const QSet &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); @@ -48,10 +61,9 @@ protected: private slots: void viewInitialized(); + void viewInitialized(BufferViewConfig *config); private: - inline bool allNetworks() const { return _networkIds.contains(NetworkId()); } - void updateHelper(); bool _aboutToUpdate; diff --git a/src/client/clientbufferviewmanager.cpp b/src/client/clientbufferviewmanager.cpp index 06e8a852..a32f186a 100644 --- a/src/client/clientbufferviewmanager.cpp +++ b/src/client/clientbufferviewmanager.cpp @@ -20,14 +20,13 @@ #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) { @@ -45,7 +44,3 @@ QList ClientBufferViewManager::clientBufferViewConfigs ClientBufferViewConfig *ClientBufferViewManager::clientBufferViewConfig(int bufferViewId) const { return static_cast(bufferViewConfig(bufferViewId)); } - -void ClientBufferViewManager::updateBufferViewOverlay() { - -} diff --git a/src/client/clientbufferviewmanager.h b/src/client/clientbufferviewmanager.h index 80d1754f..f9a6c53c 100644 --- a/src/client/clientbufferviewmanager.h +++ b/src/client/clientbufferviewmanager.h @@ -35,14 +35,11 @@ public: QList 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; }; diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 2b758d50..9769de79 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -35,6 +35,8 @@ #include "actioncollection.h" #include "buffermodel.h" #include "bufferview.h" +#include "bufferviewoverlay.h" +#include "bufferviewoverlayfilter.h" #include "bufferwidget.h" #include "channellistdlg.h" #include "chatlinemodel.h" @@ -255,6 +257,8 @@ void MainWin::setupActions() { 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, @@ -315,6 +319,7 @@ void MainWin::setupMenus() { _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")); } @@ -351,6 +356,7 @@ void MainWin::addBufferView(ClientBufferViewConfig *config) { addDockWidget(Qt::LeftDockWidgetArea, dock); _bufferViewsMenu->addAction(dock->toggleViewAction()); + connect(dock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(bufferViewToggled(bool))); _bufferViews.append(dock); } @@ -370,6 +376,18 @@ void MainWin::removeBufferView(int bufferViewConfigId) { } } +void MainWin::bufferViewToggled(bool enabled) { + QAction *action = qobject_cast(sender()); + Q_ASSERT(action); + BufferViewDock *dock = qobject_cast(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) @@ -897,6 +915,20 @@ void MainWin::on_actionDebugNetworkModel_triggered() { 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); diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index 000e5704..76bf35eb 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -112,6 +112,7 @@ class MainWin 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(); @@ -125,6 +126,8 @@ class MainWin void loadLayout(); void saveLayout(); + void bufferViewToggled(bool enabled); + signals: void connectToCore(const QVariantMap &connInfo); void disconnectFromCore(); diff --git a/src/uisupport/CMakeLists.txt b/src/uisupport/CMakeLists.txt index d3da1e1f..92fc9953 100644 --- a/src/uisupport/CMakeLists.txt +++ b/src/uisupport/CMakeLists.txt @@ -11,6 +11,7 @@ set(SOURCES actioncollection.cpp bufferview.cpp bufferviewfilter.cpp + bufferviewoverlayfilter.cpp clearablelineedit.cpp clickablelabel.cpp colorbutton.cpp @@ -37,6 +38,7 @@ set(MOC_HDRS actioncollection.h bufferview.h bufferviewfilter.h + bufferviewoverlayfilter.h clearablelineedit.h clickablelabel.h colorbutton.h diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 086af0aa..ec93ab07 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -598,3 +598,14 @@ void BufferViewDock::bufferViewRenamed(const QString &newName) { 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; +} diff --git a/src/uisupport/bufferview.h b/src/uisupport/bufferview.h index 0b826e04..22dd2e99 100644 --- a/src/uisupport/bufferview.h +++ b/src/uisupport/bufferview.h @@ -135,6 +135,7 @@ class BufferViewDock : public QDockWidget { public: BufferViewDock(BufferViewConfig *config, QWidget *parent); + int bufferViewId() const; inline BufferView *bufferView() const { return qobject_cast(widget()); } public slots: diff --git a/src/uisupport/bufferviewoverlayfilter.cpp b/src/uisupport/bufferviewoverlayfilter.cpp new file mode 100644 index 00000000..97a3246e --- /dev/null +++ b/src/uisupport/bufferviewoverlayfilter.cpp @@ -0,0 +1,103 @@ +/*************************************************************************** + * 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(); + 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(); + 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(); +} + diff --git a/src/uisupport/bufferviewoverlayfilter.h b/src/uisupport/bufferviewoverlayfilter.h new file mode 100644 index 00000000..706d3acb --- /dev/null +++ b/src/uisupport/bufferviewoverlayfilter.h @@ -0,0 +1,48 @@ +/*************************************************************************** + * 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 + +#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_