diff --git a/shoes/native/cocoa/dialog.m b/shoes/native/cocoa/dialog.m index c1145bd3..6e35bd6d 100644 --- a/shoes/native/cocoa/dialog.m +++ b/shoes/native/cocoa/dialog.m @@ -292,7 +292,7 @@ - (BOOL)accepted [colorPanel _setUseModalAppearance:YES]; // must do but undocumented!! #pragma clang diagnostic pop returnCode = [NSApp runModalForWindow: colorPanel]; - if (returnCode == NSOKButton) { + if (returnCode == NSModalResponseOK) { nscolor = [[colorPanel color] colorUsingColorSpace: [NSColorSpace genericRGBColorSpace]]; CGFloat components[4]; @@ -316,11 +316,17 @@ - (BOOL)accepted [openDlg setCanChooseFiles: !directories]; [openDlg setCanChooseDirectories: directories]; [openDlg setAllowsMultipleSelection: NO]; + // [panel setDirectoryURL:[NSURL fileURLWithPath:lastPath]]; + if (!NIL_P(attr) && !NIL_P(shoes_hash_get(attr, rb_intern("title")))) real_title = [NSString stringWithUTF8String: (RSTRING_PTR(shoes_hash_get(attr, rb_intern("title"))))]; [openDlg setTitle: real_title]; + if (!NIL_P(attr) && !NIL_P(shoes_hash_get(attr, rb_intern("dir")))) { + NSString *fp = [NSString stringWithUTF8String: (RSTRING_PTR(shoes_hash_get(attr, rb_intern("title"))))]; + [openDlg setDirectoryURL: [NSURL fileURLWithPath: fp]]; + } #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - if ( [openDlg runModal] == NSOKButton ) + if ( [openDlg runModal] == NSModalResponseOK ) { NSArray *urls = [openDlg URLs]; const char *filename = [[[urls objectAtIndex: 0] path] UTF8String]; diff --git a/shoes/native/gtk.c b/shoes/native/gtk.c index 383f915b..2f93fa8f 100644 --- a/shoes/native/gtk.c +++ b/shoes/native/gtk.c @@ -1664,336 +1664,6 @@ VALUE shoes_native_to_s(VALUE text) { return text; } -/* --------------- dialogs -----------*/ - -#if defined(GTK3) -VALUE shoes_native_window_color(shoes_app *app) { - GtkStyleContext *style = gtk_widget_get_style_context(GTK_WIDGET(APP_WINDOW(app))); - GdkRGBA bg; -#ifdef BSD // assumes Gtk 3.22 - gtk_style_context_lookup_color(style, (char *)NULL, &bg); -#else - gtk_style_context_lookup_color(style, GTK_STATE_NORMAL, &bg); -#endif - return shoes_color_new((int)(bg.red * 255), (int)(bg.green * 255), - (int)(bg.blue * 255), SHOES_COLOR_OPAQUE); -} - -VALUE shoes_native_dialog_color(shoes_app *app) { - GdkRGBA bg; - GtkStyleContext *style = gtk_widget_get_style_context(GTK_WIDGET(APP_WINDOW(app))); -#ifdef BSD // assumes Gtk 3.22 - gtk_style_context_lookup_color(style, (char *)NULL, &bg); -#else - gtk_style_context_lookup_color(style, GTK_STATE_NORMAL, &bg); -#endif - return shoes_color_new((int)(bg.red * 255), (int)(bg.green * 255), - (int)(bg.blue * 255), SHOES_COLOR_OPAQUE); -} -#else -VALUE shoes_native_window_color(shoes_app *app) { - GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(APP_WINDOW(app))); - GdkColor bg = style->bg[GTK_STATE_NORMAL]; - return shoes_color_new(bg.red / 257, bg.green / 257, bg.blue / 257, SHOES_COLOR_OPAQUE); -} - -VALUE shoes_native_dialog_color(shoes_app *app) { - GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(APP_WINDOW(app))); - GdkColor bg = style->bg[GTK_STATE_NORMAL]; - return shoes_color_new(bg.red / 257, bg.green / 257, bg.blue / 257, SHOES_COLOR_OPAQUE); -} -#endif - -VALUE shoes_dialog_alert(int argc, VALUE *argv, VALUE self) { - GTK_APP_VAR(app); - //char atitle[50]; // bug432 - char atitle[192]; - g_sprintf(atitle, "%s says", title_app); - rb_arg_list args; - rb_parse_args(argc, argv, "S|h", &args); - char *msg = RSTRING_PTR(shoes_native_to_s(args.a[0])); - - gchar *format_string = "%s\n\n%s"; - if (argc == 2) { - if (RTEST(ATTR(args.a[1], title))) { - VALUE tmpstr = ATTR(args.a[1], title); - strcpy(atitle,RSTRING_PTR(shoes_native_to_s(tmpstr))); - } else { - g_stpcpy(atitle," "); - } - } - - GtkWidget *dialog = gtk_message_dialog_new_with_markup( - window_app, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, - format_string, atitle, msg ); - - // theme the window - if (shoes_css_provider != NULL) { - gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), - GTK_STYLE_PROVIDER(shoes_css_provider), - GTK_STYLE_PROVIDER_PRIORITY_USER); - } - gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(dialog); - return Qnil; -} - -VALUE shoes_dialog_ask(int argc, VALUE *argv, VALUE self) { - char atitle[192]; - GTK_APP_VAR(app); - - VALUE answer = Qnil; - rb_arg_list args; - rb_parse_args(argc, argv, "S|h", &args); - - switch(argc) { - case 1: - sprintf(atitle, "%s asks", title_app); - break; - case 2: - if (RTEST(ATTR(args.a[1], title))) { - VALUE tmpstr = ATTR(args.a[1], title); - strcpy(atitle, RSTRING_PTR(shoes_native_to_s(tmpstr))); - } else { - g_stpcpy(atitle," "); - } - break; - } - - GtkWidget *dialog = gtk_dialog_new_with_buttons(atitle, window_app, GTK_DIALOG_MODAL, - _("_Cancel"), GTK_RESPONSE_CANCEL, _("_OK"), GTK_RESPONSE_OK, NULL); - - // theme the window - if (shoes_css_provider != NULL) { - gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), - GTK_STYLE_PROVIDER(shoes_css_provider), - GTK_STYLE_PROVIDER_PRIORITY_USER); - } - gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); - gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 6); - GtkWidget *question = gtk_label_new(RSTRING_PTR(shoes_native_to_s(args.a[0]))); - // TODO: is this really needed? - if (gtk_get_minor_version() < 14){ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - gtk_misc_set_alignment(GTK_MISC(question), 0, 0); -#pragma GCC diagnostic pop - } - GtkWidget *_answer = gtk_entry_new(); - if (RTEST(ATTR(args.a[1], secret))) shoes_native_secrecy(_answer); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), question, FALSE, FALSE, 3); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), _answer, FALSE, TRUE, 3); - - gtk_widget_show_all(dialog); - gint result = gtk_dialog_run(GTK_DIALOG(dialog)); - if (result == GTK_RESPONSE_OK) { - const gchar *txt = gtk_entry_get_text(GTK_ENTRY(_answer)); - answer = rb_str_new2(txt); - } - gtk_widget_destroy(dialog); - return answer; -} - - -VALUE shoes_dialog_confirm(int argc, VALUE *argv, VALUE self) { - VALUE answer = Qfalse; - char atitle[192]; - GTK_APP_VAR(app); - //char *apptitle = RSTRING_PTR(app->title); - rb_arg_list args; - rb_parse_args(argc, argv, "S|h", &args); - VALUE quiz = shoes_native_to_s(args.a[0]); - - switch(argc) { - case 1: - sprintf(atitle, "%s asks", title_app); - break; - case 2: - if (RTEST(ATTR(args.a[1], title))) { - VALUE tmpstr = ATTR(args.a[1], title); - strcpy(atitle, RSTRING_PTR(shoes_native_to_s(tmpstr))); - } else { - g_stpcpy(atitle," "); - } - break; - } - - - - GtkWidget *dialog = gtk_dialog_new_with_buttons(atitle, window_app, GTK_DIALOG_MODAL, - _("_Cancel"), GTK_RESPONSE_CANCEL, _("_OK"), GTK_RESPONSE_OK, NULL); - // theme the window - if (shoes_css_provider != NULL) { - gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), - GTK_STYLE_PROVIDER(shoes_css_provider), - GTK_STYLE_PROVIDER_PRIORITY_USER); - } - gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); - gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 6); - - GtkWidget *question = gtk_label_new(RSTRING_PTR(quiz)); - // TODO is misc really needed? - if (gtk_get_minor_version() < 14){ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - gtk_misc_set_alignment(GTK_MISC(question), 0, 0); -#pragma GCC diagnostic pop - } - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), question, FALSE, FALSE, 3); - - gtk_widget_show_all(dialog); - gint result = gtk_dialog_run(GTK_DIALOG(dialog)); - if (result == GTK_RESPONSE_OK) - answer = Qtrue; - gtk_widget_destroy(dialog); - return answer; - -} - -VALUE shoes_dialog_color(VALUE self, VALUE title) { - VALUE color = Qnil; - GTK_APP_VAR(app); - title = shoes_native_to_s(title); - GtkWidget *dialog = gtk_color_chooser_dialog_new(RSTRING_PTR(title), NULL); - - // theme the window - if (shoes_css_provider != NULL) { - gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), - GTK_STYLE_PROVIDER(shoes_css_provider), - GTK_STYLE_PROVIDER_PRIORITY_USER); - } - gint result = gtk_dialog_run(GTK_DIALOG(dialog)); - if (result == GTK_RESPONSE_OK) { - GdkRGBA _color; - gtk_color_chooser_get_rgba((GtkColorChooser *)dialog, &_color); - color = shoes_color_new((int)(_color.red*255), (int)(_color.green*255), - (int)(_color.blue*255), (int)(_color.alpha*255)); - } - - gtk_widget_destroy(dialog); - return color; -} - -VALUE shoes_dialog_chooser(VALUE self, char *title, GtkFileChooserAction act, const gchar *button, VALUE attr) { - VALUE path = Qnil; -#if 0 - GTK_APP_VAR(app); -#else - //VALUE clsv = rb_funcall2(self, rb_intern("inspect"), 0, Qnil); - //char *clsname = RSTRING_PTR(clsv); - //printf("self is %s - > ", clsname); - char * title_app = "Shoes"; - GtkWindow *window_app = NULL; - shoes_app *app = NULL; - if ( rb_obj_is_kind_of(self,cApp)) { - // Normal - app = Get_TypedStruct3(self, shoes_app); - title_app = RSTRING_PTR(app->title); - window_app = APP_WINDOW(app); - } else { - // Is it Shoes splash? - if (RARRAY_LEN(shoes_world->apps) > 0) { - VALUE actual_app = rb_ary_entry(shoes_world->apps, 0); - //app = Get_TypedStruct3(self, shoes_app); // dies here - app = Get_TypedStruct3(actual_app, shoes_app); - title_app = RSTRING_PTR(app->title); - window_app = APP_WINDOW(app); - } else { - // outside an app and not splash - no window. Gtk complains but runs. - /* - VALUE actual_app = rb_funcall2(self, rb_intern("app"), 0, NULL); // this creates a window - Data_Get_Struct(actual_app, shoes_app, app); - title_app = RSTRING_PTR(app->title); - window_app = APP_WINDOW(app); - */ - } - } -#endif - if (!NIL_P(attr) && !NIL_P(shoes_hash_get(attr, rb_intern("title")))) - title = strdup(RSTRING_PTR(shoes_hash_get(attr, rb_intern("title")))); - GtkWidget *dialog = gtk_file_chooser_dialog_new(title, window_app, act, - _("_Cancel"), GTK_RESPONSE_CANCEL, button, GTK_RESPONSE_ACCEPT, NULL); - // theme the window - if (shoes_css_provider != NULL) { - gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), - GTK_STYLE_PROVIDER(shoes_css_provider), - GTK_STYLE_PROVIDER_PRIORITY_USER); - } - if (act == GTK_FILE_CHOOSER_ACTION_SAVE) - gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); - if(RTEST(shoes_hash_get(attr, rb_intern("save")))) - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), - RSTRING_PTR(shoes_hash_get(attr, rb_intern("save")))); - if(RTEST(shoes_hash_get(attr, rb_intern("types"))) && TYPE(shoes_hash_get(attr, rb_intern("types"))) == T_HASH) { - VALUE hsh = shoes_hash_get(attr, rb_intern("types")); - VALUE keys = rb_funcall(hsh, s_keys, 0); - int i; - for(i = 0; i < RARRAY_LEN(keys); i++) { - VALUE key = rb_ary_entry(keys, i); - VALUE val = rb_hash_aref(hsh, key); - GtkFileFilter *ff = gtk_file_filter_new(); - gtk_file_filter_set_name(ff, RSTRING_PTR(key)); - gtk_file_filter_add_pattern(ff, RSTRING_PTR(val)); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), ff); - } - } - gint result = gtk_dialog_run(GTK_DIALOG(dialog)); - if (result == GTK_RESPONSE_ACCEPT) { - char *filename; - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); - path = rb_str_new2(filename); - } - if (!NIL_P(attr) && !NIL_P(shoes_hash_get(attr, rb_intern("title")))) - SHOE_FREE(title); - gtk_widget_destroy(dialog); - return path; -} - -VALUE shoes_dialog_open(int argc, VALUE *argv, VALUE self) { - rb_arg_list args; -#if 0 - VALUE attr = Qnil; - char *title; - switch (rb_parse_args(argc, argv, "|h", &args)) { - case 0: - title = strdup("Open file..."); - break; - case 1: - attr = args.a[0]; - title = strdup(RSTRING_PTR(shoes_hash_get(attr, rb_intern("title")))); - break; - } - shoes_dialog_chooser(self, title, GTK_FILE_CHOOSER_ACTION_OPEN, - _("_Open"), args.a[0]); - free(title); - return; -#else - rb_parse_args(argc, argv, "|h", &args); - return shoes_dialog_chooser(self, "Open file...", GTK_FILE_CHOOSER_ACTION_OPEN, - _("_Open"), args.a[0]); -#endif -} - -VALUE shoes_dialog_save(int argc, VALUE *argv, VALUE self) { - rb_arg_list args; - rb_parse_args(argc, argv, "|h", &args); - return shoes_dialog_chooser(self, "Save file...", GTK_FILE_CHOOSER_ACTION_SAVE, - _("_Save"), args.a[0]); -} - -VALUE shoes_dialog_open_folder(int argc, VALUE *argv, VALUE self) { - rb_arg_list args; - rb_parse_args(argc, argv, "|h", &args); - return shoes_dialog_chooser(self, "Open folder...", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, - _("_Open"), args.a[0]); -} - -VALUE shoes_dialog_save_folder(int argc, VALUE *argv, VALUE self) { - rb_arg_list args; - rb_parse_args(argc, argv, "|h", &args); - return shoes_dialog_chooser(self, "Save folder...", GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, - _("_Save"), args.a[0]); -} #ifdef SHOES_GTK_WIN32 diff --git a/shoes/native/gtk/dialogs.c b/shoes/native/gtk/dialogs.c new file mode 100644 index 00000000..ac74501a --- /dev/null +++ b/shoes/native/gtk/dialogs.c @@ -0,0 +1,354 @@ + +#ifndef GTK3 +// fail only used for shoes_native_window_color will be deleted +#define GTK3 +#endif +#include "shoes/app.h" +#include "shoes/ruby.h" +#include "shoes/config.h" +#include "shoes/world.h" +#include "shoes/types/settings.h" +#include "shoes/native/native.h" +#include "shoes/types/native.h" +#include "shoes/types/color.h" +#include "shoes/types/text.h" +#include "shoes/types/text_link.h" +#include "shoes/types/download.h" +#include "shoes/types/event.h" +#include "shoes/internal.h" +#include "shoes/types/menubar.h" +#include "shoes/native/gtk/gtkmenus.h" + + +/* --------------- dialogs -----------*/ +extern GtkCssProvider *shoes_css_provider; // user provided theme + + +#if defined(GTK3) +VALUE shoes_native_window_color(shoes_app *app) { + GtkStyleContext *style = gtk_widget_get_style_context(GTK_WIDGET(APP_WINDOW(app))); + GdkRGBA bg; +#ifdef BSD // assumes Gtk 3.22 + gtk_style_context_lookup_color(style, (char *)NULL, &bg); +#else + gtk_style_context_lookup_color(style, GTK_STATE_NORMAL, &bg); +#endif + return shoes_color_new((int)(bg.red * 255), (int)(bg.green * 255), + (int)(bg.blue * 255), SHOES_COLOR_OPAQUE); +} + +VALUE shoes_native_dialog_color(shoes_app *app) { + GdkRGBA bg; + GtkStyleContext *style = gtk_widget_get_style_context(GTK_WIDGET(APP_WINDOW(app))); +#ifdef BSD // assumes Gtk 3.22 + gtk_style_context_lookup_color(style, (char *)NULL, &bg); +#else + gtk_style_context_lookup_color(style, GTK_STATE_NORMAL, &bg); +#endif + return shoes_color_new((int)(bg.red * 255), (int)(bg.green * 255), + (int)(bg.blue * 255), SHOES_COLOR_OPAQUE); +} +#else +VALUE shoes_native_window_color(shoes_app *app) { + GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(APP_WINDOW(app))); + GdkColor bg = style->bg[GTK_STATE_NORMAL]; + return shoes_color_new(bg.red / 257, bg.green / 257, bg.blue / 257, SHOES_COLOR_OPAQUE); +} + +VALUE shoes_native_dialog_color(shoes_app *app) { + GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(APP_WINDOW(app))); + GdkColor bg = style->bg[GTK_STATE_NORMAL]; + return shoes_color_new(bg.red / 257, bg.green / 257, bg.blue / 257, SHOES_COLOR_OPAQUE); +} +#endif + +VALUE shoes_dialog_alert(int argc, VALUE *argv, VALUE self) { + GTK_APP_VAR(app); + //char atitle[50]; // bug432 + char atitle[192]; + g_sprintf(atitle, "%s says", title_app); + rb_arg_list args; + rb_parse_args(argc, argv, "S|h", &args); + char *msg = RSTRING_PTR(shoes_native_to_s(args.a[0])); + + gchar *format_string = "%s\n\n%s"; + if (argc == 2) { + if (RTEST(ATTR(args.a[1], title))) { + VALUE tmpstr = ATTR(args.a[1], title); + strcpy(atitle,RSTRING_PTR(shoes_native_to_s(tmpstr))); + } else { + g_stpcpy(atitle," "); + } + } + + GtkWidget *dialog = gtk_message_dialog_new_with_markup( + window_app, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, + format_string, atitle, msg ); + + // theme the window + if (shoes_css_provider != NULL) { + gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), + GTK_STYLE_PROVIDER(shoes_css_provider), + GTK_STYLE_PROVIDER_PRIORITY_USER); + } + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + return Qnil; +} + +VALUE shoes_dialog_ask(int argc, VALUE *argv, VALUE self) { + char atitle[192]; + GTK_APP_VAR(app); + + VALUE answer = Qnil; + rb_arg_list args; + rb_parse_args(argc, argv, "S|h", &args); + + switch(argc) { + case 1: + sprintf(atitle, "%s asks", title_app); + break; + case 2: + if (RTEST(ATTR(args.a[1], title))) { + VALUE tmpstr = ATTR(args.a[1], title); + strcpy(atitle, RSTRING_PTR(shoes_native_to_s(tmpstr))); + } else { + g_stpcpy(atitle," "); + } + break; + } + + GtkWidget *dialog = gtk_dialog_new_with_buttons(atitle, window_app, GTK_DIALOG_MODAL, + _("_Cancel"), GTK_RESPONSE_CANCEL, _("_OK"), GTK_RESPONSE_OK, NULL); + + // theme the window + if (shoes_css_provider != NULL) { + gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), + GTK_STYLE_PROVIDER(shoes_css_provider), + GTK_STYLE_PROVIDER_PRIORITY_USER); + } + gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); + gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 6); + GtkWidget *question = gtk_label_new(RSTRING_PTR(shoes_native_to_s(args.a[0]))); + // TODO: is this really needed? + if (gtk_get_minor_version() < 14){ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + gtk_misc_set_alignment(GTK_MISC(question), 0, 0); +#pragma GCC diagnostic pop + } + GtkWidget *_answer = gtk_entry_new(); + if (RTEST(ATTR(args.a[1], secret))) shoes_native_secrecy(_answer); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), question, FALSE, FALSE, 3); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), _answer, FALSE, TRUE, 3); + + gtk_widget_show_all(dialog); + gint result = gtk_dialog_run(GTK_DIALOG(dialog)); + if (result == GTK_RESPONSE_OK) { + const gchar *txt = gtk_entry_get_text(GTK_ENTRY(_answer)); + answer = rb_str_new2(txt); + } + gtk_widget_destroy(dialog); + return answer; +} + + +VALUE shoes_dialog_confirm(int argc, VALUE *argv, VALUE self) { + VALUE answer = Qfalse; + char atitle[192]; + GTK_APP_VAR(app); + //char *apptitle = RSTRING_PTR(app->title); + rb_arg_list args; + rb_parse_args(argc, argv, "S|h", &args); + VALUE quiz = shoes_native_to_s(args.a[0]); + + switch(argc) { + case 1: + sprintf(atitle, "%s asks", title_app); + break; + case 2: + if (RTEST(ATTR(args.a[1], title))) { + VALUE tmpstr = ATTR(args.a[1], title); + strcpy(atitle, RSTRING_PTR(shoes_native_to_s(tmpstr))); + } else { + g_stpcpy(atitle," "); + } + break; + } + + + + GtkWidget *dialog = gtk_dialog_new_with_buttons(atitle, window_app, GTK_DIALOG_MODAL, + _("_Cancel"), GTK_RESPONSE_CANCEL, _("_OK"), GTK_RESPONSE_OK, NULL); + // theme the window + if (shoes_css_provider != NULL) { + gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), + GTK_STYLE_PROVIDER(shoes_css_provider), + GTK_STYLE_PROVIDER_PRIORITY_USER); + } + gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); + gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 6); + + GtkWidget *question = gtk_label_new(RSTRING_PTR(quiz)); + // TODO is misc really needed? + if (gtk_get_minor_version() < 14){ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + gtk_misc_set_alignment(GTK_MISC(question), 0, 0); +#pragma GCC diagnostic pop + } + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), question, FALSE, FALSE, 3); + + gtk_widget_show_all(dialog); + gint result = gtk_dialog_run(GTK_DIALOG(dialog)); + if (result == GTK_RESPONSE_OK) + answer = Qtrue; + gtk_widget_destroy(dialog); + return answer; + +} + +VALUE shoes_dialog_color(VALUE self, VALUE title) { + VALUE color = Qnil; + GTK_APP_VAR(app); + title = shoes_native_to_s(title); + GtkWidget *dialog = gtk_color_chooser_dialog_new(RSTRING_PTR(title), NULL); + + // theme the window + if (shoes_css_provider != NULL) { + gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), + GTK_STYLE_PROVIDER(shoes_css_provider), + GTK_STYLE_PROVIDER_PRIORITY_USER); + } + gint result = gtk_dialog_run(GTK_DIALOG(dialog)); + if (result == GTK_RESPONSE_OK) { + GdkRGBA _color; + gtk_color_chooser_get_rgba((GtkColorChooser *)dialog, &_color); + color = shoes_color_new((int)(_color.red*255), (int)(_color.green*255), + (int)(_color.blue*255), (int)(_color.alpha*255)); + } + + gtk_widget_destroy(dialog); + return color; +} + +VALUE shoes_dialog_chooser(VALUE self, char *title, GtkFileChooserAction act, const gchar *button, VALUE attr) { + VALUE path = Qnil; +#if 0 + GTK_APP_VAR(app); +#else + //VALUE clsv = rb_funcall2(self, rb_intern("inspect"), 0, Qnil); + //char *clsname = RSTRING_PTR(clsv); + //printf("self is %s - > ", clsname); + char * title_app = "Shoes"; + GtkWindow *window_app = NULL; + shoes_app *app = NULL; + if ( rb_obj_is_kind_of(self,cApp)) { + // Normal + app = Get_TypedStruct3(self, shoes_app); + title_app = RSTRING_PTR(app->title); + window_app = APP_WINDOW(app); + } else { + // Is it Shoes splash? + if (RARRAY_LEN(shoes_world->apps) > 0) { + VALUE actual_app = rb_ary_entry(shoes_world->apps, 0); + //app = Get_TypedStruct3(self, shoes_app); // dies here + app = Get_TypedStruct3(actual_app, shoes_app); + title_app = RSTRING_PTR(app->title); + window_app = APP_WINDOW(app); + } else { + // outside an app and not splash - no window. Gtk complains but runs. + /* + VALUE actual_app = rb_funcall2(self, rb_intern("app"), 0, NULL); // this creates a window + Data_Get_Struct(actual_app, shoes_app, app); + title_app = RSTRING_PTR(app->title); + window_app = APP_WINDOW(app); + */ + } + } +#endif + if (!NIL_P(attr) && !NIL_P(shoes_hash_get(attr, rb_intern("title")))) + title = strdup(RSTRING_PTR(shoes_hash_get(attr, rb_intern("title")))); + GtkWidget *dialog = gtk_file_chooser_dialog_new(title, window_app, act, + _("_Cancel"), GTK_RESPONSE_CANCEL, button, GTK_RESPONSE_ACCEPT, NULL); + // theme the window + if (shoes_css_provider != NULL) { + gtk_style_context_add_provider(gtk_widget_get_style_context(dialog), + GTK_STYLE_PROVIDER(shoes_css_provider), + GTK_STYLE_PROVIDER_PRIORITY_USER); + } + if (act == GTK_FILE_CHOOSER_ACTION_SAVE) + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); + if(RTEST(shoes_hash_get(attr, rb_intern("save")))) + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), + RSTRING_PTR(shoes_hash_get(attr, rb_intern("save")))); + if(RTEST(shoes_hash_get(attr, rb_intern("types"))) && TYPE(shoes_hash_get(attr, rb_intern("types"))) == T_HASH) { + VALUE hsh = shoes_hash_get(attr, rb_intern("types")); + VALUE keys = rb_funcall(hsh, s_keys, 0); + int i; + for(i = 0; i < RARRAY_LEN(keys); i++) { + VALUE key = rb_ary_entry(keys, i); + VALUE val = rb_hash_aref(hsh, key); + GtkFileFilter *ff = gtk_file_filter_new(); + gtk_file_filter_set_name(ff, RSTRING_PTR(key)); + gtk_file_filter_add_pattern(ff, RSTRING_PTR(val)); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), ff); + } + } + gint result = gtk_dialog_run(GTK_DIALOG(dialog)); + if (result == GTK_RESPONSE_ACCEPT) { + char *filename; + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + path = rb_str_new2(filename); + } + if (!NIL_P(attr) && !NIL_P(shoes_hash_get(attr, rb_intern("title")))) + SHOE_FREE(title); + gtk_widget_destroy(dialog); + return path; +} + +VALUE shoes_dialog_open(int argc, VALUE *argv, VALUE self) { + rb_arg_list args; +#if 0 + VALUE attr = Qnil; + char *title; + switch (rb_parse_args(argc, argv, "|h", &args)) { + case 0: + title = strdup("Open file..."); + break; + case 1: + attr = args.a[0]; + title = strdup(RSTRING_PTR(shoes_hash_get(attr, rb_intern("title")))); + break; + } + shoes_dialog_chooser(self, title, GTK_FILE_CHOOSER_ACTION_OPEN, + _("_Open"), args.a[0]); + free(title); + return; +#else + rb_parse_args(argc, argv, "|h", &args); + return shoes_dialog_chooser(self, "Open file...", GTK_FILE_CHOOSER_ACTION_OPEN, + _("_Open"), args.a[0]); +#endif +} + +VALUE shoes_dialog_save(int argc, VALUE *argv, VALUE self) { + rb_arg_list args; + rb_parse_args(argc, argv, "|h", &args); + return shoes_dialog_chooser(self, "Save file...", GTK_FILE_CHOOSER_ACTION_SAVE, + _("_Save"), args.a[0]); +} + +VALUE shoes_dialog_open_folder(int argc, VALUE *argv, VALUE self) { + rb_arg_list args; + rb_parse_args(argc, argv, "|h", &args); + return shoes_dialog_chooser(self, "Open folder...", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + _("_Open"), args.a[0]); +} + +VALUE shoes_dialog_save_folder(int argc, VALUE *argv, VALUE self) { + rb_arg_list args; + rb_parse_args(argc, argv, "|h", &args); + return shoes_dialog_chooser(self, "Save folder...", GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, + _("_Save"), args.a[0]); +} diff --git a/shoes/native/gtk/dialogs.h b/shoes/native/gtk/dialogs.h new file mode 100644 index 00000000..ff7bd09c --- /dev/null +++ b/shoes/native/gtk/dialogs.h @@ -0,0 +1 @@ +// placeholder