-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Expand file tree
/
Copy pathCutterSearchable.cpp
More file actions
115 lines (95 loc) · 4.09 KB
/
CutterSearchable.cpp
File metadata and controls
115 lines (95 loc) · 4.09 KB
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
#include "CutterSearchable.h"
#include "SearchBarWidget.h"
#include "shortcuts/ShortcutManager.h"
#include <QObject>
#include <QAbstractScrollArea>
#include <QScrollBar>
#include <QSortFilterProxyModel>
#include <QRegularExpression>
void CutterSearchableHelper::setupConnections(QWidget *parent, SearchBarWidget *searchBar)
{
CutterSearchable *searchable = dynamic_cast<CutterSearchable *>(parent);
if (!searchBar || !parent || !searchable) {
return;
}
searchBar->hide();
QObject::connect(searchBar, &SearchBarWidget::searchChanged, parent,
[searchable](const QString &text, int options) {
searchable->searchChanged(text, options);
});
QObject::connect(searchBar, &SearchBarWidget::findNextTriggered, parent,
[searchable]() { searchable->findNext(); });
QObject::connect(searchBar, &SearchBarWidget::findPrevTriggered, parent,
[searchable]() { searchable->findPrev(); });
QObject::connect(searchBar, &SearchBarWidget::findLastTriggered, parent,
[searchable]() { searchable->findLast(); });
QObject::connect(searchBar, &SearchBarWidget::hideTriggered, parent,
[searchable]() { searchable->searchBarHidden(); });
QObject::connect(searchBar, &SearchBarWidget::showTriggered, parent,
[searchable]() { searchable->searchBarShown(); });
QShortcut *shortcut = Shortcuts()->makeQShortcut("Search.toggle", parent);
QObject::connect(shortcut, &QShortcut::activated, parent, [=]() {
if (searchBar->isVisible()) {
if (searchBar->hasFocus()) {
searchBar->hideSearchBar();
} else {
searchBar->setFocus();
searchBar->selectText();
}
} else {
searchBar->showSearchBar();
QWidget *searchArea = searchable->searchableArea();
int hPadding = searchable->searchHPadding();
int vPadding = searchable->searchVPadding();
positionSearchBar(parent, searchBar, searchArea, hPadding, vPadding);
}
});
}
void CutterSearchableHelper::positionSearchBar(QWidget *parent, SearchBarWidget *searchBar,
QWidget *searchArea, int hPadding, int vPadding)
{
if (!searchBar || !searchArea) {
return;
}
int searchBarWidth = 0;
if (auto *scrollArea = qobject_cast<QAbstractScrollArea *>(searchArea)) {
QScrollBar *scrollBar = scrollArea->verticalScrollBar();
searchBarWidth = (scrollBar && scrollBar->isVisible()) ? scrollBar->width() : 0;
}
QPoint areaPos = searchArea->mapTo(parent, QPoint(0, 0));
int x = areaPos.x() + searchArea->width() - searchBarWidth - searchBar->width() - hPadding;
int y = areaPos.y() + vPadding;
searchBar->move(x, y);
}
void CutterSearchableHelper::applyFilter(QSortFilterProxyModel *proxyModel,
const QString &filterText, int options)
{
if (!proxyModel) {
return;
}
if (filterText.isEmpty()) {
proxyModel->setFilterFixedString(QString());
return;
}
QRegularExpression::PatternOptions patternOptions;
if (!(options & CaseSensitive)) {
patternOptions |= QRegularExpression::CaseInsensitiveOption;
}
if (options & RegExp) {
QRegularExpression regExp(filterText, patternOptions);
if (regExp.isValid()) {
proxyModel->setFilterRegularExpression(regExp);
}
} else if (options & WholeWords) {
QString pattern = QString("\\b%1\\b").arg(QRegularExpression::escape(filterText));
QRegularExpression regExp(pattern, patternOptions);
if (regExp.isValid()) {
proxyModel->setFilterRegularExpression(regExp);
}
} else {
proxyModel->setFilterCaseSensitivity((options & CaseSensitive)
? Qt::CaseSensitive
: Qt::CaseInsensitive);
proxyModel->setFilterWildcard(filterText);
}
}