mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-07 03:15:00 -06:00
Windows Explorer and TotalCommander use ALT+UP as a hotkey to return to the upper level of the directory, but 7-ZIP defines it as synchronizing the path of the current panel to another panel, which often leads to incorrect operations. Now change it to the same behavior mode as the above application, and add hotkeys CTRL+LEFT and CTRL+RIGHT to provide the function of synchronizing the panel path, which is similar but not exactly the same as TotalCommander.
352 lines
6.3 KiB
C++
352 lines
6.3 KiB
C++
// PanelKey.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "Panel.h"
|
|
#include "HelpUtils.h"
|
|
|
|
#include "../../PropID.h"
|
|
#include "App.h"
|
|
|
|
using namespace NWindows;
|
|
|
|
// #define kHelpTopic "FM/index.htm"
|
|
|
|
struct CVKeyPropIDPair
|
|
{
|
|
WORD VKey;
|
|
PROPID PropID;
|
|
};
|
|
|
|
static const CVKeyPropIDPair g_VKeyPropIDPairs[] =
|
|
{
|
|
{ VK_F3, kpidName },
|
|
{ VK_F4, kpidExtension },
|
|
{ VK_F5, kpidMTime },
|
|
{ VK_F6, kpidSize },
|
|
{ VK_F7, kpidNoProperty }
|
|
};
|
|
|
|
static int FindVKeyPropIDPair(WORD vKey)
|
|
{
|
|
for (int i = 0; i < ARRAY_SIZE(g_VKeyPropIDPairs); i++)
|
|
if (g_VKeyPropIDPairs[i].VKey == vKey)
|
|
return i;
|
|
return -1;
|
|
}
|
|
|
|
|
|
bool CPanel::OnKeyDown(LPNMLVKEYDOWN keyDownInfo, LRESULT &result)
|
|
{
|
|
if (keyDownInfo->wVKey == VK_TAB && keyDownInfo->hdr.hwndFrom == _listView)
|
|
{
|
|
_panelCallback->OnTab();
|
|
return false;
|
|
}
|
|
bool alt = IsKeyDown(VK_MENU);
|
|
bool ctrl = IsKeyDown(VK_CONTROL);
|
|
// bool leftCtrl = IsKeyDown(VK_LCONTROL);
|
|
bool rightCtrl = IsKeyDown(VK_RCONTROL);
|
|
bool shift = IsKeyDown(VK_SHIFT);
|
|
result = 0;
|
|
|
|
if (keyDownInfo->wVKey >= '0' && keyDownInfo->wVKey <= '9' &&
|
|
(rightCtrl || alt))
|
|
{
|
|
int index = keyDownInfo->wVKey - '0';
|
|
if (shift)
|
|
{
|
|
SetBookmark(index);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
OpenBookmark(index);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if ((keyDownInfo->wVKey == VK_F2 ||
|
|
keyDownInfo->wVKey == VK_F1) && alt && !ctrl && !shift)
|
|
{
|
|
_panelCallback->SetFocusToPath(keyDownInfo->wVKey == VK_F1 ? 0 : 1);
|
|
return true;
|
|
}
|
|
|
|
if ((keyDownInfo->wVKey == VK_F9) && !alt && !ctrl && !shift)
|
|
{
|
|
g_App.SwitchOnOffOnePanel();
|
|
}
|
|
|
|
if (keyDownInfo->wVKey >= VK_F3 && keyDownInfo->wVKey <= VK_F12 && ctrl)
|
|
{
|
|
int index = FindVKeyPropIDPair(keyDownInfo->wVKey);
|
|
if (index >= 0)
|
|
SortItemsWithPropID(g_VKeyPropIDPairs[index].PropID);
|
|
}
|
|
|
|
switch (keyDownInfo->wVKey)
|
|
{
|
|
case VK_SHIFT:
|
|
{
|
|
_selectionIsDefined = false;
|
|
_prevFocusedItem = _listView.GetFocusedItem();
|
|
break;
|
|
}
|
|
/*
|
|
case VK_F1:
|
|
{
|
|
// ShowHelpWindow(NULL, kHelpTopic);
|
|
break;
|
|
}
|
|
*/
|
|
case VK_F2:
|
|
{
|
|
if (!alt && !ctrl &&!shift)
|
|
{
|
|
RenameFile();
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
case VK_F3:
|
|
{
|
|
if (!alt && !ctrl && !shift)
|
|
{
|
|
EditItem(false);
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
case VK_F4:
|
|
{
|
|
if (!alt && !ctrl && !shift)
|
|
{
|
|
EditItem(true);
|
|
return true;
|
|
}
|
|
if (!alt && !ctrl && shift)
|
|
{
|
|
CreateFile();
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
case VK_F5:
|
|
{
|
|
if (!alt && !ctrl)
|
|
{
|
|
_panelCallback->OnCopy(false, shift);
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
case VK_F6:
|
|
{
|
|
if (!alt && !ctrl)
|
|
{
|
|
_panelCallback->OnCopy(true, shift);
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
case VK_F7:
|
|
{
|
|
if (!alt && !ctrl && !shift)
|
|
{
|
|
/* we can process F7 via menu ACCELERATOR.
|
|
But menu loading can be slow in case of UNC paths and system menu.
|
|
So we use don't use ACCELERATOR */
|
|
CreateFolder();
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
case VK_DELETE:
|
|
{
|
|
DeleteItems(!shift);
|
|
return true;
|
|
}
|
|
case VK_INSERT:
|
|
{
|
|
if (!alt)
|
|
{
|
|
if (ctrl && !shift)
|
|
{
|
|
EditCopy();
|
|
return true;
|
|
}
|
|
if (shift && !ctrl)
|
|
{
|
|
EditPaste();
|
|
return true;
|
|
}
|
|
if (!shift && !ctrl && _mySelectMode)
|
|
{
|
|
OnInsert();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
case VK_DOWN:
|
|
{
|
|
if (shift)
|
|
OnArrowWithShift();
|
|
return false;
|
|
}
|
|
case VK_UP:
|
|
{
|
|
if (alt)
|
|
OpenParentFolder();
|
|
else if (shift)
|
|
OnArrowWithShift();
|
|
return false;
|
|
}
|
|
case VK_RIGHT:
|
|
{
|
|
if (alt)
|
|
_panelCallback->OnSetSubFolder();
|
|
else if (shift)
|
|
OnArrowWithShift();
|
|
else if (ctrl)
|
|
_panelCallback->OnSetSameFolder();
|
|
return false;
|
|
}
|
|
case VK_LEFT:
|
|
{
|
|
if (alt)
|
|
_panelCallback->OnSetSubFolder();
|
|
else if (shift)
|
|
OnArrowWithShift();
|
|
else if (ctrl)
|
|
_panelCallback->OnSetSameFolder();
|
|
return false;
|
|
}
|
|
case VK_NEXT:
|
|
{
|
|
if (ctrl && !alt && !shift)
|
|
{
|
|
// EnterToFocused();
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
case VK_ADD:
|
|
{
|
|
if (alt)
|
|
SelectByType(true);
|
|
else if (shift)
|
|
SelectAll(true);
|
|
else if (!ctrl)
|
|
SelectSpec(true);
|
|
return true;
|
|
}
|
|
case VK_SUBTRACT:
|
|
{
|
|
if (alt)
|
|
SelectByType(false);
|
|
else if (shift)
|
|
SelectAll(false);
|
|
else
|
|
SelectSpec(false);
|
|
return true;
|
|
}
|
|
/*
|
|
case VK_DELETE:
|
|
CommandDelete();
|
|
return 0;
|
|
case VK_F1:
|
|
CommandHelp();
|
|
return 0;
|
|
*/
|
|
case VK_BACK:
|
|
OpenParentFolder();
|
|
return true;
|
|
/*
|
|
case VK_DIVIDE:
|
|
case '\\':
|
|
case '/':
|
|
case VK_OEM_5:
|
|
{
|
|
// OpenRootFolder();
|
|
OpenDrivesFolder();
|
|
|
|
return true;
|
|
}
|
|
*/
|
|
case 'A':
|
|
if (ctrl)
|
|
{
|
|
SelectAll(true);
|
|
return true;
|
|
}
|
|
return false;
|
|
case 'X':
|
|
if (ctrl)
|
|
{
|
|
EditCut();
|
|
return true;
|
|
}
|
|
return false;
|
|
case 'C':
|
|
if (ctrl)
|
|
{
|
|
EditCopy();
|
|
return true;
|
|
}
|
|
return false;
|
|
case 'V':
|
|
if (ctrl)
|
|
{
|
|
EditPaste();
|
|
return true;
|
|
}
|
|
return false;
|
|
case 'N':
|
|
if (ctrl)
|
|
{
|
|
CreateFile();
|
|
return true;
|
|
}
|
|
return false;
|
|
case 'R':
|
|
if (ctrl)
|
|
{
|
|
OnReload();
|
|
return true;
|
|
}
|
|
return false;
|
|
case 'Z':
|
|
if (ctrl)
|
|
{
|
|
ChangeComment();
|
|
return true;
|
|
}
|
|
return false;
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
if (ctrl)
|
|
{
|
|
int styleIndex = keyDownInfo->wVKey - '1';
|
|
SetListViewMode(styleIndex);
|
|
return true;
|
|
}
|
|
return false;
|
|
case VK_MULTIPLY:
|
|
{
|
|
InvertSelection();
|
|
return true;
|
|
}
|
|
case VK_F12:
|
|
if (alt && !ctrl && !shift)
|
|
{
|
|
FoldersHistory();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|