diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5be071d..f3a4e15 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -11,6 +11,8 @@ add_executable(${PROJECT_NAME} Tui.h Command.h Command.cpp + Pager.cpp + Pager.hpp ) target_link_libraries(${PROJECT_NAME} PRIVATE LibXml2::LibXml2 cpr::cpr) diff --git a/src/Page.hpp b/src/Page.hpp index a53b628..1fa61f2 100644 --- a/src/Page.hpp +++ b/src/Page.hpp @@ -32,6 +32,7 @@ public: Page &operator-=(int); [[nodiscard]] std::string str_pretty() const; + [[nodiscard]] std::string str() const; bool refresh(); diff --git a/src/Pager.cpp b/src/Pager.cpp new file mode 100644 index 0000000..c6ce854 --- /dev/null +++ b/src/Pager.cpp @@ -0,0 +1,50 @@ +// _____ _ _____ +// |_ _|____ _| ||_ _|_ __ +// | |/ _ \ \/ / __|| | \ \ / / +// | | __/> <| |_ | | \ V / +// |_|\___/_/\_\\__||_| \_/ +// Author: Love Billenius +// License: GPL-3 + + +#include "Pager.hpp" + +Page &Pager::seek(const int number) { + Page &page = get_page_at(number); + m_page_number = number; + return page; +} + +Pager &Pager::operator+=(const int number) { + seek(m_page_number + number); + return *this; +} + +Pager &Pager::operator-=(const int number) { + seek(m_page_number - number); + return *this; +} + +Page &Pager::operator*() { + return get_page_at(m_page_number); +} + +Page *Pager::operator->() { + return &get_page_at(m_page_number); +} + +void Pager::set(const int number) { + m_page_number = number; +} + +void Pager::clear() { + m_pages.clear(); +} + +Page &Pager::get_page_at(const int number) { + if (!m_pages.contains(number)) { + const Page p(number); + m_pages[number] = p; + } + return m_pages.at(number); +} diff --git a/src/Pager.hpp b/src/Pager.hpp new file mode 100644 index 0000000..42c5567 --- /dev/null +++ b/src/Pager.hpp @@ -0,0 +1,41 @@ +// _____ _ _____ +// |_ _|____ _| ||_ _|_ __ +// | |/ _ \ \/ / __|| | \ \ / / +// | | __/> <| |_ | | \ V / +// |_|\___/_/\_\\__||_| \_/ +// Author: Love Billenius +// License: GPL-3 + +#pragma once + +#include + +#include "Page.hpp" + + +class Pager { +public: + Pager() = default; + + Page &seek(int number); + + Pager &operator+=(int number); + + Pager &operator-=(int number); + + Page &operator*(); + Page *operator->(); + + void set(int number); + + Page &get(); + + void clear(); + +private: + Page &get_page_at(int number); + +private: + std::unordered_map m_pages{}; + int m_page_number = 100; +}; diff --git a/src/Tui.cpp b/src/Tui.cpp index 7ee763d..0d14db2 100644 --- a/src/Tui.cpp +++ b/src/Tui.cpp @@ -14,11 +14,11 @@ #include #include "Command.h" +#include "Pager.hpp" -Tui::Tui(Page page) : m_page(std::move(page)) { +Tui::Tui(Pager pager) : m_pager(std::move(pager)) { } - std::optional get_page_number(const std::string_view line) { const size_t space = line.find_first_of(' '); if (space == std::string::npos) @@ -50,7 +50,7 @@ void printHelp() { } void Tui::run() { - std::cout << m_page.str_pretty() << std::endl; + std::cout << m_pager->str_pretty() << std::endl; for (;;) { std::cout << "Enter a command: "; std::flush(std::cout); @@ -71,23 +71,23 @@ void Tui::run() { std::cout << "Invalid command!" << std::endl; } else if constexpr (std::is_same_v) { try { - m_page += 1; + m_pager += 1; } catch (const std::runtime_error &e) { std::cout << e.what() << std::endl; return; } - std::cout << m_page.str_pretty() << std::endl; + std::cout << m_pager->str_pretty() << std::endl; } else if constexpr (std::is_same_v) { try { - m_page -= 1; + m_pager -= 1; } catch (const std::runtime_error &e) { std::cout << e.what() << std::endl; return; } - std::cout << m_page.str_pretty() << std::endl; + std::cout << m_pager->str_pretty() << std::endl; } else if constexpr (std::is_same_v) { - m_page.refresh(); - std::cout << m_page.str_pretty() << std::endl; + m_pager.clear(); + std::cout << m_pager->str_pretty() << std::endl; } else if constexpr (std::is_same_v) { should_exit = true; } else if constexpr (std::is_same_v) { @@ -96,12 +96,12 @@ void Tui::run() { const Command::Seek &seek = arg; const int number = seek.number; try { - m_page = Page(number); + m_pager.seek(number); } catch (const std::runtime_error &e) { std::cout << e.what() << std::endl; return; } - std::cout << m_page.str_pretty() << std::endl; + std::cout << m_pager->str_pretty() << std::endl; } }; std::visit(visitor, command); diff --git a/src/Tui.h b/src/Tui.h index e77aa6c..351960e 100644 --- a/src/Tui.h +++ b/src/Tui.h @@ -7,15 +7,15 @@ // License: GPL-3 #pragma once -#include "Page.hpp" +#include "Pager.hpp" class Tui { public: - Tui(Page page); + Tui(Pager pager); void run(); private: - Page m_page; + Pager m_pager; }; diff --git a/src/main.cpp b/src/main.cpp index 7df557f..d948673 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,10 +6,9 @@ // Author: Love Billenius // License: GPL-3 -#include "Page.hpp" #include "Tui.h" int main(int argc, char *argv[]) { - Tui tui = Page(); + Tui tui(Pager{}); tui.run(); }