From 74c42cb838cd4f9de4d44f818e6b03a6640dd162 Mon Sep 17 00:00:00 2001 From: Dazzar56 Date: Fri, 10 May 2024 01:53:34 +0300 Subject: [PATCH] restore hotkeys in setattr and add horizontal layout for checkbox and radiobutton New flag DIF_HORIZONTALLAYOUT for checkbox and radiobutton. It is switch behavior of up and down keys for horizontal groups of checkboxes and radiobuttons. --- far2l/bootstrap/scripts/farlang.templ.m4 | 94 ++++++++++++------------ far2l/far2sdk/farplug-wide.h | 1 + far2l/src/dialog.cpp | 118 ++++++++++++++++++++++--------- far2l/src/dialog.hpp | 9 +++ far2l/src/setattr.cpp | 18 ++--- 5 files changed, 150 insertions(+), 90 deletions(-) diff --git a/far2l/bootstrap/scripts/farlang.templ.m4 b/far2l/bootstrap/scripts/farlang.templ.m4 index 1977b93a..4e169ea3 100644 --- a/far2l/bootstrap/scripts/farlang.templ.m4 +++ b/far2l/bootstrap/scripts/farlang.templ.m4 @@ -14889,8 +14889,8 @@ ChangeCouldNotEjectHotPlugMedia2 "Немагчыма выдаліць прыстасаванне:" ChangeHotPlugNotify1 -"Теперь устройство" -"The device" +"Теперь устройство" +"The device" "Zařízení" "Das Gerät" "Az eszköz:" @@ -15865,7 +15865,7 @@ upd:" Ownership (chown) " SetAttrOwner "В&ладелец:" -"O&wner:" +"Ow&ner:" "&Vlastník:" "&Besitzer:" "Tula&jdonos:" @@ -16163,70 +16163,70 @@ upd:" Permissions (chmod) " " Дазволы (chmod) " SetAttrAccessUser -"&Пользователь:" -"&User:" +"Пользователь:" +"User:" upd:"&User:" upd:"&User:" upd:"&User:" upd:"&User:" upd:"&User:" -"&Користувач:" -"&Карыстальнік:" +"Користувач:" +"Карыстальнік:" SetAttrAccessGroup -"&Группа:" -"&Group:" +"Группа:" +"Group:" upd:"&Group:" upd:"&Group:" upd:"&Group:" upd:"&Group:" upd:"&Group:" -"&Група:" -"&Група:" +"Група:" +"Група:" SetAttrAccessOther -"Ос&тальные:" -"Ot&her:" +"Остальные:" +"Other:" upd:"Ot&her:" upd:"Ot&her:" upd:"Ot&her:" upd:"Ot&her:" upd:"Ot&her:" -"&Iншi:" -"Ас&татнія:" +"Iншi:" +"Астатнія:" SetAttrAccessUserRead -"R" -"R" -"R" -"R" -"R" -"R" -"R" -"R" -"R" +"&R" +"&R" +"&R" +"&R" +"&R" +"&R" +"&R" +"&R" +"&R" SetAttrAccessUserWrite -"W" -"W" -"W" -"W" -"W" -"W" -"W" -"W" -"W" +"&W" +"&W" +"&W" +"&W" +"&W" +"&W" +"&W" +"&W" +"&W" SetAttrAccessUserExecute -"X" -"X" -"X" -"X" -"X" -"X" -"X" -"X" -"X" +"&X" +"&X" +"&X" +"&X" +"&X" +"&X" +"&X" +"&X" +"&X" SetAttrAccessGroupRead "R" @@ -16296,12 +16296,12 @@ SetAttrAccessOtherExecute SetAttrModeOriginal "Исходно&е" -"O&riginal" -"O&riginál" -"O&riginal" +"Ori&ginal" +"Ori&ginál" +"Ori&ginal" "E&redeti" -"O&ryginalny" -"O&riginal" +"Ory&ginalny" +"Ori&ginal" "Вихідн&е" "П&ершасны" diff --git a/far2l/far2sdk/farplug-wide.h b/far2l/far2sdk/farplug-wide.h index 827b825b..06934713 100644 --- a/far2l/far2sdk/farplug-wide.h +++ b/far2l/far2sdk/farplug-wide.h @@ -226,6 +226,7 @@ enum FarDialogItemFlags DIF_SEPARATOR2 = 0x00020000UL, DIF_EDITOR = 0x00020000UL, DIF_LISTNOAMPERSAND = 0x00020000UL, + DIF_HORIZONTALLAYOUT = 0x00040000UL, //enable horizontal navigation for checkbox and radiobutton DIF_LISTNOBOX = 0x00040000UL, DIF_HISTORY = 0x00040000UL, DIF_BTNNOCLOSE = 0x00040000UL, diff --git a/far2l/src/dialog.cpp b/far2l/src/dialog.cpp index 1d037aae..81575ddc 100644 --- a/far2l/src/dialog.cpp +++ b/far2l/src/dialog.cpp @@ -2733,48 +2733,25 @@ int Dialog::ProcessKey(FarKey Key) ((DlgEdit *)(Item[FocusPos]->ObjPtr))->ProcessKey(Key); return TRUE; } else { - int MinDist = 1000, MinPos = 0; - - for (I = 0; I < ItemCount; I++) { - if (I != FocusPos && (!(Item[I]->Flags & (DIF_NOFOCUS | DIF_DISABLE | DIF_HIDDEN))) - && (FarIsEdit(Item[I]->Type) || Item[I]->Type == DI_CHECKBOX - || Item[I]->Type == DI_RADIOBUTTON) - && Item[I]->Y1 == Item[FocusPos]->Y1) { - int Dist = Item[I]->X1 - Item[FocusPos]->X1; - - if (((Key == KEY_LEFT || Key == KEY_SHIFTNUMPAD4) && Dist < 0) - || ((Key == KEY_RIGHT || Key == KEY_SHIFTNUMPAD6) && Dist > 0)) - if (abs(Dist) < MinDist) { - MinDist = abs(Dist); - MinPos = I; - } - } - } - - if (MinDist < 1000) { - ChangeFocus2(MinPos); - - if (Item[MinPos]->Flags & DIF_MOVESELECT) { - Do_ProcessSpace(); - } else { - ShowDialog(); - } - - return TRUE; - } + return Do_ProcessMoveToCtrlHorizontal(Key == KEY_RIGHT || Key == KEY_NUMPAD6); } } case KEY_UP: case KEY_NUMPAD8: case KEY_DOWN: - case KEY_NUMPAD2: - + case KEY_NUMPAD2: { if (Item[FocusPos]->Type == DI_USERCONTROL) // для user-типа вываливаем return TRUE; - return Do_ProcessNextCtrl( - Key == KEY_LEFT || Key == KEY_UP || Key == KEY_NUMPAD4 || Key == KEY_NUMPAD8); - // $ 27.04.2001 VVM - Обработка колеса мышки + if ((Item[FocusPos]->Type == DI_CHECKBOX || Item[FocusPos]->Type == DI_RADIOBUTTON) + && (Item[FocusPos]->Flags & DIF_HORIZONTALLAYOUT) + ) { + return Do_ProcessMoveToCtrlVertical(Key == KEY_UP || Key == KEY_NUMPAD8); + } else { + return Do_ProcessNextCtrl(Key == KEY_UP || Key == KEY_NUMPAD8); + } + } + // $ 27.04.2001 VVM - Обработка колеса мышки case KEY_MSWHEEL_UP: case KEY_MSWHEEL_DOWN: case KEY_CTRLUP: @@ -3619,6 +3596,79 @@ int Dialog::Do_ProcessNextCtrl(int Up, BOOL IsRedraw) return TRUE; } +int Dialog::Do_ProcessMoveToCtrlHorizontal(int right) +{ + int MinDist = 1000, MinPos = 0; + + for (unsigned int I = 0; I < ItemCount; I++) { + if (I != FocusPos && (!(Item[I]->Flags & (DIF_NOFOCUS | DIF_DISABLE | DIF_HIDDEN))) + && (FarIsEdit(Item[I]->Type) || Item[I]->Type == DI_CHECKBOX + || Item[I]->Type == DI_RADIOBUTTON) + && Item[I]->Y1 == Item[FocusPos]->Y1) + { + int Dist = Item[I]->X1 - Item[FocusPos]->X1; + + if ((!right && Dist < 0) || (right && Dist > 0)) { + if (abs(Dist) < MinDist) { + MinDist = abs(Dist); + MinPos = I; + } + } + } + } + + if (MinDist < 1000) { + ChangeFocus2(MinPos); + + if (Item[MinPos]->Flags & DIF_MOVESELECT) { + Do_ProcessSpace(); + } else { + ShowDialog(); + } + } else { + return Do_ProcessNextCtrl(!right); + } + + + return TRUE; +} + +int Dialog::Do_ProcessMoveToCtrlVertical(int up) +{ + int MinDist = 1000, MinPos = 0; + + for (unsigned int I = 0; I < ItemCount; I++) { + if (I != FocusPos && (!(Item[I]->Flags & (DIF_NOFOCUS | DIF_DISABLE | DIF_HIDDEN))) + && (FarIsEdit(Item[I]->Type) || Item[I]->Type == DI_CHECKBOX + || Item[I]->Type == DI_RADIOBUTTON) + && Item[I]->X1 == Item[FocusPos]->X1) + { + int Dist = Item[I]->Y1 - Item[FocusPos]->Y1; + + if ((up && Dist < 0) || (!up && Dist > 0)) { + if (abs(Dist) < MinDist) { + MinDist = abs(Dist); + MinPos = I; + } + } + } + } + + if (MinDist < 1000) { + ChangeFocus2(MinPos); + + if (Item[MinPos]->Flags & DIF_MOVESELECT) { + Do_ProcessSpace(); + } else { + ShowDialog(); + } + } else { + return Do_ProcessNextCtrl(up); + } + + return TRUE; +} + int Dialog::Do_ProcessTab(int Next) { CriticalSectionLock Lock(CS); diff --git a/far2l/src/dialog.hpp b/far2l/src/dialog.hpp index 42fca7f7..508e28ba 100644 --- a/far2l/src/dialog.hpp +++ b/far2l/src/dialog.hpp @@ -355,6 +355,15 @@ private: int Do_ProcessTab(int Next); int Do_ProcessNextCtrl(int Next, BOOL IsRedraw = TRUE); + + /** + * move focus to right or left dialog item. + */ + int Do_ProcessMoveToCtrlHorizontal(int right); + /** + * move focus to up or down dialog item. + */ + int Do_ProcessMoveToCtrlVertical(int up); int Do_ProcessFirstCtrl(); int Do_ProcessSpace(); void SetComboBoxPos(DialogItemEx *Item = nullptr); diff --git a/far2l/src/setattr.cpp b/far2l/src/setattr.cpp index b1620731..ffda91ec 100644 --- a/far2l/src/setattr.cpp +++ b/far2l/src/setattr.cpp @@ -888,17 +888,17 @@ bool ShellSetFileAttributes(Panel *SrcPanel, LPCWSTR Object) {DI_VTEXT, 51, 10, 51, 12, {}, DIF_BOXCOLOR, VerticalLine}, {DI_TEXT, 5, 10, 18, 10, {}, 0, Msg::SetAttrAccessUser}, - {DI_CHECKBOX, 19, 10, 23, 10, {}, DIF_3STATE, Msg::SetAttrAccessUserRead}, - {DI_CHECKBOX, 26, 10, 30, 10, {}, DIF_3STATE, Msg::SetAttrAccessUserWrite}, - {DI_CHECKBOX, 33, 10, 37, 10, {}, DIF_3STATE, Msg::SetAttrAccessUserExecute}, + {DI_CHECKBOX, 19, 10, 23, 10, {}, DIF_3STATE | DIF_HORIZONTALLAYOUT, Msg::SetAttrAccessUserRead}, + {DI_CHECKBOX, 26, 10, 30, 10, {}, DIF_3STATE | DIF_HORIZONTALLAYOUT, Msg::SetAttrAccessUserWrite}, + {DI_CHECKBOX, 33, 10, 37, 10, {}, DIF_3STATE | DIF_HORIZONTALLAYOUT, Msg::SetAttrAccessUserExecute}, {DI_TEXT, 5, 11, 18, 11, {}, 0, Msg::SetAttrAccessGroup}, - {DI_CHECKBOX, 19, 11, 23, 11, {}, DIF_3STATE, Msg::SetAttrAccessGroupRead}, - {DI_CHECKBOX, 26, 11, 30, 11, {}, DIF_3STATE, Msg::SetAttrAccessGroupWrite}, - {DI_CHECKBOX, 33, 11, 37, 11, {}, DIF_3STATE, Msg::SetAttrAccessGroupExecute}, + {DI_CHECKBOX, 19, 11, 23, 11, {}, DIF_3STATE | DIF_HORIZONTALLAYOUT, Msg::SetAttrAccessGroupRead}, + {DI_CHECKBOX, 26, 11, 30, 11, {}, DIF_3STATE | DIF_HORIZONTALLAYOUT, Msg::SetAttrAccessGroupWrite}, + {DI_CHECKBOX, 33, 11, 37, 11, {}, DIF_3STATE | DIF_HORIZONTALLAYOUT, Msg::SetAttrAccessGroupExecute}, {DI_TEXT, 5, 12, 18, 12, {}, 0, Msg::SetAttrAccessOther}, - {DI_CHECKBOX, 19, 12, 23, 12, {}, DIF_3STATE, Msg::SetAttrAccessOtherRead}, - {DI_CHECKBOX, 26, 12, 30, 12, {}, DIF_3STATE, Msg::SetAttrAccessOtherWrite}, - {DI_CHECKBOX, 33, 12, 37, 12, {}, DIF_3STATE, Msg::SetAttrAccessOtherExecute}, + {DI_CHECKBOX, 19, 12, 23, 12, {}, DIF_3STATE | DIF_HORIZONTALLAYOUT, Msg::SetAttrAccessOtherRead}, + {DI_CHECKBOX, 26, 12, 30, 12, {}, DIF_3STATE | DIF_HORIZONTALLAYOUT, Msg::SetAttrAccessOtherWrite}, + {DI_CHECKBOX, 33, 12, 37, 12, {}, DIF_3STATE | DIF_HORIZONTALLAYOUT, Msg::SetAttrAccessOtherExecute}, {DI_CHECKBOX, 40, 10, 52, 10, {}, DIF_3STATE, Msg::SetAttrSUID}, {DI_CHECKBOX, 40, 11, 52, 11, {}, DIF_3STATE, Msg::SetAttrSGID}, -- 2.11.4.GIT