mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[ui] extend SelectionDialog() to support checkbox selection
This commit is contained in:
		
							parent
							
								
									a9a97b6f10
								
							
						
					
					
						commit
						9690742d91
					
				
					 7 changed files with 57 additions and 61 deletions
				
			
		
							
								
								
									
										17
									
								
								src/format.c
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								src/format.c
									
										
									
									
									
								
							|  | @ -1268,11 +1268,11 @@ int SetWinToGoIndex(void) | |||
| 	if (img_report.wininst_index > 1) { | ||||
| 		for (i = 0; i < img_report.wininst_index; i++) | ||||
| 			install_names[i] = &img_report.wininst_path[i][2]; | ||||
| 		wininst_index = SelectionDialog(lmprintf(MSG_130), lmprintf(MSG_131), install_names, img_report.wininst_index); | ||||
| 		wininst_index = _log2(SelectionDialog(BS_AUTORADIOBUTTON, lmprintf(MSG_130), | ||||
| 			lmprintf(MSG_131), install_names, img_report.wininst_index, 1)); | ||||
| 		if (wininst_index < 0) | ||||
| 			return -2; | ||||
| 		wininst_index--; | ||||
| 		if ((wininst_index < 0) || (wininst_index >= MAX_WININST)) | ||||
| 		if (wininst_index >= MAX_WININST) | ||||
| 			wininst_index = 0; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -1323,14 +1323,15 @@ int SetWinToGoIndex(void) | |||
| 		uprintf("Warning: Nonstandard Windows image (missing <DISPLAYNAME> entries)"); | ||||
| 
 | ||||
| 	if (i > 1) | ||||
| 		i = SelectionDialog(lmprintf(MSG_291), lmprintf(MSG_292), version_name.String, i); | ||||
| 	if (i < 0) { | ||||
| 		// NB: _log2 returns -2 if SelectionDialog() returns negative (user cancelled)
 | ||||
| 		i = _log2(SelectionDialog(BS_AUTORADIOBUTTON, | ||||
| 			lmprintf(MSG_291), lmprintf(MSG_292), version_name.String, i, 1)) + 1; | ||||
| 	if (i < 0) | ||||
| 		wintogo_index = -2;	// Cancelled by the user
 | ||||
| 	} else if (i == 0) { | ||||
| 	else if (i == 0) | ||||
| 		wintogo_index = 1; | ||||
| 	} else { | ||||
| 	else | ||||
| 		wintogo_index = atoi(version_index.String[i - 1]); | ||||
| 	} | ||||
| 	if (i > 0) { | ||||
| 		// Get the build version
 | ||||
| 		build = get_token_data_file_indexed("BUILD", xml_file, i); | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
| * Rufus: The Reliable USB Formatting Utility | ||||
| * Constants and defines missing from various toolchains | ||||
| * Copyright © 2016-2017 Pete Batard <pete@akeo.ie> | ||||
| * Copyright © 2016-2022 Pete Batard <pete@akeo.ie> | ||||
| * | ||||
| * This program is free software: you can redistribute it and/or modify | ||||
| * it under the terms of the GNU General Public License as published by | ||||
|  | @ -105,6 +105,16 @@ static __inline void *_reallocf(void *ptr, size_t size) { | |||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static __inline int _log2(register int val) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 	if (val < 0) | ||||
| 		return -2; | ||||
| 	while (val >>= 1) | ||||
| 		ret++; | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /* Why oh why does Microsoft have to make everybody suffer with their braindead use of Unicode? */ | ||||
| #define _RT_ICON			MAKEINTRESOURCEA(3) | ||||
| #define _RT_DIALOG			MAKEINTRESOURCEA(5) | ||||
|  |  | |||
|  | @ -31,27 +31,6 @@ | |||
| #define IDI_LOG_32                      144 | ||||
| #define IDI_SAVE_32                     145 | ||||
| #define IDI_HASH_32                     146 | ||||
| #define IDD_DIALOG_XP                   151 | ||||
| #define IDD_ABOUTBOX_XP                 152 | ||||
| #define IDD_NOTIFICATION_XP             153 | ||||
| #define IDD_LICENSE_XP                  154 | ||||
| #define IDD_LOG_XP                      155 | ||||
| #define IDD_UPDATE_POLICY_XP            156 | ||||
| #define IDD_NEW_VERSION_XP              157 | ||||
| #define IDD_DIALOG_RTL                  201 | ||||
| #define IDD_ABOUTBOX_RTL                202 | ||||
| #define IDD_NOTIFICATION_RTL            203 | ||||
| #define IDD_LICENSE_RTL                 204 | ||||
| #define IDD_LOG_RTL                     205 | ||||
| #define IDD_UPDATE_POLICY_RTL           206 | ||||
| #define IDD_NEW_VERSION_RTL             207 | ||||
| #define IDD_DIALOG_RTL_XP               251 | ||||
| #define IDD_ABOUTBOX_RTL_XP             252 | ||||
| #define IDD_NOTIFICATION_RTL_XP         253 | ||||
| #define IDD_LICENSE_RTL_XP              254 | ||||
| #define IDD_LOG_RTL_XP                  255 | ||||
| #define IDD_UPDATE_POLICY_RTL_XP        256 | ||||
| #define IDD_NEW_VERSION_RTL_XP          257 | ||||
| #define IDR_FD_COMMAND_COM              300 | ||||
| #define IDR_FD_KERNEL_SYS               301 | ||||
| #define IDR_FD_DISPLAY_EXE              302 | ||||
|  |  | |||
							
								
								
									
										24
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -1,6 +1,6 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * Copyright © 2011-2021 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2011-2022 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -1454,23 +1454,20 @@ static DWORD WINAPI BootCheckThread(LPVOID param) | |||
| 				if ((img_report.projected_size < MAX_ISO_TO_ESP_SIZE * MB) && HAS_REGULAR_EFI(img_report) && | ||||
| 					(partition_type == PARTITION_STYLE_GPT) && IS_FAT(fs_type)) { | ||||
| 					char* choices[3] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, "ISO → ESP"), lmprintf(MSG_277, dd_image) }; | ||||
| 					i = SelectionDialog(lmprintf(MSG_274, "ISOHybrid"), lmprintf(MSG_275, iso_image, dd_image, iso_image, dd_image), | ||||
| 						choices, 3); | ||||
| 					i = SelectionDialog(BS_AUTORADIOBUTTON, lmprintf(MSG_274, "ISOHybrid"), | ||||
| 						lmprintf(MSG_275, iso_image, dd_image, iso_image, dd_image), choices, 3, 1); | ||||
| 					if (i < 0)	// Cancel
 | ||||
| 						goto out; | ||||
| 					else if (i == 2) | ||||
| 						write_as_esp = TRUE; | ||||
| 					else if (i == 3) | ||||
| 						write_as_image = TRUE; | ||||
| 					write_as_esp = (i & 2); | ||||
| 					write_as_image = (i & 4); | ||||
| 					esp_already_asked = TRUE; | ||||
| 				} else { | ||||
| 					char* choices[2] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, dd_image) }; | ||||
| 					i = SelectionDialog(lmprintf(MSG_274, "ISOHybrid"), lmprintf(MSG_275, iso_image, dd_image, iso_image, dd_image), | ||||
| 						choices, 2); | ||||
| 					i = SelectionDialog(BS_AUTORADIOBUTTON, lmprintf(MSG_274, "ISOHybrid"), | ||||
| 						lmprintf(MSG_275, iso_image, dd_image, iso_image, dd_image), choices, 2, 1); | ||||
| 					if (i < 0)	// Cancel
 | ||||
| 						goto out; | ||||
| 					else if (i == 2) | ||||
| 						write_as_image = TRUE; | ||||
| 					write_as_image = (i & 2); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | @ -1541,11 +1538,10 @@ static DWORD WINAPI BootCheckThread(LPVOID param) | |||
| 			// so ask the users if they want to write it as an ESP.
 | ||||
| 			char* iso_image = lmprintf(MSG_036); | ||||
| 			char* choices[2] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, "ISO → ESP") }; | ||||
| 			i = SelectionDialog(lmprintf(MSG_274, "ESP"), lmprintf(MSG_310), choices, 2); | ||||
| 			i = SelectionDialog(BS_AUTORADIOBUTTON, lmprintf(MSG_274, "ESP"), lmprintf(MSG_310), choices, 2, 1); | ||||
| 			if (i < 0)	// Cancel
 | ||||
| 				goto out; | ||||
| 			else if (i == 2) | ||||
| 				write_as_esp = TRUE; | ||||
| 			write_as_esp = (i & 2); | ||||
| 		} | ||||
| 
 | ||||
| 		// If the selected target doesn't include BIOS, skip file downloads for GRUB/Syslinux
 | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * Copyright © 2011-2021 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2011-2022 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -558,7 +558,7 @@ extern BOOL CreateTooltip(HWND hControl, const char* message, int duration); | |||
| extern void DestroyTooltip(HWND hWnd); | ||||
| extern void DestroyAllTooltips(void); | ||||
| extern BOOL Notification(int type, const char* dont_display_setting, const notification_info* more_info, char* title, char* format, ...); | ||||
| extern int SelectionDialog(char* title, char* message, char** choices, int size); | ||||
| extern int SelectionDialog(int style, char* title, char* message, char** choices, int size, int mask); | ||||
| extern void ListDialog(char* title, char* message, char** items, int size); | ||||
| extern SIZE GetTextSize(HWND hCtrl, char* txt); | ||||
| extern BOOL ExtractAppIcon(const char* filename, BOOL bSilent); | ||||
|  |  | |||
							
								
								
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL | |||
| IDD_DIALOG DIALOGEX 12, 12, 232, 326 | ||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||
| EXSTYLE WS_EX_ACCEPTFILES | ||||
| CAPTION "Rufus 3.19.1898" | ||||
| CAPTION "Rufus 3.19.1899" | ||||
| FONT 9, "Segoe UI Symbol", 400, 0, 0x0 | ||||
| BEGIN | ||||
|     LTEXT           "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP | ||||
|  | @ -395,8 +395,8 @@ END | |||
| // | ||||
| 
 | ||||
| VS_VERSION_INFO VERSIONINFO | ||||
|  FILEVERSION 3,19,1898,0 | ||||
|  PRODUCTVERSION 3,19,1898,0 | ||||
|  FILEVERSION 3,19,1899,0 | ||||
|  PRODUCTVERSION 3,19,1899,0 | ||||
|  FILEFLAGSMASK 0x3fL | ||||
| #ifdef _DEBUG | ||||
|  FILEFLAGS 0x1L | ||||
|  | @ -414,13 +414,13 @@ BEGIN | |||
|             VALUE "Comments", "https://rufus.ie" | ||||
|             VALUE "CompanyName", "Akeo Consulting" | ||||
|             VALUE "FileDescription", "Rufus" | ||||
|             VALUE "FileVersion", "3.19.1898" | ||||
|             VALUE "FileVersion", "3.19.1899" | ||||
|             VALUE "InternalName", "Rufus" | ||||
|             VALUE "LegalCopyright", "© 2011-2022 Pete Batard (GPL v3)" | ||||
|             VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html" | ||||
|             VALUE "OriginalFilename", "rufus-3.19.exe" | ||||
|             VALUE "ProductName", "Rufus" | ||||
|             VALUE "ProductVersion", "3.19.1898" | ||||
|             VALUE "ProductVersion", "3.19.1899" | ||||
|         END | ||||
|     END | ||||
|     BLOCK "VarFileInfo" | ||||
|  |  | |||
							
								
								
									
										30
									
								
								src/stdlg.c
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								src/stdlg.c
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * Standard Dialog Routines (Browse for folder, About, etc) | ||||
|  * Copyright © 2011-2021 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2011-2022 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -859,13 +859,16 @@ BOOL Notification(int type, const char* dont_display_setting, const notification | |||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| // We only ever display one selection dialog, so set some params as globals
 | ||||
| static int selection_dialog_style, selection_dialog_mask; | ||||
| 
 | ||||
| /*
 | ||||
|  * Custom dialog for radio button selection dialog | ||||
|  */ | ||||
| INT_PTR CALLBACK SelectionCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) | ||||
| { | ||||
| 	LRESULT loc; | ||||
| 	int i, dh, r  = -1; | ||||
| 	int i, m, dh, r  = -1; | ||||
| 	// Prevent resizing
 | ||||
| 	static LRESULT disabled[9] = { HTLEFT, HTRIGHT, HTTOP, HTBOTTOM, HTSIZE, | ||||
| 		HTTOPLEFT, HTTOPRIGHT, HTBOTTOMLEFT, HTBOTTOMRIGHT }; | ||||
|  | @ -885,6 +888,9 @@ INT_PTR CALLBACK SelectionCallback(HWND hDlg, UINT message, WPARAM wParam, LPARA | |||
| 				nDialogItems, IDC_SELECTION_CHOICEMAX - IDC_SELECTION_CHOICE1); | ||||
| 			nDialogItems = IDC_SELECTION_CHOICEMAX - IDC_SELECTION_CHOICE1; | ||||
| 		} | ||||
| 		// Switch to checkboxes or some other style if requested
 | ||||
| 		for (i = 0; i < nDialogItems; i++) | ||||
| 			Button_SetStyle(GetDlgItem(hDlg, IDC_SELECTION_CHOICE1 + i), selection_dialog_style, TRUE); | ||||
| 		// Get the system message box font. See http://stackoverflow.com/a/6057761
 | ||||
| 		ncm.cbSize = sizeof(ncm); | ||||
| 		SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0); | ||||
|  | @ -936,9 +942,9 @@ INT_PTR CALLBACK SelectionCallback(HWND hDlg, UINT message, WPARAM wParam, LPARA | |||
| 		ResizeButtonHeight(hDlg, IDOK); | ||||
| 		ResizeButtonHeight(hDlg, IDCANCEL); | ||||
| 
 | ||||
| 		// Set the radio selection
 | ||||
| 		Button_SetCheck(GetDlgItem(hDlg, IDC_SELECTION_CHOICE1), BST_CHECKED); | ||||
| 		Button_SetCheck(GetDlgItem(hDlg, IDC_SELECTION_CHOICE2), BST_UNCHECKED); | ||||
| 		// Set the default selection
 | ||||
| 		for (i = 0, m = 1; i < nDialogItems; i++, m <<= 1) | ||||
| 			Button_SetCheck(GetDlgItem(hDlg, IDC_SELECTION_CHOICE1 + i), (m & selection_dialog_mask) ? BST_CHECKED : BST_UNCHECKED); | ||||
| 		return (INT_PTR)TRUE; | ||||
| 	case WM_CTLCOLORSTATIC: | ||||
| 		// Change the background colour for static text and icon
 | ||||
|  | @ -959,10 +965,9 @@ INT_PTR CALLBACK SelectionCallback(HWND hDlg, UINT message, WPARAM wParam, LPARA | |||
| 	case WM_COMMAND: | ||||
| 		switch (LOWORD(wParam)) { | ||||
| 		case IDOK: | ||||
| 			for (i = 0; (i < nDialogItems) && | ||||
| 				(Button_GetCheck(GetDlgItem(hDlg, IDC_SELECTION_CHOICE1 + i)) != BST_CHECKED); i++); | ||||
| 			if (i < nDialogItems) | ||||
| 				r = i + 1; | ||||
| 			for (r = 0, i = 0, m = 1; i < nDialogItems; i++, m <<= 1) | ||||
| 				if (Button_GetCheck(GetDlgItem(hDlg, IDC_SELECTION_CHOICE1 + i)) == BST_CHECKED) | ||||
| 					r += m; | ||||
| 			// Fall through
 | ||||
| 		case IDNO: | ||||
| 		case IDCANCEL: | ||||
|  | @ -977,7 +982,7 @@ INT_PTR CALLBACK SelectionCallback(HWND hDlg, UINT message, WPARAM wParam, LPARA | |||
| /*
 | ||||
|  * Display an item selection dialog | ||||
|  */ | ||||
| int SelectionDialog(char* title, char* message, char** choices, int size) | ||||
| int SelectionDialog(int style, char* title, char* message, char** choices, int size, int mask) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
|  | @ -986,6 +991,9 @@ int SelectionDialog(char* title, char* message, char** choices, int size) | |||
| 	szMessageText = message; | ||||
| 	szDialogItem = choices; | ||||
| 	nDialogItems = size; | ||||
| 	selection_dialog_style = style; | ||||
| 	selection_dialog_mask = mask; | ||||
| 	assert(selection_dialog_style == BS_AUTORADIOBUTTON || selection_dialog_style == BS_AUTOCHECKBOX); | ||||
| 	ret = (int)MyDialogBox(hMainInstance, IDD_SELECTION, hMainDialog, SelectionCallback); | ||||
| 	dialog_showing--; | ||||
| 
 | ||||
|  | @ -1971,6 +1979,7 @@ LPCDLGTEMPLATE GetDialogTemplate(int Dialog_ID) | |||
| HWND MyCreateDialog(HINSTANCE hInstance, int Dialog_ID, HWND hWndParent, DLGPROC lpDialogFunc) | ||||
| { | ||||
| 	LPCDLGTEMPLATE rcTemplate = GetDialogTemplate(Dialog_ID); | ||||
| 	assert(rcTemplate != NULL); | ||||
| 	HWND hDlg = CreateDialogIndirect(hInstance, rcTemplate, hWndParent, lpDialogFunc); | ||||
| 	safe_free(rcTemplate); | ||||
| 	return hDlg; | ||||
|  | @ -1987,6 +1996,7 @@ INT_PTR MyDialogBox(HINSTANCE hInstance, int Dialog_ID, HWND hWndParent, DLGPROC | |||
| 	// main dialog was reduced => Ensure the main dialog is visible before we display anything.
 | ||||
| 	ShowWindow(hMainDialog, SW_NORMAL); | ||||
| 
 | ||||
| 	assert(rcTemplate != NULL); | ||||
| 	ret = DialogBoxIndirect(hMainInstance, rcTemplate, hWndParent, lpDialogFunc); | ||||
| 	safe_free(rcTemplate); | ||||
| 	return ret; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue