diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-03-15 19:17:03 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-03-15 20:08:30 +0530 |
| commit | 387cf24e389854ecc97f6236fdd6acbc2486dd52 (patch) | |
| tree | a51b51de0064fb10685d2da85d11748c4a32ce73 /src/completion/Completer.cpp | |
| parent | 05ae8976a8e1ab5411058de244c4e2fcc87ec369 (diff) | |
| download | null-browser-387cf24e389854ecc97f6236fdd6acbc2486dd52.tar.gz null-browser-387cf24e389854ecc97f6236fdd6acbc2486dd52.zip | |
Replaced QCompleter with custom implementation
Diffstat (limited to '')
| -rw-r--r-- | src/completion/Completer.cpp | 92 |
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; +} |
