diff options
| -rw-r--r-- | TODO.org | 3 | ||||
| -rw-r--r-- | include/LuaRuntime.hpp | 2 | ||||
| -rw-r--r-- | include/widgets/InputLine.hpp | 3 | ||||
| -rw-r--r-- | include/widgets/MainWindow.hpp | 25 | ||||
| -rw-r--r-- | src/LuaRuntime.cpp | 4 | ||||
| -rw-r--r-- | src/widgets/InputLine.cpp | 8 | ||||
| -rw-r--r-- | src/widgets/MainWindow.cpp | 43 |
7 files changed, 67 insertions, 21 deletions
@@ -4,10 +4,13 @@ - [X] Lua for command input - [X] Simpler shell-ey/vimscript-ey language for command input - [X] Command completion +- [X] Command/URL input executor - [ ] Buffer list/search - [ ] Modal keys - [ ] Tab history navigation - [ ] Refactor MainWindow +- [ ] Press tab/shift-tab for next/prev in completion +- [ ] Enter in completion should run cmd ** Next - [ ] History persistance diff --git a/include/LuaRuntime.hpp b/include/LuaRuntime.hpp index 96c0004..83ebf0c 100644 --- a/include/LuaRuntime.hpp +++ b/include/LuaRuntime.hpp @@ -20,7 +20,7 @@ protected: ~LuaRuntime(); signals: - void urlOpenned(QString url, OpenType openType); + void urlOpened(QString url, OpenType openType); protected: static int lua_onUrlOpen(lua_State *state); diff --git a/include/widgets/InputLine.hpp b/include/widgets/InputLine.hpp index 2324f18..1d98c9a 100644 --- a/include/widgets/InputLine.hpp +++ b/include/widgets/InputLine.hpp @@ -18,6 +18,7 @@ public: QString getInputCommand(); void setInputText(QString text); void setAdapter(Adapter *adapter); + Adapter *adapter(); signals: void submitted(QString command); @@ -31,5 +32,5 @@ private: QBoxLayout *layout; QLineEdit *input; QLabel *promptPrefix; - Adapter *adapter = nullptr; + Adapter *adapterInstance = nullptr; }; diff --git a/include/widgets/MainWindow.hpp b/include/widgets/MainWindow.hpp index b64bf8c..4731fe4 100644 --- a/include/widgets/MainWindow.hpp +++ b/include/widgets/MainWindow.hpp @@ -9,21 +9,44 @@ #include "widgets/BrowserManager.hpp" #include "widgets/InputLine.hpp" +class EvaluationType { +public: + EvaluationType() {} + virtual ~EvaluationType() = default; +}; +class NoopEval : public EvaluationType {}; + class MainWindow : public QMainWindow { public: MainWindow(); protected: void keyPressEvent(QKeyEvent *event) override; + void onInputSubmit(QString input); void evaluateCommand(QString command); void hideInputLine(); void showInputLine(); - void showURLInput(QString url = ""); + void showURLInput(QString url, OpenType openType); void showCommandInput(QString command = ""); + void setEvaluationType(EvaluationType *); + private: BrowserManager *browserManager; InputLine *inputLine; LuaRuntime *luaRuntime; QStackedLayout *layout; + + EvaluationType *currentEvaluationType = new NoopEval(); }; + +class UrlEval : public EvaluationType { +public: + UrlEval(OpenType type) : EvaluationType(), openType(type) {} + OpenType type() { return openType; } + +private: + OpenType openType; +}; + +class CommandEval : public EvaluationType {}; diff --git a/src/LuaRuntime.cpp b/src/LuaRuntime.cpp index 6867b61..e4a5289 100644 --- a/src/LuaRuntime.cpp +++ b/src/LuaRuntime.cpp @@ -22,14 +22,14 @@ void LuaRuntime::evaluate(QString code) { int LuaRuntime::lua_onUrlOpen(lua_State *state) { const char *url = luaL_optstring(state, 1, ""); auto runtime = LuaRuntime::instance(); - emit runtime->urlOpenned(url, OpenType::OpenUrl); + emit runtime->urlOpened(url, OpenType::OpenUrl); return 1; } int LuaRuntime::lua_onUrlTabOpen(lua_State *state) { const char *url = luaL_optstring(state, 1, ""); auto runtime = LuaRuntime::instance(); - emit runtime->urlOpenned(url, OpenType::OpenUrlInTab); + emit runtime->urlOpened(url, OpenType::OpenUrlInTab); return 1; } diff --git a/src/widgets/InputLine.cpp b/src/widgets/InputLine.cpp index d577e1d..5edfe17 100644 --- a/src/widgets/InputLine.cpp +++ b/src/widgets/InputLine.cpp @@ -54,10 +54,12 @@ InputLine::InputLine(QString defaultInput, QWidget *parentNode) setAdapter(new CommandsAdapter()); } +Adapter *InputLine::adapter() { return adapterInstance; } + void InputLine::setAdapter(Adapter *adapter) { - if (this->adapter) - delete this->adapter; - this->adapter = adapter; + if (this->adapterInstance) + delete this->adapterInstance; + this->adapterInstance = adapter; promptPrefix->setText(adapter->prompt()); input->setCompleter(adapter->completer()); } diff --git a/src/widgets/MainWindow.cpp b/src/widgets/MainWindow.cpp index 03a4e6e..f2825e8 100644 --- a/src/widgets/MainWindow.cpp +++ b/src/widgets/MainWindow.cpp @@ -30,13 +30,13 @@ MainWindow::MainWindow() { inputLine = new InputLine; inputLine->setHidden(true); inputLine->move(0, 0); - connect(inputLine, &InputLine::submitted, this, &MainWindow::evaluateCommand); + connect(inputLine, &InputLine::submitted, this, &MainWindow::onInputSubmit); connect(inputLine, &InputLine::cancelled, this, &MainWindow::hideInputLine); layout->addWidget(inputLine); // Lua runtime luaRuntime = LuaRuntime::instance(); - connect(luaRuntime, &LuaRuntime::urlOpenned, this, + connect(luaRuntime, &LuaRuntime::urlOpened, this, [this](QString url, OpenType openType) { browserManager->openUrl(QUrl(url), openType); }); @@ -53,21 +53,36 @@ void MainWindow::showInputLine() { inputLine->setInputFocus(true); } -void MainWindow::showURLInput(QString url) { - showInputLine(); +void MainWindow::showURLInput(QString url, OpenType openType) { + setEvaluationType(new UrlEval(openType)); inputLine->setAdapter(new UrlAdapter); inputLine->setInputText(url); + showInputLine(); } void MainWindow::showCommandInput(QString cmd) { - showInputLine(); + setEvaluationType(new CommandEval()); inputLine->setAdapter(new CommandsAdapter); inputLine->setInputText(cmd); + showInputLine(); +} +void MainWindow::setEvaluationType(EvaluationType *evalType) { + if (currentEvaluationType) + delete currentEvaluationType; + currentEvaluationType = evalType; } -void MainWindow::evaluateCommand(QString command) { +void MainWindow::onInputSubmit(QString input) { hideInputLine(); + if (dynamic_cast<CommandEval *>(currentEvaluationType)) { + evaluateCommand(input); + } else if (auto urlEval = dynamic_cast<UrlEval *>(currentEvaluationType)) { + browserManager->openUrl(input, urlEval->type()); + } +} + +void MainWindow::evaluateCommand(QString command) { CommandParser parser; auto cmd = parser.parse(command); @@ -76,14 +91,16 @@ void MainWindow::evaluateCommand(QString command) { luaRuntime->evaluate(cmd.argsString); break; case CommandType::Open: - if (cmd.argsString.trimmed().isEmpty()) { - showURLInput(); - } else { + if (cmd.argsString.trimmed().isEmpty()) + showURLInput("", OpenType::OpenUrl); + else browserManager->openUrl(cmd.argsString, OpenType::OpenUrl); - } break; case CommandType::TabOpen: - browserManager->openUrl(cmd.argsString, OpenType::OpenUrlInTab); + if (cmd.argsString.trimmed().isEmpty()) + showURLInput("", OpenType::OpenUrlInTab); + else + browserManager->openUrl(cmd.argsString, OpenType::OpenUrlInTab); break; case CommandType::TabNext: browserManager->nextWebView(); @@ -100,10 +117,10 @@ void MainWindow::keyPressEvent(QKeyEvent *event) { auto combo = event->keyCombination(); if (combo.key() == Qt::Key_L && combo.keyboardModifiers().testFlag(Qt::ControlModifier)) { - showURLInput(browserManager->currentUrl().toString()); + showURLInput(browserManager->currentUrl().toString(), OpenType::OpenUrl); } else if (combo.key() == Qt::Key_Semicolon && combo.keyboardModifiers().testFlag(Qt::ControlModifier)) { - showCommandInput(); + showCommandInput(""); } else if (combo.key() == Qt::Key_T && combo.keyboardModifiers().testFlag(Qt::ControlModifier)) { browserManager->createNewWebView(QUrl("https://lite.duckduckgo.com"), true); |
