Merge pull request #373 from ClusterM/archive-window

Resizable "open archive window" for Windows version
This commit is contained in:
Alexey 'Cluster' Avdyukhin 2021-06-15 14:28:27 +03:00 committed by GitHub
commit e1f67a0a86
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 82 additions and 5 deletions

View File

@ -18,6 +18,11 @@
//it would be nonreadable because we wouldnt actually decompress the contents
static FCEUARCHIVEFILEINFO *currFileSelectorContext;
static RECT oldWindowRect;
static RECT newWindowRect;
// Minimum window size
static const int MIN_WIDTH = 250;
static const int MIN_HEIGHT = 150;
DEFINE_GUID(CLSID_CFormat_07,0x23170F69,0x40C1,0x278A,0x10,0x00,0x00,0x01,0x10,0x07,0x00,0x00);
@ -261,6 +266,37 @@ public:
}
};
//used to move all child items in the dialog when you resize (except for the dock fill controls which are resized)
BOOL CALLBACK ArchiveEnumWindowsProc(HWND hwnd, LPARAM lParam)
{
RECT crect;
HWND parent = GetParent(hwnd);
GetWindowRect(hwnd, &crect); //Get rect of current child to be resized
ScreenToClient(parent, (LPPOINT)&crect); //Convert rect coordinates to client area coordinates
ScreenToClient(parent, ((LPPOINT)&crect) + 1);
int plusWidth = (newWindowRect.right - newWindowRect.left) - (oldWindowRect.right - oldWindowRect.left);
int plusHeight = (newWindowRect.bottom - newWindowRect.top) - (oldWindowRect.bottom - oldWindowRect.top);
switch (GetDlgCtrlID(hwnd))
{
case IDC_LIST1:
// horizontal and vertical stretch
SetWindowPos(hwnd, 0, crect.left, crect.top,
crect.right - crect.left + plusWidth, crect.bottom - crect.top + plusHeight,
SWP_NOZORDER);
break;
case IDOK:
case IDCANCEL:
// movement only
SetWindowPos(hwnd, 0, crect.left + plusWidth, crect.top + plusHeight,
crect.right - crect.left, crect.bottom - crect.top,
SWP_NOZORDER);
break;
}
return TRUE;
}
class LibRef
{
@ -275,6 +311,7 @@ public:
}
};
// Callback for resizing child controls
static INT_PTR CALLBACK ArchiveFileSelectorCallback(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
@ -287,6 +324,7 @@ static INT_PTR CALLBACK ArchiveFileSelectorCallback(HWND hwndDlg, UINT uMsg, WPA
std::string& name = (*currFileSelectorContext)[i].name;
SendMessage(hwndListbox, LB_ADDSTRING, 0, (LPARAM)name.c_str());
}
GetWindowRect(hwndDlg, &oldWindowRect);
}
break;
@ -309,6 +347,32 @@ static INT_PTR CALLBACK ArchiveFileSelectorCallback(HWND hwndDlg, UINT uMsg, WPA
return TRUE;
}
break;
case WM_SIZE:
{
GetWindowRect(hwndDlg, &newWindowRect); // Get new size
// Limit window size
bool fixSize = false;
if (newWindowRect.right - newWindowRect.left < MIN_WIDTH)
{
newWindowRect.right = newWindowRect.left + MIN_WIDTH;
fixSize = true;
}
if (newWindowRect.bottom - newWindowRect.top < MIN_HEIGHT)
{
newWindowRect.bottom = newWindowRect.top + MIN_HEIGHT;
fixSize = true;
}
if (fixSize)
{
SetWindowPos(hwndDlg, 0, newWindowRect.left, newWindowRect.top,
newWindowRect.right - newWindowRect.left, newWindowRect.bottom - newWindowRect.top, 0);
}
// Initiate callback for resizing child controls
EnumChildWindows(hwndDlg, ArchiveEnumWindowsProc, 0);
InvalidateRect(hwndDlg, 0, TRUE);
UpdateWindow(hwndDlg);
oldWindowRect = newWindowRect; // Store for future calculations
}
}
return FALSE;
}
@ -326,10 +390,11 @@ TFormatRecords formatRecords;
static bool archiveSystemInitialized=false;
#ifdef WIN64
static LibRef libref("7z_64.dll");
#define _7Z_DLL "7z_64.dll"
#else
static LibRef libref("7z.dll");
#define _7Z_DLL "7z.dll"
#endif
static LibRef libref(_7Z_DLL);
void initArchiveSystem()
{
@ -411,10 +476,17 @@ static std::string wstringFromPROPVARIANT(BSTR bstr, bool& success)
return strret;
}
static bool endsWith(const std::string& str, const std::string& suffix)
{
return (str.size() >= suffix.size()) && (str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0);
}
ArchiveScanRecord FCEUD_ScanArchive(std::string fname)
{
if(!archiveSystemInitialized)
{
if (endsWith(fname, ".zip") || endsWith(fname, ".7z") || endsWith(fname, ".rar"))
MessageBox(hAppWnd, "Could not locate " _7Z_DLL, "Failure reading archive file", 0);
return ArchiveScanRecord();
}
@ -512,7 +584,7 @@ static FCEUFILE* FCEUD_OpenArchive(ArchiveScanRecord& asr, std::string& fname, s
FCEUFILE* fp = 0;
if(!archiveSystemInitialized) {
MessageBox(hAppWnd,"Could not locate 7z.dll","Failure launching archive browser",0);
MessageBox(hAppWnd,"Could not locate " _7Z_DLL, "Failure launching archive browser", 0);
return 0;
}
@ -520,7 +592,7 @@ static FCEUFILE* FCEUD_OpenArchive(ArchiveScanRecord& asr, std::string& fname, s
CreateObjectFunc CreateObject = (CreateObjectFunc)GetProcAddress(libref.hmod,"CreateObject");
if(!CreateObject)
{
MessageBox(hAppWnd,"7z.dll was invalid","Failure launching archive browser",0);
MessageBox(hAppWnd, _7Z_DLL " was invalid","Failure launching archive browser",0);
return 0;
}

View File

@ -1355,7 +1355,7 @@ BEGIN
END
ARCHIVECHOOSERDIALOG DIALOGEX 0, 0, 265, 159
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Choose File From Archive"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
@ -2314,6 +2314,11 @@ BEGIN
0
END
ARCHIVECHOOSERDIALOG AFX_DIALOG_LAYOUT
BEGIN
0
END
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////