diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-03-16 14:39:57 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-03-16 14:39:57 +0530 |
| commit | 350d2bd7ccf80b91abdff154344f0ce88080a195 (patch) | |
| tree | deaee10aeec4594f02daa314c843a438f2346337 | |
| parent | 5a2a6aef3703d6aaaee24d9436da9e60ffcae769 (diff) | |
| download | null-browser-350d2bd7ccf80b91abdff154344f0ce88080a195.tar.gz null-browser-350d2bd7ccf80b91abdff154344f0ce88080a195.zip | |
Add tab selector listing and evaluation
| -rw-r--r-- | include/InputMediator.hpp | 4 | ||||
| -rw-r--r-- | include/completion/TabsAdapter.hpp | 3 | ||||
| -rw-r--r-- | include/completion/TabsModel.hpp | 6 | ||||
| -rw-r--r-- | include/widgets/WebViewStack.hpp | 4 | ||||
| -rw-r--r-- | src/InputMediator.cpp | 17 | ||||
| -rw-r--r-- | src/completion/TabsAdapter.cpp | 4 | ||||
| -rw-r--r-- | src/completion/TabsModel.cpp | 11 | ||||
| -rw-r--r-- | src/widgets/WebViewStack.cpp | 7 |
8 files changed, 34 insertions, 22 deletions
diff --git a/include/InputMediator.hpp b/include/InputMediator.hpp index 98ae6d2..0ae70ce 100644 --- a/include/InputMediator.hpp +++ b/include/InputMediator.hpp @@ -24,7 +24,7 @@ public: void showURLInput(QString url = "", OpenType openType = OpenType::OpenUrl); void showCommandInput(QString command = ""); - void showBufferInput(QString command = ""); + void showTabsInput(QString command = ""); void hideInputLine(); DELEGATE(webViewStack, openUrl, openUrl) @@ -60,4 +60,4 @@ private: class CommandEval : public EvaluationType {}; -class BufferEval : public EvaluationType {}; +class TabsEval : public EvaluationType {}; diff --git a/include/completion/TabsAdapter.hpp b/include/completion/TabsAdapter.hpp index 089eefb..fd47b8b 100644 --- a/include/completion/TabsAdapter.hpp +++ b/include/completion/TabsAdapter.hpp @@ -4,12 +4,13 @@ #include <QtCore> #include "completion/Adapter.hpp" +#include "completion/TabsModel.hpp" class TabsAdapter : public Adapter { Q_OBJECT public: - TabsAdapter(); + TabsAdapter(QList<Tab> tabs); ~TabsAdapter(); Completer *completer() override; QString prompt() override; diff --git a/include/completion/TabsModel.hpp b/include/completion/TabsModel.hpp index be1ea78..4b4518f 100644 --- a/include/completion/TabsModel.hpp +++ b/include/completion/TabsModel.hpp @@ -4,7 +4,7 @@ #include <QWidget> #include <QtCore> -struct Buffer { +struct Tab { QString url; QString title; }; @@ -13,7 +13,7 @@ class TabsModel : public QAbstractListModel { Q_OBJECT public: - TabsModel(QObject *parent = nullptr); + TabsModel(QList<Tab> tabs, QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QHash<int, QByteArray> roleNames() const override; @@ -21,5 +21,5 @@ public: int role = Qt::DisplayRole) const override; private: - QList<Buffer> items; + QList<Tab> items; }; diff --git a/include/widgets/WebViewStack.hpp b/include/widgets/WebViewStack.hpp index 1d10715..faf4562 100644 --- a/include/widgets/WebViewStack.hpp +++ b/include/widgets/WebViewStack.hpp @@ -5,6 +5,8 @@ #include <QWebEngineView> #include <sys/types.h> +#include "completion/TabsModel.hpp" + enum OpenType { OpenUrl, OpenUrlInTab, OpenUrlInBgTab, OpenUrlInWindow }; class WebViewStack : public QWidget { @@ -32,6 +34,8 @@ public: void close(long index); void closeCurrent(); + QList<Tab> getTabList(); + private: void setCurrentUrl(QUrl url); QWebEngineView *createNewWebView(QUrl url = WebViewStack::NewtabURL, diff --git a/src/InputMediator.cpp b/src/InputMediator.cpp index ee7a552..6c797a3 100644 --- a/src/InputMediator.cpp +++ b/src/InputMediator.cpp @@ -1,3 +1,4 @@ +#include <QList> #include <QWidget> #include <QtCore> @@ -28,14 +29,17 @@ InputMediator::InputMediator(InputLine *inputLine, WebViewStack *webViewStack, void InputMediator::onInputSubmit(QString input) { hideInputLine(); + // Evaluate input from command if (dynamic_cast<CommandEval *>(currentEvaluationType)) return evaluateCommand(input); + // Evaluate input from url if (auto urlEval = dynamic_cast<UrlEval *>(currentEvaluationType)) return webViewStack->openUrl(input, urlEval->type()); - if (dynamic_cast<BufferEval *>(currentEvaluationType)) - return webViewStack->focusWebView(1); + // Evaluate input from tab list + if (dynamic_cast<TabsEval *>(currentEvaluationType)) + return webViewStack->focusWebView(input.toLong()); } void InputMediator::hideInputLine() { @@ -56,9 +60,10 @@ void InputMediator::showCommandInput(QString cmd) { showInputLine(); } -void InputMediator::showBufferInput(QString url) { - setEvaluationType(new CommandEval()); - inputLine->setAdapter(new TabsAdapter); +void InputMediator::showTabsInput(QString url) { + setEvaluationType(new TabsEval()); + QList<Tab> tabs = webViewStack->getTabList(); + inputLine->setAdapter(new TabsAdapter(tabs)); inputLine->setInputText(url); showInputLine(); } @@ -103,7 +108,7 @@ void InputMediator::evaluateCommand(QString command) { previousWebView(); break; case CommandType::TabSelect: - showBufferInput(); + showTabsInput(); // focusWebView(long index) // TODO: parse index and select break; case CommandType::Noop: diff --git a/src/completion/TabsAdapter.cpp b/src/completion/TabsAdapter.cpp index 4854b7d..d669151 100644 --- a/src/completion/TabsAdapter.cpp +++ b/src/completion/TabsAdapter.cpp @@ -5,9 +5,9 @@ #include "completion/TabsAdapter.hpp" #include "completion/TabsModel.hpp" -TabsAdapter::TabsAdapter() : Adapter() { +TabsAdapter::TabsAdapter(QList<Tab> tabs) : Adapter() { completerInstance = new Completer(); - completerInstance->setSourceModel(new TabsModel(this)); + completerInstance->setSourceModel(new TabsModel(tabs, this)); } Completer *TabsAdapter::completer() { return completerInstance; } diff --git a/src/completion/TabsModel.cpp b/src/completion/TabsModel.cpp index 37eb1dd..6d14b30 100644 --- a/src/completion/TabsModel.cpp +++ b/src/completion/TabsModel.cpp @@ -4,19 +4,14 @@ #include "completion/TabsModel.hpp" -TabsModel::TabsModel(QObject *parent) : QAbstractListModel(parent) { - items = { - {.url = "https://ediblemonad.dev", .title = "EdibleMonad website"}, - {.url = "https://lite.duckduckgo.com", .title = "DDG lite"}, - {.url = "https://github.com/trending", .title = "Github trending"}, - }; -} +TabsModel::TabsModel(QList<Tab> tabs, QObject *parent) + : QAbstractListModel(parent), items(tabs) {} QVariant TabsModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() >= items.size()) return QVariant(); - const Buffer &item = items.at(index.row()); + const Tab &item = items.at(index.row()); if (role == Qt::DisplayRole) return index.row(); diff --git a/src/widgets/WebViewStack.cpp b/src/widgets/WebViewStack.cpp index 0d1f7fc..b825623 100644 --- a/src/widgets/WebViewStack.cpp +++ b/src/widgets/WebViewStack.cpp @@ -45,6 +45,13 @@ QWebEngineView *WebViewStack::createNewWebView(QUrl url, bool focus) { return webview; } +QList<Tab> WebViewStack::getTabList() { + QList<Tab> urls; + for (auto &view : webViewList) + urls.append((Tab){.url = view->url().toString(), .title = view->title()}); + return urls; +} + void WebViewStack::onNewWebViewRequest(QWebEngineNewWindowRequest &request) { switch (request.destination()) { case QWebEngineNewWindowRequest::InNewTab: |
