-
Notifications
You must be signed in to change notification settings - Fork 174
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update highlight dialog #2452
base: master
Are you sure you want to change the base?
Update highlight dialog #2452
Conversation
anta999
commented
Oct 20, 2024
There are still some unresolved issues with file marking. |
Yep, now fixed, markers are shown. |
Please mention in |
Some strange variations of dir names are offered when switching by Ctrl+Alt+D. |
CTRL+ALT+D - Смена стиля имени директорий |
Погонял разные фичи из PR. В общем, косяков пока два вижу:
Из farlang.templ.m4
|
В общем, по п.1 проблема действительно есть. При Отсюда получаем 4 раза подряд одни и те же "стили". |
Такое множество стилей (aж 64 🔥) совершенно не человеколюбиво переключать на лету подряд - так с обычным терпением не дотыкаешь до нужного. По CTRL+ALT+D лучше вызывать диалог с нужными галочками, причём внутри диалога иметь поле которое динамически (при перещелкивании галочек) отображает примеры выбранного стиля. Ну, если совсем полноценный диалог тяжело, то хотя бы |
причём глюк отрисовки только когда командная строка скрыта. |
Added dir name cfg dialog Fixed draw artefacts
All fixed |
fixed elfmz#2461 Garbage in the terminal after running menu command with hidden command line Updated DirName Config Dialog
Заметил одну проблему, которая в будущем может привести к серьёзной путанице в коде... имхо, лучше разгрести её сейчас. Из far2m перетянута инфраструктура процессинга масок, включая имя "CaseSens" для параметров/флагов, отвечающих за "регистрозависимость". Всё бы ничего, но сейчас в некоторых (?) случаях "CaseSens" используется в значении "ignorecase", т.е. в инвертированном. Например, у функции CFileMask::Compare() была сигнатура: bool CFileMask::Compare(const wchar_t *FileName, bool ignorecase) const а стала: bool CFileMask::Compare(const wchar_t *FileName, bool CaseSens, bool SkipPath) const При этом передаваемые вторым аргументом значения в эту функцию не изменились. Скажем, CFileMask::Compare() вызывается в MaskGroups.cpp:303: if ( !chkFileMask.Compare(Value.CPtr(), !(bool)(bCaseSensitive)) ) { и в filelist.cpp:3442: Match = FileMask.Compare(CurPtr->strName, !Opt.PanelCaseSensitiveCompareSelect, false); Видимо, там много мест таких, это как пример. |
Думаю, если быть последовательным, наиболее правильный вариант сейчас — проапдейтить сигнатуры функций bool CmpName(const wchar_t *pattern, const wchar_t *str, bool skippath = true, bool ignorecase = true);
static bool CmpName_Body(const wchar_t *pattern, const wchar_t *str, bool ignorecase) из far2l/far2l/src/mix/processname.cpp на bool CmpName(const wchar_t *pattern, const wchar_t *str, bool skippath = true, bool CaseSens = false);
static bool CmpName_Body(const wchar_t *pattern, const wchar_t *str, bool CaseSens) соответствующим образом инвертировав ветки в |
возможно, проверять & инвертировать (где необходимо) придётся не так много (UPD: хотя нет, больше...), навскидку: MaskGroups.cpp:303 if ( !chkFileMask.Compare(Value.CPtr(), !(bool)(bCaseSensitive)) ) { filefilterparams.cpp:369 if (FMask.Used && !FMask.FilterMask.Compare(strFileName, FMask.IgnoreCase)) { // Файл не попадает под маску введённую в фильтре? filetype.cpp:89 — тут поведение в PR изменилось, было с игнорированием регистра, а стало регистрозависимо (?) if (!FMask.Compare(Name, false)) filetype.cpp:145 — тут поведение в PR изменилось, было с игнорированием регистра, а стало регистрозависимо (?) if (FMask.Compare(Name, false)) { findfile.cpp:1142 if (!FileMaskForFindFile.Compare(FileName, !Opt.FindOpt.FindCaseSensitiveFileMask)) mix.cpp:101 — тут поведение в PR изменилось, было с игнорированием регистра, а стало регистрозависимо (?) if (FMask.Compare(FindData.strFileName, false)) { filelist.cpp:3442 Match = FileMask.Compare(CurPtr->strName, !Opt.PanelCaseSensitiveCompareSelect, false); history.cpp:83 return !(fmp.Set(Opt.AutoComplete.Exceptions.CPtr(), FMF_ADDASTERISK) && fmp.Compare(Str,true)); |
Чтобы ничего не сломать я оставил ignorecase и переименовал CaseSens в filemask. |
Имхо, зря. Название CaseSens было бы точнее (в интерфейсе везде чекбоксы «С учетом регистра», а не "Игнорировать регистр"), и ближе к far2m. Ближе к телу: в таком случае есть другие места, которые нужно изменить, как минимум в far2l/src/mix/processname.cpp: int WINAPI ProcessName(const wchar_t *param1, wchar_t *param2, DWORD size, DWORD flags)
{
...
bool casesens = (flags & PN_CASESENSITIVE);
...
if (mode == PN_CMPNAME)
return CmpName(param1, param2, skippath, casesens) ? TRUE : FALSE;
else if (mode == PN_CMPNAMELIST || mode == PN_CHECKMASK)
{
...
return Masks.Compare(param2, casesens, skippath) ? TRUE : FALSE;
}
...
} Флаг |
Потестил в разных кейсах, вроде бы проблем не вызывает. |
@elfmz есть замечания? |