aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-03-16 14:39:57 +0530
committerAkshay Nair <phenax5@gmail.com>2025-03-16 14:39:57 +0530
commit350d2bd7ccf80b91abdff154344f0ce88080a195 (patch)
treedeaee10aeec4594f02daa314c843a438f2346337
parent5a2a6aef3703d6aaaee24d9436da9e60ffcae769 (diff)
downloadnull-browser-350d2bd7ccf80b91abdff154344f0ce88080a195.tar.gz
null-browser-350d2bd7ccf80b91abdff154344f0ce88080a195.zip
Add tab selector listing and evaluation
-rw-r--r--include/InputMediator.hpp4
-rw-r--r--include/completion/TabsAdapter.hpp3
-rw-r--r--include/completion/TabsModel.hpp6
-rw-r--r--include/widgets/WebViewStack.hpp4
-rw-r--r--src/InputMediator.cpp17
-rw-r--r--src/completion/TabsAdapter.cpp4
-rw-r--r--src/completion/TabsModel.cpp11
-rw-r--r--src/widgets/WebViewStack.cpp7
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: