From 8e3259d084b2cec5743bda36f73808372e216221 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 27 Feb 2001 14:14:13 +0000 Subject: [PATCH] app/apptypes.h app/Makefile.am new widget. The upcoming replacement for 2001-02-27 Michael Natterer * app/apptypes.h * app/Makefile.am * app/gimpdrawablelistview.[ch]: new widget. The upcoming replacement for the layers and channels dialogs. * app/test_commands.[ch]: put the test dialogs here... * app/commands.[ch]: ... and made this one clean again. * app/gimpcontainergridview.c * app/gimpcontainerlistview.c * app/gimpcontainerview.[ch]: some signal handling fine tuning. * app/gimpimage.[ch]: emits "active_layer_changed" and "active_channel_changed" signals now. The semantics of gimage->active_layer and gimage->active_channel have changed a bit. We now have either an active layer _or_ and active channel (there is no active layer any more if a channel is active). * app/channel_ops.c * app/floating_sel.c * app/gdisplay.c * app/layers_dialog.c * app/menus.c: changed accordingly. * app/tools/gimpcolorpickertool.c: actually assign the draw_class vraiable in the class_init function. * app/tools/gimpdrawtool.[ch] * app/tools/tool.c: removed the _new() functions because these objects are abstract superclasses. Did some cleanup. Nathan, please configure you editor to _not_ produce any tabs in the source code. * app/tools/gimppaintbrushtool.[ch]: "blurb" and "help" are tagged with _(), not N_(). Put the register function to the header. * po/POTFILES.in: made it compile again. --- ChangeLog | 50 ++- app/Makefile.am | 4 + app/actions/help-commands.c | 581 +-------------------------- app/actions/help-commands.h | 83 ++-- app/apptypes.h | 9 +- app/channel_ops.c | 8 +- app/commands.c | 581 +-------------------------- app/commands.h | 83 ++-- app/core/gimpdrawable-offset.c | 8 +- app/core/gimpimage-duplicate.c | 8 +- app/core/gimpimage-guides.c | 161 ++++++-- app/core/gimpimage-guides.h | 25 +- app/core/gimpimage-merge.c | 161 ++++++-- app/core/gimpimage-merge.h | 25 +- app/core/gimpimage-pick-color.c | 1 + app/core/gimpimage-projection.c | 161 ++++++-- app/core/gimpimage-projection.h | 25 +- app/core/gimpimage-resize.c | 161 ++++++-- app/core/gimpimage-resize.h | 25 +- app/core/gimpimage-scale.c | 161 ++++++-- app/core/gimpimage-scale.h | 25 +- app/core/gimpimage.c | 161 ++++++-- app/core/gimpimage.h | 25 +- app/core/gimplayer-floating-sel.c | 6 - app/core/gimpprojection-construct.c | 161 ++++++-- app/core/gimpprojection-construct.h | 25 +- app/core/gimpprojection.c | 10 +- app/display/gimpdisplay.c | 10 +- app/floating_sel.c | 6 - app/gdisplay.c | 10 +- app/gimpcontainergridview.c | 16 +- app/gimpcontainerlistview.c | 16 +- app/gimpcontainerview.c | 16 +- app/gimpcontainerview.h | 2 +- app/gimpdrawable-offset.c | 8 +- app/gimpdrawablelistview.c | 528 +++++++++++++++++++++++++ app/gimpdrawablelistview.h | 83 ++++ app/gimpimage-duplicate.c | 8 +- app/gimpimage.c | 161 ++++++-- app/gimpimage.h | 25 +- app/gui/commands.c | 581 +-------------------------- app/gui/commands.h | 83 ++-- app/gui/help-commands.c | 581 +-------------------------- app/gui/help-commands.h | 83 ++-- app/gui/layers-dialog.c | 6 + app/gui/menus.c | 35 +- app/gui/test-commands.c | 582 ++++++++++++++++++++++++++++ app/gui/test-commands.h | 45 +++ app/layers_dialog.c | 6 + app/menus.c | 35 +- app/menus/menus.c | 35 +- app/paint/gimppaintbrush.c | 7 +- app/paint/gimppaintbrush.h | 4 +- app/test_commands.c | 582 ++++++++++++++++++++++++++++ app/test_commands.h | 45 +++ app/tools/gimpcolorpickertool.c | 1 + app/tools/gimpdrawtool.c | 60 ++- app/tools/gimpdrawtool.h | 33 +- app/tools/gimppaintbrushtool.c | 7 +- app/tools/gimppaintbrushtool.h | 4 +- app/tools/gimptool.c | 16 - app/tools/tool.c | 16 - app/widgets/gimpcontainergridview.c | 16 +- app/widgets/gimpcontainerlistview.c | 16 +- app/widgets/gimpcontainerview.c | 16 +- app/widgets/gimpcontainerview.h | 2 +- app/widgets/gimpdrawablelistview.c | 528 +++++++++++++++++++++++++ app/widgets/gimpdrawablelistview.h | 83 ++++ app/widgets/gimpdrawabletreeview.c | 528 +++++++++++++++++++++++++ app/widgets/gimpdrawabletreeview.h | 83 ++++ app/widgets/gimpitemfactory.c | 35 +- app/widgets/gimpitemlistview.c | 528 +++++++++++++++++++++++++ app/widgets/gimpitemlistview.h | 83 ++++ app/widgets/gimpitemtreeview.c | 528 +++++++++++++++++++++++++ app/widgets/gimpitemtreeview.h | 83 ++++ po/POTFILES.in | 6 +- 76 files changed, 5856 insertions(+), 3149 deletions(-) create mode 100644 app/gimpdrawablelistview.c create mode 100644 app/gimpdrawablelistview.h create mode 100644 app/gui/test-commands.c create mode 100644 app/gui/test-commands.h create mode 100644 app/test_commands.c create mode 100644 app/test_commands.h create mode 100644 app/widgets/gimpdrawablelistview.c create mode 100644 app/widgets/gimpdrawablelistview.h create mode 100644 app/widgets/gimpdrawabletreeview.c create mode 100644 app/widgets/gimpdrawabletreeview.h create mode 100644 app/widgets/gimpitemlistview.c create mode 100644 app/widgets/gimpitemlistview.h create mode 100644 app/widgets/gimpitemtreeview.c create mode 100644 app/widgets/gimpitemtreeview.h diff --git a/ChangeLog b/ChangeLog index f0830468bf..e9d9ca8486 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,47 @@ +2001-02-27 Michael Natterer + + * app/apptypes.h + * app/Makefile.am + * app/gimpdrawablelistview.[ch]: new widget. The upcoming replacement + for the layers and channels dialogs. + + * app/test_commands.[ch]: put the test dialogs here... + + * app/commands.[ch]: ... and made this one clean again. + + * app/gimpcontainergridview.c + * app/gimpcontainerlistview.c + * app/gimpcontainerview.[ch]: some signal handling fine tuning. + + * app/gimpimage.[ch]: emits "active_layer_changed" and + "active_channel_changed" signals now. The semantics of + gimage->active_layer and gimage->active_channel have changed a bit. + We now have either an active layer _or_ and active channel (there + is no active layer any more if a channel is active). + + * app/channel_ops.c + * app/floating_sel.c + * app/gdisplay.c + * app/layers_dialog.c + * app/menus.c: changed accordingly. + + * app/tools/gimpcolorpickertool.c: actually assign the draw_class + vraiable in the class_init function. + + * app/tools/gimpdrawtool.[ch] + * app/tools/tool.c: removed the _new() functions because these + objects are abstract superclasses. Did some cleanup. + Nathan, please configure you editor to _not_ produce any tabs + in the source code. + + * app/tools/gimppaintbrushtool.[ch]: "blurb" and "help" are tagged + with _(), not N_(). Put the register function to the header. + + * po/POTFILES.in: made it compile again. + 2001-02-26 Nathan Summers -app/tools/gimpdrawtool.c + + * app/tools/gimpdrawtool.c * app/tools/gimpdrawtool.h * app/tools/gimppainttool.c * app/tools/gimppainttool.h @@ -79,8 +121,8 @@ app/tools/gimpdrawtool.c * plug-ins/libgck/gck/Makefile.am: made linking against stable GIMP installed in the same prefix work again by renaming all our libraries explicitly to libgimp-1.3.* (not as part of the - libtool revision but as part of the library name). Removed the - libtool revision to avoid double versioning. This has to be + libtool release but as part of the library name). Removed the + libtool release to avoid double versioning. This has to be hardcoded in the libraries' Makefile.am ... * app/Makefile.am @@ -115,7 +157,7 @@ app/tools/gimpdrawtool.c * plug-ins/sgi/Makefile.am * plug-ins/webbrowser/Makefile.am * plug-ins/xjt/Makefile.am: ... while all other Makefiles can simply - link against "libgimp-$(LT_REVISION).la" + link against "libgimp-$(LT_RELEASE).la" 2001-02-24 Michael Natterer diff --git a/app/Makefile.am b/app/Makefile.am index c3e59c284f..c10ef6c290 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -245,6 +245,8 @@ gimp_SOURCES = \ selection.h \ session.h \ session.c \ + test_commands.c \ + test_commands.h \ tips_dialog.c \ tips_dialog.h \ toolbox.c \ @@ -291,6 +293,8 @@ gimp_SOURCES = \ gimpcontainerview.c \ gimpdatafactoryview.h \ gimpdatafactoryview.c \ + gimpdrawablelistview.c \ + gimpdrawablelistview.h \ gimpdrawablepreview.c \ gimpdrawablepreview.h \ gimpgradientpreview.h \ diff --git a/app/actions/help-commands.c b/app/actions/help-commands.c index f92ff8fca8..33e87730c2 100644 --- a/app/actions/help-commands.c +++ b/app/actions/help-commands.c @@ -52,6 +52,7 @@ #include "floating_sel.h" #include "gdisplay_ops.h" #include "gimage_mask.h" +#include "gimpcontainer.h" #include "gimpcontext.h" #include "gimpdrawable.h" #include "gimphelp.h" @@ -82,17 +83,6 @@ #include "undo.h" #include "undo_history.h" - -/* for the example dialogs */ -#include "gradient_editor.h" -#include "gimpcontainer.h" -#include "gimpcontainerlistview.h" -#include "gimpcontainergridview.h" -#include "gimpdatafactory.h" -#include "gimpdatafactoryview.h" -#include "gimppreview.h" - - #ifdef DISPLAY_FILTERS #include "gdisplay_color_ui.h" #endif /* DISPLAY_FILTERS */ @@ -1381,575 +1371,6 @@ dialogs_module_browser_cmd_callback (GtkWidget *widget, gtk_widget_show (module_browser); } -/***** Container View Test Dialogs *****/ - -static void -container_view_scale_callback (GtkAdjustment *adj, - GimpContainerView *view) -{ - gimp_container_view_set_preview_size (view, ROUND (adj->value)); -} - -static void -brushes_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_brush_factory->container); -} - -static void -patterns_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_pattern_factory->container); -} - -static void -gradients_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_gradient_factory->container); -} - -static void -palettes_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_palette_factory->container); -} - -static void -images_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, image_context); -} - -/* -static void -null_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, NULL); -} -*/ - -static void -container_view_new (gboolean list, - gchar *title, - GimpContainer *container, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - - if (list) - { - view = gimp_container_list_view_new (container, - context, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (container, - context, - preview_size, - 5, 5); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - /* - gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 1))); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - view); - - gtk_widget_show (dialog); -} - -static void -data_factory_view_new (GimpViewType view_type, - gchar *title, - GimpDataFactory *factory, - GimpDataEditFunc edit_func, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - - view = gimp_data_factory_view_new (view_type, - factory, - edit_func, - context, - preview_size, - 5, 5); - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - GIMP_DATA_FACTORY_VIEW (view)->view); - - gtk_widget_show (dialog); -} - -static void -container_multi_view_new (gboolean list, - gchar *title, - GimpContainer *container, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - GtkWidget *preview; - - if (list) - { - view = gimp_container_list_view_new (container, - context, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (container, - context, - preview_size, - 5, 5); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "Images", images_callback, - view, NULL, NULL, FALSE, FALSE, - - /* - "NULL", null_callback, - view, NULL, NULL, FALSE, FALSE, - */ - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, FALSE, TRUE, - - NULL); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_brush (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (brushes_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "brush_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_pattern (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (patterns_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "pattern_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_gradient (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (gradients_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "gradient_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_palette (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (palettes_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "palette_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - /* - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_image (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (images_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "pattern_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 64, 4, 4, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - view); - - gtk_widget_show (dialog); -} - -void -dialogs_test_image_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_view_new (TRUE, "Image List", - image_context, - gimp_context_get_user (), - 64); -} - -void -dialogs_test_image_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_view_new (FALSE, "Image Grid", - image_context, - gimp_context_get_user (), - 64); -} - -void -dialogs_test_brush_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Brush List", - global_brush_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_pattern_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Pattern List", - global_pattern_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_gradient_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Gradient List", - global_gradient_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_palette_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Palette List", - global_palette_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_brush_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Brush Grid", - global_brush_factory, - NULL, - gimp_context_get_user (), - 32); -} - -void -dialogs_test_pattern_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Pattern Grid", - global_pattern_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_gradient_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Gradient Grid", - global_gradient_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_palette_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Palette Grid", - global_palette_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_multi_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_multi_view_new (TRUE, "Multi List", - global_brush_factory->container, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_multi_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_multi_view_new (FALSE, "Multi Grid", - global_brush_factory->container, - gimp_context_get_user (), - 32); -} - -static void -layers_view_image_changed (GimpContext *context, - GimpImage *gimage, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, gimage ? gimage->layers : NULL); -} - -static void -channels_view_image_changed (GimpContext *context, - GimpImage *gimage, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, gimage ? gimage->channels : NULL); -} - -static void -drawable_view_new (GimpViewType view_type, - gchar *title, - gboolean channels, - GimpContext *context) -{ - GimpImage *gimage; - GtkWidget *dialog; - GtkWidget *view; - - if (view_type == GIMP_VIEW_TYPE_LIST) - { - view = gimp_container_list_view_new (NULL, - NULL, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (NULL, - NULL, - preview_size, - 5, 5); - } - - gimage = gimp_context_get_image (context); - - if (channels) - { - if (gimage) - gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), - gimage->channels); - - gtk_signal_connect (GTK_OBJECT (context), "image_changed", - GTK_SIGNAL_FUNC (channels_view_image_changed), - view); - } - else - { - if (gimage) - gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), - gimage->layers); - - gtk_signal_connect (GTK_OBJECT (context), "image_changed", - GTK_SIGNAL_FUNC (layers_view_image_changed), - view); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - /* - gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 1))); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - gtk_widget_show (dialog); -} - -void -dialogs_test_layer_list_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_LIST, "Layer List", FALSE, - gimp_context_get_user ()); -} - -void -dialogs_test_layer_grid_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_GRID, "Layer Grid", FALSE, - gimp_context_get_user ()); -} - -void -dialogs_test_channel_list_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_LIST, "Channel List", TRUE, - gimp_context_get_user ()); -} - -void -dialogs_test_channel_grid_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_GRID, "Channel Grid", TRUE, - gimp_context_get_user ()); -} /***** Help *****/ diff --git a/app/actions/help-commands.h b/app/actions/help-commands.h index 68dde288cf..e8bac6c04f 100644 --- a/app/actions/help-commands.h +++ b/app/actions/help-commands.h @@ -20,31 +20,31 @@ #define __COMMANDS_H__ -void file_new_cmd_callback (GtkWidget *, gpointer, guint); -void file_open_cmd_callback (GtkWidget *, gpointer); -void file_save_cmd_callback (GtkWidget *, gpointer); -void file_save_as_cmd_callback (GtkWidget *, gpointer); -void file_save_a_copy_as_cmd_callback (GtkWidget *, gpointer); -void file_revert_cmd_callback (GtkWidget *, gpointer); -void file_pref_cmd_callback (GtkWidget *, gpointer); -void file_close_cmd_callback (GtkWidget *, gpointer); -void file_quit_cmd_callback (GtkWidget *, gpointer); +void file_new_cmd_callback (GtkWidget *, gpointer, guint); +void file_open_cmd_callback (GtkWidget *, gpointer); +void file_save_cmd_callback (GtkWidget *, gpointer); +void file_save_as_cmd_callback (GtkWidget *, gpointer); +void file_save_a_copy_as_cmd_callback (GtkWidget *, gpointer); +void file_revert_cmd_callback (GtkWidget *, gpointer); +void file_pref_cmd_callback (GtkWidget *, gpointer); +void file_close_cmd_callback (GtkWidget *, gpointer); +void file_quit_cmd_callback (GtkWidget *, gpointer); -void edit_undo_cmd_callback (GtkWidget *, gpointer); -void edit_redo_cmd_callback (GtkWidget *, gpointer); -void edit_cut_cmd_callback (GtkWidget *, gpointer); -void edit_copy_cmd_callback (GtkWidget *, gpointer); -void edit_paste_cmd_callback (GtkWidget *, gpointer); -void edit_paste_into_cmd_callback (GtkWidget *, gpointer); -void edit_paste_as_new_cmd_callback (GtkWidget *, gpointer); -void edit_named_cut_cmd_callback (GtkWidget *, gpointer); -void edit_named_copy_cmd_callback (GtkWidget *, gpointer); -void edit_named_paste_cmd_callback (GtkWidget *, gpointer); -void edit_clear_cmd_callback (GtkWidget *, gpointer); -void edit_fill_cmd_callback (GtkWidget *widget, - gpointer callback_data, - guint callback_action); -void edit_stroke_cmd_callback (GtkWidget *, gpointer); +void edit_undo_cmd_callback (GtkWidget *, gpointer); +void edit_redo_cmd_callback (GtkWidget *, gpointer); +void edit_cut_cmd_callback (GtkWidget *, gpointer); +void edit_copy_cmd_callback (GtkWidget *, gpointer); +void edit_paste_cmd_callback (GtkWidget *, gpointer); +void edit_paste_into_cmd_callback (GtkWidget *, gpointer); +void edit_paste_as_new_cmd_callback (GtkWidget *, gpointer); +void edit_named_cut_cmd_callback (GtkWidget *, gpointer); +void edit_named_copy_cmd_callback (GtkWidget *, gpointer); +void edit_named_paste_cmd_callback (GtkWidget *, gpointer); +void edit_clear_cmd_callback (GtkWidget *, gpointer); +void edit_fill_cmd_callback (GtkWidget *widget, + gpointer callback_data, + guint callback_action); +void edit_stroke_cmd_callback (GtkWidget *, gpointer); void select_invert_cmd_callback (GtkWidget *, gpointer); void select_all_cmd_callback (GtkWidget *, gpointer); @@ -129,37 +129,16 @@ void dialogs_device_status_cmd_callback (GtkWidget *, gpointer); void dialogs_document_index_cmd_callback (GtkWidget *, gpointer); void dialogs_error_console_cmd_callback (GtkWidget *, gpointer); void dialogs_undo_history_cmd_callback (GtkWidget *, gpointer); - void dialogs_module_browser_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_image_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_image_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_brush_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_pattern_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_gradient_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_palette_container_list_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_brush_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_pattern_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_gradient_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_palette_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_multi_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_multi_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_layer_list_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_layer_grid_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_channel_list_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_channel_grid_cmd_callback (GtkWidget *, gpointer); - -void help_help_cmd_callback (GtkWidget *, gpointer); -void help_context_help_cmd_callback (GtkWidget *, gpointer); -void help_tips_cmd_callback (GtkWidget *, gpointer); -void help_about_cmd_callback (GtkWidget *, gpointer); - #ifdef DISPLAY_FILTERS -void dialogs_display_filters_cmd_callback (GtkWidget *, gpointer); +void dialogs_display_filters_cmd_callback (GtkWidget *, gpointer); #endif /* DISPLAY_FILTERS */ +void help_help_cmd_callback (GtkWidget *, gpointer); +void help_context_help_cmd_callback (GtkWidget *, gpointer); +void help_tips_cmd_callback (GtkWidget *, gpointer); +void help_about_cmd_callback (GtkWidget *, gpointer); + + #endif /* __COMMANDS_H__ */ diff --git a/app/apptypes.h b/app/apptypes.h index 4ca8c98a37..d8a6499682 100644 --- a/app/apptypes.h +++ b/app/apptypes.h @@ -78,6 +78,8 @@ typedef struct _GimpPalette GimpPalette; typedef struct _GimpToolInfo GimpToolInfo; typedef struct _GimpTool GimpTool; +typedef struct _GimpPaintTool GimpPaintTool; +typedef struct _GimpDrawTool GimpDrawTool; /* widgets */ @@ -95,6 +97,7 @@ typedef struct _GimpContainerView GimpContainerView; typedef struct _GimpContainerListView GimpContainerListView; typedef struct _GimpContainerGridView GimpContainerGridView; typedef struct _GimpDataFactoryView GimpDataFactoryView; +typedef struct _GimpDrawableListView GimpDrawableListView; typedef struct _HistogramWidget HistogramWidget; @@ -111,12 +114,8 @@ typedef struct _BoundSeg BoundSeg; typedef struct _ColorNotebook ColorNotebook; -typedef struct _GimpDrawTool GimpDrawTool; - typedef struct _GDisplay GDisplay; -typedef struct _GimpContextPreview GimpContextPreview; - typedef struct _GimpHistogram GimpHistogram; typedef struct _GimpImageNewValues GimpImageNewValues; @@ -133,8 +132,6 @@ typedef gpointer ImageMap; typedef struct _InfoDialog InfoDialog; -typedef struct _GimpPaintTool GimpPaintTool; - typedef struct _Path Path; typedef struct _PathPoint PathPoint; typedef struct _PathList PathList; diff --git a/app/channel_ops.c b/app/channel_ops.c index 11e5390c1e..5fcac39216 100644 --- a/app/channel_ops.c +++ b/app/channel_ops.c @@ -575,11 +575,11 @@ duplicate (GimpImage *gimage) GimpLayer *floating_layer; GimpChannel *channel, *new_channel; GList *list; - Guide *guide = NULL; - GimpLayer *active_layer = NULL; - GimpChannel *active_channel = NULL; + Guide *guide = NULL; + GimpLayer *active_layer = NULL; + GimpChannel *active_channel = NULL; GimpDrawable *new_floating_sel_drawable = NULL; - GimpDrawable *floating_sel_drawable = NULL; + GimpDrawable *floating_sel_drawable = NULL; ParasiteList *parasites; PathList *paths; gint count; diff --git a/app/commands.c b/app/commands.c index f92ff8fca8..33e87730c2 100644 --- a/app/commands.c +++ b/app/commands.c @@ -52,6 +52,7 @@ #include "floating_sel.h" #include "gdisplay_ops.h" #include "gimage_mask.h" +#include "gimpcontainer.h" #include "gimpcontext.h" #include "gimpdrawable.h" #include "gimphelp.h" @@ -82,17 +83,6 @@ #include "undo.h" #include "undo_history.h" - -/* for the example dialogs */ -#include "gradient_editor.h" -#include "gimpcontainer.h" -#include "gimpcontainerlistview.h" -#include "gimpcontainergridview.h" -#include "gimpdatafactory.h" -#include "gimpdatafactoryview.h" -#include "gimppreview.h" - - #ifdef DISPLAY_FILTERS #include "gdisplay_color_ui.h" #endif /* DISPLAY_FILTERS */ @@ -1381,575 +1371,6 @@ dialogs_module_browser_cmd_callback (GtkWidget *widget, gtk_widget_show (module_browser); } -/***** Container View Test Dialogs *****/ - -static void -container_view_scale_callback (GtkAdjustment *adj, - GimpContainerView *view) -{ - gimp_container_view_set_preview_size (view, ROUND (adj->value)); -} - -static void -brushes_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_brush_factory->container); -} - -static void -patterns_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_pattern_factory->container); -} - -static void -gradients_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_gradient_factory->container); -} - -static void -palettes_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_palette_factory->container); -} - -static void -images_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, image_context); -} - -/* -static void -null_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, NULL); -} -*/ - -static void -container_view_new (gboolean list, - gchar *title, - GimpContainer *container, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - - if (list) - { - view = gimp_container_list_view_new (container, - context, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (container, - context, - preview_size, - 5, 5); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - /* - gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 1))); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - view); - - gtk_widget_show (dialog); -} - -static void -data_factory_view_new (GimpViewType view_type, - gchar *title, - GimpDataFactory *factory, - GimpDataEditFunc edit_func, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - - view = gimp_data_factory_view_new (view_type, - factory, - edit_func, - context, - preview_size, - 5, 5); - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - GIMP_DATA_FACTORY_VIEW (view)->view); - - gtk_widget_show (dialog); -} - -static void -container_multi_view_new (gboolean list, - gchar *title, - GimpContainer *container, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - GtkWidget *preview; - - if (list) - { - view = gimp_container_list_view_new (container, - context, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (container, - context, - preview_size, - 5, 5); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "Images", images_callback, - view, NULL, NULL, FALSE, FALSE, - - /* - "NULL", null_callback, - view, NULL, NULL, FALSE, FALSE, - */ - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, FALSE, TRUE, - - NULL); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_brush (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (brushes_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "brush_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_pattern (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (patterns_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "pattern_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_gradient (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (gradients_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "gradient_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_palette (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (palettes_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "palette_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - /* - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_image (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (images_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "pattern_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 64, 4, 4, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - view); - - gtk_widget_show (dialog); -} - -void -dialogs_test_image_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_view_new (TRUE, "Image List", - image_context, - gimp_context_get_user (), - 64); -} - -void -dialogs_test_image_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_view_new (FALSE, "Image Grid", - image_context, - gimp_context_get_user (), - 64); -} - -void -dialogs_test_brush_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Brush List", - global_brush_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_pattern_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Pattern List", - global_pattern_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_gradient_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Gradient List", - global_gradient_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_palette_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Palette List", - global_palette_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_brush_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Brush Grid", - global_brush_factory, - NULL, - gimp_context_get_user (), - 32); -} - -void -dialogs_test_pattern_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Pattern Grid", - global_pattern_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_gradient_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Gradient Grid", - global_gradient_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_palette_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Palette Grid", - global_palette_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_multi_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_multi_view_new (TRUE, "Multi List", - global_brush_factory->container, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_multi_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_multi_view_new (FALSE, "Multi Grid", - global_brush_factory->container, - gimp_context_get_user (), - 32); -} - -static void -layers_view_image_changed (GimpContext *context, - GimpImage *gimage, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, gimage ? gimage->layers : NULL); -} - -static void -channels_view_image_changed (GimpContext *context, - GimpImage *gimage, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, gimage ? gimage->channels : NULL); -} - -static void -drawable_view_new (GimpViewType view_type, - gchar *title, - gboolean channels, - GimpContext *context) -{ - GimpImage *gimage; - GtkWidget *dialog; - GtkWidget *view; - - if (view_type == GIMP_VIEW_TYPE_LIST) - { - view = gimp_container_list_view_new (NULL, - NULL, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (NULL, - NULL, - preview_size, - 5, 5); - } - - gimage = gimp_context_get_image (context); - - if (channels) - { - if (gimage) - gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), - gimage->channels); - - gtk_signal_connect (GTK_OBJECT (context), "image_changed", - GTK_SIGNAL_FUNC (channels_view_image_changed), - view); - } - else - { - if (gimage) - gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), - gimage->layers); - - gtk_signal_connect (GTK_OBJECT (context), "image_changed", - GTK_SIGNAL_FUNC (layers_view_image_changed), - view); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - /* - gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 1))); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - gtk_widget_show (dialog); -} - -void -dialogs_test_layer_list_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_LIST, "Layer List", FALSE, - gimp_context_get_user ()); -} - -void -dialogs_test_layer_grid_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_GRID, "Layer Grid", FALSE, - gimp_context_get_user ()); -} - -void -dialogs_test_channel_list_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_LIST, "Channel List", TRUE, - gimp_context_get_user ()); -} - -void -dialogs_test_channel_grid_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_GRID, "Channel Grid", TRUE, - gimp_context_get_user ()); -} /***** Help *****/ diff --git a/app/commands.h b/app/commands.h index 68dde288cf..e8bac6c04f 100644 --- a/app/commands.h +++ b/app/commands.h @@ -20,31 +20,31 @@ #define __COMMANDS_H__ -void file_new_cmd_callback (GtkWidget *, gpointer, guint); -void file_open_cmd_callback (GtkWidget *, gpointer); -void file_save_cmd_callback (GtkWidget *, gpointer); -void file_save_as_cmd_callback (GtkWidget *, gpointer); -void file_save_a_copy_as_cmd_callback (GtkWidget *, gpointer); -void file_revert_cmd_callback (GtkWidget *, gpointer); -void file_pref_cmd_callback (GtkWidget *, gpointer); -void file_close_cmd_callback (GtkWidget *, gpointer); -void file_quit_cmd_callback (GtkWidget *, gpointer); +void file_new_cmd_callback (GtkWidget *, gpointer, guint); +void file_open_cmd_callback (GtkWidget *, gpointer); +void file_save_cmd_callback (GtkWidget *, gpointer); +void file_save_as_cmd_callback (GtkWidget *, gpointer); +void file_save_a_copy_as_cmd_callback (GtkWidget *, gpointer); +void file_revert_cmd_callback (GtkWidget *, gpointer); +void file_pref_cmd_callback (GtkWidget *, gpointer); +void file_close_cmd_callback (GtkWidget *, gpointer); +void file_quit_cmd_callback (GtkWidget *, gpointer); -void edit_undo_cmd_callback (GtkWidget *, gpointer); -void edit_redo_cmd_callback (GtkWidget *, gpointer); -void edit_cut_cmd_callback (GtkWidget *, gpointer); -void edit_copy_cmd_callback (GtkWidget *, gpointer); -void edit_paste_cmd_callback (GtkWidget *, gpointer); -void edit_paste_into_cmd_callback (GtkWidget *, gpointer); -void edit_paste_as_new_cmd_callback (GtkWidget *, gpointer); -void edit_named_cut_cmd_callback (GtkWidget *, gpointer); -void edit_named_copy_cmd_callback (GtkWidget *, gpointer); -void edit_named_paste_cmd_callback (GtkWidget *, gpointer); -void edit_clear_cmd_callback (GtkWidget *, gpointer); -void edit_fill_cmd_callback (GtkWidget *widget, - gpointer callback_data, - guint callback_action); -void edit_stroke_cmd_callback (GtkWidget *, gpointer); +void edit_undo_cmd_callback (GtkWidget *, gpointer); +void edit_redo_cmd_callback (GtkWidget *, gpointer); +void edit_cut_cmd_callback (GtkWidget *, gpointer); +void edit_copy_cmd_callback (GtkWidget *, gpointer); +void edit_paste_cmd_callback (GtkWidget *, gpointer); +void edit_paste_into_cmd_callback (GtkWidget *, gpointer); +void edit_paste_as_new_cmd_callback (GtkWidget *, gpointer); +void edit_named_cut_cmd_callback (GtkWidget *, gpointer); +void edit_named_copy_cmd_callback (GtkWidget *, gpointer); +void edit_named_paste_cmd_callback (GtkWidget *, gpointer); +void edit_clear_cmd_callback (GtkWidget *, gpointer); +void edit_fill_cmd_callback (GtkWidget *widget, + gpointer callback_data, + guint callback_action); +void edit_stroke_cmd_callback (GtkWidget *, gpointer); void select_invert_cmd_callback (GtkWidget *, gpointer); void select_all_cmd_callback (GtkWidget *, gpointer); @@ -129,37 +129,16 @@ void dialogs_device_status_cmd_callback (GtkWidget *, gpointer); void dialogs_document_index_cmd_callback (GtkWidget *, gpointer); void dialogs_error_console_cmd_callback (GtkWidget *, gpointer); void dialogs_undo_history_cmd_callback (GtkWidget *, gpointer); - void dialogs_module_browser_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_image_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_image_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_brush_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_pattern_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_gradient_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_palette_container_list_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_brush_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_pattern_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_gradient_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_palette_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_multi_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_multi_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_layer_list_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_layer_grid_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_channel_list_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_channel_grid_cmd_callback (GtkWidget *, gpointer); - -void help_help_cmd_callback (GtkWidget *, gpointer); -void help_context_help_cmd_callback (GtkWidget *, gpointer); -void help_tips_cmd_callback (GtkWidget *, gpointer); -void help_about_cmd_callback (GtkWidget *, gpointer); - #ifdef DISPLAY_FILTERS -void dialogs_display_filters_cmd_callback (GtkWidget *, gpointer); +void dialogs_display_filters_cmd_callback (GtkWidget *, gpointer); #endif /* DISPLAY_FILTERS */ +void help_help_cmd_callback (GtkWidget *, gpointer); +void help_context_help_cmd_callback (GtkWidget *, gpointer); +void help_tips_cmd_callback (GtkWidget *, gpointer); +void help_about_cmd_callback (GtkWidget *, gpointer); + + #endif /* __COMMANDS_H__ */ diff --git a/app/core/gimpdrawable-offset.c b/app/core/gimpdrawable-offset.c index 11e5390c1e..5fcac39216 100644 --- a/app/core/gimpdrawable-offset.c +++ b/app/core/gimpdrawable-offset.c @@ -575,11 +575,11 @@ duplicate (GimpImage *gimage) GimpLayer *floating_layer; GimpChannel *channel, *new_channel; GList *list; - Guide *guide = NULL; - GimpLayer *active_layer = NULL; - GimpChannel *active_channel = NULL; + Guide *guide = NULL; + GimpLayer *active_layer = NULL; + GimpChannel *active_channel = NULL; GimpDrawable *new_floating_sel_drawable = NULL; - GimpDrawable *floating_sel_drawable = NULL; + GimpDrawable *floating_sel_drawable = NULL; ParasiteList *parasites; PathList *paths; gint count; diff --git a/app/core/gimpimage-duplicate.c b/app/core/gimpimage-duplicate.c index 11e5390c1e..5fcac39216 100644 --- a/app/core/gimpimage-duplicate.c +++ b/app/core/gimpimage-duplicate.c @@ -575,11 +575,11 @@ duplicate (GimpImage *gimage) GimpLayer *floating_layer; GimpChannel *channel, *new_channel; GList *list; - Guide *guide = NULL; - GimpLayer *active_layer = NULL; - GimpChannel *active_channel = NULL; + Guide *guide = NULL; + GimpLayer *active_layer = NULL; + GimpChannel *active_channel = NULL; GimpDrawable *new_floating_sel_drawable = NULL; - GimpDrawable *floating_sel_drawable = NULL; + GimpDrawable *floating_sel_drawable = NULL; ParasiteList *parasites; PathList *paths; gint count; diff --git a/app/core/gimpimage-guides.c b/app/core/gimpimage-guides.c index 3017fc8ab0..56a8b02cb3 100644 --- a/app/core/gimpimage-guides.c +++ b/app/core/gimpimage-guides.c @@ -152,6 +152,8 @@ guint32 next_guide_id = 1; /* For generating guide_ID handles for PDB stuff */ enum { + ACTIVE_LAYER_CHANGED, + ACTIVE_CHANNEL_CHANGED, CLEAN, DIRTY, REPAINT, @@ -205,6 +207,24 @@ gimp_image_class_init (GimpImageClass *klass) parent_class = gtk_type_class (GIMP_TYPE_VIEWABLE); + gimp_image_signals[ACTIVE_LAYER_CHANGED] = + gtk_signal_new ("active_layer_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_layer_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + + gimp_image_signals[ACTIVE_CHANNEL_CHANGED] = + gtk_signal_new ("active_channel_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_channel_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + gimp_image_signals[CLEAN] = gtk_signal_new ("clean", GTK_RUN_FIRST, @@ -2133,6 +2153,24 @@ gimp_image_invalidate_channel_previews (GimpImage *gimage) NULL); } +GimpContainer * +gimp_image_get_layers (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->layers; +} + +GimpContainer * +gimp_image_get_channels (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->channels; +} + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer) @@ -2327,22 +2365,31 @@ gimp_image_set_active_layer (GimpImage *gimage, if (! gimp_container_have (gimage->layers, GIMP_OBJECT (layer))) layer = (GimpLayer *) gimp_container_get_child_by_index (gimage->layers, 0); - if (! layer) + if (layer) { - gimage->active_layer = NULL; - return NULL; + /* Configure the layer stack to reflect this change */ + gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); + gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + + /* invalidate the selection boundary because of a layer modification */ + gimp_layer_invalidate_boundary (layer); } - /* Configure the layer stack to reflect this change */ - gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); - gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + if (layer != gimage->active_layer) + { + gimage->active_layer = layer; - /* invalidate the selection boundary because of a layer modification */ - gimp_layer_invalidate_boundary (layer); + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); - /* Set the active layer */ - gimage->active_layer = layer; - gimage->active_channel = NULL; + if (gimage->active_channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + } + } /* return the layer */ return layer; @@ -2364,14 +2411,21 @@ gimp_image_set_active_channel (GimpImage *gimage, if (! gimp_container_have (gimage->channels, GIMP_OBJECT (channel))) channel = (GimpChannel *) gimp_container_get_child_by_index (gimage->channels, 0); - if (! channel) + if (channel != gimage->active_channel) { - gimage->active_channel = NULL; - return NULL; - } + gimage->active_channel = channel; - /* Set the active channel */ - gimage->active_channel = channel; + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->active_layer) + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } + } /* return the channel */ return channel; @@ -2384,12 +2438,24 @@ gimp_image_unset_active_channel (GimpImage *gimage) g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - /* make sure there is an active channel */ - if (! (channel = gimage->active_channel)) - return NULL; + channel = gimp_image_get_active_channel (gimage); - /* Set the active channel */ - gimage->active_channel = NULL; + if (channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->layer_stack) + { + GimpLayer *layer; + + layer = (GimpLayer *) gimage->layer_stack->data; + + gimp_image_set_active_layer (gimage, layer); + } + } return channel; } @@ -3125,7 +3191,7 @@ gimp_image_add_layer (GimpImage *gimage, /* let the layer know about the gimage */ gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - /* If the layer has a mask, set the mask's gimage and layer */ + /* If the layer has a mask, set the mask's gimage */ if (layer->mask) { gimp_drawable_set_gimage (GIMP_DRAWABLE (layer->mask), gimage); @@ -3133,18 +3199,30 @@ gimp_image_add_layer (GimpImage *gimage, /* add the layer to the list at the specified position */ if (position == -1) - position = - gimp_container_get_child_index (gimage->layers, - GIMP_OBJECT (gimage->active_layer)); - - if (position != -1) { - /* If there is a floating selection (and this isn't it!), - * make sure the insert position is greater than 0 - */ - if (gimp_image_floating_sel (gimage) && - (gimage->floating_sel != layer) && position == 0) - position = 1; + GimpLayer *active_layer; + + active_layer = gimp_image_get_active_layer (gimage); + + if (active_layer) + { + position = gimp_container_get_child_index (gimage->layers, + GIMP_OBJECT (active_layer)); + } + else + { + position = 0; + } + } + + /* If there is a floating selection (and this isn't it!), + * make sure the insert position is greater than 0 + */ + if (position == 0 && + gimp_image_floating_sel (gimage) && + (gimage->floating_sel != layer)) + { + position = 1; } gimp_container_insert (gimage->layers, GIMP_OBJECT (layer), position); @@ -3204,9 +3282,16 @@ gimp_image_remove_layer (GimpImage *gimage, if (layer == gimp_image_get_active_layer (gimage)) { if (gimage->layer_stack) - gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + { + gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + } else - gimage->active_layer = NULL; + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } } /* Send out REMOVED signal from layer */ @@ -3524,8 +3609,6 @@ gimp_image_is_empty (const GimpImage *gimage) GimpDrawable * gimp_image_active_drawable (const GimpImage *gimage) { - GimpLayer *layer; - g_return_val_if_fail (gimage != NULL, NULL); g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); @@ -3538,6 +3621,8 @@ gimp_image_active_drawable (const GimpImage *gimage) } else if (gimage->active_layer) { + GimpLayer *layer; + layer = gimage->active_layer; if (layer->mask && layer->edit_mask) diff --git a/app/core/gimpimage-guides.h b/app/core/gimpimage-guides.h index 805e30de37..9006493e57 100644 --- a/app/core/gimpimage-guides.h +++ b/app/core/gimpimage-guides.h @@ -142,13 +142,21 @@ struct _GimpImageClass { GimpViewableClass parent_class; - void (* clean) (GimpImage *gimage); - void (* dirty) (GimpImage *gimage); - void (* repaint) (GimpImage *gimage); - void (* resize) (GimpImage *gimage); - void (* restructure) (GimpImage *gimage); - void (* colormap_changed) (GimpImage *gimage); - void (* undo_event) (GimpImage *gimage); + void (* active_layer_changed) (GimpImage *gimage); + void (* active_channel_changed) (GimpImage *gimage); + void (* clean) (GimpImage *gimage); + void (* dirty) (GimpImage *gimage); + void (* repaint) (GimpImage *gimage, + gint x1, + gint y1, + gint x2, + gint y2); + void (* resize) (GimpImage *gimage); + void (* restructure) (GimpImage *gimage); + void (* colormap_changed) (GimpImage *gimage, + gint color_index); + void (* undo_event) (GimpImage *gimage, + gint event); }; @@ -283,6 +291,9 @@ void gimp_image_colormap_changed (const GimpImage *image, /* layer/channel functions */ +GimpContainer * gimp_image_get_layers (const GimpImage *gimage); +GimpContainer * gimp_image_get_channels (const GimpImage *gimage); + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer); gint gimp_image_get_channel_index (const GimpImage *gimage, diff --git a/app/core/gimpimage-merge.c b/app/core/gimpimage-merge.c index 3017fc8ab0..56a8b02cb3 100644 --- a/app/core/gimpimage-merge.c +++ b/app/core/gimpimage-merge.c @@ -152,6 +152,8 @@ guint32 next_guide_id = 1; /* For generating guide_ID handles for PDB stuff */ enum { + ACTIVE_LAYER_CHANGED, + ACTIVE_CHANNEL_CHANGED, CLEAN, DIRTY, REPAINT, @@ -205,6 +207,24 @@ gimp_image_class_init (GimpImageClass *klass) parent_class = gtk_type_class (GIMP_TYPE_VIEWABLE); + gimp_image_signals[ACTIVE_LAYER_CHANGED] = + gtk_signal_new ("active_layer_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_layer_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + + gimp_image_signals[ACTIVE_CHANNEL_CHANGED] = + gtk_signal_new ("active_channel_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_channel_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + gimp_image_signals[CLEAN] = gtk_signal_new ("clean", GTK_RUN_FIRST, @@ -2133,6 +2153,24 @@ gimp_image_invalidate_channel_previews (GimpImage *gimage) NULL); } +GimpContainer * +gimp_image_get_layers (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->layers; +} + +GimpContainer * +gimp_image_get_channels (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->channels; +} + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer) @@ -2327,22 +2365,31 @@ gimp_image_set_active_layer (GimpImage *gimage, if (! gimp_container_have (gimage->layers, GIMP_OBJECT (layer))) layer = (GimpLayer *) gimp_container_get_child_by_index (gimage->layers, 0); - if (! layer) + if (layer) { - gimage->active_layer = NULL; - return NULL; + /* Configure the layer stack to reflect this change */ + gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); + gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + + /* invalidate the selection boundary because of a layer modification */ + gimp_layer_invalidate_boundary (layer); } - /* Configure the layer stack to reflect this change */ - gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); - gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + if (layer != gimage->active_layer) + { + gimage->active_layer = layer; - /* invalidate the selection boundary because of a layer modification */ - gimp_layer_invalidate_boundary (layer); + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); - /* Set the active layer */ - gimage->active_layer = layer; - gimage->active_channel = NULL; + if (gimage->active_channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + } + } /* return the layer */ return layer; @@ -2364,14 +2411,21 @@ gimp_image_set_active_channel (GimpImage *gimage, if (! gimp_container_have (gimage->channels, GIMP_OBJECT (channel))) channel = (GimpChannel *) gimp_container_get_child_by_index (gimage->channels, 0); - if (! channel) + if (channel != gimage->active_channel) { - gimage->active_channel = NULL; - return NULL; - } + gimage->active_channel = channel; - /* Set the active channel */ - gimage->active_channel = channel; + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->active_layer) + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } + } /* return the channel */ return channel; @@ -2384,12 +2438,24 @@ gimp_image_unset_active_channel (GimpImage *gimage) g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - /* make sure there is an active channel */ - if (! (channel = gimage->active_channel)) - return NULL; + channel = gimp_image_get_active_channel (gimage); - /* Set the active channel */ - gimage->active_channel = NULL; + if (channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->layer_stack) + { + GimpLayer *layer; + + layer = (GimpLayer *) gimage->layer_stack->data; + + gimp_image_set_active_layer (gimage, layer); + } + } return channel; } @@ -3125,7 +3191,7 @@ gimp_image_add_layer (GimpImage *gimage, /* let the layer know about the gimage */ gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - /* If the layer has a mask, set the mask's gimage and layer */ + /* If the layer has a mask, set the mask's gimage */ if (layer->mask) { gimp_drawable_set_gimage (GIMP_DRAWABLE (layer->mask), gimage); @@ -3133,18 +3199,30 @@ gimp_image_add_layer (GimpImage *gimage, /* add the layer to the list at the specified position */ if (position == -1) - position = - gimp_container_get_child_index (gimage->layers, - GIMP_OBJECT (gimage->active_layer)); - - if (position != -1) { - /* If there is a floating selection (and this isn't it!), - * make sure the insert position is greater than 0 - */ - if (gimp_image_floating_sel (gimage) && - (gimage->floating_sel != layer) && position == 0) - position = 1; + GimpLayer *active_layer; + + active_layer = gimp_image_get_active_layer (gimage); + + if (active_layer) + { + position = gimp_container_get_child_index (gimage->layers, + GIMP_OBJECT (active_layer)); + } + else + { + position = 0; + } + } + + /* If there is a floating selection (and this isn't it!), + * make sure the insert position is greater than 0 + */ + if (position == 0 && + gimp_image_floating_sel (gimage) && + (gimage->floating_sel != layer)) + { + position = 1; } gimp_container_insert (gimage->layers, GIMP_OBJECT (layer), position); @@ -3204,9 +3282,16 @@ gimp_image_remove_layer (GimpImage *gimage, if (layer == gimp_image_get_active_layer (gimage)) { if (gimage->layer_stack) - gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + { + gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + } else - gimage->active_layer = NULL; + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } } /* Send out REMOVED signal from layer */ @@ -3524,8 +3609,6 @@ gimp_image_is_empty (const GimpImage *gimage) GimpDrawable * gimp_image_active_drawable (const GimpImage *gimage) { - GimpLayer *layer; - g_return_val_if_fail (gimage != NULL, NULL); g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); @@ -3538,6 +3621,8 @@ gimp_image_active_drawable (const GimpImage *gimage) } else if (gimage->active_layer) { + GimpLayer *layer; + layer = gimage->active_layer; if (layer->mask && layer->edit_mask) diff --git a/app/core/gimpimage-merge.h b/app/core/gimpimage-merge.h index 805e30de37..9006493e57 100644 --- a/app/core/gimpimage-merge.h +++ b/app/core/gimpimage-merge.h @@ -142,13 +142,21 @@ struct _GimpImageClass { GimpViewableClass parent_class; - void (* clean) (GimpImage *gimage); - void (* dirty) (GimpImage *gimage); - void (* repaint) (GimpImage *gimage); - void (* resize) (GimpImage *gimage); - void (* restructure) (GimpImage *gimage); - void (* colormap_changed) (GimpImage *gimage); - void (* undo_event) (GimpImage *gimage); + void (* active_layer_changed) (GimpImage *gimage); + void (* active_channel_changed) (GimpImage *gimage); + void (* clean) (GimpImage *gimage); + void (* dirty) (GimpImage *gimage); + void (* repaint) (GimpImage *gimage, + gint x1, + gint y1, + gint x2, + gint y2); + void (* resize) (GimpImage *gimage); + void (* restructure) (GimpImage *gimage); + void (* colormap_changed) (GimpImage *gimage, + gint color_index); + void (* undo_event) (GimpImage *gimage, + gint event); }; @@ -283,6 +291,9 @@ void gimp_image_colormap_changed (const GimpImage *image, /* layer/channel functions */ +GimpContainer * gimp_image_get_layers (const GimpImage *gimage); +GimpContainer * gimp_image_get_channels (const GimpImage *gimage); + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer); gint gimp_image_get_channel_index (const GimpImage *gimage, diff --git a/app/core/gimpimage-pick-color.c b/app/core/gimpimage-pick-color.c index aceb514238..768431205f 100644 --- a/app/core/gimpimage-pick-color.c +++ b/app/core/gimpimage-pick-color.c @@ -195,6 +195,7 @@ gimp_color_picker_tool_class_init (GimpColorPickerToolClass *klass) object_class = (GtkObjectClass *) klass; tool_class = (GimpToolClass *) klass; + draw_class = (GimpDrawToolClass *) klass; parent_class = gtk_type_class (GIMP_TYPE_DRAW_TOOL); diff --git a/app/core/gimpimage-projection.c b/app/core/gimpimage-projection.c index 3017fc8ab0..56a8b02cb3 100644 --- a/app/core/gimpimage-projection.c +++ b/app/core/gimpimage-projection.c @@ -152,6 +152,8 @@ guint32 next_guide_id = 1; /* For generating guide_ID handles for PDB stuff */ enum { + ACTIVE_LAYER_CHANGED, + ACTIVE_CHANNEL_CHANGED, CLEAN, DIRTY, REPAINT, @@ -205,6 +207,24 @@ gimp_image_class_init (GimpImageClass *klass) parent_class = gtk_type_class (GIMP_TYPE_VIEWABLE); + gimp_image_signals[ACTIVE_LAYER_CHANGED] = + gtk_signal_new ("active_layer_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_layer_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + + gimp_image_signals[ACTIVE_CHANNEL_CHANGED] = + gtk_signal_new ("active_channel_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_channel_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + gimp_image_signals[CLEAN] = gtk_signal_new ("clean", GTK_RUN_FIRST, @@ -2133,6 +2153,24 @@ gimp_image_invalidate_channel_previews (GimpImage *gimage) NULL); } +GimpContainer * +gimp_image_get_layers (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->layers; +} + +GimpContainer * +gimp_image_get_channels (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->channels; +} + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer) @@ -2327,22 +2365,31 @@ gimp_image_set_active_layer (GimpImage *gimage, if (! gimp_container_have (gimage->layers, GIMP_OBJECT (layer))) layer = (GimpLayer *) gimp_container_get_child_by_index (gimage->layers, 0); - if (! layer) + if (layer) { - gimage->active_layer = NULL; - return NULL; + /* Configure the layer stack to reflect this change */ + gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); + gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + + /* invalidate the selection boundary because of a layer modification */ + gimp_layer_invalidate_boundary (layer); } - /* Configure the layer stack to reflect this change */ - gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); - gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + if (layer != gimage->active_layer) + { + gimage->active_layer = layer; - /* invalidate the selection boundary because of a layer modification */ - gimp_layer_invalidate_boundary (layer); + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); - /* Set the active layer */ - gimage->active_layer = layer; - gimage->active_channel = NULL; + if (gimage->active_channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + } + } /* return the layer */ return layer; @@ -2364,14 +2411,21 @@ gimp_image_set_active_channel (GimpImage *gimage, if (! gimp_container_have (gimage->channels, GIMP_OBJECT (channel))) channel = (GimpChannel *) gimp_container_get_child_by_index (gimage->channels, 0); - if (! channel) + if (channel != gimage->active_channel) { - gimage->active_channel = NULL; - return NULL; - } + gimage->active_channel = channel; - /* Set the active channel */ - gimage->active_channel = channel; + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->active_layer) + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } + } /* return the channel */ return channel; @@ -2384,12 +2438,24 @@ gimp_image_unset_active_channel (GimpImage *gimage) g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - /* make sure there is an active channel */ - if (! (channel = gimage->active_channel)) - return NULL; + channel = gimp_image_get_active_channel (gimage); - /* Set the active channel */ - gimage->active_channel = NULL; + if (channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->layer_stack) + { + GimpLayer *layer; + + layer = (GimpLayer *) gimage->layer_stack->data; + + gimp_image_set_active_layer (gimage, layer); + } + } return channel; } @@ -3125,7 +3191,7 @@ gimp_image_add_layer (GimpImage *gimage, /* let the layer know about the gimage */ gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - /* If the layer has a mask, set the mask's gimage and layer */ + /* If the layer has a mask, set the mask's gimage */ if (layer->mask) { gimp_drawable_set_gimage (GIMP_DRAWABLE (layer->mask), gimage); @@ -3133,18 +3199,30 @@ gimp_image_add_layer (GimpImage *gimage, /* add the layer to the list at the specified position */ if (position == -1) - position = - gimp_container_get_child_index (gimage->layers, - GIMP_OBJECT (gimage->active_layer)); - - if (position != -1) { - /* If there is a floating selection (and this isn't it!), - * make sure the insert position is greater than 0 - */ - if (gimp_image_floating_sel (gimage) && - (gimage->floating_sel != layer) && position == 0) - position = 1; + GimpLayer *active_layer; + + active_layer = gimp_image_get_active_layer (gimage); + + if (active_layer) + { + position = gimp_container_get_child_index (gimage->layers, + GIMP_OBJECT (active_layer)); + } + else + { + position = 0; + } + } + + /* If there is a floating selection (and this isn't it!), + * make sure the insert position is greater than 0 + */ + if (position == 0 && + gimp_image_floating_sel (gimage) && + (gimage->floating_sel != layer)) + { + position = 1; } gimp_container_insert (gimage->layers, GIMP_OBJECT (layer), position); @@ -3204,9 +3282,16 @@ gimp_image_remove_layer (GimpImage *gimage, if (layer == gimp_image_get_active_layer (gimage)) { if (gimage->layer_stack) - gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + { + gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + } else - gimage->active_layer = NULL; + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } } /* Send out REMOVED signal from layer */ @@ -3524,8 +3609,6 @@ gimp_image_is_empty (const GimpImage *gimage) GimpDrawable * gimp_image_active_drawable (const GimpImage *gimage) { - GimpLayer *layer; - g_return_val_if_fail (gimage != NULL, NULL); g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); @@ -3538,6 +3621,8 @@ gimp_image_active_drawable (const GimpImage *gimage) } else if (gimage->active_layer) { + GimpLayer *layer; + layer = gimage->active_layer; if (layer->mask && layer->edit_mask) diff --git a/app/core/gimpimage-projection.h b/app/core/gimpimage-projection.h index 805e30de37..9006493e57 100644 --- a/app/core/gimpimage-projection.h +++ b/app/core/gimpimage-projection.h @@ -142,13 +142,21 @@ struct _GimpImageClass { GimpViewableClass parent_class; - void (* clean) (GimpImage *gimage); - void (* dirty) (GimpImage *gimage); - void (* repaint) (GimpImage *gimage); - void (* resize) (GimpImage *gimage); - void (* restructure) (GimpImage *gimage); - void (* colormap_changed) (GimpImage *gimage); - void (* undo_event) (GimpImage *gimage); + void (* active_layer_changed) (GimpImage *gimage); + void (* active_channel_changed) (GimpImage *gimage); + void (* clean) (GimpImage *gimage); + void (* dirty) (GimpImage *gimage); + void (* repaint) (GimpImage *gimage, + gint x1, + gint y1, + gint x2, + gint y2); + void (* resize) (GimpImage *gimage); + void (* restructure) (GimpImage *gimage); + void (* colormap_changed) (GimpImage *gimage, + gint color_index); + void (* undo_event) (GimpImage *gimage, + gint event); }; @@ -283,6 +291,9 @@ void gimp_image_colormap_changed (const GimpImage *image, /* layer/channel functions */ +GimpContainer * gimp_image_get_layers (const GimpImage *gimage); +GimpContainer * gimp_image_get_channels (const GimpImage *gimage); + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer); gint gimp_image_get_channel_index (const GimpImage *gimage, diff --git a/app/core/gimpimage-resize.c b/app/core/gimpimage-resize.c index 3017fc8ab0..56a8b02cb3 100644 --- a/app/core/gimpimage-resize.c +++ b/app/core/gimpimage-resize.c @@ -152,6 +152,8 @@ guint32 next_guide_id = 1; /* For generating guide_ID handles for PDB stuff */ enum { + ACTIVE_LAYER_CHANGED, + ACTIVE_CHANNEL_CHANGED, CLEAN, DIRTY, REPAINT, @@ -205,6 +207,24 @@ gimp_image_class_init (GimpImageClass *klass) parent_class = gtk_type_class (GIMP_TYPE_VIEWABLE); + gimp_image_signals[ACTIVE_LAYER_CHANGED] = + gtk_signal_new ("active_layer_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_layer_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + + gimp_image_signals[ACTIVE_CHANNEL_CHANGED] = + gtk_signal_new ("active_channel_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_channel_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + gimp_image_signals[CLEAN] = gtk_signal_new ("clean", GTK_RUN_FIRST, @@ -2133,6 +2153,24 @@ gimp_image_invalidate_channel_previews (GimpImage *gimage) NULL); } +GimpContainer * +gimp_image_get_layers (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->layers; +} + +GimpContainer * +gimp_image_get_channels (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->channels; +} + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer) @@ -2327,22 +2365,31 @@ gimp_image_set_active_layer (GimpImage *gimage, if (! gimp_container_have (gimage->layers, GIMP_OBJECT (layer))) layer = (GimpLayer *) gimp_container_get_child_by_index (gimage->layers, 0); - if (! layer) + if (layer) { - gimage->active_layer = NULL; - return NULL; + /* Configure the layer stack to reflect this change */ + gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); + gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + + /* invalidate the selection boundary because of a layer modification */ + gimp_layer_invalidate_boundary (layer); } - /* Configure the layer stack to reflect this change */ - gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); - gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + if (layer != gimage->active_layer) + { + gimage->active_layer = layer; - /* invalidate the selection boundary because of a layer modification */ - gimp_layer_invalidate_boundary (layer); + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); - /* Set the active layer */ - gimage->active_layer = layer; - gimage->active_channel = NULL; + if (gimage->active_channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + } + } /* return the layer */ return layer; @@ -2364,14 +2411,21 @@ gimp_image_set_active_channel (GimpImage *gimage, if (! gimp_container_have (gimage->channels, GIMP_OBJECT (channel))) channel = (GimpChannel *) gimp_container_get_child_by_index (gimage->channels, 0); - if (! channel) + if (channel != gimage->active_channel) { - gimage->active_channel = NULL; - return NULL; - } + gimage->active_channel = channel; - /* Set the active channel */ - gimage->active_channel = channel; + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->active_layer) + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } + } /* return the channel */ return channel; @@ -2384,12 +2438,24 @@ gimp_image_unset_active_channel (GimpImage *gimage) g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - /* make sure there is an active channel */ - if (! (channel = gimage->active_channel)) - return NULL; + channel = gimp_image_get_active_channel (gimage); - /* Set the active channel */ - gimage->active_channel = NULL; + if (channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->layer_stack) + { + GimpLayer *layer; + + layer = (GimpLayer *) gimage->layer_stack->data; + + gimp_image_set_active_layer (gimage, layer); + } + } return channel; } @@ -3125,7 +3191,7 @@ gimp_image_add_layer (GimpImage *gimage, /* let the layer know about the gimage */ gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - /* If the layer has a mask, set the mask's gimage and layer */ + /* If the layer has a mask, set the mask's gimage */ if (layer->mask) { gimp_drawable_set_gimage (GIMP_DRAWABLE (layer->mask), gimage); @@ -3133,18 +3199,30 @@ gimp_image_add_layer (GimpImage *gimage, /* add the layer to the list at the specified position */ if (position == -1) - position = - gimp_container_get_child_index (gimage->layers, - GIMP_OBJECT (gimage->active_layer)); - - if (position != -1) { - /* If there is a floating selection (and this isn't it!), - * make sure the insert position is greater than 0 - */ - if (gimp_image_floating_sel (gimage) && - (gimage->floating_sel != layer) && position == 0) - position = 1; + GimpLayer *active_layer; + + active_layer = gimp_image_get_active_layer (gimage); + + if (active_layer) + { + position = gimp_container_get_child_index (gimage->layers, + GIMP_OBJECT (active_layer)); + } + else + { + position = 0; + } + } + + /* If there is a floating selection (and this isn't it!), + * make sure the insert position is greater than 0 + */ + if (position == 0 && + gimp_image_floating_sel (gimage) && + (gimage->floating_sel != layer)) + { + position = 1; } gimp_container_insert (gimage->layers, GIMP_OBJECT (layer), position); @@ -3204,9 +3282,16 @@ gimp_image_remove_layer (GimpImage *gimage, if (layer == gimp_image_get_active_layer (gimage)) { if (gimage->layer_stack) - gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + { + gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + } else - gimage->active_layer = NULL; + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } } /* Send out REMOVED signal from layer */ @@ -3524,8 +3609,6 @@ gimp_image_is_empty (const GimpImage *gimage) GimpDrawable * gimp_image_active_drawable (const GimpImage *gimage) { - GimpLayer *layer; - g_return_val_if_fail (gimage != NULL, NULL); g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); @@ -3538,6 +3621,8 @@ gimp_image_active_drawable (const GimpImage *gimage) } else if (gimage->active_layer) { + GimpLayer *layer; + layer = gimage->active_layer; if (layer->mask && layer->edit_mask) diff --git a/app/core/gimpimage-resize.h b/app/core/gimpimage-resize.h index 805e30de37..9006493e57 100644 --- a/app/core/gimpimage-resize.h +++ b/app/core/gimpimage-resize.h @@ -142,13 +142,21 @@ struct _GimpImageClass { GimpViewableClass parent_class; - void (* clean) (GimpImage *gimage); - void (* dirty) (GimpImage *gimage); - void (* repaint) (GimpImage *gimage); - void (* resize) (GimpImage *gimage); - void (* restructure) (GimpImage *gimage); - void (* colormap_changed) (GimpImage *gimage); - void (* undo_event) (GimpImage *gimage); + void (* active_layer_changed) (GimpImage *gimage); + void (* active_channel_changed) (GimpImage *gimage); + void (* clean) (GimpImage *gimage); + void (* dirty) (GimpImage *gimage); + void (* repaint) (GimpImage *gimage, + gint x1, + gint y1, + gint x2, + gint y2); + void (* resize) (GimpImage *gimage); + void (* restructure) (GimpImage *gimage); + void (* colormap_changed) (GimpImage *gimage, + gint color_index); + void (* undo_event) (GimpImage *gimage, + gint event); }; @@ -283,6 +291,9 @@ void gimp_image_colormap_changed (const GimpImage *image, /* layer/channel functions */ +GimpContainer * gimp_image_get_layers (const GimpImage *gimage); +GimpContainer * gimp_image_get_channels (const GimpImage *gimage); + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer); gint gimp_image_get_channel_index (const GimpImage *gimage, diff --git a/app/core/gimpimage-scale.c b/app/core/gimpimage-scale.c index 3017fc8ab0..56a8b02cb3 100644 --- a/app/core/gimpimage-scale.c +++ b/app/core/gimpimage-scale.c @@ -152,6 +152,8 @@ guint32 next_guide_id = 1; /* For generating guide_ID handles for PDB stuff */ enum { + ACTIVE_LAYER_CHANGED, + ACTIVE_CHANNEL_CHANGED, CLEAN, DIRTY, REPAINT, @@ -205,6 +207,24 @@ gimp_image_class_init (GimpImageClass *klass) parent_class = gtk_type_class (GIMP_TYPE_VIEWABLE); + gimp_image_signals[ACTIVE_LAYER_CHANGED] = + gtk_signal_new ("active_layer_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_layer_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + + gimp_image_signals[ACTIVE_CHANNEL_CHANGED] = + gtk_signal_new ("active_channel_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_channel_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + gimp_image_signals[CLEAN] = gtk_signal_new ("clean", GTK_RUN_FIRST, @@ -2133,6 +2153,24 @@ gimp_image_invalidate_channel_previews (GimpImage *gimage) NULL); } +GimpContainer * +gimp_image_get_layers (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->layers; +} + +GimpContainer * +gimp_image_get_channels (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->channels; +} + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer) @@ -2327,22 +2365,31 @@ gimp_image_set_active_layer (GimpImage *gimage, if (! gimp_container_have (gimage->layers, GIMP_OBJECT (layer))) layer = (GimpLayer *) gimp_container_get_child_by_index (gimage->layers, 0); - if (! layer) + if (layer) { - gimage->active_layer = NULL; - return NULL; + /* Configure the layer stack to reflect this change */ + gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); + gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + + /* invalidate the selection boundary because of a layer modification */ + gimp_layer_invalidate_boundary (layer); } - /* Configure the layer stack to reflect this change */ - gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); - gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + if (layer != gimage->active_layer) + { + gimage->active_layer = layer; - /* invalidate the selection boundary because of a layer modification */ - gimp_layer_invalidate_boundary (layer); + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); - /* Set the active layer */ - gimage->active_layer = layer; - gimage->active_channel = NULL; + if (gimage->active_channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + } + } /* return the layer */ return layer; @@ -2364,14 +2411,21 @@ gimp_image_set_active_channel (GimpImage *gimage, if (! gimp_container_have (gimage->channels, GIMP_OBJECT (channel))) channel = (GimpChannel *) gimp_container_get_child_by_index (gimage->channels, 0); - if (! channel) + if (channel != gimage->active_channel) { - gimage->active_channel = NULL; - return NULL; - } + gimage->active_channel = channel; - /* Set the active channel */ - gimage->active_channel = channel; + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->active_layer) + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } + } /* return the channel */ return channel; @@ -2384,12 +2438,24 @@ gimp_image_unset_active_channel (GimpImage *gimage) g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - /* make sure there is an active channel */ - if (! (channel = gimage->active_channel)) - return NULL; + channel = gimp_image_get_active_channel (gimage); - /* Set the active channel */ - gimage->active_channel = NULL; + if (channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->layer_stack) + { + GimpLayer *layer; + + layer = (GimpLayer *) gimage->layer_stack->data; + + gimp_image_set_active_layer (gimage, layer); + } + } return channel; } @@ -3125,7 +3191,7 @@ gimp_image_add_layer (GimpImage *gimage, /* let the layer know about the gimage */ gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - /* If the layer has a mask, set the mask's gimage and layer */ + /* If the layer has a mask, set the mask's gimage */ if (layer->mask) { gimp_drawable_set_gimage (GIMP_DRAWABLE (layer->mask), gimage); @@ -3133,18 +3199,30 @@ gimp_image_add_layer (GimpImage *gimage, /* add the layer to the list at the specified position */ if (position == -1) - position = - gimp_container_get_child_index (gimage->layers, - GIMP_OBJECT (gimage->active_layer)); - - if (position != -1) { - /* If there is a floating selection (and this isn't it!), - * make sure the insert position is greater than 0 - */ - if (gimp_image_floating_sel (gimage) && - (gimage->floating_sel != layer) && position == 0) - position = 1; + GimpLayer *active_layer; + + active_layer = gimp_image_get_active_layer (gimage); + + if (active_layer) + { + position = gimp_container_get_child_index (gimage->layers, + GIMP_OBJECT (active_layer)); + } + else + { + position = 0; + } + } + + /* If there is a floating selection (and this isn't it!), + * make sure the insert position is greater than 0 + */ + if (position == 0 && + gimp_image_floating_sel (gimage) && + (gimage->floating_sel != layer)) + { + position = 1; } gimp_container_insert (gimage->layers, GIMP_OBJECT (layer), position); @@ -3204,9 +3282,16 @@ gimp_image_remove_layer (GimpImage *gimage, if (layer == gimp_image_get_active_layer (gimage)) { if (gimage->layer_stack) - gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + { + gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + } else - gimage->active_layer = NULL; + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } } /* Send out REMOVED signal from layer */ @@ -3524,8 +3609,6 @@ gimp_image_is_empty (const GimpImage *gimage) GimpDrawable * gimp_image_active_drawable (const GimpImage *gimage) { - GimpLayer *layer; - g_return_val_if_fail (gimage != NULL, NULL); g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); @@ -3538,6 +3621,8 @@ gimp_image_active_drawable (const GimpImage *gimage) } else if (gimage->active_layer) { + GimpLayer *layer; + layer = gimage->active_layer; if (layer->mask && layer->edit_mask) diff --git a/app/core/gimpimage-scale.h b/app/core/gimpimage-scale.h index 805e30de37..9006493e57 100644 --- a/app/core/gimpimage-scale.h +++ b/app/core/gimpimage-scale.h @@ -142,13 +142,21 @@ struct _GimpImageClass { GimpViewableClass parent_class; - void (* clean) (GimpImage *gimage); - void (* dirty) (GimpImage *gimage); - void (* repaint) (GimpImage *gimage); - void (* resize) (GimpImage *gimage); - void (* restructure) (GimpImage *gimage); - void (* colormap_changed) (GimpImage *gimage); - void (* undo_event) (GimpImage *gimage); + void (* active_layer_changed) (GimpImage *gimage); + void (* active_channel_changed) (GimpImage *gimage); + void (* clean) (GimpImage *gimage); + void (* dirty) (GimpImage *gimage); + void (* repaint) (GimpImage *gimage, + gint x1, + gint y1, + gint x2, + gint y2); + void (* resize) (GimpImage *gimage); + void (* restructure) (GimpImage *gimage); + void (* colormap_changed) (GimpImage *gimage, + gint color_index); + void (* undo_event) (GimpImage *gimage, + gint event); }; @@ -283,6 +291,9 @@ void gimp_image_colormap_changed (const GimpImage *image, /* layer/channel functions */ +GimpContainer * gimp_image_get_layers (const GimpImage *gimage); +GimpContainer * gimp_image_get_channels (const GimpImage *gimage); + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer); gint gimp_image_get_channel_index (const GimpImage *gimage, diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c index 3017fc8ab0..56a8b02cb3 100644 --- a/app/core/gimpimage.c +++ b/app/core/gimpimage.c @@ -152,6 +152,8 @@ guint32 next_guide_id = 1; /* For generating guide_ID handles for PDB stuff */ enum { + ACTIVE_LAYER_CHANGED, + ACTIVE_CHANNEL_CHANGED, CLEAN, DIRTY, REPAINT, @@ -205,6 +207,24 @@ gimp_image_class_init (GimpImageClass *klass) parent_class = gtk_type_class (GIMP_TYPE_VIEWABLE); + gimp_image_signals[ACTIVE_LAYER_CHANGED] = + gtk_signal_new ("active_layer_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_layer_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + + gimp_image_signals[ACTIVE_CHANNEL_CHANGED] = + gtk_signal_new ("active_channel_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_channel_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + gimp_image_signals[CLEAN] = gtk_signal_new ("clean", GTK_RUN_FIRST, @@ -2133,6 +2153,24 @@ gimp_image_invalidate_channel_previews (GimpImage *gimage) NULL); } +GimpContainer * +gimp_image_get_layers (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->layers; +} + +GimpContainer * +gimp_image_get_channels (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->channels; +} + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer) @@ -2327,22 +2365,31 @@ gimp_image_set_active_layer (GimpImage *gimage, if (! gimp_container_have (gimage->layers, GIMP_OBJECT (layer))) layer = (GimpLayer *) gimp_container_get_child_by_index (gimage->layers, 0); - if (! layer) + if (layer) { - gimage->active_layer = NULL; - return NULL; + /* Configure the layer stack to reflect this change */ + gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); + gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + + /* invalidate the selection boundary because of a layer modification */ + gimp_layer_invalidate_boundary (layer); } - /* Configure the layer stack to reflect this change */ - gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); - gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + if (layer != gimage->active_layer) + { + gimage->active_layer = layer; - /* invalidate the selection boundary because of a layer modification */ - gimp_layer_invalidate_boundary (layer); + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); - /* Set the active layer */ - gimage->active_layer = layer; - gimage->active_channel = NULL; + if (gimage->active_channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + } + } /* return the layer */ return layer; @@ -2364,14 +2411,21 @@ gimp_image_set_active_channel (GimpImage *gimage, if (! gimp_container_have (gimage->channels, GIMP_OBJECT (channel))) channel = (GimpChannel *) gimp_container_get_child_by_index (gimage->channels, 0); - if (! channel) + if (channel != gimage->active_channel) { - gimage->active_channel = NULL; - return NULL; - } + gimage->active_channel = channel; - /* Set the active channel */ - gimage->active_channel = channel; + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->active_layer) + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } + } /* return the channel */ return channel; @@ -2384,12 +2438,24 @@ gimp_image_unset_active_channel (GimpImage *gimage) g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - /* make sure there is an active channel */ - if (! (channel = gimage->active_channel)) - return NULL; + channel = gimp_image_get_active_channel (gimage); - /* Set the active channel */ - gimage->active_channel = NULL; + if (channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->layer_stack) + { + GimpLayer *layer; + + layer = (GimpLayer *) gimage->layer_stack->data; + + gimp_image_set_active_layer (gimage, layer); + } + } return channel; } @@ -3125,7 +3191,7 @@ gimp_image_add_layer (GimpImage *gimage, /* let the layer know about the gimage */ gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - /* If the layer has a mask, set the mask's gimage and layer */ + /* If the layer has a mask, set the mask's gimage */ if (layer->mask) { gimp_drawable_set_gimage (GIMP_DRAWABLE (layer->mask), gimage); @@ -3133,18 +3199,30 @@ gimp_image_add_layer (GimpImage *gimage, /* add the layer to the list at the specified position */ if (position == -1) - position = - gimp_container_get_child_index (gimage->layers, - GIMP_OBJECT (gimage->active_layer)); - - if (position != -1) { - /* If there is a floating selection (and this isn't it!), - * make sure the insert position is greater than 0 - */ - if (gimp_image_floating_sel (gimage) && - (gimage->floating_sel != layer) && position == 0) - position = 1; + GimpLayer *active_layer; + + active_layer = gimp_image_get_active_layer (gimage); + + if (active_layer) + { + position = gimp_container_get_child_index (gimage->layers, + GIMP_OBJECT (active_layer)); + } + else + { + position = 0; + } + } + + /* If there is a floating selection (and this isn't it!), + * make sure the insert position is greater than 0 + */ + if (position == 0 && + gimp_image_floating_sel (gimage) && + (gimage->floating_sel != layer)) + { + position = 1; } gimp_container_insert (gimage->layers, GIMP_OBJECT (layer), position); @@ -3204,9 +3282,16 @@ gimp_image_remove_layer (GimpImage *gimage, if (layer == gimp_image_get_active_layer (gimage)) { if (gimage->layer_stack) - gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + { + gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + } else - gimage->active_layer = NULL; + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } } /* Send out REMOVED signal from layer */ @@ -3524,8 +3609,6 @@ gimp_image_is_empty (const GimpImage *gimage) GimpDrawable * gimp_image_active_drawable (const GimpImage *gimage) { - GimpLayer *layer; - g_return_val_if_fail (gimage != NULL, NULL); g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); @@ -3538,6 +3621,8 @@ gimp_image_active_drawable (const GimpImage *gimage) } else if (gimage->active_layer) { + GimpLayer *layer; + layer = gimage->active_layer; if (layer->mask && layer->edit_mask) diff --git a/app/core/gimpimage.h b/app/core/gimpimage.h index 805e30de37..9006493e57 100644 --- a/app/core/gimpimage.h +++ b/app/core/gimpimage.h @@ -142,13 +142,21 @@ struct _GimpImageClass { GimpViewableClass parent_class; - void (* clean) (GimpImage *gimage); - void (* dirty) (GimpImage *gimage); - void (* repaint) (GimpImage *gimage); - void (* resize) (GimpImage *gimage); - void (* restructure) (GimpImage *gimage); - void (* colormap_changed) (GimpImage *gimage); - void (* undo_event) (GimpImage *gimage); + void (* active_layer_changed) (GimpImage *gimage); + void (* active_channel_changed) (GimpImage *gimage); + void (* clean) (GimpImage *gimage); + void (* dirty) (GimpImage *gimage); + void (* repaint) (GimpImage *gimage, + gint x1, + gint y1, + gint x2, + gint y2); + void (* resize) (GimpImage *gimage); + void (* restructure) (GimpImage *gimage); + void (* colormap_changed) (GimpImage *gimage, + gint color_index); + void (* undo_event) (GimpImage *gimage, + gint event); }; @@ -283,6 +291,9 @@ void gimp_image_colormap_changed (const GimpImage *image, /* layer/channel functions */ +GimpContainer * gimp_image_get_layers (const GimpImage *gimage); +GimpContainer * gimp_image_get_channels (const GimpImage *gimage); + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer); gint gimp_image_get_channel_index (const GimpImage *gimage, diff --git a/app/core/gimplayer-floating-sel.c b/app/core/gimplayer-floating-sel.c index 5bf46f2c80..2365d403e8 100644 --- a/app/core/gimplayer-floating-sel.c +++ b/app/core/gimplayer-floating-sel.c @@ -166,12 +166,6 @@ floating_sel_reset (GimpLayer *layer) else if (GIMP_IS_CHANNEL (layer->fs.drawable)) { gimp_image_set_active_channel (gimage, GIMP_CHANNEL (layer->fs.drawable)); - - if (gimp_container_num_children (gimage->layers)) - { - gimp_image_set_active_layer (gimage, - (GimpLayer *) gimage->layer_stack->data); - } } } diff --git a/app/core/gimpprojection-construct.c b/app/core/gimpprojection-construct.c index 3017fc8ab0..56a8b02cb3 100644 --- a/app/core/gimpprojection-construct.c +++ b/app/core/gimpprojection-construct.c @@ -152,6 +152,8 @@ guint32 next_guide_id = 1; /* For generating guide_ID handles for PDB stuff */ enum { + ACTIVE_LAYER_CHANGED, + ACTIVE_CHANNEL_CHANGED, CLEAN, DIRTY, REPAINT, @@ -205,6 +207,24 @@ gimp_image_class_init (GimpImageClass *klass) parent_class = gtk_type_class (GIMP_TYPE_VIEWABLE); + gimp_image_signals[ACTIVE_LAYER_CHANGED] = + gtk_signal_new ("active_layer_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_layer_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + + gimp_image_signals[ACTIVE_CHANNEL_CHANGED] = + gtk_signal_new ("active_channel_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_channel_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + gimp_image_signals[CLEAN] = gtk_signal_new ("clean", GTK_RUN_FIRST, @@ -2133,6 +2153,24 @@ gimp_image_invalidate_channel_previews (GimpImage *gimage) NULL); } +GimpContainer * +gimp_image_get_layers (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->layers; +} + +GimpContainer * +gimp_image_get_channels (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->channels; +} + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer) @@ -2327,22 +2365,31 @@ gimp_image_set_active_layer (GimpImage *gimage, if (! gimp_container_have (gimage->layers, GIMP_OBJECT (layer))) layer = (GimpLayer *) gimp_container_get_child_by_index (gimage->layers, 0); - if (! layer) + if (layer) { - gimage->active_layer = NULL; - return NULL; + /* Configure the layer stack to reflect this change */ + gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); + gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + + /* invalidate the selection boundary because of a layer modification */ + gimp_layer_invalidate_boundary (layer); } - /* Configure the layer stack to reflect this change */ - gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); - gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + if (layer != gimage->active_layer) + { + gimage->active_layer = layer; - /* invalidate the selection boundary because of a layer modification */ - gimp_layer_invalidate_boundary (layer); + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); - /* Set the active layer */ - gimage->active_layer = layer; - gimage->active_channel = NULL; + if (gimage->active_channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + } + } /* return the layer */ return layer; @@ -2364,14 +2411,21 @@ gimp_image_set_active_channel (GimpImage *gimage, if (! gimp_container_have (gimage->channels, GIMP_OBJECT (channel))) channel = (GimpChannel *) gimp_container_get_child_by_index (gimage->channels, 0); - if (! channel) + if (channel != gimage->active_channel) { - gimage->active_channel = NULL; - return NULL; - } + gimage->active_channel = channel; - /* Set the active channel */ - gimage->active_channel = channel; + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->active_layer) + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } + } /* return the channel */ return channel; @@ -2384,12 +2438,24 @@ gimp_image_unset_active_channel (GimpImage *gimage) g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - /* make sure there is an active channel */ - if (! (channel = gimage->active_channel)) - return NULL; + channel = gimp_image_get_active_channel (gimage); - /* Set the active channel */ - gimage->active_channel = NULL; + if (channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->layer_stack) + { + GimpLayer *layer; + + layer = (GimpLayer *) gimage->layer_stack->data; + + gimp_image_set_active_layer (gimage, layer); + } + } return channel; } @@ -3125,7 +3191,7 @@ gimp_image_add_layer (GimpImage *gimage, /* let the layer know about the gimage */ gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - /* If the layer has a mask, set the mask's gimage and layer */ + /* If the layer has a mask, set the mask's gimage */ if (layer->mask) { gimp_drawable_set_gimage (GIMP_DRAWABLE (layer->mask), gimage); @@ -3133,18 +3199,30 @@ gimp_image_add_layer (GimpImage *gimage, /* add the layer to the list at the specified position */ if (position == -1) - position = - gimp_container_get_child_index (gimage->layers, - GIMP_OBJECT (gimage->active_layer)); - - if (position != -1) { - /* If there is a floating selection (and this isn't it!), - * make sure the insert position is greater than 0 - */ - if (gimp_image_floating_sel (gimage) && - (gimage->floating_sel != layer) && position == 0) - position = 1; + GimpLayer *active_layer; + + active_layer = gimp_image_get_active_layer (gimage); + + if (active_layer) + { + position = gimp_container_get_child_index (gimage->layers, + GIMP_OBJECT (active_layer)); + } + else + { + position = 0; + } + } + + /* If there is a floating selection (and this isn't it!), + * make sure the insert position is greater than 0 + */ + if (position == 0 && + gimp_image_floating_sel (gimage) && + (gimage->floating_sel != layer)) + { + position = 1; } gimp_container_insert (gimage->layers, GIMP_OBJECT (layer), position); @@ -3204,9 +3282,16 @@ gimp_image_remove_layer (GimpImage *gimage, if (layer == gimp_image_get_active_layer (gimage)) { if (gimage->layer_stack) - gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + { + gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + } else - gimage->active_layer = NULL; + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } } /* Send out REMOVED signal from layer */ @@ -3524,8 +3609,6 @@ gimp_image_is_empty (const GimpImage *gimage) GimpDrawable * gimp_image_active_drawable (const GimpImage *gimage) { - GimpLayer *layer; - g_return_val_if_fail (gimage != NULL, NULL); g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); @@ -3538,6 +3621,8 @@ gimp_image_active_drawable (const GimpImage *gimage) } else if (gimage->active_layer) { + GimpLayer *layer; + layer = gimage->active_layer; if (layer->mask && layer->edit_mask) diff --git a/app/core/gimpprojection-construct.h b/app/core/gimpprojection-construct.h index 805e30de37..9006493e57 100644 --- a/app/core/gimpprojection-construct.h +++ b/app/core/gimpprojection-construct.h @@ -142,13 +142,21 @@ struct _GimpImageClass { GimpViewableClass parent_class; - void (* clean) (GimpImage *gimage); - void (* dirty) (GimpImage *gimage); - void (* repaint) (GimpImage *gimage); - void (* resize) (GimpImage *gimage); - void (* restructure) (GimpImage *gimage); - void (* colormap_changed) (GimpImage *gimage); - void (* undo_event) (GimpImage *gimage); + void (* active_layer_changed) (GimpImage *gimage); + void (* active_channel_changed) (GimpImage *gimage); + void (* clean) (GimpImage *gimage); + void (* dirty) (GimpImage *gimage); + void (* repaint) (GimpImage *gimage, + gint x1, + gint y1, + gint x2, + gint y2); + void (* resize) (GimpImage *gimage); + void (* restructure) (GimpImage *gimage); + void (* colormap_changed) (GimpImage *gimage, + gint color_index); + void (* undo_event) (GimpImage *gimage, + gint event); }; @@ -283,6 +291,9 @@ void gimp_image_colormap_changed (const GimpImage *image, /* layer/channel functions */ +GimpContainer * gimp_image_get_layers (const GimpImage *gimage); +GimpContainer * gimp_image_get_channels (const GimpImage *gimage); + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer); gint gimp_image_get_channel_index (const GimpImage *gimage, diff --git a/app/core/gimpprojection.c b/app/core/gimpprojection.c index 9f73698eb2..83f69b5ff8 100644 --- a/app/core/gimpprojection.c +++ b/app/core/gimpprojection.c @@ -1958,13 +1958,14 @@ gdisplay_set_menu_sensitivity (GDisplay *gdisp) if (lp) { layer = gimp_image_get_active_layer (gdisp->gimage); + if (layer) { lm = gimp_layer_get_mask (layer) ? TRUE : FALSE; alpha = gimp_layer_has_alpha (layer); + lind = gimp_image_get_layer_index (gdisp->gimage, layer); } - lind = gimp_image_get_layer_index (gdisp->gimage, layer); lnum = gimp_container_num_children (gdisp->gimage->layers); } } @@ -2038,17 +2039,24 @@ gdisplay_set_menu_sensitivity (GDisplay *gdisp) SET_SENSITIVE ("Image/Mode/RGB", (base_type != RGB)); SET_SENSITIVE ("Image/Mode/Grayscale", (base_type != GRAY)); SET_SENSITIVE ("Image/Mode/Indexed...", (base_type != INDEXED)); +#warning FIXME (set_menu_sensitivity) +#if 0 SET_SENSITIVE ("Image/Histogram...", lp); +#endif SET_SENSITIVE ("Image/Colors", lp); +#if 0 SET_SENSITIVE ("Image/Colors/Color Balance...", (base_type == RGB)); SET_SENSITIVE ("Image/Colors/Hue-Saturation...", (base_type == RGB)); SET_SENSITIVE ("Image/Colors/Brightness-Contrast...", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Threshold...", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Levels...", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Curves...", (base_type != INDEXED)); +#endif SET_SENSITIVE ("Image/Colors/Desaturate", (base_type == RGB)); +#if 0 SET_SENSITIVE ("Image/Colors/Posterize...", (base_type != INDEXED)); +#endif SET_SENSITIVE ("Image/Colors/Invert", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Auto/Equalize", (base_type != INDEXED)); diff --git a/app/display/gimpdisplay.c b/app/display/gimpdisplay.c index 9f73698eb2..83f69b5ff8 100644 --- a/app/display/gimpdisplay.c +++ b/app/display/gimpdisplay.c @@ -1958,13 +1958,14 @@ gdisplay_set_menu_sensitivity (GDisplay *gdisp) if (lp) { layer = gimp_image_get_active_layer (gdisp->gimage); + if (layer) { lm = gimp_layer_get_mask (layer) ? TRUE : FALSE; alpha = gimp_layer_has_alpha (layer); + lind = gimp_image_get_layer_index (gdisp->gimage, layer); } - lind = gimp_image_get_layer_index (gdisp->gimage, layer); lnum = gimp_container_num_children (gdisp->gimage->layers); } } @@ -2038,17 +2039,24 @@ gdisplay_set_menu_sensitivity (GDisplay *gdisp) SET_SENSITIVE ("Image/Mode/RGB", (base_type != RGB)); SET_SENSITIVE ("Image/Mode/Grayscale", (base_type != GRAY)); SET_SENSITIVE ("Image/Mode/Indexed...", (base_type != INDEXED)); +#warning FIXME (set_menu_sensitivity) +#if 0 SET_SENSITIVE ("Image/Histogram...", lp); +#endif SET_SENSITIVE ("Image/Colors", lp); +#if 0 SET_SENSITIVE ("Image/Colors/Color Balance...", (base_type == RGB)); SET_SENSITIVE ("Image/Colors/Hue-Saturation...", (base_type == RGB)); SET_SENSITIVE ("Image/Colors/Brightness-Contrast...", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Threshold...", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Levels...", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Curves...", (base_type != INDEXED)); +#endif SET_SENSITIVE ("Image/Colors/Desaturate", (base_type == RGB)); +#if 0 SET_SENSITIVE ("Image/Colors/Posterize...", (base_type != INDEXED)); +#endif SET_SENSITIVE ("Image/Colors/Invert", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Auto/Equalize", (base_type != INDEXED)); diff --git a/app/floating_sel.c b/app/floating_sel.c index 5bf46f2c80..2365d403e8 100644 --- a/app/floating_sel.c +++ b/app/floating_sel.c @@ -166,12 +166,6 @@ floating_sel_reset (GimpLayer *layer) else if (GIMP_IS_CHANNEL (layer->fs.drawable)) { gimp_image_set_active_channel (gimage, GIMP_CHANNEL (layer->fs.drawable)); - - if (gimp_container_num_children (gimage->layers)) - { - gimp_image_set_active_layer (gimage, - (GimpLayer *) gimage->layer_stack->data); - } } } diff --git a/app/gdisplay.c b/app/gdisplay.c index 9f73698eb2..83f69b5ff8 100644 --- a/app/gdisplay.c +++ b/app/gdisplay.c @@ -1958,13 +1958,14 @@ gdisplay_set_menu_sensitivity (GDisplay *gdisp) if (lp) { layer = gimp_image_get_active_layer (gdisp->gimage); + if (layer) { lm = gimp_layer_get_mask (layer) ? TRUE : FALSE; alpha = gimp_layer_has_alpha (layer); + lind = gimp_image_get_layer_index (gdisp->gimage, layer); } - lind = gimp_image_get_layer_index (gdisp->gimage, layer); lnum = gimp_container_num_children (gdisp->gimage->layers); } } @@ -2038,17 +2039,24 @@ gdisplay_set_menu_sensitivity (GDisplay *gdisp) SET_SENSITIVE ("Image/Mode/RGB", (base_type != RGB)); SET_SENSITIVE ("Image/Mode/Grayscale", (base_type != GRAY)); SET_SENSITIVE ("Image/Mode/Indexed...", (base_type != INDEXED)); +#warning FIXME (set_menu_sensitivity) +#if 0 SET_SENSITIVE ("Image/Histogram...", lp); +#endif SET_SENSITIVE ("Image/Colors", lp); +#if 0 SET_SENSITIVE ("Image/Colors/Color Balance...", (base_type == RGB)); SET_SENSITIVE ("Image/Colors/Hue-Saturation...", (base_type == RGB)); SET_SENSITIVE ("Image/Colors/Brightness-Contrast...", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Threshold...", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Levels...", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Curves...", (base_type != INDEXED)); +#endif SET_SENSITIVE ("Image/Colors/Desaturate", (base_type == RGB)); +#if 0 SET_SENSITIVE ("Image/Colors/Posterize...", (base_type != INDEXED)); +#endif SET_SENSITIVE ("Image/Colors/Invert", (base_type != INDEXED)); SET_SENSITIVE ("Image/Colors/Auto/Equalize", (base_type != INDEXED)); diff --git a/app/gimpcontainergridview.c b/app/gimpcontainergridview.c index 60b6184582..39428d124a 100644 --- a/app/gimpcontainergridview.c +++ b/app/gimpcontainergridview.c @@ -54,7 +54,7 @@ static void gimp_container_grid_view_clear_items (GimpContainerView *v static void gimp_container_grid_view_set_preview_size (GimpContainerView *view); static void gimp_container_grid_view_item_selected (GtkWidget *widget, gpointer data); -static void gimp_container_grid_view_item_activate (GtkWidget *widget, +static void gimp_container_grid_view_item_activated (GtkWidget *widget, gpointer data); static void gimp_container_grid_view_highlight_item (GimpContainerView *view, GimpViewable *viewable, @@ -240,7 +240,7 @@ gimp_container_grid_view_insert_item (GimpContainerView *view, view); gtk_signal_connect (GTK_OBJECT (preview), "double_clicked", - GTK_SIGNAL_FUNC (gimp_container_grid_view_item_activate), + GTK_SIGNAL_FUNC (gimp_container_grid_view_item_activated), view); return (gpointer) preview; @@ -336,20 +336,16 @@ static void gimp_container_grid_view_item_selected (GtkWidget *widget, gpointer data) { - gimp_container_grid_view_highlight_item (GIMP_CONTAINER_VIEW (data), - GIMP_PREVIEW (widget)->viewable, - widget); - gimp_container_view_item_selected (GIMP_CONTAINER_VIEW (data), GIMP_PREVIEW (widget)->viewable); } static void -gimp_container_grid_view_item_activate (GtkWidget *widget, - gpointer data) +gimp_container_grid_view_item_activated (GtkWidget *widget, + gpointer data) { - gimp_container_view_item_activate (GIMP_CONTAINER_VIEW (data), - GIMP_PREVIEW (widget)->viewable); + gimp_container_view_item_activated (GIMP_CONTAINER_VIEW (data), + GIMP_PREVIEW (widget)->viewable); } static void diff --git a/app/gimpcontainerlistview.c b/app/gimpcontainerlistview.c index 36f4b7568a..70fb1e4cd7 100644 --- a/app/gimpcontainerlistview.c +++ b/app/gimpcontainerlistview.c @@ -58,7 +58,7 @@ static void gimp_container_list_view_name_changed (GimpViewable *v static void gimp_container_list_view_item_selected (GtkWidget *widget, GtkWidget *child, gpointer data); -static gint gimp_container_list_view_item_activate (GtkWidget *widget, +static gint gimp_container_list_view_item_activated (GtkWidget *widget, GdkEventButton *bevent, gpointer data); static GimpViewable * gimp_container_list_view_drag_viewable (GtkWidget *widget, @@ -243,7 +243,7 @@ gimp_container_list_view_insert_item (GimpContainerView *view, GTK_OBJECT (list_view)); gtk_signal_connect (GTK_OBJECT (list_item), "button_press_event", - GTK_SIGNAL_FUNC (gimp_container_list_view_item_activate), + GTK_SIGNAL_FUNC (gimp_container_list_view_item_activated), list_view); gimp_gtk_drag_source_set_by_type (list_item, @@ -382,6 +382,10 @@ gimp_container_list_view_select_item (GimpContainerView *view, gimp_container_list_view_item_selected, list_view); } + else + { + gtk_list_unselect_all (GTK_LIST (list_view->gtk_list)); + } } static void @@ -440,9 +444,9 @@ gimp_container_list_view_item_selected (GtkWidget *widget, } static gint -gimp_container_list_view_item_activate (GtkWidget *widget, - GdkEventButton *bevent, - gpointer data) +gimp_container_list_view_item_activated (GtkWidget *widget, + GdkEventButton *bevent, + gpointer data) { if (bevent->type == GDK_2BUTTON_PRESS) { @@ -451,7 +455,7 @@ gimp_container_list_view_item_activate (GtkWidget *widget, viewable = GIMP_PREVIEW (gtk_object_get_data (GTK_OBJECT (widget), "preview"))->viewable; - gimp_container_view_item_activate (GIMP_CONTAINER_VIEW (data), viewable); + gimp_container_view_item_activated (GIMP_CONTAINER_VIEW (data), viewable); } return FALSE; diff --git a/app/gimpcontainerview.c b/app/gimpcontainerview.c index e8055123c8..b1d7f6bb46 100644 --- a/app/gimpcontainerview.c +++ b/app/gimpcontainerview.c @@ -427,17 +427,19 @@ gimp_container_view_item_selected (GimpContainerView *view, g_return_if_fail (viewable != NULL); g_return_if_fail (GIMP_IS_VIEWABLE (viewable)); - if (! (view->container && view->context)) - return; + if (view->container && view->context) + { + gimp_context_set_by_type (view->context, + view->container->children_type, + GIMP_OBJECT (viewable)); + } - gimp_context_set_by_type (view->context, - view->container->children_type, - GIMP_OBJECT (viewable)); + gimp_container_view_select_item (view, viewable); } void -gimp_container_view_item_activate (GimpContainerView *view, - GimpViewable *viewable) +gimp_container_view_item_activated (GimpContainerView *view, + GimpViewable *viewable) { g_return_if_fail (view != NULL); g_return_if_fail (GIMP_IS_CONTAINER_VIEW (view)); diff --git a/app/gimpcontainerview.h b/app/gimpcontainerview.h index cb4f11d005..48d3cb2113 100644 --- a/app/gimpcontainerview.h +++ b/app/gimpcontainerview.h @@ -87,7 +87,7 @@ void gimp_container_view_activate_item (GimpContainerView *view, void gimp_container_view_item_selected (GimpContainerView *view, GimpViewable *item); -void gimp_container_view_item_activate (GimpContainerView *view, +void gimp_container_view_item_activated (GimpContainerView *view, GimpViewable *item); diff --git a/app/gimpdrawable-offset.c b/app/gimpdrawable-offset.c index 11e5390c1e..5fcac39216 100644 --- a/app/gimpdrawable-offset.c +++ b/app/gimpdrawable-offset.c @@ -575,11 +575,11 @@ duplicate (GimpImage *gimage) GimpLayer *floating_layer; GimpChannel *channel, *new_channel; GList *list; - Guide *guide = NULL; - GimpLayer *active_layer = NULL; - GimpChannel *active_channel = NULL; + Guide *guide = NULL; + GimpLayer *active_layer = NULL; + GimpChannel *active_channel = NULL; GimpDrawable *new_floating_sel_drawable = NULL; - GimpDrawable *floating_sel_drawable = NULL; + GimpDrawable *floating_sel_drawable = NULL; ParasiteList *parasites; PathList *paths; gint count; diff --git a/app/gimpdrawablelistview.c b/app/gimpdrawablelistview.c new file mode 100644 index 0000000000..bb52f16261 --- /dev/null +++ b/app/gimpdrawablelistview.c @@ -0,0 +1,528 @@ +/* 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. + */ + +#include "config.h" + +#include + +#include "libgimpmath/gimpmath.h" +#include "libgimpwidgets/gimpwidgets.h" + +#include "apptypes.h" + +#include "gimpcontainer.h" +#include "gimpdrawable.h" +#include "gimpdrawablelistview.h" +#include "gimpdnd.h" +#include "gimpimage.h" +#include "gimpmarshal.h" +#include "gimprc.h" +#include "gimpviewable.h" + +#include "libgimp/gimpintl.h" + +#include "pixmaps/delete.xpm" +#include "pixmaps/raise.xpm" +#include "pixmaps/lower.xpm" +#include "pixmaps/duplicate.xpm" +#include "pixmaps/new.xpm" +#include "pixmaps/pennorm.xpm" + + +static void gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass); +static void gimp_drawable_list_view_init (GimpDrawableListView *view); +static void gimp_drawable_list_view_destroy (GtkObject *object); + +static void gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); +static void gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); + +static void gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data); +static void gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); + +static void gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view); + + +static GimpContainerListViewClass *parent_class = NULL; + + +GtkType +gimp_drawable_list_view_get_type (void) +{ + static guint view_type = 0; + + if (! view_type) + { + GtkTypeInfo view_info = + { + "GimpDrawableListView", + sizeof (GimpDrawableListView), + sizeof (GimpDrawableListViewClass), + (GtkClassInitFunc) gimp_drawable_list_view_class_init, + (GtkObjectInitFunc) gimp_drawable_list_view_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL + }; + + view_type = gtk_type_unique (GIMP_TYPE_CONTAINER_LIST_VIEW, &view_info); + } + + return view_type; +} + +static void +gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass) +{ + GtkObjectClass *object_class; + GimpContainerViewClass *container_view_class; + + object_class = (GtkObjectClass *) klass; + container_view_class = (GimpContainerViewClass *) klass; + + parent_class = gtk_type_class (GIMP_TYPE_CONTAINER_LIST_VIEW); + + object_class->destroy = gimp_drawable_list_view_destroy; + + container_view_class->select_item = gimp_drawable_list_view_select_item; + container_view_class->activate_item = gimp_drawable_list_view_activate_item; +} + +static void +gimp_drawable_list_view_init (GimpDrawableListView *view) +{ + GtkWidget *pixmap; + + view->gimage = NULL; + view->drawable_type = GTK_TYPE_NONE; + view->signal_name = NULL; + + gtk_box_set_spacing (GTK_BOX (view), 2); + + view->button_box = gtk_hbox_new (TRUE, 2); + gtk_box_pack_end (GTK_BOX (view), view->button_box, FALSE, FALSE, 0); + gtk_widget_show (view->button_box); + + /* new */ + + view->new_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->new_button, + TRUE, TRUE, 0); + gtk_widget_show (view->new_button); + + gimp_help_set_help_data (view->new_button, _("New"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->new_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_new_clicked), + view); + + pixmap = gimp_pixmap_new (new_xpm); + gtk_container_add (GTK_CONTAINER (view->new_button), pixmap); + gtk_widget_show (pixmap); + + /* raise */ + + view->raise_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->raise_button, + TRUE, TRUE, 0); + gtk_widget_show (view->raise_button); + + gimp_help_set_help_data (view->raise_button, _("Raise"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->raise_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_raise_clicked), + view); + + pixmap = gimp_pixmap_new (raise_xpm); + gtk_container_add (GTK_CONTAINER (view->raise_button), pixmap); + gtk_widget_show (pixmap); + + /* lower */ + + view->lower_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->lower_button, + TRUE, TRUE, 0); + gtk_widget_show (view->lower_button); + + gimp_help_set_help_data (view->lower_button, _("Lower"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->lower_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_lower_clicked), + view); + + pixmap = gimp_pixmap_new (lower_xpm); + gtk_container_add (GTK_CONTAINER (view->lower_button), pixmap); + gtk_widget_show (pixmap); + + /* duplicate */ + + view->duplicate_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->duplicate_button, + TRUE, TRUE, 0); + gtk_widget_show (view->duplicate_button); + + gimp_help_set_help_data (view->duplicate_button, _("Duplicate"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->duplicate_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_duplicate_clicked), + view); + + pixmap = gimp_pixmap_new (duplicate_xpm); + gtk_container_add (GTK_CONTAINER (view->duplicate_button), pixmap); + gtk_widget_show (pixmap); + + /* edit */ + + view->edit_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->edit_button, + TRUE, TRUE, 0); + gtk_widget_show (view->edit_button); + + gimp_help_set_help_data (view->edit_button, _("Edit"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->edit_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_edit_clicked), + view); + + pixmap = gimp_pixmap_new (pennorm_xpm); + gtk_container_add (GTK_CONTAINER (view->edit_button), pixmap); + gtk_widget_show (pixmap); + + /* delete */ + + view->delete_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->delete_button, + TRUE, TRUE, 0); + gtk_widget_show (view->delete_button); + + gimp_help_set_help_data (view->delete_button, _("Delete"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->delete_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_delete_clicked), + view); + + pixmap = gimp_pixmap_new (delete_xpm); + gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap); + gtk_widget_show (pixmap); + + gtk_widget_set_sensitive (view->raise_button, FALSE); + gtk_widget_set_sensitive (view->lower_button, FALSE); + gtk_widget_set_sensitive (view->duplicate_button, FALSE); + gtk_widget_set_sensitive (view->delete_button, FALSE); +} + +static void +gimp_drawable_list_view_destroy (GtkObject *object) +{ + GimpDrawableListView *view; + + view = GIMP_DRAWABLE_LIST_VIEW (object); + + g_free (view->signal_name); + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + +GtkWidget * +gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func) +{ + GimpDrawableListView *list_view; + GimpContainerView *view; + + g_return_val_if_fail (! gimage || GIMP_IS_IMAGE (gimage), NULL); + g_return_val_if_fail (signal_name != NULL, NULL); + g_return_val_if_fail (get_container_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + + list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW); + + view = GIMP_CONTAINER_VIEW (list_view); + + view->preview_size = preview_size; + + list_view->drawable_type = drawable_type; + list_view->signal_name = g_strdup (signal_name); + list_view->get_container_func = get_container_func; + list_view->get_drawable_func = get_drawable_func; + list_view->set_drawable_func = set_drawable_func; + + /* drop to "new" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->new_button), + drawable_type, + gimp_drawable_list_view_new_dropped, + list_view); + + /* drop to "duplicate" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->duplicate_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->duplicate_button), + drawable_type, + gimp_drawable_list_view_duplicate_dropped, + list_view); + + /* drop to "edit" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->edit_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->edit_button), + drawable_type, + gimp_drawable_list_view_edit_dropped, + list_view); + + /* drop to "delete" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->delete_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->delete_button), + drawable_type, + gimp_drawable_list_view_delete_dropped, + list_view); + + if (gimage) + gimp_drawable_list_view_set_image (list_view, gimage); + + return GTK_WIDGET (list_view); +} + +void +gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage) +{ + g_return_if_fail (view != NULL); + g_return_if_fail (GIMP_IS_DRAWABLE_LIST_VIEW (view)); + g_return_if_fail (! gimage || GIMP_IS_IMAGE (gimage)); + + if (view->gimage == gimage) + return; + + if (view->gimage) + { + gtk_signal_disconnect_by_func (GTK_OBJECT (view->gimage), + gimp_drawable_list_view_drawable_changed, + view); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), NULL); + } + + view->gimage = gimage; + + if (view->gimage) + { + GimpContainer *container; + + container = view->get_container_func (view->gimage); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), container); + + gtk_signal_connect (GTK_OBJECT (view->gimage), view->signal_name, + GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed), + view); + } +} + +static void +gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view, + item, + insert_data); + + g_print ("select item\n"); +} + +static void +gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item (view, + item, + insert_data); + + g_print ("activate item\n"); +} + +static void +gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("new clicked\n"); +} + +static void +gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("new dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + } +} + +static void +gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("duplicate clicked\n"); +} + +static void +gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("duplicate dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_duplicate_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("raise clicked\n"); +} + +static void +gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("lower clicked\n"); +} + +static void +gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("edit clicked\n"); +} + +static void +gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("edit dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_edit_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("delete clicked\n"); +} + +static void +gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("delete dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_delete_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view) +{ + GimpDrawable *drawable; + + drawable = view->get_drawable_func (gimage); + + gimp_container_view_select_item (GIMP_CONTAINER_VIEW (view), + (GimpViewable *) drawable); +} diff --git a/app/gimpdrawablelistview.h b/app/gimpdrawablelistview.h new file mode 100644 index 0000000000..e22787ed49 --- /dev/null +++ b/app/gimpdrawablelistview.h @@ -0,0 +1,83 @@ +/* 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 __GIMP_DRAWABLE_LIST_VIEW_H__ +#define __GIMP_DRAWABLE_LIST_VIEW_H__ + + +#include "gimpcontainerlistview.h" + + +typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage); +typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage); +typedef void (* GimpSetDrawableFunc) (GimpImage *gimage, + GimpDrawable *drawable); + + +#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ()) +#define GIMP_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListView)) +#define GIMP_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListViewClass)) +#define GIMP_IS_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW)) +#define GIMP_IS_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW)) + + +typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass; + +struct _GimpDrawableListView +{ + GimpContainerListView parent_instance; + + GimpImage *gimage; + + GtkType drawable_type; + gchar *signal_name; + + GimpGetContainerFunc get_container_func; + GimpGetDrawableFunc get_drawable_func; + GimpSetDrawableFunc set_drawable_func; + + GtkWidget *button_box; + + GtkWidget *new_button; + GtkWidget *raise_button; + GtkWidget *lower_button; + GtkWidget *duplicate_button; + GtkWidget *edit_button; + GtkWidget *delete_button; +}; + +struct _GimpDrawableListViewClass +{ + GimpContainerListViewClass parent_class; +}; + + +GtkType gimp_drawable_list_view_get_type (void); + +GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func); + +void gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage); + + +#endif /* __GIMP_DRAWABLE_LIST_VIEW_H__ */ diff --git a/app/gimpimage-duplicate.c b/app/gimpimage-duplicate.c index 11e5390c1e..5fcac39216 100644 --- a/app/gimpimage-duplicate.c +++ b/app/gimpimage-duplicate.c @@ -575,11 +575,11 @@ duplicate (GimpImage *gimage) GimpLayer *floating_layer; GimpChannel *channel, *new_channel; GList *list; - Guide *guide = NULL; - GimpLayer *active_layer = NULL; - GimpChannel *active_channel = NULL; + Guide *guide = NULL; + GimpLayer *active_layer = NULL; + GimpChannel *active_channel = NULL; GimpDrawable *new_floating_sel_drawable = NULL; - GimpDrawable *floating_sel_drawable = NULL; + GimpDrawable *floating_sel_drawable = NULL; ParasiteList *parasites; PathList *paths; gint count; diff --git a/app/gimpimage.c b/app/gimpimage.c index 3017fc8ab0..56a8b02cb3 100644 --- a/app/gimpimage.c +++ b/app/gimpimage.c @@ -152,6 +152,8 @@ guint32 next_guide_id = 1; /* For generating guide_ID handles for PDB stuff */ enum { + ACTIVE_LAYER_CHANGED, + ACTIVE_CHANNEL_CHANGED, CLEAN, DIRTY, REPAINT, @@ -205,6 +207,24 @@ gimp_image_class_init (GimpImageClass *klass) parent_class = gtk_type_class (GIMP_TYPE_VIEWABLE); + gimp_image_signals[ACTIVE_LAYER_CHANGED] = + gtk_signal_new ("active_layer_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_layer_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + + gimp_image_signals[ACTIVE_CHANNEL_CHANGED] = + gtk_signal_new ("active_channel_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (GimpImageClass, + active_channel_changed), + gtk_signal_default_marshaller, + GTK_TYPE_NONE, 0); + gimp_image_signals[CLEAN] = gtk_signal_new ("clean", GTK_RUN_FIRST, @@ -2133,6 +2153,24 @@ gimp_image_invalidate_channel_previews (GimpImage *gimage) NULL); } +GimpContainer * +gimp_image_get_layers (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->layers; +} + +GimpContainer * +gimp_image_get_channels (const GimpImage *gimage) +{ + g_return_val_if_fail (gimage != NULL, NULL); + g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); + + return gimage->channels; +} + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer) @@ -2327,22 +2365,31 @@ gimp_image_set_active_layer (GimpImage *gimage, if (! gimp_container_have (gimage->layers, GIMP_OBJECT (layer))) layer = (GimpLayer *) gimp_container_get_child_by_index (gimage->layers, 0); - if (! layer) + if (layer) { - gimage->active_layer = NULL; - return NULL; + /* Configure the layer stack to reflect this change */ + gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); + gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + + /* invalidate the selection boundary because of a layer modification */ + gimp_layer_invalidate_boundary (layer); } - /* Configure the layer stack to reflect this change */ - gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer); - gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer); + if (layer != gimage->active_layer) + { + gimage->active_layer = layer; - /* invalidate the selection boundary because of a layer modification */ - gimp_layer_invalidate_boundary (layer); + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); - /* Set the active layer */ - gimage->active_layer = layer; - gimage->active_channel = NULL; + if (gimage->active_channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + } + } /* return the layer */ return layer; @@ -2364,14 +2411,21 @@ gimp_image_set_active_channel (GimpImage *gimage, if (! gimp_container_have (gimage->channels, GIMP_OBJECT (channel))) channel = (GimpChannel *) gimp_container_get_child_by_index (gimage->channels, 0); - if (! channel) + if (channel != gimage->active_channel) { - gimage->active_channel = NULL; - return NULL; - } + gimage->active_channel = channel; - /* Set the active channel */ - gimage->active_channel = channel; + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->active_layer) + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } + } /* return the channel */ return channel; @@ -2384,12 +2438,24 @@ gimp_image_unset_active_channel (GimpImage *gimage) g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - /* make sure there is an active channel */ - if (! (channel = gimage->active_channel)) - return NULL; + channel = gimp_image_get_active_channel (gimage); - /* Set the active channel */ - gimage->active_channel = NULL; + if (channel) + { + gimage->active_channel = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_CHANNEL_CHANGED]); + + if (gimage->layer_stack) + { + GimpLayer *layer; + + layer = (GimpLayer *) gimage->layer_stack->data; + + gimp_image_set_active_layer (gimage, layer); + } + } return channel; } @@ -3125,7 +3191,7 @@ gimp_image_add_layer (GimpImage *gimage, /* let the layer know about the gimage */ gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage); - /* If the layer has a mask, set the mask's gimage and layer */ + /* If the layer has a mask, set the mask's gimage */ if (layer->mask) { gimp_drawable_set_gimage (GIMP_DRAWABLE (layer->mask), gimage); @@ -3133,18 +3199,30 @@ gimp_image_add_layer (GimpImage *gimage, /* add the layer to the list at the specified position */ if (position == -1) - position = - gimp_container_get_child_index (gimage->layers, - GIMP_OBJECT (gimage->active_layer)); - - if (position != -1) { - /* If there is a floating selection (and this isn't it!), - * make sure the insert position is greater than 0 - */ - if (gimp_image_floating_sel (gimage) && - (gimage->floating_sel != layer) && position == 0) - position = 1; + GimpLayer *active_layer; + + active_layer = gimp_image_get_active_layer (gimage); + + if (active_layer) + { + position = gimp_container_get_child_index (gimage->layers, + GIMP_OBJECT (active_layer)); + } + else + { + position = 0; + } + } + + /* If there is a floating selection (and this isn't it!), + * make sure the insert position is greater than 0 + */ + if (position == 0 && + gimp_image_floating_sel (gimage) && + (gimage->floating_sel != layer)) + { + position = 1; } gimp_container_insert (gimage->layers, GIMP_OBJECT (layer), position); @@ -3204,9 +3282,16 @@ gimp_image_remove_layer (GimpImage *gimage, if (layer == gimp_image_get_active_layer (gimage)) { if (gimage->layer_stack) - gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + { + gimp_image_set_active_layer (gimage, gimage->layer_stack->data); + } else - gimage->active_layer = NULL; + { + gimage->active_layer = NULL; + + gtk_signal_emit (GTK_OBJECT (gimage), + gimp_image_signals[ACTIVE_LAYER_CHANGED]); + } } /* Send out REMOVED signal from layer */ @@ -3524,8 +3609,6 @@ gimp_image_is_empty (const GimpImage *gimage) GimpDrawable * gimp_image_active_drawable (const GimpImage *gimage) { - GimpLayer *layer; - g_return_val_if_fail (gimage != NULL, NULL); g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); @@ -3538,6 +3621,8 @@ gimp_image_active_drawable (const GimpImage *gimage) } else if (gimage->active_layer) { + GimpLayer *layer; + layer = gimage->active_layer; if (layer->mask && layer->edit_mask) diff --git a/app/gimpimage.h b/app/gimpimage.h index 805e30de37..9006493e57 100644 --- a/app/gimpimage.h +++ b/app/gimpimage.h @@ -142,13 +142,21 @@ struct _GimpImageClass { GimpViewableClass parent_class; - void (* clean) (GimpImage *gimage); - void (* dirty) (GimpImage *gimage); - void (* repaint) (GimpImage *gimage); - void (* resize) (GimpImage *gimage); - void (* restructure) (GimpImage *gimage); - void (* colormap_changed) (GimpImage *gimage); - void (* undo_event) (GimpImage *gimage); + void (* active_layer_changed) (GimpImage *gimage); + void (* active_channel_changed) (GimpImage *gimage); + void (* clean) (GimpImage *gimage); + void (* dirty) (GimpImage *gimage); + void (* repaint) (GimpImage *gimage, + gint x1, + gint y1, + gint x2, + gint y2); + void (* resize) (GimpImage *gimage); + void (* restructure) (GimpImage *gimage); + void (* colormap_changed) (GimpImage *gimage, + gint color_index); + void (* undo_event) (GimpImage *gimage, + gint event); }; @@ -283,6 +291,9 @@ void gimp_image_colormap_changed (const GimpImage *image, /* layer/channel functions */ +GimpContainer * gimp_image_get_layers (const GimpImage *gimage); +GimpContainer * gimp_image_get_channels (const GimpImage *gimage); + gint gimp_image_get_layer_index (const GimpImage *gimage, const GimpLayer *layer); gint gimp_image_get_channel_index (const GimpImage *gimage, diff --git a/app/gui/commands.c b/app/gui/commands.c index f92ff8fca8..33e87730c2 100644 --- a/app/gui/commands.c +++ b/app/gui/commands.c @@ -52,6 +52,7 @@ #include "floating_sel.h" #include "gdisplay_ops.h" #include "gimage_mask.h" +#include "gimpcontainer.h" #include "gimpcontext.h" #include "gimpdrawable.h" #include "gimphelp.h" @@ -82,17 +83,6 @@ #include "undo.h" #include "undo_history.h" - -/* for the example dialogs */ -#include "gradient_editor.h" -#include "gimpcontainer.h" -#include "gimpcontainerlistview.h" -#include "gimpcontainergridview.h" -#include "gimpdatafactory.h" -#include "gimpdatafactoryview.h" -#include "gimppreview.h" - - #ifdef DISPLAY_FILTERS #include "gdisplay_color_ui.h" #endif /* DISPLAY_FILTERS */ @@ -1381,575 +1371,6 @@ dialogs_module_browser_cmd_callback (GtkWidget *widget, gtk_widget_show (module_browser); } -/***** Container View Test Dialogs *****/ - -static void -container_view_scale_callback (GtkAdjustment *adj, - GimpContainerView *view) -{ - gimp_container_view_set_preview_size (view, ROUND (adj->value)); -} - -static void -brushes_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_brush_factory->container); -} - -static void -patterns_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_pattern_factory->container); -} - -static void -gradients_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_gradient_factory->container); -} - -static void -palettes_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_palette_factory->container); -} - -static void -images_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, image_context); -} - -/* -static void -null_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, NULL); -} -*/ - -static void -container_view_new (gboolean list, - gchar *title, - GimpContainer *container, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - - if (list) - { - view = gimp_container_list_view_new (container, - context, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (container, - context, - preview_size, - 5, 5); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - /* - gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 1))); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - view); - - gtk_widget_show (dialog); -} - -static void -data_factory_view_new (GimpViewType view_type, - gchar *title, - GimpDataFactory *factory, - GimpDataEditFunc edit_func, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - - view = gimp_data_factory_view_new (view_type, - factory, - edit_func, - context, - preview_size, - 5, 5); - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - GIMP_DATA_FACTORY_VIEW (view)->view); - - gtk_widget_show (dialog); -} - -static void -container_multi_view_new (gboolean list, - gchar *title, - GimpContainer *container, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - GtkWidget *preview; - - if (list) - { - view = gimp_container_list_view_new (container, - context, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (container, - context, - preview_size, - 5, 5); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "Images", images_callback, - view, NULL, NULL, FALSE, FALSE, - - /* - "NULL", null_callback, - view, NULL, NULL, FALSE, FALSE, - */ - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, FALSE, TRUE, - - NULL); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_brush (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (brushes_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "brush_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_pattern (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (patterns_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "pattern_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_gradient (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (gradients_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "gradient_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_palette (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (palettes_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "palette_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - /* - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_image (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (images_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "pattern_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 64, 4, 4, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - view); - - gtk_widget_show (dialog); -} - -void -dialogs_test_image_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_view_new (TRUE, "Image List", - image_context, - gimp_context_get_user (), - 64); -} - -void -dialogs_test_image_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_view_new (FALSE, "Image Grid", - image_context, - gimp_context_get_user (), - 64); -} - -void -dialogs_test_brush_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Brush List", - global_brush_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_pattern_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Pattern List", - global_pattern_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_gradient_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Gradient List", - global_gradient_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_palette_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Palette List", - global_palette_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_brush_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Brush Grid", - global_brush_factory, - NULL, - gimp_context_get_user (), - 32); -} - -void -dialogs_test_pattern_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Pattern Grid", - global_pattern_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_gradient_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Gradient Grid", - global_gradient_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_palette_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Palette Grid", - global_palette_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_multi_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_multi_view_new (TRUE, "Multi List", - global_brush_factory->container, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_multi_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_multi_view_new (FALSE, "Multi Grid", - global_brush_factory->container, - gimp_context_get_user (), - 32); -} - -static void -layers_view_image_changed (GimpContext *context, - GimpImage *gimage, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, gimage ? gimage->layers : NULL); -} - -static void -channels_view_image_changed (GimpContext *context, - GimpImage *gimage, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, gimage ? gimage->channels : NULL); -} - -static void -drawable_view_new (GimpViewType view_type, - gchar *title, - gboolean channels, - GimpContext *context) -{ - GimpImage *gimage; - GtkWidget *dialog; - GtkWidget *view; - - if (view_type == GIMP_VIEW_TYPE_LIST) - { - view = gimp_container_list_view_new (NULL, - NULL, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (NULL, - NULL, - preview_size, - 5, 5); - } - - gimage = gimp_context_get_image (context); - - if (channels) - { - if (gimage) - gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), - gimage->channels); - - gtk_signal_connect (GTK_OBJECT (context), "image_changed", - GTK_SIGNAL_FUNC (channels_view_image_changed), - view); - } - else - { - if (gimage) - gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), - gimage->layers); - - gtk_signal_connect (GTK_OBJECT (context), "image_changed", - GTK_SIGNAL_FUNC (layers_view_image_changed), - view); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - /* - gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 1))); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - gtk_widget_show (dialog); -} - -void -dialogs_test_layer_list_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_LIST, "Layer List", FALSE, - gimp_context_get_user ()); -} - -void -dialogs_test_layer_grid_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_GRID, "Layer Grid", FALSE, - gimp_context_get_user ()); -} - -void -dialogs_test_channel_list_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_LIST, "Channel List", TRUE, - gimp_context_get_user ()); -} - -void -dialogs_test_channel_grid_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_GRID, "Channel Grid", TRUE, - gimp_context_get_user ()); -} /***** Help *****/ diff --git a/app/gui/commands.h b/app/gui/commands.h index 68dde288cf..e8bac6c04f 100644 --- a/app/gui/commands.h +++ b/app/gui/commands.h @@ -20,31 +20,31 @@ #define __COMMANDS_H__ -void file_new_cmd_callback (GtkWidget *, gpointer, guint); -void file_open_cmd_callback (GtkWidget *, gpointer); -void file_save_cmd_callback (GtkWidget *, gpointer); -void file_save_as_cmd_callback (GtkWidget *, gpointer); -void file_save_a_copy_as_cmd_callback (GtkWidget *, gpointer); -void file_revert_cmd_callback (GtkWidget *, gpointer); -void file_pref_cmd_callback (GtkWidget *, gpointer); -void file_close_cmd_callback (GtkWidget *, gpointer); -void file_quit_cmd_callback (GtkWidget *, gpointer); +void file_new_cmd_callback (GtkWidget *, gpointer, guint); +void file_open_cmd_callback (GtkWidget *, gpointer); +void file_save_cmd_callback (GtkWidget *, gpointer); +void file_save_as_cmd_callback (GtkWidget *, gpointer); +void file_save_a_copy_as_cmd_callback (GtkWidget *, gpointer); +void file_revert_cmd_callback (GtkWidget *, gpointer); +void file_pref_cmd_callback (GtkWidget *, gpointer); +void file_close_cmd_callback (GtkWidget *, gpointer); +void file_quit_cmd_callback (GtkWidget *, gpointer); -void edit_undo_cmd_callback (GtkWidget *, gpointer); -void edit_redo_cmd_callback (GtkWidget *, gpointer); -void edit_cut_cmd_callback (GtkWidget *, gpointer); -void edit_copy_cmd_callback (GtkWidget *, gpointer); -void edit_paste_cmd_callback (GtkWidget *, gpointer); -void edit_paste_into_cmd_callback (GtkWidget *, gpointer); -void edit_paste_as_new_cmd_callback (GtkWidget *, gpointer); -void edit_named_cut_cmd_callback (GtkWidget *, gpointer); -void edit_named_copy_cmd_callback (GtkWidget *, gpointer); -void edit_named_paste_cmd_callback (GtkWidget *, gpointer); -void edit_clear_cmd_callback (GtkWidget *, gpointer); -void edit_fill_cmd_callback (GtkWidget *widget, - gpointer callback_data, - guint callback_action); -void edit_stroke_cmd_callback (GtkWidget *, gpointer); +void edit_undo_cmd_callback (GtkWidget *, gpointer); +void edit_redo_cmd_callback (GtkWidget *, gpointer); +void edit_cut_cmd_callback (GtkWidget *, gpointer); +void edit_copy_cmd_callback (GtkWidget *, gpointer); +void edit_paste_cmd_callback (GtkWidget *, gpointer); +void edit_paste_into_cmd_callback (GtkWidget *, gpointer); +void edit_paste_as_new_cmd_callback (GtkWidget *, gpointer); +void edit_named_cut_cmd_callback (GtkWidget *, gpointer); +void edit_named_copy_cmd_callback (GtkWidget *, gpointer); +void edit_named_paste_cmd_callback (GtkWidget *, gpointer); +void edit_clear_cmd_callback (GtkWidget *, gpointer); +void edit_fill_cmd_callback (GtkWidget *widget, + gpointer callback_data, + guint callback_action); +void edit_stroke_cmd_callback (GtkWidget *, gpointer); void select_invert_cmd_callback (GtkWidget *, gpointer); void select_all_cmd_callback (GtkWidget *, gpointer); @@ -129,37 +129,16 @@ void dialogs_device_status_cmd_callback (GtkWidget *, gpointer); void dialogs_document_index_cmd_callback (GtkWidget *, gpointer); void dialogs_error_console_cmd_callback (GtkWidget *, gpointer); void dialogs_undo_history_cmd_callback (GtkWidget *, gpointer); - void dialogs_module_browser_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_image_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_image_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_brush_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_pattern_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_gradient_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_palette_container_list_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_brush_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_pattern_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_gradient_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_palette_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_multi_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_multi_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_layer_list_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_layer_grid_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_channel_list_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_channel_grid_cmd_callback (GtkWidget *, gpointer); - -void help_help_cmd_callback (GtkWidget *, gpointer); -void help_context_help_cmd_callback (GtkWidget *, gpointer); -void help_tips_cmd_callback (GtkWidget *, gpointer); -void help_about_cmd_callback (GtkWidget *, gpointer); - #ifdef DISPLAY_FILTERS -void dialogs_display_filters_cmd_callback (GtkWidget *, gpointer); +void dialogs_display_filters_cmd_callback (GtkWidget *, gpointer); #endif /* DISPLAY_FILTERS */ +void help_help_cmd_callback (GtkWidget *, gpointer); +void help_context_help_cmd_callback (GtkWidget *, gpointer); +void help_tips_cmd_callback (GtkWidget *, gpointer); +void help_about_cmd_callback (GtkWidget *, gpointer); + + #endif /* __COMMANDS_H__ */ diff --git a/app/gui/help-commands.c b/app/gui/help-commands.c index f92ff8fca8..33e87730c2 100644 --- a/app/gui/help-commands.c +++ b/app/gui/help-commands.c @@ -52,6 +52,7 @@ #include "floating_sel.h" #include "gdisplay_ops.h" #include "gimage_mask.h" +#include "gimpcontainer.h" #include "gimpcontext.h" #include "gimpdrawable.h" #include "gimphelp.h" @@ -82,17 +83,6 @@ #include "undo.h" #include "undo_history.h" - -/* for the example dialogs */ -#include "gradient_editor.h" -#include "gimpcontainer.h" -#include "gimpcontainerlistview.h" -#include "gimpcontainergridview.h" -#include "gimpdatafactory.h" -#include "gimpdatafactoryview.h" -#include "gimppreview.h" - - #ifdef DISPLAY_FILTERS #include "gdisplay_color_ui.h" #endif /* DISPLAY_FILTERS */ @@ -1381,575 +1371,6 @@ dialogs_module_browser_cmd_callback (GtkWidget *widget, gtk_widget_show (module_browser); } -/***** Container View Test Dialogs *****/ - -static void -container_view_scale_callback (GtkAdjustment *adj, - GimpContainerView *view) -{ - gimp_container_view_set_preview_size (view, ROUND (adj->value)); -} - -static void -brushes_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_brush_factory->container); -} - -static void -patterns_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_pattern_factory->container); -} - -static void -gradients_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_gradient_factory->container); -} - -static void -palettes_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, global_palette_factory->container); -} - -static void -images_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, image_context); -} - -/* -static void -null_callback (GtkWidget *widget, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, NULL); -} -*/ - -static void -container_view_new (gboolean list, - gchar *title, - GimpContainer *container, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - - if (list) - { - view = gimp_container_list_view_new (container, - context, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (container, - context, - preview_size, - 5, 5); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - /* - gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 1))); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - view); - - gtk_widget_show (dialog); -} - -static void -data_factory_view_new (GimpViewType view_type, - gchar *title, - GimpDataFactory *factory, - GimpDataEditFunc edit_func, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - - view = gimp_data_factory_view_new (view_type, - factory, - edit_func, - context, - preview_size, - 5, 5); - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - GIMP_DATA_FACTORY_VIEW (view)->view); - - gtk_widget_show (dialog); -} - -static void -container_multi_view_new (gboolean list, - gchar *title, - GimpContainer *container, - GimpContext *context, - gint preview_size) -{ - GtkWidget *dialog; - GtkWidget *view; - GtkObject *adjustment; - GtkWidget *scale; - GtkWidget *preview; - - if (list) - { - view = gimp_container_list_view_new (container, - context, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (container, - context, - preview_size, - 5, 5); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "Images", images_callback, - view, NULL, NULL, FALSE, FALSE, - - /* - "NULL", null_callback, - view, NULL, NULL, FALSE, FALSE, - */ - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, FALSE, TRUE, - - NULL); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_brush (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (brushes_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "brush_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_pattern (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (patterns_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "pattern_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_gradient (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (gradients_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "gradient_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_palette (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (palettes_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "palette_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - - /* - preview = - gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_image (context)), - 32, 32, 1, - FALSE, TRUE, FALSE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, - FALSE, FALSE, 0); - gtk_widget_show (preview); - - gtk_signal_connect (GTK_OBJECT (preview), "clicked", - GTK_SIGNAL_FUNC (images_callback), - view); - - gtk_signal_connect_object_while_alive - (GTK_OBJECT (context), - "pattern_changed", - GTK_SIGNAL_FUNC (gimp_preview_set_viewable), - GTK_OBJECT (preview)); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - adjustment = gtk_adjustment_new (preview_size, 16, 64, 4, 4, 0); - scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, - FALSE, FALSE, 0); - gtk_widget_show (scale); - - gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (container_view_scale_callback), - view); - - gtk_widget_show (dialog); -} - -void -dialogs_test_image_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_view_new (TRUE, "Image List", - image_context, - gimp_context_get_user (), - 64); -} - -void -dialogs_test_image_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_view_new (FALSE, "Image Grid", - image_context, - gimp_context_get_user (), - 64); -} - -void -dialogs_test_brush_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Brush List", - global_brush_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_pattern_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Pattern List", - global_pattern_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_gradient_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Gradient List", - global_gradient_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_palette_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_LIST, - "Palette List", - global_palette_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_brush_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Brush Grid", - global_brush_factory, - NULL, - gimp_context_get_user (), - 32); -} - -void -dialogs_test_pattern_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Pattern Grid", - global_pattern_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_gradient_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Gradient Grid", - global_gradient_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_palette_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - data_factory_view_new (GIMP_VIEW_TYPE_GRID, - "Palette Grid", - global_palette_factory, - NULL, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_multi_container_list_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_multi_view_new (TRUE, "Multi List", - global_brush_factory->container, - gimp_context_get_user (), - 24); -} - -void -dialogs_test_multi_container_grid_view_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - container_multi_view_new (FALSE, "Multi Grid", - global_brush_factory->container, - gimp_context_get_user (), - 32); -} - -static void -layers_view_image_changed (GimpContext *context, - GimpImage *gimage, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, gimage ? gimage->layers : NULL); -} - -static void -channels_view_image_changed (GimpContext *context, - GimpImage *gimage, - GimpContainerView *view) -{ - gimp_container_view_set_container (view, gimage ? gimage->channels : NULL); -} - -static void -drawable_view_new (GimpViewType view_type, - gchar *title, - gboolean channels, - GimpContext *context) -{ - GimpImage *gimage; - GtkWidget *dialog; - GtkWidget *view; - - if (view_type == GIMP_VIEW_TYPE_LIST) - { - view = gimp_container_list_view_new (NULL, - NULL, - preview_size, - 5, 5); - } - else - { - view = gimp_container_grid_view_new (NULL, - NULL, - preview_size, - 5, 5); - } - - gimage = gimp_context_get_image (context); - - if (channels) - { - if (gimage) - gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), - gimage->channels); - - gtk_signal_connect (GTK_OBJECT (context), "image_changed", - GTK_SIGNAL_FUNC (channels_view_image_changed), - view); - } - else - { - if (gimage) - gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), - gimage->layers); - - gtk_signal_connect (GTK_OBJECT (context), "image_changed", - GTK_SIGNAL_FUNC (layers_view_image_changed), - view); - } - - dialog = gimp_dialog_new (title, "test", - gimp_standard_help_func, - NULL, - GTK_WIN_POS_MOUSE, - FALSE, TRUE, TRUE, - - "_delete_event_", gtk_widget_destroy, - NULL, 1, NULL, TRUE, TRUE, - - NULL); - - gtk_widget_hide (GTK_DIALOG (dialog)->action_area); - /* - gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 1))); - */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); - gtk_widget_show (view); - - gtk_widget_show (dialog); -} - -void -dialogs_test_layer_list_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_LIST, "Layer List", FALSE, - gimp_context_get_user ()); -} - -void -dialogs_test_layer_grid_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_GRID, "Layer Grid", FALSE, - gimp_context_get_user ()); -} - -void -dialogs_test_channel_list_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_LIST, "Channel List", TRUE, - gimp_context_get_user ()); -} - -void -dialogs_test_channel_grid_cmd_callback (GtkWidget *widget, - gpointer client_data) -{ - drawable_view_new (GIMP_VIEW_TYPE_GRID, "Channel Grid", TRUE, - gimp_context_get_user ()); -} /***** Help *****/ diff --git a/app/gui/help-commands.h b/app/gui/help-commands.h index 68dde288cf..e8bac6c04f 100644 --- a/app/gui/help-commands.h +++ b/app/gui/help-commands.h @@ -20,31 +20,31 @@ #define __COMMANDS_H__ -void file_new_cmd_callback (GtkWidget *, gpointer, guint); -void file_open_cmd_callback (GtkWidget *, gpointer); -void file_save_cmd_callback (GtkWidget *, gpointer); -void file_save_as_cmd_callback (GtkWidget *, gpointer); -void file_save_a_copy_as_cmd_callback (GtkWidget *, gpointer); -void file_revert_cmd_callback (GtkWidget *, gpointer); -void file_pref_cmd_callback (GtkWidget *, gpointer); -void file_close_cmd_callback (GtkWidget *, gpointer); -void file_quit_cmd_callback (GtkWidget *, gpointer); +void file_new_cmd_callback (GtkWidget *, gpointer, guint); +void file_open_cmd_callback (GtkWidget *, gpointer); +void file_save_cmd_callback (GtkWidget *, gpointer); +void file_save_as_cmd_callback (GtkWidget *, gpointer); +void file_save_a_copy_as_cmd_callback (GtkWidget *, gpointer); +void file_revert_cmd_callback (GtkWidget *, gpointer); +void file_pref_cmd_callback (GtkWidget *, gpointer); +void file_close_cmd_callback (GtkWidget *, gpointer); +void file_quit_cmd_callback (GtkWidget *, gpointer); -void edit_undo_cmd_callback (GtkWidget *, gpointer); -void edit_redo_cmd_callback (GtkWidget *, gpointer); -void edit_cut_cmd_callback (GtkWidget *, gpointer); -void edit_copy_cmd_callback (GtkWidget *, gpointer); -void edit_paste_cmd_callback (GtkWidget *, gpointer); -void edit_paste_into_cmd_callback (GtkWidget *, gpointer); -void edit_paste_as_new_cmd_callback (GtkWidget *, gpointer); -void edit_named_cut_cmd_callback (GtkWidget *, gpointer); -void edit_named_copy_cmd_callback (GtkWidget *, gpointer); -void edit_named_paste_cmd_callback (GtkWidget *, gpointer); -void edit_clear_cmd_callback (GtkWidget *, gpointer); -void edit_fill_cmd_callback (GtkWidget *widget, - gpointer callback_data, - guint callback_action); -void edit_stroke_cmd_callback (GtkWidget *, gpointer); +void edit_undo_cmd_callback (GtkWidget *, gpointer); +void edit_redo_cmd_callback (GtkWidget *, gpointer); +void edit_cut_cmd_callback (GtkWidget *, gpointer); +void edit_copy_cmd_callback (GtkWidget *, gpointer); +void edit_paste_cmd_callback (GtkWidget *, gpointer); +void edit_paste_into_cmd_callback (GtkWidget *, gpointer); +void edit_paste_as_new_cmd_callback (GtkWidget *, gpointer); +void edit_named_cut_cmd_callback (GtkWidget *, gpointer); +void edit_named_copy_cmd_callback (GtkWidget *, gpointer); +void edit_named_paste_cmd_callback (GtkWidget *, gpointer); +void edit_clear_cmd_callback (GtkWidget *, gpointer); +void edit_fill_cmd_callback (GtkWidget *widget, + gpointer callback_data, + guint callback_action); +void edit_stroke_cmd_callback (GtkWidget *, gpointer); void select_invert_cmd_callback (GtkWidget *, gpointer); void select_all_cmd_callback (GtkWidget *, gpointer); @@ -129,37 +129,16 @@ void dialogs_device_status_cmd_callback (GtkWidget *, gpointer); void dialogs_document_index_cmd_callback (GtkWidget *, gpointer); void dialogs_error_console_cmd_callback (GtkWidget *, gpointer); void dialogs_undo_history_cmd_callback (GtkWidget *, gpointer); - void dialogs_module_browser_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_image_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_image_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_brush_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_pattern_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_gradient_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_palette_container_list_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_brush_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_pattern_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_gradient_container_grid_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_palette_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_multi_container_list_view_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_multi_container_grid_view_cmd_callback (GtkWidget *, gpointer); - -void dialogs_test_layer_list_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_layer_grid_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_channel_list_cmd_callback (GtkWidget *, gpointer); -void dialogs_test_channel_grid_cmd_callback (GtkWidget *, gpointer); - -void help_help_cmd_callback (GtkWidget *, gpointer); -void help_context_help_cmd_callback (GtkWidget *, gpointer); -void help_tips_cmd_callback (GtkWidget *, gpointer); -void help_about_cmd_callback (GtkWidget *, gpointer); - #ifdef DISPLAY_FILTERS -void dialogs_display_filters_cmd_callback (GtkWidget *, gpointer); +void dialogs_display_filters_cmd_callback (GtkWidget *, gpointer); #endif /* DISPLAY_FILTERS */ +void help_help_cmd_callback (GtkWidget *, gpointer); +void help_context_help_cmd_callback (GtkWidget *, gpointer); +void help_tips_cmd_callback (GtkWidget *, gpointer); +void help_about_cmd_callback (GtkWidget *, gpointer); + + #endif /* __COMMANDS_H__ */ diff --git a/app/gui/layers-dialog.c b/app/gui/layers-dialog.c index c8dbd0cf28..858d6ed04a 100644 --- a/app/gui/layers-dialog.c +++ b/app/gui/layers-dialog.c @@ -1191,6 +1191,9 @@ layers_dialog_set_active_layer (GimpLayer *layer) GtkStateType state; gint index; + if (! layer) + return; + layer_widget = layer_widget_get_ID (layer); if (!layersD || !layer_widget) return; @@ -1225,6 +1228,9 @@ layers_dialog_unset_layer (GimpLayer *layer) GtkStateType state; gint index; + if (! layer) + return; + layer_widget = layer_widget_get_ID (layer); if (!layersD || !layer_widget) return; diff --git a/app/gui/menus.c b/app/gui/menus.c index cc510f92f4..c3723bbf55 100644 --- a/app/gui/menus.c +++ b/app/gui/menus.c @@ -43,6 +43,9 @@ #include "menus.h" #include "paths_dialog.h" +/* test dialogs */ +#include "test_commands.h" + #include "libgimp/gimpenv.h" #include "libgimp/gimpintl.h" @@ -157,53 +160,49 @@ static GimpItemFactoryEntry toolbox_entries[] = "file/dialogs/display_filters/display_filters.html", NULL }, #endif /* DISPLAY_FILTERS */ - { { N_("/File/Test Dialogs/Layer List..."), NULL, dialogs_test_layer_list_cmd_callback, 1 }, + { { N_("/File/Test Dialogs/Layer List..."), NULL, test_layer_list_cmd_callback, 1 }, NULL, NULL }, - { { N_("/File/Test Dialogs/Layer Grid..."), NULL, dialogs_test_layer_grid_cmd_callback, 1 }, - NULL, NULL }, - { { N_("/File/Test Dialogs/Channel List..."), NULL, dialogs_test_channel_list_cmd_callback, 1 }, - NULL, NULL }, - { { N_("/File/Test Dialogs/Channel Grid..."), NULL, dialogs_test_channel_grid_cmd_callback, 1 }, + { { N_("/File/Test Dialogs/Channel List..."), NULL, test_channel_list_cmd_callback, 1 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Images List...", NULL, dialogs_test_image_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Images List...", NULL, test_image_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Images Grid...", NULL, dialogs_test_image_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Images Grid...", NULL, test_image_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Brushe List...", NULL, dialogs_test_brush_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Brushe List...", NULL, test_brush_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Pattern List...", NULL, dialogs_test_pattern_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Pattern List...", NULL, test_pattern_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Gradient List...", NULL, dialogs_test_gradient_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Gradient List...", NULL, test_gradient_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Palette List...", NULL, dialogs_test_palette_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Palette List...", NULL, test_palette_container_list_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Brushe Grid...", NULL, dialogs_test_brush_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Brushe Grid...", NULL, test_brush_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Pattern Grid...", NULL, dialogs_test_pattern_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Pattern Grid...", NULL, test_pattern_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Gradient Grid...", NULL, dialogs_test_gradient_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Gradient Grid...", NULL, test_gradient_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Palette Grid...", NULL, dialogs_test_palette_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Palette Grid...", NULL, test_palette_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Multi List...", NULL, dialogs_test_multi_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Multi List...", NULL, test_multi_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Multi Grid...", NULL, dialogs_test_multi_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Multi Grid...", NULL, test_multi_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/---", NULL, NULL, 0, "" }, diff --git a/app/gui/test-commands.c b/app/gui/test-commands.c new file mode 100644 index 0000000000..acbac301ec --- /dev/null +++ b/app/gui/test-commands.c @@ -0,0 +1,582 @@ +/* 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. + */ + +#include "config.h" + +#include + +#include "libgimpmath/gimpmath.h" +#include "libgimpwidgets/gimpwidgets.h" + +#include "apptypes.h" + +#include "context_manager.h" +#include "gradient_editor.h" +#include "gimpchannel.h" +#include "gimpcontainer.h" +#include "gimpcontainerlistview.h" +#include "gimpcontainergridview.h" +#include "gimpcontext.h" +#include "gimpdatafactory.h" +#include "gimpdatafactoryview.h" +#include "gimpdrawablelistview.h" +#include "gimpimage.h" +#include "gimplayer.h" +#include "gimppreview.h" +#include "gimprc.h" + +#include "libgimp/gimpintl.h" + + +#define return_if_no_display(gdisp) \ + gdisp = gdisplay_active (); \ + if (!gdisp) return + + +/***** Container View Test Dialogs *****/ + +static void +container_view_scale_callback (GtkAdjustment *adj, + GimpContainerView *view) +{ + gimp_container_view_set_preview_size (view, ROUND (adj->value)); +} + +static void +brushes_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, global_brush_factory->container); +} + +static void +patterns_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, global_pattern_factory->container); +} + +static void +gradients_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, global_gradient_factory->container); +} + +static void +palettes_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, global_palette_factory->container); +} + +static void +images_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, image_context); +} + +/* +static void +null_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, NULL); +} +*/ + +static void +container_view_new (gboolean list, + gchar *title, + GimpContainer *container, + GimpContext *context, + gint preview_size) +{ + GtkWidget *dialog; + GtkWidget *view; + GtkObject *adjustment; + GtkWidget *scale; + + if (list) + { + view = gimp_container_list_view_new (container, + context, + preview_size, + 5, 5); + } + else + { + view = gimp_container_grid_view_new (container, + context, + preview_size, + 5, 5); + } + + dialog = gimp_dialog_new (title, "test", + gimp_standard_help_func, + NULL, + GTK_WIN_POS_MOUSE, + FALSE, TRUE, TRUE, + + "_delete_event_", gtk_widget_destroy, + NULL, 1, NULL, TRUE, TRUE, + + NULL); + + gtk_widget_hide (GTK_DIALOG (dialog)->action_area); + + gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 0))); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); + gtk_widget_show (view); + + adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); + scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, + FALSE, FALSE, 0); + gtk_widget_show (scale); + + gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", + GTK_SIGNAL_FUNC (container_view_scale_callback), + view); + + gtk_widget_show (dialog); +} + +static void +data_factory_view_new (GimpViewType view_type, + gchar *title, + GimpDataFactory *factory, + GimpDataEditFunc edit_func, + GimpContext *context, + gint preview_size) +{ + GtkWidget *dialog; + GtkWidget *view; + GtkObject *adjustment; + GtkWidget *scale; + + dialog = gimp_dialog_new (title, "test", + gimp_standard_help_func, + NULL, + GTK_WIN_POS_MOUSE, + FALSE, TRUE, TRUE, + + "_delete_event_", gtk_widget_destroy, + NULL, 1, NULL, TRUE, TRUE, + + NULL); + + gtk_widget_hide (GTK_DIALOG (dialog)->action_area); + + view = gimp_data_factory_view_new (view_type, + factory, + edit_func, + context, + preview_size, + 5, 5); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); + gtk_widget_show (view); + + adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); + scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, + FALSE, FALSE, 0); + gtk_widget_show (scale); + + gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", + GTK_SIGNAL_FUNC (container_view_scale_callback), + GIMP_DATA_FACTORY_VIEW (view)->view); + + gtk_widget_show (dialog); +} + +static void +container_multi_view_new (gboolean list, + gchar *title, + GimpContainer *container, + GimpContext *context, + gint preview_size) +{ + GtkWidget *dialog; + GtkWidget *view; + GtkObject *adjustment; + GtkWidget *scale; + GtkWidget *preview; + + if (list) + { + view = gimp_container_list_view_new (container, + context, + preview_size, + 5, 5); + } + else + { + view = gimp_container_grid_view_new (container, + context, + preview_size, + 5, 5); + } + + dialog = gimp_dialog_new (title, "test", + gimp_standard_help_func, + NULL, + GTK_WIN_POS_MOUSE, + FALSE, TRUE, TRUE, + + "Images", images_callback, + view, NULL, NULL, FALSE, FALSE, + + /* + "NULL", null_callback, + view, NULL, NULL, FALSE, FALSE, + */ + + "_delete_event_", gtk_widget_destroy, + NULL, 1, NULL, FALSE, TRUE, + + NULL); + + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_brush (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (brushes_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "brush_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_pattern (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (patterns_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "pattern_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_gradient (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (gradients_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "gradient_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_palette (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (palettes_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "palette_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + + /* + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_image (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (images_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "pattern_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + */ + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); + gtk_widget_show (view); + + adjustment = gtk_adjustment_new (preview_size, 16, 64, 4, 4, 0); + scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, + FALSE, FALSE, 0); + gtk_widget_show (scale); + + gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", + GTK_SIGNAL_FUNC (container_view_scale_callback), + view); + + gtk_widget_show (dialog); +} + +void +test_image_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + container_view_new (TRUE, "Image List", + image_context, + gimp_context_get_user (), + 64); +} + +void +test_image_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + container_view_new (FALSE, "Image Grid", + image_context, + gimp_context_get_user (), + 64); +} + +void +test_brush_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_LIST, + "Brush List", + global_brush_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_pattern_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_LIST, + "Pattern List", + global_pattern_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_gradient_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_LIST, + "Gradient List", + global_gradient_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_palette_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_LIST, + "Palette List", + global_palette_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_brush_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_GRID, + "Brush Grid", + global_brush_factory, + NULL, + gimp_context_get_user (), + 32); +} + +void +test_pattern_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_GRID, + "Pattern Grid", + global_pattern_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_gradient_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_GRID, + "Gradient Grid", + global_gradient_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_palette_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_GRID, + "Palette Grid", + global_palette_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_multi_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + container_multi_view_new (TRUE, "Multi List", + global_brush_factory->container, + gimp_context_get_user (), + 24); +} + +void +test_multi_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + container_multi_view_new (FALSE, "Multi Grid", + global_brush_factory->container, + gimp_context_get_user (), + 32); +} + +static void +drawable_view_image_changed (GimpContext *context, + GimpImage *gimage, + GimpDrawableListView *view) +{ + gimp_drawable_list_view_set_image (view, gimage); +} + +static void +drawable_view_new (gchar *title, + gboolean channels, + GimpContext *context) +{ + GimpImage *gimage; + GtkWidget *dialog; + GtkWidget *view; + + gimage = gimp_context_get_image (context); + + if (channels) + { + view = gimp_drawable_list_view_new (gimage, + GIMP_TYPE_CHANNEL, + "active_channel_changed", + gimp_image_get_channels, + gimp_image_get_active_channel, + gimp_image_set_active_channel); + } + else + { + view = gimp_drawable_list_view_new (gimage, + GIMP_TYPE_LAYER, + "active_layer_changed", + gimp_image_get_layers, + gimp_image_get_active_layer, + gimp_image_set_active_layer); + } + + gtk_list_set_selection_mode (GTK_LIST (GIMP_CONTAINER_LIST_VIEW (view)->gtk_list), + GTK_SELECTION_SINGLE); + + gtk_signal_connect (GTK_OBJECT (context), "image_changed", + GTK_SIGNAL_FUNC (drawable_view_image_changed), + view); + + dialog = gimp_dialog_new (title, "test", + gimp_standard_help_func, + NULL, + GTK_WIN_POS_MOUSE, + FALSE, TRUE, TRUE, + + "_delete_event_", gtk_widget_destroy, + NULL, 1, NULL, TRUE, TRUE, + + NULL); + + gtk_widget_hide (GTK_DIALOG (dialog)->action_area); + + gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 0))); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); + gtk_widget_show (view); + + gtk_widget_show (dialog); +} + +void +test_layer_list_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + drawable_view_new ("Layer List", FALSE, + gimp_context_get_user ()); +} + +void +test_channel_list_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + drawable_view_new ("Channel List", TRUE, + gimp_context_get_user ()); +} diff --git a/app/gui/test-commands.h b/app/gui/test-commands.h new file mode 100644 index 0000000000..39410e2c92 --- /dev/null +++ b/app/gui/test-commands.h @@ -0,0 +1,45 @@ +/* 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 __TEST_COMMANDS_H__ +#define __TEST_COMMANDS_H__ + + +void test_image_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_image_container_grid_view_cmd_callback (GtkWidget *, gpointer); + +void test_brush_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_pattern_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_gradient_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_palette_container_list_view_cmd_callback (GtkWidget *, gpointer); + +void test_brush_container_grid_view_cmd_callback (GtkWidget *, gpointer); +void test_pattern_container_grid_view_cmd_callback (GtkWidget *, gpointer); +void test_gradient_container_grid_view_cmd_callback (GtkWidget *, gpointer); +void test_palette_container_grid_view_cmd_callback (GtkWidget *, gpointer); + +void test_multi_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_multi_container_grid_view_cmd_callback (GtkWidget *, gpointer); + +void test_layer_list_cmd_callback (GtkWidget *, gpointer); +void test_layer_grid_cmd_callback (GtkWidget *, gpointer); +void test_channel_list_cmd_callback (GtkWidget *, gpointer); +void test_channel_grid_cmd_callback (GtkWidget *, gpointer); + + +#endif /* __TEST_COMMANDS_H__ */ diff --git a/app/layers_dialog.c b/app/layers_dialog.c index c8dbd0cf28..858d6ed04a 100644 --- a/app/layers_dialog.c +++ b/app/layers_dialog.c @@ -1191,6 +1191,9 @@ layers_dialog_set_active_layer (GimpLayer *layer) GtkStateType state; gint index; + if (! layer) + return; + layer_widget = layer_widget_get_ID (layer); if (!layersD || !layer_widget) return; @@ -1225,6 +1228,9 @@ layers_dialog_unset_layer (GimpLayer *layer) GtkStateType state; gint index; + if (! layer) + return; + layer_widget = layer_widget_get_ID (layer); if (!layersD || !layer_widget) return; diff --git a/app/menus.c b/app/menus.c index cc510f92f4..c3723bbf55 100644 --- a/app/menus.c +++ b/app/menus.c @@ -43,6 +43,9 @@ #include "menus.h" #include "paths_dialog.h" +/* test dialogs */ +#include "test_commands.h" + #include "libgimp/gimpenv.h" #include "libgimp/gimpintl.h" @@ -157,53 +160,49 @@ static GimpItemFactoryEntry toolbox_entries[] = "file/dialogs/display_filters/display_filters.html", NULL }, #endif /* DISPLAY_FILTERS */ - { { N_("/File/Test Dialogs/Layer List..."), NULL, dialogs_test_layer_list_cmd_callback, 1 }, + { { N_("/File/Test Dialogs/Layer List..."), NULL, test_layer_list_cmd_callback, 1 }, NULL, NULL }, - { { N_("/File/Test Dialogs/Layer Grid..."), NULL, dialogs_test_layer_grid_cmd_callback, 1 }, - NULL, NULL }, - { { N_("/File/Test Dialogs/Channel List..."), NULL, dialogs_test_channel_list_cmd_callback, 1 }, - NULL, NULL }, - { { N_("/File/Test Dialogs/Channel Grid..."), NULL, dialogs_test_channel_grid_cmd_callback, 1 }, + { { N_("/File/Test Dialogs/Channel List..."), NULL, test_channel_list_cmd_callback, 1 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Images List...", NULL, dialogs_test_image_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Images List...", NULL, test_image_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Images Grid...", NULL, dialogs_test_image_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Images Grid...", NULL, test_image_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Brushe List...", NULL, dialogs_test_brush_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Brushe List...", NULL, test_brush_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Pattern List...", NULL, dialogs_test_pattern_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Pattern List...", NULL, test_pattern_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Gradient List...", NULL, dialogs_test_gradient_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Gradient List...", NULL, test_gradient_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Palette List...", NULL, dialogs_test_palette_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Palette List...", NULL, test_palette_container_list_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Brushe Grid...", NULL, dialogs_test_brush_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Brushe Grid...", NULL, test_brush_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Pattern Grid...", NULL, dialogs_test_pattern_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Pattern Grid...", NULL, test_pattern_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Gradient Grid...", NULL, dialogs_test_gradient_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Gradient Grid...", NULL, test_gradient_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Palette Grid...", NULL, dialogs_test_palette_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Palette Grid...", NULL, test_palette_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Multi List...", NULL, dialogs_test_multi_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Multi List...", NULL, test_multi_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Multi Grid...", NULL, dialogs_test_multi_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Multi Grid...", NULL, test_multi_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/---", NULL, NULL, 0, "" }, diff --git a/app/menus/menus.c b/app/menus/menus.c index cc510f92f4..c3723bbf55 100644 --- a/app/menus/menus.c +++ b/app/menus/menus.c @@ -43,6 +43,9 @@ #include "menus.h" #include "paths_dialog.h" +/* test dialogs */ +#include "test_commands.h" + #include "libgimp/gimpenv.h" #include "libgimp/gimpintl.h" @@ -157,53 +160,49 @@ static GimpItemFactoryEntry toolbox_entries[] = "file/dialogs/display_filters/display_filters.html", NULL }, #endif /* DISPLAY_FILTERS */ - { { N_("/File/Test Dialogs/Layer List..."), NULL, dialogs_test_layer_list_cmd_callback, 1 }, + { { N_("/File/Test Dialogs/Layer List..."), NULL, test_layer_list_cmd_callback, 1 }, NULL, NULL }, - { { N_("/File/Test Dialogs/Layer Grid..."), NULL, dialogs_test_layer_grid_cmd_callback, 1 }, - NULL, NULL }, - { { N_("/File/Test Dialogs/Channel List..."), NULL, dialogs_test_channel_list_cmd_callback, 1 }, - NULL, NULL }, - { { N_("/File/Test Dialogs/Channel Grid..."), NULL, dialogs_test_channel_grid_cmd_callback, 1 }, + { { N_("/File/Test Dialogs/Channel List..."), NULL, test_channel_list_cmd_callback, 1 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Images List...", NULL, dialogs_test_image_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Images List...", NULL, test_image_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Images Grid...", NULL, dialogs_test_image_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Images Grid...", NULL, test_image_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Brushe List...", NULL, dialogs_test_brush_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Brushe List...", NULL, test_brush_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Pattern List...", NULL, dialogs_test_pattern_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Pattern List...", NULL, test_pattern_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Gradient List...", NULL, dialogs_test_gradient_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Gradient List...", NULL, test_gradient_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Palette List...", NULL, dialogs_test_palette_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Palette List...", NULL, test_palette_container_list_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Brushe Grid...", NULL, dialogs_test_brush_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Brushe Grid...", NULL, test_brush_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Pattern Grid...", NULL, dialogs_test_pattern_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Pattern Grid...", NULL, test_pattern_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Gradient Grid...", NULL, dialogs_test_gradient_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Gradient Grid...", NULL, test_gradient_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Palette Grid...", NULL, dialogs_test_palette_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Palette Grid...", NULL, test_palette_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Multi List...", NULL, dialogs_test_multi_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Multi List...", NULL, test_multi_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Multi Grid...", NULL, dialogs_test_multi_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Multi Grid...", NULL, test_multi_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/---", NULL, NULL, 0, "" }, diff --git a/app/paint/gimppaintbrush.c b/app/paint/gimppaintbrush.c index aa9f23d43c..1dfe960bb2 100644 --- a/app/paint/gimppaintbrush.c +++ b/app/paint/gimppaintbrush.c @@ -499,10 +499,11 @@ gimp_paintbrush_tool_register (void) { tool_manager_register_tool (GIMP_TYPE_PAINTBRUSH_TOOL, "gimp:paintbrush_tool", - N_("Paintbrush"), - N_("Paint fuzzy brush strokes"), + _("Paintbrush"), + _("Paint fuzzy brush strokes"), N_("/Tools/Paint Tools/Paintbrush"), "P", - NULL, "tools/paintbrush.html", (const gchar **) paint_bits); + NULL, "tools/paintbrush.html", + (const gchar **) paint_bits); } diff --git a/app/paint/gimppaintbrush.h b/app/paint/gimppaintbrush.h index 95b3b20454..641d4ca1c6 100644 --- a/app/paint/gimppaintbrush.h +++ b/app/paint/gimppaintbrush.h @@ -37,7 +37,7 @@ struct _GimpPaintbrushToolClass GimpPaintToolClass parent_class; }; -typedef struct _GimpPaintbrushTool GimpPaintbrushTool; +typedef struct _GimpPaintbrushTool GimpPaintbrushTool; typedef struct _GimpPaintbrushToolClass GimpPaintbrushToolClass; /* FIXME: this antique code doesn't follow the coding style */ @@ -52,6 +52,8 @@ gboolean gimp_paintbrush_tool_non_gui_default (GimpDrawable *, gint , gdouble *); +void gimp_paintbrush_tool_register (void); + GimpTool * gimp_paintbrush_tool_new (void); GtkType gimp_paintbrush_tool_get_type (void); diff --git a/app/test_commands.c b/app/test_commands.c new file mode 100644 index 0000000000..acbac301ec --- /dev/null +++ b/app/test_commands.c @@ -0,0 +1,582 @@ +/* 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. + */ + +#include "config.h" + +#include + +#include "libgimpmath/gimpmath.h" +#include "libgimpwidgets/gimpwidgets.h" + +#include "apptypes.h" + +#include "context_manager.h" +#include "gradient_editor.h" +#include "gimpchannel.h" +#include "gimpcontainer.h" +#include "gimpcontainerlistview.h" +#include "gimpcontainergridview.h" +#include "gimpcontext.h" +#include "gimpdatafactory.h" +#include "gimpdatafactoryview.h" +#include "gimpdrawablelistview.h" +#include "gimpimage.h" +#include "gimplayer.h" +#include "gimppreview.h" +#include "gimprc.h" + +#include "libgimp/gimpintl.h" + + +#define return_if_no_display(gdisp) \ + gdisp = gdisplay_active (); \ + if (!gdisp) return + + +/***** Container View Test Dialogs *****/ + +static void +container_view_scale_callback (GtkAdjustment *adj, + GimpContainerView *view) +{ + gimp_container_view_set_preview_size (view, ROUND (adj->value)); +} + +static void +brushes_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, global_brush_factory->container); +} + +static void +patterns_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, global_pattern_factory->container); +} + +static void +gradients_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, global_gradient_factory->container); +} + +static void +palettes_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, global_palette_factory->container); +} + +static void +images_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, image_context); +} + +/* +static void +null_callback (GtkWidget *widget, + GimpContainerView *view) +{ + gimp_container_view_set_container (view, NULL); +} +*/ + +static void +container_view_new (gboolean list, + gchar *title, + GimpContainer *container, + GimpContext *context, + gint preview_size) +{ + GtkWidget *dialog; + GtkWidget *view; + GtkObject *adjustment; + GtkWidget *scale; + + if (list) + { + view = gimp_container_list_view_new (container, + context, + preview_size, + 5, 5); + } + else + { + view = gimp_container_grid_view_new (container, + context, + preview_size, + 5, 5); + } + + dialog = gimp_dialog_new (title, "test", + gimp_standard_help_func, + NULL, + GTK_WIN_POS_MOUSE, + FALSE, TRUE, TRUE, + + "_delete_event_", gtk_widget_destroy, + NULL, 1, NULL, TRUE, TRUE, + + NULL); + + gtk_widget_hide (GTK_DIALOG (dialog)->action_area); + + gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 0))); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); + gtk_widget_show (view); + + adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); + scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, + FALSE, FALSE, 0); + gtk_widget_show (scale); + + gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", + GTK_SIGNAL_FUNC (container_view_scale_callback), + view); + + gtk_widget_show (dialog); +} + +static void +data_factory_view_new (GimpViewType view_type, + gchar *title, + GimpDataFactory *factory, + GimpDataEditFunc edit_func, + GimpContext *context, + gint preview_size) +{ + GtkWidget *dialog; + GtkWidget *view; + GtkObject *adjustment; + GtkWidget *scale; + + dialog = gimp_dialog_new (title, "test", + gimp_standard_help_func, + NULL, + GTK_WIN_POS_MOUSE, + FALSE, TRUE, TRUE, + + "_delete_event_", gtk_widget_destroy, + NULL, 1, NULL, TRUE, TRUE, + + NULL); + + gtk_widget_hide (GTK_DIALOG (dialog)->action_area); + + view = gimp_data_factory_view_new (view_type, + factory, + edit_func, + context, + preview_size, + 5, 5); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); + gtk_widget_show (view); + + adjustment = gtk_adjustment_new (preview_size, 16, 256, 16, 16, 0); + scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, + FALSE, FALSE, 0); + gtk_widget_show (scale); + + gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", + GTK_SIGNAL_FUNC (container_view_scale_callback), + GIMP_DATA_FACTORY_VIEW (view)->view); + + gtk_widget_show (dialog); +} + +static void +container_multi_view_new (gboolean list, + gchar *title, + GimpContainer *container, + GimpContext *context, + gint preview_size) +{ + GtkWidget *dialog; + GtkWidget *view; + GtkObject *adjustment; + GtkWidget *scale; + GtkWidget *preview; + + if (list) + { + view = gimp_container_list_view_new (container, + context, + preview_size, + 5, 5); + } + else + { + view = gimp_container_grid_view_new (container, + context, + preview_size, + 5, 5); + } + + dialog = gimp_dialog_new (title, "test", + gimp_standard_help_func, + NULL, + GTK_WIN_POS_MOUSE, + FALSE, TRUE, TRUE, + + "Images", images_callback, + view, NULL, NULL, FALSE, FALSE, + + /* + "NULL", null_callback, + view, NULL, NULL, FALSE, FALSE, + */ + + "_delete_event_", gtk_widget_destroy, + NULL, 1, NULL, FALSE, TRUE, + + NULL); + + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_brush (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (brushes_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "brush_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_pattern (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (patterns_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "pattern_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_gradient (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (gradients_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "gradient_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_palette (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (palettes_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "palette_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + + /* + preview = + gimp_preview_new_full (GIMP_VIEWABLE (gimp_context_get_image (context)), + 32, 32, 1, + FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), preview, + FALSE, FALSE, 0); + gtk_widget_show (preview); + + gtk_signal_connect (GTK_OBJECT (preview), "clicked", + GTK_SIGNAL_FUNC (images_callback), + view); + + gtk_signal_connect_object_while_alive + (GTK_OBJECT (context), + "pattern_changed", + GTK_SIGNAL_FUNC (gimp_preview_set_viewable), + GTK_OBJECT (preview)); + */ + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); + gtk_widget_show (view); + + adjustment = gtk_adjustment_new (preview_size, 16, 64, 4, 4, 0); + scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment)); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scale, + FALSE, FALSE, 0); + gtk_widget_show (scale); + + gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", + GTK_SIGNAL_FUNC (container_view_scale_callback), + view); + + gtk_widget_show (dialog); +} + +void +test_image_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + container_view_new (TRUE, "Image List", + image_context, + gimp_context_get_user (), + 64); +} + +void +test_image_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + container_view_new (FALSE, "Image Grid", + image_context, + gimp_context_get_user (), + 64); +} + +void +test_brush_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_LIST, + "Brush List", + global_brush_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_pattern_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_LIST, + "Pattern List", + global_pattern_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_gradient_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_LIST, + "Gradient List", + global_gradient_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_palette_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_LIST, + "Palette List", + global_palette_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_brush_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_GRID, + "Brush Grid", + global_brush_factory, + NULL, + gimp_context_get_user (), + 32); +} + +void +test_pattern_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_GRID, + "Pattern Grid", + global_pattern_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_gradient_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_GRID, + "Gradient Grid", + global_gradient_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_palette_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + data_factory_view_new (GIMP_VIEW_TYPE_GRID, + "Palette Grid", + global_palette_factory, + NULL, + gimp_context_get_user (), + 24); +} + +void +test_multi_container_list_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + container_multi_view_new (TRUE, "Multi List", + global_brush_factory->container, + gimp_context_get_user (), + 24); +} + +void +test_multi_container_grid_view_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + container_multi_view_new (FALSE, "Multi Grid", + global_brush_factory->container, + gimp_context_get_user (), + 32); +} + +static void +drawable_view_image_changed (GimpContext *context, + GimpImage *gimage, + GimpDrawableListView *view) +{ + gimp_drawable_list_view_set_image (view, gimage); +} + +static void +drawable_view_new (gchar *title, + gboolean channels, + GimpContext *context) +{ + GimpImage *gimage; + GtkWidget *dialog; + GtkWidget *view; + + gimage = gimp_context_get_image (context); + + if (channels) + { + view = gimp_drawable_list_view_new (gimage, + GIMP_TYPE_CHANNEL, + "active_channel_changed", + gimp_image_get_channels, + gimp_image_get_active_channel, + gimp_image_set_active_channel); + } + else + { + view = gimp_drawable_list_view_new (gimage, + GIMP_TYPE_LAYER, + "active_layer_changed", + gimp_image_get_layers, + gimp_image_get_active_layer, + gimp_image_set_active_layer); + } + + gtk_list_set_selection_mode (GTK_LIST (GIMP_CONTAINER_LIST_VIEW (view)->gtk_list), + GTK_SELECTION_SINGLE); + + gtk_signal_connect (GTK_OBJECT (context), "image_changed", + GTK_SIGNAL_FUNC (drawable_view_image_changed), + view); + + dialog = gimp_dialog_new (title, "test", + gimp_standard_help_func, + NULL, + GTK_WIN_POS_MOUSE, + FALSE, TRUE, TRUE, + + "_delete_event_", gtk_widget_destroy, + NULL, 1, NULL, TRUE, TRUE, + + NULL); + + gtk_widget_hide (GTK_DIALOG (dialog)->action_area); + + gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_BIN (dialog)->child)), 0))); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), view); + gtk_widget_show (view); + + gtk_widget_show (dialog); +} + +void +test_layer_list_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + drawable_view_new ("Layer List", FALSE, + gimp_context_get_user ()); +} + +void +test_channel_list_cmd_callback (GtkWidget *widget, + gpointer client_data) +{ + drawable_view_new ("Channel List", TRUE, + gimp_context_get_user ()); +} diff --git a/app/test_commands.h b/app/test_commands.h new file mode 100644 index 0000000000..39410e2c92 --- /dev/null +++ b/app/test_commands.h @@ -0,0 +1,45 @@ +/* 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 __TEST_COMMANDS_H__ +#define __TEST_COMMANDS_H__ + + +void test_image_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_image_container_grid_view_cmd_callback (GtkWidget *, gpointer); + +void test_brush_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_pattern_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_gradient_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_palette_container_list_view_cmd_callback (GtkWidget *, gpointer); + +void test_brush_container_grid_view_cmd_callback (GtkWidget *, gpointer); +void test_pattern_container_grid_view_cmd_callback (GtkWidget *, gpointer); +void test_gradient_container_grid_view_cmd_callback (GtkWidget *, gpointer); +void test_palette_container_grid_view_cmd_callback (GtkWidget *, gpointer); + +void test_multi_container_list_view_cmd_callback (GtkWidget *, gpointer); +void test_multi_container_grid_view_cmd_callback (GtkWidget *, gpointer); + +void test_layer_list_cmd_callback (GtkWidget *, gpointer); +void test_layer_grid_cmd_callback (GtkWidget *, gpointer); +void test_channel_list_cmd_callback (GtkWidget *, gpointer); +void test_channel_grid_cmd_callback (GtkWidget *, gpointer); + + +#endif /* __TEST_COMMANDS_H__ */ diff --git a/app/tools/gimpcolorpickertool.c b/app/tools/gimpcolorpickertool.c index aceb514238..768431205f 100644 --- a/app/tools/gimpcolorpickertool.c +++ b/app/tools/gimpcolorpickertool.c @@ -195,6 +195,7 @@ gimp_color_picker_tool_class_init (GimpColorPickerToolClass *klass) object_class = (GtkObjectClass *) klass; tool_class = (GimpToolClass *) klass; + draw_class = (GimpDrawToolClass *) klass; parent_class = gtk_type_class (GIMP_TYPE_DRAW_TOOL); diff --git a/app/tools/gimpdrawtool.c b/app/tools/gimpdrawtool.c index 73c74ff75e..e773d69e20 100644 --- a/app/tools/gimpdrawtool.c +++ b/app/tools/gimpdrawtool.c @@ -27,18 +27,19 @@ #include "tools/gimpdrawtool.h" -static void gimp_draw_tool_initialize (GimpDrawTool *); - enum { /* signals */ DRAW, LAST_SIGNAL }; +static void gimp_draw_tool_class_init (GimpDrawToolClass *klass); +static void gimp_draw_tool_init (GimpDrawTool *draw_tool); + +static void gimp_draw_tool_real_draw (GimpDrawTool *draw_tool); + + static guint gimp_draw_tool_signals[LAST_SIGNAL] = { 0 }; -static void standard_draw_func (GimpDrawTool *tool) -{ -} GtkType @@ -54,7 +55,7 @@ gimp_draw_tool_get_type (void) sizeof (GimpDrawTool), sizeof (GimpDrawToolClass), (GtkClassInitFunc) gimp_draw_tool_class_init, - (GtkObjectInitFunc) gimp_draw_tool_initialize, + (GtkObjectInitFunc) gimp_draw_tool_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, NULL /* (GtkClassInitFunc) gimp_tool_class_init, */ @@ -66,31 +67,7 @@ gimp_draw_tool_get_type (void) return tool_type; } -GimpDrawTool * -gimp_draw_tool_new (void) -{ - GimpDrawTool *tool; - - tool = gtk_type_new (GIMP_TYPE_DRAW_TOOL); - - return tool; -} - - static void -gimp_draw_tool_initialize (GimpDrawTool *tool) -{ - tool->draw_state = INVISIBLE; - tool->gc = NULL; - tool->paused_count = 0; - tool->line_width = 0; - tool->line_style = GDK_LINE_SOLID; - tool->cap_style = GDK_CAP_NOT_LAST; - tool->join_style = GDK_JOIN_MITER; -} - - -void gimp_draw_tool_class_init (GimpDrawToolClass *klass) { GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass); @@ -108,13 +85,24 @@ gimp_draw_tool_class_init (GimpDrawToolClass *klass) gtk_object_class_add_signals (object_class, gimp_draw_tool_signals, LAST_SIGNAL); - klass->draw = standard_draw_func; + klass->draw = gimp_draw_tool_real_draw; } +static void +gimp_draw_tool_init (GimpDrawTool *tool) +{ + tool->draw_state = INVISIBLE; + tool->gc = NULL; + tool->paused_count = 0; + tool->line_width = 0; + tool->line_style = GDK_LINE_SOLID; + tool->cap_style = GDK_CAP_NOT_LAST; + tool->join_style = GDK_JOIN_MITER; +} void -gimp_draw_tool_start (GimpDrawTool *core, - GdkWindow *win) +gimp_draw_tool_start (GimpDrawTool *core, + GdkWindow *win) { GdkColor fg, bg; @@ -177,7 +165,6 @@ gimp_draw_tool_pause (GimpDrawTool *core) core->paused_count++; } - /*FIXME: make this get called */ void gimp_draw_tool_destroy (GimpDrawTool *core) @@ -189,4 +176,7 @@ gimp_draw_tool_destroy (GimpDrawTool *core) } } - +static void +gimp_draw_tool_real_draw (GimpDrawTool *draw_tool) +{ +} diff --git a/app/tools/gimpdrawtool.h b/app/tools/gimpdrawtool.h index 7b56afc226..be8083d117 100644 --- a/app/tools/gimpdrawtool.h +++ b/app/tools/gimpdrawtool.h @@ -19,21 +19,23 @@ #ifndef __GIMP_DRAW_TOOL_H__ #define __GIMP_DRAW_TOOL_H__ + #include "tools/tool.h" + +/* draw states */ +#define INVISIBLE 0 +#define VISIBLE 1 + + #define GIMP_TYPE_DRAW_TOOL (gimp_draw_tool_get_type ()) #define GIMP_DRAW_TOOL(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_DRAW_TOOL, GimpDrawTool)) #define GIMP_IS_DRAW_TOOL(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_DRAW_TOOL)) #define GIMP_DRAW_TOOL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DRAW_TOOL, GimpDrawToolClass)) #define GIMP_IS_DRAW_TOOL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DRAW_TOOL)) -/* draw states */ -#define INVISIBLE 0 -#define VISIBLE 1 -/* Structure definitions */ - -typedef void (* DrawToolDraw) (GimpDrawTool *); +typedef struct _GimpDrawToolClass GimpDrawToolClass; struct _GimpDrawTool { @@ -56,22 +58,17 @@ struct _GimpDrawToolClass { GimpToolClass parent_class; - DrawToolDraw draw; + void (* draw) (GimpDrawTool *draw_tool); }; -typedef struct _GimpDrawToolClass GimpDrawToolClass; - -/* draw core functions */ GtkType gimp_draw_tool_get_type (void); -void gimp_draw_tool_class_init (GimpDrawToolClass *); -GimpDrawTool * gimp_draw_tool_new (void); /* create a new, generic DrawTool */ -void gimp_draw_tool_start (GimpDrawTool *, - GdkWindow *); -void gimp_draw_tool_stop (GimpDrawTool *); -void gimp_draw_tool_pause (GimpDrawTool *); -void gimp_draw_tool_resume (GimpDrawTool *); +void gimp_draw_tool_start (GimpDrawTool *draw_tool, + GdkWindow *window); +void gimp_draw_tool_stop (GimpDrawTool *draw_tool); +void gimp_draw_tool_pause (GimpDrawTool *draw_tool); +void gimp_draw_tool_resume (GimpDrawTool *draw_tool); -#endif /* __DRAWTOOL_H__ */ +#endif /* __GIMP_DRAW_TOOL_H__ */ diff --git a/app/tools/gimppaintbrushtool.c b/app/tools/gimppaintbrushtool.c index aa9f23d43c..1dfe960bb2 100644 --- a/app/tools/gimppaintbrushtool.c +++ b/app/tools/gimppaintbrushtool.c @@ -499,10 +499,11 @@ gimp_paintbrush_tool_register (void) { tool_manager_register_tool (GIMP_TYPE_PAINTBRUSH_TOOL, "gimp:paintbrush_tool", - N_("Paintbrush"), - N_("Paint fuzzy brush strokes"), + _("Paintbrush"), + _("Paint fuzzy brush strokes"), N_("/Tools/Paint Tools/Paintbrush"), "P", - NULL, "tools/paintbrush.html", (const gchar **) paint_bits); + NULL, "tools/paintbrush.html", + (const gchar **) paint_bits); } diff --git a/app/tools/gimppaintbrushtool.h b/app/tools/gimppaintbrushtool.h index 95b3b20454..641d4ca1c6 100644 --- a/app/tools/gimppaintbrushtool.h +++ b/app/tools/gimppaintbrushtool.h @@ -37,7 +37,7 @@ struct _GimpPaintbrushToolClass GimpPaintToolClass parent_class; }; -typedef struct _GimpPaintbrushTool GimpPaintbrushTool; +typedef struct _GimpPaintbrushTool GimpPaintbrushTool; typedef struct _GimpPaintbrushToolClass GimpPaintbrushToolClass; /* FIXME: this antique code doesn't follow the coding style */ @@ -52,6 +52,8 @@ gboolean gimp_paintbrush_tool_non_gui_default (GimpDrawable *, gint , gdouble *); +void gimp_paintbrush_tool_register (void); + GimpTool * gimp_paintbrush_tool_new (void); GtkType gimp_paintbrush_tool_get_type (void); diff --git a/app/tools/gimptool.c b/app/tools/gimptool.c index 45bebbf0c8..67d997f726 100644 --- a/app/tools/gimptool.c +++ b/app/tools/gimptool.c @@ -469,22 +469,6 @@ gimp_tool_real_oper_update (GimpTool *tool, /* Function definitions */ -/* Create a default tool object - */ - -GimpTool * -gimp_tool_new (void) -{ - GimpTool *tool; - - tool = gtk_type_new (GIMP_TYPE_TOOL); - - return tool; -} - - - - void gimp_tool_help_func (const gchar *help_data) { diff --git a/app/tools/tool.c b/app/tools/tool.c index 45bebbf0c8..67d997f726 100644 --- a/app/tools/tool.c +++ b/app/tools/tool.c @@ -469,22 +469,6 @@ gimp_tool_real_oper_update (GimpTool *tool, /* Function definitions */ -/* Create a default tool object - */ - -GimpTool * -gimp_tool_new (void) -{ - GimpTool *tool; - - tool = gtk_type_new (GIMP_TYPE_TOOL); - - return tool; -} - - - - void gimp_tool_help_func (const gchar *help_data) { diff --git a/app/widgets/gimpcontainergridview.c b/app/widgets/gimpcontainergridview.c index 60b6184582..39428d124a 100644 --- a/app/widgets/gimpcontainergridview.c +++ b/app/widgets/gimpcontainergridview.c @@ -54,7 +54,7 @@ static void gimp_container_grid_view_clear_items (GimpContainerView *v static void gimp_container_grid_view_set_preview_size (GimpContainerView *view); static void gimp_container_grid_view_item_selected (GtkWidget *widget, gpointer data); -static void gimp_container_grid_view_item_activate (GtkWidget *widget, +static void gimp_container_grid_view_item_activated (GtkWidget *widget, gpointer data); static void gimp_container_grid_view_highlight_item (GimpContainerView *view, GimpViewable *viewable, @@ -240,7 +240,7 @@ gimp_container_grid_view_insert_item (GimpContainerView *view, view); gtk_signal_connect (GTK_OBJECT (preview), "double_clicked", - GTK_SIGNAL_FUNC (gimp_container_grid_view_item_activate), + GTK_SIGNAL_FUNC (gimp_container_grid_view_item_activated), view); return (gpointer) preview; @@ -336,20 +336,16 @@ static void gimp_container_grid_view_item_selected (GtkWidget *widget, gpointer data) { - gimp_container_grid_view_highlight_item (GIMP_CONTAINER_VIEW (data), - GIMP_PREVIEW (widget)->viewable, - widget); - gimp_container_view_item_selected (GIMP_CONTAINER_VIEW (data), GIMP_PREVIEW (widget)->viewable); } static void -gimp_container_grid_view_item_activate (GtkWidget *widget, - gpointer data) +gimp_container_grid_view_item_activated (GtkWidget *widget, + gpointer data) { - gimp_container_view_item_activate (GIMP_CONTAINER_VIEW (data), - GIMP_PREVIEW (widget)->viewable); + gimp_container_view_item_activated (GIMP_CONTAINER_VIEW (data), + GIMP_PREVIEW (widget)->viewable); } static void diff --git a/app/widgets/gimpcontainerlistview.c b/app/widgets/gimpcontainerlistview.c index 36f4b7568a..70fb1e4cd7 100644 --- a/app/widgets/gimpcontainerlistview.c +++ b/app/widgets/gimpcontainerlistview.c @@ -58,7 +58,7 @@ static void gimp_container_list_view_name_changed (GimpViewable *v static void gimp_container_list_view_item_selected (GtkWidget *widget, GtkWidget *child, gpointer data); -static gint gimp_container_list_view_item_activate (GtkWidget *widget, +static gint gimp_container_list_view_item_activated (GtkWidget *widget, GdkEventButton *bevent, gpointer data); static GimpViewable * gimp_container_list_view_drag_viewable (GtkWidget *widget, @@ -243,7 +243,7 @@ gimp_container_list_view_insert_item (GimpContainerView *view, GTK_OBJECT (list_view)); gtk_signal_connect (GTK_OBJECT (list_item), "button_press_event", - GTK_SIGNAL_FUNC (gimp_container_list_view_item_activate), + GTK_SIGNAL_FUNC (gimp_container_list_view_item_activated), list_view); gimp_gtk_drag_source_set_by_type (list_item, @@ -382,6 +382,10 @@ gimp_container_list_view_select_item (GimpContainerView *view, gimp_container_list_view_item_selected, list_view); } + else + { + gtk_list_unselect_all (GTK_LIST (list_view->gtk_list)); + } } static void @@ -440,9 +444,9 @@ gimp_container_list_view_item_selected (GtkWidget *widget, } static gint -gimp_container_list_view_item_activate (GtkWidget *widget, - GdkEventButton *bevent, - gpointer data) +gimp_container_list_view_item_activated (GtkWidget *widget, + GdkEventButton *bevent, + gpointer data) { if (bevent->type == GDK_2BUTTON_PRESS) { @@ -451,7 +455,7 @@ gimp_container_list_view_item_activate (GtkWidget *widget, viewable = GIMP_PREVIEW (gtk_object_get_data (GTK_OBJECT (widget), "preview"))->viewable; - gimp_container_view_item_activate (GIMP_CONTAINER_VIEW (data), viewable); + gimp_container_view_item_activated (GIMP_CONTAINER_VIEW (data), viewable); } return FALSE; diff --git a/app/widgets/gimpcontainerview.c b/app/widgets/gimpcontainerview.c index e8055123c8..b1d7f6bb46 100644 --- a/app/widgets/gimpcontainerview.c +++ b/app/widgets/gimpcontainerview.c @@ -427,17 +427,19 @@ gimp_container_view_item_selected (GimpContainerView *view, g_return_if_fail (viewable != NULL); g_return_if_fail (GIMP_IS_VIEWABLE (viewable)); - if (! (view->container && view->context)) - return; + if (view->container && view->context) + { + gimp_context_set_by_type (view->context, + view->container->children_type, + GIMP_OBJECT (viewable)); + } - gimp_context_set_by_type (view->context, - view->container->children_type, - GIMP_OBJECT (viewable)); + gimp_container_view_select_item (view, viewable); } void -gimp_container_view_item_activate (GimpContainerView *view, - GimpViewable *viewable) +gimp_container_view_item_activated (GimpContainerView *view, + GimpViewable *viewable) { g_return_if_fail (view != NULL); g_return_if_fail (GIMP_IS_CONTAINER_VIEW (view)); diff --git a/app/widgets/gimpcontainerview.h b/app/widgets/gimpcontainerview.h index cb4f11d005..48d3cb2113 100644 --- a/app/widgets/gimpcontainerview.h +++ b/app/widgets/gimpcontainerview.h @@ -87,7 +87,7 @@ void gimp_container_view_activate_item (GimpContainerView *view, void gimp_container_view_item_selected (GimpContainerView *view, GimpViewable *item); -void gimp_container_view_item_activate (GimpContainerView *view, +void gimp_container_view_item_activated (GimpContainerView *view, GimpViewable *item); diff --git a/app/widgets/gimpdrawablelistview.c b/app/widgets/gimpdrawablelistview.c new file mode 100644 index 0000000000..bb52f16261 --- /dev/null +++ b/app/widgets/gimpdrawablelistview.c @@ -0,0 +1,528 @@ +/* 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. + */ + +#include "config.h" + +#include + +#include "libgimpmath/gimpmath.h" +#include "libgimpwidgets/gimpwidgets.h" + +#include "apptypes.h" + +#include "gimpcontainer.h" +#include "gimpdrawable.h" +#include "gimpdrawablelistview.h" +#include "gimpdnd.h" +#include "gimpimage.h" +#include "gimpmarshal.h" +#include "gimprc.h" +#include "gimpviewable.h" + +#include "libgimp/gimpintl.h" + +#include "pixmaps/delete.xpm" +#include "pixmaps/raise.xpm" +#include "pixmaps/lower.xpm" +#include "pixmaps/duplicate.xpm" +#include "pixmaps/new.xpm" +#include "pixmaps/pennorm.xpm" + + +static void gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass); +static void gimp_drawable_list_view_init (GimpDrawableListView *view); +static void gimp_drawable_list_view_destroy (GtkObject *object); + +static void gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); +static void gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); + +static void gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data); +static void gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); + +static void gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view); + + +static GimpContainerListViewClass *parent_class = NULL; + + +GtkType +gimp_drawable_list_view_get_type (void) +{ + static guint view_type = 0; + + if (! view_type) + { + GtkTypeInfo view_info = + { + "GimpDrawableListView", + sizeof (GimpDrawableListView), + sizeof (GimpDrawableListViewClass), + (GtkClassInitFunc) gimp_drawable_list_view_class_init, + (GtkObjectInitFunc) gimp_drawable_list_view_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL + }; + + view_type = gtk_type_unique (GIMP_TYPE_CONTAINER_LIST_VIEW, &view_info); + } + + return view_type; +} + +static void +gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass) +{ + GtkObjectClass *object_class; + GimpContainerViewClass *container_view_class; + + object_class = (GtkObjectClass *) klass; + container_view_class = (GimpContainerViewClass *) klass; + + parent_class = gtk_type_class (GIMP_TYPE_CONTAINER_LIST_VIEW); + + object_class->destroy = gimp_drawable_list_view_destroy; + + container_view_class->select_item = gimp_drawable_list_view_select_item; + container_view_class->activate_item = gimp_drawable_list_view_activate_item; +} + +static void +gimp_drawable_list_view_init (GimpDrawableListView *view) +{ + GtkWidget *pixmap; + + view->gimage = NULL; + view->drawable_type = GTK_TYPE_NONE; + view->signal_name = NULL; + + gtk_box_set_spacing (GTK_BOX (view), 2); + + view->button_box = gtk_hbox_new (TRUE, 2); + gtk_box_pack_end (GTK_BOX (view), view->button_box, FALSE, FALSE, 0); + gtk_widget_show (view->button_box); + + /* new */ + + view->new_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->new_button, + TRUE, TRUE, 0); + gtk_widget_show (view->new_button); + + gimp_help_set_help_data (view->new_button, _("New"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->new_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_new_clicked), + view); + + pixmap = gimp_pixmap_new (new_xpm); + gtk_container_add (GTK_CONTAINER (view->new_button), pixmap); + gtk_widget_show (pixmap); + + /* raise */ + + view->raise_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->raise_button, + TRUE, TRUE, 0); + gtk_widget_show (view->raise_button); + + gimp_help_set_help_data (view->raise_button, _("Raise"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->raise_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_raise_clicked), + view); + + pixmap = gimp_pixmap_new (raise_xpm); + gtk_container_add (GTK_CONTAINER (view->raise_button), pixmap); + gtk_widget_show (pixmap); + + /* lower */ + + view->lower_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->lower_button, + TRUE, TRUE, 0); + gtk_widget_show (view->lower_button); + + gimp_help_set_help_data (view->lower_button, _("Lower"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->lower_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_lower_clicked), + view); + + pixmap = gimp_pixmap_new (lower_xpm); + gtk_container_add (GTK_CONTAINER (view->lower_button), pixmap); + gtk_widget_show (pixmap); + + /* duplicate */ + + view->duplicate_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->duplicate_button, + TRUE, TRUE, 0); + gtk_widget_show (view->duplicate_button); + + gimp_help_set_help_data (view->duplicate_button, _("Duplicate"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->duplicate_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_duplicate_clicked), + view); + + pixmap = gimp_pixmap_new (duplicate_xpm); + gtk_container_add (GTK_CONTAINER (view->duplicate_button), pixmap); + gtk_widget_show (pixmap); + + /* edit */ + + view->edit_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->edit_button, + TRUE, TRUE, 0); + gtk_widget_show (view->edit_button); + + gimp_help_set_help_data (view->edit_button, _("Edit"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->edit_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_edit_clicked), + view); + + pixmap = gimp_pixmap_new (pennorm_xpm); + gtk_container_add (GTK_CONTAINER (view->edit_button), pixmap); + gtk_widget_show (pixmap); + + /* delete */ + + view->delete_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->delete_button, + TRUE, TRUE, 0); + gtk_widget_show (view->delete_button); + + gimp_help_set_help_data (view->delete_button, _("Delete"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->delete_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_delete_clicked), + view); + + pixmap = gimp_pixmap_new (delete_xpm); + gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap); + gtk_widget_show (pixmap); + + gtk_widget_set_sensitive (view->raise_button, FALSE); + gtk_widget_set_sensitive (view->lower_button, FALSE); + gtk_widget_set_sensitive (view->duplicate_button, FALSE); + gtk_widget_set_sensitive (view->delete_button, FALSE); +} + +static void +gimp_drawable_list_view_destroy (GtkObject *object) +{ + GimpDrawableListView *view; + + view = GIMP_DRAWABLE_LIST_VIEW (object); + + g_free (view->signal_name); + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + +GtkWidget * +gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func) +{ + GimpDrawableListView *list_view; + GimpContainerView *view; + + g_return_val_if_fail (! gimage || GIMP_IS_IMAGE (gimage), NULL); + g_return_val_if_fail (signal_name != NULL, NULL); + g_return_val_if_fail (get_container_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + + list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW); + + view = GIMP_CONTAINER_VIEW (list_view); + + view->preview_size = preview_size; + + list_view->drawable_type = drawable_type; + list_view->signal_name = g_strdup (signal_name); + list_view->get_container_func = get_container_func; + list_view->get_drawable_func = get_drawable_func; + list_view->set_drawable_func = set_drawable_func; + + /* drop to "new" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->new_button), + drawable_type, + gimp_drawable_list_view_new_dropped, + list_view); + + /* drop to "duplicate" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->duplicate_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->duplicate_button), + drawable_type, + gimp_drawable_list_view_duplicate_dropped, + list_view); + + /* drop to "edit" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->edit_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->edit_button), + drawable_type, + gimp_drawable_list_view_edit_dropped, + list_view); + + /* drop to "delete" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->delete_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->delete_button), + drawable_type, + gimp_drawable_list_view_delete_dropped, + list_view); + + if (gimage) + gimp_drawable_list_view_set_image (list_view, gimage); + + return GTK_WIDGET (list_view); +} + +void +gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage) +{ + g_return_if_fail (view != NULL); + g_return_if_fail (GIMP_IS_DRAWABLE_LIST_VIEW (view)); + g_return_if_fail (! gimage || GIMP_IS_IMAGE (gimage)); + + if (view->gimage == gimage) + return; + + if (view->gimage) + { + gtk_signal_disconnect_by_func (GTK_OBJECT (view->gimage), + gimp_drawable_list_view_drawable_changed, + view); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), NULL); + } + + view->gimage = gimage; + + if (view->gimage) + { + GimpContainer *container; + + container = view->get_container_func (view->gimage); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), container); + + gtk_signal_connect (GTK_OBJECT (view->gimage), view->signal_name, + GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed), + view); + } +} + +static void +gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view, + item, + insert_data); + + g_print ("select item\n"); +} + +static void +gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item (view, + item, + insert_data); + + g_print ("activate item\n"); +} + +static void +gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("new clicked\n"); +} + +static void +gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("new dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + } +} + +static void +gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("duplicate clicked\n"); +} + +static void +gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("duplicate dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_duplicate_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("raise clicked\n"); +} + +static void +gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("lower clicked\n"); +} + +static void +gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("edit clicked\n"); +} + +static void +gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("edit dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_edit_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("delete clicked\n"); +} + +static void +gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("delete dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_delete_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view) +{ + GimpDrawable *drawable; + + drawable = view->get_drawable_func (gimage); + + gimp_container_view_select_item (GIMP_CONTAINER_VIEW (view), + (GimpViewable *) drawable); +} diff --git a/app/widgets/gimpdrawablelistview.h b/app/widgets/gimpdrawablelistview.h new file mode 100644 index 0000000000..e22787ed49 --- /dev/null +++ b/app/widgets/gimpdrawablelistview.h @@ -0,0 +1,83 @@ +/* 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 __GIMP_DRAWABLE_LIST_VIEW_H__ +#define __GIMP_DRAWABLE_LIST_VIEW_H__ + + +#include "gimpcontainerlistview.h" + + +typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage); +typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage); +typedef void (* GimpSetDrawableFunc) (GimpImage *gimage, + GimpDrawable *drawable); + + +#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ()) +#define GIMP_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListView)) +#define GIMP_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListViewClass)) +#define GIMP_IS_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW)) +#define GIMP_IS_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW)) + + +typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass; + +struct _GimpDrawableListView +{ + GimpContainerListView parent_instance; + + GimpImage *gimage; + + GtkType drawable_type; + gchar *signal_name; + + GimpGetContainerFunc get_container_func; + GimpGetDrawableFunc get_drawable_func; + GimpSetDrawableFunc set_drawable_func; + + GtkWidget *button_box; + + GtkWidget *new_button; + GtkWidget *raise_button; + GtkWidget *lower_button; + GtkWidget *duplicate_button; + GtkWidget *edit_button; + GtkWidget *delete_button; +}; + +struct _GimpDrawableListViewClass +{ + GimpContainerListViewClass parent_class; +}; + + +GtkType gimp_drawable_list_view_get_type (void); + +GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func); + +void gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage); + + +#endif /* __GIMP_DRAWABLE_LIST_VIEW_H__ */ diff --git a/app/widgets/gimpdrawabletreeview.c b/app/widgets/gimpdrawabletreeview.c new file mode 100644 index 0000000000..bb52f16261 --- /dev/null +++ b/app/widgets/gimpdrawabletreeview.c @@ -0,0 +1,528 @@ +/* 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. + */ + +#include "config.h" + +#include + +#include "libgimpmath/gimpmath.h" +#include "libgimpwidgets/gimpwidgets.h" + +#include "apptypes.h" + +#include "gimpcontainer.h" +#include "gimpdrawable.h" +#include "gimpdrawablelistview.h" +#include "gimpdnd.h" +#include "gimpimage.h" +#include "gimpmarshal.h" +#include "gimprc.h" +#include "gimpviewable.h" + +#include "libgimp/gimpintl.h" + +#include "pixmaps/delete.xpm" +#include "pixmaps/raise.xpm" +#include "pixmaps/lower.xpm" +#include "pixmaps/duplicate.xpm" +#include "pixmaps/new.xpm" +#include "pixmaps/pennorm.xpm" + + +static void gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass); +static void gimp_drawable_list_view_init (GimpDrawableListView *view); +static void gimp_drawable_list_view_destroy (GtkObject *object); + +static void gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); +static void gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); + +static void gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data); +static void gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); + +static void gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view); + + +static GimpContainerListViewClass *parent_class = NULL; + + +GtkType +gimp_drawable_list_view_get_type (void) +{ + static guint view_type = 0; + + if (! view_type) + { + GtkTypeInfo view_info = + { + "GimpDrawableListView", + sizeof (GimpDrawableListView), + sizeof (GimpDrawableListViewClass), + (GtkClassInitFunc) gimp_drawable_list_view_class_init, + (GtkObjectInitFunc) gimp_drawable_list_view_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL + }; + + view_type = gtk_type_unique (GIMP_TYPE_CONTAINER_LIST_VIEW, &view_info); + } + + return view_type; +} + +static void +gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass) +{ + GtkObjectClass *object_class; + GimpContainerViewClass *container_view_class; + + object_class = (GtkObjectClass *) klass; + container_view_class = (GimpContainerViewClass *) klass; + + parent_class = gtk_type_class (GIMP_TYPE_CONTAINER_LIST_VIEW); + + object_class->destroy = gimp_drawable_list_view_destroy; + + container_view_class->select_item = gimp_drawable_list_view_select_item; + container_view_class->activate_item = gimp_drawable_list_view_activate_item; +} + +static void +gimp_drawable_list_view_init (GimpDrawableListView *view) +{ + GtkWidget *pixmap; + + view->gimage = NULL; + view->drawable_type = GTK_TYPE_NONE; + view->signal_name = NULL; + + gtk_box_set_spacing (GTK_BOX (view), 2); + + view->button_box = gtk_hbox_new (TRUE, 2); + gtk_box_pack_end (GTK_BOX (view), view->button_box, FALSE, FALSE, 0); + gtk_widget_show (view->button_box); + + /* new */ + + view->new_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->new_button, + TRUE, TRUE, 0); + gtk_widget_show (view->new_button); + + gimp_help_set_help_data (view->new_button, _("New"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->new_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_new_clicked), + view); + + pixmap = gimp_pixmap_new (new_xpm); + gtk_container_add (GTK_CONTAINER (view->new_button), pixmap); + gtk_widget_show (pixmap); + + /* raise */ + + view->raise_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->raise_button, + TRUE, TRUE, 0); + gtk_widget_show (view->raise_button); + + gimp_help_set_help_data (view->raise_button, _("Raise"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->raise_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_raise_clicked), + view); + + pixmap = gimp_pixmap_new (raise_xpm); + gtk_container_add (GTK_CONTAINER (view->raise_button), pixmap); + gtk_widget_show (pixmap); + + /* lower */ + + view->lower_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->lower_button, + TRUE, TRUE, 0); + gtk_widget_show (view->lower_button); + + gimp_help_set_help_data (view->lower_button, _("Lower"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->lower_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_lower_clicked), + view); + + pixmap = gimp_pixmap_new (lower_xpm); + gtk_container_add (GTK_CONTAINER (view->lower_button), pixmap); + gtk_widget_show (pixmap); + + /* duplicate */ + + view->duplicate_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->duplicate_button, + TRUE, TRUE, 0); + gtk_widget_show (view->duplicate_button); + + gimp_help_set_help_data (view->duplicate_button, _("Duplicate"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->duplicate_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_duplicate_clicked), + view); + + pixmap = gimp_pixmap_new (duplicate_xpm); + gtk_container_add (GTK_CONTAINER (view->duplicate_button), pixmap); + gtk_widget_show (pixmap); + + /* edit */ + + view->edit_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->edit_button, + TRUE, TRUE, 0); + gtk_widget_show (view->edit_button); + + gimp_help_set_help_data (view->edit_button, _("Edit"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->edit_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_edit_clicked), + view); + + pixmap = gimp_pixmap_new (pennorm_xpm); + gtk_container_add (GTK_CONTAINER (view->edit_button), pixmap); + gtk_widget_show (pixmap); + + /* delete */ + + view->delete_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->delete_button, + TRUE, TRUE, 0); + gtk_widget_show (view->delete_button); + + gimp_help_set_help_data (view->delete_button, _("Delete"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->delete_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_delete_clicked), + view); + + pixmap = gimp_pixmap_new (delete_xpm); + gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap); + gtk_widget_show (pixmap); + + gtk_widget_set_sensitive (view->raise_button, FALSE); + gtk_widget_set_sensitive (view->lower_button, FALSE); + gtk_widget_set_sensitive (view->duplicate_button, FALSE); + gtk_widget_set_sensitive (view->delete_button, FALSE); +} + +static void +gimp_drawable_list_view_destroy (GtkObject *object) +{ + GimpDrawableListView *view; + + view = GIMP_DRAWABLE_LIST_VIEW (object); + + g_free (view->signal_name); + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + +GtkWidget * +gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func) +{ + GimpDrawableListView *list_view; + GimpContainerView *view; + + g_return_val_if_fail (! gimage || GIMP_IS_IMAGE (gimage), NULL); + g_return_val_if_fail (signal_name != NULL, NULL); + g_return_val_if_fail (get_container_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + + list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW); + + view = GIMP_CONTAINER_VIEW (list_view); + + view->preview_size = preview_size; + + list_view->drawable_type = drawable_type; + list_view->signal_name = g_strdup (signal_name); + list_view->get_container_func = get_container_func; + list_view->get_drawable_func = get_drawable_func; + list_view->set_drawable_func = set_drawable_func; + + /* drop to "new" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->new_button), + drawable_type, + gimp_drawable_list_view_new_dropped, + list_view); + + /* drop to "duplicate" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->duplicate_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->duplicate_button), + drawable_type, + gimp_drawable_list_view_duplicate_dropped, + list_view); + + /* drop to "edit" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->edit_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->edit_button), + drawable_type, + gimp_drawable_list_view_edit_dropped, + list_view); + + /* drop to "delete" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->delete_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->delete_button), + drawable_type, + gimp_drawable_list_view_delete_dropped, + list_view); + + if (gimage) + gimp_drawable_list_view_set_image (list_view, gimage); + + return GTK_WIDGET (list_view); +} + +void +gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage) +{ + g_return_if_fail (view != NULL); + g_return_if_fail (GIMP_IS_DRAWABLE_LIST_VIEW (view)); + g_return_if_fail (! gimage || GIMP_IS_IMAGE (gimage)); + + if (view->gimage == gimage) + return; + + if (view->gimage) + { + gtk_signal_disconnect_by_func (GTK_OBJECT (view->gimage), + gimp_drawable_list_view_drawable_changed, + view); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), NULL); + } + + view->gimage = gimage; + + if (view->gimage) + { + GimpContainer *container; + + container = view->get_container_func (view->gimage); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), container); + + gtk_signal_connect (GTK_OBJECT (view->gimage), view->signal_name, + GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed), + view); + } +} + +static void +gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view, + item, + insert_data); + + g_print ("select item\n"); +} + +static void +gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item (view, + item, + insert_data); + + g_print ("activate item\n"); +} + +static void +gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("new clicked\n"); +} + +static void +gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("new dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + } +} + +static void +gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("duplicate clicked\n"); +} + +static void +gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("duplicate dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_duplicate_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("raise clicked\n"); +} + +static void +gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("lower clicked\n"); +} + +static void +gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("edit clicked\n"); +} + +static void +gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("edit dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_edit_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("delete clicked\n"); +} + +static void +gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("delete dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_delete_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view) +{ + GimpDrawable *drawable; + + drawable = view->get_drawable_func (gimage); + + gimp_container_view_select_item (GIMP_CONTAINER_VIEW (view), + (GimpViewable *) drawable); +} diff --git a/app/widgets/gimpdrawabletreeview.h b/app/widgets/gimpdrawabletreeview.h new file mode 100644 index 0000000000..e22787ed49 --- /dev/null +++ b/app/widgets/gimpdrawabletreeview.h @@ -0,0 +1,83 @@ +/* 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 __GIMP_DRAWABLE_LIST_VIEW_H__ +#define __GIMP_DRAWABLE_LIST_VIEW_H__ + + +#include "gimpcontainerlistview.h" + + +typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage); +typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage); +typedef void (* GimpSetDrawableFunc) (GimpImage *gimage, + GimpDrawable *drawable); + + +#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ()) +#define GIMP_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListView)) +#define GIMP_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListViewClass)) +#define GIMP_IS_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW)) +#define GIMP_IS_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW)) + + +typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass; + +struct _GimpDrawableListView +{ + GimpContainerListView parent_instance; + + GimpImage *gimage; + + GtkType drawable_type; + gchar *signal_name; + + GimpGetContainerFunc get_container_func; + GimpGetDrawableFunc get_drawable_func; + GimpSetDrawableFunc set_drawable_func; + + GtkWidget *button_box; + + GtkWidget *new_button; + GtkWidget *raise_button; + GtkWidget *lower_button; + GtkWidget *duplicate_button; + GtkWidget *edit_button; + GtkWidget *delete_button; +}; + +struct _GimpDrawableListViewClass +{ + GimpContainerListViewClass parent_class; +}; + + +GtkType gimp_drawable_list_view_get_type (void); + +GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func); + +void gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage); + + +#endif /* __GIMP_DRAWABLE_LIST_VIEW_H__ */ diff --git a/app/widgets/gimpitemfactory.c b/app/widgets/gimpitemfactory.c index cc510f92f4..c3723bbf55 100644 --- a/app/widgets/gimpitemfactory.c +++ b/app/widgets/gimpitemfactory.c @@ -43,6 +43,9 @@ #include "menus.h" #include "paths_dialog.h" +/* test dialogs */ +#include "test_commands.h" + #include "libgimp/gimpenv.h" #include "libgimp/gimpintl.h" @@ -157,53 +160,49 @@ static GimpItemFactoryEntry toolbox_entries[] = "file/dialogs/display_filters/display_filters.html", NULL }, #endif /* DISPLAY_FILTERS */ - { { N_("/File/Test Dialogs/Layer List..."), NULL, dialogs_test_layer_list_cmd_callback, 1 }, + { { N_("/File/Test Dialogs/Layer List..."), NULL, test_layer_list_cmd_callback, 1 }, NULL, NULL }, - { { N_("/File/Test Dialogs/Layer Grid..."), NULL, dialogs_test_layer_grid_cmd_callback, 1 }, - NULL, NULL }, - { { N_("/File/Test Dialogs/Channel List..."), NULL, dialogs_test_channel_list_cmd_callback, 1 }, - NULL, NULL }, - { { N_("/File/Test Dialogs/Channel Grid..."), NULL, dialogs_test_channel_grid_cmd_callback, 1 }, + { { N_("/File/Test Dialogs/Channel List..."), NULL, test_channel_list_cmd_callback, 1 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Images List...", NULL, dialogs_test_image_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Images List...", NULL, test_image_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Images Grid...", NULL, dialogs_test_image_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Images Grid...", NULL, test_image_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Brushe List...", NULL, dialogs_test_brush_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Brushe List...", NULL, test_brush_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Pattern List...", NULL, dialogs_test_pattern_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Pattern List...", NULL, test_pattern_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Gradient List...", NULL, dialogs_test_gradient_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Gradient List...", NULL, test_gradient_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Palette List...", NULL, dialogs_test_palette_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Palette List...", NULL, test_palette_container_list_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Brushe Grid...", NULL, dialogs_test_brush_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Brushe Grid...", NULL, test_brush_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Pattern Grid...", NULL, dialogs_test_pattern_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Pattern Grid...", NULL, test_pattern_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Gradient Grid...", NULL, dialogs_test_gradient_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Gradient Grid...", NULL, test_gradient_container_grid_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Palette Grid...", NULL, dialogs_test_palette_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Palette Grid...", NULL, test_palette_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/Test Dialogs/---", NULL, NULL, 0, "" }, NULL, NULL }, - { { "/File/Test Dialogs/Multi List...", NULL, dialogs_test_multi_container_list_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Multi List...", NULL, test_multi_container_list_view_cmd_callback, 0 }, NULL, NULL }, - { { "/File/Test Dialogs/Multi Grid...", NULL, dialogs_test_multi_container_grid_view_cmd_callback, 0 }, + { { "/File/Test Dialogs/Multi Grid...", NULL, test_multi_container_grid_view_cmd_callback, 0 }, NULL, NULL }, { { "/File/---", NULL, NULL, 0, "" }, diff --git a/app/widgets/gimpitemlistview.c b/app/widgets/gimpitemlistview.c new file mode 100644 index 0000000000..bb52f16261 --- /dev/null +++ b/app/widgets/gimpitemlistview.c @@ -0,0 +1,528 @@ +/* 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. + */ + +#include "config.h" + +#include + +#include "libgimpmath/gimpmath.h" +#include "libgimpwidgets/gimpwidgets.h" + +#include "apptypes.h" + +#include "gimpcontainer.h" +#include "gimpdrawable.h" +#include "gimpdrawablelistview.h" +#include "gimpdnd.h" +#include "gimpimage.h" +#include "gimpmarshal.h" +#include "gimprc.h" +#include "gimpviewable.h" + +#include "libgimp/gimpintl.h" + +#include "pixmaps/delete.xpm" +#include "pixmaps/raise.xpm" +#include "pixmaps/lower.xpm" +#include "pixmaps/duplicate.xpm" +#include "pixmaps/new.xpm" +#include "pixmaps/pennorm.xpm" + + +static void gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass); +static void gimp_drawable_list_view_init (GimpDrawableListView *view); +static void gimp_drawable_list_view_destroy (GtkObject *object); + +static void gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); +static void gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); + +static void gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data); +static void gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); + +static void gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view); + + +static GimpContainerListViewClass *parent_class = NULL; + + +GtkType +gimp_drawable_list_view_get_type (void) +{ + static guint view_type = 0; + + if (! view_type) + { + GtkTypeInfo view_info = + { + "GimpDrawableListView", + sizeof (GimpDrawableListView), + sizeof (GimpDrawableListViewClass), + (GtkClassInitFunc) gimp_drawable_list_view_class_init, + (GtkObjectInitFunc) gimp_drawable_list_view_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL + }; + + view_type = gtk_type_unique (GIMP_TYPE_CONTAINER_LIST_VIEW, &view_info); + } + + return view_type; +} + +static void +gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass) +{ + GtkObjectClass *object_class; + GimpContainerViewClass *container_view_class; + + object_class = (GtkObjectClass *) klass; + container_view_class = (GimpContainerViewClass *) klass; + + parent_class = gtk_type_class (GIMP_TYPE_CONTAINER_LIST_VIEW); + + object_class->destroy = gimp_drawable_list_view_destroy; + + container_view_class->select_item = gimp_drawable_list_view_select_item; + container_view_class->activate_item = gimp_drawable_list_view_activate_item; +} + +static void +gimp_drawable_list_view_init (GimpDrawableListView *view) +{ + GtkWidget *pixmap; + + view->gimage = NULL; + view->drawable_type = GTK_TYPE_NONE; + view->signal_name = NULL; + + gtk_box_set_spacing (GTK_BOX (view), 2); + + view->button_box = gtk_hbox_new (TRUE, 2); + gtk_box_pack_end (GTK_BOX (view), view->button_box, FALSE, FALSE, 0); + gtk_widget_show (view->button_box); + + /* new */ + + view->new_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->new_button, + TRUE, TRUE, 0); + gtk_widget_show (view->new_button); + + gimp_help_set_help_data (view->new_button, _("New"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->new_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_new_clicked), + view); + + pixmap = gimp_pixmap_new (new_xpm); + gtk_container_add (GTK_CONTAINER (view->new_button), pixmap); + gtk_widget_show (pixmap); + + /* raise */ + + view->raise_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->raise_button, + TRUE, TRUE, 0); + gtk_widget_show (view->raise_button); + + gimp_help_set_help_data (view->raise_button, _("Raise"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->raise_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_raise_clicked), + view); + + pixmap = gimp_pixmap_new (raise_xpm); + gtk_container_add (GTK_CONTAINER (view->raise_button), pixmap); + gtk_widget_show (pixmap); + + /* lower */ + + view->lower_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->lower_button, + TRUE, TRUE, 0); + gtk_widget_show (view->lower_button); + + gimp_help_set_help_data (view->lower_button, _("Lower"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->lower_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_lower_clicked), + view); + + pixmap = gimp_pixmap_new (lower_xpm); + gtk_container_add (GTK_CONTAINER (view->lower_button), pixmap); + gtk_widget_show (pixmap); + + /* duplicate */ + + view->duplicate_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->duplicate_button, + TRUE, TRUE, 0); + gtk_widget_show (view->duplicate_button); + + gimp_help_set_help_data (view->duplicate_button, _("Duplicate"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->duplicate_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_duplicate_clicked), + view); + + pixmap = gimp_pixmap_new (duplicate_xpm); + gtk_container_add (GTK_CONTAINER (view->duplicate_button), pixmap); + gtk_widget_show (pixmap); + + /* edit */ + + view->edit_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->edit_button, + TRUE, TRUE, 0); + gtk_widget_show (view->edit_button); + + gimp_help_set_help_data (view->edit_button, _("Edit"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->edit_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_edit_clicked), + view); + + pixmap = gimp_pixmap_new (pennorm_xpm); + gtk_container_add (GTK_CONTAINER (view->edit_button), pixmap); + gtk_widget_show (pixmap); + + /* delete */ + + view->delete_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->delete_button, + TRUE, TRUE, 0); + gtk_widget_show (view->delete_button); + + gimp_help_set_help_data (view->delete_button, _("Delete"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->delete_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_delete_clicked), + view); + + pixmap = gimp_pixmap_new (delete_xpm); + gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap); + gtk_widget_show (pixmap); + + gtk_widget_set_sensitive (view->raise_button, FALSE); + gtk_widget_set_sensitive (view->lower_button, FALSE); + gtk_widget_set_sensitive (view->duplicate_button, FALSE); + gtk_widget_set_sensitive (view->delete_button, FALSE); +} + +static void +gimp_drawable_list_view_destroy (GtkObject *object) +{ + GimpDrawableListView *view; + + view = GIMP_DRAWABLE_LIST_VIEW (object); + + g_free (view->signal_name); + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + +GtkWidget * +gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func) +{ + GimpDrawableListView *list_view; + GimpContainerView *view; + + g_return_val_if_fail (! gimage || GIMP_IS_IMAGE (gimage), NULL); + g_return_val_if_fail (signal_name != NULL, NULL); + g_return_val_if_fail (get_container_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + + list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW); + + view = GIMP_CONTAINER_VIEW (list_view); + + view->preview_size = preview_size; + + list_view->drawable_type = drawable_type; + list_view->signal_name = g_strdup (signal_name); + list_view->get_container_func = get_container_func; + list_view->get_drawable_func = get_drawable_func; + list_view->set_drawable_func = set_drawable_func; + + /* drop to "new" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->new_button), + drawable_type, + gimp_drawable_list_view_new_dropped, + list_view); + + /* drop to "duplicate" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->duplicate_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->duplicate_button), + drawable_type, + gimp_drawable_list_view_duplicate_dropped, + list_view); + + /* drop to "edit" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->edit_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->edit_button), + drawable_type, + gimp_drawable_list_view_edit_dropped, + list_view); + + /* drop to "delete" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->delete_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->delete_button), + drawable_type, + gimp_drawable_list_view_delete_dropped, + list_view); + + if (gimage) + gimp_drawable_list_view_set_image (list_view, gimage); + + return GTK_WIDGET (list_view); +} + +void +gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage) +{ + g_return_if_fail (view != NULL); + g_return_if_fail (GIMP_IS_DRAWABLE_LIST_VIEW (view)); + g_return_if_fail (! gimage || GIMP_IS_IMAGE (gimage)); + + if (view->gimage == gimage) + return; + + if (view->gimage) + { + gtk_signal_disconnect_by_func (GTK_OBJECT (view->gimage), + gimp_drawable_list_view_drawable_changed, + view); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), NULL); + } + + view->gimage = gimage; + + if (view->gimage) + { + GimpContainer *container; + + container = view->get_container_func (view->gimage); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), container); + + gtk_signal_connect (GTK_OBJECT (view->gimage), view->signal_name, + GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed), + view); + } +} + +static void +gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view, + item, + insert_data); + + g_print ("select item\n"); +} + +static void +gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item (view, + item, + insert_data); + + g_print ("activate item\n"); +} + +static void +gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("new clicked\n"); +} + +static void +gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("new dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + } +} + +static void +gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("duplicate clicked\n"); +} + +static void +gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("duplicate dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_duplicate_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("raise clicked\n"); +} + +static void +gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("lower clicked\n"); +} + +static void +gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("edit clicked\n"); +} + +static void +gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("edit dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_edit_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("delete clicked\n"); +} + +static void +gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("delete dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_delete_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view) +{ + GimpDrawable *drawable; + + drawable = view->get_drawable_func (gimage); + + gimp_container_view_select_item (GIMP_CONTAINER_VIEW (view), + (GimpViewable *) drawable); +} diff --git a/app/widgets/gimpitemlistview.h b/app/widgets/gimpitemlistview.h new file mode 100644 index 0000000000..e22787ed49 --- /dev/null +++ b/app/widgets/gimpitemlistview.h @@ -0,0 +1,83 @@ +/* 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 __GIMP_DRAWABLE_LIST_VIEW_H__ +#define __GIMP_DRAWABLE_LIST_VIEW_H__ + + +#include "gimpcontainerlistview.h" + + +typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage); +typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage); +typedef void (* GimpSetDrawableFunc) (GimpImage *gimage, + GimpDrawable *drawable); + + +#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ()) +#define GIMP_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListView)) +#define GIMP_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListViewClass)) +#define GIMP_IS_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW)) +#define GIMP_IS_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW)) + + +typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass; + +struct _GimpDrawableListView +{ + GimpContainerListView parent_instance; + + GimpImage *gimage; + + GtkType drawable_type; + gchar *signal_name; + + GimpGetContainerFunc get_container_func; + GimpGetDrawableFunc get_drawable_func; + GimpSetDrawableFunc set_drawable_func; + + GtkWidget *button_box; + + GtkWidget *new_button; + GtkWidget *raise_button; + GtkWidget *lower_button; + GtkWidget *duplicate_button; + GtkWidget *edit_button; + GtkWidget *delete_button; +}; + +struct _GimpDrawableListViewClass +{ + GimpContainerListViewClass parent_class; +}; + + +GtkType gimp_drawable_list_view_get_type (void); + +GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func); + +void gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage); + + +#endif /* __GIMP_DRAWABLE_LIST_VIEW_H__ */ diff --git a/app/widgets/gimpitemtreeview.c b/app/widgets/gimpitemtreeview.c new file mode 100644 index 0000000000..bb52f16261 --- /dev/null +++ b/app/widgets/gimpitemtreeview.c @@ -0,0 +1,528 @@ +/* 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. + */ + +#include "config.h" + +#include + +#include "libgimpmath/gimpmath.h" +#include "libgimpwidgets/gimpwidgets.h" + +#include "apptypes.h" + +#include "gimpcontainer.h" +#include "gimpdrawable.h" +#include "gimpdrawablelistview.h" +#include "gimpdnd.h" +#include "gimpimage.h" +#include "gimpmarshal.h" +#include "gimprc.h" +#include "gimpviewable.h" + +#include "libgimp/gimpintl.h" + +#include "pixmaps/delete.xpm" +#include "pixmaps/raise.xpm" +#include "pixmaps/lower.xpm" +#include "pixmaps/duplicate.xpm" +#include "pixmaps/new.xpm" +#include "pixmaps/pennorm.xpm" + + +static void gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass); +static void gimp_drawable_list_view_init (GimpDrawableListView *view); +static void gimp_drawable_list_view_destroy (GtkObject *object); + +static void gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); +static void gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data); + +static void gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data); +static void gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); +static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view); +static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer drawable); + +static void gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view); + + +static GimpContainerListViewClass *parent_class = NULL; + + +GtkType +gimp_drawable_list_view_get_type (void) +{ + static guint view_type = 0; + + if (! view_type) + { + GtkTypeInfo view_info = + { + "GimpDrawableListView", + sizeof (GimpDrawableListView), + sizeof (GimpDrawableListViewClass), + (GtkClassInitFunc) gimp_drawable_list_view_class_init, + (GtkObjectInitFunc) gimp_drawable_list_view_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL + }; + + view_type = gtk_type_unique (GIMP_TYPE_CONTAINER_LIST_VIEW, &view_info); + } + + return view_type; +} + +static void +gimp_drawable_list_view_class_init (GimpDrawableListViewClass *klass) +{ + GtkObjectClass *object_class; + GimpContainerViewClass *container_view_class; + + object_class = (GtkObjectClass *) klass; + container_view_class = (GimpContainerViewClass *) klass; + + parent_class = gtk_type_class (GIMP_TYPE_CONTAINER_LIST_VIEW); + + object_class->destroy = gimp_drawable_list_view_destroy; + + container_view_class->select_item = gimp_drawable_list_view_select_item; + container_view_class->activate_item = gimp_drawable_list_view_activate_item; +} + +static void +gimp_drawable_list_view_init (GimpDrawableListView *view) +{ + GtkWidget *pixmap; + + view->gimage = NULL; + view->drawable_type = GTK_TYPE_NONE; + view->signal_name = NULL; + + gtk_box_set_spacing (GTK_BOX (view), 2); + + view->button_box = gtk_hbox_new (TRUE, 2); + gtk_box_pack_end (GTK_BOX (view), view->button_box, FALSE, FALSE, 0); + gtk_widget_show (view->button_box); + + /* new */ + + view->new_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->new_button, + TRUE, TRUE, 0); + gtk_widget_show (view->new_button); + + gimp_help_set_help_data (view->new_button, _("New"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->new_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_new_clicked), + view); + + pixmap = gimp_pixmap_new (new_xpm); + gtk_container_add (GTK_CONTAINER (view->new_button), pixmap); + gtk_widget_show (pixmap); + + /* raise */ + + view->raise_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->raise_button, + TRUE, TRUE, 0); + gtk_widget_show (view->raise_button); + + gimp_help_set_help_data (view->raise_button, _("Raise"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->raise_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_raise_clicked), + view); + + pixmap = gimp_pixmap_new (raise_xpm); + gtk_container_add (GTK_CONTAINER (view->raise_button), pixmap); + gtk_widget_show (pixmap); + + /* lower */ + + view->lower_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->lower_button, + TRUE, TRUE, 0); + gtk_widget_show (view->lower_button); + + gimp_help_set_help_data (view->lower_button, _("Lower"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->lower_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_lower_clicked), + view); + + pixmap = gimp_pixmap_new (lower_xpm); + gtk_container_add (GTK_CONTAINER (view->lower_button), pixmap); + gtk_widget_show (pixmap); + + /* duplicate */ + + view->duplicate_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->duplicate_button, + TRUE, TRUE, 0); + gtk_widget_show (view->duplicate_button); + + gimp_help_set_help_data (view->duplicate_button, _("Duplicate"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->duplicate_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_duplicate_clicked), + view); + + pixmap = gimp_pixmap_new (duplicate_xpm); + gtk_container_add (GTK_CONTAINER (view->duplicate_button), pixmap); + gtk_widget_show (pixmap); + + /* edit */ + + view->edit_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->edit_button, + TRUE, TRUE, 0); + gtk_widget_show (view->edit_button); + + gimp_help_set_help_data (view->edit_button, _("Edit"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->edit_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_edit_clicked), + view); + + pixmap = gimp_pixmap_new (pennorm_xpm); + gtk_container_add (GTK_CONTAINER (view->edit_button), pixmap); + gtk_widget_show (pixmap); + + /* delete */ + + view->delete_button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (view->button_box), view->delete_button, + TRUE, TRUE, 0); + gtk_widget_show (view->delete_button); + + gimp_help_set_help_data (view->delete_button, _("Delete"), NULL); + + gtk_signal_connect (GTK_OBJECT (view->delete_button), "clicked", + GTK_SIGNAL_FUNC (gimp_drawable_list_view_delete_clicked), + view); + + pixmap = gimp_pixmap_new (delete_xpm); + gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap); + gtk_widget_show (pixmap); + + gtk_widget_set_sensitive (view->raise_button, FALSE); + gtk_widget_set_sensitive (view->lower_button, FALSE); + gtk_widget_set_sensitive (view->duplicate_button, FALSE); + gtk_widget_set_sensitive (view->delete_button, FALSE); +} + +static void +gimp_drawable_list_view_destroy (GtkObject *object) +{ + GimpDrawableListView *view; + + view = GIMP_DRAWABLE_LIST_VIEW (object); + + g_free (view->signal_name); + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + +GtkWidget * +gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func) +{ + GimpDrawableListView *list_view; + GimpContainerView *view; + + g_return_val_if_fail (! gimage || GIMP_IS_IMAGE (gimage), NULL); + g_return_val_if_fail (signal_name != NULL, NULL); + g_return_val_if_fail (get_container_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + g_return_val_if_fail (get_drawable_func != NULL, NULL); + + list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW); + + view = GIMP_CONTAINER_VIEW (list_view); + + view->preview_size = preview_size; + + list_view->drawable_type = drawable_type; + list_view->signal_name = g_strdup (signal_name); + list_view->get_container_func = get_container_func; + list_view->get_drawable_func = get_drawable_func; + list_view->set_drawable_func = set_drawable_func; + + /* drop to "new" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->new_button), + drawable_type, + gimp_drawable_list_view_new_dropped, + list_view); + + /* drop to "duplicate" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->duplicate_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->duplicate_button), + drawable_type, + gimp_drawable_list_view_duplicate_dropped, + list_view); + + /* drop to "edit" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->edit_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->edit_button), + drawable_type, + gimp_drawable_list_view_edit_dropped, + list_view); + + /* drop to "delete" */ + gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->delete_button), + GTK_DEST_DEFAULT_ALL, + drawable_type, + GDK_ACTION_COPY); + gimp_dnd_viewable_dest_set (GTK_WIDGET (list_view->delete_button), + drawable_type, + gimp_drawable_list_view_delete_dropped, + list_view); + + if (gimage) + gimp_drawable_list_view_set_image (list_view, gimage); + + return GTK_WIDGET (list_view); +} + +void +gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage) +{ + g_return_if_fail (view != NULL); + g_return_if_fail (GIMP_IS_DRAWABLE_LIST_VIEW (view)); + g_return_if_fail (! gimage || GIMP_IS_IMAGE (gimage)); + + if (view->gimage == gimage) + return; + + if (view->gimage) + { + gtk_signal_disconnect_by_func (GTK_OBJECT (view->gimage), + gimp_drawable_list_view_drawable_changed, + view); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), NULL); + } + + view->gimage = gimage; + + if (view->gimage) + { + GimpContainer *container; + + container = view->get_container_func (view->gimage); + + gimp_container_view_set_container (GIMP_CONTAINER_VIEW (view), container); + + gtk_signal_connect (GTK_OBJECT (view->gimage), view->signal_name, + GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed), + view); + } +} + +static void +gimp_drawable_list_view_select_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view, + item, + insert_data); + + g_print ("select item\n"); +} + +static void +gimp_drawable_list_view_activate_item (GimpContainerView *view, + GimpViewable *item, + gpointer insert_data) +{ + if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item) + GIMP_CONTAINER_VIEW_CLASS (parent_class)->activate_item (view, + item, + insert_data); + + g_print ("activate item\n"); +} + +static void +gimp_drawable_list_view_new_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("new clicked\n"); +} + +static void +gimp_drawable_list_view_new_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("new dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + } +} + +static void +gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("duplicate clicked\n"); +} + +static void +gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("duplicate dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_duplicate_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_raise_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("raise clicked\n"); +} + +static void +gimp_drawable_list_view_lower_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("lower clicked\n"); +} + +static void +gimp_drawable_list_view_edit_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("edit clicked\n"); +} + +static void +gimp_drawable_list_view_edit_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("edit dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_edit_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_delete_clicked (GtkWidget *widget, + GimpDrawableListView *view) +{ + g_print ("delete clicked\n"); +} + +static void +gimp_drawable_list_view_delete_dropped (GtkWidget *widget, + GimpViewable *viewable, + gpointer data) +{ + GimpDrawableListView *view; + + view = (GimpDrawableListView *) data; + + g_print ("delete dropped\n"); + + if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container, + GIMP_OBJECT (viewable))) + { + gimp_drawable_list_view_delete_clicked (NULL, data); + } +} + +static void +gimp_drawable_list_view_drawable_changed (GimpImage *gimage, + GimpDrawableListView *view) +{ + GimpDrawable *drawable; + + drawable = view->get_drawable_func (gimage); + + gimp_container_view_select_item (GIMP_CONTAINER_VIEW (view), + (GimpViewable *) drawable); +} diff --git a/app/widgets/gimpitemtreeview.h b/app/widgets/gimpitemtreeview.h new file mode 100644 index 0000000000..e22787ed49 --- /dev/null +++ b/app/widgets/gimpitemtreeview.h @@ -0,0 +1,83 @@ +/* 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 __GIMP_DRAWABLE_LIST_VIEW_H__ +#define __GIMP_DRAWABLE_LIST_VIEW_H__ + + +#include "gimpcontainerlistview.h" + + +typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage); +typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage); +typedef void (* GimpSetDrawableFunc) (GimpImage *gimage, + GimpDrawable *drawable); + + +#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ()) +#define GIMP_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListView)) +#define GIMP_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW, GimpDrawableListViewClass)) +#define GIMP_IS_DRAWABLE_LIST_VIEW(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_DRAWABLE_LIST_VIEW)) +#define GIMP_IS_DRAWABLE_LIST_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DRAWABLE_LIST_VIEW)) + + +typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass; + +struct _GimpDrawableListView +{ + GimpContainerListView parent_instance; + + GimpImage *gimage; + + GtkType drawable_type; + gchar *signal_name; + + GimpGetContainerFunc get_container_func; + GimpGetDrawableFunc get_drawable_func; + GimpSetDrawableFunc set_drawable_func; + + GtkWidget *button_box; + + GtkWidget *new_button; + GtkWidget *raise_button; + GtkWidget *lower_button; + GtkWidget *duplicate_button; + GtkWidget *edit_button; + GtkWidget *delete_button; +}; + +struct _GimpDrawableListViewClass +{ + GimpContainerListViewClass parent_class; +}; + + +GtkType gimp_drawable_list_view_get_type (void); + +GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage, + GtkType drawable_type, + const gchar *signal_name, + GimpGetContainerFunc get_container_func, + GimpGetDrawableFunc get_drawable_func, + GimpSetDrawableFunc set_drawable_func); + +void gimp_drawable_list_view_set_image (GimpDrawableListView *view, + GimpImage *gimage); + + +#endif /* __GIMP_DRAWABLE_LIST_VIEW_H__ */ diff --git a/po/POTFILES.in b/po/POTFILES.in index 337332755d..3b6dd28832 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -82,7 +82,6 @@ app/tools/bucket_fill.c app/tools/by_color_select.c app/tools/clone.c app/tools/color_balance.c -app/tools/color_picker.c app/tools/convolve.c app/tools/crop.c app/tools/curves.c @@ -91,6 +90,9 @@ app/tools/edit_selection.c app/tools/eraser.c app/tools/flip_tool.c app/tools/fuzzy_select.c +app/tools/gimpcolorpickertool.c +app/tools/gimppaintbrushtool.c +app/tools/gimppainttool.c app/tools/histogram_tool.c app/tools/hue_saturation.c app/tools/ink.c @@ -98,9 +100,7 @@ app/tools/levels.c app/tools/magnify.c app/tools/measure.c app/tools/move.c -app/tools/paint_core.c app/tools/paint_options.c -app/tools/paintbrush.c app/tools/perspective_tool.c app/tools/posterize.c app/tools/rect_select.c