first working BufferViewOverlay
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 16 Mar 2009 18:38:47 +0000 (19:38 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 16 Mar 2009 18:38:47 +0000 (19:38 +0100)
src/client/bufferviewoverlay.cpp
src/client/bufferviewoverlay.h
src/client/clientbufferviewmanager.cpp
src/client/clientbufferviewmanager.h
src/qtui/mainwin.cpp
src/qtui/mainwin.h
src/uisupport/CMakeLists.txt
src/uisupport/bufferview.cpp
src/uisupport/bufferview.h
src/uisupport/bufferviewoverlayfilter.cpp [new file with mode: 0644]
src/uisupport/bufferviewoverlayfilter.h [new file with mode: 0644]

index f07c4a3..93af395 100644 (file)
@@ -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<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() {
@@ -94,7 +117,7 @@ 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++) {
@@ -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();
 }
index d528713..483a330 100644 (file)
@@ -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<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);
@@ -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;
 
index 06e8a85..a32f186 100644 (file)
 
 #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<ClientBufferViewConfig *> ClientBufferViewManager::clientBufferViewConfigs
 ClientBufferViewConfig *ClientBufferViewManager::clientBufferViewConfig(int bufferViewId) const {
   return static_cast<ClientBufferViewConfig *>(bufferViewConfig(bufferViewId));
 }
-
-void ClientBufferViewManager::updateBufferViewOverlay() {
-  
-}
index 80d1754..f9a6c53 100644 (file)
@@ -35,14 +35,11 @@ public:
   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;
 };
index 2b758d5..9769de7 100644 (file)
@@ -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<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)
@@ -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);
index 000e570..76bf35e 100644 (file)
@@ -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();
index d3da1e1..92fc995 100644 (file)
@@ -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
index 086af0a..ec93ab0 100644 (file)
@@ -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;
+}
index 0b826e0..22dd2e9 100644 (file)
@@ -135,6 +135,7 @@ class BufferViewDock : public QDockWidget {
 public:
   BufferViewDock(BufferViewConfig *config, QWidget *parent);
 
+  int bufferViewId() const;
   inline BufferView *bufferView() const { return qobject_cast<BufferView *>(widget()); }
 
 public slots:
diff --git a/src/uisupport/bufferviewoverlayfilter.cpp b/src/uisupport/bufferviewoverlayfilter.cpp
new file mode 100644 (file)
index 0000000..97a3246
--- /dev/null
@@ -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<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();
+}
+
diff --git a/src/uisupport/bufferviewoverlayfilter.h b/src/uisupport/bufferviewoverlayfilter.h
new file mode 100644 (file)
index 0000000..706d3ac
--- /dev/null
@@ -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 <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_