1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/*
* Copyright (c) 2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swift/QtUI/QtChatOverviewBundle.h>
#include <QDebug>
#include <QHBoxLayout>
#include <QLabel>
#include <QPalette>
#include <QSortFilterProxyModel>
#include <QVBoxLayout>
#include <Swiften/Elements/StatusShow.h>
#include <Swift/QtUI/ChattablesModel.h>
#include <Swift/QtUI/QtChatOverviewDelegate.h>
#include <Swift/QtUI/QtClickableLabel.h>
#include <Swift/QtUI/QtExpandedListView.h>
#include <Swift/QtUI/QtSwiftUtil.h>
namespace Swift {
BundleFilter::BundleFilter(QObject* parent) : QSortFilterProxyModel(parent) {
sort(0, Qt::AscendingOrder);
setDynamicSortFilter(true);
setSortCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive);
}
void BundleFilter::addFilter(Filter filter) {
filters_.emplace(filter);
invalidateFilter();
}
bool BundleFilter::hasFilter(Filter filter) {
return filters_.count(filter) > 0;
}
void BundleFilter::removeFilter(Filter filter) {
filters_.erase(filter);
invalidateFilter();
}
bool BundleFilter::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const {
auto row = sourceModel()->index(sourceRow, 0, sourceParent);
if (filters_.count(Filter::Unread)) {
if (row.data(ChattablesModel::UnreadCountRole).toInt() == 0) {
return false;
}
}
if (filters_.count(Filter::People)) {
if (row.data(ChattablesModel::TypeRole).toString() != "PERSON") {
return false;
}
}
if (filters_.count(Filter::Rooms)) {
if (row.data(ChattablesModel::TypeRole).toString() != "ROOM") {
return false;
}
}
if (filters_.count(Filter::Online)) {
if (static_cast<StatusShow::Type>(row.data(ChattablesModel::StatusRole).toInt()) == StatusShow::None) {
return false;
}
}
return true;
}
QtChatOverviewBundle::QtChatOverviewBundle(ChattablesModel* rootModel, QString name, bool hideWhenEmpty, QWidget* parent) : QWidget(parent), rootModel_(rootModel), hideWhenEmpty_(hideWhenEmpty) {
proxyModel_ = new BundleFilter(this);
if (name == "UNREAD") { // FIXME: Obviously needs a better approach
proxyModel_->addFilter(BundleFilter::Filter::Unread);
}
if (name == "PEOPLE") {
proxyModel_->addFilter(BundleFilter::Filter::People);
proxyModel_->addFilter(BundleFilter::Filter::Online);
}
if (name == "ROOMS") {
proxyModel_->addFilter(BundleFilter::Filter::Rooms);
proxyModel_->addFilter(BundleFilter::Filter::Online);
}
proxyModel_->setSourceModel(rootModel);
auto mainLayout = new QVBoxLayout();
setLayout(mainLayout);
auto headerLayout = new QHBoxLayout();
mainLayout->addLayout(headerLayout);
auto nameLabel = new QLabel(name, this);
nameLabel->setStyleSheet("color: white;");
headerLayout->addWidget(nameLabel);
headerLayout->addStretch();
if (!hideWhenEmpty) {
filterLabel_ = new QtClickableLabel(this);
filterLabel_->setText(tr("Online"));
filterLabel_->setStyleSheet("color: white;");
headerLayout->addWidget(filterLabel_);
connect(filterLabel_, SIGNAL(clicked()), this, SLOT(handleFilterClicked()));
}
listView_ = new QtExpandedListView(this);
listView_->setModel(proxyModel_);
listView_->setFrameStyle(QFrame::NoFrame);
listView_->setItemDelegate(new QtChatOverviewDelegate(this));
connect(listView_, SIGNAL(clicked(const QModelIndex&)), this, SLOT(handleItemClicked(const QModelIndex&)));
mainLayout->addWidget(listView_);
}
QtChatOverviewBundle::~QtChatOverviewBundle() {}
void QtChatOverviewBundle::handleFilterClicked() {
if (proxyModel_->hasFilter(BundleFilter::Filter::Online)) {
proxyModel_->removeFilter(BundleFilter::Filter::Online);
filterLabel_->setText(tr("All"));
}
else {
proxyModel_->addFilter(BundleFilter::Filter::Online);
filterLabel_->setText(tr("Online"));
}
}
void QtChatOverviewBundle::handleItemClicked(const QModelIndex& index) {
clicked(JID(Q2PSTRING(index.data(ChattablesModel::JIDRole).toString())));
}
} // namespace Swift
|