Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 8 additions & 69 deletions src/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::string> filenames = {};

for (const auto&& [idx, m] : enumerate<Model>(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;
}
12 changes: 1 addition & 11 deletions tests/controller_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
19 changes: 5 additions & 14 deletions tests/integration/command_mode_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
import time
from typing import Final

from setup import setup
from setup import TmuxRunner
Expand Down Expand Up @@ -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")
Expand Down
Loading