aboutsummaryrefslogtreecommitdiff
path: root/src/completion/Completer.cpp
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-03-15 19:17:03 +0530
committerAkshay Nair <phenax5@gmail.com>2025-03-15 20:08:30 +0530
commit387cf24e389854ecc97f6236fdd6acbc2486dd52 (patch)
treea51b51de0064fb10685d2da85d11748c4a32ce73 /src/completion/Completer.cpp
parent05ae8976a8e1ab5411058de244c4e2fcc87ec369 (diff)
downloadnull-browser-387cf24e389854ecc97f6236fdd6acbc2486dd52.tar.gz
null-browser-387cf24e389854ecc97f6236fdd6acbc2486dd52.zip
Replaced QCompleter with custom implementation
Diffstat (limited to '')
-rw-r--r--src/completion/Completer.cpp92
1 files changed, 67 insertions, 25 deletions
diff --git a/src/completion/Completer.cpp b/src/completion/Completer.cpp
index a38d3f2..27a7b77 100644
--- a/src/completion/Completer.cpp
+++ b/src/completion/Completer.cpp
@@ -1,8 +1,13 @@
#include <QAbstractItemView>
#include <QHeaderView>
+#include <QKeyEvent>
#include <QLineEdit>
#include <QTreeView>
#include <QWidget>
+#include <QtCore/qabstractitemmodel.h>
+#include <QtCore/qitemselectionmodel.h>
+#include <QtCore/qnamespace.h>
+#include <QtCore/qsortfilterproxymodel.h>
#include <QtCore>
#include "completion/Completer.hpp"
@@ -12,33 +17,70 @@ const char *completerStyles = R"(
background-color: #111;
color: #fff;
border-radius: 0;
+ width: 100%;
)";
-Completer::Completer(QObject *parent) : QCompleter(parent) {
- setFilterMode(Qt::MatchContains);
- setCaseSensitivity(Qt::CaseInsensitive);
- setCompletionRole(Qt::DisplayRole);
- setCompletionMode(QCompleter::PopupCompletion);
+Completer::Completer() : QWidget() {
+ view = new QTreeView(this);
+ viewDelegate = new CompleterDelegate(view);
+ view->setStyleSheet(completerStyles);
+ view->setItemDelegate(viewDelegate);
+ view->setRootIsDecorated(false);
+ view->setUniformRowHeights(true);
+ view->header()->hide();
+ view->setColumnWidth(1, 500);
+ view->setModel(&proxyModel);
+ view->setFocusPolicy(Qt::NoFocus);
+ view->setEditTriggers(QAbstractItemView::NoEditTriggers);
+ view->setSelectionMode(QAbstractItemView::SingleSelection);
+}
+
+void Completer::setSourceModel(QAbstractItemModel *model) {
+ proxyModel.setSourceModel(model);
+}
+
+void Completer::onTextChange(QString text) {
+ proxyModel.setFilterWildcard(text);
+}
+
+void Completer::setHighlightedRow(uint32_t row) {
+ viewDelegate->setCurrentRow(row);
+ view->update();
+}
- auto treeView = new QTreeView();
- setPopup(treeView);
- treeView->setStyleSheet(completerStyles);
- treeView->setItemDelegate(new CompleterDelegate(treeView));
- treeView->setRootIsDecorated(false);
- treeView->setUniformRowHeights(true);
- treeView->header()->hide();
- treeView->setColumnWidth(1, 300);
+void Completer::acceptHighlighted() {
+ auto index = proxyModel.index(viewDelegate->currentRow(), 0);
+ auto text = proxyModel.data(index, Qt::DisplayRole).toString();
+ emit accepted(text);
}
-// bool Completer::eventFilter(QObject *watched, QEvent *event) {
-// auto isFocusIn = event->type() == QEvent::FocusIn;
-// auto isKeyRelease = event->type() == QEvent::KeyRelease;
-//
-// QLineEdit *lineEdit = qobject_cast<QLineEdit *>(watched);
-// bool isInputEmpty = lineEdit && lineEdit->text().isEmpty();
-//
-// if ((isFocusIn || isKeyRelease) && isInputEmpty)
-// complete();
-//
-// return QCompleter::eventFilter(watched, event);
-// }
+bool Completer::onKeyPressEvent(QKeyEvent *event) {
+ auto combo = event->keyCombination();
+ auto row = viewDelegate->currentRow();
+
+ // If there are no matches, nothing to handle here
+ if (proxyModel.rowCount() == 0)
+ return false;
+
+ if (combo.key() == Qt::Key_Up) {
+ setHighlightedRow(row <= 0 ? proxyModel.rowCount() - 1 : row - 1);
+ return true;
+ }
+
+ if (combo.key() == Qt::Key_Down) {
+ setHighlightedRow((row + 1) % proxyModel.rowCount());
+ return true;
+ }
+
+ if (combo.key() == Qt::Key_Tab) {
+ acceptHighlighted();
+ return true;
+ }
+
+ if (combo.key() == Qt::Key_Return) {
+ acceptHighlighted();
+ return false;
+ }
+
+ return false;
+}