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.

137 lines
3.7KB

  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. assert(gtk_init_check(NULL, NULL));
  40. GtkFileChooserAction gtkAction;
  41. const char *title;
  42. const char *acceptText;
  43. if (action == OSDIALOG_OPEN) {
  44. title = "Open File";
  45. acceptText = "Open";
  46. gtkAction = GTK_FILE_CHOOSER_ACTION_OPEN;
  47. }
  48. else if (action == OSDIALOG_OPEN_DIR) {
  49. title = "Open Folder";
  50. acceptText = "Open Folder";
  51. gtkAction = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
  52. }
  53. else {
  54. title = "Save File";
  55. acceptText = "Save";
  56. gtkAction = GTK_FILE_CHOOSER_ACTION_SAVE;
  57. }
  58. GtkWidget *dialog = gtk_file_chooser_dialog_new(
  59. title,
  60. NULL,
  61. gtkAction,
  62. GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
  63. acceptText, GTK_RESPONSE_ACCEPT,
  64. NULL);
  65. for (; filters; filters = filters->next) {
  66. GtkFileFilter *fileFilter = gtk_file_filter_new();
  67. gtk_file_filter_set_name(fileFilter, filters->name);
  68. for (osdialog_filter_patterns *patterns = filters->patterns; patterns; patterns = patterns->next) {
  69. char patternBuf[1024];
  70. snprintf(patternBuf, sizeof(patternBuf), "*.%s", patterns->pattern);
  71. gtk_file_filter_add_pattern(fileFilter, patternBuf);
  72. }
  73. gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), fileFilter);
  74. }
  75. if (action == OSDIALOG_SAVE)
  76. gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
  77. if (path)
  78. gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path);
  79. if (action == OSDIALOG_SAVE && filename)
  80. gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename);
  81. char *result = NULL;
  82. if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
  83. result = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
  84. }
  85. gtk_widget_destroy(dialog);
  86. while (gtk_events_pending())
  87. gtk_main_iteration();
  88. return result;
  89. }
  90. int osdialog_color_picker(osdialog_color *color, int opacity) {
  91. if (!color)
  92. return 0;
  93. assert(gtk_init_check(NULL, NULL));
  94. GtkWidget *dialog = gtk_color_selection_dialog_new("Color");
  95. GtkColorSelection *colorsel = GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dialog)));
  96. gtk_color_selection_set_has_opacity_control(colorsel, opacity);
  97. int result = 0;
  98. if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) {
  99. GdkColor c;
  100. gtk_color_selection_get_current_color(colorsel, &c);
  101. color->r = c.red >> 8;
  102. color->g = c.green >> 8;
  103. color->b = c.blue >> 8;
  104. color->a = gtk_color_selection_get_current_alpha(colorsel) >> 8;
  105. result = 1;
  106. }
  107. gtk_widget_destroy(dialog);
  108. while (gtk_events_pending())
  109. gtk_main_iteration();
  110. return result;
  111. }