mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-29 09:10:08 -06:00
libui: primp file picker dialogs
* support for filters, for Windows (tested) and GTK (theoretical) * add extra parameter for setting the start directory, but not supported yet
This commit is contained in:
@ -6,7 +6,7 @@
|
||||
|
||||
#define windowWindow(w) (GTK_WINDOW(uiControlHandle(uiControl(w))))
|
||||
|
||||
static char *filedialog(GtkWindow *parent, GtkFileChooserAction mode, const gchar *confirm)
|
||||
static char *filedialog(GtkWindow *parent, GtkFileChooserAction mode, const gchar *confirm, char* filter, char* initpath)
|
||||
{
|
||||
GtkWidget *fcd;
|
||||
GtkFileChooser *fc;
|
||||
@ -18,6 +18,52 @@ static char *filedialog(GtkWindow *parent, GtkFileChooserAction mode, const gcha
|
||||
confirm, GTK_RESPONSE_ACCEPT,
|
||||
NULL);
|
||||
fc = GTK_FILE_CHOOSER(fcd);
|
||||
|
||||
// filters
|
||||
{
|
||||
gchar _filter[256];
|
||||
gchar* fp = &_filter[0]; int s = 0;
|
||||
gchar* fname;
|
||||
for (int i = 0; i < 255; i++)
|
||||
{
|
||||
if (filter[i] == '|' || filter[i] == '\0')
|
||||
{
|
||||
_filter[i] = '\0';
|
||||
if (s & 1)
|
||||
{
|
||||
GtkFileFilter* filter = gtk_file_filter_new();
|
||||
gtk_file_filter_set_name(filter, fname);
|
||||
|
||||
for (gchar* j = fp; ; j++)
|
||||
{
|
||||
if (*j == ';')
|
||||
{
|
||||
gtk_file_filter_add_pattern(filter, fp);
|
||||
fp = j+1;
|
||||
}
|
||||
else if (*j == '\0')
|
||||
{
|
||||
gtk_file_filter_add_pattern(filter, fp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gtk_file_chooser_add_filter(fc, filter);
|
||||
}
|
||||
else
|
||||
{
|
||||
fname = fp;
|
||||
}
|
||||
fp = &_filter[i+1];
|
||||
s++;
|
||||
if (s >= 8) break;
|
||||
if (filter[i] == '\0') break;
|
||||
}
|
||||
else
|
||||
_filter[i] = filter[i];
|
||||
}
|
||||
}
|
||||
|
||||
gtk_file_chooser_set_local_only(fc, FALSE);
|
||||
gtk_file_chooser_set_select_multiple(fc, FALSE);
|
||||
gtk_file_chooser_set_show_hidden(fc, TRUE);
|
||||
@ -33,14 +79,14 @@ static char *filedialog(GtkWindow *parent, GtkFileChooserAction mode, const gcha
|
||||
return filename;
|
||||
}
|
||||
|
||||
char *uiOpenFile(uiWindow *parent)
|
||||
char *uiOpenFile(uiWindow *parent, char* filter, char* initpath)
|
||||
{
|
||||
return filedialog(windowWindow(parent), GTK_FILE_CHOOSER_ACTION_OPEN, "_Open");
|
||||
return filedialog(windowWindow(parent), GTK_FILE_CHOOSER_ACTION_OPEN, "_Open", filter, initpath);
|
||||
}
|
||||
|
||||
char *uiSaveFile(uiWindow *parent)
|
||||
char *uiSaveFile(uiWindow *parent, char* filter, char* initpath)
|
||||
{
|
||||
return filedialog(windowWindow(parent), GTK_FILE_CHOOSER_ACTION_SAVE, "_Save");
|
||||
return filedialog(windowWindow(parent), GTK_FILE_CHOOSER_ACTION_SAVE, "_Save", filter, initpath);
|
||||
}
|
||||
|
||||
static void msgbox(GtkWindow *parent, const char *title, const char *description, GtkMessageType type, GtkButtonsType buttons)
|
||||
|
Reference in New Issue
Block a user