From ed45d88cfda81daa845b73991801459106054544 Mon Sep 17 00:00:00 2001 From: martinfouilleul Date: Tue, 23 May 2023 16:43:57 +0200 Subject: [PATCH] [win32] add file type filters to open/save dialogs --- examples/ui/main.c | 5 +++-- src/win32_app.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/examples/ui/main.c b/examples/ui/main.c index 21701c1..8529a40 100644 --- a/examples/ui/main.c +++ b/examples/ui/main.c @@ -422,13 +422,14 @@ int main() if(ui_button("Open").clicked) { - str8 file = mp_open_dialog(mem_scratch(), "Open File", 0, 0, 0, true); + char* filters[] = {"md"}; + str8 file = mp_open_dialog(mem_scratch(), "Open File", 0, 1, filters, false); printf("selected file %.*s\n", (int)file.len, file.ptr); } if(ui_button("Save").clicked) { - str8 file = mp_save_dialog(mem_scratch(), "Save File", 0, 0, 0, true); + str8 file = mp_save_dialog(mem_scratch(), "Save File", 0, 0, 0); printf("selected file %.*s\n", (int)file.len, file.ptr); } } diff --git a/src/win32_app.c b/src/win32_app.c index e30b4e0..f45764f 100644 --- a/src/win32_app.c +++ b/src/win32_app.c @@ -1090,8 +1090,10 @@ str8 mp_app_get_resource_path(mem_arena* arena, const char* name) #define interface struct #include +#include #undef interface + MP_API str8 mp_open_dialog(mem_arena* arena, const char* title, const char* defaultPath, @@ -1114,6 +1116,30 @@ MP_API str8 mp_open_dialog(mem_arena* arena, dialog->lpVtbl->SetOptions(dialog, opt | FOS_PICKFOLDERS); } + if(filterCount && filters) + { + mem_arena_marker mark = mem_arena_mark(arena); + COMDLG_FILTERSPEC* filterSpecs = mem_arena_alloc_array(arena, COMDLG_FILTERSPEC, filterCount); + for(int i=0; ilpVtbl->SetFileTypes(dialog, filterCount, filterSpecs); + + mem_arena_clear_to(arena, mark); + } + hr = dialog->lpVtbl->Show(dialog, NULL); if(SUCCEEDED(hr)) { @@ -1158,6 +1184,30 @@ MP_API str8 mp_save_dialog(mem_arena* arena, hr = CoCreateInstance(&CLSID_FileSaveDialog, NULL, CLSCTX_ALL, &IID_IFileSaveDialog, (void**)&dialog); if(SUCCEEDED(hr)) { + if(filterCount && filters) + { + mem_arena_marker mark = mem_arena_mark(arena); + COMDLG_FILTERSPEC* filterSpecs = mem_arena_alloc_array(arena, COMDLG_FILTERSPEC, filterCount); + for(int i=0; ilpVtbl->SetFileTypes(dialog, filterCount, filterSpecs); + + mem_arena_clear_to(arena, mark); + } + hr = dialog->lpVtbl->Show(dialog, NULL); if(SUCCEEDED(hr)) {