display

Layout and Rendering TUI library
git clone git://git.dimitrijedobrota.com/display.git
Log | Files | Refs | README | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |

commitf01eb04eefe3ac6e000b5ef7ea6ae635c1b02f01
parentd2fc74268ffffdbb80e5f8caeed5ff0adcaa02d1
authorDimitrije Dobrota <mail@dimitrijedobrota.com>
dateWed, 12 Feb 2025 10:30:57 +0100

Be more functional

Diffstat:
MCMakeLists.txt|+-
Mexample/example.cpp|+++++++++++++++++++++++++++-------------------------------------
Minclude/display/layout.hpp|+++++++------
Minclude/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;