Repository :
https://github.com/FarGroup/FarManager
On branch : master
Link :
https://github.com/FarGroup/FarManager/commit/4666b01d411c522d4ceb1ffe68f32b824beb85f5
>---------------------------------------------------------------
commit 4666b01d411c522d4ceb1ffe68f32b824beb85f5
Author: Michael Z. Kadaner <
MKad...@users.noreply.github.com>
Date: Sat Sep 20 13:14:12 2025 -0400
gh-1009: gh-1010: gh-1011: An item in Find All menu can be longer than max short.
>---------------------------------------------------------------
4666b01d411c522d4ceb1ffe68f32b824beb85f5
far/editor.cpp | 26 +++++++++++++++++++++-----
far/vmenu.cpp | 12 ++++--------
far/vmenu.hpp | 8 ++++----
far/vmenu2.cpp | 2 +-
far/vmenu2.hpp | 2 +-
5 files changed, 31 insertions(+), 19 deletions(-)
diff --git a/far/editor.cpp b/far/editor.cpp
index 54ffeef69..afcfe52ea 100644
--- a/far/editor.cpp
+++ b/far/editor.cpp
@@ -3405,7 +3405,7 @@ int Editor::CalculateSearchNextPositionInTheLine(const bool Backward, const bool
namespace
{
- [[nodiscard]] short radix10_formatted_width(const size_t num)
+ [[nodiscard]] short radix10_formatted_width(const unsigned long long num)
{
return static_cast<short>(std::log10(num)) + 1;
}
@@ -3459,17 +3459,17 @@ namespace
m_Menu->SetFixedColumns(
{
{
- .TextSegment{ LineNumColumnStart, small_segment::length_tag{ LineNumColumnWidth } },
+ .TextSegment{ LineNumColumnStart, segment::length_tag{ LineNumColumnWidth } },
.CurrentWidth = LineNumColumnWidth,
.Separator = BoxSymbols[BS_V1]
},
{
- .TextSegment{ FoundPosColumnStart, small_segment::length_tag{ FoundPosColumnWidth } },
+ .TextSegment{ FoundPosColumnStart, segment::length_tag{ FoundPosColumnWidth } },
.CurrentWidth = FoundPosColumnWidth,
.Separator = BoxSymbols[BS_V1]
},
},
- small_segment::ray(ItemTextStart)
+ segment::ray(ItemTextStart)
);
m_Menu->ListBox().RegisterExtendedDataProvider([](const menu_item_ex& Item)
{
@@ -3501,7 +3501,7 @@ namespace
private:
const short m_LineNumColumnMaxWidth{};
- static constexpr short m_FoundPosColumnMaxWidth{ 6 }; // Enough?
+ static constexpr short m_FoundPosColumnMaxWidth{ 10 }; // Enough?
int m_MaxLineNum{};
int m_MaxFoundPos{};
int m_LastSeenLine{ -1 };
@@ -7123,6 +7123,22 @@ TEST_CASE("radix10_formatted_width")
{
return radix10_formatted_width(Value) == static_cast<short>(std::format("{}", Value).size());
}));
+ REQUIRE(std::ranges::all_of(
+ std::ranges::iota_view(
+ static_cast<unsigned long long>(std::numeric_limits<int>::max()) - 10,
+ static_cast<unsigned long long>(std::numeric_limits<int>::max()) + 10),
+ [](const auto Value) -> bool
+ {
+ return radix10_formatted_width(Value) == static_cast<short>(std::format("{}", Value).size());
+ }));
+ REQUIRE(std::ranges::all_of(
+ std::ranges::iota_view(
+ static_cast<unsigned long long>(std::numeric_limits<unsigned int>::max()) - 10,
+ static_cast<unsigned long long>(std::numeric_limits<unsigned int>::max()) + 10),
+ [](const auto Value) -> bool
+ {
+ return radix10_formatted_width(Value) == static_cast<short>(std::format("{}", Value).size());
+ }));
}
#endif
diff --git a/far/vmenu.cpp b/far/vmenu.cpp
index 1ed2b9c25..8662705bb 100644
--- a/far/vmenu.cpp
+++ b/far/vmenu.cpp
@@ -551,7 +551,7 @@ namespace
return !(Item.Flags & (LIF_HIDDEN | LIF_FILTERED));
}
- string_view get_item_cell_text(string_view ItemName, small_segment CellSegment)
+ string_view get_item_cell_text(string_view ItemName, segment CellSegment)
{
const auto Intersection{ intersect(segment{ 0, segment::length_tag{ static_cast<segment::domain_t>(ItemName.size()) } }, CellSegment) };
if (Intersection.empty()) return {};
@@ -1074,7 +1074,7 @@ void VMenu::clear()
m_MaxItemLength = 0;
m_HorizontalTracker->clear();
m_FixedColumns.clear();
- m_ItemTextSegment = small_segment::ray();
+ m_ItemTextSegment = segment::ray();
SetMenuFlags(VMENU_UPDATEREQUIRED);
}
@@ -3088,10 +3088,6 @@ void VMenu::AssignHighlights(const menu_layout& Layout)
ClearItemHotkey(Item);
}
- // Re: value_or(m_ItemTextSegment)
- // Do we need to auto-assign hotkeys if there is nowhere to show them?
- const auto TextArea{ Layout.TextArea.value_or(m_ItemTextSegment) };
-
// TODO: ЭТОТ цикл нужно уточнить - возможно вылезут артефакты (хотя не уверен)
for (auto I = Reverse ? ItemsSize - 1 : 0; I >= 0 && I < ItemsSize; I += Delta)
{
@@ -3189,12 +3185,12 @@ void VMenu::SetTitle(string_view const Title)
strTitle = Title;
}
-void VMenu::SetFixedColumns(std::vector<vmenu_fixed_column_t>&& FixedColumns, small_segment ItemTextSegment)
+void VMenu::SetFixedColumns(std::vector<vmenu_fixed_column_t>&& FixedColumns, segment ItemTextSegment)
{
m_FixedColumns = std::move(FixedColumns);
for (auto& column : m_FixedColumns)
{
- column.CurrentWidth = std::clamp(column.CurrentWidth, short{}, column.TextSegment.length());
+ column.CurrentWidth = std::clamp(column.CurrentWidth, int{}, column.TextSegment.length());
}
m_ItemTextSegment = ItemTextSegment;
}
diff --git a/far/vmenu.hpp b/far/vmenu.hpp
index bd21c9358..fd63ada3f 100644
--- a/far/vmenu.hpp
+++ b/far/vmenu.hpp
@@ -154,8 +154,8 @@ class vmenu_horizontal_tracker;
struct vmenu_fixed_column_t
{
- small_segment TextSegment;
- short CurrentWidth;
+ segment TextSegment;
+ int CurrentWidth;
wchar_t Separator;
};
@@ -196,7 +196,7 @@ public:
void SetDialogStyle(bool Style) { ChangeFlags(VMENU_WARNDIALOG, Style); SetColors(nullptr); }
void SetUpdateRequired(bool SetUpdate) { ChangeFlags(VMENU_UPDATEREQUIRED, SetUpdate); }
void SetMenuFlags(DWORD Flags) { VMFlags.Set(Flags); }
- void SetFixedColumns(std::vector<vmenu_fixed_column_t>&& FixedColumns, small_segment ItemTextSegment);
+ void SetFixedColumns(std::vector<vmenu_fixed_column_t>&& FixedColumns, segment ItemTextSegment);
void ClearFlags(DWORD Flags) { VMFlags.Clear(Flags); }
bool CheckFlags(DWORD Flags) const { return VMFlags.Check(Flags); }
DWORD GetFlags() const { return VMFlags.Flags(); }
@@ -360,7 +360,7 @@ private:
int m_MaxItemLength{}; // Each Item.Name is intersected with m_ItemTextSegment
std::unique_ptr<vmenu_horizontal_tracker> m_HorizontalTracker;
std::vector<vmenu_fixed_column_t> m_FixedColumns;
- small_segment m_ItemTextSegment{ small_segment::ray() };
+ segment m_ItemTextSegment{ segment::ray() };
extended_item_data_provider m_ExtendedDataProvider;
window_ptr CurrentWindow;
bool PrevCursorVisible{};
diff --git a/far/vmenu2.cpp b/far/vmenu2.cpp
index a5a2d8d18..ff94d2011 100644
--- a/far/vmenu2.cpp
+++ b/far/vmenu2.cpp
@@ -418,7 +418,7 @@ void VMenu2::SetMenuFlags(DWORD Flags)
SendMessage(DM_SETDLGITEMSHORT, 0, &fdi);
}
-void VMenu2::SetFixedColumns(std::vector<vmenu_fixed_column_t>&& FixedColumns, const small_segment ItemTextSegment)
+void VMenu2::SetFixedColumns(std::vector<vmenu_fixed_column_t>&& FixedColumns, const segment ItemTextSegment)
{
ListBox().SetFixedColumns(std::move(FixedColumns), ItemTextSegment);
}
diff --git a/far/vmenu2.hpp b/far/vmenu2.hpp
index 0f4ff72c8..8a6d7f998 100644
--- a/far/vmenu2.hpp
+++ b/far/vmenu2.hpp
@@ -72,7 +72,7 @@ public:
void SetBottomTitle(const string& Title);
void SetBoxType(int BoxType);
void SetMenuFlags(DWORD Flags);
- void SetFixedColumns(std::vector<vmenu_fixed_column_t>&& FixedColumns, small_segment ItemTextSegment);
+ void SetFixedColumns(std::vector<vmenu_fixed_column_t>&& FixedColumns, segment ItemTextSegment);
void EnableAutoHighlight(bool Reverse = false);
void clear();
int DeleteItem(int ID,int Count=1);