You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
4.1KB

  1. #include "osdialog.h"
  2. #include <assert.h>
  3. #include <string.h>
  4. #include <gtk/gtk.h>
  5. int osdialog_message(osdialog_message_level level, osdialog_message_buttons buttons, const char *message) {
  6. assert(gtk_init_check(NULL, NULL));
  7. GtkMessageType messageType;
  8. switch (level) {
  9. default:
  10. case OSDIALOG_INFO: messageType = GTK_MESSAGE_INFO; break;
  11. case OSDIALOG_WARNING: messageType = GTK_MESSAGE_WARNING; break;
  12. case OSDIALOG_ERROR: messageType = GTK_MESSAGE_ERROR; break;
  13. }
  14. GtkButtonsType buttonsType;
  15. switch (buttons) {
  16. default:
  17. case OSDIALOG_OK: buttonsType = GTK_BUTTONS_OK; break;
  18. case OSDIALOG_OK_CANCEL: buttonsType = GTK_BUTTONS_OK_CANCEL; break;
  19. case OSDIALOG_YES_NO: buttonsType = GTK_BUTTONS_YES_NO; break;
  20. }
  21. GtkWidget *dialog = gtk_message_dialog_new (NULL,
  22. 0,
  23. messageType,
  24. buttonsType,
  25. "%s", message);
  26. gint result = gtk_dialog_run(GTK_DIALOG(dialog));
  27. gtk_widget_destroy(dialog);
  28. while (gtk_events_pending())
  29. gtk_main_iteration();
  30. switch (result) {
  31. case GTK_RESPONSE_OK:
  32. case GTK_RESPONSE_YES:
  33. return 1;
  34. default:
  35. return 0;
  36. }
  37. }
  38. char *osdialog_file(osdialog_file_action action, const char *path, const char *filename, osdialog_filters *filters) {
  39. printf("xxx osdialog_file: 1\n");
  40. assert(gtk_init_check(NULL, NULL));
  41. printf("xxx osdialog_file: 2\n");
  42. GtkFileChooserAction gtkAction;
  43. const char *title;
  44. const char *acceptText;
  45. if (action == OSDIALOG_OPEN) {
  46. title = "Open File";
  47. acceptText = "Open";
  48. gtkAction = GTK_FILE_CHOOSER_ACTION_OPEN;
  49. }
  50. else if (action == OSDIALOG_OPEN_DIR) {
  51. title = "Open Folder";
  52. acceptText = "Open Folder";
  53. gtkAction = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
  54. }
  55. else {
  56. title = "Save File";
  57. acceptText = "Save";
  58. gtkAction = GTK_FILE_CHOOSER_ACTION_SAVE;
  59. }
  60. printf("xxx osdialog_file: 3\n");
  61. GtkWidget *dialog = gtk_file_chooser_dialog_new(
  62. title,
  63. NULL,
  64. gtkAction,
  65. GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
  66. acceptText, GTK_RESPONSE_ACCEPT,
  67. NULL);
  68. printf("xxx osdialog_file: 4\n");
  69. for (; filters; filters = filters->next) {
  70. GtkFileFilter *fileFilter = gtk_file_filter_new();
  71. gtk_file_filter_set_name(fileFilter, filters->name);
  72. for (osdialog_filter_patterns *patterns = filters->patterns; patterns; patterns = patterns->next) {
  73. char patternBuf[1024];
  74. snprintf(patternBuf, sizeof(patternBuf), "*.%s", patterns->pattern);
  75. gtk_file_filter_add_pattern(fileFilter, patternBuf);
  76. }
  77. gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), fileFilter);
  78. }
  79. printf("xxx osdialog_file: 5\n");
  80. if (action == OSDIALOG_SAVE)
  81. gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
  82. if (path)
  83. gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path);
  84. printf("xxx osdialog_file: 6\n");
  85. if (action == OSDIALOG_SAVE && filename)
  86. gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename);
  87. printf("xxx osdialog_file: 7\n");
  88. gtk_widget_show(dialog); // [bsp] 26Oct2018
  89. printf("xxx osdialog_file: 8\n");
  90. char *result = NULL;
  91. if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
  92. result = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
  93. }
  94. printf("xxx osdialog_file: 9\n");
  95. gtk_widget_destroy(dialog);
  96. printf("xxx osdialog_file: 10\n");
  97. while (gtk_events_pending())
  98. gtk_main_iteration();
  99. printf("xxx osdialog_file: 11\n");
  100. return result;
  101. }
  102. int osdialog_color_picker(osdialog_color *color, int opacity) {
  103. if (!color)
  104. return 0;
  105. assert(gtk_init_check(NULL, NULL));
  106. GtkWidget *dialog = gtk_color_selection_dialog_new("Color");
  107. GtkColorSelection *colorsel = GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dialog)));
  108. gtk_color_selection_set_has_opacity_control(colorsel, opacity);
  109. int result = 0;
  110. if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) {
  111. GdkColor c;
  112. gtk_color_selection_get_current_color(colorsel, &c);
  113. color->r = c.red >> 8;
  114. color->g = c.green >> 8;
  115. color->b = c.blue >> 8;
  116. color->a = gtk_color_selection_get_current_alpha(colorsel) >> 8;
  117. result = 1;
  118. }
  119. gtk_widget_destroy(dialog);
  120. while (gtk_events_pending())
  121. gtk_main_iteration();
  122. return result;
  123. }