From 4f945367ebc8e34263acbfca0416e3f75653924e Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sun, 30 Mar 2025 19:16:07 +0530 Subject: Update window title on tab change + refactoring --- src/LuaRuntime.cpp | 36 ++++++++++----------- src/LuaRuntime.hpp | 6 ++-- src/WindowActionRouter.cpp | 71 ++++++++++++++++-------------------------- src/WindowActionRouter.hpp | 14 +++++++-- src/WindowMediator.cpp | 5 ++- src/keymap/KeymapEvaluator.hpp | 4 +-- src/widgets/BrowserApp.cpp | 14 ++++----- src/widgets/BrowserWindow.cpp | 52 +++++++++++++++++++------------ src/widgets/BrowserWindow.hpp | 6 ++-- src/widgets/WebViewStack.cpp | 6 ++++ src/widgets/WebViewStack.hpp | 3 ++ 11 files changed, 117 insertions(+), 100 deletions(-) (limited to 'src') diff --git a/src/LuaRuntime.cpp b/src/LuaRuntime.cpp index 2e711cb..37349b0 100644 --- a/src/LuaRuntime.cpp +++ b/src/LuaRuntime.cpp @@ -135,15 +135,15 @@ QVariant LuaRuntime::get_lua_value(int idx, QVariant default_value) { int LuaRuntime::lua_open_url(lua_State *state) { const char *url = lua_tostring(state, 1); WebViewId tab_id = lua_isnoneornil(state, 2) ? 0 : lua_tointeger(state, 2); - auto *runtime = LuaRuntime::instance(); - emit runtime->url_opened(url, OpenType::OpenUrl, tab_id); + auto &runtime = LuaRuntime::instance(); + emit runtime.url_opened(url, OpenType::OpenUrl, tab_id); return 1; } int LuaRuntime::lua_tab_create(lua_State *state) { const char *url = luaL_optstring(state, 1, ""); - auto *runtime = LuaRuntime::instance(); - emit runtime->url_opened(url, OpenType::OpenUrlInTab, 0); + auto &runtime = LuaRuntime::instance(); + emit runtime.url_opened(url, OpenType::OpenUrlInTab, 0); return 1; } @@ -164,22 +164,22 @@ int LuaRuntime::lua_keymap_set(lua_State *state) { }; // TODO: Cleanup function ref on after keymap clear - auto *runtime = LuaRuntime::instance(); - emit runtime->keymap_added(mode, keyseq, action); + auto &runtime = LuaRuntime::instance(); + emit runtime.keymap_added(mode, keyseq, action); return 1; } int LuaRuntime::lua_tab_current(lua_State *state) { - auto *router = WindowActionRouter::instance(); - auto tab_id = router->fetch_current_tab_id(); + auto &router = WindowActionRouter::instance(); + auto tab_id = router.fetch_current_tab_id(); lua_pushinteger(state, tab_id); return 1; } int LuaRuntime::lua_tab_list(lua_State *state) { - auto *router = WindowActionRouter::instance(); - auto tabs = router->fetch_webview_data_list(); + auto &router = WindowActionRouter::instance(); + auto tabs = router.fetch_webview_data_list(); lua_newtable(state); int index = 1; // 1-indexed @@ -206,35 +206,35 @@ int LuaRuntime::lua_tab_list(lua_State *state) { } int LuaRuntime::lua_history_back(lua_State *state) { - auto *runtime = LuaRuntime::instance(); + auto &runtime = LuaRuntime::instance(); qsizetype history_index = lua_isnoneornil(state, 1) ? 1 : lua_tointeger(state, 1); WebViewId tab_id = lua_isnoneornil(state, 2) ? 0 : lua_tointeger(state, 2); - emit runtime->history_back_requested(tab_id, history_index); + emit runtime.history_back_requested(tab_id, history_index); return 1; } int LuaRuntime::lua_history_forward(lua_State *state) { - auto *runtime = LuaRuntime::instance(); + auto &runtime = LuaRuntime::instance(); qsizetype history_index = lua_isnoneornil(state, 1) ? 1 : lua_tointeger(state, 1); WebViewId tab_id = lua_isnoneornil(state, 2) ? 0 : lua_tointeger(state, 2); - emit runtime->history_forward_requested(tab_id, history_index); + emit runtime.history_forward_requested(tab_id, history_index); return 1; } int LuaRuntime::lua_tab_close(lua_State *state) { - auto *runtime = LuaRuntime::instance(); + auto &runtime = LuaRuntime::instance(); WebViewId tab_id = lua_isnoneornil(state, 1) ? 0 : lua_tointeger(state, 1); - emit runtime->webview_closed(tab_id); + emit runtime.webview_closed(tab_id); return 1; } @@ -242,9 +242,9 @@ int LuaRuntime::lua_tab_select(lua_State *state) { if (lua_isnoneornil(state, 1)) return 1; // TODO: return nil (for others too) - auto *runtime = LuaRuntime::instance(); + auto &runtime = LuaRuntime::instance(); WebViewId tab_id = lua_tointeger(state, 1); - emit runtime->webview_selected(tab_id); + emit runtime.webview_selected(tab_id); return 1; } diff --git a/src/LuaRuntime.hpp b/src/LuaRuntime.hpp index 4d69760..d2211df 100644 --- a/src/LuaRuntime.hpp +++ b/src/LuaRuntime.hpp @@ -20,9 +20,9 @@ class LuaRuntime : public QObject { const char *web_global_name = "web"; public: - static LuaRuntime *instance() { - static LuaRuntime inst; - return &inst; + static LuaRuntime &instance() { + static LuaRuntime runtime; + return runtime; } void evaluate(const QString &code); diff --git a/src/WindowActionRouter.cpp b/src/WindowActionRouter.cpp index c04b330..1c5164e 100644 --- a/src/WindowActionRouter.cpp +++ b/src/WindowActionRouter.cpp @@ -7,58 +7,42 @@ #include "widgets/WebViewStack.hpp" void WindowActionRouter::initialize() { - auto *runtime = LuaRuntime::instance(); + auto &runtime = LuaRuntime::instance(); - connect(runtime, &LuaRuntime::keymap_added, this, + connect(&runtime, &LuaRuntime::keymap_added, this, &WindowActionRouter::add_keymap); - connect(runtime, &LuaRuntime::history_back_requested, this, + connect(&runtime, &LuaRuntime::history_back_requested, this, [this](WebViewId webview_id, qsizetype history_index) { - for (auto &win : window_map) { - auto *mediator = win.second->mediator(); - if (mediator->has_webview(webview_id)) { - emit mediator->history_back_requested(webview_id, - history_index); - } - } + WITH_WEBVIEW_WINDOW(webview_id, window, { + emit window->mediator()->history_back_requested(webview_id, + history_index); + }); }); - connect(runtime, &LuaRuntime::history_forward_requested, this, + connect(&runtime, &LuaRuntime::history_forward_requested, this, [this](WebViewId webview_id, qsizetype history_index) { - for (auto &win : window_map) { - auto *mediator = win.second->mediator(); - if (mediator->has_webview(webview_id)) { - emit mediator->history_forward_requested(webview_id, - history_index); - } - } + WITH_WEBVIEW_WINDOW(webview_id, window, { + emit window->mediator()->history_forward_requested(webview_id, + history_index); + }); }); - - connect(runtime, &LuaRuntime::url_opened, this, + connect(&runtime, &LuaRuntime::url_opened, this, [this](const QString &url, OpenType open_type, WebViewId webview_id) { - for (auto &win : window_map) { - auto *mediator = win.second->mediator(); - if (mediator->has_webview(webview_id)) { - emit mediator->url_opened(url, open_type, webview_id); - } - } + WITH_WEBVIEW_WINDOW(webview_id, window, { + emit window->mediator()->url_opened(url, open_type, webview_id); + }); }); - connect(runtime, &LuaRuntime::webview_closed, this, + connect(&runtime, &LuaRuntime::webview_closed, this, [this](WebViewId webview_id) { - for (auto &win : window_map) { - auto *mediator = win.second->mediator(); - if (mediator->has_webview(webview_id)) { - emit mediator->webview_closed(webview_id); - } - } + WITH_WEBVIEW_WINDOW(webview_id, window, { + emit window->mediator()->webview_closed(webview_id); + }); }); - connect(runtime, &LuaRuntime::webview_selected, this, + connect(&runtime, &LuaRuntime::webview_selected, this, [this](WebViewId webview_id) { - for (auto &win : window_map) { - auto *mediator = win.second->mediator(); - if (mediator->has_webview(webview_id)) { - emit mediator->webview_selected(webview_id); - } - } + WITH_WEBVIEW_WINDOW(webview_id, window, { + emit window->mediator()->webview_selected(webview_id); + }); }); } @@ -77,10 +61,9 @@ const WindowMap &WindowActionRouter::windows() { return window_map; } void WindowActionRouter::add_keymap(const QString &mode_string, const QString &keyseq, std::function action) { - qDebug() << "ADD KEY" << mode_string << keyseq; - auto *keymap_evaluator = KeymapEvaluator::instance(); - const KeyMode mode = keymap_evaluator->mode_from_string(mode_string); - keymap_evaluator->add_keymap(mode, keyseq, std::move(action)); + auto &keymap_evaluator = KeymapEvaluator::instance(); + const KeyMode mode = keymap_evaluator.mode_from_string(mode_string); + keymap_evaluator.add_keymap(mode, keyseq, std::move(action)); } WebViewId WindowActionRouter::fetch_current_tab_id(WindowId win_id) { diff --git a/src/WindowActionRouter.hpp b/src/WindowActionRouter.hpp index 9a5059b..384c76c 100644 --- a/src/WindowActionRouter.hpp +++ b/src/WindowActionRouter.hpp @@ -3,15 +3,25 @@ #include #include #include +#include #include "widgets/BrowserWindow.hpp" +#include "widgets/WebViewStack.hpp" + +#define WITH_WEBVIEW_WINDOW(WEBVIEW_ID, IDENT, BLOCK) \ + for (auto &win_match : window_map) { \ + auto *IDENT = win_match.second; \ + if (IDENT->mediator()->has_webview(WEBVIEW_ID)) { \ + BLOCK; \ + } \ + } class WindowActionRouter : public QWidget { Q_OBJECT public: - static WindowActionRouter *instance() { - static auto *router = new WindowActionRouter; + static WindowActionRouter &instance() { + static WindowActionRouter router; return router; } diff --git a/src/WindowMediator.cpp b/src/WindowMediator.cpp index 1e24173..df81f9f 100644 --- a/src/WindowMediator.cpp +++ b/src/WindowMediator.cpp @@ -20,4 +20,7 @@ WindowMediator::WindowMediator(WebViewStack *webview_stack) &WebViewStack::focus_webview); } -WindowMediator::~WindowMediator() { delete webview_stack; } +WindowMediator::~WindowMediator() { + disconnect(this); + delete webview_stack; +} diff --git a/src/keymap/KeymapEvaluator.hpp b/src/keymap/KeymapEvaluator.hpp index f3ee791..34f4ae5 100644 --- a/src/keymap/KeymapEvaluator.hpp +++ b/src/keymap/KeymapEvaluator.hpp @@ -23,9 +23,9 @@ class KeymapEvaluator : public QObject { public: KeymapEvaluator() = default; - static KeymapEvaluator *instance() { + static KeymapEvaluator &instance() { static KeymapEvaluator keymap_evaluator; - return &keymap_evaluator; + return keymap_evaluator; } void add_keymap(KeyMode mode, const QString &key, KeyAction action); diff --git a/src/widgets/BrowserApp.cpp b/src/widgets/BrowserApp.cpp index 13d855b..f2d541d 100644 --- a/src/widgets/BrowserApp.cpp +++ b/src/widgets/BrowserApp.cpp @@ -7,24 +7,24 @@ #include "widgets/BrowserWindow.hpp" BrowserApp::BrowserApp() { - auto *lua = LuaRuntime::instance(); - lua->start_event_loop(); + auto &lua = LuaRuntime::instance(); + lua.start_event_loop(); // Router init - auto *router = WindowActionRouter::instance(); - router->initialize(); + auto &router = WindowActionRouter::instance(); + router.initialize(); // Global event filter qApp->installEventFilter(this); // NOTE: TMP - LuaRuntime::instance()->load_file("./config.lua"); + lua.load_file("./config.lua"); }; BrowserWindow *BrowserApp::create_window() { auto *win = new BrowserWindow((const Configuration &)configuration); - WindowActionRouter::instance()->add_window(win); win->setWindowTitle("null-browser"); + WindowActionRouter::instance().add_window(win); win->show(); return win; } @@ -33,7 +33,7 @@ bool BrowserApp::eventFilter(QObject *target, QEvent *event) { if (event->type() != QEvent::KeyPress) return false; - for (const auto &match : WindowActionRouter::instance()->windows()) { + for (const auto &match : WindowActionRouter::instance().windows()) { auto *win = match.second; if (auto *target_widget = dynamic_cast(target); diff --git a/src/widgets/BrowserWindow.cpp b/src/widgets/BrowserWindow.cpp index 886572e..e38f234 100644 --- a/src/widgets/BrowserWindow.cpp +++ b/src/widgets/BrowserWindow.cpp @@ -26,35 +26,47 @@ BrowserWindow::BrowserWindow(const Configuration &configuration) new WebViewStack(&configuration, new QWebEngineProfile("null-browser")); layout->addWidget(web_view_stack); - auto *keymap_evaluator = KeymapEvaluator::instance(); + auto &keymap_evaluator = KeymapEvaluator::instance(); // TODO: remove - keymap_evaluator->add_keymap(KeyMode::Normal, "i", [keymap_evaluator]() { - keymap_evaluator->set_current_mode(KeyMode::Insert); + keymap_evaluator.add_keymap(KeyMode::Normal, "i", [&keymap_evaluator]() { + keymap_evaluator.set_current_mode(KeyMode::Insert); }); - keymap_evaluator->add_keymap(KeyMode::Insert, "", [keymap_evaluator]() { - keymap_evaluator->set_current_mode(KeyMode::Normal); + keymap_evaluator.add_keymap(KeyMode::Insert, "", [&keymap_evaluator]() { + keymap_evaluator.set_current_mode(KeyMode::Normal); }); - keymap_evaluator->add_keymap(KeyMode::Normal, "a", - []() { qDebug() << "Stuff"; }); - - input_mediator = new WindowMediator(web_view_stack); - - auto *lua = LuaRuntime::instance(); - lua->queue_task([this]() { - emit input_mediator->url_opened("https://github.com/phenax/null-browser", - OpenType::OpenUrl, 0); - emit input_mediator->url_opened("https://ediblemonad.dev", - OpenType::OpenUrlInBgTab, 0); - emit input_mediator->url_opened("https://github.com/trending", - OpenType::OpenUrlInBgTab, 0); + keymap_evaluator.add_keymap(KeyMode::Normal, "a", + []() { qDebug() << "Stuff"; }); + + win_mediator = new WindowMediator(web_view_stack); + + connect(web_view_stack, &WebViewStack::current_webview_changed, this, + [this](int index) { + auto webviews = win_mediator->get_webview_list(); + if (index >= 0 && index < webviews.count()) { + const auto &webview = webviews.at(index); + setWindowTitle(webview.title); + } + }); + + // TODO: remove + auto &lua = LuaRuntime::instance(); + lua.queue_task([this]() { + emit win_mediator->url_opened("https://github.com/phenax/null-browser", + OpenType::OpenUrl, 0); + emit win_mediator->url_opened("https://ediblemonad.dev", + OpenType::OpenUrlInBgTab, 0); + emit win_mediator->url_opened("https://github.com/trending", + OpenType::OpenUrlInBgTab, 0); }); } +void BrowserWindow::closeEvent(QCloseEvent * /*event*/) { emit closed(); } + bool BrowserWindow::on_window_key_event(QKeyEvent *event) { - auto *keymap_evaluator = KeymapEvaluator::instance(); + auto &keymap_evaluator = KeymapEvaluator::instance(); const bool should_skip = - keymap_evaluator->evaluate(event->modifiers(), (Qt::Key)event->key()); + keymap_evaluator.evaluate(event->modifiers(), (Qt::Key)event->key()); return should_skip; } diff --git a/src/widgets/BrowserWindow.hpp b/src/widgets/BrowserWindow.hpp index cab7721..9aeeda3 100644 --- a/src/widgets/BrowserWindow.hpp +++ b/src/widgets/BrowserWindow.hpp @@ -14,19 +14,19 @@ class BrowserWindow : public QMainWindow { public: BrowserWindow(const Configuration &configuration); - DEFINE_GETTER(mediator, input_mediator) + DEFINE_GETTER(mediator, win_mediator) DEFINE_GETTER(get_id, win_id) DEFINE_SETTER(set_id, win_id) bool on_window_key_event(QKeyEvent *event); - void closeEvent(QCloseEvent * /*event*/) override { emit closed(); } + void closeEvent(QCloseEvent * /*event*/) override; signals: void closed(); private: - WindowMediator *input_mediator; + WindowMediator *win_mediator; const Configuration &configuration; WindowId win_id = -1; diff --git a/src/widgets/WebViewStack.cpp b/src/widgets/WebViewStack.cpp index f01b75c..6de170a 100644 --- a/src/widgets/WebViewStack.cpp +++ b/src/widgets/WebViewStack.cpp @@ -17,6 +17,9 @@ WebViewStack::WebViewStack(const Configuration *configuration, layout->setContentsMargins(0, 0, 0, 0); layout->setStackingMode(QStackedLayout::StackOne); + connect(layout, &QStackedLayout::currentChanged, this, + &WebViewStack::current_webview_changed); + create_new_webview(configuration->new_tab_url, true); } @@ -50,6 +53,8 @@ WebView *WebViewStack::create_new_webview(const QUrl &url, bool focus) { if (focus) focus_webview(webview->get_id()); + emit current_webview_changed(layout->currentIndex()); + return webview; } @@ -116,6 +121,7 @@ void WebViewStack::close(WebViewId webview_id) { // TODO: Close window on empty if (webview_list.isEmpty()) { + // window()->close(); create_new_webview(configuration->new_tab_url, true); } } diff --git a/src/widgets/WebViewStack.hpp b/src/widgets/WebViewStack.hpp index 40c2184..0f0d923 100644 --- a/src/widgets/WebViewStack.hpp +++ b/src/widgets/WebViewStack.hpp @@ -45,6 +45,9 @@ public: /// @deprecated TODO: Remove uint32_t current_webview_index(); +signals: + void current_webview_changed(int index); + protected: void set_current_url(const QUrl &url); WebView *create_new_webview(const QUrl &url, bool focus = false); -- cgit v1.3.1