| 
							- #include "osdialog.h"
 - #include <string.h>
 - #include <stdio.h>
 - #include <windows.h>
 - #include <shlobj.h>
 - 
 - 
 - int osdialog_message(osdialog_message_level level, osdialog_message_buttons buttons, const char *message) {
 - 	UINT type = 0;
 - 	switch (level) {
 - 		default:
 - 		case OSDIALOG_INFO: type |= MB_ICONINFORMATION; break;
 - 		case OSDIALOG_WARNING: type |= MB_ICONWARNING; break;
 - 		case OSDIALOG_ERROR: type |= MB_ICONERROR; break;
 - 	}
 - 
 - 	switch (buttons) {
 - 		default:
 - 		case OSDIALOG_OK: type |= MB_OK; break;
 - 		case OSDIALOG_OK_CANCEL: type |= MB_OKCANCEL; break;
 - 		case OSDIALOG_YES_NO: type |= MB_YESNO; break;
 - 	}
 - 
 - 	int result = MessageBox(NULL, message, "", type);
 - 	switch (result) {
 - 		case IDOK:
 - 		case IDYES:
 - 			return 1;
 - 		default:
 - 			return 0;
 - 	}
 - }
 - 
 - char *osdialog_file(osdialog_file_action action, const char *path, const char *filename, osdialog_filters *filters) {
 - 	if (action == OSDIALOG_OPEN_DIR) {
 - 		// open directory dialog
 - 		TCHAR szDir[MAX_PATH] = "";
 - 
 - 		BROWSEINFO bInfo;
 - 		ZeroMemory(&bInfo, sizeof(bInfo));
 - 		bInfo.hwndOwner = NULL;
 - 		bInfo.pidlRoot = NULL; 
 - 		bInfo.pszDisplayName = szDir;
 - 		bInfo.lpszTitle = NULL;
 - 		bInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
 - 		bInfo.lpfn = NULL;
 - 		bInfo.lParam = 0;
 - 		bInfo.iImage = -1;
 - 
 - 		LPITEMIDLIST lpItem = SHBrowseForFolder(&bInfo);
 - 		if (lpItem) {
 - 		  SHGetPathFromIDList(lpItem, szDir);
 - 			return strdup(szDir);
 - 		}
 - 		else {
 - 			return NULL;
 - 		}
 - 	}
 - 	else {
 - 		// open or save file dialog
 - 		OPENFILENAME ofn;
 - 		ZeroMemory(&ofn, sizeof(ofn));
 - 
 - 		char strFile[_MAX_PATH] = "";
 - 		if (filename)
 - 			snprintf(strFile, sizeof(strFile), "%s", filename);
 - 		char *strInitialDir = path ? strdup(path) : NULL;
 - 
 - 		ofn.lStructSize = sizeof(ofn);
 - 		ofn.lpstrFile = strFile;
 - 		ofn.nMaxFile = sizeof(strFile);
 - 		ofn.lpstrInitialDir = strInitialDir;
 - 		ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;
 - 
 - 		if (filters) {
 - 			char fBuf[4096];
 - 			int fLen = 0;
 - 
 - 			for (; filters; filters = filters->next) {
 - 				fLen += snprintf(fBuf + fLen, sizeof(fBuf) - fLen, "%s", filters->name);
 - 				fLen++;
 - 				for (osdialog_filter_patterns *patterns = filters->patterns; patterns; patterns = patterns->next) {
 - 					fLen += snprintf(fBuf + fLen, sizeof(fBuf) - fLen, "*.%s", patterns->pattern);
 - 					if (patterns->next)
 - 						fLen += snprintf(fBuf + fLen, sizeof(fBuf) - fLen, ";");
 - 				}
 - 				fLen++;
 - 			}
 - 
 - 			ofn.lpstrFilter = fBuf;
 - 			ofn.nFilterIndex = 1;
 - 		}
 - 
 - 		BOOL success;
 - 		if (action == OSDIALOG_OPEN)
 - 			success = GetOpenFileName(&ofn);
 - 		else
 - 			success = GetSaveFileName(&ofn);
 - 
 - 		if (strInitialDir)
 - 			free(strInitialDir);
 - 		return success ? strdup(strFile) : NULL;
 - 	}
 - }
 - 
 - 
 - int osdialog_color_picker(osdialog_color *color, int opacity) {
 - 	if (!color)
 - 		return 0;
 - 
 - 	CHOOSECOLOR cc;
 - 	ZeroMemory(&cc, sizeof(cc));
 - 
 - 	COLORREF c = RGB(color->r, color->g, color->b);
 - 	static COLORREF acrCustClr[16];
 - 
 - 	cc.lStructSize = sizeof(cc);
 - 	cc.lpCustColors = (LPDWORD) acrCustClr;
 - 	cc.rgbResult = c;
 - 	cc.Flags = CC_FULLOPEN | CC_ANYCOLOR | CC_RGBINIT;
 - 
 - 	if (ChooseColor(&cc)) {
 - 		color->r = GetRValue(cc.rgbResult);
 - 		color->g = GetGValue(cc.rgbResult);
 - 		color->b = GetBValue(cc.rgbResult);
 - 		color->a = 255;
 - 		return 1;
 - 	}
 - 
 - 	return 0;
 - }
 
 
  |