#include "osdialog.h" #include #include #include #include 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; }