displayLayout and Rendering TUI library | 
          
| git clone git://git.dimitrijedobrota.com/display.git | 
| Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING | 
| commit | f01eb04eefe3ac6e000b5ef7ea6ae635c1b02f01 | 
| parent | d2fc74268ffffdbb80e5f8caeed5ff0adcaa02d1 | 
| author | Dimitrije Dobrota < mail@dimitrijedobrota.com > | 
| date | Wed, 12 Feb 2025 10:30:57 +0100 | 
Be more functional
| M | CMakeLists.txt | | | + - | 
| M | example/example.cpp | | | +++++++++++++++++++++++++++ ------------------------------------- | 
| M | include/display/layout.hpp | | | +++++++ ------ | 
| M | include/display/window.hpp | | | ++++ --- | 
4 files changed, 39 insertions(+), 47 deletions(-)
diff --git a/ CMakeLists.txt b/ CMakeLists.txt
          @@ -4,7 +4,7 @@ 
          include(cmake/prelude.cmake)
        
        
          project(
              display
              VERSION 0.1.14
              VERSION 0.1.15
              DESCRIPTION "TUI library"
              HOMEPAGE_URL "https://example.com/"
              LANGUAGES CXX
        
        diff --git a/ example/example.cpp b/ example/example.cpp
@@ -1,3 +1,4 @@
#include <functional>
          #include <iostream>
          #include <string>
          
          @@ -28,40 +29,6 @@ 
          void renderer(const display::Window& win, display::place_t plc)
        
        
            (void)win;
          }
          void recalculator1(display::LayoutFree& layout)
          {
            const auto [width, height] = layout.dim();
            const display::sz_t midw = width / 2;
            const display::sz_t midh = height / 2;
            layout[4]->pos() = {0, 0};
            layout[5]->pos() = {midw, 0};
            layout[6]->pos() = {width, 0};
            layout[7]->pos() = {width, midh};
            layout[0]->pos() = {width, height};
            layout[1]->pos() = {midw, height};
            layout[2]->pos() = {0, height};
            layout[3]->pos() = {0, midh};
            layout[8]->pos() = {midw, midh};
          }
          void recalculator2(display::LayoutFree& layout)
          {
            const auto [width, height] = layout.dim();
            const display::sz_t midw = width / 2;
            const display::sz_t midh = height / 2;
            layout[0]->pos() = {0, 0};
            layout[1]->pos() = {midw, 0};
            layout[2]->pos() = {width, 0};
            layout[3]->pos() = {width, midh};
            layout[4]->pos() = {width, height};
            layout[5]->pos() = {midw, height};
            layout[6]->pos() = {0, height};
            layout[7]->pos() = {0, midh};
            layout[8]->pos() = {midw, midh};
          }
          void fill(display::LayoutFree& layout)
          {
            using display::pos_t, display::dim_t, display::piv_t;
        
        
          @@ -86,13 +53,36 @@ 
          void fill(display::LayoutFree& layout)
        
        
          int main()
          {
            try {
              using namespace std::placeholders;  // NOLINT
              using namespace display;  // NOLINT
              auto& display = Display::display();
              auto& layout = display.screen().set_layout<LayoutRigid>(nullptr);
              fill(layout.screen1().set_layout<LayoutFree>(recalculator1));
              fill(layout.screen2().set_layout<LayoutFree>(recalculator2));
              const auto recalc = [](std::size_t start, LayoutFree& layout)
              {
                const auto [width, height] = layout.dim();
                const display::sz_t midw = width / 2;
                const display::sz_t midh = height / 2;
                layout[(start + 0) % 8]->pos() = {0, 0};
                layout[(start + 1) % 8]->pos() = {midw, 0};
                layout[(start + 2) % 8]->pos() = {width, 0};
                layout[(start + 3) % 8]->pos() = {width, midh};
                layout[(start + 4) % 8]->pos() = {width, height};
                layout[(start + 5) % 8]->pos() = {midw, height};
                layout[(start + 6) % 8]->pos() = {0, height};
                layout[(start + 7) % 8]->pos() = {0, midh};
                layout[8]->pos() = {midw, midh};
              };
              auto& layout1 =
                  layout.screen1().set_layout<LayoutFree>(std::bind(recalc, 4U, _1));
              fill(layout1);
              auto& layout2 =
                  layout.screen2().set_layout<LayoutFree>(std::bind(recalc, 0U, _1));
              fill(layout2);
              for (display.set_resized(); true;) {
                const auto evnt = display.get_event();
        
        diff --git a/ include/display/layout.hpp b/ include/display/layout.hpp
@@ -1,5 +1,6 @@
#pragma once
          #include <functional>
          #include <memory>
          #include <vector>
          
          @@ -13,10 +14,10 @@ 
          namespace display
        
        
          class LayoutFree : public Layout
          {
          public:
            using recalc_f = void(LayoutFree&);
            using recalc_f = std::function<void(LayoutFree&)>;
            LayoutFree(recalc_f f_recalc)  // NOLINT
                : m_recalc(f_recalc)
                : m_recalc(std::move(f_recalc))
            {
            }
          
          @@ -38,7 +39,7 @@ 
          public:
        
        
            int render(pos_t pos) const override;
          private:
            recalc_f* m_recalc;
            recalc_f m_recalc;
            std::vector<std::unique_ptr<Window>> m_windows;
            mutable bool m_is_sorted = true;
        
        
          @@ -47,10 +48,10 @@ 
          private:
        
        
          class LayoutRigid : public Layout
          {
          public:
            using recalc_f = void(LayoutRigid&);
            using recalc_f = std::function<void(LayoutRigid&)>;
            LayoutRigid(recalc_f f_recalc)  // NOLINT
                : m_recalc(f_recalc)
                : m_recalc(std::move(f_recalc))
            {
            }
          
          @@ -61,7 +62,7 @@ 
          public:
        
        
            int render(pos_t pos) const override;
          private:
            recalc_f* m_recalc;
            recalc_f m_recalc;
            Screen m_screen1;
            Screen m_screen2;
        
        diff --git a/ include/display/window.hpp b/ include/display/window.hpp
@@ -1,5 +1,6 @@
#pragma once
          #include <functional>
          #include <optional>
          #include "display/types.hpp"
        
        
          @@ -10,10 +11,10 @@ 
          namespace display
        
        
          class Window
          {
          public:
            using render_f = void(const Window&, place_t place);
            using render_f = std::function<void(const Window&, place_t place)>;
            Window(render_f frender, pos_t pos, dim_t dim, piv_t piv = {})
                : m_renderer(frender)
                : m_renderer(std::move(frender))
                , m_pos(pos)
                , m_dim(dim)
                , m_piv(piv)
        
        
          @@ -42,7 +43,7 @@ 
          public:
        
        
            std::optional<place_t> place(dim_t bounds) const;
          private:
            render_f* m_renderer;
            render_f m_renderer;
            pos_t m_pos;
            dim_t m_dim;
            piv_t m_piv;