From d400369084107104f51fe217d5781c8d7bd07ff9 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Mon, 10 Mar 2025 00:20:31 +0530 Subject: Add dumb command parser --- include/CommandParser.hpp | 31 +++++++++++++++++++++++++++++++ include/widgets/MainWindow.hpp | 2 ++ src/CommandParser.cpp | 32 ++++++++++++++++++++++++++++++++ src/widgets/MainWindow.cpp | 39 ++++++++++++++++++++++++++++----------- 4 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 include/CommandParser.hpp create mode 100644 src/CommandParser.cpp diff --git a/include/CommandParser.hpp b/include/CommandParser.hpp new file mode 100644 index 0000000..128b5f4 --- /dev/null +++ b/include/CommandParser.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +enum CommandType { + Noop, + LuaEval, + Open, + TabOpen, + TabNext, + TabPrev, +}; + +class Cmd { +public: + CommandType command; + QStringList args; + + Cmd(CommandType command = Noop, QStringList args = QStringList()) + : command(command), args(args) {} +}; + +class CommandParser { +public: + CommandParser(); + Cmd parse(QString command); + +private: + CommandType toCommandType(QString cmd); +}; diff --git a/include/widgets/MainWindow.hpp b/include/widgets/MainWindow.hpp index 15e2889..7f54ce2 100644 --- a/include/widgets/MainWindow.hpp +++ b/include/widgets/MainWindow.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include "LuaRuntime.hpp" @@ -23,4 +24,5 @@ private: BrowserManager *browserManager; CommandInput *commandInput; LuaRuntime *luaRuntime; + QStackedLayout *layout; }; diff --git a/src/CommandParser.cpp b/src/CommandParser.cpp new file mode 100644 index 0000000..ccb84bc --- /dev/null +++ b/src/CommandParser.cpp @@ -0,0 +1,32 @@ +#include +#include + +#include "CommandParser.hpp" + +CommandParser::CommandParser() {} + +Cmd CommandParser::parse(QString input) { + auto parts = input.split(QRegularExpression("\\s+"), Qt::SkipEmptyParts); + + if (parts.isEmpty()) + return Cmd(); + + auto cmd = toCommandType(parts.first()); + parts.removeFirst(); + return Cmd(cmd, parts); +} + +CommandType CommandParser::toCommandType(QString cmd) { + if (cmd == "lua") + return LuaEval; + if (cmd == "open") + return Open; + if (cmd == "tabopen") + return TabOpen; + if (cmd == "bn" || cmd == "bnext") + return TabNext; + if (cmd == "bp" || cmd == "bprevious") + return TabPrev; + + return Noop; +} diff --git a/src/widgets/MainWindow.cpp b/src/widgets/MainWindow.cpp index 14f6aa7..9ac5f12 100644 --- a/src/widgets/MainWindow.cpp +++ b/src/widgets/MainWindow.cpp @@ -3,6 +3,7 @@ #include #include +#include "CommandParser.hpp" #include "widgets/BrowserManager.hpp" #include "widgets/CommandInput.hpp" #include "widgets/MainWindow.hpp" @@ -12,7 +13,7 @@ MainWindow::MainWindow() { setCentralWidget(new QWidget()); // Root stacked layout - auto layout = new QStackedLayout(); + layout = new QStackedLayout(); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); layout->setStackingMode(QStackedLayout::StackAll); @@ -46,22 +47,38 @@ void MainWindow::hideURLInput() { } void MainWindow::showURLInput() { - commandInput->setInputText(browserManager->currentUrl().toString()); - commandInput->raise(); + commandInput->setInputText("open " + browserManager->currentUrl().toString()); commandInput->setHidden(false); + layout->setCurrentWidget(commandInput); commandInput->setInputFocus(true); } void MainWindow::evaluateCommand(QString command) { - if (!command.isEmpty()) { - // TODO: Temporary hack - if (command.startsWith("lua ")) { - luaRuntime->evaluate(command.slice(4).toStdString().c_str()); - } else { - browserManager->setCurrentUrl(command); - } - } hideURLInput(); + + // TODO: Temporary hack + CommandParser parser; + auto cmd = parser.parse(command); + + switch (cmd.command) { + case CommandType::LuaEval: + luaRuntime->evaluate(cmd.args.join(" ").toStdString().c_str()); + break; + case CommandType::Open: + browserManager->openUrl(cmd.args.first(), OpenType::OpenUrl); + break; + case CommandType::TabOpen: + browserManager->openUrl(cmd.args.at(1), OpenType::OpenUrlInTab); + break; + case CommandType::TabNext: + browserManager->nextWebView(); + break; + case CommandType::TabPrev: + browserManager->previousWebView(); + break; + case CommandType::Noop: + break; + } } void MainWindow::keyPressEvent(QKeyEvent *event) { -- cgit v1.3.1