From 0f209fde5dbbda1ec783e07a8928a1bdb56f93c7 Mon Sep 17 00:00:00 2001 From: Ttibsi Date: Tue, 9 Jun 2026 09:49:06 +0000 Subject: [PATCH] Refactor list-buffers to run as an overlay --- src/controller.cpp | 77 +++----------------------- tests/controller_test.cpp | 12 +--- tests/integration/command_mode_test.py | 19 ++----- 3 files changed, 14 insertions(+), 94 deletions(-) diff --git a/src/controller.cpp b/src/controller.cpp index 30cf085..d9a4571 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -785,80 +785,19 @@ void Controller::add_model(const std::string& filename) { } [[nodiscard]] bool Controller::display_all_buffers() { - meta_buffers.emplace_back(term_size.vertical - 2, ""); - Model* list = &meta_buffers.at(meta_buffers.size() - 1); - - list->type = ModelType::META; - list->filename = "[BUFFERS]"; - list->readonly = true; - list->buf.reserve(32); - - std::size_t max_name_len = - std::max_element(models.begin(), models.end(), [](const auto& lhs, const auto& rhs) { - return lhs.filename.size() < rhs.filename.size(); - })->filename.size(); - - // "filename" - if (max_name_len < 8) { max_name_len = 8; } - max_name_len += 2; - - std::string title = "\u2551 id \u2502 filename" + std::string(uint_t(max_name_len - 8), ' '); - title += " \u2502 pos \u2551"; - std::size_t title_len = title.size() - 9; - - // header border - std::string top_border = "\u2554"; - for (std::size_t i = 0; i < title_len - 1; i++) { - top_border += "\u2550"; - } - top_border += "\u2557"; - list->buf.at(0) = top_border; - - // header - list->buf.push_back(title); - list->buf.push_back("\u2551"); - for (std::size_t i = 0; i < title_len - 1; i++) { - list->buf.at(2) += "\u2500"; - } - list->buf.at(2) += "\u2551"; + std::vector filenames = {}; for (const auto&& [idx, m] : enumerate(models)) { - std::string line = "\u2551 " + std::to_string(idx); - line += " \u2502 "; - line += rawterm::bold(m.filename); - - std::size_t spacing = 0; - if (max_name_len > m.filename.size()) { spacing = max_name_len - m.filename.size(); } - - if (m.unsaved) { - line += rawterm::bold("*"); - spacing--; - } + std::string line = std::format("{} \u2502 {}", idx, m.filename); - if (spacing > 0) { line += std::string(spacing, ' '); } - - line += " \u2502 "; - line += std::to_string(m.current_line + 1); - line.push_back(':'); - line += std::to_string(m.current_char + 1); - - const std::size_t diff = - title.size() - rawterm::raw_size(line) - std::string("\u2551").size(); - line += std::string(diff, ' '); - line += "\u2551"; - - list->buf.push_back(line); + if (m.unsaved) { line += rawterm::bold("*"); } + filenames.push_back(line); + if (filenames.size() == 7) { break; } } - // bottom border - std::string btm_border = "\u255A"; - for (std::size_t i = 0; i < title_len - 1; i++) { - btm_border += "\u2550"; + while (filenames.size() < 7) { + filenames.push_back(""); } - btm_border += "\u255D"; - list->buf.push_back(btm_border); - - view.view_models.push_back(list); - view.active_model++; + view.draw_overlay(filenames, "BUFFERS"); return true; } diff --git a/tests/controller_test.cpp b/tests/controller_test.cpp index c97b9de..2b9e3e3 100644 --- a/tests/controller_test.cpp +++ b/tests/controller_test.cpp @@ -212,15 +212,5 @@ TEST_CASE("display_all_buffers", "[controller]") { c.add_model("tests/fixture/lorem_ipsum.txt"); REQUIRE(c.display_all_buffers()); - - REQUIRE(c.meta_buffers.size() == 1); - Model* buf_list = &c.meta_buffers.at(0); - - REQUIRE(buf_list->type == ModelType::META); - REQUIRE(buf_list->filename == "[BUFFERS]"); - REQUIRE(buf_list->readonly); - - REQUIRE(buf_list->buf.size() == 7); - - REQUIRE(c.view.get_active_model() == buf_list); + REQUIRE(c.view.overlay_open); } diff --git a/tests/integration/command_mode_test.py b/tests/integration/command_mode_test.py index be841ca..2525fd9 100644 --- a/tests/integration/command_mode_test.py +++ b/tests/integration/command_mode_test.py @@ -1,5 +1,6 @@ import os import time +from typing import Final from setup import setup from setup import TmuxRunner @@ -299,21 +300,11 @@ def test_open_nonexisting_file_from_cmd(r: TmuxRunner): @setup("tests/fixture/test_file_1.txt", multi_file=True) def test_list_open_buffers(r: TmuxRunner): r.iris_cmd("lb") - inverted_buf_name = "\x1B[7m[BUFFERS]\x1B[0m" - assert inverted_buf_name in r.await_tab_bar_parts() + title_line: Final[str] = r.lines()[-11] - expected_lines: list[str] = [ - "║ 0 │ tests/fixture/temp_file.txt │ 1:1 ║", - "║ 1 │ NO NAME │ 1:1 ║", - "║ 2 │ tests/fixture/test_file_1.txt │ 1:1 ║", - ] - - lines: list[str] = r.lines() - assert expected_lines[0] in lines[4] - assert expected_lines[1] in lines[5] - assert expected_lines[2] in lines[6] - - assert r.await_statusbar_parts()[1] == "[RO]" + assert "BUFFERS" in title_line + assert "0 | tests/fixture/temp_file.txt" in r.lines()[-10] + assert "1 | test_file_1.txt" in r.lines()[-9] @setup("tests/fixture/test_file_1.txt")