Skip to content

Commit 3f5ba0e

Browse files
committed
Added multiline status line support
1 parent c05a8de commit 3f5ba0e

7 files changed

Lines changed: 909 additions & 559 deletions

File tree

far/common.tests.cpp

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2335,4 +2335,145 @@ TEST_CASE("view.zip.dynamic")
23352335
REQUIRE(Index == 3);
23362336
}
23372337
}
2338+
2339+
//----------------------------------------------------------------------------
2340+
2341+
#include "panel.hpp"
2342+
#include "panelmix.hpp"
2343+
2344+
TEST_CASE("panelmix.StatusViewSettings")
2345+
{
2346+
const auto CheckNameEmptySize = [](string_view const Widths)
2347+
{
2348+
const auto Lines = deserialize_status_line_settings(L"N||S"sv, Widths);
2349+
2350+
REQUIRE(Lines.size() == 3uz);
2351+
REQUIRE(Lines[0].size() == 1uz);
2352+
REQUIRE(Lines[0][0].type == column_type::name);
2353+
REQUIRE(Lines[0][0].width == 10);
2354+
2355+
REQUIRE(Lines[1].empty());
2356+
2357+
REQUIRE(Lines[2].size() == 1uz);
2358+
REQUIRE(Lines[2][0].type == column_type::size);
2359+
REQUIRE(Lines[2][0].width == 5);
2360+
2361+
const auto [ColumnTitles, ColumnWidths] = serialize_status_line_settings(Lines);
2362+
REQUIRE(ColumnTitles == L"N||S"sv);
2363+
REQUIRE(ColumnWidths == L"10||5"sv);
2364+
};
2365+
2366+
CheckNameEmptySize(L"10,5"sv);
2367+
CheckNameEmptySize(L"10|5"sv);
2368+
CheckNameEmptySize(L"10||5"sv);
2369+
2370+
{
2371+
const auto Lines = deserialize_status_line_settings(L"<foo|bar>||N"sv, L"7,8"sv);
2372+
2373+
REQUIRE(Lines.size() == 3uz);
2374+
REQUIRE(Lines[0].size() == 1uz);
2375+
REQUIRE(Lines[0][0].type == column_type::custom_0);
2376+
REQUIRE(Lines[0][0].title == L"foo|bar"sv);
2377+
REQUIRE(Lines[0][0].width == 7);
2378+
REQUIRE(Lines[1].empty());
2379+
REQUIRE(Lines[2].size() == 1uz);
2380+
REQUIRE(Lines[2][0].type == column_type::name);
2381+
REQUIRE(Lines[2][0].width == 8);
2382+
2383+
const auto [ColumnTitles, ColumnWidths] = serialize_status_line_settings(Lines);
2384+
REQUIRE(ColumnTitles == L"<foo|bar>||N"sv);
2385+
REQUIRE(ColumnWidths == L"7||8"sv);
2386+
}
2387+
2388+
{
2389+
const auto Lines = deserialize_status_line_settings(L"||"sv, L"10,5"sv);
2390+
REQUIRE(Lines.size() == 3uz);
2391+
REQUIRE(std::ranges::all_of(Lines, std::mem_fn(&status_line::empty)));
2392+
2393+
const auto [ColumnTitles, ColumnWidths] = serialize_status_line_settings(Lines);
2394+
REQUIRE(ColumnTitles == L"||"sv);
2395+
REQUIRE(ColumnWidths == L"||"sv);
2396+
}
2397+
2398+
{
2399+
const auto Lines = deserialize_status_line_settings(L"N|S"sv, L"10%,5,7"sv);
2400+
REQUIRE(Lines.size() == 2uz);
2401+
REQUIRE(Lines[0].size() == 1uz);
2402+
REQUIRE(Lines[0][0].width == 10);
2403+
REQUIRE(Lines[0][0].width_type == col_width::percent);
2404+
REQUIRE(Lines[1].size() == 1uz);
2405+
REQUIRE(Lines[1][0].width == 5);
2406+
2407+
const auto [ColumnTitles, ColumnWidths] = serialize_status_line_settings(Lines);
2408+
REQUIRE(ColumnTitles == L"N|S"sv);
2409+
REQUIRE(ColumnWidths == L"10%|5"sv);
2410+
}
2411+
2412+
{
2413+
const auto Lines = deserialize_status_line_settings(L"N|S"sv, L"10"sv);
2414+
REQUIRE(Lines.size() == 2uz);
2415+
REQUIRE(Lines[0][0].width == 10);
2416+
REQUIRE(Lines[1][0].width == 0);
2417+
2418+
const auto [ColumnTitles, ColumnWidths] = serialize_status_line_settings(Lines);
2419+
REQUIRE(ColumnTitles == L"N|S"sv);
2420+
REQUIRE(ColumnWidths == L"10|0"sv);
2421+
}
2422+
2423+
{
2424+
const auto Lines = deserialize_status_line_settings(L""sv, L""sv);
2425+
REQUIRE(Lines.size() == 1uz);
2426+
REQUIRE(Lines.front().empty());
2427+
2428+
const auto [ColumnTitles, ColumnWidths] = serialize_status_line_settings(Lines);
2429+
REQUIRE(ColumnTitles.empty());
2430+
REQUIRE(ColumnWidths.empty());
2431+
}
2432+
}
2433+
2434+
TEST_CASE("panel.PanelViewSettingsClone")
2435+
{
2436+
{
2437+
PanelViewSettings Settings;
2438+
Settings.PanelColumns =
2439+
{
2440+
{ column_type::name, COLFLAGS_NONE, 42, },
2441+
};
2442+
Settings.Name = L"test"sv;
2443+
Settings.Flags = PVS_FULLSCREEN;
2444+
2445+
const auto Clone = Settings.clone();
2446+
2447+
REQUIRE(Clone.PanelColumns.size() == 1uz);
2448+
REQUIRE(Clone.PanelColumns[0].type == column_type::name);
2449+
REQUIRE(Clone.StatusLines.empty());
2450+
REQUIRE(Clone.Name == L"test"sv);
2451+
REQUIRE(Clone.Flags == PVS_FULLSCREEN);
2452+
}
2453+
2454+
{
2455+
PanelViewSettings Settings;
2456+
Settings.StatusLines =
2457+
{
2458+
{
2459+
{ column_type::name, COLFLAGS_RIGHTALIGN, 10, },
2460+
},
2461+
{
2462+
{ column_type::size, COLFLAGS_NONE, 5, },
2463+
},
2464+
};
2465+
2466+
const auto Clone = Settings.clone();
2467+
2468+
REQUIRE(Clone.StatusLines.size() == 2uz);
2469+
REQUIRE(Clone.StatusLines[0].size() == 1uz);
2470+
REQUIRE(Clone.StatusLines[0][0].type == column_type::name);
2471+
REQUIRE(Clone.StatusLines[0][0].type_flags == COLFLAGS_RIGHTALIGN);
2472+
REQUIRE(Clone.StatusLines[0][0].width == 10);
2473+
REQUIRE(Clone.StatusLines[1].size() == 1uz);
2474+
REQUIRE(Clone.StatusLines[1][0].type == column_type::size);
2475+
REQUIRE(Clone.StatusLines[1][0].type_flags == COLFLAGS_NONE);
2476+
REQUIRE(Clone.StatusLines[1][0].width == 5);
2477+
}
2478+
}
23382479
#endif

far/config.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,7 @@ static void ResetViewModes(std::span<PanelViewSettings> const Modes, int const I
953953
{
954954
static const struct
955955
{
956-
std::initializer_list<column> PanelColumns, StatusColumns;
956+
std::initializer_list<column> PanelColumns, StatusLine;
957957
unsigned long long Flags;
958958
}
959959
InitialModes[]
@@ -1113,7 +1113,7 @@ static void ResetViewModes(std::span<PanelViewSettings> const Modes, int const I
11131113
const auto InitMode = [](const auto& src, auto& dst)
11141114
{
11151115
dst.PanelColumns = src.PanelColumns;
1116-
dst.StatusColumns = src.StatusColumns;
1116+
dst.StatusLines = { src.StatusLine };
11171117
dst.Flags = src.Flags;
11181118
dst.Name.clear();
11191119
};
@@ -1348,7 +1348,7 @@ void Options::SetFilePanelModes()
13481348

13491349
ModeDlg[MD_EDITNAME].strData = CurrentSettings.Name;
13501350
std::tie(ModeDlg[MD_EDITTYPES].strData, ModeDlg[MD_EDITWIDTHS].strData) = SerialiseViewSettings(CurrentSettings.PanelColumns);
1351-
std::tie(ModeDlg[MD_EDITSTATUSTYPES].strData, ModeDlg[MD_EDITSTATUSWIDTHS].strData) = SerialiseViewSettings(CurrentSettings.StatusColumns);
1351+
std::tie(ModeDlg[MD_EDITSTATUSTYPES].strData, ModeDlg[MD_EDITSTATUSWIDTHS].strData) = serialize_status_line_settings(CurrentSettings.StatusLines);
13521352
}
13531353

13541354
int ExitCode;
@@ -1376,7 +1376,7 @@ void Options::SetFilePanelModes()
13761376

13771377
NewSettings.Name = ModeDlg[MD_EDITNAME].strData;
13781378
NewSettings.PanelColumns = DeserialiseViewSettings(ModeDlg[MD_EDITTYPES].strData, ModeDlg[MD_EDITWIDTHS].strData);
1379-
NewSettings.StatusColumns = DeserialiseViewSettings(ModeDlg[MD_EDITSTATUSTYPES].strData, ModeDlg[MD_EDITSTATUSWIDTHS].strData);
1379+
NewSettings.StatusLines = deserialize_status_line_settings(ModeDlg[MD_EDITSTATUSTYPES].strData, ModeDlg[MD_EDITSTATUSWIDTHS].strData);
13801380
}
13811381
else
13821382
{
@@ -2861,7 +2861,7 @@ void Options::ReadPanelModes()
28612861
if (!StatusColumnTitles.empty())
28622862
{
28632863
const auto StatusColumnWidths = cfg->GetValue<string>(Key, ModesStatusColumnWidthsName);
2864-
i.StatusColumns = DeserialiseViewSettings(StatusColumnTitles, StatusColumnWidths);
2864+
i.StatusLines = deserialize_status_line_settings(StatusColumnTitles, StatusColumnWidths);
28652865
}
28662866
};
28672867

@@ -2897,7 +2897,7 @@ void Options::SavePanelModes(bool always)
28972897
const auto SaveMode = [&](HierarchicalConfig::key const ModesKey, PanelViewSettings const& Item, size_t Index)
28982898
{
28992899
const auto [PanelTitles, PanelWidths] = SerialiseViewSettings(Item.PanelColumns);
2900-
const auto [StatusTitles, StatusWidths] = SerialiseViewSettings(Item.StatusColumns);
2900+
const auto [StatusTitles, StatusWidths] = serialize_status_line_settings(Item.StatusLines);
29012901

29022902
const auto Key = cfg->CreateKey(ModesKey, str(Index));
29032903

0 commit comments

Comments
 (0)