display

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

commited9c35afa50572c55d4bd8765a3c90c5018faed0
parent6d854e1e253d3d9237b09ab513d6d03061a54526
authorDimitrije Dobrota <mail@dimitrijedobrota.com>
dateFri, 7 Feb 2025 11:10:01 +0100

Index sort to allow inorder access

Diffstat:
MCMakeLists.txt|+-
Mexample/example.cpp|++++----
Minclude/display/layout.hpp|++++-
Msource/layout.cpp|+++++++++++++++-------

4 files changed, 24 insertions(+), 13 deletions(-)


diff --git a/CMakeLists.txt b/CMakeLists.txt

@@ -4,7 +4,7 @@ include(cmake/prelude.cmake)

project(
display
VERSION 0.1.3
VERSION 0.1.4
DESCRIPTION "TUI library"
HOMEPAGE_URL "https://example.com/"
LANGUAGES CXX

diff --git a/example/example.cpp b/example/example.cpp

@@ -30,10 +30,10 @@ int main()

display::start();
display::LayoutFree layout;
layout.add_window({{3, 3}, {15, 15}});
layout.add_window({{0, 0}, {10, 10}}, 1);
layout.add_window({{5, 5}, {5, 10}}, 1);
layout.add_window({{15, 15}, {5, 10}}, 1);
layout.append({{3, 3}, {15, 15}});
layout.append({{0, 0}, {10, 10}}, 1);
layout.append({{5, 5}, {5, 10}}, 1);
layout.append({{15, 15}, {5, 10}}, 1);
layout.render(renderer);
while (true) {

diff --git a/include/display/layout.hpp b/include/display/layout.hpp

@@ -46,7 +46,10 @@ class LayoutFree

public:
using render_f = int(Window&);
void add_window(Window window, int zidx = -1);
auto operator[](std::size_t idx) const { return std::get<1>(m_windows[idx]); }
auto operator[](std::size_t idx) { return std::get<1>(m_windows[idx]); }
void append(Window window, int zidx = -1);
int render(render_f renderer);

diff --git a/source/layout.cpp b/source/layout.cpp

@@ -1,11 +1,12 @@

#include <algorithm>
#include <numeric>
#include "display/layout.hpp"
namespace display
{
void LayoutFree::add_window(Window window, int zidx)
void LayoutFree::append(Window window, int zidx)
{
m_windows.emplace_back(zidx, std::move(window));
m_is_sorted = false;

@@ -13,16 +14,23 @@ void LayoutFree::add_window(Window window, int zidx)

int LayoutFree::render(render_f renderer)
{
static std::vector<std::uint8_t> idxs;
if (!m_is_sorted) {
std::stable_sort(m_windows.begin(), // NOLINT
m_windows.end(),
[](auto& fst, auto& sec)
{ return std::get<0>(fst) < std::get<0>(sec); });
idxs.resize(m_windows.size());
std::iota(idxs.begin(), idxs.end(), 0);
std::stable_sort(idxs.begin(), // NOLINT
idxs.end(),
[&](auto left, auto right)
{
return std::get<0>(m_windows[left])
< std::get<0>(m_windows[right]);
});
m_is_sorted = true;
}
for (auto& [_, window] : m_windows) {
const auto res = renderer(window);
for (const auto idx : idxs) {
const auto res = renderer(std::get<1>(m_windows[idx]));
if (res != 0) {
return res;
}