-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwordmodel.cc
104 lines (93 loc) · 3.21 KB
/
wordmodel.cc
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
#include "wordmodel.h"
#include <iostream>
#include <QDebug>
using namespace std;
QModelIndex WordModel::index(int row, int column, const QModelIndex &parent) const {
if (m_data == nullptr)
return QModelIndex();
auto x = m_data->value(m_data->keys()[row]);
// auto *item = &(x);
return (row >= 0 && row < this->rowCount()) ? createIndex(row, column, x)
: QModelIndex();
}
QModelIndex WordModel::parent(const QModelIndex &child) const {
Q_UNUSED(child);
return QModelIndex();
}
int WordModel::rowCount(const QModelIndex &parent) const {
Q_UNUSED(parent);
if (m_data == nullptr)
return 0;
else
return m_data->size();
}
int WordModel::columnCount(const QModelIndex &parent) const {
Q_UNUSED(parent);
return COLUMN_END;
}
QVariant WordModel::data(const QModelIndex &index, int role) const {
if (index.isValid()) {
if (role == Qt::DisplayRole) {
auto data = m_data->value(m_data->keys()[index.row()]);
switch (index.column()) {
case COLUMN_WORD: {
return data->word;
}
case COLUMN_VISIBLE: {
return data->isVisible();
}
case COLUMN_MEANING: {
return data->meaning;
}
case COLUMN_PAGE: {
return data->sentenceContext[0].page;
}
case COLUMN_POS_IN_PAGE: {
return data->sentenceContext[0].location;
}
default: {
return "";
}
}
}
}
return QVariant();
}
WordModel::WordModel(QObject *parent) : QAbstractItemModel(parent) {}
void WordModel::setupModelData(modeldata_t *document) { m_data = document; }
void WordSortFilterProxyModel::updateFilter() { invalidateFilter(); }
bool WordSortFilterProxyModel::filterAcceptsRow(int sourceRow,
const QModelIndex &sourceParent) const {
auto isVisible = sourceModel()
->index(sourceRow, WordModel::COLUMN_VISIBLE, sourceParent)
.data()
.toBool();
bool res = isVisible;
if (!m_match.isEmpty()) {
auto word = sourceModel()
->index(sourceRow, WordModel::COLUMN_WORD, sourceParent)
.data()
.toString();
auto res2 = word.toLower().contains(m_match);
res = res and res2;
}
return res;
}
void WordSortFilterProxyModel::setSearchPattern(const QString &ptn) {
m_match = ptn.toLower();
invalidateFilter();
}
bool WordSortFilterProxyModel::lessThan(const QModelIndex &l,
const QModelIndex &r) const {
assert(l.column() == r.column());
switch (l.column()) {
case WordModel::COLUMN_WORD: {
auto cmp =
QString::localeAwareCompare(l.data().toString(), r.data().toString());
return (cmp < 0);
}
case WordModel::COLUMN_POS_IN_PAGE:
return l.data().toInt() > r.data().toInt();
}
return true;
}