summaryrefslogtreecommitdiff
path: root/src/inputManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/inputManager.cpp')
-rw-r--r--src/inputManager.cpp64
1 files changed, 51 insertions, 13 deletions
diff --git a/src/inputManager.cpp b/src/inputManager.cpp
index 8de26bd..cc3880b 100644
--- a/src/inputManager.cpp
+++ b/src/inputManager.cpp
@@ -1,10 +1,43 @@
#include "inputManager.hpp"
+#include "IOManager.hpp"
#include "chatManager.hpp"
#include "commandHandler.hpp"
#include "log.hpp"
-#include <iostream>
+#include "renderManager.hpp"
+#include "scroller.hpp"
+
+CInputManager::CInputManager()
+ : m_input(ftxui::Input(&m_szInput, "Type here...", {.transform = [](ftxui::InputState state) {
+ state.element |= ftxui::bgcolor(ftxui::Color::HSVA(0, 0, 0, 0));
+ state.element |= ftxui::color(ftxui::Color::White);
+ return state.element; }, .multiline = false, .on_enter = [&] {
+ if (m_szInput.empty())
+ return;
+
+ g_pCommandHandler->isCommand(m_szInput) ? g_pCommandHandler->handleCommand(m_szInput) : g_pChatManager->newMessage({.msg = m_szInput, .username = "Server"});
+ m_szInput.clear(); }}) // NOLINT
+ )
+ , inputComponent(ftxui::Renderer(m_input, [&] {
+ return ftxui::hbox({
+ ftxui::text("> "),
+ m_input->Render(),
+ });
+ }))
+ , logComponent(ftxui::Renderer([] {
+ std::vector<ftxui::Element> messages;
+ for (const auto &[chat, log] : g_pIOManager->getIO()) {
+ if (chat && !chat->msg.empty()) {
+ std::string username = chat->username;
+ if (username.back() == '\n')
+ username.pop_back();
+ messages.push_back(ftxui::window(ftxui::text(username), ftxui::paragraph(chat->msg)));
+ } else if (log && !log->log.empty())
+ messages.push_back(ftxui::window(ftxui::text(NFormatter::fmt(log->type, "")), ftxui::paragraph(log->log)));
+ }
+
+ return ftxui::vbox(messages);
+ })) {
-CInputManager::CInputManager() {
log(LOG, "InputManager: initialized");
}
@@ -12,19 +45,24 @@ CInputManager::~CInputManager() {
log(SYS, "InputManager: bye");
}
-void CInputManager::run() {
- inputLoop();
+void CInputManager::updateIO() {
+ logComponent->OnEvent(ftxui::Event::Custom);
+ g_pRenderManager->screen.PostEvent(ftxui::Event::Custom);
}
void CInputManager::inputLoop() {
- while (true) {
- std::string input;
- std::print("> ");
- std::getline(std::cin, input);
-
- if (input.empty())
- continue;
+ container = logComponent |= ftxui::Scroller;
+ container = ftxui::ResizableSplitBottom(inputComponent, container, &bottomSize);
- g_pCommandHandler->isCommand(input) ? g_pCommandHandler->handleCommand(input) : g_pChatManager->newMessage({.msg = input, .username = "Server"});
- }
+ // FIXME: this shit spams TakeFocus(not ideal for power etc reasons)
+ // consider: custom loop, or just only allow focus to be inputComponent somehow
+ container |= ftxui::CatchEvent([&](ftxui::Event) {
+ inputComponent->TakeFocus();
+ return false;
+ });
+ g_pRenderManager->setRenderer(ftxui::Renderer(container, [this] {
+ return container->Render() | ftxui::border;
+ }));
+ inputComponent->TakeFocus();
+ g_pRenderManager->enterLoop();
}