diff --git a/ChangeLog b/ChangeLog index bb6d905c1e..adc8c0238a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2004-09-23 Michael Natterer + + * app/dialogs/Makefile.am + * app/dialogs/color-dialog.[ch]: removed... + + * app/widgets/Makefile.am + * app/widgets/widgets-types.h + * app/widgets/gimpcolordialog.[ch]: ...and added as widget. + + * app/core/gimpmarshal.list: new marshaller VOID__BOXED_ENUM. + + * app/widgets/widgets-enums.[ch]: new enum GimpColorDialogState. + + * app/widgets/gimpcolormapeditor.[ch] + * app/widgets/gimpcolorpanel.[ch] + * app/widgets/gimpgradienteditor.[ch] + * app/widgets/gimppaletteeditor.[ch] + * app/widgets/gimptoolbox-color-area.c + * app/actions/gradient-editor-commands.c + * app/actions/view-commands.c: ported to GimpColorDialog. Removes + a whole bunch of ugly widgets/ -> dialogs/ dependencies. + 2004-09-23 Sven Neumann * plug-ins/script-fu/script-fu-interface.c: put the text view into @@ -48,7 +70,7 @@ * tools/pdbgen/pdb/gradients.pdb * tools/pdbgen/pdb/palettes.pdb * tools/pdbgen/pdb/patterns.pdb: removed the foos_set_foo() - procedures and marked the foos_set_foo() ones as deprecated. For + procedures and marked the foos_get_foo() ones as deprecated. For brushes, patterns and palettes, added foos_get_foo_info() procedures which work like foos_get_foo_data() but return just the properties, not the actual data. Allow NULL or "" to be passed diff --git a/app/actions/gradient-editor-commands.c b/app/actions/gradient-editor-commands.c index 296ab998d2..d355882594 100644 --- a/app/actions/gradient-editor-commands.c +++ b/app/actions/gradient-editor-commands.c @@ -29,12 +29,12 @@ #include "core/gimpdatafactory.h" #include "core/gimpgradient.h" +#include "widgets/gimpcolordialog.h" #include "widgets/gimpgradienteditor.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpviewabledialog.h" #include "dialogs/dialogs.h" -#include "dialogs/color-dialog.h" #include "gradient-editor-commands.h" @@ -43,14 +43,14 @@ /* local function prototypes */ -static void gradient_editor_left_color_changed (ColorDialog *cnb, - const GimpRGB *color, - ColorDialogState state, - gpointer data); -static void gradient_editor_right_color_changed (ColorDialog *cnb, - const GimpRGB *color, - ColorDialogState state, - gpointer data); +static void gradient_editor_left_color_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpGradientEditor *editor); +static void gradient_editor_right_color_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpGradientEditor *editor); static GimpGradientSegment * gradient_editor_save_selection (GimpGradientEditor *editor); @@ -80,18 +80,27 @@ gradient_editor_left_color_cmd_callback (GtkAction *action, editor->left_saved_segments = gradient_editor_save_selection (editor); editor->color_dialog = - color_dialog_new (GIMP_VIEWABLE (gradient), - _("Left Endpoint Color"), - GIMP_STOCK_GRADIENT, - _("Gradient Segment's Left Endpoint Color"), - GTK_WIDGET (editor), - global_dialog_factory, - "gimp-gradient-editor-color-dialog", - &editor->control_sel_l->left_color, - gradient_editor_left_color_changed, editor, - editor->instant_update, TRUE); + gimp_color_dialog_new (GIMP_VIEWABLE (gradient), + _("Left Endpoint Color"), + GIMP_STOCK_GRADIENT, + _("Gradient Segment's Left Endpoint Color"), + GTK_WIDGET (editor), + global_dialog_factory, + "gimp-gradient-editor-color-dialog", + &editor->control_sel_l->left_color, + editor->instant_update, TRUE); + + g_signal_connect (editor->color_dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &editor->color_dialog); + + g_signal_connect (editor->color_dialog, "update", + G_CALLBACK (gradient_editor_left_color_update), + editor); gtk_widget_set_sensitive (GTK_WIDGET (editor), FALSE); + + gtk_window_present (GTK_WINDOW (editor->color_dialog)); } void @@ -173,18 +182,27 @@ gradient_editor_right_color_cmd_callback (GtkAction *action, editor->right_saved_segments = gradient_editor_save_selection (editor); editor->color_dialog = - color_dialog_new (GIMP_VIEWABLE (gradient), - _("Right Endpoint Color"), - GIMP_STOCK_GRADIENT, - _("Gradient Segment's Right Endpoint Color"), - GTK_WIDGET (editor), - global_dialog_factory, - "gimp-gradient-editor-color-dialog", - &editor->control_sel_l->right_color, - gradient_editor_right_color_changed, editor, - editor->instant_update, TRUE); + gimp_color_dialog_new (GIMP_VIEWABLE (gradient), + _("Right Endpoint Color"), + GIMP_STOCK_GRADIENT, + _("Gradient Segment's Right Endpoint Color"), + GTK_WIDGET (editor), + global_dialog_factory, + "gimp-gradient-editor-color-dialog", + &editor->control_sel_l->right_color, + editor->instant_update, TRUE); + + g_signal_connect (editor->color_dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &editor->color_dialog); + + g_signal_connect (editor->color_dialog, "update", + G_CALLBACK (gradient_editor_right_color_update), + editor); gtk_widget_set_sensitive (GTK_WIDGET (editor), FALSE); + + gtk_window_present (GTK_WINDOW (editor->color_dialog)); } void @@ -559,19 +577,16 @@ gradient_editor_blend_opacity_cmd_callback (GtkAction *action, /* private functions */ static void -gradient_editor_left_color_changed (ColorDialog *cnb, - const GimpRGB *color, - ColorDialogState state, - gpointer data) +gradient_editor_left_color_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpGradientEditor *editor) { - GimpGradientEditor *editor = GIMP_GRADIENT_EDITOR (data); - GimpGradient *gradient; - - gradient = GIMP_GRADIENT (GIMP_DATA_EDITOR (editor)->data); + GimpGradient *gradient = GIMP_GRADIENT (GIMP_DATA_EDITOR (editor)->data); switch (state) { - case COLOR_DIALOG_UPDATE: + case GIMP_COLOR_DIALOG_UPDATE: gimp_gradient_segment_range_blend (gradient, editor->control_sel_l, editor->control_sel_r, @@ -580,7 +595,7 @@ gradient_editor_left_color_changed (ColorDialog *cnb, TRUE, TRUE); break; - case COLOR_DIALOG_OK: + case GIMP_COLOR_DIALOG_OK: gimp_gradient_segment_range_blend (gradient, editor->control_sel_l, editor->control_sel_r, @@ -588,16 +603,16 @@ gradient_editor_left_color_changed (ColorDialog *cnb, &editor->control_sel_r->right_color, TRUE, TRUE); gimp_gradient_segments_free (editor->left_saved_segments); - color_dialog_free (cnb); + gtk_widget_destroy (editor->color_dialog); editor->color_dialog = NULL; gtk_widget_set_sensitive (GTK_WIDGET (editor), TRUE); break; - case COLOR_DIALOG_CANCEL: + case GIMP_COLOR_DIALOG_CANCEL: gradient_editor_replace_selection (editor, editor->left_saved_segments); GIMP_DATA (gradient)->dirty = editor->left_saved_dirty; gimp_viewable_invalidate_preview (GIMP_VIEWABLE (gradient)); - color_dialog_free (cnb); + gtk_widget_destroy (editor->color_dialog); editor->color_dialog = NULL; gtk_widget_set_sensitive (GTK_WIDGET (editor), TRUE); break; @@ -605,19 +620,16 @@ gradient_editor_left_color_changed (ColorDialog *cnb, } static void -gradient_editor_right_color_changed (ColorDialog *cnb, - const GimpRGB *color, - ColorDialogState state, - gpointer data) +gradient_editor_right_color_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpGradientEditor *editor) { - GimpGradientEditor *editor = GIMP_GRADIENT_EDITOR (data); - GimpGradient *gradient; - - gradient = GIMP_GRADIENT (GIMP_DATA_EDITOR (editor)->data); + GimpGradient *gradient = GIMP_GRADIENT (GIMP_DATA_EDITOR (editor)->data); switch (state) { - case COLOR_DIALOG_UPDATE: + case GIMP_COLOR_DIALOG_UPDATE: gimp_gradient_segment_range_blend (gradient, editor->control_sel_l, editor->control_sel_r, @@ -626,7 +638,7 @@ gradient_editor_right_color_changed (ColorDialog *cnb, TRUE, TRUE); break; - case COLOR_DIALOG_OK: + case GIMP_COLOR_DIALOG_OK: gimp_gradient_segment_range_blend (gradient, editor->control_sel_l, editor->control_sel_r, @@ -634,16 +646,16 @@ gradient_editor_right_color_changed (ColorDialog *cnb, color, TRUE, TRUE); gimp_gradient_segments_free (editor->right_saved_segments); - color_dialog_free (cnb); + gtk_widget_destroy (editor->color_dialog); editor->color_dialog = NULL; gtk_widget_set_sensitive (GTK_WIDGET (editor), TRUE); break; - case COLOR_DIALOG_CANCEL: + case GIMP_COLOR_DIALOG_CANCEL: gradient_editor_replace_selection (editor, editor->right_saved_segments); GIMP_DATA (gradient)->dirty = editor->right_saved_dirty; gimp_viewable_invalidate_preview (GIMP_VIEWABLE (gradient)); - color_dialog_free (cnb); + gtk_widget_destroy (editor->color_dialog); editor->color_dialog = NULL; gtk_widget_set_sensitive (GTK_WIDGET (editor), TRUE); break; diff --git a/app/actions/view-commands.c b/app/actions/view-commands.c index ac85974874..bdd5322ba4 100644 --- a/app/actions/view-commands.c +++ b/app/actions/view-commands.c @@ -40,11 +40,11 @@ #include "display/gimpdisplayshell-scale.h" #include "widgets/gimpactiongroup.h" +#include "widgets/gimpcolordialog.h" #include "widgets/gimpdock.h" #include "widgets/gimpdialogfactory.h" #include "widgets/gimpuimanager.h" -#include "dialogs/color-dialog.h" #include "dialogs/dialogs.h" #include "dialogs/info-dialog.h" #include "dialogs/info-window.h" @@ -65,6 +65,19 @@ gimp_context_get_display (gimp_get_user_context ((gdisp)->gimage->gimp))) +/* local function prototypes */ + +static void view_padding_color_dialog_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpDisplayShell *shell); +static void view_change_screen_confirm_callback (GtkWidget *query_box, + gint value, + gpointer data); +static void view_change_screen_destroy_callback (GtkWidget *query_box, + GtkWidget *shell); + + /* public functions */ void @@ -473,41 +486,6 @@ view_snap_to_grid_cmd_callback (GtkAction *action, gimp_display_shell_set_snap_to_grid (shell, active); } -static void -view_padding_color_callback (ColorDialog *cnb, - const GimpRGB *color, - ColorDialogState state, - gpointer data) -{ - GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data); - GimpDisplayOptions *options; - gboolean fullscreen; - - fullscreen = gimp_display_shell_get_fullscreen (shell); - - if (fullscreen) - options = shell->fullscreen_options; - else - options = shell->options; - - switch (state) - { - case COLOR_DIALOG_OK: - options->padding_mode_set = TRUE; - - gimp_display_shell_set_padding (shell, GIMP_CANVAS_PADDING_MODE_CUSTOM, - color); - /* fallthru */ - - case COLOR_DIALOG_CANCEL: - g_object_set_data (G_OBJECT (shell), "padding-color-dialog", NULL); - break; - - default: - break; - } -} - void view_padding_color_cmd_callback (GtkAction *action, gint value, @@ -543,29 +521,32 @@ view_padding_color_cmd_callback (GtkAction *action, case GIMP_CANVAS_PADDING_MODE_CUSTOM: { - ColorDialog *color_dialog; + GtkWidget *color_dialog; color_dialog = g_object_get_data (G_OBJECT (shell), - "padding-color-dialog"); + "padding-color-dialog"); if (! color_dialog) { - color_dialog = color_dialog_new (GIMP_VIEWABLE (gdisp->gimage), - _("Set Canvas Padding Color"), - GTK_STOCK_SELECT_COLOR, - NULL, - gdisp->shell, - NULL, NULL, - &options->padding_color, - view_padding_color_callback, - shell, - FALSE, FALSE); + color_dialog = gimp_color_dialog_new (GIMP_VIEWABLE (gdisp->gimage), + _("Set Canvas Padding Color"), + GTK_STOCK_SELECT_COLOR, + _("Set Custom Canvas Padding Color"), + gdisp->shell, + NULL, NULL, + &options->padding_color, + FALSE, FALSE); + + g_signal_connect (color_dialog, "update", + G_CALLBACK (view_padding_color_dialog_update), + gdisp->shell); + g_object_set_data_full (G_OBJECT (shell), "padding-color-dialog", color_dialog, - (GDestroyNotify) color_dialog_free); + (GDestroyNotify) gtk_widget_destroy); } - color_dialog_show (color_dialog); + gtk_window_present (GTK_WINDOW (color_dialog)); } break; @@ -632,27 +613,6 @@ view_fullscreen_cmd_callback (GtkAction *action, } } -static void -view_change_screen_confirm_callback (GtkWidget *query_box, - gint value, - gpointer data) -{ - GdkScreen *screen; - - screen = gdk_display_get_screen (gtk_widget_get_display (GTK_WIDGET (data)), - value); - - if (screen) - gtk_window_set_screen (GTK_WINDOW (data), screen); -} - -static void -view_change_screen_destroy_callback (GtkWidget *query_box, - GtkWidget *shell) -{ - g_object_set_data (G_OBJECT (shell), "gimp-change-screen-dialog", NULL); -} - void view_change_screen_cmd_callback (GtkAction *action, gpointer data) @@ -697,3 +657,61 @@ view_change_screen_cmd_callback (GtkAction *action, gtk_widget_show (qbox); } + + +/* private functions */ + +static void +view_padding_color_dialog_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpDisplayShell *shell) +{ + GimpDisplayOptions *options; + gboolean fullscreen; + + fullscreen = gimp_display_shell_get_fullscreen (shell); + + if (fullscreen) + options = shell->fullscreen_options; + else + options = shell->options; + + switch (state) + { + case GIMP_COLOR_DIALOG_OK: + options->padding_mode_set = TRUE; + + gimp_display_shell_set_padding (shell, GIMP_CANVAS_PADDING_MODE_CUSTOM, + color); + /* fallthru */ + + case GIMP_COLOR_DIALOG_CANCEL: + g_object_set_data (G_OBJECT (shell), "padding-color-dialog", NULL); + break; + + default: + break; + } +} + +static void +view_change_screen_confirm_callback (GtkWidget *query_box, + gint value, + gpointer data) +{ + GdkScreen *screen; + + screen = gdk_display_get_screen (gtk_widget_get_display (GTK_WIDGET (data)), + value); + + if (screen) + gtk_window_set_screen (GTK_WINDOW (data), screen); +} + +static void +view_change_screen_destroy_callback (GtkWidget *query_box, + GtkWidget *shell) +{ + g_object_set_data (G_OBJECT (shell), "gimp-change-screen-dialog", NULL); +} diff --git a/app/core/gimpmarshal.list b/app/core/gimpmarshal.list index 2680f51e2f..59a9665ee3 100644 --- a/app/core/gimpmarshal.list +++ b/app/core/gimpmarshal.list @@ -29,6 +29,7 @@ BOOLEAN: OBJECT, POINTER, STRING VOID: BOOLEAN, INT, INT, INT, INT VOID: BOXED +VOID: BOXED, ENUM VOID: DOUBLE VOID: DOUBLE, DOUBLE VOID: ENUM diff --git a/app/dialogs/Makefile.am b/app/dialogs/Makefile.am index cf8b6ae181..6998ce779f 100644 --- a/app/dialogs/Makefile.am +++ b/app/dialogs/Makefile.am @@ -12,8 +12,6 @@ libappdialogs_a_SOURCES = \ about-dialog.c \ about-dialog.h \ authors.h \ - color-dialog.c \ - color-dialog.h \ convert-dialog.c \ convert-dialog.h \ file-open-dialog.c \ diff --git a/app/dialogs/color-dialog.c b/app/dialogs/color-dialog.c deleted file mode 100644 index 0b5011f6be..0000000000 --- a/app/dialogs/color-dialog.c +++ /dev/null @@ -1,462 +0,0 @@ -/* The GIMP -- an image manipulation program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * color_dialog module (C) 1998 Austin Donnelly - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include - -#include "libgimpcolor/gimpcolor.h" -#include "libgimpwidgets/gimpwidgets.h" - -#include "dialogs-types.h" - -#include "core/gimpviewable.h" - -#include "widgets/gimpdialogfactory.h" -#include "widgets/gimpviewabledialog.h" - -#include "gui/color-history.h" - -#include "color-dialog.h" - -#include "gimp-intl.h" - - -#define RESPONSE_RESET 1 -#define COLOR_AREA_SIZE 20 - - -struct _ColorDialog -{ - GtkWidget *shell; - GtkWidget *selection; - - GtkWidget *history[COLOR_HISTORY_SIZE]; - - ColorDialogCallback callback; - gpointer client_data; - - gboolean wants_updates; -}; - - -static void color_dialog_help_func (const gchar *help_id, - gpointer help_data); - -static void color_dialog_response (GtkWidget *widget, - gint response_id, - ColorDialog *cnp); - -static void color_dialog_color_changed (GimpColorSelection *selection, - ColorDialog *cnp); - -static void color_history_color_clicked (GtkWidget *widget, - ColorDialog *cnp); -static void color_history_color_changed (GtkWidget *widget, - gpointer data); -static void color_history_add_clicked (GtkWidget *widget, - ColorDialog *cnp); - - -static GList *color_dialogs = NULL; - - -/* public functions */ - -ColorDialog * -color_dialog_new (GimpViewable *viewable, - const gchar *title, - const gchar *stock_id, - const gchar *desc, - GtkWidget *parent, - GimpDialogFactory *dialog_factory, - const gchar *dialog_identifier, - const GimpRGB *color, - ColorDialogCallback callback, - gpointer client_data, - gboolean wants_updates, - gboolean show_alpha) -{ - ColorDialog *cnp; - GtkWidget *table; - GtkWidget *button; - GtkWidget *arrow; - const gchar *role; - gint i; - - g_return_val_if_fail (viewable == NULL || GIMP_IS_VIEWABLE (viewable), NULL); - g_return_val_if_fail (GTK_IS_WIDGET (parent), NULL); - g_return_val_if_fail (dialog_factory == NULL || - GIMP_IS_DIALOG_FACTORY (dialog_factory), NULL); - g_return_val_if_fail (dialog_factory == NULL || dialog_identifier != NULL, - NULL); - g_return_val_if_fail (color != NULL, NULL); - - cnp = g_new0 (ColorDialog, 1); - - cnp->callback = callback; - cnp->client_data = client_data; - cnp->wants_updates = wants_updates; - - role = dialog_identifier ? dialog_identifier : "gimp-color-selector"; - - if (desc) - { - cnp->shell = gimp_viewable_dialog_new (viewable, title, role, - stock_id, desc, - parent, - color_dialog_help_func, NULL, - NULL); - - gtk_window_set_resizable (GTK_WINDOW (cnp->shell), FALSE); - } - else - { - cnp->shell = gimp_dialog_new (title, role, - parent, 0, - color_dialog_help_func, NULL, - NULL); - } - - g_object_set_data (G_OBJECT (cnp->shell), "color-dialog", cnp); - - gtk_dialog_add_buttons (GTK_DIALOG (cnp->shell), - GIMP_STOCK_RESET, RESPONSE_RESET, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (cnp->shell), GTK_RESPONSE_OK); - - g_signal_connect (cnp->shell, "response", - G_CALLBACK (color_dialog_response), - cnp); - - g_object_add_weak_pointer (G_OBJECT (cnp->shell), (gpointer *) &cnp->shell); - - if (dialog_factory) - gimp_dialog_factory_add_foreign (dialog_factory, dialog_identifier, - cnp->shell); - - cnp->selection = gimp_color_selection_new (); - gtk_container_set_border_width (GTK_CONTAINER (cnp->selection), 12); - gimp_color_selection_set_show_alpha (GIMP_COLOR_SELECTION (cnp->selection), - show_alpha); - gimp_color_selection_set_color (GIMP_COLOR_SELECTION (cnp->selection), color); - gimp_color_selection_set_old_color (GIMP_COLOR_SELECTION (cnp->selection), - color); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (cnp->shell)->vbox), - cnp->selection); - gtk_widget_show (cnp->selection); - - g_signal_connect (cnp->selection, "color_changed", - G_CALLBACK (color_dialog_color_changed), - cnp); - - /* The color history */ - table = gtk_table_new (2, 1 + COLOR_HISTORY_SIZE / 2, TRUE); - gtk_table_set_row_spacings (GTK_TABLE (table), 2); - gtk_table_set_col_spacings (GTK_TABLE (table), 2); - gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4); - gtk_box_pack_end (GTK_BOX (GIMP_COLOR_SELECTION (cnp->selection)->right_vbox), - table, FALSE, FALSE, 0); - gtk_widget_show (table); - - button = gtk_button_new (); - gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 0, 1); - gimp_help_set_help_data (button, - _("Add the current color to the color history"), - NULL); - gtk_widget_show (button); - - g_signal_connect (button, "clicked", - G_CALLBACK (color_history_add_clicked), - cnp); - - arrow = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_OUT); - gtk_container_add (GTK_CONTAINER (button), arrow); - gtk_widget_show (arrow); - - for (i = 0; i < COLOR_HISTORY_SIZE; i++) - { - GimpRGB history_color; - gint row, column; - - color_history_get (i, &history_color); - - button = gtk_button_new (); - gtk_widget_set_size_request (button, COLOR_AREA_SIZE, COLOR_AREA_SIZE); - - column = i % (COLOR_HISTORY_SIZE / 2); - row = i / (COLOR_HISTORY_SIZE / 2); - - gtk_table_attach_defaults (GTK_TABLE (table), button, - column + 1, column + 2, row, row + 1); - - cnp->history[i] = gimp_color_area_new (&history_color, - GIMP_COLOR_AREA_SMALL_CHECKS, - GDK_BUTTON2_MASK); - gtk_container_add (GTK_CONTAINER (button), cnp->history[i]); - gtk_widget_show (cnp->history[i]); - gtk_widget_show (button); - - g_signal_connect (button, "clicked", - G_CALLBACK (color_history_color_clicked), - cnp); - - g_signal_connect (cnp->history[i], "color_changed", - G_CALLBACK (color_history_color_changed), - GINT_TO_POINTER (i)); - } - - gtk_widget_show (cnp->shell); - - color_dialogs = g_list_prepend (color_dialogs, cnp); - - return cnp; -} - -void -color_dialog_free (ColorDialog *cnp) -{ - g_return_if_fail (cnp != NULL); - - color_dialogs = g_list_remove (color_dialogs, cnp); - - /* may be already destroyed by dialog factory */ - if (cnp->shell) - { - g_object_remove_weak_pointer (G_OBJECT (cnp->shell), - (gpointer *) &cnp->shell); - gtk_widget_destroy (cnp->shell); - } - - g_free (cnp); -} - -void -color_dialog_set_viewable (ColorDialog *cnb, - GimpViewable *viewable) -{ - g_return_if_fail (cnb != NULL); - - if (GIMP_IS_VIEWABLE_DIALOG (cnb->shell)) - gimp_viewable_dialog_set_viewable (GIMP_VIEWABLE_DIALOG (cnb->shell), - viewable); -} - -void -color_dialog_set_title (ColorDialog *cnb, - const gchar *title) -{ - g_return_if_fail (cnb != NULL); - g_return_if_fail (title != NULL); - - gtk_window_set_title (GTK_WINDOW (cnb->shell), title); -} - -void -color_dialog_set_color (ColorDialog *cnp, - const GimpRGB *color) -{ - g_return_if_fail (cnp != NULL); - g_return_if_fail (color != NULL); - - g_signal_handlers_block_by_func (cnp->selection, - color_dialog_color_changed, - cnp); - - gimp_color_selection_set_color (GIMP_COLOR_SELECTION (cnp->selection), color); - gimp_color_selection_set_old_color (GIMP_COLOR_SELECTION (cnp->selection), - color); - - g_signal_handlers_unblock_by_func (cnp->selection, - color_dialog_color_changed, - cnp); -} - -void -color_dialog_get_color (ColorDialog *cnp, - GimpRGB *color) -{ - g_return_if_fail (cnp != NULL); - g_return_if_fail (color != NULL); - - gimp_color_selection_get_color (GIMP_COLOR_SELECTION (cnp->selection), color); -} - -void -color_dialog_show (ColorDialog *cnp) -{ - g_return_if_fail (cnp != NULL); - - gtk_window_present (GTK_WINDOW (cnp->shell)); -} - -void -color_dialog_hide (ColorDialog *cnp) -{ - g_return_if_fail (cnp != NULL); - - gtk_widget_hide (cnp->shell); -} - - -/* private functions */ - -static void -color_dialog_help_func (const gchar *help_id, - gpointer help_data) -{ - ColorDialog *cnp; - GimpColorNotebook *notebook; - - cnp = g_object_get_data (G_OBJECT (help_data), "color-notebook"); - - notebook = - GIMP_COLOR_NOTEBOOK (GIMP_COLOR_SELECTION (cnp->selection)->notebook); - - help_id = GIMP_COLOR_SELECTOR_GET_CLASS (notebook->cur_page)->help_id; - - gimp_standard_help_func (help_id, NULL); -} - -static void -color_dialog_response (GtkWidget *widget, - gint response_id, - ColorDialog *cnp) -{ - GimpRGB color; - - switch (response_id) - { - case RESPONSE_RESET: - gimp_color_selection_reset (GIMP_COLOR_SELECTION (cnp->selection)); - break; - - case GTK_RESPONSE_OK: - color_history_add_clicked (NULL, cnp); - - gimp_color_selection_get_color (GIMP_COLOR_SELECTION (cnp->selection), - &color); - - if (cnp->callback) - cnp->callback (cnp, &color, - COLOR_DIALOG_OK, - cnp->client_data); - break; - - default: - gimp_color_selection_get_old_color (GIMP_COLOR_SELECTION (cnp->selection), - &color); - - if (cnp->callback) - cnp->callback (cnp, &color, - COLOR_DIALOG_CANCEL, - cnp->client_data); - break; - } -} - -static void -color_dialog_color_changed (GimpColorSelection *selection, - ColorDialog *cnp) -{ - GimpRGB color; - - gimp_color_selection_get_color (selection, &color); - - if (cnp->wants_updates && cnp->callback) - cnp->callback (cnp, - &color, - COLOR_DIALOG_UPDATE, - cnp->client_data); -} - - -/* color history callbacks */ - -static void -color_history_color_clicked (GtkWidget *widget, - ColorDialog *cnp) -{ - GimpColorArea *color_area; - GimpRGB color; - - color_area = GIMP_COLOR_AREA (GTK_BIN (widget)->child); - - gimp_color_area_get_color (color_area, &color); - gimp_color_selection_set_color (GIMP_COLOR_SELECTION (cnp->selection), - &color); -} - -static void -color_history_color_changed (GtkWidget *widget, - gpointer data) -{ - GimpRGB changed_color; - gint color_index; - GList *list; - - gimp_color_area_get_color (GIMP_COLOR_AREA (widget), &changed_color); - - color_index = GPOINTER_TO_INT (data); - - color_history_set (color_index, &changed_color); - - for (list = color_dialogs; list; list = g_list_next (list)) - { - ColorDialog *dialog = list->data; - - if (dialog->history[color_index] != widget) - { - g_signal_handlers_block_by_func (dialog->history[color_index], - color_history_color_changed, - data); - - gimp_color_area_set_color - (GIMP_COLOR_AREA (dialog->history[color_index]), &changed_color); - - g_signal_handlers_unblock_by_func (dialog->history[color_index], - color_history_color_changed, - data); - } - } -} - -static void -color_history_add_clicked (GtkWidget *widget, - ColorDialog *cnp) -{ - GimpRGB color; - gint shift_begin; - gint i; - - gimp_color_selection_get_color (GIMP_COLOR_SELECTION (cnp->selection), - &color); - - shift_begin = color_history_add (&color); - - for (i = shift_begin; i >= 0; i--) - { - color_history_get (i, &color); - - gimp_color_area_set_color (GIMP_COLOR_AREA (cnp->history[i]), &color); - } -} diff --git a/app/dialogs/color-dialog.h b/app/dialogs/color-dialog.h deleted file mode 100644 index b910bbfb61..0000000000 --- a/app/dialogs/color-dialog.h +++ /dev/null @@ -1,66 +0,0 @@ -/* The GIMP -- an image manipulation program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __COLOR_DIALOG_H__ -#define __COLOR_DIALOG_H__ - - -typedef enum -{ - COLOR_DIALOG_OK, - COLOR_DIALOG_CANCEL, - COLOR_DIALOG_UPDATE -} ColorDialogState; - - -typedef void (* ColorDialogCallback) (ColorDialog *cnb, - const GimpRGB *color, - ColorDialogState state, - gpointer callback_data); - - -ColorDialog * color_dialog_new (GimpViewable *viewable, - const gchar *title, - const gchar *stock_id, - const gchar *desc, - GtkWidget *parent, - GimpDialogFactory *dialog_factory, - const gchar *dialog_identifier, - const GimpRGB *color, - ColorDialogCallback callback, - gpointer callback_data, - gboolean wants_update, - gboolean show_alpha); - -void color_dialog_free (ColorDialog *cnb); - -void color_dialog_set_viewable (ColorDialog *cnb, - GimpViewable *viewable); -void color_dialog_set_title (ColorDialog *cnb, - const gchar *title); - -void color_dialog_show (ColorDialog *cnb); -void color_dialog_hide (ColorDialog *cnb); - -void color_dialog_set_color (ColorDialog *cnb, - const GimpRGB *color); -void color_dialog_get_color (ColorDialog *cnb, - GimpRGB *color); - - -#endif /* __COLOR_DIALOG_H__ */ diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am index 3ce1826133..94a344b003 100644 --- a/app/widgets/Makefile.am +++ b/app/widgets/Makefile.am @@ -47,6 +47,8 @@ libappwidgets_a_sources = \ gimpclipboard.h \ gimpcolorbar.c \ gimpcolorbar.h \ + gimpcolordialog.c \ + gimpcolordialog.h \ gimpcolordisplayeditor.c \ gimpcolordisplayeditor.h \ gimpcoloreditor.c \ diff --git a/app/widgets/gimpcolordialog.c b/app/widgets/gimpcolordialog.c index 0b5011f6be..e59c887f3e 100644 --- a/app/widgets/gimpcolordialog.c +++ b/app/widgets/gimpcolordialog.c @@ -25,16 +25,13 @@ #include "libgimpcolor/gimpcolor.h" #include "libgimpwidgets/gimpwidgets.h" -#include "dialogs-types.h" +#include "widgets-types.h" +#include "core/gimpmarshal.h" #include "core/gimpviewable.h" -#include "widgets/gimpdialogfactory.h" -#include "widgets/gimpviewabledialog.h" - -#include "gui/color-history.h" - -#include "color-dialog.h" +#include "gimpcolordialog.h" +#include "gimpdialogfactory.h" #include "gimp-intl.h" @@ -43,63 +40,166 @@ #define COLOR_AREA_SIZE 20 -struct _ColorDialog +enum { - GtkWidget *shell; - GtkWidget *selection; - - GtkWidget *history[COLOR_HISTORY_SIZE]; - - ColorDialogCallback callback; - gpointer client_data; - - gboolean wants_updates; + UPDATE, + LAST_SIGNAL }; -static void color_dialog_help_func (const gchar *help_id, - gpointer help_data); +static void gimp_color_dialog_class_init (GimpColorDialogClass *klass); +static void gimp_color_dialog_init (GimpColorDialog *dialog); -static void color_dialog_response (GtkWidget *widget, - gint response_id, - ColorDialog *cnp); +static void gimp_color_dialog_dispose (GObject *object); -static void color_dialog_color_changed (GimpColorSelection *selection, - ColorDialog *cnp); +static void gimp_color_dialog_response (GtkDialog *dialog, + gint response_id); -static void color_history_color_clicked (GtkWidget *widget, - ColorDialog *cnp); -static void color_history_color_changed (GtkWidget *widget, - gpointer data); -static void color_history_add_clicked (GtkWidget *widget, - ColorDialog *cnp); +static void gimp_color_dialog_help_func (const gchar *help_id, + gpointer help_data); + + +static void gimp_color_dialog_color_changed (GimpColorSelection *selection, + GimpColorDialog *dialog); + +static void gimp_color_history_color_clicked (GtkWidget *widget, + GimpColorDialog *dialog); +static void gimp_color_history_color_changed (GtkWidget *widget, + gpointer data); +static void gimp_color_history_add_clicked (GtkWidget *widget, + GimpColorDialog *dialog); + + +static GimpViewableDialogClass *parent_class = NULL; + +static guint color_dialog_signals[LAST_SIGNAL] = { 0, }; static GList *color_dialogs = NULL; +GType +gimp_color_dialog_get_type (void) +{ + static GType dialog_type = 0; + + if (! dialog_type) + { + static const GTypeInfo dialog_info = + { + sizeof (GimpColorDialogClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gimp_color_dialog_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GimpColorDialog), + 0, /* n_preallocs */ + (GInstanceInitFunc) gimp_color_dialog_init, + }; + + dialog_type = g_type_register_static (GIMP_TYPE_VIEWABLE_DIALOG, + "GimpColorDialog", + &dialog_info, 0); + } + + return dialog_type; +} + +static void +gimp_color_dialog_class_init (GimpColorDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + object_class->dispose = gimp_color_dialog_dispose; + + dialog_class->response = gimp_color_dialog_response; + + color_dialog_signals[UPDATE] = + g_signal_new ("update", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GimpColorDialogClass, update), + NULL, NULL, + gimp_marshal_VOID__BOXED_ENUM, + G_TYPE_NONE, 2, + GIMP_TYPE_RGB, + GIMP_TYPE_COLOR_DIALOG_STATE); +} + +static void +gimp_color_dialog_init (GimpColorDialog *dialog) +{ + color_dialogs = g_list_prepend (color_dialogs, dialog); +} + +static void +gimp_color_dialog_dispose (GObject *object) +{ + GimpColorDialog *dialog = GIMP_COLOR_DIALOG (object); + + color_dialogs = g_list_remove (color_dialogs, dialog); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gimp_color_dialog_response (GtkDialog *gtk_dialog, + gint response_id) +{ + GimpColorDialog *dialog = GIMP_COLOR_DIALOG (gtk_dialog); + GimpRGB color; + + switch (response_id) + { + case RESPONSE_RESET: + gimp_color_selection_reset (GIMP_COLOR_SELECTION (dialog->selection)); + break; + + case GTK_RESPONSE_OK: + gimp_color_history_add_clicked (NULL, dialog); + + gimp_color_selection_get_color (GIMP_COLOR_SELECTION (dialog->selection), + &color); + + g_signal_emit (dialog, color_dialog_signals[UPDATE], 0, + &color, GIMP_COLOR_DIALOG_OK); + break; + + default: + gimp_color_selection_get_old_color (GIMP_COLOR_SELECTION (dialog->selection), + &color); + + g_signal_emit (dialog, color_dialog_signals[UPDATE], 0, + &color, GIMP_COLOR_DIALOG_CANCEL); + break; + } +} + + /* public functions */ -ColorDialog * -color_dialog_new (GimpViewable *viewable, - const gchar *title, - const gchar *stock_id, - const gchar *desc, - GtkWidget *parent, - GimpDialogFactory *dialog_factory, - const gchar *dialog_identifier, - const GimpRGB *color, - ColorDialogCallback callback, - gpointer client_data, - gboolean wants_updates, - gboolean show_alpha) +GtkWidget * +gimp_color_dialog_new (GimpViewable *viewable, + const gchar *title, + const gchar *stock_id, + const gchar *desc, + GtkWidget *parent, + GimpDialogFactory *dialog_factory, + const gchar *dialog_identifier, + const GimpRGB *color, + gboolean wants_updates, + gboolean show_alpha) { - ColorDialog *cnp; - GtkWidget *table; - GtkWidget *button; - GtkWidget *arrow; - const gchar *role; - gint i; + GimpColorDialog *dialog; + GtkWidget *table; + GtkWidget *button; + GtkWidget *arrow; + const gchar *role; + gint i; g_return_val_if_fail (viewable == NULL || GIMP_IS_VIEWABLE (viewable), NULL); g_return_val_if_fail (GTK_IS_WIDGET (parent), NULL); @@ -109,72 +209,58 @@ color_dialog_new (GimpViewable *viewable, NULL); g_return_val_if_fail (color != NULL, NULL); - cnp = g_new0 (ColorDialog, 1); - - cnp->callback = callback; - cnp->client_data = client_data; - cnp->wants_updates = wants_updates; - role = dialog_identifier ? dialog_identifier : "gimp-color-selector"; - if (desc) - { - cnp->shell = gimp_viewable_dialog_new (viewable, title, role, - stock_id, desc, - parent, - color_dialog_help_func, NULL, - NULL); + dialog = g_object_new (GIMP_TYPE_COLOR_DIALOG, + "title", title, + "role", role, + "help-func", gimp_color_dialog_help_func, + "stock-id", stock_id, + "description", desc, + "parent", parent, + NULL); - gtk_window_set_resizable (GTK_WINDOW (cnp->shell), FALSE); - } + if (viewable) + gimp_viewable_dialog_set_viewable (GIMP_VIEWABLE_DIALOG (dialog), + viewable); else - { - cnp->shell = gimp_dialog_new (title, role, - parent, 0, - color_dialog_help_func, NULL, - NULL); - } + gtk_widget_hide (GIMP_VIEWABLE_DIALOG (dialog)->icon->parent->parent); - g_object_set_data (G_OBJECT (cnp->shell), "color-dialog", cnp); + dialog->wants_updates = wants_updates; - gtk_dialog_add_buttons (GTK_DIALOG (cnp->shell), + gtk_dialog_add_buttons (GTK_DIALOG (dialog), GIMP_STOCK_RESET, RESPONSE_RESET, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); - gtk_dialog_set_default_response (GTK_DIALOG (cnp->shell), GTK_RESPONSE_OK); - - g_signal_connect (cnp->shell, "response", - G_CALLBACK (color_dialog_response), - cnp); - - g_object_add_weak_pointer (G_OBJECT (cnp->shell), (gpointer *) &cnp->shell); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); if (dialog_factory) gimp_dialog_factory_add_foreign (dialog_factory, dialog_identifier, - cnp->shell); + GTK_WIDGET (dialog)); - cnp->selection = gimp_color_selection_new (); - gtk_container_set_border_width (GTK_CONTAINER (cnp->selection), 12); - gimp_color_selection_set_show_alpha (GIMP_COLOR_SELECTION (cnp->selection), + dialog->selection = gimp_color_selection_new (); + gtk_container_set_border_width (GTK_CONTAINER (dialog->selection), 12); + gimp_color_selection_set_show_alpha (GIMP_COLOR_SELECTION (dialog->selection), show_alpha); - gimp_color_selection_set_color (GIMP_COLOR_SELECTION (cnp->selection), color); - gimp_color_selection_set_old_color (GIMP_COLOR_SELECTION (cnp->selection), + gimp_color_selection_set_color (GIMP_COLOR_SELECTION (dialog->selection), + color); + gimp_color_selection_set_old_color (GIMP_COLOR_SELECTION (dialog->selection), color); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (cnp->shell)->vbox), - cnp->selection); - gtk_widget_show (cnp->selection); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), + dialog->selection); + gtk_widget_show (dialog->selection); - g_signal_connect (cnp->selection, "color_changed", - G_CALLBACK (color_dialog_color_changed), - cnp); + g_signal_connect (dialog->selection, "color_changed", + G_CALLBACK (gimp_color_dialog_color_changed), + dialog); /* The color history */ table = gtk_table_new (2, 1 + COLOR_HISTORY_SIZE / 2, TRUE); gtk_table_set_row_spacings (GTK_TABLE (table), 2); gtk_table_set_col_spacings (GTK_TABLE (table), 2); gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4); - gtk_box_pack_end (GTK_BOX (GIMP_COLOR_SELECTION (cnp->selection)->right_vbox), + gtk_box_pack_end (GTK_BOX (GIMP_COLOR_SELECTION (dialog->selection)->right_vbox), table, FALSE, FALSE, 0); gtk_widget_show (table); @@ -186,8 +272,8 @@ color_dialog_new (GimpViewable *viewable, gtk_widget_show (button); g_signal_connect (button, "clicked", - G_CALLBACK (color_history_add_clicked), - cnp); + G_CALLBACK (gimp_color_history_add_clicked), + dialog); arrow = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_OUT); gtk_container_add (GTK_CONTAINER (button), arrow); @@ -209,128 +295,69 @@ color_dialog_new (GimpViewable *viewable, gtk_table_attach_defaults (GTK_TABLE (table), button, column + 1, column + 2, row, row + 1); - cnp->history[i] = gimp_color_area_new (&history_color, - GIMP_COLOR_AREA_SMALL_CHECKS, - GDK_BUTTON2_MASK); - gtk_container_add (GTK_CONTAINER (button), cnp->history[i]); - gtk_widget_show (cnp->history[i]); + dialog->history[i] = gimp_color_area_new (&history_color, + GIMP_COLOR_AREA_SMALL_CHECKS, + GDK_BUTTON2_MASK); + gtk_container_add (GTK_CONTAINER (button), dialog->history[i]); + gtk_widget_show (dialog->history[i]); gtk_widget_show (button); g_signal_connect (button, "clicked", - G_CALLBACK (color_history_color_clicked), - cnp); + G_CALLBACK (gimp_color_history_color_clicked), + dialog); - g_signal_connect (cnp->history[i], "color_changed", - G_CALLBACK (color_history_color_changed), + g_signal_connect (dialog->history[i], "color_changed", + G_CALLBACK (gimp_color_history_color_changed), GINT_TO_POINTER (i)); } - gtk_widget_show (cnp->shell); - - color_dialogs = g_list_prepend (color_dialogs, cnp); - - return cnp; + return GTK_WIDGET (dialog); } void -color_dialog_free (ColorDialog *cnp) +gimp_color_dialog_set_color (GimpColorDialog *dialog, + const GimpRGB *color) { - g_return_if_fail (cnp != NULL); - - color_dialogs = g_list_remove (color_dialogs, cnp); - - /* may be already destroyed by dialog factory */ - if (cnp->shell) - { - g_object_remove_weak_pointer (G_OBJECT (cnp->shell), - (gpointer *) &cnp->shell); - gtk_widget_destroy (cnp->shell); - } - - g_free (cnp); -} - -void -color_dialog_set_viewable (ColorDialog *cnb, - GimpViewable *viewable) -{ - g_return_if_fail (cnb != NULL); - - if (GIMP_IS_VIEWABLE_DIALOG (cnb->shell)) - gimp_viewable_dialog_set_viewable (GIMP_VIEWABLE_DIALOG (cnb->shell), - viewable); -} - -void -color_dialog_set_title (ColorDialog *cnb, - const gchar *title) -{ - g_return_if_fail (cnb != NULL); - g_return_if_fail (title != NULL); - - gtk_window_set_title (GTK_WINDOW (cnb->shell), title); -} - -void -color_dialog_set_color (ColorDialog *cnp, - const GimpRGB *color) -{ - g_return_if_fail (cnp != NULL); + g_return_if_fail (GIMP_IS_COLOR_DIALOG (dialog)); g_return_if_fail (color != NULL); - g_signal_handlers_block_by_func (cnp->selection, - color_dialog_color_changed, - cnp); + g_signal_handlers_block_by_func (dialog->selection, + gimp_color_dialog_color_changed, + dialog); - gimp_color_selection_set_color (GIMP_COLOR_SELECTION (cnp->selection), color); - gimp_color_selection_set_old_color (GIMP_COLOR_SELECTION (cnp->selection), + gimp_color_selection_set_color (GIMP_COLOR_SELECTION (dialog->selection), + color); + gimp_color_selection_set_old_color (GIMP_COLOR_SELECTION (dialog->selection), color); - g_signal_handlers_unblock_by_func (cnp->selection, - color_dialog_color_changed, - cnp); + g_signal_handlers_unblock_by_func (dialog->selection, + gimp_color_dialog_color_changed, + dialog); } void -color_dialog_get_color (ColorDialog *cnp, - GimpRGB *color) +gimp_color_dialog_get_color (GimpColorDialog *dialog, + GimpRGB *color) { - g_return_if_fail (cnp != NULL); + g_return_if_fail (GIMP_IS_COLOR_DIALOG (dialog)); g_return_if_fail (color != NULL); - gimp_color_selection_get_color (GIMP_COLOR_SELECTION (cnp->selection), color); -} - -void -color_dialog_show (ColorDialog *cnp) -{ - g_return_if_fail (cnp != NULL); - - gtk_window_present (GTK_WINDOW (cnp->shell)); -} - -void -color_dialog_hide (ColorDialog *cnp) -{ - g_return_if_fail (cnp != NULL); - - gtk_widget_hide (cnp->shell); + gimp_color_selection_get_color (GIMP_COLOR_SELECTION (dialog->selection), + color); } /* private functions */ static void -color_dialog_help_func (const gchar *help_id, - gpointer help_data) +gimp_color_dialog_help_func (const gchar *help_id, + gpointer help_data) { - ColorDialog *cnp; + GimpColorDialog *dialog = GIMP_COLOR_DIALOG (help_data); GimpColorNotebook *notebook; - cnp = g_object_get_data (G_OBJECT (help_data), "color-notebook"); - notebook = - GIMP_COLOR_NOTEBOOK (GIMP_COLOR_SELECTION (cnp->selection)->notebook); + GIMP_COLOR_NOTEBOOK (GIMP_COLOR_SELECTION (dialog->selection)->notebook); help_id = GIMP_COLOR_SELECTOR_GET_CLASS (notebook->cur_page)->help_id; @@ -338,63 +365,26 @@ color_dialog_help_func (const gchar *help_id, } static void -color_dialog_response (GtkWidget *widget, - gint response_id, - ColorDialog *cnp) +gimp_color_dialog_color_changed (GimpColorSelection *selection, + GimpColorDialog *dialog) { - GimpRGB color; - - switch (response_id) + if (dialog->wants_updates) { - case RESPONSE_RESET: - gimp_color_selection_reset (GIMP_COLOR_SELECTION (cnp->selection)); - break; + GimpRGB color; - case GTK_RESPONSE_OK: - color_history_add_clicked (NULL, cnp); + gimp_color_selection_get_color (selection, &color); - gimp_color_selection_get_color (GIMP_COLOR_SELECTION (cnp->selection), - &color); - - if (cnp->callback) - cnp->callback (cnp, &color, - COLOR_DIALOG_OK, - cnp->client_data); - break; - - default: - gimp_color_selection_get_old_color (GIMP_COLOR_SELECTION (cnp->selection), - &color); - - if (cnp->callback) - cnp->callback (cnp, &color, - COLOR_DIALOG_CANCEL, - cnp->client_data); - break; + g_signal_emit (dialog, color_dialog_signals[UPDATE], 0, + &color, GIMP_COLOR_DIALOG_UPDATE); } } -static void -color_dialog_color_changed (GimpColorSelection *selection, - ColorDialog *cnp) -{ - GimpRGB color; - - gimp_color_selection_get_color (selection, &color); - - if (cnp->wants_updates && cnp->callback) - cnp->callback (cnp, - &color, - COLOR_DIALOG_UPDATE, - cnp->client_data); -} - /* color history callbacks */ static void -color_history_color_clicked (GtkWidget *widget, - ColorDialog *cnp) +gimp_color_history_color_clicked (GtkWidget *widget, + GimpColorDialog *dialog) { GimpColorArea *color_area; GimpRGB color; @@ -402,13 +392,13 @@ color_history_color_clicked (GtkWidget *widget, color_area = GIMP_COLOR_AREA (GTK_BIN (widget)->child); gimp_color_area_get_color (color_area, &color); - gimp_color_selection_set_color (GIMP_COLOR_SELECTION (cnp->selection), + gimp_color_selection_set_color (GIMP_COLOR_SELECTION (dialog->selection), &color); } static void -color_history_color_changed (GtkWidget *widget, - gpointer data) +gimp_color_history_color_changed (GtkWidget *widget, + gpointer data) { GimpRGB changed_color; gint color_index; @@ -422,33 +412,33 @@ color_history_color_changed (GtkWidget *widget, for (list = color_dialogs; list; list = g_list_next (list)) { - ColorDialog *dialog = list->data; + GimpColorDialog *dialog = list->data; if (dialog->history[color_index] != widget) { g_signal_handlers_block_by_func (dialog->history[color_index], - color_history_color_changed, + gimp_color_history_color_changed, data); gimp_color_area_set_color (GIMP_COLOR_AREA (dialog->history[color_index]), &changed_color); g_signal_handlers_unblock_by_func (dialog->history[color_index], - color_history_color_changed, + gimp_color_history_color_changed, data); } } } static void -color_history_add_clicked (GtkWidget *widget, - ColorDialog *cnp) +gimp_color_history_add_clicked (GtkWidget *widget, + GimpColorDialog *dialog) { GimpRGB color; gint shift_begin; gint i; - gimp_color_selection_get_color (GIMP_COLOR_SELECTION (cnp->selection), + gimp_color_selection_get_color (GIMP_COLOR_SELECTION (dialog->selection), &color); shift_begin = color_history_add (&color); @@ -457,6 +447,6 @@ color_history_add_clicked (GtkWidget *widget, { color_history_get (i, &color); - gimp_color_area_set_color (GIMP_COLOR_AREA (cnp->history[i]), &color); + gimp_color_area_set_color (GIMP_COLOR_AREA (dialog->history[i]), &color); } } diff --git a/app/widgets/gimpcolordialog.h b/app/widgets/gimpcolordialog.h index b910bbfb61..b4df91f62f 100644 --- a/app/widgets/gimpcolordialog.h +++ b/app/widgets/gimpcolordialog.h @@ -1,6 +1,8 @@ /* The GIMP -- an image manipulation program * Copyright (C) 1995 Spencer Kimball and Peter Mattis * + * gimpcolordialog.h + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -16,51 +18,62 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __COLOR_DIALOG_H__ -#define __COLOR_DIALOG_H__ +#ifndef __GIMP_COLOR_DIALOG_H__ +#define __GIMP_COLOR_DIALOG_H__ -typedef enum +#include "gimpviewabledialog.h" + +#include "gui/color-history.h" + + +#define GIMP_TYPE_COLOR_DIALOG (gimp_color_dialog_get_type ()) +#define GIMP_COLOR_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_COLOR_DIALOG, GimpColorDialog)) +#define GIMP_COLOR_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_COLOR_DIALOG, GimpColorDialogClass)) +#define GIMP_IS_COLOR_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_COLOR_DIALOG)) +#define GIMP_IS_COLOR_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_COLOR_DIALOG)) +#define GIMP_COLOR_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_COLOR_DIALOG, GimpColorDialogClass)) + + +typedef struct _GimpColorDialogClass GimpColorDialogClass; + +struct _GimpColorDialog { - COLOR_DIALOG_OK, - COLOR_DIALOG_CANCEL, - COLOR_DIALOG_UPDATE -} ColorDialogState; + GimpViewableDialog parent_instance; + + gboolean wants_updates; + + GtkWidget *selection; + GtkWidget *history[COLOR_HISTORY_SIZE]; +}; + +struct _GimpColorDialogClass +{ + GimpViewableDialogClass parent_class; + + void (* update) (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state); +}; -typedef void (* ColorDialogCallback) (ColorDialog *cnb, - const GimpRGB *color, - ColorDialogState state, - gpointer callback_data); +GType gimp_color_dialog_get_type (void) G_GNUC_CONST; + +GtkWidget * gimp_color_dialog_new (GimpViewable *viewable, + const gchar *title, + const gchar *stock_id, + const gchar *desc, + GtkWidget *parent, + GimpDialogFactory *dialog_factory, + const gchar *dialog_identifier, + const GimpRGB *color, + gboolean wants_update, + gboolean show_alpha); + +void gimp_color_dialog_set_color (GimpColorDialog *dialog, + const GimpRGB *color); +void gimp_color_dialog_get_color (GimpColorDialog *dialog, + GimpRGB *color); -ColorDialog * color_dialog_new (GimpViewable *viewable, - const gchar *title, - const gchar *stock_id, - const gchar *desc, - GtkWidget *parent, - GimpDialogFactory *dialog_factory, - const gchar *dialog_identifier, - const GimpRGB *color, - ColorDialogCallback callback, - gpointer callback_data, - gboolean wants_update, - gboolean show_alpha); - -void color_dialog_free (ColorDialog *cnb); - -void color_dialog_set_viewable (ColorDialog *cnb, - GimpViewable *viewable); -void color_dialog_set_title (ColorDialog *cnb, - const gchar *title); - -void color_dialog_show (ColorDialog *cnb); -void color_dialog_hide (ColorDialog *cnb); - -void color_dialog_set_color (ColorDialog *cnb, - const GimpRGB *color); -void color_dialog_get_color (ColorDialog *cnb, - GimpRGB *color); - - -#endif /* __COLOR_DIALOG_H__ */ +#endif /* __GIMP_COLOR_DIALOG_H__ */ diff --git a/app/widgets/gimpcolormapeditor.c b/app/widgets/gimpcolormapeditor.c index 90149940c7..e2c2af5111 100644 --- a/app/widgets/gimpcolormapeditor.c +++ b/app/widgets/gimpcolormapeditor.c @@ -50,6 +50,7 @@ #include "display/gimpdisplayshell-render.h" +#include "gimpcolordialog.h" #include "gimpcolormapeditor.h" #include "gimpdnd.h" #include "gimpdialogfactory.h" @@ -57,8 +58,6 @@ #include "gimpmenufactory.h" #include "gimpwidgets-utils.h" -#include "dialogs/color-dialog.h" - #include "gimp-intl.h" @@ -260,7 +259,7 @@ gimp_colormap_editor_destroy (GtkObject *object) if (editor->color_dialog) { - color_dialog_free (editor->color_dialog); + gtk_widget_destroy (editor->color_dialog); editor->color_dialog = NULL; } @@ -273,7 +272,7 @@ gimp_colormap_editor_unmap (GtkWidget *widget) GimpColormapEditor *editor = GIMP_COLORMAP_EDITOR (widget); if (editor->color_dialog) - color_dialog_hide (editor->color_dialog); + gtk_widget_hide (editor->color_dialog); GTK_WIDGET_CLASS (parent_class)->unmap (widget); } @@ -294,7 +293,7 @@ gimp_colormap_editor_set_image (GimpImageEditor *image_editor, editor); if (editor->color_dialog) - color_dialog_hide (editor->color_dialog); + gtk_widget_hide (editor->color_dialog); if (! HAVE_COLORMAP (gimage)) { @@ -863,27 +862,25 @@ gimp_colormap_hex_entry_focus_out (GtkEntry *entry, } static void -gimp_colormap_color_dialog_callback (ColorDialog *color_dialog, - const GimpRGB *color, - ColorDialogState state, - gpointer data) +gimp_colormap_color_dialog_update (GimpColorDialog *color_dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpColormapEditor *editor) { - GimpColormapEditor *editor = GIMP_COLORMAP_EDITOR (data); - GimpImage *gimage; - - gimage = GIMP_IMAGE_EDITOR (editor)->gimage; + GimpImage *gimage = GIMP_IMAGE_EDITOR (editor)->gimage; switch (state) { - case COLOR_DIALOG_UPDATE: + case GIMP_COLOR_DIALOG_UPDATE: break; - case COLOR_DIALOG_OK: + case GIMP_COLOR_DIALOG_OK: gimp_image_set_colormap_entry (gimage, editor->col_index, color, TRUE); gimp_image_flush (gimage); /* Fall through */ - case COLOR_DIALOG_CANCEL: - color_dialog_hide (editor->color_dialog); + + case GIMP_COLOR_DIALOG_CANCEL: + gtk_widget_hide (editor->color_dialog); break; } } @@ -911,25 +908,33 @@ gimp_colormap_edit_clicked (GtkWidget *widget, toplevel_factory = gimp_dialog_factory_from_name ("toplevel"); editor->color_dialog = - color_dialog_new (GIMP_VIEWABLE (gimage), - _("Edit Indexed Color"), - GIMP_STOCK_CONVERT_INDEXED, - _("Edit indexed image palette color"), - GTK_WIDGET (editor), - toplevel_factory, - "gimp-colormap-editor-color-dialog", - (const GimpRGB *) &color, - gimp_colormap_color_dialog_callback, - editor, - FALSE, FALSE); + gimp_color_dialog_new (GIMP_VIEWABLE (gimage), + _("Edit Indexed Color"), + GIMP_STOCK_CONVERT_INDEXED, + _("Edit indexed image palette color"), + GTK_WIDGET (editor), + toplevel_factory, + "gimp-colormap-editor-color-dialog", + (const GimpRGB *) &color, + FALSE, FALSE); + + g_signal_connect (editor->color_dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &editor->color_dialog); + + g_signal_connect (editor->color_dialog, "update", + G_CALLBACK (gimp_colormap_color_dialog_update), + editor); } else { - color_dialog_set_viewable (editor->color_dialog, - GIMP_VIEWABLE (gimage)); - color_dialog_show (editor->color_dialog); - color_dialog_set_color (editor->color_dialog, &color); + gimp_viewable_dialog_set_viewable (GIMP_VIEWABLE_DIALOG (editor->color_dialog), + GIMP_VIEWABLE (gimage)); + gimp_color_dialog_set_color (GIMP_COLOR_DIALOG (editor->color_dialog), + &color); } + + gtk_window_present (GTK_WINDOW (editor->color_dialog)); } } diff --git a/app/widgets/gimpcolormapeditor.h b/app/widgets/gimpcolormapeditor.h index 6b23f036fc..f0833a732f 100644 --- a/app/widgets/gimpcolormapeditor.h +++ b/app/widgets/gimpcolormapeditor.h @@ -22,8 +22,6 @@ #include "gimpimageeditor.h" -#include "gui/gui-types.h" /* temp hack */ - #define GIMP_TYPE_COLORMAP_EDITOR (gimp_colormap_editor_get_type ()) #define GIMP_COLORMAP_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_COLORMAP_EDITOR, GimpColormapEditor)) @@ -53,7 +51,7 @@ struct _GimpColormapEditor GtkWidget *index_spinbutton; GtkWidget *color_entry; - ColorDialog *color_dialog; + GtkWidget *color_dialog; }; struct _GimpColormapEditorClass diff --git a/app/widgets/gimpcolorpanel.c b/app/widgets/gimpcolorpanel.c index dabbed5d9c..f338418eef 100644 --- a/app/widgets/gimpcolorpanel.c +++ b/app/widgets/gimpcolorpanel.c @@ -27,41 +27,26 @@ #include "core/gimp.h" #include "core/gimpcontext.h" -#ifdef __GNUC__ -#warning FIXME #include "dialogs/dialogs-types.h" -#endif -#include "dialogs/dialogs-types.h" -#include "dialogs/color-dialog.h" - +#include "gimpcolordialog.h" #include "gimpcolorpanel.h" #include "gimpitemfactory.h" -struct _GimpColorPanel -{ - GimpColorButton parent; - - GimpContext *context; - - ColorDialog *color_dialog; -}; - - /* local function prototypes */ -static void gimp_color_panel_class_init (GimpColorPanelClass *klass); -static void gimp_color_panel_init (GimpColorPanel *panel); +static void gimp_color_panel_class_init (GimpColorPanelClass *klass); +static void gimp_color_panel_init (GimpColorPanel *panel); -static void gimp_color_panel_destroy (GtkObject *object); -static gboolean gimp_color_panel_button_press (GtkWidget *widget, - GdkEventButton *bevent); -static void gimp_color_panel_color_changed (GimpColorButton *button); -static void gimp_color_panel_clicked (GtkButton *button); +static void gimp_color_panel_destroy (GtkObject *object); +static gboolean gimp_color_panel_button_press (GtkWidget *widget, + GdkEventButton *bevent); +static void gimp_color_panel_color_changed (GimpColorButton *button); +static void gimp_color_panel_clicked (GtkButton *button); -static void gimp_color_panel_select_callback (ColorDialog *dialog, - const GimpRGB *color, - ColorDialogState state, - gpointer data); +static void gimp_color_panel_dialog_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpColorPanel *panel); static GimpColorButtonClass *parent_class = NULL; @@ -125,8 +110,7 @@ gimp_color_panel_destroy (GtkObject *object) if (panel->color_dialog) { - color_dialog_hide (panel->color_dialog); - color_dialog_free (panel->color_dialog); + gtk_widget_destroy (panel->color_dialog); panel->color_dialog = NULL; } @@ -228,7 +212,8 @@ gimp_color_panel_color_changed (GimpColorButton *button) if (panel->color_dialog) { gimp_color_button_get_color (GIMP_COLOR_BUTTON (button), &color); - color_dialog_set_color (panel->color_dialog, &color); + gimp_color_dialog_set_color (GIMP_COLOR_DIALOG (panel->color_dialog), + &color); } } @@ -243,40 +228,43 @@ gimp_color_panel_clicked (GtkButton *button) if (! panel->color_dialog) { panel->color_dialog = - color_dialog_new (NULL, GIMP_COLOR_BUTTON (button)->title, NULL, NULL, - GTK_WIDGET (button), - NULL, NULL, - (const GimpRGB *) &color, - gimp_color_panel_select_callback, - panel, - FALSE, - gimp_color_button_has_alpha (GIMP_COLOR_BUTTON (button))); - } - else - { - color_dialog_show (panel->color_dialog); + gimp_color_dialog_new (NULL, + GIMP_COLOR_BUTTON (button)->title, + NULL, NULL, + GTK_WIDGET (button), + NULL, NULL, + (const GimpRGB *) &color, + FALSE, + gimp_color_button_has_alpha (GIMP_COLOR_BUTTON (button))); + + g_signal_connect (panel->color_dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &panel->color_dialog); + + g_signal_connect (panel->color_dialog, "update", + G_CALLBACK (gimp_color_panel_dialog_update), + panel); } + + gtk_window_present (GTK_WINDOW (panel->color_dialog)); } static void -gimp_color_panel_select_callback (ColorDialog *dialog, - const GimpRGB *color, - ColorDialogState state, - gpointer data) +gimp_color_panel_dialog_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpColorPanel *panel) { - GimpColorPanel *panel = GIMP_COLOR_PANEL (data); - - if (panel->color_dialog) + switch (state) { - switch (state) - { - case COLOR_DIALOG_UPDATE: - break; - case COLOR_DIALOG_OK: - gimp_color_button_set_color (GIMP_COLOR_BUTTON (panel), color); - /* Fallthrough */ - case COLOR_DIALOG_CANCEL: - color_dialog_hide (panel->color_dialog); - } + case GIMP_COLOR_DIALOG_UPDATE: + break; + + case GIMP_COLOR_DIALOG_OK: + gimp_color_button_set_color (GIMP_COLOR_BUTTON (panel), color); + /* Fallthrough */ + + case GIMP_COLOR_DIALOG_CANCEL: + gtk_widget_hide (panel->color_dialog); } } diff --git a/app/widgets/gimpcolorpanel.h b/app/widgets/gimpcolorpanel.h index df033a106e..e207911a38 100644 --- a/app/widgets/gimpcolorpanel.h +++ b/app/widgets/gimpcolorpanel.h @@ -33,6 +33,14 @@ typedef struct _GimpColorPanelClass GimpColorPanelClass; +struct _GimpColorPanel +{ + GimpColorButton parent_instance; + + GimpContext *context; + GtkWidget *color_dialog; +}; + struct _GimpColorPanelClass { GimpColorButtonClass parent_class; diff --git a/app/widgets/gimpgradienteditor.c b/app/widgets/gimpgradienteditor.c index 3c18ff1cd1..e2a5ee595c 100644 --- a/app/widgets/gimpgradienteditor.c +++ b/app/widgets/gimpgradienteditor.c @@ -34,9 +34,6 @@ */ /* TODO: - * - * - Fix memory leaks: grad_free_gradient_editor() and any others - * which I may have missed. * * - Add all of Marcelo's neat suggestions: * - Hue rotate, saturation, brightness, contrast. @@ -73,8 +70,6 @@ #include "gimpviewrenderergradient.h" #include "gimpwidgets-utils.h" -#include "dialogs/color-dialog.h" - #include "gimp-intl.h" @@ -463,7 +458,7 @@ gimp_gradient_editor_set_data (GimpDataEditor *editor, if (gradient_editor->color_dialog) { - color_dialog_free (gradient_editor->color_dialog); + gtk_widget_destroy (gradient_editor->color_dialog); gradient_editor->color_dialog = NULL; gtk_widget_set_sensitive (GTK_WIDGET (editor), TRUE); } diff --git a/app/widgets/gimpgradienteditor.h b/app/widgets/gimpgradienteditor.h index 00762d77ff..49358ba7d5 100644 --- a/app/widgets/gimpgradienteditor.h +++ b/app/widgets/gimpgradienteditor.h @@ -25,8 +25,6 @@ #include "gimpdataeditor.h" -#include "dialogs/dialogs-types.h" /* FIXME */ - #define GRAD_NUM_COLORS 10 @@ -70,7 +68,7 @@ struct _GimpGradientEditor gboolean instant_update; /* Color dialog */ - ColorDialog *color_dialog; + GtkWidget *color_dialog; /* Gradient preview */ gint preview_last_x; diff --git a/app/widgets/gimppaletteeditor.c b/app/widgets/gimppaletteeditor.c index 4240008004..6ca0ba0a28 100644 --- a/app/widgets/gimppaletteeditor.c +++ b/app/widgets/gimppaletteeditor.c @@ -39,6 +39,7 @@ #include "core/gimpdatafactory.h" #include "core/gimppalette.h" +#include "gimpcolordialog.h" #include "gimpdialogfactory.h" #include "gimpdnd.h" #include "gimpdocked.h" @@ -47,8 +48,6 @@ #include "gimpsessioninfo.h" #include "gimpwidgets-utils.h" -#include "dialogs/color-dialog.h" - #include "gimp-intl.h" @@ -138,10 +137,10 @@ static void palette_editor_viewport_resized (GtkWidget *widget, static void palette_editor_viewport_realize (GtkWidget *widget, GimpPaletteEditor *editor); -static void palette_editor_color_dialog_callback (ColorDialog *color_dialog, +static void palette_editor_color_dialog_update (GimpColorDialog *dialog, const GimpRGB *color, - ColorDialogState state, - gpointer data); + GimpColorDialogState state, + GimpPaletteEditor *editor); static GimpDataEditorClass *parent_class = NULL; @@ -412,7 +411,7 @@ gimp_palette_editor_destroy (GtkObject *object) if (editor->color_dialog) { - color_dialog_free (editor->color_dialog); + gtk_widget_destroy (editor->color_dialog); editor->color_dialog = NULL; } @@ -425,7 +424,7 @@ gimp_palette_editor_unmap (GtkWidget *widget) GimpPaletteEditor *editor = GIMP_PALETTE_EDITOR (widget); if (editor->color_dialog) - color_dialog_hide (editor->color_dialog); + gtk_widget_hide (editor->color_dialog); GTK_WIDGET_CLASS (parent_class)->unmap (widget); } @@ -444,7 +443,7 @@ gimp_palette_editor_set_data (GimpDataEditor *editor, { if (palette_editor->color_dialog) { - color_dialog_free (palette_editor->color_dialog); + gtk_widget_destroy (palette_editor->color_dialog); palette_editor->color_dialog = NULL; } @@ -1045,24 +1044,33 @@ palette_editor_edit_clicked (GtkWidget *widget, toplevel_factory = gimp_dialog_factory_from_name ("toplevel"); editor->color_dialog = - color_dialog_new (GIMP_VIEWABLE (palette), - _("Edit Palette Color"), - GIMP_STOCK_PALETTE, - _("Edit Color Palette Entry"), - GTK_WIDGET (editor), - toplevel_factory, - "gimp-palette-editor-color-dialog", - (const GimpRGB *) &editor->color->color, - palette_editor_color_dialog_callback, - editor, - FALSE, FALSE); + gimp_color_dialog_new (GIMP_VIEWABLE (palette), + _("Edit Palette Color"), + GIMP_STOCK_PALETTE, + _("Edit Color Palette Entry"), + GTK_WIDGET (editor), + toplevel_factory, + "gimp-palette-editor-color-dialog", + (const GimpRGB *) &editor->color->color, + FALSE, FALSE); + + g_signal_connect (editor->color_dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &editor->color_dialog); + + g_signal_connect (editor->color_dialog, "update", + G_CALLBACK (palette_editor_color_dialog_update), + editor); } else { - color_dialog_set_viewable (editor->color_dialog, GIMP_VIEWABLE (palette)); - color_dialog_set_color (editor->color_dialog, &editor->color->color); - color_dialog_show (editor->color_dialog); + gimp_viewable_dialog_set_viewable (GIMP_VIEWABLE_DIALOG (editor->color_dialog), + GIMP_VIEWABLE (palette)); + gimp_color_dialog_set_color (GIMP_COLOR_DIALOG (editor->color_dialog), + &editor->color->color); } + + gtk_window_present (GTK_WINDOW (editor->color_dialog)); } static void @@ -1262,33 +1270,27 @@ palette_editor_viewport_realize (GtkWidget *widget, } static void -palette_editor_color_dialog_callback (ColorDialog *color_dialog, - const GimpRGB *color, - ColorDialogState state, - gpointer data) +palette_editor_color_dialog_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpPaletteEditor *editor) { - GimpPaletteEditor *editor = GIMP_PALETTE_EDITOR (data); - GimpPalette *palette; - GimpContext *user_context; - - palette = GIMP_PALETTE (GIMP_DATA_EDITOR (editor)->data); - - user_context = gimp_get_user_context (GIMP_DATA_EDITOR (editor)->data_factory->gimp); + GimpPalette *palette = GIMP_PALETTE (GIMP_DATA_EDITOR (editor)->data); switch (state) { - case COLOR_DIALOG_UPDATE: + case GIMP_COLOR_DIALOG_UPDATE: break; - case COLOR_DIALOG_OK: + case GIMP_COLOR_DIALOG_OK: if (editor->color) { editor->color->color = *color; gimp_data_dirty (GIMP_DATA (palette)); } - /* Fallthrough */ - case COLOR_DIALOG_CANCEL: - color_dialog_hide (editor->color_dialog); + + case GIMP_COLOR_DIALOG_CANCEL: + gtk_widget_hide (editor->color_dialog); } } diff --git a/app/widgets/gimppaletteeditor.h b/app/widgets/gimppaletteeditor.h index 3767c5b1a9..a6200080e9 100644 --- a/app/widgets/gimppaletteeditor.h +++ b/app/widgets/gimppaletteeditor.h @@ -22,8 +22,6 @@ #include "gimpdataeditor.h" -#include "dialogs/dialogs-types.h" /* FIXME */ - #define GIMP_TYPE_PALETTE_EDITOR (gimp_palette_editor_get_type ()) #define GIMP_PALETTE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_PALETTE_EDITOR, GimpPaletteEditor)) @@ -52,7 +50,7 @@ struct _GimpPaletteEditor GtkWidget *zoom_in_button; GtkWidget *zoom_all_button; - ColorDialog *color_dialog; + GtkWidget *color_dialog; GimpPaletteEntry *color; GimpPaletteEntry *dnd_color; diff --git a/app/widgets/gimptoolbox-color-area.c b/app/widgets/gimptoolbox-color-area.c index d1fe627380..1654f236c8 100644 --- a/app/widgets/gimptoolbox-color-area.c +++ b/app/widgets/gimptoolbox-color-area.c @@ -27,35 +27,30 @@ #include "core/gimp.h" #include "core/gimpcontext.h" +#include "gimpcolordialog.h" #include "gimpdialogfactory.h" #include "gimpfgbgeditor.h" #include "gimptoolbox.h" #include "gimptoolbox-color-area.h" -#ifdef __GNUC__ -#warning FIXME #include "dialogs/dialogs-types.h" -#endif -#include "dialogs/dialogs-types.h" -#include "dialogs/color-dialog.h" - #include "gimp-intl.h" /* local function prototypes */ -static void color_area_color_clicked (GimpFgBgEditor *editor, - GimpActiveColor active_color, - GimpContext *context); -static void color_area_select_callback (ColorDialog *color_dialog, - const GimpRGB *color, - ColorDialogState state, - gpointer data); +static void color_area_color_clicked (GimpFgBgEditor *editor, + GimpActiveColor active_color, + GimpContext *context); +static void color_area_dialog_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpContext *context); /* local variables */ -static GtkWidget *color_area = NULL; -static ColorDialog *color_dialog = NULL; +static GtkWidget *color_area = NULL; +static GtkWidget *color_dialog = NULL; static gboolean color_dialog_active = FALSE; static GimpActiveColor edit_color; static GimpRGB revert_fg; @@ -92,36 +87,31 @@ gimp_toolbox_color_area_create (GimpToolbox *toolbox, /* private functions */ static void -color_area_select_callback (ColorDialog *color_dialog, - const GimpRGB *color, - ColorDialogState state, - gpointer data) +color_area_dialog_update (GimpColorDialog *dialog, + const GimpRGB *color, + GimpColorDialogState state, + GimpContext *context) { - GimpContext *context = GIMP_CONTEXT (data); - - if (color_dialog) + switch (state) { - switch (state) - { - case COLOR_DIALOG_OK: - color_dialog_hide (color_dialog); - color_dialog_active = FALSE; - /* Fallthrough */ + case GIMP_COLOR_DIALOG_OK: + gtk_widget_hide (color_dialog); + color_dialog_active = FALSE; + /* Fallthrough */ - case COLOR_DIALOG_UPDATE: - if (edit_color == GIMP_ACTIVE_COLOR_FOREGROUND) - gimp_context_set_foreground (context, color); - else - gimp_context_set_background (context, color); - break; + case GIMP_COLOR_DIALOG_UPDATE: + if (edit_color == GIMP_ACTIVE_COLOR_FOREGROUND) + gimp_context_set_foreground (context, color); + else + gimp_context_set_background (context, color); + break; - case COLOR_DIALOG_CANCEL: - color_dialog_hide (color_dialog); - color_dialog_active = FALSE; - gimp_context_set_foreground (context, &revert_fg); - gimp_context_set_background (context, &revert_bg); - break; - } + case GIMP_COLOR_DIALOG_CANCEL: + gtk_widget_hide (color_dialog); + color_dialog_active = FALSE; + gimp_context_set_foreground (context, &revert_fg); + gimp_context_set_background (context, &revert_bg); + break; } } @@ -158,21 +148,24 @@ color_area_color_clicked (GimpFgBgEditor *editor, toplevel_factory = gimp_dialog_factory_from_name ("toplevel"); - color_dialog = color_dialog_new (NULL, title, NULL, NULL, - GTK_WIDGET (editor), - toplevel_factory, - "gimp-toolbox-color-dialog", - (const GimpRGB *) &color, - color_area_select_callback, - context, TRUE, FALSE); + color_dialog = gimp_color_dialog_new (NULL, title, NULL, NULL, + GTK_WIDGET (editor), + toplevel_factory, + "gimp-toolbox-color-dialog", + (const GimpRGB *) &color, + TRUE, FALSE); color_dialog_active = TRUE; + + g_signal_connect (color_dialog, "update", + G_CALLBACK (color_area_dialog_update), + context); } else { - color_dialog_set_title (color_dialog, title); - color_dialog_set_color (color_dialog, &color); + gtk_window_set_title (GTK_WINDOW (color_dialog), title); + gimp_color_dialog_set_color (GIMP_COLOR_DIALOG (color_dialog), &color); - color_dialog_show (color_dialog); + gtk_window_present (GTK_WINDOW (color_dialog)); color_dialog_active = TRUE; } } diff --git a/app/widgets/widgets-enums.c b/app/widgets/widgets-enums.c index dd53edd7f1..0b22c85100 100644 --- a/app/widgets/widgets-enums.c +++ b/app/widgets/widgets-enums.c @@ -44,6 +44,25 @@ gimp_aspect_type_get_type (void) return type; } +GType +gimp_color_dialog_state_get_type (void) +{ + static const GEnumValue values[] = + { + { GIMP_COLOR_DIALOG_OK, "GIMP_COLOR_DIALOG_OK", "ok" }, + { GIMP_COLOR_DIALOG_CANCEL, "GIMP_COLOR_DIALOG_CANCEL", "cancel" }, + { GIMP_COLOR_DIALOG_UPDATE, "GIMP_COLOR_DIALOG_UPDATE", "update" }, + { 0, NULL, NULL } + }; + + static GType type = 0; + + if (! type) + type = g_enum_register_static ("GimpColorDialogState", values); + + return type; +} + GType gimp_color_frame_mode_get_type (void) { diff --git a/app/widgets/widgets-enums.h b/app/widgets/widgets-enums.h index 1056f69f89..160879c5a1 100644 --- a/app/widgets/widgets-enums.h +++ b/app/widgets/widgets-enums.h @@ -47,6 +47,18 @@ typedef enum } GimpAspectType; +#define GIMP_TYPE_COLOR_DIALOG_STATE (gimp_color_dialog_state_get_type ()) + +GType gimp_color_dialog_state_get_type (void) G_GNUC_CONST; + +typedef enum +{ + GIMP_COLOR_DIALOG_OK, + GIMP_COLOR_DIALOG_CANCEL, + GIMP_COLOR_DIALOG_UPDATE +} GimpColorDialogState; + + #define GIMP_TYPE_COLOR_FRAME_MODE (gimp_color_frame_mode_get_type ()) GType gimp_color_frame_mode_get_type (void) G_GNUC_CONST; diff --git a/app/widgets/widgets-types.h b/app/widgets/widgets-types.h index 3a7009a5cd..e6082708b3 100644 --- a/app/widgets/widgets-types.h +++ b/app/widgets/widgets-types.h @@ -122,6 +122,7 @@ typedef struct _GimpUIManager GimpUIManager; /* misc dialogs */ +typedef struct _GimpColorDialog GimpColorDialog; typedef struct _GimpErrorDialog GimpErrorDialog; typedef struct _GimpFileDialog GimpFileDialog; typedef struct _GimpProgressDialog GimpProgressDialog;