992ab6c9abc1a087bede38d747991e8a847b14dc
[quassel.git] / src / uisupport / bufferviewoverlayfilter.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-09 by the Quassel Project                          *
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 "bufferviewoverlayfilter.h"
22
23 #include "bufferviewoverlay.h"
24 #include "networkmodel.h"
25 #include "types.h"
26
27 BufferViewOverlayFilter::BufferViewOverlayFilter(QAbstractItemModel *model, BufferViewOverlay *overlay)
28   : QSortFilterProxyModel(model),
29     _overlay(0)
30 {
31   setOverlay(overlay);
32   setSourceModel(model);
33
34   setDynamicSortFilter(true);
35 }
36
37 void BufferViewOverlayFilter::setOverlay(BufferViewOverlay *overlay) {
38   if(_overlay == overlay)
39     return;
40
41   if(_overlay) {
42     disconnect(_overlay, 0, this, 0);
43   }
44
45   _overlay = overlay;
46
47   if(!overlay) {
48     invalidate();
49     return;
50   }
51
52   connect(overlay, SIGNAL(destroyed()), this, SLOT(overlayDestroyed()));
53   connect(overlay, SIGNAL(hasChanged()), this, SLOT(invalidate()));
54   invalidate();
55 }
56
57 void BufferViewOverlayFilter::overlayDestroyed() {
58   setOverlay(0);
59 }
60
61 bool BufferViewOverlayFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
62   if(!_overlay)
63     return false;
64
65   QModelIndex source_bufferIndex = sourceModel()->index(source_row, 0, source_parent);
66
67   if(!source_bufferIndex.isValid()) {
68     qWarning() << "filterAcceptsRow has been called with an invalid Child";
69     return false;
70   }
71
72   NetworkModel::ItemType itemType = (NetworkModel::ItemType)sourceModel()->data(source_bufferIndex, NetworkModel::ItemTypeRole).toInt();
73
74   NetworkId networkId = sourceModel()->data(source_bufferIndex, NetworkModel::NetworkIdRole).value<NetworkId>();
75   if(!_overlay->networkIds().contains(networkId) && ! _overlay->allNetworks()) {
76     return false;
77   } else if(itemType == NetworkModel::NetworkItemType) {
78     // network items don't need further checks.
79     return true;
80   }
81
82   int activityLevel = sourceModel()->data(source_bufferIndex, NetworkModel::BufferActivityRole).toInt();
83   if(_overlay->minimumActivity() > activityLevel)
84     return false;
85
86   bool isActive = sourceModel()->data(source_bufferIndex, NetworkModel::ItemActiveRole).toBool();
87   if(_overlay->hideInactiveBuffers() && !isActive && activityLevel <= BufferInfo::OtherActivity)
88     return false;
89
90   int bufferType = sourceModel()->data(source_bufferIndex, NetworkModel::BufferTypeRole).toInt();
91   if(!(_overlay->allowedBufferTypes() & bufferType))
92     return false;
93
94   BufferId bufferId = sourceModel()->data(source_bufferIndex, NetworkModel::BufferIdRole).value<BufferId>();
95   Q_ASSERT(bufferId.isValid());
96
97   if(_overlay->bufferIds().contains(bufferId))
98     return true;
99
100   if(_overlay->tempRemovedBufferIds().contains(bufferId))
101     return activityLevel > BufferInfo::OtherActivity;
102
103   if(_overlay->removedBufferIds().contains(bufferId))
104     return false;
105
106   // the buffer is not known to us
107   return _overlay->addBuffersAutomatically();
108 }
109