From 387cf24e389854ecc97f6236fdd6acbc2486dd52 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sat, 15 Mar 2025 19:17:03 +0530 Subject: Replaced QCompleter with custom implementation --- include/CommandParser.hpp | 1 + include/InputMediator.hpp | 3 +++ include/completion/CommandsModel.hpp | 6 ++++-- include/completion/Completer.hpp | 31 +++++++++++++++++++++++++--- include/completion/CompleterDelegate.hpp | 7 +++++++ include/completion/FuzzySearchProxyModel.hpp | 15 ++++++++++++++ include/completion/TabsAdapter.hpp | 19 +++++++++++++++++ include/completion/TabsModel.hpp | 25 ++++++++++++++++++++++ include/widgets/InputLine.hpp | 5 +++-- 9 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 include/completion/FuzzySearchProxyModel.hpp create mode 100644 include/completion/TabsAdapter.hpp create mode 100644 include/completion/TabsModel.hpp (limited to 'include') diff --git a/include/CommandParser.hpp b/include/CommandParser.hpp index dea04c5..9197df5 100644 --- a/include/CommandParser.hpp +++ b/include/CommandParser.hpp @@ -10,6 +10,7 @@ enum CommandType { TabOpen, TabNext, TabPrev, + TabSelect, }; struct Cmd { diff --git a/include/InputMediator.hpp b/include/InputMediator.hpp index 660d39f..98ae6d2 100644 --- a/include/InputMediator.hpp +++ b/include/InputMediator.hpp @@ -24,6 +24,7 @@ public: void showURLInput(QString url = "", OpenType openType = OpenType::OpenUrl); void showCommandInput(QString command = ""); + void showBufferInput(QString command = ""); void hideInputLine(); DELEGATE(webViewStack, openUrl, openUrl) @@ -58,3 +59,5 @@ private: }; class CommandEval : public EvaluationType {}; + +class BufferEval : public EvaluationType {}; diff --git a/include/completion/CommandsModel.hpp b/include/completion/CommandsModel.hpp index 28836fe..4f64654 100644 --- a/include/completion/CommandsModel.hpp +++ b/include/completion/CommandsModel.hpp @@ -9,11 +9,13 @@ struct Command { QString description; }; +// TODO: Combine commands model completion and commands evaluation const QList commands = { - {.name = "open", .description = "Open a url in the current tab"}, + {.name = "open", .description = "Update current URL"}, + {.name = "tabs", .description = "Select a tab"}, {.name = "tabopen", .description = "Open a url in a new tab"}, {.name = "tabnext", .description = "Go to next tab"}, - {.name = "tabbprev", .description = "Go to previous tab"}, + {.name = "tabprev", .description = "Go to previous tab"}, }; class CommandsModel : public QAbstractListModel { diff --git a/include/completion/Completer.hpp b/include/completion/Completer.hpp index b67de61..9ad03d4 100644 --- a/include/completion/Completer.hpp +++ b/include/completion/Completer.hpp @@ -1,14 +1,39 @@ #pragma once #include +#include #include #include +#include +#include -class Completer : public QCompleter { +#include "completion/CompleterDelegate.hpp" +#include "completion/FuzzySearchProxyModel.hpp" +#include "utils.hpp" + +class Completer : public QWidget { Q_OBJECT public: - Completer(QObject *parent = nullptr); + Completer(); + void setSourceModel(QAbstractItemModel *model); + + DELEGATE((&proxyModel), sourceModel, sourceModel) + +signals: + void accepted(QString text); + +public slots: + void onTextChange(QString text); + bool onKeyPressEvent(QKeyEvent *event); + +protected: + void keyPressEvent(QKeyEvent *event) override { onKeyPressEvent(event); } + void setHighlightedRow(uint32_t); + void acceptHighlighted(); - // bool eventFilter(QObject *watched, QEvent *event) override; +private: + QTreeView *view; + FuzzySearchProxyModel proxyModel; + CompleterDelegate *viewDelegate; }; diff --git a/include/completion/CompleterDelegate.hpp b/include/completion/CompleterDelegate.hpp index fc7a321..8de22de 100644 --- a/include/completion/CompleterDelegate.hpp +++ b/include/completion/CompleterDelegate.hpp @@ -2,7 +2,9 @@ #include #include +#include #include +#include class CompleterDelegate : public QStyledItemDelegate { Q_OBJECT @@ -12,4 +14,9 @@ public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + void setCurrentRow(uint32_t); + uint32_t currentRow(); + +private: + uint32_t row; }; diff --git a/include/completion/FuzzySearchProxyModel.hpp b/include/completion/FuzzySearchProxyModel.hpp new file mode 100644 index 0000000..ee4bfc3 --- /dev/null +++ b/include/completion/FuzzySearchProxyModel.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +class FuzzySearchProxyModel : public QSortFilterProxyModel { + Q_OBJECT + +public: + using QSortFilterProxyModel::QSortFilterProxyModel; + +protected: + bool filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const override; +}; diff --git a/include/completion/TabsAdapter.hpp b/include/completion/TabsAdapter.hpp new file mode 100644 index 0000000..089eefb --- /dev/null +++ b/include/completion/TabsAdapter.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +#include "completion/Adapter.hpp" + +class TabsAdapter : public Adapter { + Q_OBJECT + +public: + TabsAdapter(); + ~TabsAdapter(); + Completer *completer() override; + QString prompt() override; + +private: + Completer *completerInstance; +}; diff --git a/include/completion/TabsModel.hpp b/include/completion/TabsModel.hpp new file mode 100644 index 0000000..be1ea78 --- /dev/null +++ b/include/completion/TabsModel.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include + +struct Buffer { + QString url; + QString title; +}; + +class TabsModel : public QAbstractListModel { + Q_OBJECT + +public: + TabsModel(QObject *parent = nullptr); + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QHash roleNames() const override; + QVariant data(const QModelIndex &index, + int role = Qt::DisplayRole) const override; + +private: + QList items; +}; diff --git a/include/widgets/InputLine.hpp b/include/widgets/InputLine.hpp index 07b6e92..45aa559 100644 --- a/include/widgets/InputLine.hpp +++ b/include/widgets/InputLine.hpp @@ -21,7 +21,9 @@ public: DELEGATE(input, hasFocus, isInputFocussed) DELEGATE(input, setText, setInputText) DELEGATE(input, text, getInputText) - DELEGATE(adapterInstance, prompt, prompt) + DELEGATE(promptPrefix, text, prompt) + + // bool eventFilter(QObject *obj, QEvent *event) override; signals: void submitted(QString text); @@ -32,7 +34,6 @@ protected: void emitSubmit(); private: - QBoxLayout *layout; QLineEdit *input; QLabel *promptPrefix; Adapter *adapterInstance = nullptr; -- cgit v1.3.1