mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-08 16:07:04 -06:00
feat: opens sole folder instead of upper folder after extraction; cancel folder priority over file in comparison; other minor ui fix
This commit is contained in:
@@ -1536,7 +1536,7 @@ Z7_COM7F_IMF(CAgentFolder::Extract(const UInt32 *indices,
|
||||
// do we need another base folder for subfolders ?
|
||||
extractCallbackSpec->DirPathPrefix_for_HashFiles = _agentSpec->_hashBaseFolderPrefix;
|
||||
|
||||
extractCallbackSpec->SoleFolderIndex = soleFolderIndex;
|
||||
extractCallbackSpec->SoleFolderIndex = soleFolderIndex == -1LL ? -1LL : GetRealIndex((int)soleFolderIndex);
|
||||
|
||||
CUIntVector realIndices;
|
||||
GetRealIndices(indices, numItems, IntToBool(includeAltStreams),
|
||||
|
||||
@@ -358,6 +358,11 @@ HRESULT CApp::Create(HWND hwnd, const UString &mainPath, const UString &arcForma
|
||||
|
||||
SetFocusedPanel(LastFocusedPanel);
|
||||
Panels[LastFocusedPanel].SetFocusToList();
|
||||
|
||||
if (pDelayedOpenFolderAfterExtractPathCriticalSection == NULL) {
|
||||
pDelayedOpenFolderAfterExtractPathCriticalSection = new NWindows::NSynchronization::CCriticalSection();
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -409,6 +414,10 @@ void CApp::Save()
|
||||
|
||||
void CApp::Release()
|
||||
{
|
||||
if (pDelayedOpenFolderAfterExtractPathCriticalSection != NULL) {
|
||||
delete pDelayedOpenFolderAfterExtractPathCriticalSection;
|
||||
pDelayedOpenFolderAfterExtractPathCriticalSection = NULL;
|
||||
}
|
||||
// It's for unloading COM dll's: don't change it.
|
||||
for (unsigned i = 0; i < kNumPanelsMax; i++)
|
||||
Panels[i].Release();
|
||||
@@ -885,9 +894,49 @@ void CApp::OnCopy(bool move, bool copyToSame, unsigned srcPanelIndex)
|
||||
|
||||
if (!g_bProcessError && result == S_OK)
|
||||
{
|
||||
if (openOutputFolder && IsDirectory(destPath))
|
||||
if (openOutputFolder)
|
||||
{
|
||||
StartApplicationDontWait(destPath, destPath, (HWND)_window);
|
||||
bool done = false;
|
||||
if (!done && soleFolderIndex != -1LL) {
|
||||
UString soleFolderName = srcPanel.GetItemRelPath((UInt32)soleFolderIndex);
|
||||
if (soleFolderName.Len() > 0 && (soleFolderName[0] == L'\\' || soleFolderName[0] == L'/' || soleFolderName[0] == '\\' || soleFolderName[0] == '/')) {
|
||||
soleFolderName = soleFolderName.Mid(1, soleFolderName.Len() - 1);
|
||||
}
|
||||
if (soleFolderName.Len() > 0 && (soleFolderName.Back() == L'\\' || soleFolderName.Back() == L'/' || soleFolderName.Back() == '\\' || soleFolderName.Back() == '/')) {
|
||||
soleFolderName.DeleteBack();
|
||||
}
|
||||
UString destPathWithSoleFolder = destPath;
|
||||
destPathWithSoleFolder += L'\\';
|
||||
destPathWithSoleFolder += soleFolderName;
|
||||
if (IsDirectory(destPathWithSoleFolder)) {
|
||||
done = true;
|
||||
if (close7Zip)
|
||||
{
|
||||
StartApplicationDontWait(destPathWithSoleFolder, destPathWithSoleFolder, (HWND)_window);
|
||||
} else {
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(*pDelayedOpenFolderAfterExtractPathCriticalSection);
|
||||
DelayedOpenFolderAfterExtractPath = destPathWithSoleFolder;
|
||||
}
|
||||
_window.SetTimer(1678, 800);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!done) {
|
||||
if (IsDirectory(destPath)) {
|
||||
if (close7Zip)
|
||||
{
|
||||
StartApplicationDontWait(destPath, destPath, (HWND)_window);
|
||||
} else {
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(*pDelayedOpenFolderAfterExtractPathCriticalSection);
|
||||
DelayedOpenFolderAfterExtractPath = destPath;
|
||||
}
|
||||
_window.SetTimer(1678, 800);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (deleteSourceFile)
|
||||
{
|
||||
|
||||
@@ -69,6 +69,9 @@ public:
|
||||
bool ShowButtonsLables;
|
||||
bool LargeButtons;
|
||||
|
||||
UString DelayedOpenFolderAfterExtractPath;
|
||||
NWindows::NSynchronization::CCriticalSection *pDelayedOpenFolderAfterExtractPathCriticalSection;
|
||||
|
||||
CAppState AppState;
|
||||
CPanelCallbackImp m_PanelCallbackImp[kNumPanelsMax];
|
||||
CPanel Panels[kNumPanelsMax];
|
||||
@@ -91,7 +94,9 @@ public:
|
||||
_window(NULL),
|
||||
AutoRefresh_Mode(true),
|
||||
NumPanels(2),
|
||||
LastFocusedPanel(0)
|
||||
LastFocusedPanel(0),
|
||||
DelayedOpenFolderAfterExtractPath(L""),
|
||||
pDelayedOpenFolderAfterExtractPathCriticalSection(NULL)
|
||||
{
|
||||
SetPanels_AutoRefresh_Mode();
|
||||
}
|
||||
|
||||
@@ -1035,6 +1035,24 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
g_App.OnNotify((int)wParam, (LPNMHDR)lParam);
|
||||
break;
|
||||
}
|
||||
|
||||
case WM_TIMER:
|
||||
{
|
||||
if (wParam == 1678) {
|
||||
KillTimer(hWnd, 1678);
|
||||
UString p;
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(*g_App.pDelayedOpenFolderAfterExtractPathCriticalSection);
|
||||
p = g_App.DelayedOpenFolderAfterExtractPath;
|
||||
g_App.DelayedOpenFolderAfterExtractPath.Wipe_and_Empty();
|
||||
}
|
||||
|
||||
if (!p.IsEmpty()) {
|
||||
StartApplicationDontWait(p, p, hWnd);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
case WM_DROPFILES:
|
||||
|
||||
@@ -1757,6 +1757,10 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */, bool isRightButton)
|
||||
}
|
||||
}
|
||||
|
||||
if (dataObjectSpec->m_Transfer.Target.Cmd_Type == NDragMenu::k_OpenArc) {
|
||||
need_Process = false;
|
||||
}
|
||||
|
||||
if (need_Process)
|
||||
if (!dataObjectSpec->DestDirPrefix_FromTarget.IsEmpty())
|
||||
{
|
||||
@@ -1972,8 +1976,6 @@ void CDropTarget::PositionCursor(const POINTL &ptl)
|
||||
{
|
||||
m_Panel = panel;
|
||||
m_IsAppTarget = false;
|
||||
if ((int)i == SrcPanelIndex)
|
||||
return; // we don't allow to drop to source panel
|
||||
|
||||
POINT pt3 = pt;
|
||||
if (panel->ScreenToClient(&pt3)) {
|
||||
@@ -1986,6 +1988,9 @@ void CDropTarget::PositionCursor(const POINTL &ptl)
|
||||
m_IsPanelAddressComboBoxOrBar = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ((int)i == SrcPanelIndex && !m_IsPanelAddressComboBoxOrBar)
|
||||
return; // we don't allow to drop to source panel
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -2770,13 +2775,16 @@ Z7_COMWF_B CDropTarget::Drop(IDataObject *dataObject, DWORD keyState,
|
||||
// res = SendToSource_UInt32(dataObject, RegisterClipboardFormat(CFSTR_LOGICALPERFORMEDDROPEFFECT), DROPEFFECT_MOVE); // for debug
|
||||
/* res = */ SendToSource_UInt32(dataObject,
|
||||
RegisterClipboardFormat(CFSTR_PERFORMEDDROPEFFECT),
|
||||
cmd == NDragMenu::k_Cancel ? DROPEFFECT_NONE : DROPEFFECT_COPY);
|
||||
((cmd == NDragMenu::k_Cancel) || (cmd == NDragMenu::k_OpenArc)) ? DROPEFFECT_NONE : DROPEFFECT_COPY);
|
||||
// res = res;
|
||||
}
|
||||
RemoveSelection();
|
||||
|
||||
target.FuncType = k_DragTargetMode_Drop_End;
|
||||
target.Cmd_Type = cmd;
|
||||
if (cmd == NDragMenu::k_OpenArc) {
|
||||
needDrop_by_Source = false;
|
||||
}
|
||||
if (needDrop_by_Source)
|
||||
target.Flags |= k_TargetFlags_MustBeProcessedBySource;
|
||||
|
||||
|
||||
@@ -194,8 +194,8 @@ int CALLBACK CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData)
|
||||
const bool isDir1 = panel->IsItem_Folder((unsigned)lParam1);
|
||||
const bool isDir2 = panel->IsItem_Folder((unsigned)lParam2);
|
||||
|
||||
if (isDir1 && !isDir2) return -1;
|
||||
if (isDir2 && !isDir1) return 1;
|
||||
// if (isDir1 && !isDir2) return -1;
|
||||
// if (isDir2 && !isDir1) return 1;
|
||||
|
||||
const int result = CompareItems2(lParam1, lParam2, lpData);
|
||||
return panel->_ascending ? result: (-result);
|
||||
|
||||
Reference in New Issue
Block a user