Repository :
https://github.com/FarGroup/FarManager
On branch : master
Link :
https://github.com/FarGroup/FarManager/commit/27a36826e8929c13280df17711fbdbdfb2380b18
>---------------------------------------------------------------
commit 27a36826e8929c13280df17711fbdbdfb2380b18
Author: Alex Alabuzhev <
alab...@gmail.com>
Date: Sat Jul 18 14:20:52 2026 +0100
Refactoring
>---------------------------------------------------------------
27a36826e8929c13280df17711fbdbdfb2380b18
far/FarDlgBuilder.cpp | 10 ++++---
far/FarDlgBuilder.hpp | 3 ++-
far/changelog | 5 ++++
far/config.cpp | 72 ++++++++++++++++++++++++++++++---------------------
far/delete.cpp | 20 +++++++-------
far/editor.cpp | 1 -
far/fileedit.cpp | 47 ++++++++++++++++-----------------
far/setattr.cpp | 28 ++++++++++----------
far/vbuild.m4 | 2 +-
9 files changed, 106 insertions(+), 82 deletions(-)
diff --git a/far/FarDlgBuilder.cpp b/far/FarDlgBuilder.cpp
index b06f62496..f9855d59a 100644
--- a/far/FarDlgBuilder.cpp
+++ b/far/FarDlgBuilder.cpp
@@ -358,9 +358,8 @@ static intptr_t ItemWidth(const DialogItemEx& Item)
constexpr size_t SupportedSize = 128;
-DialogBuilder::DialogBuilder(lng_string const Title, const string_view HelpTopic, Dialog::dialog_handler handler):
- m_HelpTopic(HelpTopic),
- m_handler(std::move(handler))
+DialogBuilder::DialogBuilder(lng_string const Title, const string_view HelpTopic):
+ m_HelpTopic(HelpTopic)
{
m_DialogItems.reserve(SupportedSize);
m_Bindings.reserve(SupportedSize);
@@ -807,6 +806,11 @@ void DialogBuilder::AddSeparator(lng_string const Text)
Separator.Y1 = Separator.Y2 = m_NextY++;
}
+void DialogBuilder::SetHandler(Dialog::dialog_handler Handler)
+{
+ m_handler = std::move(Handler);
+}
+
intptr_t DialogBuilder::ShowDialogEx()
{
UpdateBorderSize();
diff --git a/far/FarDlgBuilder.hpp b/far/FarDlgBuilder.hpp
index c830d4283..06d4e3b97 100644
--- a/far/FarDlgBuilder.hpp
+++ b/far/FarDlgBuilder.hpp
@@ -131,7 +131,7 @@ class DialogBuilder
public:
NONCOPYABLE(DialogBuilder);
- explicit DialogBuilder(lng_string Title = L"", string_view HelpTopic = {}, Dialog::dialog_handler handler = {});
+ explicit DialogBuilder(lng_string Title = L"", string_view HelpTopic = {});
~DialogBuilder();
DialogItemEx& AddText(lng_string Text);
@@ -176,6 +176,7 @@ public:
void EndSingleBox();
void AddEmptyLine();
void AddSeparator(lng_string Text = L"");
+ void SetHandler(Dialog::dialog_handler handler);
intptr_t ShowDialogEx();
bool ShowDialog();
diff --git a/far/changelog b/far/changelog
index 51a050f6d..d0b3001e2 100644
--- a/far/changelog
+++ b/far/changelog
@@ -1,3 +1,8 @@
+--------------------------------------------------------------------------------
+drkns 2026-07-18 14:20:26+01:00 - build 6720
+
+1. Refactoring.
+
--------------------------------------------------------------------------------
drkns 2026-07-18 13:55:16+01:00 - build 6719
diff --git a/far/config.cpp b/far/config.cpp
index d95a96eef..253d9ae24 100644
--- a/far/config.cpp
+++ b/far/config.cpp
@@ -795,32 +795,7 @@ void Options::ViewerConfig(ViewerOptions &ViOptRef, bool Local)
intptr_t save_pos = 0, save_cp = 0;
bool prev_save_cp_value = ViOpt.SaveCodepage, inside = false;
- DialogBuilder Builder(lng::MViewConfigTitle, L"ViewerSettings"sv, [&](Dialog* Dlg, intptr_t Msg, intptr_t Param1, void* Param2)
- {
- if (Msg == DN_INITDIALOG && save_pos)
- {
- Dlg->SendMessage(DM_ENABLE, save_cp, ToPtr(!ViOpt.SavePos));
- if (ViOpt.SavePos)
- {
- ViOpt.SaveCodepage = true;
- }
- }
- else if (Msg == DN_BTNCLICK && save_pos)
- {
- if (Param1 == save_pos)
- {
- inside = true;
- Dlg->SendMessage(DM_SETCHECK, save_cp, ToPtr(Param2? true : prev_save_cp_value));
- Dlg->SendMessage(DM_ENABLE, save_cp, ToPtr(!Param2));
- inside = false;
- }
- else if (Param1 == save_cp && !inside)
- {
- prev_save_cp_value = (Param2 != nullptr);
- }
- }
- return Dlg->DefProc(Msg, Param1, Param2);
- });
+ DialogBuilder Builder(lng::MViewConfigTitle, L"ViewerSettings"sv);
std::vector<DialogBuilderListItem> Items; //Must live until Dialog end
@@ -866,6 +841,40 @@ void Options::ViewerConfig(ViewerOptions &ViOptRef, bool Local)
Builder.AddOKCancel();
+ Builder.SetHandler([&](Dialog* const Dlg, intptr_t const Msg, intptr_t const Param1, void* const Param2)
+ {
+ switch (Msg)
+ {
+ case DN_INITDIALOG:
+ if (save_pos)
+ {
+ Dlg->SendMessage(DM_ENABLE, save_cp, ToPtr(!ViOpt.SavePos));
+ if (ViOpt.SavePos)
+ ViOpt.SaveCodepage = true;
+ }
+ break;
+
+ case DN_BTNCLICK:
+ if (save_pos)
+ {
+ if (Param1 == save_pos)
+ {
+ inside = true;
+ Dlg->SendMessage(DM_SETCHECK, save_cp, ToPtr(Param2? true : prev_save_cp_value));
+ Dlg->SendMessage(DM_ENABLE, save_cp, ToPtr(!Param2));
+ inside = false;
+ }
+ else if (Param1 == save_cp && !inside)
+ {
+ prev_save_cp_value = (Param2 != nullptr);
+ }
+ }
+ break;
+ }
+
+ return Dlg->DefProc(Msg, Param1, Param2);
+ });
+
Builder.ShowDialog();
}
@@ -1447,16 +1456,19 @@ struct FARConfigItem
{
std::any Context;
- DialogBuilder Builder(concat(KeyName, L'.', ValName, L" ("sv, Value->GetType(), L")"sv), {}, [&](Dialog* const Dlg, intptr_t const Msg, intptr_t const Param1, void* const Param2) -> intptr_t
- {
- return Value->EditProc(Dlg, Msg, Param1, Param2, Context);
- });
+ DialogBuilder Builder(concat(KeyName, L'.', ValName, L" ("sv, Value->GetType(), L")"sv));
int Result = 0;
if (!Value->Edit(Builder, Context))
{
Builder.AddSeparator();
Builder.AddButtons({{ lng::MOk, lng::MReset, lng::MCancel }});
+
+ Builder.SetHandler([&](Dialog* const Dlg, intptr_t const Msg, intptr_t const Param1, void* const Param2)
+ {
+ return Value->EditProc(Dlg, Msg, Param1, Param2, Context);
+ });
+
Result = Builder.ShowDialogEx();
}
if(Result == 0 || Result == 1)
diff --git a/far/delete.cpp b/far/delete.cpp
index 7cb6d7fed..697ecf654 100644
--- a/far/delete.cpp
+++ b/far/delete.cpp
@@ -384,15 +384,7 @@ static void show_confirmation(
intptr_t FirstHighlighted = 0, LastHighlighted = 0;
- DialogBuilder Builder(TitleId, {}, [&](Dialog* Dlg, intptr_t Msg, intptr_t Param1, void* Param2)
- {
- if (HighlightSelected && Msg == DN_CTLCOLORDLGITEM && in_closed_range(FirstHighlighted, Param1, LastHighlighted))
- {
- const auto& Colors = *static_cast<FarDialogItemColors const*>(Param2);
- Colors.Colors[0] = Colors.Colors[1];
- }
- return Dlg->DefProc(Msg, Param1, Param2);
- });
+ DialogBuilder Builder(TitleId);
const auto MaxWidth = ScrX + 1 - 6 * 2;
@@ -429,6 +421,16 @@ static void show_confirmation(
if (DeleteType != delete_type::recycle)
Builder.SetDialogMode(DMODE_WARNINGSTYLE);
+ Builder.SetHandler([&](Dialog* const Dlg, intptr_t const Msg, intptr_t const Param1, void* const Param2)
+ {
+ if (HighlightSelected && Msg == DN_CTLCOLORDLGITEM && in_closed_range(FirstHighlighted, Param1, LastHighlighted))
+ {
+ const auto& Colors = *static_cast<FarDialogItemColors const*>(Param2);
+ Colors.Colors[0] = Colors.Colors[1];
+ }
+ return Dlg->DefProc(Msg, Param1, Param2);
+ });
+
if (!Builder.ShowDialog())
cancel_operation();
}
diff --git a/far/editor.cpp b/far/editor.cpp
index eea56143c..75168207c 100644
--- a/far/editor.cpp
+++ b/far/editor.cpp
@@ -5775,7 +5775,6 @@ int Editor::EditorControl(int Command, intptr_t Param1, void *Param2)
if (const auto HostFileEditor = GetHostFileEditor())
Info->CurState |= HostFileEditor->WasFileSaved()? ECSTATE_MODIFIED : 0;
Info->CurState |= m_Flags.Check(FEDITOR_MODIFIED)? 0 : ECSTATE_SAVED;
- Info->CodePage = GetCodePage();
if (CheckStructSize(Info, &EditorInfo::ClientArea))
{
diff --git a/far/fileedit.cpp b/far/fileedit.cpp
index 85cd229ad..064268679 100644
--- a/far/fileedit.cpp
+++ b/far/fileedit.cpp
@@ -193,22 +193,7 @@ enum class badcp_action
static badcp_action BadCodepageDialog(bool const IsLoad, uintptr_t& codepage, std::variant<wchar_t, bytes> const& Data)
{
- size_t
- ComboboxId,
- ProceedButtonId;
-
- DialogBuilder Builder(lng::MWarning, {}, [&](Dialog* const Dlg, intptr_t const Msg, intptr_t const Param1, void* const Param2)
- {
- switch (Msg)
- {
- case DN_EDITCHANGE:
- if (!IsLoad && static_cast<size_t>(Param1) == ComboboxId)
- Dlg->SendMessage(DM_SETFOCUS, ProceedButtonId, {});
- break;
- }
-
- return Dlg->DefProc(Msg, Param1, Param2);
- });
+ DialogBuilder Builder(lng::MWarning);
const auto [UsupportedData, UsupportedDataMessage] = codepages::UnsupportedDataMessage(Data);
@@ -236,7 +221,7 @@ static badcp_action BadCodepageDialog(bool const IsLoad, uintptr_t& codepage, st
const auto MaxLength = std::ranges::fold_left(Messages, 0uz, [](size_t const Value, string const& i){ return std::max(Value, i.size()); });
Builder.AddComboBox(cp_val, static_cast<int>(std::max(MaxLength, 46uz)), Items);
- ComboboxId = Builder.GetLastID();
+ const auto ComboboxId = Builder.GetLastID();
add_line(Messages[1]);
add_line(Messages[2]);
@@ -250,11 +235,24 @@ static badcp_action BadCodepageDialog(bool const IsLoad, uintptr_t& codepage, st
Builder.AddButtons({{ lng::MEditorSaveCPWarnShow, lng::MEditorSave, lng::MCancel }});
}
- ProceedButtonId = Builder.GetLastID() - 1;
+ const auto ProceedButtonId = Builder.GetLastID() - 1;
Builder.SetDialogMode(DMODE_WARNINGSTYLE);
Builder.SetId(BadEditorCodePageId);
+ Builder.SetHandler([&](Dialog* const Dlg, intptr_t const Msg, intptr_t const Param1, void* const Param2)
+ {
+ switch (Msg)
+ {
+ case DN_EDITCHANGE:
+ if (!IsLoad && static_cast<size_t>(Param1) == ComboboxId)
+ Dlg->SendMessage(DM_SETFOCUS, ProceedButtonId, {});
+ break;
+ }
+
+ return Dlg->DefProc(Msg, Param1, Param2);
+ });
+
const auto Result = Builder.ShowDialogEx();
const auto CancelButtonId = IsLoad? 1 : 2;
@@ -2668,15 +2666,16 @@ intptr_t FileEditor::EditorControl(int Command, intptr_t Param1, void *Param2)
const auto result = m_editor->EditorControl(Command, Param1, Param2);
if (result&&ECTL_GETINFO==Command)
{
- const auto Info=static_cast<EditorInfo*>(Param2);
+ auto& Info = *static_cast<EditorInfo*>(Param2);
if (m_bAddSignature)
- Info->Options|=EOPT_BOM;
+ Info.Options |= EOPT_BOM;
if (Global->Opt->EdOpt.ShowTitleBar)
- Info->Options|=EOPT_SHOWTITLEBAR;
+ Info.Options |= EOPT_SHOWTITLEBAR;
if (Global->Opt->EdOpt.ShowKeyBar)
- Info->Options|=EOPT_SHOWKEYBAR;
- if (CheckStructSize(Info, &EditorInfo::WindowArea))
- Info->WindowArea = GetPosition().as<RECT>();
+ Info.Options |= EOPT_SHOWKEYBAR;
+ Info.CodePage = m_codepage;
+ if (CheckStructSize(&Info, &EditorInfo::WindowArea))
+ Info.WindowArea = GetPosition().as<RECT>();
}
return result;
}
diff --git a/far/setattr.cpp b/far/setattr.cpp
index 3433fa10f..b69613b49 100644
--- a/far/setattr.cpp
+++ b/far/setattr.cpp
@@ -356,19 +356,7 @@ static void set_dates_and_times(Dialog* const Dlg, const time_map& TimeMapEntry,
static void AdvancedAttributesDialog(SetAttrDlgParam& DlgParam)
{
- DialogBuilder Builder(lng::MSetAttrTitle, {}, [](Dialog* Dlg, intptr_t Msg, intptr_t Param1, void* Param2) -> intptr_t
- {
- switch (Msg)
- {
- case DN_BTNCLICK:
- // only remove or keep, not set
- if (Param1 == SA_CHECKBOX_REPARSEPOINT && std::bit_cast<intptr_t>(Param2) == BSTATE_CHECKED)
- return false;
-
- break;
- }
- return Dlg->DefProc(Msg, Param1, Param2);
- });
+ DialogBuilder Builder(lng::MSetAttrTitle);
int SavedState[advanced_attributes_count];
const auto Flag = DlgParam.Plugin? DIF_DISABLE : DIF_NONE;
@@ -383,6 +371,20 @@ static void AdvancedAttributesDialog(SetAttrDlgParam& DlgParam)
Builder.AddOKCancel();
+ Builder.SetHandler([](Dialog* const Dlg, intptr_t const Msg, intptr_t const Param1, void* const Param2) -> intptr_t
+ {
+ switch (Msg)
+ {
+ case DN_BTNCLICK:
+ // only remove or keep, not set
+ if (Param1 == SA_CHECKBOX_REPARSEPOINT && std::bit_cast<intptr_t>(Param2) == BSTATE_CHECKED)
+ return false;
+
+ break;
+ }
+ return Dlg->DefProc(Msg, Param1, Param2);
+ });
+
if (!Builder.ShowDialog())
return;
diff --git a/far/vbuild.m4 b/far/vbuild.m4
index 205dd94a4..2262a4f1b 100644
--- a/far/vbuild.m4
+++ b/far/vbuild.m4
@@ -1 +1 @@
-6719
+6720