diff --git a/ChangeLog b/ChangeLog index 05e5a7adc0..ed92bb05a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,47 @@ +1999-06-06 Michael Natterer + + * app/Makefile.am + * app/lc_dialog.[ch] + * app/lc_dialogP.h + * app/paths_dialogP.h: new files + + * app/channels_dialog.[ch] + * app/layers_dialog.[ch] + * app/layers_dialogP.h + * app/paths_dialog.[ch] + * app/menus.[ch] + * app/file_new_dialog.c: modified + + - Moved the toplevel L&C dialog code to lc_dialog.[ch]. Only + these files need knowledge about how to create/update/... + the sub-dialogs, so the corresp. functions are defined in + lc_dialogP.h. + - The popup menus are now created by menus.c. The command + callbacks are defined in [layers|channels|paths]_dialog.h. + - Private functions to be used by "friend files" are defined in + [layers|paths]_dialogP.h. + - Changed the order of the ops_buttons in the paths dialog to + match the order in the layers and channels dialogs. + - The paint mode menu and preview stuff still needs to go out of + layers_dialog.[ch]. + - I'm not sure about the keybindings in the layer dialog's "Stack" + submenu because the list widget has it's own idea of PageUp/Down. + - Hopefully fixed the update problem with new images by calling + lc_dialog_flush() after creating a new image. + + * app/app_procs.c + * app/bezier_select.c + * app/commands.c + * app/floating_sel.c + * app/gdisplay.c + * app/gimage.c + * app/gimage_mask.c + * app/paint_core.c + * app/preferences_dialog.c + * app/transform_core.c + * app/undo.c: changed #include's according to the new L&C file + structure. + Sun Jun 6 17:22:16 BST 1999 Adam D. Moss * fileops.c gimprc.c gimprc.h preferences_dialog.c: diff --git a/app/Makefile.am b/app/Makefile.am index a2cc62561c..159cff0107 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -250,7 +250,10 @@ gimp_SOURCES = \ layer_select.h \ layers_dialog.c \ layers_dialog.h \ - layers_dialogP.h \ + layers_dialogP.h \ + lc_dialog.c \ + lc_dialog.h \ + lc_dialogP.h \ levels.c \ levels.h \ lut_funcs.c \ @@ -287,8 +290,9 @@ gimp_SOURCES = \ parasitelistF.h \ parasitelistP.h \ paths_cmds.c \ - paths_dialog.h \ paths_dialog.c \ + paths_dialog.h \ + paths_dialogP.h \ pathsP.h \ pattern_header.h \ pattern_select.c \ diff --git a/app/actions/help-commands.c b/app/actions/help-commands.c index a44e872c29..174a1a12a2 100644 --- a/app/actions/help-commands.c +++ b/app/actions/help-commands.c @@ -24,7 +24,6 @@ #include "brightness_contrast.h" #include "gimpbrushlist.h" #include "by_color_select.h" -#include "channels_dialog.h" #include "colormaps.h" #include "colormap_dialog.i.h" #include "color_area.h" @@ -52,7 +51,7 @@ #include "info_window.h" #include "interface.h" #include "invert.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "layer_select.h" #include "levels.h" #include "module_db.h" @@ -76,8 +75,7 @@ typedef struct } ImageResize; /* external functions */ -extern void layers_dialog_layer_merge_query (GImage *, int); - +extern void layers_dialog_layer_merge_query (GImage *, int); /* local functions */ static void image_resize_callback (GtkWidget *, gpointer); diff --git a/app/app_procs.c b/app/app_procs.c index 3eb76e2650..327c4f6008 100644 --- a/app/app_procs.c +++ b/app/app_procs.c @@ -62,7 +62,7 @@ #include "image_render.h" #include "interface.h" #include "internal_procs.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "levels.h" #include "menus.h" #include "paint_funcs.h" diff --git a/app/bezier_select.c b/app/bezier_select.c index 6805664acb..03dab7986f 100644 --- a/app/bezier_select.c +++ b/app/bezier_select.c @@ -34,7 +34,7 @@ #include "actionarea.h" #include "bezier_select.h" #include "bezier_selectP.h" -#include "paths_dialog.h" +#include "paths_dialogP.h" #include "selection_options.h" #include "libgimp/gimpintl.h" diff --git a/app/channels_dialog.c b/app/channels_dialog.c index 9620b764cf..496836a412 100644 --- a/app/channels_dialog.c +++ b/app/channels_dialog.c @@ -20,7 +20,6 @@ #include "gdk/gdkkeysyms.h" #include "appenv.h" #include "actionarea.h" -#include "buildmenu.h" #include "channels_dialog.h" #include "colormaps.h" #include "color_panel.h" @@ -33,6 +32,8 @@ #include "general.h" #include "interface.h" #include "layers_dialogP.h" +#include "lc_dialogP.h" +#include "menus.h" #include "ops_buttons.h" #include "paint_funcs.h" #include "palette.h" @@ -51,40 +52,25 @@ #include "channel_pvt.h" -#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK -#define BUTTON_EVENT_MASK GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | \ - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK +#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_ENTER_NOTIFY_MASK +#define BUTTON_EVENT_MASK GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | \ + GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_BUTTON_RELEASE_MASK -#define CHANNEL_LIST_WIDTH 200 +#define CHANNEL_LIST_WIDTH 200 #define CHANNEL_LIST_HEIGHT 150 -#define NORMAL 0 -#define SELECTED 1 +#define NORMAL 0 +#define SELECTED 1 #define INSENSITIVE 2 #define COMPONENT_BASE_ID 0x10000000 -typedef struct _ChannelWidget ChannelWidget; - -struct _ChannelWidget { - GtkWidget *eye_widget; - GtkWidget *clip_widget; - GtkWidget *channel_preview; - GtkWidget *list_item; - GtkWidget *label; - - GImage *gimage; - Channel *channel; - GdkPixmap *channel_pixmap; - ChannelType type; - int ID; - int width, height; - int visited; -}; - typedef struct _ChannelsDialog ChannelsDialog; -struct _ChannelsDialog { +struct _ChannelsDialog +{ GtkWidget *vbox; GtkWidget *channel_list; GtkWidget *preview; @@ -105,81 +91,66 @@ struct _ChannelsDialog { GSList *channel_widgets; }; -/* channels dialog widget routines */ -static void channels_dialog_preview_extents (void); -static void channels_dialog_set_menu_sensitivity (void); -static void channels_dialog_set_channel (ChannelWidget *); -static void channels_dialog_unset_channel (ChannelWidget *); -static void channels_dialog_position_channel (ChannelWidget *, int); -static void channels_dialog_add_channel (Channel *); -static void channels_dialog_remove_channel (ChannelWidget *); -static gint channel_list_events (GtkWidget *, GdkEvent *); +typedef struct _ChannelWidget ChannelWidget; -/* channels dialog menu callbacks */ -static void channels_dialog_map_callback (GtkWidget *, gpointer); +struct _ChannelWidget +{ + GtkWidget *eye_widget; + GtkWidget *clip_widget; + GtkWidget *channel_preview; + GtkWidget *list_item; + GtkWidget *label; + + GImage *gimage; + Channel *channel; + GdkPixmap *channel_pixmap; + ChannelType type; + int ID; + int width, height; + int visited; +}; + +/* channels dialog widget routines */ +static void channels_dialog_preview_extents (void); +static void channels_dialog_set_menu_sensitivity (void); +static void channels_dialog_set_channel (ChannelWidget *); +static void channels_dialog_unset_channel (ChannelWidget *); +static void channels_dialog_position_channel (ChannelWidget *, int); +static void channels_dialog_add_channel (Channel *); +static void channels_dialog_remove_channel (ChannelWidget *); +static gint channel_list_events (GtkWidget *, GdkEvent *); + +/* for (un)installing the menu accelarators */ +static void channels_dialog_map_callback (GtkWidget *, gpointer); static void channels_dialog_unmap_callback (GtkWidget *, gpointer); -static void channels_dialog_new_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_raise_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_lower_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_duplicate_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_delete_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_channel_to_sel_callback (GtkWidget *, gpointer); -static void channels_dialog_add_channel_to_sel_callback (GtkWidget *, gpointer); -static void channels_dialog_sub_channel_from_sel_callback (GtkWidget *, gpointer); -static void channels_dialog_intersect_channel_with_sel_callback (GtkWidget *, gpointer); /* channel widget function prototypes */ static ChannelWidget *channel_widget_get_ID (Channel *); static ChannelWidget *create_channel_widget (GImage *, Channel *, ChannelType); -static void channel_widget_delete (ChannelWidget *); -static void channel_widget_select_update (GtkWidget *, gpointer); -static gint channel_widget_button_events (GtkWidget *, GdkEvent *); -static gint channel_widget_preview_events (GtkWidget *, GdkEvent *); -static void channel_widget_preview_redraw (ChannelWidget *); + +static void channel_widget_delete (ChannelWidget *); +static void channel_widget_select_update (GtkWidget *, gpointer); +static gint channel_widget_button_events (GtkWidget *, GdkEvent *); +static gint channel_widget_preview_events (GtkWidget *, GdkEvent *); +static void channel_widget_preview_redraw (ChannelWidget *); static void channel_widget_no_preview_redraw (ChannelWidget *); -static void channel_widget_eye_redraw (ChannelWidget *); +static void channel_widget_eye_redraw (ChannelWidget *); static void channel_widget_exclusive_visible (ChannelWidget *); -static void channel_widget_channel_flush (GtkWidget *, gpointer); +static void channel_widget_channel_flush (GtkWidget *, gpointer); /* assorted query dialogs */ -static void channels_dialog_new_channel_query (GimpImage*); +static void channels_dialog_new_channel_query (GimpImage *); static void channels_dialog_edit_channel_query (ChannelWidget *); - /* Only one channels dialog */ static ChannelsDialog *channelsD = NULL; -static GdkPixmap *eye_pixmap[3] = { NULL, NULL, NULL }; -static GdkPixmap *channel_pixmap[3] = { NULL, NULL, NULL }; +static GdkPixmap *eye_pixmap[] = { NULL, NULL, NULL }; +static GdkPixmap *channel_pixmap[] = { NULL, NULL, NULL }; static int suspend_gimage_notify = 0; -static MenuItem channels_ops[] = -{ - { N_("New Channel"), 'N', GDK_CONTROL_MASK, - channels_dialog_new_channel_callback, NULL, NULL, NULL }, - { N_("Raise Channel"), 'F', GDK_CONTROL_MASK, - channels_dialog_raise_channel_callback, NULL, NULL, NULL }, - { N_("Lower Channel"), 'B', GDK_CONTROL_MASK, - channels_dialog_lower_channel_callback, NULL, NULL, NULL }, - { N_("Duplicate Channel"), 'C', GDK_CONTROL_MASK, - channels_dialog_duplicate_channel_callback, NULL, NULL, NULL }, - { N_("Delete Channel"), 'X', GDK_CONTROL_MASK, - channels_dialog_delete_channel_callback, NULL, NULL, NULL }, - { N_("Channel To Selection"), 'S', GDK_CONTROL_MASK, - channels_dialog_channel_to_sel_callback, NULL, NULL, NULL }, - { N_("Add To Selection"), 0, 0, - channels_dialog_add_channel_to_sel_callback, NULL, NULL, NULL }, - { N_("Subtract From Selection"), 0, 0, - channels_dialog_sub_channel_from_sel_callback, NULL, NULL, NULL }, - { N_("Intersect With Selection"), 0, 0, - channels_dialog_sub_channel_from_sel_callback, NULL, NULL, NULL }, - { NULL, 0, 0, NULL, NULL, NULL, NULL }, -}; - - -/* the ops buttons */ - +/* the ops buttons */ static OpsButtonCallback to_selection_ext_callbacks[] = { channels_dialog_add_channel_to_sel_callback, /* SHIFT */ @@ -190,12 +161,21 @@ static OpsButtonCallback to_selection_ext_callbacks[] = static OpsButton channels_ops_buttons[] = { - { new_xpm, channels_dialog_new_channel_callback, NULL, N_("New Channel"), NULL, 0 }, - { raise_xpm, channels_dialog_raise_channel_callback, NULL, N_("Raise Channel"), NULL, 0 }, - { lower_xpm, channels_dialog_lower_channel_callback, NULL, N_("Lower Channel"), NULL, 0 }, - { duplicate_xpm, channels_dialog_duplicate_channel_callback, NULL, N_("Duplicate Channel"), NULL, 0 }, - { delete_xpm, channels_dialog_delete_channel_callback, NULL, N_("Delete Channel"), NULL, 0 }, - { toselection_xpm, channels_dialog_channel_to_sel_callback, to_selection_ext_callbacks, N_("Channel To Selection \n Add Subtract Intersect"), NULL, 0 }, + { new_xpm, channels_dialog_new_channel_callback, NULL, + N_("New Channel"), NULL, 0 }, + { raise_xpm, channels_dialog_raise_channel_callback, NULL, + N_("Raise Channel"), NULL, 0 }, + { lower_xpm, channels_dialog_lower_channel_callback, NULL, + N_("Lower Channel"), NULL, 0 }, + { duplicate_xpm, channels_dialog_duplicate_channel_callback, NULL, + N_("Duplicate Channel"), NULL, 0 }, + { delete_xpm, channels_dialog_delete_channel_callback, NULL, + N_("Delete Channel"), NULL, 0 }, + { toselection_xpm, channels_dialog_channel_to_sel_callback, to_selection_ext_callbacks, + N_("Channel to Selection \n" + " Add " + " Subtract " + " Intersect"), NULL, 0 }, { NULL, NULL, NULL, NULL, NULL, 0 } }; @@ -218,7 +198,6 @@ channels_dialog_create () channelsD->active_channel = NULL; channelsD->floating_sel = NULL; channelsD->channel_widgets = NULL; - channelsD->accel_group = gtk_accel_group_new (); if (preview_size) { @@ -231,7 +210,7 @@ channels_dialog_create () gtk_container_border_width (GTK_CONTAINER (vbox), 2); /* The layers commands pulldown menu */ - channelsD->ops_menu = build_menu (channels_ops, channelsD->accel_group); + menus_get_channels_menu (&channelsD->ops_menu, &channelsD->accel_group); /* The channels listbox */ listbox = gtk_scrolled_window_new (NULL, NULL); @@ -241,22 +220,22 @@ channels_dialog_create () channelsD->channel_list = gtk_list_new (); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (listbox), channelsD->channel_list); - gtk_list_set_selection_mode (GTK_LIST (channelsD->channel_list), GTK_SELECTION_MULTIPLE); + gtk_list_set_selection_mode (GTK_LIST (channelsD->channel_list), + GTK_SELECTION_MULTIPLE); gtk_signal_connect (GTK_OBJECT (channelsD->channel_list), "event", (GtkSignalFunc) channel_list_events, channelsD); gtk_container_set_focus_vadjustment (GTK_CONTAINER (channelsD->channel_list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (listbox))); - GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (listbox)->vscrollbar, GTK_CAN_FOCUS); + GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (listbox)->vscrollbar, + GTK_CAN_FOCUS); gtk_widget_show (channelsD->channel_list); gtk_widget_show (listbox); - - /* The ops buttons */ - - button_box = ops_button_box_new (lc_shell, tool_tips, channels_ops_buttons,OPS_BUTTON_NORMAL); - + /* The ops buttons */ + button_box = ops_button_box_new (lc_dialog->shell, tool_tips, + channels_ops_buttons, OPS_BUTTON_NORMAL); gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); gtk_widget_show (button_box); @@ -274,6 +253,132 @@ channels_dialog_create () return channelsD->vbox; } +void +channels_dialog_free () +{ + GSList *list; + ChannelWidget *cw; + + if (! channelsD) + return; + + suspend_gimage_notify++; + /* Free all elements in the channels listbox */ + gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); + suspend_gimage_notify--; + + list = channelsD->channel_widgets; + while (list) + { + cw = (ChannelWidget *) list->data; + list = g_slist_next (list); + channel_widget_delete (cw); + } + channelsD->channel_widgets = NULL; + channelsD->active_channel = NULL; + channelsD->floating_sel = NULL; + + if (channelsD->preview) + gtk_object_sink (GTK_OBJECT (channelsD->preview)); + + g_free (channelsD); + channelsD = NULL; +} + +void +channels_dialog_update (GimpImage* gimage) +{ + ChannelWidget *cw; + Channel *channel; + GSList *list; + GList *item_list; + + if (!channelsD) + return; + if (channelsD->gimage == gimage) + return; + + channelsD->gimage = gimage; + + suspend_gimage_notify++; + /* Free all elements in the channels listbox */ + gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); + suspend_gimage_notify--; + + list = channelsD->channel_widgets; + while (list) + { + cw = (ChannelWidget *) list->data; + list = g_slist_next (list); + channel_widget_delete (cw); + } + channelsD->channel_widgets = NULL; + + /* Find the preview extents */ + channels_dialog_preview_extents (); + + channelsD->active_channel = NULL; + channelsD->floating_sel = NULL; + + /* The image components */ + item_list = NULL; + switch ((channelsD->base_type = gimage_base_type (gimage))) + { + case RGB: + cw = create_channel_widget (gimage, NULL, RED_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[0] = RED_CHANNEL; + + cw = create_channel_widget (gimage, NULL, GREEN_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[1] = GREEN_CHANNEL; + + cw = create_channel_widget (gimage, NULL, BLUE_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[2] = BLUE_CHANNEL; + + channelsD->num_components = 3; + break; + + case GRAY: + cw = create_channel_widget (gimage, NULL, GRAY_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[0] = GRAY_CHANNEL; + + channelsD->num_components = 1; + break; + + case INDEXED: + cw = create_channel_widget (gimage, NULL, INDEXED_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[0] = INDEXED_CHANNEL; + + channelsD->num_components = 1; + break; + } + + /* The auxillary image channels */ + list = gimage->channels; + while (list) + { + /* create a channel list item */ + channel = (Channel *) list->data; + cw = create_channel_widget (gimage, channel, AUXILLARY_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + + list = g_slist_next (list); + } + + /* get the index of the active channel */ + if (item_list) + gtk_list_insert_items (GTK_LIST (channelsD->channel_list), item_list, 0); +} void channels_dialog_flush () @@ -366,150 +471,19 @@ channels_dialog_flush () channel_widget_channel_flush, NULL); } - -/*************************************/ -/* channels dialog widget routines */ -/*************************************/ - -void -channels_dialog_update (GimpImage* gimage) -{ - ChannelWidget *cw; - Channel *channel; - GSList *list; - GList *item_list; - - if (!channelsD) - return; - if (channelsD->gimage == gimage) - return; - - channelsD->gimage=gimage; - - suspend_gimage_notify++; - /* Free all elements in the channels listbox */ - gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); - suspend_gimage_notify--; - - list = channelsD->channel_widgets; - while (list) - { - cw = (ChannelWidget *) list->data; - list = g_slist_next (list); - channel_widget_delete (cw); - } - channelsD->channel_widgets = NULL; - - /* Find the preview extents */ - channels_dialog_preview_extents (); - - channelsD->active_channel = NULL; - channelsD->floating_sel = NULL; - - /* The image components */ - item_list = NULL; - switch ((channelsD->base_type = gimage_base_type (gimage))) - { - case RGB: - cw = create_channel_widget (gimage, NULL, RED_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[0] = RED_CHANNEL; - - cw = create_channel_widget (gimage, NULL, GREEN_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[1] = GREEN_CHANNEL; - - cw = create_channel_widget (gimage, NULL, BLUE_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[2] = BLUE_CHANNEL; - - channelsD->num_components = 3; - break; - - case GRAY: - cw = create_channel_widget (gimage, NULL, GRAY_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[0] = GRAY_CHANNEL; - - channelsD->num_components = 1; - break; - - case INDEXED: - cw = create_channel_widget (gimage, NULL, INDEXED_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[0] = INDEXED_CHANNEL; - - channelsD->num_components = 1; - break; - } - - /* The auxillary image channels */ - list = gimage->channels; - while (list) - { - /* create a channel list item */ - channel = (Channel *) list->data; - cw = create_channel_widget (gimage, channel, AUXILLARY_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - - list = g_slist_next (list); - } - - /* get the index of the active channel */ - if (item_list) - gtk_list_insert_items (GTK_LIST (channelsD->channel_list), item_list, 0); -} - - void channels_dialog_clear () { + if (! channelsD) + return; + ops_button_box_set_insensitive (channels_ops_buttons); suspend_gimage_notify++; gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); suspend_gimage_notify--; -} -void -channels_dialog_free () -{ - GSList *list; - ChannelWidget *cw; - - if (channelsD == NULL) - return; - - suspend_gimage_notify++; - /* Free all elements in the channels listbox */ - gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); - suspend_gimage_notify--; - - list = channelsD->channel_widgets; - while (list) - { - cw = (ChannelWidget *) list->data; - list = g_slist_next (list); - channel_widget_delete (cw); - } - channelsD->channel_widgets = NULL; - channelsD->active_channel = NULL; - channelsD->floating_sel = NULL; - - if (channelsD->preview) - gtk_object_sink (GTK_OBJECT (channelsD->preview)); - - if (channelsD->ops_menu) - gtk_object_sink (GTK_OBJECT (channelsD->ops_menu)); - - g_free (channelsD); - channelsD = NULL; + channelsD->gimage = NULL; } static void @@ -549,41 +523,42 @@ static void channels_dialog_set_menu_sensitivity () { ChannelWidget *cw; - gint fs_sensitive; - gint aux_sensitive; + gint fs_sens; + gint aux_sens; cw = channel_widget_get_ID (channelsD->active_channel); - fs_sensitive = (channelsD->floating_sel != NULL); + fs_sens = (channelsD->floating_sel != NULL); if (cw) - aux_sensitive = (cw->type == AUXILLARY_CHANNEL); + aux_sens = (cw->type == AUXILLARY_CHANNEL); else - aux_sensitive = FALSE; + aux_sens = FALSE; - /* new channel */ - gtk_widget_set_sensitive (channels_ops[0].widget, !fs_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[0].widget, !fs_sensitive); - /* raise channel */ - gtk_widget_set_sensitive (channels_ops[1].widget, !fs_sensitive && aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[1].widget, !fs_sensitive && aux_sensitive); - /* lower channel */ - gtk_widget_set_sensitive (channels_ops[2].widget, !fs_sensitive && aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[2].widget, !fs_sensitive && aux_sensitive); - /* duplicate channel */ - gtk_widget_set_sensitive (channels_ops[3].widget, !fs_sensitive && aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[3].widget, !fs_sensitive && aux_sensitive); - /* delete channel */ - gtk_widget_set_sensitive (channels_ops[4].widget, !fs_sensitive && aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[4].widget, !fs_sensitive && aux_sensitive); - /* channel to selection */ - gtk_widget_set_sensitive (channels_ops[5].widget, aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[5].widget, aux_sensitive); - /* add channel to selection */ - gtk_widget_set_sensitive (channels_ops[6].widget, aux_sensitive); - /* sub channel from selection */ - gtk_widget_set_sensitive (channels_ops[7].widget, aux_sensitive); - /* intersect channel with selection */ - gtk_widget_set_sensitive (channels_ops[8].widget, aux_sensitive); + menus_set_sensitive (_("/New Channel"), !fs_sens); + gtk_widget_set_sensitive (channels_ops_buttons[0].widget, !fs_sens); + + menus_set_sensitive (_("/Raise Channel"), !fs_sens && aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[1].widget, + !fs_sens && aux_sens); + + menus_set_sensitive (_("/Lower Channel"), !fs_sens && aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[2].widget, + !fs_sens && aux_sens); + + menus_set_sensitive (_("/Duplicate Channel"), !fs_sens && aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[3].widget, + !fs_sens && aux_sens); + + menus_set_sensitive (_("/Delete Channel"), !fs_sens && aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[4].widget, + !fs_sens && aux_sens); + + menus_set_sensitive (_("/Channel to Selection"), aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[5].widget, aux_sens); + + menus_set_sensitive (_("/Add to Selection"), aux_sens); + menus_set_sensitive (_("/Subtract From Selection"), aux_sens); + menus_set_sensitive (_("/Intersect With Selection"), aux_sens); } @@ -791,7 +766,9 @@ channel_list_events (GtkWidget *widget, if (bevent->button == 3 || bevent->button == 2) { - gtk_menu_popup (GTK_MENU (channelsD->ops_menu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); + gtk_menu_popup (GTK_MENU (channelsD->ops_menu), + NULL, NULL, NULL, NULL, + bevent->button, bevent->time); return TRUE; } break; @@ -834,33 +811,33 @@ channel_list_events (GtkWidget *widget, static void channels_dialog_map_callback (GtkWidget *w, - gpointer client_data) + gpointer client_data) { - if (!channelsD) + if (! channelsD) return; - gtk_window_add_accel_group (GTK_WINDOW (lc_shell), + gtk_window_add_accel_group (GTK_WINDOW (lc_dialog->shell), channelsD->accel_group); } static void channels_dialog_unmap_callback (GtkWidget *w, - gpointer client_data) + gpointer client_data) { - if (!channelsD) + if (! channelsD) return; - gtk_window_remove_accel_group (GTK_WINDOW (lc_shell), + gtk_window_remove_accel_group (GTK_WINDOW (lc_dialog->shell), channelsD->accel_group); } -static void +void channels_dialog_new_channel_callback (GtkWidget *w, gpointer client_data) { /* if there is a currently selected gimage, request a new channel */ - if (!channelsD) + if (! channelsD) return; if (channelsD->gimage == NULL) return; @@ -868,14 +845,13 @@ channels_dialog_new_channel_callback (GtkWidget *w, channels_dialog_new_channel_query (channelsD->gimage); } - -static void +void channels_dialog_raise_channel_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!channelsD) + if (! channelsD) return; if (! (gimage = channelsD->gimage)) return; @@ -887,14 +863,13 @@ channels_dialog_raise_channel_callback (GtkWidget *w, } } - -static void +void channels_dialog_lower_channel_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!channelsD) + if (! channelsD) return; if (! (gimage = channelsD->gimage)) return; @@ -906,18 +881,17 @@ channels_dialog_lower_channel_callback (GtkWidget *w, } } - -static void +void channels_dialog_duplicate_channel_callback (GtkWidget *w, gpointer client_data) { - GImage *gimage; + GImage *gimage; Channel *active_channel; Channel *new_channel; /* if there is a currently selected gimage, request a new channel */ - if (!channelsD) + if (! channelsD) return; if (! (gimage = channelsD->gimage)) return; @@ -930,8 +904,7 @@ channels_dialog_duplicate_channel_callback (GtkWidget *w, } } - -static void +void channels_dialog_delete_channel_callback (GtkWidget *w, gpointer client_data) { @@ -939,7 +912,7 @@ channels_dialog_delete_channel_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!channelsD) + if (! channelsD) return; if (! (gimage = channelsD->gimage)) return; @@ -951,8 +924,7 @@ channels_dialog_delete_channel_callback (GtkWidget *w, } } - -static void +void channels_dialog_channel_to_sel_callback (GtkWidget *w, gpointer client_data) { @@ -972,8 +944,7 @@ channels_dialog_channel_to_sel_callback (GtkWidget *w, } } - -static void +void channels_dialog_add_channel_to_sel_callback (GtkWidget *w, gpointer client_data) { @@ -1001,7 +972,7 @@ channels_dialog_add_channel_to_sel_callback (GtkWidget *w, } } -static void +void channels_dialog_sub_channel_from_sel_callback (GtkWidget *w, gpointer client_data) { @@ -1029,7 +1000,7 @@ channels_dialog_sub_channel_from_sel_callback (GtkWidget *w, } } -static void +void channels_dialog_intersect_channel_with_sel_callback (GtkWidget *w, gpointer client_data) { @@ -1289,13 +1260,15 @@ channel_widget_button_events (GtkWidget *widget, case GDK_BUTTON_PRESS: return_val = TRUE; - bevent = (GdkEventButton *) event; - if (bevent->button == 3) { - gtk_menu_popup (GTK_MENU (channelsD->ops_menu), NULL, NULL, NULL, NULL, 3, bevent->time); - return TRUE; - } + if (bevent->button == 3) + { + gtk_menu_popup (GTK_MENU (channelsD->ops_menu), + NULL, NULL, NULL, NULL, + 3, bevent->time); + return TRUE; + } button_down = 1; click_widget = widget; @@ -1390,13 +1363,15 @@ channel_widget_preview_events (GtkWidget *widget, switch (event->type) { case GDK_BUTTON_PRESS: - bevent = (GdkEventButton *) event; - if (bevent->button == 3) { - gtk_menu_popup (GTK_MENU (channelsD->ops_menu), NULL, NULL, NULL, NULL, 3, bevent->time); - return TRUE; - } + if (bevent->button == 3) + { + gtk_menu_popup (GTK_MENU (channelsD->ops_menu), + NULL, NULL, NULL, NULL, + 3, bevent->time); + return TRUE; + } break; case GDK_EXPOSE: @@ -1975,14 +1950,15 @@ channels_dialog_new_channel_query (GimpImage* gimage) typedef struct _EditChannelOptions EditChannelOptions; -struct _EditChannelOptions { +struct _EditChannelOptions +{ GtkWidget *query_box; GtkWidget *name_entry; ChannelWidget *channel_widget; - GimpImage* gimage; - ColorPanel *color_panel; - double opacity; + GimpImage *gimage; + ColorPanel *color_panel; + double opacity; }; static void @@ -1999,33 +1975,35 @@ edit_channel_query_ok_callback (GtkWidget *w, channel = options->channel_widget->channel; opacity = (int) (255 * options->opacity) / 100; + if (options->gimage) + { + /* Set the new channel name */ + channel_set_name (channel, + gtk_entry_get_text (GTK_ENTRY (options->name_entry))); + gtk_label_set_text (GTK_LABEL (options->channel_widget->label), + channel_get_name (channel)); - if (options->gimage) { - - /* Set the new channel name */ - channel_set_name(channel, - gtk_entry_get_text (GTK_ENTRY (options->name_entry))); - gtk_label_set_text (GTK_LABEL (options->channel_widget->label), - channel_get_name(channel)); - - if (channel->opacity != opacity) - { - channel->opacity = opacity; - update = TRUE; - } - for (i = 0; i < 3; i++) - if (options->color_panel->color[i] != channel->col[i]) + if (channel->opacity != opacity) { - channel->col[i] = options->color_panel->color[i]; + channel->opacity = opacity; update = TRUE; } + for (i = 0; i < 3; i++) + if (options->color_panel->color[i] != channel->col[i]) + { + channel->col[i] = options->color_panel->color[i]; + update = TRUE; + } + + if (update) + { + drawable_update (GIMP_DRAWABLE(channel), 0, 0, + GIMP_DRAWABLE(channel)->width, + GIMP_DRAWABLE(channel)->height); + gdisplays_flush (); + } + } - if (update) - { - drawable_update (GIMP_DRAWABLE(channel), 0, 0, GIMP_DRAWABLE(channel)->width, GIMP_DRAWABLE(channel)->height); - gdisplays_flush (); - } - } color_panel_free (options->color_panel); gtk_widget_destroy (options->query_box); g_free (options); @@ -2047,7 +2025,7 @@ edit_channel_query_cancel_callback (GtkWidget *w, static gint edit_channel_query_delete_callback (GtkWidget *w, GdkEvent *e, - gpointer client_data) + gpointer client_data) { edit_channel_query_cancel_callback (w, client_data); @@ -2057,11 +2035,6 @@ edit_channel_query_delete_callback (GtkWidget *w, static void channels_dialog_edit_channel_query (ChannelWidget *channel_widget) { - static ActionAreaItem action_items[2] = - { - { N_("OK"), edit_channel_query_ok_callback, NULL, NULL }, - { N_("Cancel"), edit_channel_query_cancel_callback, NULL, NULL } - }; EditChannelOptions *options; GtkWidget *vbox; GtkWidget *hbox; @@ -2071,6 +2044,12 @@ channels_dialog_edit_channel_query (ChannelWidget *channel_widget) GtkObject *opacity_scale_data; int i; + static ActionAreaItem action_items[] = + { + { N_("OK"), edit_channel_query_ok_callback, NULL, NULL }, + { N_("Cancel"), edit_channel_query_cancel_callback, NULL, NULL } + }; + /* the new options structure */ options = (EditChannelOptions *) g_malloc (sizeof (EditChannelOptions)); options->channel_widget = channel_widget; @@ -2123,7 +2102,8 @@ channels_dialog_edit_channel_query (ChannelWidget *channel_widget) gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - opacity_scale_data = gtk_adjustment_new (options->opacity, 0.0, 100.0, 1.0, 1.0, 0.0); + opacity_scale_data = + gtk_adjustment_new (options->opacity, 0.0, 100.0, 1.0, 1.0, 0.0); opacity_scale = gtk_hscale_new (GTK_ADJUSTMENT (opacity_scale_data)); gtk_box_pack_start (GTK_BOX (hbox), opacity_scale, TRUE, TRUE, 0); gtk_scale_set_value_pos (GTK_SCALE (opacity_scale), GTK_POS_TOP); diff --git a/app/channels_dialog.h b/app/channels_dialog.h index 85463606b2..f1fbd7e878 100644 --- a/app/channels_dialog.h +++ b/app/channels_dialog.h @@ -15,10 +15,17 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __CHANNELS_DIALOG_H__ -#define __CHANNELS_DIALOG_H__ +#ifndef __CHANNELS_DIALOG_H__ +#define __CHANNELS_DIALOG_H__ -void channels_dialog_update_image_list (void); -void channels_dialog_flush (void); +void channels_dialog_new_channel_callback (GtkWidget *, gpointer); +void channels_dialog_raise_channel_callback (GtkWidget *, gpointer); +void channels_dialog_lower_channel_callback (GtkWidget *, gpointer); +void channels_dialog_duplicate_channel_callback (GtkWidget *, gpointer); +void channels_dialog_delete_channel_callback (GtkWidget *, gpointer); +void channels_dialog_channel_to_sel_callback (GtkWidget *, gpointer); +void channels_dialog_add_channel_to_sel_callback (GtkWidget *, gpointer); +void channels_dialog_sub_channel_from_sel_callback (GtkWidget *, gpointer); +void channels_dialog_intersect_channel_with_sel_callback(GtkWidget *, gpointer); -#endif /* __CHANNELS_DIALOG_H__ */ +#endif /* __CHANNELS_DIALOG_H__ */ diff --git a/app/commands.c b/app/commands.c index a44e872c29..174a1a12a2 100644 --- a/app/commands.c +++ b/app/commands.c @@ -24,7 +24,6 @@ #include "brightness_contrast.h" #include "gimpbrushlist.h" #include "by_color_select.h" -#include "channels_dialog.h" #include "colormaps.h" #include "colormap_dialog.i.h" #include "color_area.h" @@ -52,7 +51,7 @@ #include "info_window.h" #include "interface.h" #include "invert.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "layer_select.h" #include "levels.h" #include "module_db.h" @@ -76,8 +75,7 @@ typedef struct } ImageResize; /* external functions */ -extern void layers_dialog_layer_merge_query (GImage *, int); - +extern void layers_dialog_layer_merge_query (GImage *, int); /* local functions */ static void image_resize_callback (GtkWidget *, gpointer); diff --git a/app/core/gimpimage-mask.c b/app/core/gimpimage-mask.c index 36d6c4d166..0ed9593bd2 100644 --- a/app/core/gimpimage-mask.c +++ b/app/core/gimpimage-mask.c @@ -26,7 +26,6 @@ #include "gimage_mask.h" #include "interface.h" #include "layer.h" -#include "layers_dialog.h" #include "paint_core.h" #include "paint_options.h" #include "undo.h" diff --git a/app/core/gimpimage-undo-push.c b/app/core/gimpimage-undo-push.c index 7308b7106a..2f14b75e94 100644 --- a/app/core/gimpimage-undo-push.c +++ b/app/core/gimpimage-undo-push.c @@ -20,7 +20,6 @@ #include "appenv.h" #include "by_color_select.h" #include "channel.h" -#include "channels_dialog.h" #include "drawable.h" #include "errors.h" #include "floating_sel.h" diff --git a/app/core/gimplayer-floating-sel.c b/app/core/gimplayer-floating-sel.c index 6f53887e8c..35c8be2283 100644 --- a/app/core/gimplayer-floating-sel.c +++ b/app/core/gimplayer-floating-sel.c @@ -19,7 +19,6 @@ #include #include #include "appenv.h" -#include "channels_dialog.h" #include "drawable.h" #include "layer.h" #include "errors.h" diff --git a/app/core/gimpprojection.c b/app/core/gimpprojection.c index 5c2f3fb6fe..00f7ced5b7 100644 --- a/app/core/gimpprojection.c +++ b/app/core/gimpprojection.c @@ -20,7 +20,6 @@ #include #include "appenv.h" #include "buildmenu.h" -#include "channels_dialog.h" #include "colormaps.h" #include "cursorutil.h" #include "disp_callbacks.h" @@ -35,11 +34,10 @@ #include "image_render.h" #include "info_window.h" #include "interface.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "menus.h" #include "draw_core.h" #include "bezier_selectP.h" -#include "paths_dialog.h" #include "plug_in.h" #include "scale.h" #include "scroll.h" @@ -2073,12 +2071,8 @@ gdisplays_flush_whenever (gboolean now) list = g_slist_next (list); } - /* for convenience, we call the layers dialog flush here */ - layers_dialog_flush (); - /* for convenience, we call the channels dialog flush here */ - channels_dialog_flush (); - /* for convenience, we call the paths dialog flush here */ - paths_dialog_flush(); + /* for convenience, we call the L&C flush here */ + lc_dialog_flush (); flushing = FALSE; } diff --git a/app/dialogs/image-new-dialog.c b/app/dialogs/image-new-dialog.c index 30feb79416..ec8dd45499 100644 --- a/app/dialogs/image-new-dialog.c +++ b/app/dialogs/image-new-dialog.c @@ -22,6 +22,7 @@ #include "gimprc.h" #include "global_edit.h" #include "interface.h" +#include "lc_dialog.h" #include "plug_in.h" #include "tile_manager_pvt.h" #include "gdisplay.h" @@ -144,6 +145,13 @@ file_new_create_image (NewImageValues *vals) gimage_clean_all (gimage); gdisplay = gdisplay_new (gimage, 0x0101); + + /* Update L&C because the last automatic update at image creation + * time happened when the new image had no layers at all + * + * TODO: make L&C aware of the image's "repaint" signal + */ + lc_dialog_flush (); } g_free (vals); diff --git a/app/dialogs/preferences-dialog.c b/app/dialogs/preferences-dialog.c index 36debe3416..c0b2313ac6 100644 --- a/app/dialogs/preferences-dialog.c +++ b/app/dialogs/preferences-dialog.c @@ -23,7 +23,7 @@ #include "gimprc.h" #include "image_render.h" #include "interface.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "layer_select.h" #include "paint_options.h" #include "session.h" diff --git a/app/display/gimpdisplay.c b/app/display/gimpdisplay.c index 5c2f3fb6fe..00f7ced5b7 100644 --- a/app/display/gimpdisplay.c +++ b/app/display/gimpdisplay.c @@ -20,7 +20,6 @@ #include #include "appenv.h" #include "buildmenu.h" -#include "channels_dialog.h" #include "colormaps.h" #include "cursorutil.h" #include "disp_callbacks.h" @@ -35,11 +34,10 @@ #include "image_render.h" #include "info_window.h" #include "interface.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "menus.h" #include "draw_core.h" #include "bezier_selectP.h" -#include "paths_dialog.h" #include "plug_in.h" #include "scale.h" #include "scroll.h" @@ -2073,12 +2071,8 @@ gdisplays_flush_whenever (gboolean now) list = g_slist_next (list); } - /* for convenience, we call the layers dialog flush here */ - layers_dialog_flush (); - /* for convenience, we call the channels dialog flush here */ - channels_dialog_flush (); - /* for convenience, we call the paths dialog flush here */ - paths_dialog_flush(); + /* for convenience, we call the L&C flush here */ + lc_dialog_flush (); flushing = FALSE; } diff --git a/app/file_new_dialog.c b/app/file_new_dialog.c index 30feb79416..ec8dd45499 100644 --- a/app/file_new_dialog.c +++ b/app/file_new_dialog.c @@ -22,6 +22,7 @@ #include "gimprc.h" #include "global_edit.h" #include "interface.h" +#include "lc_dialog.h" #include "plug_in.h" #include "tile_manager_pvt.h" #include "gdisplay.h" @@ -144,6 +145,13 @@ file_new_create_image (NewImageValues *vals) gimage_clean_all (gimage); gdisplay = gdisplay_new (gimage, 0x0101); + + /* Update L&C because the last automatic update at image creation + * time happened when the new image had no layers at all + * + * TODO: make L&C aware of the image's "repaint" signal + */ + lc_dialog_flush (); } g_free (vals); diff --git a/app/floating_sel.c b/app/floating_sel.c index 6f53887e8c..35c8be2283 100644 --- a/app/floating_sel.c +++ b/app/floating_sel.c @@ -19,7 +19,6 @@ #include #include #include "appenv.h" -#include "channels_dialog.h" #include "drawable.h" #include "layer.h" #include "errors.h" diff --git a/app/gdisplay.c b/app/gdisplay.c index 5c2f3fb6fe..00f7ced5b7 100644 --- a/app/gdisplay.c +++ b/app/gdisplay.c @@ -20,7 +20,6 @@ #include #include "appenv.h" #include "buildmenu.h" -#include "channels_dialog.h" #include "colormaps.h" #include "cursorutil.h" #include "disp_callbacks.h" @@ -35,11 +34,10 @@ #include "image_render.h" #include "info_window.h" #include "interface.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "menus.h" #include "draw_core.h" #include "bezier_selectP.h" -#include "paths_dialog.h" #include "plug_in.h" #include "scale.h" #include "scroll.h" @@ -2073,12 +2071,8 @@ gdisplays_flush_whenever (gboolean now) list = g_slist_next (list); } - /* for convenience, we call the layers dialog flush here */ - layers_dialog_flush (); - /* for convenience, we call the channels dialog flush here */ - channels_dialog_flush (); - /* for convenience, we call the paths dialog flush here */ - paths_dialog_flush(); + /* for convenience, we call the L&C flush here */ + lc_dialog_flush (); flushing = FALSE; } diff --git a/app/gimage.c b/app/gimage.c index a301afa5fc..c4b2b917fa 100644 --- a/app/gimage.c +++ b/app/gimage.c @@ -1,8 +1,7 @@ #include "gimpimageP.h" #include "gimage.h" #include "gimpimage.h" -#include "channels_dialog.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "drawable.h" #include "gdisplay.h" diff --git a/app/gimage_mask.c b/app/gimage_mask.c index 36d6c4d166..0ed9593bd2 100644 --- a/app/gimage_mask.c +++ b/app/gimage_mask.c @@ -26,7 +26,6 @@ #include "gimage_mask.h" #include "interface.h" #include "layer.h" -#include "layers_dialog.h" #include "paint_core.h" #include "paint_options.h" #include "undo.h" diff --git a/app/gui/channels-dialog.c b/app/gui/channels-dialog.c index 9620b764cf..496836a412 100644 --- a/app/gui/channels-dialog.c +++ b/app/gui/channels-dialog.c @@ -20,7 +20,6 @@ #include "gdk/gdkkeysyms.h" #include "appenv.h" #include "actionarea.h" -#include "buildmenu.h" #include "channels_dialog.h" #include "colormaps.h" #include "color_panel.h" @@ -33,6 +32,8 @@ #include "general.h" #include "interface.h" #include "layers_dialogP.h" +#include "lc_dialogP.h" +#include "menus.h" #include "ops_buttons.h" #include "paint_funcs.h" #include "palette.h" @@ -51,40 +52,25 @@ #include "channel_pvt.h" -#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK -#define BUTTON_EVENT_MASK GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | \ - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK +#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_ENTER_NOTIFY_MASK +#define BUTTON_EVENT_MASK GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | \ + GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_BUTTON_RELEASE_MASK -#define CHANNEL_LIST_WIDTH 200 +#define CHANNEL_LIST_WIDTH 200 #define CHANNEL_LIST_HEIGHT 150 -#define NORMAL 0 -#define SELECTED 1 +#define NORMAL 0 +#define SELECTED 1 #define INSENSITIVE 2 #define COMPONENT_BASE_ID 0x10000000 -typedef struct _ChannelWidget ChannelWidget; - -struct _ChannelWidget { - GtkWidget *eye_widget; - GtkWidget *clip_widget; - GtkWidget *channel_preview; - GtkWidget *list_item; - GtkWidget *label; - - GImage *gimage; - Channel *channel; - GdkPixmap *channel_pixmap; - ChannelType type; - int ID; - int width, height; - int visited; -}; - typedef struct _ChannelsDialog ChannelsDialog; -struct _ChannelsDialog { +struct _ChannelsDialog +{ GtkWidget *vbox; GtkWidget *channel_list; GtkWidget *preview; @@ -105,81 +91,66 @@ struct _ChannelsDialog { GSList *channel_widgets; }; -/* channels dialog widget routines */ -static void channels_dialog_preview_extents (void); -static void channels_dialog_set_menu_sensitivity (void); -static void channels_dialog_set_channel (ChannelWidget *); -static void channels_dialog_unset_channel (ChannelWidget *); -static void channels_dialog_position_channel (ChannelWidget *, int); -static void channels_dialog_add_channel (Channel *); -static void channels_dialog_remove_channel (ChannelWidget *); -static gint channel_list_events (GtkWidget *, GdkEvent *); +typedef struct _ChannelWidget ChannelWidget; -/* channels dialog menu callbacks */ -static void channels_dialog_map_callback (GtkWidget *, gpointer); +struct _ChannelWidget +{ + GtkWidget *eye_widget; + GtkWidget *clip_widget; + GtkWidget *channel_preview; + GtkWidget *list_item; + GtkWidget *label; + + GImage *gimage; + Channel *channel; + GdkPixmap *channel_pixmap; + ChannelType type; + int ID; + int width, height; + int visited; +}; + +/* channels dialog widget routines */ +static void channels_dialog_preview_extents (void); +static void channels_dialog_set_menu_sensitivity (void); +static void channels_dialog_set_channel (ChannelWidget *); +static void channels_dialog_unset_channel (ChannelWidget *); +static void channels_dialog_position_channel (ChannelWidget *, int); +static void channels_dialog_add_channel (Channel *); +static void channels_dialog_remove_channel (ChannelWidget *); +static gint channel_list_events (GtkWidget *, GdkEvent *); + +/* for (un)installing the menu accelarators */ +static void channels_dialog_map_callback (GtkWidget *, gpointer); static void channels_dialog_unmap_callback (GtkWidget *, gpointer); -static void channels_dialog_new_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_raise_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_lower_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_duplicate_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_delete_channel_callback (GtkWidget *, gpointer); -static void channels_dialog_channel_to_sel_callback (GtkWidget *, gpointer); -static void channels_dialog_add_channel_to_sel_callback (GtkWidget *, gpointer); -static void channels_dialog_sub_channel_from_sel_callback (GtkWidget *, gpointer); -static void channels_dialog_intersect_channel_with_sel_callback (GtkWidget *, gpointer); /* channel widget function prototypes */ static ChannelWidget *channel_widget_get_ID (Channel *); static ChannelWidget *create_channel_widget (GImage *, Channel *, ChannelType); -static void channel_widget_delete (ChannelWidget *); -static void channel_widget_select_update (GtkWidget *, gpointer); -static gint channel_widget_button_events (GtkWidget *, GdkEvent *); -static gint channel_widget_preview_events (GtkWidget *, GdkEvent *); -static void channel_widget_preview_redraw (ChannelWidget *); + +static void channel_widget_delete (ChannelWidget *); +static void channel_widget_select_update (GtkWidget *, gpointer); +static gint channel_widget_button_events (GtkWidget *, GdkEvent *); +static gint channel_widget_preview_events (GtkWidget *, GdkEvent *); +static void channel_widget_preview_redraw (ChannelWidget *); static void channel_widget_no_preview_redraw (ChannelWidget *); -static void channel_widget_eye_redraw (ChannelWidget *); +static void channel_widget_eye_redraw (ChannelWidget *); static void channel_widget_exclusive_visible (ChannelWidget *); -static void channel_widget_channel_flush (GtkWidget *, gpointer); +static void channel_widget_channel_flush (GtkWidget *, gpointer); /* assorted query dialogs */ -static void channels_dialog_new_channel_query (GimpImage*); +static void channels_dialog_new_channel_query (GimpImage *); static void channels_dialog_edit_channel_query (ChannelWidget *); - /* Only one channels dialog */ static ChannelsDialog *channelsD = NULL; -static GdkPixmap *eye_pixmap[3] = { NULL, NULL, NULL }; -static GdkPixmap *channel_pixmap[3] = { NULL, NULL, NULL }; +static GdkPixmap *eye_pixmap[] = { NULL, NULL, NULL }; +static GdkPixmap *channel_pixmap[] = { NULL, NULL, NULL }; static int suspend_gimage_notify = 0; -static MenuItem channels_ops[] = -{ - { N_("New Channel"), 'N', GDK_CONTROL_MASK, - channels_dialog_new_channel_callback, NULL, NULL, NULL }, - { N_("Raise Channel"), 'F', GDK_CONTROL_MASK, - channels_dialog_raise_channel_callback, NULL, NULL, NULL }, - { N_("Lower Channel"), 'B', GDK_CONTROL_MASK, - channels_dialog_lower_channel_callback, NULL, NULL, NULL }, - { N_("Duplicate Channel"), 'C', GDK_CONTROL_MASK, - channels_dialog_duplicate_channel_callback, NULL, NULL, NULL }, - { N_("Delete Channel"), 'X', GDK_CONTROL_MASK, - channels_dialog_delete_channel_callback, NULL, NULL, NULL }, - { N_("Channel To Selection"), 'S', GDK_CONTROL_MASK, - channels_dialog_channel_to_sel_callback, NULL, NULL, NULL }, - { N_("Add To Selection"), 0, 0, - channels_dialog_add_channel_to_sel_callback, NULL, NULL, NULL }, - { N_("Subtract From Selection"), 0, 0, - channels_dialog_sub_channel_from_sel_callback, NULL, NULL, NULL }, - { N_("Intersect With Selection"), 0, 0, - channels_dialog_sub_channel_from_sel_callback, NULL, NULL, NULL }, - { NULL, 0, 0, NULL, NULL, NULL, NULL }, -}; - - -/* the ops buttons */ - +/* the ops buttons */ static OpsButtonCallback to_selection_ext_callbacks[] = { channels_dialog_add_channel_to_sel_callback, /* SHIFT */ @@ -190,12 +161,21 @@ static OpsButtonCallback to_selection_ext_callbacks[] = static OpsButton channels_ops_buttons[] = { - { new_xpm, channels_dialog_new_channel_callback, NULL, N_("New Channel"), NULL, 0 }, - { raise_xpm, channels_dialog_raise_channel_callback, NULL, N_("Raise Channel"), NULL, 0 }, - { lower_xpm, channels_dialog_lower_channel_callback, NULL, N_("Lower Channel"), NULL, 0 }, - { duplicate_xpm, channels_dialog_duplicate_channel_callback, NULL, N_("Duplicate Channel"), NULL, 0 }, - { delete_xpm, channels_dialog_delete_channel_callback, NULL, N_("Delete Channel"), NULL, 0 }, - { toselection_xpm, channels_dialog_channel_to_sel_callback, to_selection_ext_callbacks, N_("Channel To Selection \n Add Subtract Intersect"), NULL, 0 }, + { new_xpm, channels_dialog_new_channel_callback, NULL, + N_("New Channel"), NULL, 0 }, + { raise_xpm, channels_dialog_raise_channel_callback, NULL, + N_("Raise Channel"), NULL, 0 }, + { lower_xpm, channels_dialog_lower_channel_callback, NULL, + N_("Lower Channel"), NULL, 0 }, + { duplicate_xpm, channels_dialog_duplicate_channel_callback, NULL, + N_("Duplicate Channel"), NULL, 0 }, + { delete_xpm, channels_dialog_delete_channel_callback, NULL, + N_("Delete Channel"), NULL, 0 }, + { toselection_xpm, channels_dialog_channel_to_sel_callback, to_selection_ext_callbacks, + N_("Channel to Selection \n" + " Add " + " Subtract " + " Intersect"), NULL, 0 }, { NULL, NULL, NULL, NULL, NULL, 0 } }; @@ -218,7 +198,6 @@ channels_dialog_create () channelsD->active_channel = NULL; channelsD->floating_sel = NULL; channelsD->channel_widgets = NULL; - channelsD->accel_group = gtk_accel_group_new (); if (preview_size) { @@ -231,7 +210,7 @@ channels_dialog_create () gtk_container_border_width (GTK_CONTAINER (vbox), 2); /* The layers commands pulldown menu */ - channelsD->ops_menu = build_menu (channels_ops, channelsD->accel_group); + menus_get_channels_menu (&channelsD->ops_menu, &channelsD->accel_group); /* The channels listbox */ listbox = gtk_scrolled_window_new (NULL, NULL); @@ -241,22 +220,22 @@ channels_dialog_create () channelsD->channel_list = gtk_list_new (); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (listbox), channelsD->channel_list); - gtk_list_set_selection_mode (GTK_LIST (channelsD->channel_list), GTK_SELECTION_MULTIPLE); + gtk_list_set_selection_mode (GTK_LIST (channelsD->channel_list), + GTK_SELECTION_MULTIPLE); gtk_signal_connect (GTK_OBJECT (channelsD->channel_list), "event", (GtkSignalFunc) channel_list_events, channelsD); gtk_container_set_focus_vadjustment (GTK_CONTAINER (channelsD->channel_list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (listbox))); - GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (listbox)->vscrollbar, GTK_CAN_FOCUS); + GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (listbox)->vscrollbar, + GTK_CAN_FOCUS); gtk_widget_show (channelsD->channel_list); gtk_widget_show (listbox); - - /* The ops buttons */ - - button_box = ops_button_box_new (lc_shell, tool_tips, channels_ops_buttons,OPS_BUTTON_NORMAL); - + /* The ops buttons */ + button_box = ops_button_box_new (lc_dialog->shell, tool_tips, + channels_ops_buttons, OPS_BUTTON_NORMAL); gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); gtk_widget_show (button_box); @@ -274,6 +253,132 @@ channels_dialog_create () return channelsD->vbox; } +void +channels_dialog_free () +{ + GSList *list; + ChannelWidget *cw; + + if (! channelsD) + return; + + suspend_gimage_notify++; + /* Free all elements in the channels listbox */ + gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); + suspend_gimage_notify--; + + list = channelsD->channel_widgets; + while (list) + { + cw = (ChannelWidget *) list->data; + list = g_slist_next (list); + channel_widget_delete (cw); + } + channelsD->channel_widgets = NULL; + channelsD->active_channel = NULL; + channelsD->floating_sel = NULL; + + if (channelsD->preview) + gtk_object_sink (GTK_OBJECT (channelsD->preview)); + + g_free (channelsD); + channelsD = NULL; +} + +void +channels_dialog_update (GimpImage* gimage) +{ + ChannelWidget *cw; + Channel *channel; + GSList *list; + GList *item_list; + + if (!channelsD) + return; + if (channelsD->gimage == gimage) + return; + + channelsD->gimage = gimage; + + suspend_gimage_notify++; + /* Free all elements in the channels listbox */ + gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); + suspend_gimage_notify--; + + list = channelsD->channel_widgets; + while (list) + { + cw = (ChannelWidget *) list->data; + list = g_slist_next (list); + channel_widget_delete (cw); + } + channelsD->channel_widgets = NULL; + + /* Find the preview extents */ + channels_dialog_preview_extents (); + + channelsD->active_channel = NULL; + channelsD->floating_sel = NULL; + + /* The image components */ + item_list = NULL; + switch ((channelsD->base_type = gimage_base_type (gimage))) + { + case RGB: + cw = create_channel_widget (gimage, NULL, RED_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[0] = RED_CHANNEL; + + cw = create_channel_widget (gimage, NULL, GREEN_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[1] = GREEN_CHANNEL; + + cw = create_channel_widget (gimage, NULL, BLUE_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[2] = BLUE_CHANNEL; + + channelsD->num_components = 3; + break; + + case GRAY: + cw = create_channel_widget (gimage, NULL, GRAY_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[0] = GRAY_CHANNEL; + + channelsD->num_components = 1; + break; + + case INDEXED: + cw = create_channel_widget (gimage, NULL, INDEXED_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + channelsD->components[0] = INDEXED_CHANNEL; + + channelsD->num_components = 1; + break; + } + + /* The auxillary image channels */ + list = gimage->channels; + while (list) + { + /* create a channel list item */ + channel = (Channel *) list->data; + cw = create_channel_widget (gimage, channel, AUXILLARY_CHANNEL); + channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); + item_list = g_list_append (item_list, cw->list_item); + + list = g_slist_next (list); + } + + /* get the index of the active channel */ + if (item_list) + gtk_list_insert_items (GTK_LIST (channelsD->channel_list), item_list, 0); +} void channels_dialog_flush () @@ -366,150 +471,19 @@ channels_dialog_flush () channel_widget_channel_flush, NULL); } - -/*************************************/ -/* channels dialog widget routines */ -/*************************************/ - -void -channels_dialog_update (GimpImage* gimage) -{ - ChannelWidget *cw; - Channel *channel; - GSList *list; - GList *item_list; - - if (!channelsD) - return; - if (channelsD->gimage == gimage) - return; - - channelsD->gimage=gimage; - - suspend_gimage_notify++; - /* Free all elements in the channels listbox */ - gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); - suspend_gimage_notify--; - - list = channelsD->channel_widgets; - while (list) - { - cw = (ChannelWidget *) list->data; - list = g_slist_next (list); - channel_widget_delete (cw); - } - channelsD->channel_widgets = NULL; - - /* Find the preview extents */ - channels_dialog_preview_extents (); - - channelsD->active_channel = NULL; - channelsD->floating_sel = NULL; - - /* The image components */ - item_list = NULL; - switch ((channelsD->base_type = gimage_base_type (gimage))) - { - case RGB: - cw = create_channel_widget (gimage, NULL, RED_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[0] = RED_CHANNEL; - - cw = create_channel_widget (gimage, NULL, GREEN_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[1] = GREEN_CHANNEL; - - cw = create_channel_widget (gimage, NULL, BLUE_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[2] = BLUE_CHANNEL; - - channelsD->num_components = 3; - break; - - case GRAY: - cw = create_channel_widget (gimage, NULL, GRAY_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[0] = GRAY_CHANNEL; - - channelsD->num_components = 1; - break; - - case INDEXED: - cw = create_channel_widget (gimage, NULL, INDEXED_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - channelsD->components[0] = INDEXED_CHANNEL; - - channelsD->num_components = 1; - break; - } - - /* The auxillary image channels */ - list = gimage->channels; - while (list) - { - /* create a channel list item */ - channel = (Channel *) list->data; - cw = create_channel_widget (gimage, channel, AUXILLARY_CHANNEL); - channelsD->channel_widgets = g_slist_append (channelsD->channel_widgets, cw); - item_list = g_list_append (item_list, cw->list_item); - - list = g_slist_next (list); - } - - /* get the index of the active channel */ - if (item_list) - gtk_list_insert_items (GTK_LIST (channelsD->channel_list), item_list, 0); -} - - void channels_dialog_clear () { + if (! channelsD) + return; + ops_button_box_set_insensitive (channels_ops_buttons); suspend_gimage_notify++; gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); suspend_gimage_notify--; -} -void -channels_dialog_free () -{ - GSList *list; - ChannelWidget *cw; - - if (channelsD == NULL) - return; - - suspend_gimage_notify++; - /* Free all elements in the channels listbox */ - gtk_list_clear_items (GTK_LIST (channelsD->channel_list), 0, -1); - suspend_gimage_notify--; - - list = channelsD->channel_widgets; - while (list) - { - cw = (ChannelWidget *) list->data; - list = g_slist_next (list); - channel_widget_delete (cw); - } - channelsD->channel_widgets = NULL; - channelsD->active_channel = NULL; - channelsD->floating_sel = NULL; - - if (channelsD->preview) - gtk_object_sink (GTK_OBJECT (channelsD->preview)); - - if (channelsD->ops_menu) - gtk_object_sink (GTK_OBJECT (channelsD->ops_menu)); - - g_free (channelsD); - channelsD = NULL; + channelsD->gimage = NULL; } static void @@ -549,41 +523,42 @@ static void channels_dialog_set_menu_sensitivity () { ChannelWidget *cw; - gint fs_sensitive; - gint aux_sensitive; + gint fs_sens; + gint aux_sens; cw = channel_widget_get_ID (channelsD->active_channel); - fs_sensitive = (channelsD->floating_sel != NULL); + fs_sens = (channelsD->floating_sel != NULL); if (cw) - aux_sensitive = (cw->type == AUXILLARY_CHANNEL); + aux_sens = (cw->type == AUXILLARY_CHANNEL); else - aux_sensitive = FALSE; + aux_sens = FALSE; - /* new channel */ - gtk_widget_set_sensitive (channels_ops[0].widget, !fs_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[0].widget, !fs_sensitive); - /* raise channel */ - gtk_widget_set_sensitive (channels_ops[1].widget, !fs_sensitive && aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[1].widget, !fs_sensitive && aux_sensitive); - /* lower channel */ - gtk_widget_set_sensitive (channels_ops[2].widget, !fs_sensitive && aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[2].widget, !fs_sensitive && aux_sensitive); - /* duplicate channel */ - gtk_widget_set_sensitive (channels_ops[3].widget, !fs_sensitive && aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[3].widget, !fs_sensitive && aux_sensitive); - /* delete channel */ - gtk_widget_set_sensitive (channels_ops[4].widget, !fs_sensitive && aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[4].widget, !fs_sensitive && aux_sensitive); - /* channel to selection */ - gtk_widget_set_sensitive (channels_ops[5].widget, aux_sensitive); - gtk_widget_set_sensitive (channels_ops_buttons[5].widget, aux_sensitive); - /* add channel to selection */ - gtk_widget_set_sensitive (channels_ops[6].widget, aux_sensitive); - /* sub channel from selection */ - gtk_widget_set_sensitive (channels_ops[7].widget, aux_sensitive); - /* intersect channel with selection */ - gtk_widget_set_sensitive (channels_ops[8].widget, aux_sensitive); + menus_set_sensitive (_("/New Channel"), !fs_sens); + gtk_widget_set_sensitive (channels_ops_buttons[0].widget, !fs_sens); + + menus_set_sensitive (_("/Raise Channel"), !fs_sens && aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[1].widget, + !fs_sens && aux_sens); + + menus_set_sensitive (_("/Lower Channel"), !fs_sens && aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[2].widget, + !fs_sens && aux_sens); + + menus_set_sensitive (_("/Duplicate Channel"), !fs_sens && aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[3].widget, + !fs_sens && aux_sens); + + menus_set_sensitive (_("/Delete Channel"), !fs_sens && aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[4].widget, + !fs_sens && aux_sens); + + menus_set_sensitive (_("/Channel to Selection"), aux_sens); + gtk_widget_set_sensitive (channels_ops_buttons[5].widget, aux_sens); + + menus_set_sensitive (_("/Add to Selection"), aux_sens); + menus_set_sensitive (_("/Subtract From Selection"), aux_sens); + menus_set_sensitive (_("/Intersect With Selection"), aux_sens); } @@ -791,7 +766,9 @@ channel_list_events (GtkWidget *widget, if (bevent->button == 3 || bevent->button == 2) { - gtk_menu_popup (GTK_MENU (channelsD->ops_menu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); + gtk_menu_popup (GTK_MENU (channelsD->ops_menu), + NULL, NULL, NULL, NULL, + bevent->button, bevent->time); return TRUE; } break; @@ -834,33 +811,33 @@ channel_list_events (GtkWidget *widget, static void channels_dialog_map_callback (GtkWidget *w, - gpointer client_data) + gpointer client_data) { - if (!channelsD) + if (! channelsD) return; - gtk_window_add_accel_group (GTK_WINDOW (lc_shell), + gtk_window_add_accel_group (GTK_WINDOW (lc_dialog->shell), channelsD->accel_group); } static void channels_dialog_unmap_callback (GtkWidget *w, - gpointer client_data) + gpointer client_data) { - if (!channelsD) + if (! channelsD) return; - gtk_window_remove_accel_group (GTK_WINDOW (lc_shell), + gtk_window_remove_accel_group (GTK_WINDOW (lc_dialog->shell), channelsD->accel_group); } -static void +void channels_dialog_new_channel_callback (GtkWidget *w, gpointer client_data) { /* if there is a currently selected gimage, request a new channel */ - if (!channelsD) + if (! channelsD) return; if (channelsD->gimage == NULL) return; @@ -868,14 +845,13 @@ channels_dialog_new_channel_callback (GtkWidget *w, channels_dialog_new_channel_query (channelsD->gimage); } - -static void +void channels_dialog_raise_channel_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!channelsD) + if (! channelsD) return; if (! (gimage = channelsD->gimage)) return; @@ -887,14 +863,13 @@ channels_dialog_raise_channel_callback (GtkWidget *w, } } - -static void +void channels_dialog_lower_channel_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!channelsD) + if (! channelsD) return; if (! (gimage = channelsD->gimage)) return; @@ -906,18 +881,17 @@ channels_dialog_lower_channel_callback (GtkWidget *w, } } - -static void +void channels_dialog_duplicate_channel_callback (GtkWidget *w, gpointer client_data) { - GImage *gimage; + GImage *gimage; Channel *active_channel; Channel *new_channel; /* if there is a currently selected gimage, request a new channel */ - if (!channelsD) + if (! channelsD) return; if (! (gimage = channelsD->gimage)) return; @@ -930,8 +904,7 @@ channels_dialog_duplicate_channel_callback (GtkWidget *w, } } - -static void +void channels_dialog_delete_channel_callback (GtkWidget *w, gpointer client_data) { @@ -939,7 +912,7 @@ channels_dialog_delete_channel_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!channelsD) + if (! channelsD) return; if (! (gimage = channelsD->gimage)) return; @@ -951,8 +924,7 @@ channels_dialog_delete_channel_callback (GtkWidget *w, } } - -static void +void channels_dialog_channel_to_sel_callback (GtkWidget *w, gpointer client_data) { @@ -972,8 +944,7 @@ channels_dialog_channel_to_sel_callback (GtkWidget *w, } } - -static void +void channels_dialog_add_channel_to_sel_callback (GtkWidget *w, gpointer client_data) { @@ -1001,7 +972,7 @@ channels_dialog_add_channel_to_sel_callback (GtkWidget *w, } } -static void +void channels_dialog_sub_channel_from_sel_callback (GtkWidget *w, gpointer client_data) { @@ -1029,7 +1000,7 @@ channels_dialog_sub_channel_from_sel_callback (GtkWidget *w, } } -static void +void channels_dialog_intersect_channel_with_sel_callback (GtkWidget *w, gpointer client_data) { @@ -1289,13 +1260,15 @@ channel_widget_button_events (GtkWidget *widget, case GDK_BUTTON_PRESS: return_val = TRUE; - bevent = (GdkEventButton *) event; - if (bevent->button == 3) { - gtk_menu_popup (GTK_MENU (channelsD->ops_menu), NULL, NULL, NULL, NULL, 3, bevent->time); - return TRUE; - } + if (bevent->button == 3) + { + gtk_menu_popup (GTK_MENU (channelsD->ops_menu), + NULL, NULL, NULL, NULL, + 3, bevent->time); + return TRUE; + } button_down = 1; click_widget = widget; @@ -1390,13 +1363,15 @@ channel_widget_preview_events (GtkWidget *widget, switch (event->type) { case GDK_BUTTON_PRESS: - bevent = (GdkEventButton *) event; - if (bevent->button == 3) { - gtk_menu_popup (GTK_MENU (channelsD->ops_menu), NULL, NULL, NULL, NULL, 3, bevent->time); - return TRUE; - } + if (bevent->button == 3) + { + gtk_menu_popup (GTK_MENU (channelsD->ops_menu), + NULL, NULL, NULL, NULL, + 3, bevent->time); + return TRUE; + } break; case GDK_EXPOSE: @@ -1975,14 +1950,15 @@ channels_dialog_new_channel_query (GimpImage* gimage) typedef struct _EditChannelOptions EditChannelOptions; -struct _EditChannelOptions { +struct _EditChannelOptions +{ GtkWidget *query_box; GtkWidget *name_entry; ChannelWidget *channel_widget; - GimpImage* gimage; - ColorPanel *color_panel; - double opacity; + GimpImage *gimage; + ColorPanel *color_panel; + double opacity; }; static void @@ -1999,33 +1975,35 @@ edit_channel_query_ok_callback (GtkWidget *w, channel = options->channel_widget->channel; opacity = (int) (255 * options->opacity) / 100; + if (options->gimage) + { + /* Set the new channel name */ + channel_set_name (channel, + gtk_entry_get_text (GTK_ENTRY (options->name_entry))); + gtk_label_set_text (GTK_LABEL (options->channel_widget->label), + channel_get_name (channel)); - if (options->gimage) { - - /* Set the new channel name */ - channel_set_name(channel, - gtk_entry_get_text (GTK_ENTRY (options->name_entry))); - gtk_label_set_text (GTK_LABEL (options->channel_widget->label), - channel_get_name(channel)); - - if (channel->opacity != opacity) - { - channel->opacity = opacity; - update = TRUE; - } - for (i = 0; i < 3; i++) - if (options->color_panel->color[i] != channel->col[i]) + if (channel->opacity != opacity) { - channel->col[i] = options->color_panel->color[i]; + channel->opacity = opacity; update = TRUE; } + for (i = 0; i < 3; i++) + if (options->color_panel->color[i] != channel->col[i]) + { + channel->col[i] = options->color_panel->color[i]; + update = TRUE; + } + + if (update) + { + drawable_update (GIMP_DRAWABLE(channel), 0, 0, + GIMP_DRAWABLE(channel)->width, + GIMP_DRAWABLE(channel)->height); + gdisplays_flush (); + } + } - if (update) - { - drawable_update (GIMP_DRAWABLE(channel), 0, 0, GIMP_DRAWABLE(channel)->width, GIMP_DRAWABLE(channel)->height); - gdisplays_flush (); - } - } color_panel_free (options->color_panel); gtk_widget_destroy (options->query_box); g_free (options); @@ -2047,7 +2025,7 @@ edit_channel_query_cancel_callback (GtkWidget *w, static gint edit_channel_query_delete_callback (GtkWidget *w, GdkEvent *e, - gpointer client_data) + gpointer client_data) { edit_channel_query_cancel_callback (w, client_data); @@ -2057,11 +2035,6 @@ edit_channel_query_delete_callback (GtkWidget *w, static void channels_dialog_edit_channel_query (ChannelWidget *channel_widget) { - static ActionAreaItem action_items[2] = - { - { N_("OK"), edit_channel_query_ok_callback, NULL, NULL }, - { N_("Cancel"), edit_channel_query_cancel_callback, NULL, NULL } - }; EditChannelOptions *options; GtkWidget *vbox; GtkWidget *hbox; @@ -2071,6 +2044,12 @@ channels_dialog_edit_channel_query (ChannelWidget *channel_widget) GtkObject *opacity_scale_data; int i; + static ActionAreaItem action_items[] = + { + { N_("OK"), edit_channel_query_ok_callback, NULL, NULL }, + { N_("Cancel"), edit_channel_query_cancel_callback, NULL, NULL } + }; + /* the new options structure */ options = (EditChannelOptions *) g_malloc (sizeof (EditChannelOptions)); options->channel_widget = channel_widget; @@ -2123,7 +2102,8 @@ channels_dialog_edit_channel_query (ChannelWidget *channel_widget) gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - opacity_scale_data = gtk_adjustment_new (options->opacity, 0.0, 100.0, 1.0, 1.0, 0.0); + opacity_scale_data = + gtk_adjustment_new (options->opacity, 0.0, 100.0, 1.0, 1.0, 0.0); opacity_scale = gtk_hscale_new (GTK_ADJUSTMENT (opacity_scale_data)); gtk_box_pack_start (GTK_BOX (hbox), opacity_scale, TRUE, TRUE, 0); gtk_scale_set_value_pos (GTK_SCALE (opacity_scale), GTK_POS_TOP); diff --git a/app/gui/channels-dialog.h b/app/gui/channels-dialog.h index 85463606b2..f1fbd7e878 100644 --- a/app/gui/channels-dialog.h +++ b/app/gui/channels-dialog.h @@ -15,10 +15,17 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __CHANNELS_DIALOG_H__ -#define __CHANNELS_DIALOG_H__ +#ifndef __CHANNELS_DIALOG_H__ +#define __CHANNELS_DIALOG_H__ -void channels_dialog_update_image_list (void); -void channels_dialog_flush (void); +void channels_dialog_new_channel_callback (GtkWidget *, gpointer); +void channels_dialog_raise_channel_callback (GtkWidget *, gpointer); +void channels_dialog_lower_channel_callback (GtkWidget *, gpointer); +void channels_dialog_duplicate_channel_callback (GtkWidget *, gpointer); +void channels_dialog_delete_channel_callback (GtkWidget *, gpointer); +void channels_dialog_channel_to_sel_callback (GtkWidget *, gpointer); +void channels_dialog_add_channel_to_sel_callback (GtkWidget *, gpointer); +void channels_dialog_sub_channel_from_sel_callback (GtkWidget *, gpointer); +void channels_dialog_intersect_channel_with_sel_callback(GtkWidget *, gpointer); -#endif /* __CHANNELS_DIALOG_H__ */ +#endif /* __CHANNELS_DIALOG_H__ */ diff --git a/app/gui/commands.c b/app/gui/commands.c index a44e872c29..174a1a12a2 100644 --- a/app/gui/commands.c +++ b/app/gui/commands.c @@ -24,7 +24,6 @@ #include "brightness_contrast.h" #include "gimpbrushlist.h" #include "by_color_select.h" -#include "channels_dialog.h" #include "colormaps.h" #include "colormap_dialog.i.h" #include "color_area.h" @@ -52,7 +51,7 @@ #include "info_window.h" #include "interface.h" #include "invert.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "layer_select.h" #include "levels.h" #include "module_db.h" @@ -76,8 +75,7 @@ typedef struct } ImageResize; /* external functions */ -extern void layers_dialog_layer_merge_query (GImage *, int); - +extern void layers_dialog_layer_merge_query (GImage *, int); /* local functions */ static void image_resize_callback (GtkWidget *, gpointer); diff --git a/app/gui/file-new-dialog.c b/app/gui/file-new-dialog.c index 30feb79416..ec8dd45499 100644 --- a/app/gui/file-new-dialog.c +++ b/app/gui/file-new-dialog.c @@ -22,6 +22,7 @@ #include "gimprc.h" #include "global_edit.h" #include "interface.h" +#include "lc_dialog.h" #include "plug_in.h" #include "tile_manager_pvt.h" #include "gdisplay.h" @@ -144,6 +145,13 @@ file_new_create_image (NewImageValues *vals) gimage_clean_all (gimage); gdisplay = gdisplay_new (gimage, 0x0101); + + /* Update L&C because the last automatic update at image creation + * time happened when the new image had no layers at all + * + * TODO: make L&C aware of the image's "repaint" signal + */ + lc_dialog_flush (); } g_free (vals); diff --git a/app/gui/help-commands.c b/app/gui/help-commands.c index a44e872c29..174a1a12a2 100644 --- a/app/gui/help-commands.c +++ b/app/gui/help-commands.c @@ -24,7 +24,6 @@ #include "brightness_contrast.h" #include "gimpbrushlist.h" #include "by_color_select.h" -#include "channels_dialog.h" #include "colormaps.h" #include "colormap_dialog.i.h" #include "color_area.h" @@ -52,7 +51,7 @@ #include "info_window.h" #include "interface.h" #include "invert.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "layer_select.h" #include "levels.h" #include "module_db.h" @@ -76,8 +75,7 @@ typedef struct } ImageResize; /* external functions */ -extern void layers_dialog_layer_merge_query (GImage *, int); - +extern void layers_dialog_layer_merge_query (GImage *, int); /* local functions */ static void image_resize_callback (GtkWidget *, gpointer); diff --git a/app/gui/layers-dialog.c b/app/gui/layers-dialog.c index 2eb63e65dd..eb7a689718 100644 --- a/app/gui/layers-dialog.c +++ b/app/gui/layers-dialog.c @@ -18,9 +18,9 @@ #include #include #include "gdk/gdkkeysyms.h" +#include "actionarea.h" #include "appenv.h" #include "draw_core.h" -#include "actionarea.h" #include "buildmenu.h" #include "colormaps.h" #include "drawable.h" @@ -30,19 +30,17 @@ #include "gimage.h" #include "gimage_mask.h" #include "gimprc.h" -#include "gimpset.h" #include "general.h" #include "image_render.h" #include "interface.h" #include "layers_dialog.h" #include "layers_dialogP.h" +#include "lc_dialogP.h" +#include "menus.h" #include "ops_buttons.h" #include "paint_funcs.h" #include "palette.h" -#include "bezier_selectP.h" -#include "paths_dialog.h" #include "resize.h" -#include "session.h" #include "undo.h" #include "libgimp/gimplimits.h" @@ -63,27 +61,27 @@ #include "layer_pvt.h" -#include "dialog_handler.h" +#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_ENTER_NOTIFY_MASK +#define BUTTON_EVENT_MASK GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | \ + GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_BUTTON_RELEASE_MASK - -#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK -#define BUTTON_EVENT_MASK GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | \ - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - -#define LAYER_LIST_WIDTH 200 +#define LAYER_LIST_WIDTH 200 #define LAYER_LIST_HEIGHT 150 #define LAYER_PREVIEW 0 #define MASK_PREVIEW 1 -#define FS_PREVIEW 2 +#define FS_PREVIEW 2 -#define NORMAL 0 -#define SELECTED 1 +#define NORMAL 0 +#define SELECTED 1 #define INSENSITIVE 2 typedef struct _LayersDialog LayersDialog; -struct _LayersDialog { +struct _LayersDialog +{ GtkWidget *vbox; GtkWidget *mode_option_menu; GtkWidget *layer_list; @@ -101,17 +99,17 @@ struct _LayersDialog { int gimage_width, gimage_height; /* state information */ - GimpImage* gimage; - Layer * active_layer; - Channel * active_channel; - gboolean auto_follow_active; - Layer * floating_sel; - GSList * layer_widgets; + GimpImage *gimage; + Layer *active_layer; + Channel *active_channel; + Layer *floating_sel; + GSList *layer_widgets; }; typedef struct _LayerWidget LayerWidget; -struct _LayerWidget { +struct _LayerWidget +{ GtkWidget *eye_widget; GtkWidget *linked_widget; GtkWidget *clip_widget; @@ -136,176 +134,126 @@ struct _LayerWidget { }; /* layers dialog widget routines */ -static void layers_dialog_preview_extents (void); +static void layers_dialog_preview_extents (void); static void layers_dialog_set_menu_sensitivity (void); -static void layers_dialog_set_active_layer (Layer *); -static void layers_dialog_unset_layer (Layer *); -static void layers_dialog_position_layer (Layer *, int); -static void layers_dialog_add_layer (Layer *); -static void layers_dialog_remove_layer (Layer *); -static void layers_dialog_add_layer_mask (Layer *); -static void layers_dialog_remove_layer_mask (Layer *); -static void paint_mode_menu_callback (GtkWidget *, gpointer); -static gint paint_mode_menu_get_position (gint); -static void image_menu_callback (GtkWidget *, gpointer); -static void opacity_scale_update (GtkAdjustment *, gpointer); -static void preserve_trans_update (GtkWidget *, gpointer); -static gint layer_list_events (GtkWidget *, GdkEvent *); +static void layers_dialog_set_active_layer (Layer *); +static void layers_dialog_unset_layer (Layer *); +static void layers_dialog_position_layer (Layer *, int); +static void layers_dialog_add_layer (Layer *); +static void layers_dialog_remove_layer (Layer *); +static void layers_dialog_add_layer_mask (Layer *); +static void layers_dialog_remove_layer_mask (Layer *); +static void paint_mode_menu_callback (GtkWidget *, gpointer); +static gint paint_mode_menu_get_position (gint); +static void opacity_scale_update (GtkAdjustment *, gpointer); +static void preserve_trans_update (GtkWidget *, gpointer); +static gint layer_list_events (GtkWidget *, GdkEvent *); -/* layers dialog menu callbacks */ -static void layers_dialog_map_callback (GtkWidget *, gpointer); +/* for (un)installing the menu accelarators */ +static void layers_dialog_map_callback (GtkWidget *, gpointer); static void layers_dialog_unmap_callback (GtkWidget *, gpointer); -static void layers_dialog_new_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_raise_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_lower_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_raise_layer_to_top_callback (GtkWidget *, gpointer); -static void layers_dialog_lower_layer_to_bottom_callback (GtkWidget *, gpointer); -static void layers_dialog_duplicate_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_delete_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_scale_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_resize_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_add_layer_mask_callback (GtkWidget *, gpointer); -static void layers_dialog_apply_layer_mask_callback (GtkWidget *, gpointer); -static void layers_dialog_anchor_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_merge_layers_callback (GtkWidget *, gpointer); -static void layers_dialog_merge_down_callback (GtkWidget *, gpointer); -static void layers_dialog_flatten_image_callback (GtkWidget *, gpointer); -static void layers_dialog_alpha_select_callback (GtkWidget *, gpointer); -static void layers_dialog_mask_select_callback (GtkWidget *, gpointer); -static void layers_dialog_add_alpha_channel_callback (GtkWidget *, gpointer); - -/* the dialog's toplevel callbacks */ -static void lc_dialog_auto_callback (GtkWidget *, gpointer); -static gint lc_dialog_close_callback (GtkWidget *, gpointer); -static void lc_dialog_update_cb (GimpSet *, GimpImage *, gpointer); -static void lc_dialog_change_image (GimpSet *, GimpImage *, gpointer); /* layer widget function prototypes */ static LayerWidget *layer_widget_get_ID (Layer *); -static LayerWidget *create_layer_widget (GImage *, Layer *); -static void layer_widget_delete (LayerWidget *); -static void layer_widget_select_update (GtkWidget *, gpointer); -static gint layer_widget_button_events (GtkWidget *, GdkEvent *); -static gint layer_widget_preview_events (GtkWidget *, GdkEvent *); -static void layer_widget_boundary_redraw (LayerWidget *, int); -static void layer_widget_preview_redraw (LayerWidget *, int); +static LayerWidget *layer_widget_create (GImage *, Layer *); + +static void layer_widget_delete (LayerWidget *); +static void layer_widget_select_update (GtkWidget *, gpointer); +static gint layer_widget_button_events (GtkWidget *, GdkEvent *); +static gint layer_widget_preview_events (GtkWidget *, GdkEvent *); +static void layer_widget_boundary_redraw (LayerWidget *, int); +static void layer_widget_preview_redraw (LayerWidget *, int); static void layer_widget_no_preview_redraw (LayerWidget *, int); -static void layer_widget_eye_redraw (LayerWidget *); -static void layer_widget_linked_redraw (LayerWidget *); -static void layer_widget_clip_redraw (LayerWidget *); +static void layer_widget_eye_redraw (LayerWidget *); +static void layer_widget_linked_redraw (LayerWidget *); +static void layer_widget_clip_redraw (LayerWidget *); static void layer_widget_exclusive_visible (LayerWidget *); -static void layer_widget_layer_flush (GtkWidget *, gpointer); +static void layer_widget_layer_flush (GtkWidget *, gpointer); /* assorted query dialogs */ -static void layers_dialog_new_layer_query (GimpImage*); -static void layers_dialog_edit_layer_query (LayerWidget *); -static void layers_dialog_add_mask_query (Layer *); -static void layers_dialog_apply_mask_query (Layer *); -static void layers_dialog_scale_layer_query (GImage *, Layer *); +static void layers_dialog_new_layer_query (GimpImage*); +static void layers_dialog_edit_layer_query (LayerWidget *); +static void layers_dialog_add_mask_query (Layer *); +static void layers_dialog_apply_mask_query (Layer *); +static void layers_dialog_scale_layer_query (GImage *, Layer *); static void layers_dialog_resize_layer_query (GImage *, Layer *); -void layers_dialog_layer_merge_query (GImage *, int); - - -/* - * Shared data - */ - -GtkWidget *lc_shell = NULL; -GtkWidget *lc_subshell = NULL; +void layers_dialog_layer_merge_query (GImage *, int); /* * Local data */ static LayersDialog *layersD = NULL; -static GtkWidget *image_menu; -static GtkWidget *image_option_menu; -static GdkPixmap *eye_pixmap[3] = {NULL, NULL, NULL}; -static GdkPixmap *linked_pixmap[3] = {NULL, NULL, NULL}; -static GdkPixmap *layer_pixmap[3] = {NULL, NULL, NULL}; -static GdkPixmap *mask_pixmap[3] = {NULL, NULL, NULL}; +static GdkPixmap *eye_pixmap[] = { NULL, NULL, NULL }; +static GdkPixmap *linked_pixmap[] = { NULL, NULL, NULL }; +static GdkPixmap *layer_pixmap[] = { NULL, NULL, NULL }; +static GdkPixmap *mask_pixmap[] = { NULL, NULL, NULL }; static int suspend_gimage_notify = 0; -static MenuItem layers_ops[] = -{ - { N_("New Layer"), 'N', GDK_CONTROL_MASK, - layers_dialog_new_layer_callback, NULL, NULL, NULL }, - { N_("Raise Layer"), 'F', GDK_CONTROL_MASK, - layers_dialog_raise_layer_callback, NULL, NULL, NULL }, - { N_("Lower Layer"), 'B', GDK_CONTROL_MASK, - layers_dialog_lower_layer_callback, NULL, NULL, NULL }, - { N_("Duplicate Layer"), 'C', GDK_CONTROL_MASK, - layers_dialog_duplicate_layer_callback, NULL, NULL, NULL }, - { N_("Delete Layer"), 'X', GDK_CONTROL_MASK, - layers_dialog_delete_layer_callback, NULL, NULL, NULL }, - { N_("Scale Layer"), 'S', GDK_CONTROL_MASK, - layers_dialog_scale_layer_callback, NULL, NULL, NULL }, - { N_("Resize Layer"), 'R', GDK_CONTROL_MASK, - layers_dialog_resize_layer_callback, NULL, NULL, NULL }, - { N_("Add Layer Mask"), 0, 0, - layers_dialog_add_layer_mask_callback, NULL, NULL, NULL }, - { N_("Apply Layer Mask"), 0, 0, - layers_dialog_apply_layer_mask_callback, NULL, NULL, NULL }, - { N_("Anchor Layer"), 'H', GDK_CONTROL_MASK, - layers_dialog_anchor_layer_callback, NULL, NULL, NULL }, - { N_("Merge Visible Layers"), 'M', GDK_CONTROL_MASK, - layers_dialog_merge_layers_callback, NULL, NULL, NULL }, - { N_("Merge Down"), 'M', GDK_CONTROL_MASK, - layers_dialog_merge_down_callback, NULL, NULL, NULL }, - { N_("Flatten Image"), 0, 0, - layers_dialog_flatten_image_callback, NULL, NULL, NULL }, - { N_("Alpha To Selection"), 0, 0, - layers_dialog_alpha_select_callback, NULL, NULL, NULL }, - { N_("Mask To Selection"), 0, 0, - layers_dialog_mask_select_callback, NULL, NULL, NULL }, - { N_("Add Alpha Channel"), 0, 0, - layers_dialog_add_alpha_channel_callback, NULL, NULL, NULL }, - { N_("Layer to Top"), 'T', GDK_CONTROL_MASK, - layers_dialog_raise_layer_to_top_callback, NULL, NULL, NULL }, - { N_("Layer to Bottom"), 'U', GDK_CONTROL_MASK, - layers_dialog_lower_layer_to_bottom_callback, NULL, NULL, NULL }, - { NULL, 0, 0, NULL, NULL, NULL, NULL }, -}; - /* the option menu items -- the paint modes */ static MenuItem option_items[] = { - { N_("Normal"), 0, 0, paint_mode_menu_callback, (gpointer) NORMAL_MODE, NULL, NULL }, - { N_("Dissolve"), 0, 0, paint_mode_menu_callback, (gpointer) DISSOLVE_MODE, NULL, NULL }, - { N_("Multiply (Burn)"), 0, 0, paint_mode_menu_callback, (gpointer) MULTIPLY_MODE, NULL, NULL }, - { N_("Divide (Dodge)"), 0, 0, paint_mode_menu_callback, (gpointer) DIVIDE_MODE, NULL, NULL }, - { N_("Screen"), 0, 0, paint_mode_menu_callback, (gpointer) SCREEN_MODE, NULL, NULL }, - { N_("Overlay"), 0, 0, paint_mode_menu_callback, (gpointer) OVERLAY_MODE, NULL, NULL }, - { N_("Difference"), 0, 0, paint_mode_menu_callback, (gpointer) DIFFERENCE_MODE, NULL, NULL }, - { N_("Addition"), 0, 0, paint_mode_menu_callback, (gpointer) ADDITION_MODE, NULL, NULL }, - { N_("Subtract"), 0, 0, paint_mode_menu_callback, (gpointer) SUBTRACT_MODE, NULL, NULL }, - { N_("Darken Only"), 0, 0, paint_mode_menu_callback, (gpointer) DARKEN_ONLY_MODE, NULL, NULL }, - { N_("Lighten Only"), 0, 0, paint_mode_menu_callback, (gpointer) LIGHTEN_ONLY_MODE, NULL, NULL }, - { N_("Hue"), 0, 0, paint_mode_menu_callback, (gpointer) HUE_MODE, NULL, NULL }, - { N_("Saturation"), 0, 0, paint_mode_menu_callback, (gpointer) SATURATION_MODE, NULL, NULL }, - { N_("Color"), 0, 0, paint_mode_menu_callback, (gpointer) COLOR_MODE, NULL, NULL }, - { N_("Value"), 0, 0, paint_mode_menu_callback, (gpointer) VALUE_MODE, NULL, NULL }, + { N_("Normal"), 0, 0, + paint_mode_menu_callback, (gpointer) NORMAL_MODE, NULL, NULL }, + { N_("Dissolve"), 0, 0, + paint_mode_menu_callback, (gpointer) DISSOLVE_MODE, NULL, NULL }, + { N_("Multiply (Burn)"), 0, 0, + paint_mode_menu_callback, (gpointer) MULTIPLY_MODE, NULL, NULL }, + { N_("Divide (Dodge)"), 0, 0, + paint_mode_menu_callback, (gpointer) DIVIDE_MODE, NULL, NULL }, + { N_("Screen"), 0, 0, + paint_mode_menu_callback, (gpointer) SCREEN_MODE, NULL, NULL }, + { N_("Overlay"), 0, 0, + paint_mode_menu_callback, (gpointer) OVERLAY_MODE, NULL, NULL }, + { N_("Difference"), 0, 0, + paint_mode_menu_callback, (gpointer) DIFFERENCE_MODE, NULL, NULL }, + { N_("Addition"), 0, 0, + paint_mode_menu_callback, (gpointer) ADDITION_MODE, NULL, NULL }, + { N_("Subtract"), 0, 0, + paint_mode_menu_callback, (gpointer) SUBTRACT_MODE, NULL, NULL }, + { N_("Darken Only"), 0, 0, + paint_mode_menu_callback, (gpointer) DARKEN_ONLY_MODE, NULL, NULL }, + { N_("Lighten Only"), 0, 0, + paint_mode_menu_callback, (gpointer) LIGHTEN_ONLY_MODE, NULL, NULL }, + { N_("Hue"), 0, 0, + paint_mode_menu_callback, (gpointer) HUE_MODE, NULL, NULL }, + { N_("Saturation"), 0, 0, + paint_mode_menu_callback, (gpointer) SATURATION_MODE, NULL, NULL }, + { N_("Color"), 0, 0, + paint_mode_menu_callback, (gpointer) COLOR_MODE, NULL, NULL }, + { N_("Value"), 0, 0, + paint_mode_menu_callback, (gpointer) VALUE_MODE, NULL, NULL }, { NULL, 0, 0, NULL, NULL, NULL, NULL } }; - -/* the ops buttons */ - +/* the ops buttons */ static OpsButtonCallback raise_layers_ext_callbacks[] = -{ layers_dialog_raise_layer_to_top_callback, NULL, NULL, NULL }; +{ + layers_dialog_raise_layer_to_top_callback, NULL, NULL, NULL +}; static OpsButtonCallback lower_layers_ext_callbacks[] = -{ layers_dialog_lower_layer_to_bottom_callback, NULL, NULL, NULL }; +{ + layers_dialog_lower_layer_to_bottom_callback, NULL, NULL, NULL +}; static OpsButton layers_ops_buttons[] = { - { new_xpm, layers_dialog_new_layer_callback, NULL, N_("New Layer"), NULL, 0 }, - { raise_xpm, layers_dialog_raise_layer_callback, raise_layers_ext_callbacks, N_("Raise Layer \n To Top"), NULL, 0 }, - { lower_xpm, layers_dialog_lower_layer_callback, lower_layers_ext_callbacks, N_("Lower Layer \n To Bottom"), NULL, 0 }, - { duplicate_xpm, layers_dialog_duplicate_layer_callback, NULL, N_("Duplicate Layer"), NULL, 0 }, - { delete_xpm, layers_dialog_delete_layer_callback, NULL, N_("Delete Layer"), NULL, 0 }, - { anchor_xpm, layers_dialog_anchor_layer_callback, NULL, N_("Anchor Layer"), NULL, 0 }, + { new_xpm, layers_dialog_new_layer_callback, NULL, + N_("New Layer"), NULL, 0 }, + { raise_xpm, layers_dialog_raise_layer_callback, raise_layers_ext_callbacks, + N_("Raise Layer \n" + " To Top"), NULL, 0 }, + { lower_xpm, layers_dialog_lower_layer_callback, lower_layers_ext_callbacks, + N_("Lower Layer \n" + " To Bottom"), NULL, 0 }, + { duplicate_xpm, layers_dialog_duplicate_layer_callback, NULL, + N_("Duplicate Layer"), NULL, 0 }, + { delete_xpm, layers_dialog_delete_layer_callback, NULL, + N_("Delete Layer"), NULL, 0 }, + { anchor_xpm, layers_dialog_anchor_layer_callback, NULL, + N_("Anchor Layer"), NULL, 0 }, { NULL, NULL, NULL, NULL, NULL, 0 } }; @@ -314,236 +262,227 @@ static OpsButton layers_ops_buttons[] = /* Public layers dialog functions */ /************************************/ -void -lc_dialog_create (GimpImage* gimage) +GtkWidget * +layers_dialog_create () { + GtkWidget *vbox; GtkWidget *util_box; - GtkWidget *auto_button; - GtkWidget *button; + GtkWidget *button_box; GtkWidget *label; - GtkWidget *notebook; - GtkWidget *separator; - int default_index; - - if (lc_shell == NULL) + GtkWidget *menu; + GtkWidget *slider; + GtkWidget *listbox; + + if (! layersD) { - lc_shell = gtk_dialog_new (); + layersD = g_malloc (sizeof (LayersDialog)); + layersD->layer_preview = NULL; + layersD->gimage = NULL; + layersD->active_layer = NULL; + layersD->active_channel = NULL; + layersD->floating_sel = NULL; + layersD->layer_widgets = NULL; + layersD->green_gc = NULL; + layersD->red_gc = NULL; - /* register this one only */ - dialog_register(lc_shell); + if (preview_size) + { + layersD->layer_preview = gtk_preview_new (GTK_PREVIEW_COLOR); + gtk_preview_size (GTK_PREVIEW (layersD->layer_preview), + preview_size, preview_size); + } - gtk_window_set_title (GTK_WINDOW (lc_shell), _("Layers & Channels")); - gtk_window_set_wmclass (GTK_WINDOW (lc_shell), "layers_and_channels", "Gimp"); - session_set_window_geometry (lc_shell, &lc_dialog_session_info, TRUE); - gtk_container_set_border_width - (GTK_CONTAINER (GTK_DIALOG (lc_shell)->vbox), 2); + /* The main vbox */ + layersD->vbox = vbox = gtk_vbox_new (FALSE, 1); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); - gtk_signal_connect (GTK_OBJECT (lc_shell), - "delete_event", - GTK_SIGNAL_FUNC (lc_dialog_close_callback), - NULL); - gtk_signal_connect (GTK_OBJECT (lc_shell), - "destroy", - GTK_SIGNAL_FUNC (gtk_widget_destroyed), - &lc_shell); - gtk_quit_add_destroy (1, GTK_OBJECT (lc_shell)); + /* The layers commands pulldown menu */ + menus_get_layers_menu (&layersD->ops_menu, &layersD->accel_group); - lc_subshell = gtk_vbox_new(FALSE, 2); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(lc_shell)->vbox), lc_subshell, TRUE, TRUE, 2); + /* The Mode option menu, and the preserve transparency */ + layersD->mode_box = util_box = gtk_hbox_new (FALSE, 1); + gtk_box_pack_start (GTK_BOX (vbox), util_box, FALSE, FALSE, 0); - /* The hbox to hold the image option menu box */ - util_box = gtk_hbox_new (FALSE, 1); - gtk_box_pack_start (GTK_BOX(lc_subshell), util_box, FALSE, FALSE, 0); - - /* The GIMP image option menu */ - label = gtk_label_new (_("Image:")); + label = gtk_label_new (_("Mode:")); gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); - image_option_menu = gtk_option_menu_new (); - image_menu = create_image_menu (&gimage, &default_index, image_menu_callback); - gtk_box_pack_start (GTK_BOX (util_box), image_option_menu, TRUE, TRUE, 2); - gtk_widget_show (image_option_menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (image_option_menu), image_menu); - if (default_index != -1) - gtk_option_menu_set_history (GTK_OPTION_MENU (image_option_menu), default_index); + menu = build_menu (option_items, NULL); + layersD->mode_option_menu = gtk_option_menu_new (); + gtk_box_pack_start (GTK_BOX (util_box), layersD->mode_option_menu, + FALSE, FALSE, 2); + + gtk_widget_show (label); + gtk_widget_show (layersD->mode_option_menu); + gtk_option_menu_set_menu (GTK_OPTION_MENU (layersD->mode_option_menu), + menu); + + layersD->preserve_trans = + gtk_check_button_new_with_label (_("Keep Trans.")); + gtk_box_pack_start (GTK_BOX (util_box), layersD->preserve_trans, + FALSE, FALSE, 2); + gtk_signal_connect (GTK_OBJECT (layersD->preserve_trans), "toggled", + (GtkSignalFunc) preserve_trans_update, + layersD); + gtk_widget_show (layersD->preserve_trans); + gtk_widget_show (util_box); + + /* Opacity scale */ + layersD->opacity_box = util_box = gtk_hbox_new (FALSE, 1); + gtk_box_pack_start (GTK_BOX (vbox), util_box, FALSE, FALSE, 0); + + label = gtk_label_new (_("Opacity:")); + gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); gtk_widget_show (label); - /* The Auto-button */ - - auto_button = gtk_toggle_button_new_with_label (_("Auto")); - gtk_box_pack_start (GTK_BOX (util_box), auto_button, FALSE, FALSE, 2); - gtk_signal_connect_object (GTK_OBJECT (auto_button), "clicked", - (GtkSignalFunc) lc_dialog_auto_callback, - GTK_OBJECT(auto_button)); - gtk_widget_show (auto_button); - /* State will be set, when LayersD exists (see below) */ + layersD->opacity_data = + GTK_ADJUSTMENT (gtk_adjustment_new (100.0, 0.0, 100.0, 1.0, 1.0, 0.0)); + slider = gtk_hscale_new (layersD->opacity_data); + gtk_range_set_update_policy (GTK_RANGE (slider), + GTK_UPDATE_CONTINUOUS); + gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_RIGHT); + gtk_box_pack_start (GTK_BOX (util_box), slider, TRUE, TRUE, 0); + gtk_signal_connect (GTK_OBJECT (layersD->opacity_data), "value_changed", + (GtkSignalFunc) opacity_scale_update, + layersD); + gtk_widget_show (slider); gtk_widget_show (util_box); - separator = gtk_hseparator_new (); - gtk_box_pack_start (GTK_BOX(lc_subshell), separator, FALSE, TRUE, 2); - gtk_widget_show (separator); + /* The layers listbox */ + listbox = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_usize (listbox, LAYER_LIST_WIDTH, LAYER_LIST_HEIGHT); + gtk_box_pack_start (GTK_BOX (vbox), listbox, TRUE, TRUE, 2); - /* The notebook widget */ - notebook = gtk_notebook_new (); - gtk_box_pack_start (GTK_BOX(lc_subshell), notebook, TRUE, TRUE, 0); - - label = gtk_label_new (_("Layers")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - layers_dialog_create (), - label); - gtk_widget_show (label); - - /* Now layersD exists, we can set the Auto-togglebutton */ - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (auto_button), - layersD->auto_follow_active); - - label = gtk_label_new (_("Channels")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - channels_dialog_create (), - label); - gtk_widget_show (label); - - label = gtk_label_new (_("Paths")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - paths_dialog_create (), - label); - gtk_widget_show (label); - - gtk_widget_show (notebook); - - gtk_container_set_border_width - (GTK_CONTAINER (GTK_DIALOG(lc_shell)->action_area), 1); - - /* The close button */ - button = gtk_button_new_with_label (_("Close")); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG(lc_shell)->action_area), button, - TRUE, TRUE, 0); - gtk_signal_connect_object (GTK_OBJECT (button), "clicked", - (GtkSignalFunc) lc_dialog_close_callback, - GTK_OBJECT (lc_shell)); - gtk_widget_show (button); - - gtk_widget_show (GTK_DIALOG(lc_shell)->action_area); - - /* Make sure the channels page is realized */ - gtk_notebook_set_page (GTK_NOTEBOOK (notebook), 1); - gtk_notebook_set_page (GTK_NOTEBOOK (notebook), 0); - - if (gimage == NULL) - { - gtk_widget_set_sensitive (lc_subshell, FALSE); - /* This is a little bit ugly, since we should also set - the channels_ops_buttons insensitive, but they are - never shown if the dialog is created on startup with - no image present. */ - ops_button_box_set_insensitive (layers_ops_buttons); - } - gtk_signal_connect (GTK_OBJECT (image_context), "add", - GTK_SIGNAL_FUNC (lc_dialog_update_cb), NULL); - gtk_signal_connect (GTK_OBJECT (image_context), "remove", - GTK_SIGNAL_FUNC(lc_dialog_update_cb), NULL); - gtk_signal_connect (GTK_OBJECT (image_context), "active_changed", - GTK_SIGNAL_FUNC(lc_dialog_change_image), NULL); + layersD->layer_list = gtk_list_new (); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (listbox), + layersD->layer_list); + gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), + GTK_SELECTION_BROWSE); + gtk_signal_connect (GTK_OBJECT (layersD->layer_list), "event", + (GtkSignalFunc) layer_list_events, + layersD); + gtk_container_set_focus_vadjustment (GTK_CONTAINER (layersD->layer_list), + gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (listbox))); + GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (listbox)->vscrollbar, + GTK_CAN_FOCUS); - layers_dialog_update (gimage); - channels_dialog_update (gimage); - paths_dialog_update (gimage); + gtk_widget_show (layersD->layer_list); + gtk_widget_show (listbox); - gtk_widget_show (lc_subshell); - gtk_widget_show (lc_shell); + /* The ops buttons */ + button_box = ops_button_box_new (lc_dialog->shell, tool_tips, + layers_ops_buttons, OPS_BUTTON_NORMAL); + gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); + gtk_widget_show (button_box); - gdisplays_flush (); + /* Set up signals for map/unmap for the accelerators */ + gtk_signal_connect (GTK_OBJECT (layersD->vbox), "map", + (GtkSignalFunc) layers_dialog_map_callback, + NULL); + gtk_signal_connect (GTK_OBJECT (layersD->vbox), "unmap", + (GtkSignalFunc) layers_dialog_unmap_callback, + NULL); + + gtk_widget_show (vbox); } - else - { - if (!GTK_WIDGET_VISIBLE (lc_shell)) - gtk_widget_show (lc_shell); - else - gdk_window_raise (lc_shell->window); - layers_dialog_update (gimage); - channels_dialog_update (gimage); - paths_dialog_update (gimage); - lc_dialog_update_image_list (); - gdisplays_flush (); - } + return layersD->vbox; } void -lc_dialog_update_image_list () +layers_dialog_free () { - int default_index; - GimpImage* default_gimage; + GSList *list; + LayerWidget *lw; - if (lc_shell == NULL) + if (layersD == NULL) return; - default_gimage = layersD->gimage; - layersD->gimage = NULL; /* ??? */ - image_menu = create_image_menu (&default_gimage, &default_index, image_menu_callback); - gtk_option_menu_set_menu (GTK_OPTION_MENU (image_option_menu), image_menu); + /* Free all elements in the layers listbox */ + gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); - if (default_index != -1) + list = layersD->layer_widgets; + while (list) { - if (! GTK_WIDGET_IS_SENSITIVE (lc_subshell) ) - gtk_widget_set_sensitive (lc_subshell, TRUE); - gtk_option_menu_set_history (GTK_OPTION_MENU (image_option_menu), default_index); - - if (default_gimage != layersD->gimage) - { - layers_dialog_update (default_gimage); - channels_dialog_update (default_gimage); - paths_dialog_update (default_gimage); - gdisplays_flush (); - } + lw = (LayerWidget *) list->data; + list = g_slist_next (list); + layer_widget_delete (lw); } - else - { - if (GTK_WIDGET_IS_SENSITIVE (lc_subshell)) - gtk_widget_set_sensitive (lc_subshell, FALSE); + layersD->layer_widgets = NULL; + layersD->active_layer = NULL; + layersD->active_channel = NULL; + layersD->floating_sel = NULL; - layers_dialog_clear (); - channels_dialog_clear (); - } + if (layersD->layer_preview) + gtk_object_sink (GTK_OBJECT (layersD->layer_preview)); + if (layersD->green_gc) + gdk_gc_destroy (layersD->green_gc); + if (layersD->red_gc) + gdk_gc_destroy (layersD->red_gc); + + g_free (layersD); + layersD = NULL; } - void -lc_dialog_free () +layers_dialog_update (GimpImage* gimage) { - if (lc_shell == NULL) + Layer *layer; + LayerWidget *lw; + GSList *list; + GList *item_list; + + if (! layersD) + return; + if (layersD->gimage == gimage) return; - session_get_window_info (lc_shell, &lc_dialog_session_info); + layersD->gimage = gimage; - layers_dialog_free (); - channels_dialog_free (); + suspend_gimage_notify++; - gtk_widget_destroy (lc_shell); -} + /* Free all elements in the layers listbox */ + gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); -void -lc_dialog_rebuild (int new_preview_size) -{ - GimpImage* gimage; - int flag; - - gimage = NULL; - - flag = 0; - if (lc_shell) + list = layersD->layer_widgets; + while (list) { - flag = 1; - gimage = layersD->gimage; - lc_dialog_free (); + lw = (LayerWidget *) list->data; + list = g_slist_next (list); + layer_widget_delete (lw); } - preview_size = new_preview_size; - render_setup (transparency_type, transparency_size); - if (flag) - lc_dialog_create (gimage); -} + if (layersD->layer_widgets) + g_warning ("layersD->layer_widgets not empty!"); + layersD->layer_widgets = NULL; + + /* Find the preview extents */ + layers_dialog_preview_extents (); + + layersD->active_layer = NULL; + layersD->active_channel = NULL; + layersD->floating_sel = NULL; + + list = gimage->layers; + item_list = NULL; + + while (list) + { + /* create a layer list item */ + layer = (Layer *) list->data; + lw = layer_widget_create (gimage, layer); + layersD->layer_widgets = g_slist_append (layersD->layer_widgets, lw); + item_list = g_list_append (item_list, lw->list_item); + + list = g_slist_next (list); + } + + /* get the index of the active layer */ + if (item_list) + gtk_list_insert_items (GTK_LIST (layersD->layer_list), item_list, 0); + + suspend_gimage_notify--; +} void layers_dialog_flush () @@ -555,9 +494,8 @@ layers_dialog_flush () int gimage_pos; int pos; - if (!layersD) + if (! layersD) return; - if (! (gimage = layersD->gimage)) return; @@ -601,7 +539,7 @@ layers_dialog_flush () lw = (LayerWidget *) list->data; list = g_slist_next (list); if (lw->visited == FALSE) - layers_dialog_remove_layer ((lw->layer)); + layers_dialog_remove_layer (lw->layer); } /* Switch positions of items if necessary */ @@ -613,7 +551,7 @@ layers_dialog_flush () list = g_slist_next (list); if ((gimage_pos = gimage_get_layer_index (gimage, lw->layer)) != pos) - layers_dialog_position_layer ((lw->layer), gimage_pos); + layers_dialog_position_layer (lw->layer, gimage_pos); pos++; } @@ -629,9 +567,11 @@ layers_dialog_flush () /* If there is an active channel, this list is single select */ if (layersD->active_channel != NULL) - gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), GTK_SELECTION_SINGLE); + gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), + GTK_SELECTION_SINGLE); else - gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), GTK_SELECTION_BROWSE); + gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), + GTK_SELECTION_BROWSE); } /* set the menus if floating sel status has changed */ @@ -644,321 +584,21 @@ layers_dialog_flush () layer_widget_layer_flush, NULL); } - -void -layers_dialog_free () -{ - GSList *list; - LayerWidget *lw; - - if (layersD == NULL) - return; - - /* Free all elements in the layers listbox */ - gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); - - list = layersD->layer_widgets; - while (list) - { - lw = (LayerWidget *) list->data; - list = g_slist_next(list); - layer_widget_delete (lw); - } - layersD->layer_widgets = NULL; - layersD->active_layer = NULL; - layersD->active_channel = NULL; - layersD->floating_sel = NULL; - - if (layersD->layer_preview) - gtk_object_sink (GTK_OBJECT (layersD->layer_preview)); - if (layersD->green_gc) - gdk_gc_destroy (layersD->green_gc); - if (layersD->red_gc) - gdk_gc_destroy (layersD->red_gc); - - if (layersD->ops_menu) - gtk_object_sink (GTK_OBJECT (layersD->ops_menu)); - - g_free (layersD); - layersD = NULL; -} - - -/*************************************/ -/* layers dialog widget routines */ -/*************************************/ - -GtkWidget * -layers_dialog_create () -{ - GtkWidget *vbox; - GtkWidget *util_box; - GtkWidget *button_box; - GtkWidget *label; - GtkWidget *menu; - GtkWidget *slider; - GtkWidget *listbox; - - - if (!layersD) - { - layersD = g_malloc (sizeof (LayersDialog)); - layersD->layer_preview = NULL; - layersD->gimage = NULL; - layersD->active_layer = NULL; - layersD->active_channel = NULL; - layersD->floating_sel = NULL; - layersD->layer_widgets = NULL; - layersD->accel_group = gtk_accel_group_new (); - layersD->green_gc = NULL; - layersD->red_gc = NULL; - - if (preview_size) - { - layersD->layer_preview = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_size (GTK_PREVIEW (layersD->layer_preview), preview_size, preview_size); - } - - /* The main vbox */ - layersD->vbox = vbox = gtk_vbox_new (FALSE, 1); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); - - /* The layers commands pulldown menu */ - layersD->ops_menu = build_menu (layers_ops, layersD->accel_group); - - /* The Mode option menu, and the preserve transparency */ - layersD->mode_box = util_box = gtk_hbox_new (FALSE, 1); - gtk_box_pack_start (GTK_BOX (vbox), util_box, FALSE, FALSE, 0); - - label = gtk_label_new (_("Mode:")); - gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); - - menu = build_menu (option_items, NULL); - layersD->mode_option_menu = gtk_option_menu_new (); - gtk_box_pack_start (GTK_BOX (util_box), layersD->mode_option_menu, FALSE, FALSE, 2); - - gtk_widget_show (label); - gtk_widget_show (layersD->mode_option_menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (layersD->mode_option_menu), menu); - - layersD->preserve_trans = gtk_check_button_new_with_label (_("Keep Trans.")); - gtk_box_pack_start (GTK_BOX (util_box), layersD->preserve_trans, FALSE, FALSE, 2); - gtk_signal_connect (GTK_OBJECT (layersD->preserve_trans), "toggled", - (GtkSignalFunc) preserve_trans_update, - layersD); - gtk_widget_show (layersD->preserve_trans); - gtk_widget_show (util_box); - - - /* Opacity scale */ - layersD->opacity_box = util_box = gtk_hbox_new (FALSE, 1); - gtk_box_pack_start (GTK_BOX (vbox), util_box, FALSE, FALSE, 0); - label = gtk_label_new (_("Opacity:")); - gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); - layersD->opacity_data = GTK_ADJUSTMENT (gtk_adjustment_new (100.0, 0.0, 100.0, 1.0, 1.0, 0.0)); - slider = gtk_hscale_new (layersD->opacity_data); - gtk_range_set_update_policy (GTK_RANGE (slider), - GTK_UPDATE_CONTINUOUS); - gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_RIGHT); - gtk_box_pack_start (GTK_BOX (util_box), slider, TRUE, TRUE, 0); - gtk_signal_connect (GTK_OBJECT (layersD->opacity_data), "value_changed", - (GtkSignalFunc) opacity_scale_update, - layersD); - - gtk_widget_show (label); - gtk_widget_show (slider); - gtk_widget_show (util_box); - - - /* The layers listbox */ - listbox = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_set_usize (listbox, LAYER_LIST_WIDTH, LAYER_LIST_HEIGHT); - gtk_box_pack_start (GTK_BOX (vbox), listbox, TRUE, TRUE, 2); - - layersD->layer_list = gtk_list_new (); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (listbox), - layersD->layer_list); - gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), GTK_SELECTION_BROWSE); - gtk_signal_connect (GTK_OBJECT (layersD->layer_list), "event", - (GtkSignalFunc) layer_list_events, - layersD); - gtk_container_set_focus_vadjustment (GTK_CONTAINER (layersD->layer_list), - gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (listbox))); - GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (listbox)->vscrollbar, GTK_CAN_FOCUS); - - gtk_widget_show (layersD->layer_list); - gtk_widget_show (listbox); - - /* The ops buttons */ - - button_box = ops_button_box_new (lc_shell, tool_tips, layers_ops_buttons,OPS_BUTTON_NORMAL); - - gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); - gtk_widget_show (button_box); - - /* Set up signals for map/unmap for the accelerators */ - gtk_signal_connect (GTK_OBJECT (layersD->vbox), "map", - (GtkSignalFunc) layers_dialog_map_callback, - NULL); - gtk_signal_connect (GTK_OBJECT (layersD->vbox), "unmap", - (GtkSignalFunc) layers_dialog_unmap_callback, - NULL); - - gtk_widget_show (vbox); - } - - return layersD->vbox; -} - -typedef struct{ - GImage** def; - int* default_index; - MenuItemCallback callback; - GtkWidget* menu; - int num_items; - GImage* id; -}IMCBData; - -static void -create_image_menu_cb (gpointer im, gpointer d) -{ - GimpImage* gimage = GIMP_IMAGE (im); - IMCBData* data = (IMCBData*)d; - char* image_name; - char* menu_item_label; - GtkWidget *menu_item; - - /* make sure the default index gets set to _something_, if possible */ - if (*data->default_index == -1) - { - data->id = gimage; - *data->default_index = data->num_items; - } - - if (gimage == *data->def) - { - data->id = *data->def; - *data->default_index = data->num_items; - } - - image_name = g_basename (gimage_filename (gimage)); - menu_item_label = g_strdup_printf ("%s-%d", image_name, - pdb_image_to_id (gimage)); - menu_item = gtk_menu_item_new_with_label (menu_item_label); - gtk_signal_connect (GTK_OBJECT (menu_item), "activate", - (GtkSignalFunc) data->callback, - (gpointer) ((long) gimage)); - gtk_container_add (GTK_CONTAINER (data->menu), menu_item); - gtk_widget_show (menu_item); - - g_free (menu_item_label); - data->num_items ++; -} - -GtkWidget * -create_image_menu (GimpImage** def, - int *default_index, - MenuItemCallback callback) -{ - IMCBData data; - - data.def = def; - data.default_index = default_index; - data.callback = callback; - data.menu = gtk_menu_new (); - data.num_items = 0; - data.id = NULL; - - *default_index = -1; - - gimage_foreach (create_image_menu_cb, &data); - - if (!data.num_items) - { - GtkWidget* menu_item; - menu_item = gtk_menu_item_new_with_label (_("none")); - gtk_container_add (GTK_CONTAINER (data.menu), menu_item); - gtk_widget_show (menu_item); - } - - *def = data.id; - - return data.menu; -} - -void -layers_dialog_update (GimpImage* gimage) -{ - Layer *layer; - LayerWidget *lw; - GSList *list; - GList *item_list; - - if (!layersD) - return; - if (layersD->gimage == gimage) - return; - - layersD->gimage = gimage; - - suspend_gimage_notify++; - - /* Free all elements in the layers listbox */ - gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); - - list = layersD->layer_widgets; - while (list) - { - lw = (LayerWidget *) list->data; - list = g_slist_next(list); - layer_widget_delete (lw); - } - if (layersD->layer_widgets) - g_warning ("layersD->layer_widgets not empty!"); - layersD->layer_widgets = NULL; - - /* Find the preview extents */ - layers_dialog_preview_extents (); - - layersD->active_layer = NULL; - layersD->active_channel = NULL; - layersD->floating_sel = NULL; - - list = gimage->layers; - item_list = NULL; - - while (list) - { - /* create a layer list item */ - layer = (Layer *) list->data; - lw = create_layer_widget (gimage, layer); - layersD->layer_widgets = g_slist_append (layersD->layer_widgets, lw); - item_list = g_list_append (item_list, lw->list_item); - - list = g_slist_next (list); - } - - /* get the index of the active layer */ - if (item_list) - gtk_list_insert_items (GTK_LIST (layersD->layer_list), item_list, 0); - - gtk_signal_connect (GTK_OBJECT (gimage), - "destroy", - GTK_SIGNAL_FUNC (lc_dialog_update_cb), - NULL); - suspend_gimage_notify--; -} - - void layers_dialog_clear () { ops_button_box_set_insensitive (layers_ops_buttons); - layersD->gimage = NULL; + suspend_gimage_notify++; gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); + suspend_gimage_notify--; + + layersD->gimage = NULL; } +/***********************/ +/* Preview functions */ +/***********************/ void render_preview (TempBuf *preview_buf, @@ -1193,6 +833,10 @@ render_fs_preview (GtkWidget *widget, } +/*************************************/ +/* layers dialog widget routines */ +/*************************************/ + static void layers_dialog_preview_extents () { @@ -1235,6 +879,8 @@ layers_dialog_set_menu_sensitivity () gint gimage; /* is there a gimage */ gint lp; /* layers present */ gint alpha; /* alpha channel present */ + gint lind; /* layer index */ + gint lnum; /* number of layers */ Layer *layer; lp = FALSE; @@ -1255,50 +901,70 @@ layers_dialog_set_menu_sensitivity () if (gimage) lp = (layersD->gimage->layers != NULL); - /* new layer */ - gtk_widget_set_sensitive (layers_ops[0].widget, gimage); - gtk_widget_set_sensitive (layers_ops_buttons[0].widget, gimage); - /* raise layer */ - gtk_widget_set_sensitive (layers_ops[1].widget, fs && ac && gimage && lp && alpha); - gtk_widget_set_sensitive (layers_ops_buttons[1].widget, fs && ac && gimage && lp && alpha); - /* lower layer */ - gtk_widget_set_sensitive (layers_ops[2].widget, fs && ac && gimage && lp && alpha); - gtk_widget_set_sensitive (layers_ops_buttons[2].widget, fs && ac && gimage && lp && alpha); - /* duplicate layer */ - gtk_widget_set_sensitive (layers_ops[3].widget, fs && ac && gimage && lp); - gtk_widget_set_sensitive (layers_ops_buttons[3].widget, fs && ac && gimage && lp); - /* delete layer */ - gtk_widget_set_sensitive (layers_ops[4].widget, ac && gimage && lp); - gtk_widget_set_sensitive (layers_ops_buttons[4].widget, ac && gimage && lp); - /* scale layer */ - gtk_widget_set_sensitive (layers_ops[5].widget, ac && gimage && lp); - /* resize layer */ - gtk_widget_set_sensitive (layers_ops[6].widget, ac && gimage && lp); - /* add layer mask */ - gtk_widget_set_sensitive (layers_ops[7].widget, fs && ac && gimage && !lm && lp && alpha); - /* apply layer mask */ - gtk_widget_set_sensitive (layers_ops[8].widget, fs && ac && gimage && lm && lp); - /* anchor layer */ - gtk_widget_set_sensitive (layers_ops[9].widget, !fs && ac && gimage && lp); - gtk_widget_set_sensitive (layers_ops_buttons[5].widget, !fs && ac && gimage && lp); - /* merge visible layers */ - gtk_widget_set_sensitive (layers_ops[10].widget, fs && ac && gimage && lp); - /* merge visible layers */ - gtk_widget_set_sensitive (layers_ops[11].widget, fs && ac && gimage && lp); - /* flatten image */ - gtk_widget_set_sensitive (layers_ops[12].widget, fs && ac && gimage && lp); - /* alpha select */ - gtk_widget_set_sensitive (layers_ops[13].widget, fs && ac && gimage && lp && alpha); - /* mask select */ - gtk_widget_set_sensitive (layers_ops[14].widget, fs && ac && gimage && lm && lp); - /* add alpha */ - gtk_widget_set_sensitive (layers_ops[15].widget, !alpha); - /* raise layer to top */ - gtk_widget_set_sensitive (layers_ops[16].widget, fs && ac && gimage && lp && alpha); - /* lower layer to bottom */ - gtk_widget_set_sensitive (layers_ops[17].widget, fs && ac && gimage && lp); + lind = -1; + lnum = -1; + if (lp) + { + lind = gimage_get_layer_index (layersD->gimage, + layersD->gimage->active_layer); + lnum = g_slist_length (layersD->gimage->layers); + } - /* set mode, preserve transparency and opacity to insensitive if there are no layers */ + menus_set_sensitive (_("/Stack/Previous Layer"), + fs && ac && gimage && lp && lind > 0); + menus_set_sensitive (_("/Stack/Next Layer"), + fs && ac && gimage && lp && lind < (lnum - 1)); + + menus_set_sensitive (_("/Stack/Raise Layer"), + fs && ac && gimage && lp && alpha && lind > 0); + gtk_widget_set_sensitive (layers_ops_buttons[1].widget, + fs && ac && gimage && lp && alpha && lind > 0); + + menus_set_sensitive (_("/Stack/Lower Layer"), + fs && ac && gimage && lp && lind < (lnum - 1)); + gtk_widget_set_sensitive (layers_ops_buttons[2].widget, + fs && ac && gimage && lp && lind < (lnum - 1)); + + menus_set_sensitive (_("/Stack/Layer to Top"), + fs && ac && gimage && lp && alpha && lind > 0); + menus_set_sensitive (_("/Stack/Layer to Bottom"), + fs && ac && gimage && lp && lind < (lnum - 1)); + + menus_set_sensitive (_("/New Layer"), gimage); + gtk_widget_set_sensitive (layers_ops_buttons[0].widget, gimage); + + menus_set_sensitive (_("/Duplicate Layer"), fs && ac && gimage && lp); + gtk_widget_set_sensitive (layers_ops_buttons[3].widget, + fs && ac && gimage && lp); + + menus_set_sensitive (_("/Delete Layer"), ac && gimage && lp); + gtk_widget_set_sensitive (layers_ops_buttons[4].widget, ac && gimage && lp); + + menus_set_sensitive (_("/Anchor Layer"), !fs && ac && gimage && lp); + gtk_widget_set_sensitive (layers_ops_buttons[5].widget, + !fs && ac && gimage && lp); + + menus_set_sensitive (_("/Scale Layer"), ac && gimage && lp); + menus_set_sensitive (_("/Resize Layer"), ac && gimage && lp); + + menus_set_sensitive (_("/Merge Visible Layers"), + fs && ac && gimage && lp); + menus_set_sensitive (_("/Merge Down"), fs && ac && gimage && lp); + menus_set_sensitive (_("/Flatten Image"), fs && ac && gimage && lp); + + menus_set_sensitive (_("/Add Layer Mask"), + fs && ac && gimage && !lm && lp && alpha); + menus_set_sensitive (_("/Apply Layer Mask"), + fs && ac && gimage && lm && lp); + menus_set_sensitive (_("/Alpha to Selection"), + fs && ac && gimage && lp && alpha); + menus_set_sensitive (_("/Mask to Selection"), + fs && ac && gimage && lm && lp); + menus_set_sensitive (_("/Add Alpha Channel"), !alpha); + + /* set mode, preserve transparency and opacity to insensitive + * if there are no layers + */ gtk_widget_set_sensitive (layersD->preserve_trans, lp); gtk_widget_set_sensitive (layersD->opacity_box, lp); gtk_widget_set_sensitive (layersD->mode_box, lp); @@ -1361,7 +1027,7 @@ layers_dialog_unset_layer (Layer * layer) static void layers_dialog_position_layer (Layer * layer, - int new_index) + int new_index) { LayerWidget *layer_widget; GList *list = NULL; @@ -1401,7 +1067,7 @@ layers_dialog_add_layer (Layer *layer) item_list = NULL; - layer_widget = create_layer_widget (gimage, layer); + layer_widget = layer_widget_create (gimage, layer); item_list = g_list_append (item_list, layer_widget->list_item); position = gimage_get_layer_index (gimage, layer); @@ -1473,19 +1139,15 @@ layers_dialog_remove_layer_mask (Layer * layer) static gint paint_mode_menu_get_position (gint mode) { - /* FIXME this is an ugly hack that should stay around only until - * the layers dialog is rewritten + /* FIXME this is an ugly hack that should stay around only until + * the layers dialog is rewritten */ - int i = 0; + int i; + + for (i = 0; option_items[i].label != NULL; i++) + if (mode == (gint) (option_items[i].user_data)) + return i; - while (option_items [i].label != NULL) - { - if (mode == (gint) (option_items[i].user_data)) - return i; - else - i++; - } - g_message (_("Unknown layer mode")); return 0; } @@ -1500,7 +1162,7 @@ paint_mode_menu_callback (GtkWidget *w, if (! (gimage = layersD->gimage)) return; - if (! (layer = (gimage->active_layer))) + if (! (layer = gimage->active_layer)) return; /* If the layer has an alpha channel, set the transparency and redraw */ @@ -1511,26 +1173,13 @@ paint_mode_menu_callback (GtkWidget *w, { layer->mode = mode; - drawable_update (GIMP_DRAWABLE(layer), 0, 0, GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height); + drawable_update (GIMP_DRAWABLE (layer), 0, 0, GIMP_DRAWABLE (layer)->width, GIMP_DRAWABLE (layer)->height); gdisplays_flush (); } } } -static void -image_menu_callback (GtkWidget *w, - gpointer client_data) -{ - if (!lc_shell) - return; - layers_dialog_update (GIMP_IMAGE(client_data)); - channels_dialog_update (GIMP_IMAGE(client_data)); - paths_dialog_update (GIMP_IMAGE(client_data)); - gdisplays_flush (); -} - - static void opacity_scale_update (GtkAdjustment *adjustment, gpointer data) @@ -1541,8 +1190,7 @@ opacity_scale_update (GtkAdjustment *adjustment, if (! (gimage = layersD->gimage)) return; - - if (! (layer = (gimage->active_layer))) + if (! (layer = gimage->active_layer)) return; /* add the 0.001 to insure there are no subtle rounding errors */ @@ -1551,7 +1199,9 @@ opacity_scale_update (GtkAdjustment *adjustment, { layer->opacity = opacity; - drawable_update (GIMP_DRAWABLE(layer), 0, 0, GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height); + drawable_update (GIMP_DRAWABLE (layer), 0, 0, + GIMP_DRAWABLE (layer)->width, + GIMP_DRAWABLE (layer)->height); gdisplays_flush (); } } @@ -1566,14 +1216,13 @@ preserve_trans_update (GtkWidget *w, if (! (gimage = layersD->gimage)) return; - - if (! (layer = (gimage->active_layer))) + if (! (layer = gimage->active_layer)) return; if (GTK_TOGGLE_BUTTON (w)->active) - layer->preserve_trans = 1; + layer->preserve_trans = TRUE; else - layer->preserve_trans = 0; + layer->preserve_trans = FALSE; } @@ -1590,7 +1239,8 @@ layer_list_events (GtkWidget *widget, if (GTK_IS_LIST_ITEM (event_widget)) { - layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (event_widget)); + layer_widget = + (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (event_widget)); switch (event->type) { @@ -1598,7 +1248,12 @@ layer_list_events (GtkWidget *widget, bevent = (GdkEventButton *) event; if (bevent->button == 3 || bevent->button == 2) - gtk_menu_popup (GTK_MENU (layersD->ops_menu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); + { + gtk_menu_popup (GTK_MENU (layersD->ops_menu), + NULL, NULL, NULL, NULL, + bevent->button, bevent->time); + return TRUE; + } break; case GDK_2BUTTON_PRESS: @@ -1619,7 +1274,7 @@ layer_list_events (GtkWidget *widget, default: return FALSE; } - return TRUE; + return FALSE; default: break; @@ -1638,10 +1293,10 @@ static void layers_dialog_map_callback (GtkWidget *w, gpointer client_data) { - if (!layersD) + if (! layersD) return; - - gtk_window_add_accel_group (GTK_WINDOW (lc_shell), + + gtk_window_add_accel_group (GTK_WINDOW (lc_dialog->shell), layersD->accel_group); } @@ -1649,48 +1304,78 @@ static void layers_dialog_unmap_callback (GtkWidget *w, gpointer client_data) { - if (!layersD) + if (! layersD) return; - - gtk_window_remove_accel_group (GTK_WINDOW (lc_shell), + + gtk_window_remove_accel_group (GTK_WINDOW (lc_dialog->shell), layersD->accel_group); } -static void -layers_dialog_new_layer_callback (GtkWidget *w, - gpointer client_data) +void +layers_dialog_previous_layer_callback (GtkWidget *w, + gpointer client_data) { GImage *gimage; - Layer *layer; + int current_layer; + Layer *new_layer; - /* if there is a currently selected gimage, request a new layer - */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; - /* If there is a floating selection, the new command transforms - * the current fs into a new layer + current_layer = + gimage_get_layer_index (gimage, gimage->active_layer); + + /* FIXME: don't use internal knowledge about layer lists + * TODO : implement gimage_get_layer_by_index() */ - if ((layer = gimage_floating_sel (gimage))) + new_layer = + (Layer *) g_slist_nth_data (gimage->layers, current_layer - 1); + + if (new_layer) { - floating_sel_to_layer (layer); - + gimage_set_active_layer (gimage, new_layer); gdisplays_flush (); } - else - layers_dialog_new_layer_query (layersD->gimage); } +void +layers_dialog_next_layer_callback (GtkWidget *w, + gpointer client_data) +{ + GImage *gimage; + int current_layer; + Layer *new_layer; -static void + if (! layersD) + return; + if (! (gimage = layersD->gimage)) + return; + + current_layer = + gimage_get_layer_index (gimage, gimage->active_layer); + + /* FIXME: don't use internal knowledge about layer lists + * TODO : implement gimage_get_layer_by_index() + */ + new_layer = + (Layer *) g_slist_nth_data (gimage->layers, current_layer + 1); + + if (new_layer) + { + gimage_set_active_layer (gimage, new_layer); + gdisplays_flush (); + } +} + +void layers_dialog_raise_layer_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1699,30 +1384,28 @@ layers_dialog_raise_layer_callback (GtkWidget *w, gdisplays_flush (); } - -static void +void layers_dialog_lower_layer_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; gimage_lower_layer (gimage, gimage->active_layer); - gdisplays_flush (); } -static void +void layers_dialog_raise_layer_to_top_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1735,13 +1418,13 @@ layers_dialog_raise_layer_to_top_callback (GtkWidget *w, } -static void +void layers_dialog_lower_layer_to_bottom_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1753,7 +1436,34 @@ layers_dialog_lower_layer_to_bottom_callback (GtkWidget *w, } } -static void +void +layers_dialog_new_layer_callback (GtkWidget *w, + gpointer client_data) +{ + GImage *gimage; + Layer *layer; + + /* if there is a currently selected gimage, request a new layer + */ + if (! layersD) + return; + if (! (gimage = layersD->gimage)) + return; + + /* If there is a floating selection, the new command transforms + * the current fs into a new layer + */ + if ((layer = gimage_floating_sel (gimage))) + { + floating_sel_to_layer (layer); + + gdisplays_flush (); + } + else + layers_dialog_new_layer_query (layersD->gimage); +} + +void layers_dialog_duplicate_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1763,7 +1473,7 @@ layers_dialog_duplicate_layer_callback (GtkWidget *w, /* if there is a currently selected gimage, request a new layer */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1781,8 +1491,7 @@ layers_dialog_duplicate_layer_callback (GtkWidget *w, gdisplays_flush (); } - -static void +void layers_dialog_delete_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1791,7 +1500,7 @@ layers_dialog_delete_layer_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1808,8 +1517,7 @@ layers_dialog_delete_layer_callback (GtkWidget *w, gdisplays_flush (); } - -static void +void layers_dialog_scale_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1817,7 +1525,7 @@ layers_dialog_scale_layer_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1825,8 +1533,7 @@ layers_dialog_scale_layer_callback (GtkWidget *w, layers_dialog_scale_layer_query (gimage, gimage->active_layer); } - -static void +void layers_dialog_resize_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1834,7 +1541,7 @@ layers_dialog_resize_layer_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1842,8 +1549,7 @@ layers_dialog_resize_layer_callback (GtkWidget *w, layers_dialog_resize_layer_query (gimage, gimage->active_layer); } - -static void +void layers_dialog_add_layer_mask_callback (GtkWidget *w, gpointer client_data) { @@ -1851,7 +1557,7 @@ layers_dialog_add_layer_mask_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1859,8 +1565,7 @@ layers_dialog_add_layer_mask_callback (GtkWidget *w, layers_dialog_add_mask_query (gimage->active_layer); } - -static void +void layers_dialog_apply_layer_mask_callback (GtkWidget *w, gpointer client_data) { @@ -1869,21 +1574,20 @@ layers_dialog_apply_layer_mask_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; /* Make sure there is a layer mask to apply */ - if ((layer = (gimage->active_layer)) != NULL) + if ((layer = gimage->active_layer) != NULL) { if (layer->mask) layers_dialog_apply_mask_query (gimage->active_layer); } } - -static void +void layers_dialog_anchor_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1891,7 +1595,7 @@ layers_dialog_anchor_layer_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1900,8 +1604,7 @@ layers_dialog_anchor_layer_callback (GtkWidget *w, gdisplays_flush (); } - -static void +void layers_dialog_merge_layers_callback (GtkWidget *w, gpointer client_data) { @@ -1909,7 +1612,7 @@ layers_dialog_merge_layers_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1917,13 +1620,15 @@ layers_dialog_merge_layers_callback (GtkWidget *w, layers_dialog_layer_merge_query (gimage, TRUE); } -static void -layers_dialog_merge_down_callback (GtkWidget *w, gpointer client_data) +void +layers_dialog_merge_down_callback (GtkWidget *w, + gpointer client_data) { GImage *gimage; + /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1932,7 +1637,7 @@ layers_dialog_merge_down_callback (GtkWidget *w, gpointer client_data) gdisplays_flush (); } -static void +void layers_dialog_flatten_image_callback (GtkWidget *w, gpointer client_data) { @@ -1940,7 +1645,7 @@ layers_dialog_flatten_image_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1950,7 +1655,7 @@ layers_dialog_flatten_image_callback (GtkWidget *w, } -static void +void layers_dialog_alpha_select_callback (GtkWidget *w, gpointer client_data) { @@ -1958,7 +1663,7 @@ layers_dialog_alpha_select_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1968,7 +1673,7 @@ layers_dialog_alpha_select_callback (GtkWidget *w, } -static void +void layers_dialog_mask_select_callback (GtkWidget *w, gpointer client_data) { @@ -1976,7 +1681,7 @@ layers_dialog_mask_select_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1986,83 +1691,28 @@ layers_dialog_mask_select_callback (GtkWidget *w, } -static void +void layers_dialog_add_alpha_channel_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - Layer *layer; + Layer *layer; /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; - if (! (layer = gimage_get_active_layer (gimage))) return; - /* Add an alpha channel */ + /* Add an alpha channel */ layer_add_alpha (layer); gdisplays_flush (); } -static void -lc_dialog_auto_callback (GtkWidget *toggle_button, - gpointer client_data) -{ - if (layersD) - { - layersD->auto_follow_active = - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button)); - - if (layersD->auto_follow_active) - lc_dialog_change_image (image_context, - (GimpImage *) gimp_set_get_active (image_context), - NULL); - } -} - - -static gint -lc_dialog_close_callback (GtkWidget *w, - gpointer client_data) -{ - if (layersD) - layersD->gimage = NULL; - - gtk_widget_hide (lc_shell); - - return TRUE; -} - - -static void -lc_dialog_update_cb (GimpSet *set, - GimpImage *image, - gpointer user_data) -{ - lc_dialog_update_image_list (); -} - - -static void -lc_dialog_change_image (GimpSet *set, - GimpImage *gimage, - gpointer user_data) -{ - if (layersD && layersD->auto_follow_active && gimage) { - layers_dialog_update (gimage); - channels_dialog_update (gimage); - paths_dialog_update (gimage); - lc_dialog_update_image_list (); - gdisplays_flush (); - } -} - - /****************************/ /* layer widget functions */ /****************************/ @@ -2073,7 +1723,7 @@ layer_widget_get_ID (Layer * ID) LayerWidget *lw; GSList *list; - if (!layersD) + if (! layersD) return NULL; list = layersD->layer_widgets; @@ -2090,9 +1740,8 @@ layer_widget_get_ID (Layer * ID) return NULL; } - static LayerWidget * -create_layer_widget (GImage *gimage, +layer_widget_create (GImage *gimage, Layer *layer) { LayerWidget *layer_widget; @@ -2146,7 +1795,8 @@ create_layer_widget (GImage *gimage, alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_box_pack_start (GTK_BOX (hbox), alignment, FALSE, TRUE, 2); layer_widget->eye_widget = gtk_drawing_area_new (); - gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->eye_widget), eye_width, eye_height); + gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->eye_widget), + eye_width, eye_height); gtk_widget_set_events (layer_widget->eye_widget, BUTTON_EVENT_MASK); gtk_signal_connect (GTK_OBJECT (layer_widget->eye_widget), "event", (GtkSignalFunc) layer_widget_button_events, @@ -2160,7 +1810,8 @@ create_layer_widget (GImage *gimage, alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_box_pack_start (GTK_BOX (hbox), alignment, FALSE, TRUE, 2); layer_widget->linked_widget = gtk_drawing_area_new (); - gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->linked_widget), eye_width, eye_height); + gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->linked_widget), + eye_width, eye_height); gtk_widget_set_events (layer_widget->linked_widget, BUTTON_EVENT_MASK); gtk_signal_connect (GTK_OBJECT (layer_widget->linked_widget), "event", (GtkSignalFunc) layer_widget_button_events, @@ -2205,7 +1856,7 @@ create_layer_widget (GImage *gimage, if (layer_is_floating_sel (layer)) layer_widget->label = gtk_label_new (_("Floating Selection")); else - layer_widget->label = gtk_label_new (layer_get_name(layer)); + layer_widget->label = gtk_label_new (layer_get_name (layer)); gtk_box_pack_start (GTK_BOX (hbox), layer_widget->label, FALSE, FALSE, 2); gtk_widget_show (layer_widget->label); @@ -2216,19 +1867,19 @@ create_layer_widget (GImage *gimage, (GtkSignalFunc) layer_widget_button_events, layer_widget); gtk_object_set_user_data (GTK_OBJECT (layer_widget->clip_widget), layer_widget); - gtk_box_pack_start (GTK_BOX (vbox), layer_widget->clip_widget, FALSE, FALSE, 0); - /* gtk_widget_show (layer_widget->clip_widget); */ + gtk_box_pack_start (GTK_BOX (vbox), layer_widget->clip_widget, + FALSE, FALSE, 0); + /* gtk_widget_show (layer_widget->clip_widget); */ gtk_widget_show (hbox); gtk_widget_show (vbox); gtk_widget_show (list_item); - + gtk_widget_ref (layer_widget->list_item); return layer_widget; } - static void layer_widget_delete (LayerWidget *layer_widget) { @@ -2245,14 +1896,13 @@ layer_widget_delete (LayerWidget *layer_widget) g_free (layer_widget); } - static void layer_widget_select_update (GtkWidget *w, gpointer data) { LayerWidget *layer_widget; - if ((layer_widget = (LayerWidget *) data) == NULL) + if (! (layer_widget = (LayerWidget *) data)) return; /* Is the list item being selected? */ @@ -2269,7 +1919,6 @@ layer_widget_select_update (GtkWidget *w, } } - static gint layer_widget_button_events (GtkWidget *widget, GdkEvent *event) @@ -2299,13 +1948,15 @@ layer_widget_button_events (GtkWidget *widget, case GDK_BUTTON_PRESS: return_val = TRUE; - bevent = (GdkEventButton *) event; - if (bevent->button == 3) { - gtk_menu_popup (GTK_MENU (layersD->ops_menu), NULL, NULL, NULL, NULL, 3, bevent->time); - return TRUE; - } + if (bevent->button == 3) + { + gtk_menu_popup (GTK_MENU (layersD->ops_menu), + NULL, NULL, NULL, NULL, + 3, bevent->time); + return TRUE; + } button_down = 1; click_widget = widget; @@ -2401,7 +2052,6 @@ layer_widget_button_events (GtkWidget *widget, return return_val; } - static gint layer_widget_preview_events (GtkWidget *widget, GdkEvent *event) @@ -2446,11 +2096,14 @@ layer_widget_preview_events (GtkWidget *widget, case GDK_BUTTON_PRESS: /* Control-button press disables the application of the mask */ bevent = (GdkEventButton *) event; - - if (bevent->button == 3) { - gtk_menu_popup (GTK_MENU (layersD->ops_menu), NULL, NULL, NULL, NULL, 3, bevent->time); - return TRUE; - } + + if (bevent->button == 3) + { + gtk_menu_popup (GTK_MENU (layersD->ops_menu), + NULL, NULL, NULL, NULL, + 3, bevent->time); + return TRUE; + } if (event->button.state & GDK_CONTROL_MASK) { @@ -2699,7 +2352,6 @@ layer_widget_preview_redraw (LayerWidget *layer_widget, } } - static void layer_widget_no_preview_redraw (LayerWidget *layer_widget, int preview_type) @@ -2792,7 +2444,6 @@ layer_widget_no_preview_redraw (LayerWidget *layer_widget, pixmap, 0, 0, 2, 2, width, height); } - static void layer_widget_eye_redraw (LayerWidget *layer_widget) { @@ -2930,7 +2581,6 @@ layer_widget_clip_redraw (LayerWidget *layer_widget) gdk_window_clear (layer_widget->clip_widget->window); } - static void layer_widget_exclusive_visible (LayerWidget *layer_widget) { @@ -3088,7 +2738,6 @@ layer_widget_layer_flush (GtkWidget *widget, /* * The new layer query dialog */ - typedef struct _NewLayerOptions NewLayerOptions; struct _NewLayerOptions { @@ -3362,7 +3011,6 @@ layers_dialog_new_layer_query (GimpImage* gimage) /* * The edit layer attributes dialog */ - typedef struct _EditLayerOptions EditLayerOptions; struct _EditLayerOptions { @@ -3427,20 +3075,22 @@ edit_layer_query_delete_callback (GtkWidget *w, static void layers_dialog_edit_layer_query (LayerWidget *layer_widget) { - static ActionAreaItem action_items[2] = - { - { N_("OK"), edit_layer_query_ok_callback, NULL, NULL }, - { N_("Cancel"), edit_layer_query_cancel_callback, NULL, NULL } - }; EditLayerOptions *options; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; + static ActionAreaItem action_items[] = + { + { N_("OK"), edit_layer_query_ok_callback, NULL, NULL }, + { N_("Cancel"), edit_layer_query_cancel_callback, NULL, NULL } + }; + /* the new options structure */ options = (EditLayerOptions *) g_malloc (sizeof (EditLayerOptions)); options->layer = layer_widget->layer; options->gimage = layer_widget->gimage; + /* the dialog */ options->query_box = gtk_dialog_new (); gtk_window_set_wmclass (GTK_WINDOW (options->query_box), "edit_layer_attrributes", "Gimp"); @@ -3461,15 +3111,19 @@ layers_dialog_edit_layer_query (LayerWidget *layer_widget) /* the name entry hbox, label and entry */ hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + label = gtk_label_new (_("Layer name: ")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); + options->name_entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (hbox), options->name_entry, TRUE, TRUE, 0); gtk_entry_set_text (GTK_ENTRY (options->name_entry), ((layer_is_floating_sel (layer_widget->layer) ? - _("Floating Selection") : layer_get_name(layer_widget->layer)))); + _("Floating Selection") : + layer_get_name(layer_widget->layer)))); gtk_widget_show (options->name_entry); + gtk_widget_show (hbox); action_items[0].user_data = options; @@ -3963,11 +3617,12 @@ layers_dialog_resize_layer_query (GImage * gimage, typedef struct _LayerMergeOptions LayerMergeOptions; -struct _LayerMergeOptions { +struct _LayerMergeOptions +{ GtkWidget *query_box; - GimpImage* gimage; - int merge_visible; - MergeType merge_type; + GimpImage *gimage; + int merge_visible; + MergeType merge_type; }; static void @@ -4056,14 +3711,14 @@ layers_dialog_layer_merge_query (GImage *gimage, GtkWidget *radio_box; GtkWidget *radio_button; GSList *group = NULL; - int i; - char *button_names[3] = + gint i; + static gchar *button_names[] = { N_("Expanded as necessary"), N_("Clipped to image"), N_("Clipped to bottom layer") }; - ActionCallback button_callbacks[3] = + static ActionCallback button_callbacks[] = { expand_as_necessary_callback, clip_to_image_callback, @@ -4112,7 +3767,8 @@ layers_dialog_layer_merge_query (GImage *gimage, /* the radio buttons */ for (i = 0; i < 3; i++) { - radio_button = gtk_radio_button_new_with_label (group, gettext(button_names[i])); + radio_button = + gtk_radio_button_new_with_label (group, gettext(button_names[i])); group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button)); gtk_box_pack_start (GTK_BOX (radio_box), radio_button, FALSE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (radio_button), "toggled", @@ -4130,4 +3786,3 @@ layers_dialog_layer_merge_query (GImage *gimage, gtk_widget_show (vbox); gtk_widget_show (options->query_box); } - diff --git a/app/gui/layers-dialog.h b/app/gui/layers-dialog.h index c792630a23..dbc1237b04 100644 --- a/app/gui/layers-dialog.h +++ b/app/gui/layers-dialog.h @@ -15,15 +15,28 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __LAYERS_DIALOG_H__ -#define __LAYERS_DIALOG_H__ +#ifndef __LAYERS_DIALOG_H__ +#define __LAYERS_DIALOG_H__ -#include "gimpimageF.h" +void layers_dialog_previous_layer_callback (GtkWidget *, gpointer); +void layers_dialog_next_layer_callback (GtkWidget *, gpointer); +void layers_dialog_raise_layer_callback (GtkWidget *, gpointer); +void layers_dialog_lower_layer_callback (GtkWidget *, gpointer); +void layers_dialog_raise_layer_to_top_callback (GtkWidget *, gpointer); +void layers_dialog_lower_layer_to_bottom_callback (GtkWidget *, gpointer); +void layers_dialog_new_layer_callback (GtkWidget *, gpointer); +void layers_dialog_duplicate_layer_callback (GtkWidget *, gpointer); +void layers_dialog_delete_layer_callback (GtkWidget *, gpointer); +void layers_dialog_scale_layer_callback (GtkWidget *, gpointer); +void layers_dialog_resize_layer_callback (GtkWidget *, gpointer); +void layers_dialog_add_layer_mask_callback (GtkWidget *, gpointer); +void layers_dialog_apply_layer_mask_callback (GtkWidget *, gpointer); +void layers_dialog_anchor_layer_callback (GtkWidget *, gpointer); +void layers_dialog_merge_layers_callback (GtkWidget *, gpointer); +void layers_dialog_merge_down_callback (GtkWidget *, gpointer); +void layers_dialog_flatten_image_callback (GtkWidget *, gpointer); +void layers_dialog_alpha_select_callback (GtkWidget *, gpointer); +void layers_dialog_mask_select_callback (GtkWidget *, gpointer); +void layers_dialog_add_alpha_channel_callback (GtkWidget *, gpointer); -void lc_dialog_create (GimpImage*); -void lc_dialog_update_image_list (void); -void lc_dialog_free (void); -void lc_dialog_rebuild (int); -void layers_dialog_flush (void); - -#endif /* __LAYERS_DIALOG_H__ */ +#endif /* __LAYERS_DIALOG_H__ */ diff --git a/app/gui/menus.c b/app/gui/menus.c index 9c67fc91ac..7281eaaab9 100644 --- a/app/gui/menus.c +++ b/app/gui/menus.c @@ -19,13 +19,16 @@ #include #include #include "appenv.h" +#include "channels_dialog.h" #include "colormaps.h" #include "commands.h" #include "fileops.h" #include "general.h" #include "gimprc.h" #include "interface.h" +#include "layers_dialog.h" #include "menus.h" +#include "paths_dialog.h" #include "paint_funcs.h" #include "procedural_db.h" #include "scale.h" @@ -168,6 +171,7 @@ static const GtkItemFactoryEntry image_entries[] = { N_("/Layers/Alpha To Selection"), NULL, layers_alpha_select_cmd_callback, 0 }, { N_("/Layers/Mask To Selection"), NULL, layers_mask_select_cmd_callback, 0 }, { N_("/Layers/Add Alpha Channel"), NULL, layers_add_alpha_channel_cmd_callback, 0 }, + { N_("/Layers/---"), NULL, NULL, 0, "" }, /* these are built on the fly */ @@ -240,13 +244,74 @@ static const GtkItemFactoryEntry save_entries[] = static guint n_save_entries = sizeof (save_entries) / sizeof (save_entries[0]); static GtkItemFactory *save_factory = NULL; +static const GtkItemFactoryEntry layers_entries[] = +{ + { N_("/New Layer"), "N", layers_dialog_new_layer_callback, 0 }, + { N_("/Stack/Previous Layer"), "Prior", layers_dialog_previous_layer_callback, 0 }, + { N_("/Stack/Next Layer"), "Next", layers_dialog_next_layer_callback, 0 }, + { N_("/Stack/Raise Layer"), "Prior", layers_dialog_raise_layer_callback, 0 }, + { N_("/Stack/Lower Layer"), "Next", layers_dialog_lower_layer_callback, 0 }, + { N_("/Stack/Layer to Top"), "Prior", layers_dialog_raise_layer_to_top_callback, 0 }, + { N_("/Stack/Layer to Bottom"), "Next", layers_dialog_lower_layer_to_bottom_callback, 0 }, + { N_("/Duplicate Layer"), "C", layers_dialog_duplicate_layer_callback, 0 }, + { N_("/Delete Layer"), "X", layers_dialog_delete_layer_callback, 0 }, + { N_("/Anchor Layer"), "H", layers_dialog_anchor_layer_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Scale Layer"), "S", layers_dialog_scale_layer_callback, 0 }, + { N_("/Resize Layer"), "R", layers_dialog_resize_layer_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Merge Visible Layers"), "M", layers_dialog_merge_layers_callback, 0 }, + { N_("/Merge Down"), "M", layers_dialog_merge_down_callback, 0 }, + { N_("/Flatten Image"), NULL, layers_dialog_flatten_image_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Add Layer Mask"), NULL, layers_dialog_add_layer_mask_callback, 0 }, + { N_("/Apply Layer Mask"), NULL, layers_dialog_apply_layer_mask_callback, 0 }, + { N_("/Alpha to Selection"), NULL, layers_dialog_alpha_select_callback, 0 }, + { N_("/Mask to Selection"), NULL, layers_dialog_mask_select_callback, 0 }, + { N_("/Add Alpha Channel"), NULL, layers_dialog_add_alpha_channel_callback, 0 } +}; +static guint n_layers_entries = sizeof (layers_entries) / sizeof (layers_entries[0]); +static GtkItemFactory *layers_factory = NULL; + +static const GtkItemFactoryEntry channels_entries[] = +{ + { N_("/New Channel"), "N", channels_dialog_new_channel_callback, 0 }, + { N_("/Raise Channel"), "F", channels_dialog_raise_channel_callback, 0 }, + { N_("/Lower Channel"), "B", channels_dialog_lower_channel_callback, 0 }, + { N_("/Duplicate Channel"), "C", channels_dialog_duplicate_channel_callback, 0 }, + { N_("/Delete Channel"), "X", channels_dialog_delete_channel_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Channel to Selection"), "S", channels_dialog_channel_to_sel_callback, 0 }, + { N_("/Add to Selection"), NULL, channels_dialog_add_channel_to_sel_callback, 0 }, + { N_("/Subtract From Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 }, + { N_("/Intersect With Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 } +}; +static guint n_channels_entries = sizeof (channels_entries) / sizeof (channels_entries[0]); +static GtkItemFactory *channels_factory = NULL; + +static const GtkItemFactoryEntry paths_entries[] = +{ + { N_("/New Path"), "N", paths_dialog_new_path_callback, 0 }, + { N_("/Duplicate Path"), "U", paths_dialog_dup_path_callback, 0 }, + { N_("/Delete Path"), "X", paths_dialog_delete_path_callback, 0 }, + { N_("/Path to Selection"), "S", paths_dialog_path_to_sel_callback, 0 }, + { N_("/Stroke Path"), "T", paths_dialog_stroke_path_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Copy Path"), "C", paths_dialog_copy_path_callback, 0 }, + { N_("/Paste Path"), "V", paths_dialog_paste_path_callback, 0 }, + { N_("/Import Path"), "I", paths_dialog_import_path_callback, 0 }, + { N_("/Export Path"), "E", paths_dialog_export_path_callback, 0 } +}; +static guint n_paths_entries = sizeof (paths_entries) / sizeof (paths_entries[0]); +static GtkItemFactory *paths_factory = NULL; + static int initialize = TRUE; extern int num_tools; void -menus_get_toolbox_menubar (GtkWidget **menubar, - GtkAccelGroup **accel_group) +menus_get_toolbox_menubar (GtkWidget **menubar, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -258,8 +323,8 @@ menus_get_toolbox_menubar (GtkWidget **menubar, } void -menus_get_image_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_image_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -271,8 +336,8 @@ menus_get_image_menu (GtkWidget **menu, } void -menus_get_load_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_load_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -284,8 +349,8 @@ menus_get_load_menu (GtkWidget **menu, } void -menus_get_save_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_save_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -296,9 +361,48 @@ menus_get_save_menu (GtkWidget **menu, *accel_group = save_factory->accel_group; } +void +menus_get_layers_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = layers_factory->widget; + if (accel_group) + *accel_group = layers_factory->accel_group; +} + +void +menus_get_channels_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = channels_factory->widget; + if (accel_group) + *accel_group = channels_factory->accel_group; +} + +void +menus_get_paths_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = paths_factory->widget; + if (accel_group) + *accel_group = paths_factory->accel_group; +} + void menus_create (GtkMenuEntry *entries, - int nmenu_entries) + int n_menu_entries) { GtkItemFactory *ifactory; GtkWidget *menu_item; @@ -308,10 +412,10 @@ menus_create (GtkMenuEntry *entries, if (initialize) menus_init (); - gtk_item_factory_create_menu_entries (nmenu_entries, entries); + gtk_item_factory_create_menu_entries (n_menu_entries, entries); - for (i = 0; i < nmenu_entries; i++) - if (!strncmp(entries[i].path, "", 7)) + for (i = 0; i < n_menu_entries; i++) + if (! strncmp (entries[i].path, "", 7)) redo_image_menu = TRUE; if (redo_image_menu) @@ -344,7 +448,6 @@ menus_tools_create (ToolInfo *tool_info) &entry, (gpointer)tool_info, 2); - } void @@ -418,6 +521,9 @@ menus_quit (void) gtk_object_unref (GTK_OBJECT (image_factory)); gtk_object_unref (GTK_OBJECT (load_factory)); gtk_object_unref (GTK_OBJECT (save_factory)); + gtk_object_unref (GTK_OBJECT (layers_factory)); + gtk_object_unref (GTK_OBJECT (channels_factory)); + gtk_object_unref (GTK_OBJECT (paths_factory)); } } @@ -586,27 +692,29 @@ translate_entries (const GtkItemFactoryEntry *entries, gint n) gint i; GtkItemFactoryEntry *ret; - ret=g_malloc( sizeof(GtkItemFactoryEntry) * n ); - for (i=0; i", NULL); - translated_entries=translate_entries(image_entries, n_image_entries); + translated_entries = translate_entries (image_entries, n_image_entries); gtk_item_factory_create_items_ac (image_factory, n_image_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_image_entries); + free_translated_entries (translated_entries, n_image_entries); + load_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); - translated_entries=translate_entries(load_entries, n_load_entries); + translated_entries = translate_entries (load_entries, n_load_entries); gtk_item_factory_create_items_ac (load_factory, n_load_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_load_entries); + free_translated_entries (translated_entries, n_load_entries); + save_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); - translated_entries=translate_entries(load_entries, n_save_entries); + translated_entries = translate_entries (load_entries, n_save_entries); gtk_item_factory_create_items_ac (save_factory, n_save_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_save_entries); + free_translated_entries (translated_entries, n_save_entries); + + layers_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (layers_entries, n_layers_entries); + gtk_item_factory_create_items_ac (layers_factory, + n_layers_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_layers_entries); + + channels_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (channels_entries, n_channels_entries); + gtk_item_factory_create_items_ac (channels_factory, + n_channels_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_channels_entries); + + paths_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (paths_entries, n_paths_entries); + gtk_item_factory_create_items_ac (paths_factory, + n_paths_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_paths_entries); + for (i = 0; i < num_tools; i++) { /* FIXME this need to use access functions to check a flag */ if (tool_info[i].menu_path) menus_tools_create (tool_info+i); } + filename = gimp_personal_rc_file ("menurc"); gtk_item_factory_parse_rc (filename); g_free (filename); diff --git a/app/gui/menus.h b/app/gui/menus.h index 39d870aaa2..880d778b11 100644 --- a/app/gui/menus.h +++ b/app/gui/menus.h @@ -18,27 +18,34 @@ #ifndef __MENUS_H__ #define __MENUS_H__ - #include "gtk/gtk.h" +void menus_get_toolbox_menubar (GtkWidget **menubar, + GtkAccelGroup **accel_group); +void menus_get_image_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_load_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_save_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_layers_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_channels_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_paths_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); + +void menus_create (GtkMenuEntry *entries, + gint n_menu_entries); +void menus_destroy (gchar *path); -void menus_get_toolbox_menubar (GtkWidget **menubar, - GtkAccelGroup **accel_group); -void menus_get_image_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_get_load_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_get_save_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_create (GtkMenuEntry *entries, - int nmenu_entries); -void menus_set_sensitive (char *path, - int sensitive); -void menus_set_state (char *path, - int state); -void menus_destroy (char *path); void menus_quit (void); -void menus_last_opened_add (gchar *filename); +void menus_set_sensitive (gchar *path, + gint sensitive); +void menus_set_state (gchar *path, + gint state); -#endif /* MENUS_H */ +void menus_last_opened_add (gchar *filename); + +#endif /* __MENUS_H__ */ diff --git a/app/gui/paths-dialog.c b/app/gui/paths-dialog.c index 7a01be97c8..f734a2eefc 100644 --- a/app/gui/paths-dialog.c +++ b/app/gui/paths-dialog.c @@ -16,7 +16,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Some of this code is based on the layers_dialog box code. */ - #include "config.h" #include @@ -28,7 +27,6 @@ #include "appenv.h" #include "draw_core.h" #include "actionarea.h" -#include "buildmenu.h" #include "colormaps.h" #include "drawable.h" #include "errors.h" @@ -41,18 +39,18 @@ #include "general.h" #include "image_render.h" #include "interface.h" -#include "layers_dialog.h" -#include "layers_dialogP.h" +#include "lc_dialogP.h" +#include "menus.h" #include "ops_buttons.h" #include "paint_funcs.h" #include "bezier_select.h" #include "bezier_selectP.h" #include "pathsP.h" #include "paths_dialog.h" +#include "paths_dialogP.h" #include "resize.h" #include "session.h" #include "undo.h" -#include "libgimp/gimpmatrix.h" #include "libgimp/gimpintl.h" @@ -72,9 +70,10 @@ #define rint(x) floor (x + 0.5) #endif -#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK +#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_ENTER_NOTIFY_MASK -#define PATHS_LIST_WIDTH 200 +#define PATHS_LIST_WIDTH 200 #define PATHS_LIST_HEIGHT 150 typedef struct { @@ -129,15 +128,8 @@ static void paths_dialog_realized (GtkWidget *widget); static void paths_select_row (GtkWidget *widget,gint row,gint column,GdkEventButton *event,gpointer data); static void paths_unselect_row (GtkWidget *widget,gint row,gint column,GdkEventButton *event,gpointer data); static gint paths_list_events (GtkWidget *widget,GdkEvent *event); -static void paths_dialog_new_path_callback (GtkWidget *, gpointer); -static void paths_dialog_delete_path_callback (GtkWidget *, gpointer); static void paths_dialog_map_callback (GtkWidget *w,gpointer client_data); static void paths_dialog_unmap_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_dup_path_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_copy_path_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_paste_path_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_stroke_path_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_path_to_sel_callback(GtkWidget *w,gpointer client_data); static void paths_dialog_destroy_cb (GimpImage *image); static void paths_update_paths(gpointer data,gint row); static GSList * pathpoints_copy(GSList *list); @@ -148,55 +140,29 @@ static void paths_dialog_new_point_callback (GtkWidget *, gpointer); static void paths_dialog_add_point_callback (GtkWidget *, gpointer); static void paths_dialog_delete_point_callback (GtkWidget *, gpointer); static void paths_dialog_edit_point_callback (GtkWidget *, gpointer); -static void paths_dialog_import_path_callback (GtkWidget *, gpointer); -static void paths_dialog_export_path_callback (GtkWidget *, gpointer); static void path_close(PATHP); - -static MenuItem paths_ops[] = -{ - { N_("New Path"), 'N', GDK_CONTROL_MASK, - paths_dialog_new_path_callback, NULL, NULL, NULL }, - { N_("Duplicate Path"), 'U', GDK_CONTROL_MASK, - paths_dialog_dup_path_callback, NULL, NULL, NULL }, - { N_("Path to Selection"), 'S', GDK_CONTROL_MASK, - paths_dialog_path_to_sel_callback, NULL, NULL, NULL }, - { N_("Stroke Path"), 'T', GDK_CONTROL_MASK, - paths_dialog_stroke_path_callback, NULL, NULL, NULL }, - { N_("Delete Path"), 'D', GDK_CONTROL_MASK, - paths_dialog_delete_path_callback, NULL, NULL, NULL }, - { N_("Import Path"), 'I', GDK_CONTROL_MASK, - paths_dialog_import_path_callback, NULL, NULL, NULL }, - { N_("Export Path"), 'E', GDK_CONTROL_MASK, - paths_dialog_export_path_callback, NULL, NULL, NULL }, - { N_("Copy Path"), 'C', GDK_CONTROL_MASK, - paths_dialog_copy_path_callback, NULL, NULL, NULL }, - { N_("Paste Path"), 'P', GDK_CONTROL_MASK, - paths_dialog_paste_path_callback, NULL, NULL, NULL }, - { NULL, 0, 0, NULL, NULL, NULL, NULL } -}; - -#define NEW_PATH_BUTTON 1 -#define DUP_PATH_BUTTON 2 -#define PATH_TO_SEL_BUTTON 3 -#define STROKE_PATH_BUTTON 4 -#define DEL_PATH_BUTTON 5 -#define COPY_PATH_BUTTON 8 -#define PASTE_PATH_BUTTON 9 +#define NEW_PATH_BUTTON 1 +#define DUP_PATH_BUTTON 2 +#define DEL_PATH_BUTTON 3 +#define PATH_TO_SEL_BUTTON 4 +#define STROKE_PATH_BUTTON 5 +#define COPY_PATH_BUTTON 8 +#define PASTE_PATH_BUTTON 9 static OpsButton paths_ops_buttons[] = { { new_xpm, paths_dialog_new_path_callback, NULL, N_("New Path"), NULL, 0 }, { duplicate_xpm, paths_dialog_dup_path_callback, NULL, N_("Duplicate Path"), NULL, 0 }, + { delete_xpm, paths_dialog_delete_path_callback, NULL, N_("Delete Path"), NULL, 0 }, { toselection_xpm, paths_dialog_path_to_sel_callback, NULL, N_("Path to Selection"), NULL, 0 }, { penstroke_xpm, paths_dialog_stroke_path_callback, NULL, N_("Stroke Path"), NULL, 0 }, - { delete_xpm, paths_dialog_delete_path_callback, NULL, N_("Delete Path"), NULL, 0 }, { NULL, NULL, NULL, NULL, NULL, 0 } }; -#define POINT_NEW_BUTTON 1 -#define POINT_ADD_BUTTON 2 -#define POINT_DEL_BUTTON 3 +#define POINT_NEW_BUTTON 1 +#define POINT_ADD_BUTTON 2 +#define POINT_DEL_BUTTON 3 #define POINT_EDIT_BUTTON 4 static OpsButton point_ops_buttons[] = @@ -209,35 +175,36 @@ static OpsButton point_ops_buttons[] = }; static void -paths_ops_button_set_sensitive(gint but,gboolean sensitive) +paths_ops_button_set_sensitive (gint but, + gboolean sensitive) { switch(but) { case NEW_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[0].widget,sensitive); + menus_set_sensitive (_("/New Path"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[0].widget,sensitive); break; case DUP_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[1].widget,sensitive); + menus_set_sensitive (_("/Duplicate Path"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[1].widget,sensitive); break; - case PATH_TO_SEL_BUTTON: - gtk_widget_set_sensitive(paths_ops[2].widget,sensitive); + case DEL_PATH_BUTTON: + menus_set_sensitive (_("/Delete Path"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[2].widget,sensitive); break; - case STROKE_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[3].widget,sensitive); + case PATH_TO_SEL_BUTTON: + menus_set_sensitive (_("/Path to Selection"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[3].widget,sensitive); break; - case DEL_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[4].widget,sensitive); + case STROKE_PATH_BUTTON: + menus_set_sensitive (_("/Stroke Path"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[4].widget,sensitive); break; case COPY_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[7].widget,sensitive); + menus_set_sensitive (_("/Copy Path"), sensitive); break; case PASTE_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[8].widget,sensitive); + menus_set_sensitive (_("/Paste Path"), sensitive); break; default: g_warning(_("paths_ops_button_set_sensitive:: invalid button specified")); @@ -289,10 +256,8 @@ GtkWidget * paths_dialog_create() paths_dialog->vbox = vbox = gtk_vbox_new (FALSE, 1); /* The point operations */ - button_box = ops_button_box_new (lc_shell, - tool_tips, - point_ops_buttons, - OPS_BUTTON_RADIO); + button_box = ops_button_box_new (lc_dialog->shell, tool_tips, + point_ops_buttons, OPS_BUTTON_RADIO); gtk_container_set_border_width(GTK_CONTAINER(button_box),7); @@ -345,19 +310,16 @@ GtkWidget * paths_dialog_create() gtk_widget_show (vbox); - /* The ops buttons */ - - button_box = ops_button_box_new (lc_shell, - tool_tips, - paths_ops_buttons, - OPS_BUTTON_NORMAL); - + /* The ops buttons */ + button_box = ops_button_box_new (lc_dialog->shell, tool_tips, + paths_ops_buttons, OPS_BUTTON_NORMAL); gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); gtk_widget_show (button_box); - /* Set up signals for map/unmap for the accelerators */ - paths_dialog->accel_group = gtk_accel_group_new (); + menus_get_paths_menu (&paths_dialog->ops_menu, + &paths_dialog->accel_group); + /* Set up signals for map/unmap for the accelerators */ gtk_signal_connect (GTK_OBJECT (vbox), "map", (GtkSignalFunc) paths_dialog_map_callback, NULL); @@ -365,7 +327,6 @@ GtkWidget * paths_dialog_create() (GtkSignalFunc) paths_dialog_unmap_callback, NULL); - paths_dialog->ops_menu = build_menu (paths_ops,paths_dialog->accel_group); paths_ops_button_set_sensitive(DUP_PATH_BUTTON,FALSE); paths_ops_button_set_sensitive(DEL_PATH_BUTTON,FALSE); paths_ops_button_set_sensitive(STROKE_PATH_BUTTON,FALSE); @@ -1312,7 +1273,7 @@ paths_dialog_new_path(PATHIMAGELISTP *plp,gpointer points,GimpImage *gimage,gint return(bzp); } -static void +void paths_dialog_new_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp = paths_dialog_new_path(&paths_dialog->current_path_list, @@ -1333,7 +1294,7 @@ paths_dialog_new_path_callback (GtkWidget * widget, gpointer udata) point_ops_button_set_sensitive(POINT_EDIT_BUTTON,TRUE); } -static void +void paths_dialog_delete_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1383,7 +1344,7 @@ paths_dialog_delete_path_callback (GtkWidget * widget, gpointer udata) } -static void +void paths_dialog_paste_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1442,7 +1403,7 @@ paths_dialog_paste_path_callback (GtkWidget * widget, gpointer udata) paths_dialog->current_path_list->last_selected_row = tmprow; } -static void +void paths_dialog_copy_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1472,7 +1433,7 @@ paths_dialog_copy_path_callback (GtkWidget * widget, gpointer udata) paths_ops_button_set_sensitive(PASTE_PATH_BUTTON,TRUE); } -static void +void paths_dialog_dup_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1505,7 +1466,7 @@ paths_dialog_dup_path_callback (GtkWidget * widget, gpointer udata) paths_dialog->current_path_list->last_selected_row = tmprow; } -static void +void paths_dialog_path_to_sel_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1555,7 +1516,7 @@ paths_dialog_path_to_sel_callback (GtkWidget * widget, gpointer udata) } } -static void +void paths_dialog_stroke_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1583,7 +1544,7 @@ paths_dialog_map_callback (GtkWidget *w, if (!paths_dialog) return; - gtk_window_add_accel_group (GTK_WINDOW (gtk_widget_get_toplevel(paths_dialog->paths_list)), + gtk_window_add_accel_group (GTK_WINDOW (lc_dialog->shell), paths_dialog->accel_group); paths_dialog_preview_extents (); @@ -1596,7 +1557,7 @@ paths_dialog_unmap_callback (GtkWidget *w, if (!paths_dialog) return; - gtk_window_remove_accel_group (GTK_WINDOW (gtk_widget_get_toplevel(paths_dialog->paths_list)), + gtk_window_remove_accel_group (GTK_WINDOW (lc_dialog->shell), paths_dialog->accel_group); } @@ -2250,7 +2211,7 @@ path_store_callback() gtk_widget_show (file_dlg); } -static void +void paths_dialog_import_path_callback (GtkWidget * widget, gpointer udata) { /* Read and add at current position */ @@ -2258,7 +2219,7 @@ paths_dialog_import_path_callback (GtkWidget * widget, gpointer udata) } -static void +void paths_dialog_export_path_callback (GtkWidget * widget, gpointer udata) { /* Export the path to a file */ diff --git a/app/gui/paths-dialog.h b/app/gui/paths-dialog.h index c93cd7ef53..9ae20d3d88 100644 --- a/app/gui/paths-dialog.h +++ b/app/gui/paths-dialog.h @@ -15,18 +15,17 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - #ifndef __PATHS_DIALOG_H__ #define __PATHS_DIALOG_H__ -GtkWidget * paths_dialog_create(void); -void paths_dialog_update (GimpImage*); -void paths_newpoint_current(BezierSelect *, GDisplay *); -void paths_first_button_press(BezierSelect *,GDisplay *); -void paths_new_bezier_select_tool(void); -PATHP paths_get_bzpaths(void); -void paths_set_bzpaths(GImage*,PATHP); -void paths_dialog_flush(void); +void paths_dialog_new_path_callback (GtkWidget *, gpointer); +void paths_dialog_delete_path_callback (GtkWidget *, gpointer); +void paths_dialog_dup_path_callback (GtkWidget *, gpointer); +void paths_dialog_copy_path_callback (GtkWidget *, gpointer); +void paths_dialog_paste_path_callback (GtkWidget *, gpointer); +void paths_dialog_stroke_path_callback (GtkWidget *, gpointer); +void paths_dialog_path_to_sel_callback (GtkWidget *, gpointer); +void paths_dialog_import_path_callback (GtkWidget *, gpointer); +void paths_dialog_export_path_callback (GtkWidget *, gpointer); #endif /* __PATHS_DIALOG_H__ */ diff --git a/app/gui/preferences-dialog.c b/app/gui/preferences-dialog.c index 36debe3416..c0b2313ac6 100644 --- a/app/gui/preferences-dialog.c +++ b/app/gui/preferences-dialog.c @@ -23,7 +23,7 @@ #include "gimprc.h" #include "image_render.h" #include "interface.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "layer_select.h" #include "paint_options.h" #include "session.h" diff --git a/app/layers_dialog.c b/app/layers_dialog.c index 2eb63e65dd..eb7a689718 100644 --- a/app/layers_dialog.c +++ b/app/layers_dialog.c @@ -18,9 +18,9 @@ #include #include #include "gdk/gdkkeysyms.h" +#include "actionarea.h" #include "appenv.h" #include "draw_core.h" -#include "actionarea.h" #include "buildmenu.h" #include "colormaps.h" #include "drawable.h" @@ -30,19 +30,17 @@ #include "gimage.h" #include "gimage_mask.h" #include "gimprc.h" -#include "gimpset.h" #include "general.h" #include "image_render.h" #include "interface.h" #include "layers_dialog.h" #include "layers_dialogP.h" +#include "lc_dialogP.h" +#include "menus.h" #include "ops_buttons.h" #include "paint_funcs.h" #include "palette.h" -#include "bezier_selectP.h" -#include "paths_dialog.h" #include "resize.h" -#include "session.h" #include "undo.h" #include "libgimp/gimplimits.h" @@ -63,27 +61,27 @@ #include "layer_pvt.h" -#include "dialog_handler.h" +#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_ENTER_NOTIFY_MASK +#define BUTTON_EVENT_MASK GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | \ + GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_BUTTON_RELEASE_MASK - -#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK -#define BUTTON_EVENT_MASK GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | \ - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - -#define LAYER_LIST_WIDTH 200 +#define LAYER_LIST_WIDTH 200 #define LAYER_LIST_HEIGHT 150 #define LAYER_PREVIEW 0 #define MASK_PREVIEW 1 -#define FS_PREVIEW 2 +#define FS_PREVIEW 2 -#define NORMAL 0 -#define SELECTED 1 +#define NORMAL 0 +#define SELECTED 1 #define INSENSITIVE 2 typedef struct _LayersDialog LayersDialog; -struct _LayersDialog { +struct _LayersDialog +{ GtkWidget *vbox; GtkWidget *mode_option_menu; GtkWidget *layer_list; @@ -101,17 +99,17 @@ struct _LayersDialog { int gimage_width, gimage_height; /* state information */ - GimpImage* gimage; - Layer * active_layer; - Channel * active_channel; - gboolean auto_follow_active; - Layer * floating_sel; - GSList * layer_widgets; + GimpImage *gimage; + Layer *active_layer; + Channel *active_channel; + Layer *floating_sel; + GSList *layer_widgets; }; typedef struct _LayerWidget LayerWidget; -struct _LayerWidget { +struct _LayerWidget +{ GtkWidget *eye_widget; GtkWidget *linked_widget; GtkWidget *clip_widget; @@ -136,176 +134,126 @@ struct _LayerWidget { }; /* layers dialog widget routines */ -static void layers_dialog_preview_extents (void); +static void layers_dialog_preview_extents (void); static void layers_dialog_set_menu_sensitivity (void); -static void layers_dialog_set_active_layer (Layer *); -static void layers_dialog_unset_layer (Layer *); -static void layers_dialog_position_layer (Layer *, int); -static void layers_dialog_add_layer (Layer *); -static void layers_dialog_remove_layer (Layer *); -static void layers_dialog_add_layer_mask (Layer *); -static void layers_dialog_remove_layer_mask (Layer *); -static void paint_mode_menu_callback (GtkWidget *, gpointer); -static gint paint_mode_menu_get_position (gint); -static void image_menu_callback (GtkWidget *, gpointer); -static void opacity_scale_update (GtkAdjustment *, gpointer); -static void preserve_trans_update (GtkWidget *, gpointer); -static gint layer_list_events (GtkWidget *, GdkEvent *); +static void layers_dialog_set_active_layer (Layer *); +static void layers_dialog_unset_layer (Layer *); +static void layers_dialog_position_layer (Layer *, int); +static void layers_dialog_add_layer (Layer *); +static void layers_dialog_remove_layer (Layer *); +static void layers_dialog_add_layer_mask (Layer *); +static void layers_dialog_remove_layer_mask (Layer *); +static void paint_mode_menu_callback (GtkWidget *, gpointer); +static gint paint_mode_menu_get_position (gint); +static void opacity_scale_update (GtkAdjustment *, gpointer); +static void preserve_trans_update (GtkWidget *, gpointer); +static gint layer_list_events (GtkWidget *, GdkEvent *); -/* layers dialog menu callbacks */ -static void layers_dialog_map_callback (GtkWidget *, gpointer); +/* for (un)installing the menu accelarators */ +static void layers_dialog_map_callback (GtkWidget *, gpointer); static void layers_dialog_unmap_callback (GtkWidget *, gpointer); -static void layers_dialog_new_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_raise_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_lower_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_raise_layer_to_top_callback (GtkWidget *, gpointer); -static void layers_dialog_lower_layer_to_bottom_callback (GtkWidget *, gpointer); -static void layers_dialog_duplicate_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_delete_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_scale_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_resize_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_add_layer_mask_callback (GtkWidget *, gpointer); -static void layers_dialog_apply_layer_mask_callback (GtkWidget *, gpointer); -static void layers_dialog_anchor_layer_callback (GtkWidget *, gpointer); -static void layers_dialog_merge_layers_callback (GtkWidget *, gpointer); -static void layers_dialog_merge_down_callback (GtkWidget *, gpointer); -static void layers_dialog_flatten_image_callback (GtkWidget *, gpointer); -static void layers_dialog_alpha_select_callback (GtkWidget *, gpointer); -static void layers_dialog_mask_select_callback (GtkWidget *, gpointer); -static void layers_dialog_add_alpha_channel_callback (GtkWidget *, gpointer); - -/* the dialog's toplevel callbacks */ -static void lc_dialog_auto_callback (GtkWidget *, gpointer); -static gint lc_dialog_close_callback (GtkWidget *, gpointer); -static void lc_dialog_update_cb (GimpSet *, GimpImage *, gpointer); -static void lc_dialog_change_image (GimpSet *, GimpImage *, gpointer); /* layer widget function prototypes */ static LayerWidget *layer_widget_get_ID (Layer *); -static LayerWidget *create_layer_widget (GImage *, Layer *); -static void layer_widget_delete (LayerWidget *); -static void layer_widget_select_update (GtkWidget *, gpointer); -static gint layer_widget_button_events (GtkWidget *, GdkEvent *); -static gint layer_widget_preview_events (GtkWidget *, GdkEvent *); -static void layer_widget_boundary_redraw (LayerWidget *, int); -static void layer_widget_preview_redraw (LayerWidget *, int); +static LayerWidget *layer_widget_create (GImage *, Layer *); + +static void layer_widget_delete (LayerWidget *); +static void layer_widget_select_update (GtkWidget *, gpointer); +static gint layer_widget_button_events (GtkWidget *, GdkEvent *); +static gint layer_widget_preview_events (GtkWidget *, GdkEvent *); +static void layer_widget_boundary_redraw (LayerWidget *, int); +static void layer_widget_preview_redraw (LayerWidget *, int); static void layer_widget_no_preview_redraw (LayerWidget *, int); -static void layer_widget_eye_redraw (LayerWidget *); -static void layer_widget_linked_redraw (LayerWidget *); -static void layer_widget_clip_redraw (LayerWidget *); +static void layer_widget_eye_redraw (LayerWidget *); +static void layer_widget_linked_redraw (LayerWidget *); +static void layer_widget_clip_redraw (LayerWidget *); static void layer_widget_exclusive_visible (LayerWidget *); -static void layer_widget_layer_flush (GtkWidget *, gpointer); +static void layer_widget_layer_flush (GtkWidget *, gpointer); /* assorted query dialogs */ -static void layers_dialog_new_layer_query (GimpImage*); -static void layers_dialog_edit_layer_query (LayerWidget *); -static void layers_dialog_add_mask_query (Layer *); -static void layers_dialog_apply_mask_query (Layer *); -static void layers_dialog_scale_layer_query (GImage *, Layer *); +static void layers_dialog_new_layer_query (GimpImage*); +static void layers_dialog_edit_layer_query (LayerWidget *); +static void layers_dialog_add_mask_query (Layer *); +static void layers_dialog_apply_mask_query (Layer *); +static void layers_dialog_scale_layer_query (GImage *, Layer *); static void layers_dialog_resize_layer_query (GImage *, Layer *); -void layers_dialog_layer_merge_query (GImage *, int); - - -/* - * Shared data - */ - -GtkWidget *lc_shell = NULL; -GtkWidget *lc_subshell = NULL; +void layers_dialog_layer_merge_query (GImage *, int); /* * Local data */ static LayersDialog *layersD = NULL; -static GtkWidget *image_menu; -static GtkWidget *image_option_menu; -static GdkPixmap *eye_pixmap[3] = {NULL, NULL, NULL}; -static GdkPixmap *linked_pixmap[3] = {NULL, NULL, NULL}; -static GdkPixmap *layer_pixmap[3] = {NULL, NULL, NULL}; -static GdkPixmap *mask_pixmap[3] = {NULL, NULL, NULL}; +static GdkPixmap *eye_pixmap[] = { NULL, NULL, NULL }; +static GdkPixmap *linked_pixmap[] = { NULL, NULL, NULL }; +static GdkPixmap *layer_pixmap[] = { NULL, NULL, NULL }; +static GdkPixmap *mask_pixmap[] = { NULL, NULL, NULL }; static int suspend_gimage_notify = 0; -static MenuItem layers_ops[] = -{ - { N_("New Layer"), 'N', GDK_CONTROL_MASK, - layers_dialog_new_layer_callback, NULL, NULL, NULL }, - { N_("Raise Layer"), 'F', GDK_CONTROL_MASK, - layers_dialog_raise_layer_callback, NULL, NULL, NULL }, - { N_("Lower Layer"), 'B', GDK_CONTROL_MASK, - layers_dialog_lower_layer_callback, NULL, NULL, NULL }, - { N_("Duplicate Layer"), 'C', GDK_CONTROL_MASK, - layers_dialog_duplicate_layer_callback, NULL, NULL, NULL }, - { N_("Delete Layer"), 'X', GDK_CONTROL_MASK, - layers_dialog_delete_layer_callback, NULL, NULL, NULL }, - { N_("Scale Layer"), 'S', GDK_CONTROL_MASK, - layers_dialog_scale_layer_callback, NULL, NULL, NULL }, - { N_("Resize Layer"), 'R', GDK_CONTROL_MASK, - layers_dialog_resize_layer_callback, NULL, NULL, NULL }, - { N_("Add Layer Mask"), 0, 0, - layers_dialog_add_layer_mask_callback, NULL, NULL, NULL }, - { N_("Apply Layer Mask"), 0, 0, - layers_dialog_apply_layer_mask_callback, NULL, NULL, NULL }, - { N_("Anchor Layer"), 'H', GDK_CONTROL_MASK, - layers_dialog_anchor_layer_callback, NULL, NULL, NULL }, - { N_("Merge Visible Layers"), 'M', GDK_CONTROL_MASK, - layers_dialog_merge_layers_callback, NULL, NULL, NULL }, - { N_("Merge Down"), 'M', GDK_CONTROL_MASK, - layers_dialog_merge_down_callback, NULL, NULL, NULL }, - { N_("Flatten Image"), 0, 0, - layers_dialog_flatten_image_callback, NULL, NULL, NULL }, - { N_("Alpha To Selection"), 0, 0, - layers_dialog_alpha_select_callback, NULL, NULL, NULL }, - { N_("Mask To Selection"), 0, 0, - layers_dialog_mask_select_callback, NULL, NULL, NULL }, - { N_("Add Alpha Channel"), 0, 0, - layers_dialog_add_alpha_channel_callback, NULL, NULL, NULL }, - { N_("Layer to Top"), 'T', GDK_CONTROL_MASK, - layers_dialog_raise_layer_to_top_callback, NULL, NULL, NULL }, - { N_("Layer to Bottom"), 'U', GDK_CONTROL_MASK, - layers_dialog_lower_layer_to_bottom_callback, NULL, NULL, NULL }, - { NULL, 0, 0, NULL, NULL, NULL, NULL }, -}; - /* the option menu items -- the paint modes */ static MenuItem option_items[] = { - { N_("Normal"), 0, 0, paint_mode_menu_callback, (gpointer) NORMAL_MODE, NULL, NULL }, - { N_("Dissolve"), 0, 0, paint_mode_menu_callback, (gpointer) DISSOLVE_MODE, NULL, NULL }, - { N_("Multiply (Burn)"), 0, 0, paint_mode_menu_callback, (gpointer) MULTIPLY_MODE, NULL, NULL }, - { N_("Divide (Dodge)"), 0, 0, paint_mode_menu_callback, (gpointer) DIVIDE_MODE, NULL, NULL }, - { N_("Screen"), 0, 0, paint_mode_menu_callback, (gpointer) SCREEN_MODE, NULL, NULL }, - { N_("Overlay"), 0, 0, paint_mode_menu_callback, (gpointer) OVERLAY_MODE, NULL, NULL }, - { N_("Difference"), 0, 0, paint_mode_menu_callback, (gpointer) DIFFERENCE_MODE, NULL, NULL }, - { N_("Addition"), 0, 0, paint_mode_menu_callback, (gpointer) ADDITION_MODE, NULL, NULL }, - { N_("Subtract"), 0, 0, paint_mode_menu_callback, (gpointer) SUBTRACT_MODE, NULL, NULL }, - { N_("Darken Only"), 0, 0, paint_mode_menu_callback, (gpointer) DARKEN_ONLY_MODE, NULL, NULL }, - { N_("Lighten Only"), 0, 0, paint_mode_menu_callback, (gpointer) LIGHTEN_ONLY_MODE, NULL, NULL }, - { N_("Hue"), 0, 0, paint_mode_menu_callback, (gpointer) HUE_MODE, NULL, NULL }, - { N_("Saturation"), 0, 0, paint_mode_menu_callback, (gpointer) SATURATION_MODE, NULL, NULL }, - { N_("Color"), 0, 0, paint_mode_menu_callback, (gpointer) COLOR_MODE, NULL, NULL }, - { N_("Value"), 0, 0, paint_mode_menu_callback, (gpointer) VALUE_MODE, NULL, NULL }, + { N_("Normal"), 0, 0, + paint_mode_menu_callback, (gpointer) NORMAL_MODE, NULL, NULL }, + { N_("Dissolve"), 0, 0, + paint_mode_menu_callback, (gpointer) DISSOLVE_MODE, NULL, NULL }, + { N_("Multiply (Burn)"), 0, 0, + paint_mode_menu_callback, (gpointer) MULTIPLY_MODE, NULL, NULL }, + { N_("Divide (Dodge)"), 0, 0, + paint_mode_menu_callback, (gpointer) DIVIDE_MODE, NULL, NULL }, + { N_("Screen"), 0, 0, + paint_mode_menu_callback, (gpointer) SCREEN_MODE, NULL, NULL }, + { N_("Overlay"), 0, 0, + paint_mode_menu_callback, (gpointer) OVERLAY_MODE, NULL, NULL }, + { N_("Difference"), 0, 0, + paint_mode_menu_callback, (gpointer) DIFFERENCE_MODE, NULL, NULL }, + { N_("Addition"), 0, 0, + paint_mode_menu_callback, (gpointer) ADDITION_MODE, NULL, NULL }, + { N_("Subtract"), 0, 0, + paint_mode_menu_callback, (gpointer) SUBTRACT_MODE, NULL, NULL }, + { N_("Darken Only"), 0, 0, + paint_mode_menu_callback, (gpointer) DARKEN_ONLY_MODE, NULL, NULL }, + { N_("Lighten Only"), 0, 0, + paint_mode_menu_callback, (gpointer) LIGHTEN_ONLY_MODE, NULL, NULL }, + { N_("Hue"), 0, 0, + paint_mode_menu_callback, (gpointer) HUE_MODE, NULL, NULL }, + { N_("Saturation"), 0, 0, + paint_mode_menu_callback, (gpointer) SATURATION_MODE, NULL, NULL }, + { N_("Color"), 0, 0, + paint_mode_menu_callback, (gpointer) COLOR_MODE, NULL, NULL }, + { N_("Value"), 0, 0, + paint_mode_menu_callback, (gpointer) VALUE_MODE, NULL, NULL }, { NULL, 0, 0, NULL, NULL, NULL, NULL } }; - -/* the ops buttons */ - +/* the ops buttons */ static OpsButtonCallback raise_layers_ext_callbacks[] = -{ layers_dialog_raise_layer_to_top_callback, NULL, NULL, NULL }; +{ + layers_dialog_raise_layer_to_top_callback, NULL, NULL, NULL +}; static OpsButtonCallback lower_layers_ext_callbacks[] = -{ layers_dialog_lower_layer_to_bottom_callback, NULL, NULL, NULL }; +{ + layers_dialog_lower_layer_to_bottom_callback, NULL, NULL, NULL +}; static OpsButton layers_ops_buttons[] = { - { new_xpm, layers_dialog_new_layer_callback, NULL, N_("New Layer"), NULL, 0 }, - { raise_xpm, layers_dialog_raise_layer_callback, raise_layers_ext_callbacks, N_("Raise Layer \n To Top"), NULL, 0 }, - { lower_xpm, layers_dialog_lower_layer_callback, lower_layers_ext_callbacks, N_("Lower Layer \n To Bottom"), NULL, 0 }, - { duplicate_xpm, layers_dialog_duplicate_layer_callback, NULL, N_("Duplicate Layer"), NULL, 0 }, - { delete_xpm, layers_dialog_delete_layer_callback, NULL, N_("Delete Layer"), NULL, 0 }, - { anchor_xpm, layers_dialog_anchor_layer_callback, NULL, N_("Anchor Layer"), NULL, 0 }, + { new_xpm, layers_dialog_new_layer_callback, NULL, + N_("New Layer"), NULL, 0 }, + { raise_xpm, layers_dialog_raise_layer_callback, raise_layers_ext_callbacks, + N_("Raise Layer \n" + " To Top"), NULL, 0 }, + { lower_xpm, layers_dialog_lower_layer_callback, lower_layers_ext_callbacks, + N_("Lower Layer \n" + " To Bottom"), NULL, 0 }, + { duplicate_xpm, layers_dialog_duplicate_layer_callback, NULL, + N_("Duplicate Layer"), NULL, 0 }, + { delete_xpm, layers_dialog_delete_layer_callback, NULL, + N_("Delete Layer"), NULL, 0 }, + { anchor_xpm, layers_dialog_anchor_layer_callback, NULL, + N_("Anchor Layer"), NULL, 0 }, { NULL, NULL, NULL, NULL, NULL, 0 } }; @@ -314,236 +262,227 @@ static OpsButton layers_ops_buttons[] = /* Public layers dialog functions */ /************************************/ -void -lc_dialog_create (GimpImage* gimage) +GtkWidget * +layers_dialog_create () { + GtkWidget *vbox; GtkWidget *util_box; - GtkWidget *auto_button; - GtkWidget *button; + GtkWidget *button_box; GtkWidget *label; - GtkWidget *notebook; - GtkWidget *separator; - int default_index; - - if (lc_shell == NULL) + GtkWidget *menu; + GtkWidget *slider; + GtkWidget *listbox; + + if (! layersD) { - lc_shell = gtk_dialog_new (); + layersD = g_malloc (sizeof (LayersDialog)); + layersD->layer_preview = NULL; + layersD->gimage = NULL; + layersD->active_layer = NULL; + layersD->active_channel = NULL; + layersD->floating_sel = NULL; + layersD->layer_widgets = NULL; + layersD->green_gc = NULL; + layersD->red_gc = NULL; - /* register this one only */ - dialog_register(lc_shell); + if (preview_size) + { + layersD->layer_preview = gtk_preview_new (GTK_PREVIEW_COLOR); + gtk_preview_size (GTK_PREVIEW (layersD->layer_preview), + preview_size, preview_size); + } - gtk_window_set_title (GTK_WINDOW (lc_shell), _("Layers & Channels")); - gtk_window_set_wmclass (GTK_WINDOW (lc_shell), "layers_and_channels", "Gimp"); - session_set_window_geometry (lc_shell, &lc_dialog_session_info, TRUE); - gtk_container_set_border_width - (GTK_CONTAINER (GTK_DIALOG (lc_shell)->vbox), 2); + /* The main vbox */ + layersD->vbox = vbox = gtk_vbox_new (FALSE, 1); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); - gtk_signal_connect (GTK_OBJECT (lc_shell), - "delete_event", - GTK_SIGNAL_FUNC (lc_dialog_close_callback), - NULL); - gtk_signal_connect (GTK_OBJECT (lc_shell), - "destroy", - GTK_SIGNAL_FUNC (gtk_widget_destroyed), - &lc_shell); - gtk_quit_add_destroy (1, GTK_OBJECT (lc_shell)); + /* The layers commands pulldown menu */ + menus_get_layers_menu (&layersD->ops_menu, &layersD->accel_group); - lc_subshell = gtk_vbox_new(FALSE, 2); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(lc_shell)->vbox), lc_subshell, TRUE, TRUE, 2); + /* The Mode option menu, and the preserve transparency */ + layersD->mode_box = util_box = gtk_hbox_new (FALSE, 1); + gtk_box_pack_start (GTK_BOX (vbox), util_box, FALSE, FALSE, 0); - /* The hbox to hold the image option menu box */ - util_box = gtk_hbox_new (FALSE, 1); - gtk_box_pack_start (GTK_BOX(lc_subshell), util_box, FALSE, FALSE, 0); - - /* The GIMP image option menu */ - label = gtk_label_new (_("Image:")); + label = gtk_label_new (_("Mode:")); gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); - image_option_menu = gtk_option_menu_new (); - image_menu = create_image_menu (&gimage, &default_index, image_menu_callback); - gtk_box_pack_start (GTK_BOX (util_box), image_option_menu, TRUE, TRUE, 2); - gtk_widget_show (image_option_menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (image_option_menu), image_menu); - if (default_index != -1) - gtk_option_menu_set_history (GTK_OPTION_MENU (image_option_menu), default_index); + menu = build_menu (option_items, NULL); + layersD->mode_option_menu = gtk_option_menu_new (); + gtk_box_pack_start (GTK_BOX (util_box), layersD->mode_option_menu, + FALSE, FALSE, 2); + + gtk_widget_show (label); + gtk_widget_show (layersD->mode_option_menu); + gtk_option_menu_set_menu (GTK_OPTION_MENU (layersD->mode_option_menu), + menu); + + layersD->preserve_trans = + gtk_check_button_new_with_label (_("Keep Trans.")); + gtk_box_pack_start (GTK_BOX (util_box), layersD->preserve_trans, + FALSE, FALSE, 2); + gtk_signal_connect (GTK_OBJECT (layersD->preserve_trans), "toggled", + (GtkSignalFunc) preserve_trans_update, + layersD); + gtk_widget_show (layersD->preserve_trans); + gtk_widget_show (util_box); + + /* Opacity scale */ + layersD->opacity_box = util_box = gtk_hbox_new (FALSE, 1); + gtk_box_pack_start (GTK_BOX (vbox), util_box, FALSE, FALSE, 0); + + label = gtk_label_new (_("Opacity:")); + gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); gtk_widget_show (label); - /* The Auto-button */ - - auto_button = gtk_toggle_button_new_with_label (_("Auto")); - gtk_box_pack_start (GTK_BOX (util_box), auto_button, FALSE, FALSE, 2); - gtk_signal_connect_object (GTK_OBJECT (auto_button), "clicked", - (GtkSignalFunc) lc_dialog_auto_callback, - GTK_OBJECT(auto_button)); - gtk_widget_show (auto_button); - /* State will be set, when LayersD exists (see below) */ + layersD->opacity_data = + GTK_ADJUSTMENT (gtk_adjustment_new (100.0, 0.0, 100.0, 1.0, 1.0, 0.0)); + slider = gtk_hscale_new (layersD->opacity_data); + gtk_range_set_update_policy (GTK_RANGE (slider), + GTK_UPDATE_CONTINUOUS); + gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_RIGHT); + gtk_box_pack_start (GTK_BOX (util_box), slider, TRUE, TRUE, 0); + gtk_signal_connect (GTK_OBJECT (layersD->opacity_data), "value_changed", + (GtkSignalFunc) opacity_scale_update, + layersD); + gtk_widget_show (slider); gtk_widget_show (util_box); - separator = gtk_hseparator_new (); - gtk_box_pack_start (GTK_BOX(lc_subshell), separator, FALSE, TRUE, 2); - gtk_widget_show (separator); + /* The layers listbox */ + listbox = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_usize (listbox, LAYER_LIST_WIDTH, LAYER_LIST_HEIGHT); + gtk_box_pack_start (GTK_BOX (vbox), listbox, TRUE, TRUE, 2); - /* The notebook widget */ - notebook = gtk_notebook_new (); - gtk_box_pack_start (GTK_BOX(lc_subshell), notebook, TRUE, TRUE, 0); - - label = gtk_label_new (_("Layers")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - layers_dialog_create (), - label); - gtk_widget_show (label); - - /* Now layersD exists, we can set the Auto-togglebutton */ - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (auto_button), - layersD->auto_follow_active); - - label = gtk_label_new (_("Channels")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - channels_dialog_create (), - label); - gtk_widget_show (label); - - label = gtk_label_new (_("Paths")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - paths_dialog_create (), - label); - gtk_widget_show (label); - - gtk_widget_show (notebook); - - gtk_container_set_border_width - (GTK_CONTAINER (GTK_DIALOG(lc_shell)->action_area), 1); - - /* The close button */ - button = gtk_button_new_with_label (_("Close")); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG(lc_shell)->action_area), button, - TRUE, TRUE, 0); - gtk_signal_connect_object (GTK_OBJECT (button), "clicked", - (GtkSignalFunc) lc_dialog_close_callback, - GTK_OBJECT (lc_shell)); - gtk_widget_show (button); - - gtk_widget_show (GTK_DIALOG(lc_shell)->action_area); - - /* Make sure the channels page is realized */ - gtk_notebook_set_page (GTK_NOTEBOOK (notebook), 1); - gtk_notebook_set_page (GTK_NOTEBOOK (notebook), 0); - - if (gimage == NULL) - { - gtk_widget_set_sensitive (lc_subshell, FALSE); - /* This is a little bit ugly, since we should also set - the channels_ops_buttons insensitive, but they are - never shown if the dialog is created on startup with - no image present. */ - ops_button_box_set_insensitive (layers_ops_buttons); - } - gtk_signal_connect (GTK_OBJECT (image_context), "add", - GTK_SIGNAL_FUNC (lc_dialog_update_cb), NULL); - gtk_signal_connect (GTK_OBJECT (image_context), "remove", - GTK_SIGNAL_FUNC(lc_dialog_update_cb), NULL); - gtk_signal_connect (GTK_OBJECT (image_context), "active_changed", - GTK_SIGNAL_FUNC(lc_dialog_change_image), NULL); + layersD->layer_list = gtk_list_new (); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (listbox), + layersD->layer_list); + gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), + GTK_SELECTION_BROWSE); + gtk_signal_connect (GTK_OBJECT (layersD->layer_list), "event", + (GtkSignalFunc) layer_list_events, + layersD); + gtk_container_set_focus_vadjustment (GTK_CONTAINER (layersD->layer_list), + gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (listbox))); + GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (listbox)->vscrollbar, + GTK_CAN_FOCUS); - layers_dialog_update (gimage); - channels_dialog_update (gimage); - paths_dialog_update (gimage); + gtk_widget_show (layersD->layer_list); + gtk_widget_show (listbox); - gtk_widget_show (lc_subshell); - gtk_widget_show (lc_shell); + /* The ops buttons */ + button_box = ops_button_box_new (lc_dialog->shell, tool_tips, + layers_ops_buttons, OPS_BUTTON_NORMAL); + gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); + gtk_widget_show (button_box); - gdisplays_flush (); + /* Set up signals for map/unmap for the accelerators */ + gtk_signal_connect (GTK_OBJECT (layersD->vbox), "map", + (GtkSignalFunc) layers_dialog_map_callback, + NULL); + gtk_signal_connect (GTK_OBJECT (layersD->vbox), "unmap", + (GtkSignalFunc) layers_dialog_unmap_callback, + NULL); + + gtk_widget_show (vbox); } - else - { - if (!GTK_WIDGET_VISIBLE (lc_shell)) - gtk_widget_show (lc_shell); - else - gdk_window_raise (lc_shell->window); - layers_dialog_update (gimage); - channels_dialog_update (gimage); - paths_dialog_update (gimage); - lc_dialog_update_image_list (); - gdisplays_flush (); - } + return layersD->vbox; } void -lc_dialog_update_image_list () +layers_dialog_free () { - int default_index; - GimpImage* default_gimage; + GSList *list; + LayerWidget *lw; - if (lc_shell == NULL) + if (layersD == NULL) return; - default_gimage = layersD->gimage; - layersD->gimage = NULL; /* ??? */ - image_menu = create_image_menu (&default_gimage, &default_index, image_menu_callback); - gtk_option_menu_set_menu (GTK_OPTION_MENU (image_option_menu), image_menu); + /* Free all elements in the layers listbox */ + gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); - if (default_index != -1) + list = layersD->layer_widgets; + while (list) { - if (! GTK_WIDGET_IS_SENSITIVE (lc_subshell) ) - gtk_widget_set_sensitive (lc_subshell, TRUE); - gtk_option_menu_set_history (GTK_OPTION_MENU (image_option_menu), default_index); - - if (default_gimage != layersD->gimage) - { - layers_dialog_update (default_gimage); - channels_dialog_update (default_gimage); - paths_dialog_update (default_gimage); - gdisplays_flush (); - } + lw = (LayerWidget *) list->data; + list = g_slist_next (list); + layer_widget_delete (lw); } - else - { - if (GTK_WIDGET_IS_SENSITIVE (lc_subshell)) - gtk_widget_set_sensitive (lc_subshell, FALSE); + layersD->layer_widgets = NULL; + layersD->active_layer = NULL; + layersD->active_channel = NULL; + layersD->floating_sel = NULL; - layers_dialog_clear (); - channels_dialog_clear (); - } + if (layersD->layer_preview) + gtk_object_sink (GTK_OBJECT (layersD->layer_preview)); + if (layersD->green_gc) + gdk_gc_destroy (layersD->green_gc); + if (layersD->red_gc) + gdk_gc_destroy (layersD->red_gc); + + g_free (layersD); + layersD = NULL; } - void -lc_dialog_free () +layers_dialog_update (GimpImage* gimage) { - if (lc_shell == NULL) + Layer *layer; + LayerWidget *lw; + GSList *list; + GList *item_list; + + if (! layersD) + return; + if (layersD->gimage == gimage) return; - session_get_window_info (lc_shell, &lc_dialog_session_info); + layersD->gimage = gimage; - layers_dialog_free (); - channels_dialog_free (); + suspend_gimage_notify++; - gtk_widget_destroy (lc_shell); -} + /* Free all elements in the layers listbox */ + gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); -void -lc_dialog_rebuild (int new_preview_size) -{ - GimpImage* gimage; - int flag; - - gimage = NULL; - - flag = 0; - if (lc_shell) + list = layersD->layer_widgets; + while (list) { - flag = 1; - gimage = layersD->gimage; - lc_dialog_free (); + lw = (LayerWidget *) list->data; + list = g_slist_next (list); + layer_widget_delete (lw); } - preview_size = new_preview_size; - render_setup (transparency_type, transparency_size); - if (flag) - lc_dialog_create (gimage); -} + if (layersD->layer_widgets) + g_warning ("layersD->layer_widgets not empty!"); + layersD->layer_widgets = NULL; + + /* Find the preview extents */ + layers_dialog_preview_extents (); + + layersD->active_layer = NULL; + layersD->active_channel = NULL; + layersD->floating_sel = NULL; + + list = gimage->layers; + item_list = NULL; + + while (list) + { + /* create a layer list item */ + layer = (Layer *) list->data; + lw = layer_widget_create (gimage, layer); + layersD->layer_widgets = g_slist_append (layersD->layer_widgets, lw); + item_list = g_list_append (item_list, lw->list_item); + + list = g_slist_next (list); + } + + /* get the index of the active layer */ + if (item_list) + gtk_list_insert_items (GTK_LIST (layersD->layer_list), item_list, 0); + + suspend_gimage_notify--; +} void layers_dialog_flush () @@ -555,9 +494,8 @@ layers_dialog_flush () int gimage_pos; int pos; - if (!layersD) + if (! layersD) return; - if (! (gimage = layersD->gimage)) return; @@ -601,7 +539,7 @@ layers_dialog_flush () lw = (LayerWidget *) list->data; list = g_slist_next (list); if (lw->visited == FALSE) - layers_dialog_remove_layer ((lw->layer)); + layers_dialog_remove_layer (lw->layer); } /* Switch positions of items if necessary */ @@ -613,7 +551,7 @@ layers_dialog_flush () list = g_slist_next (list); if ((gimage_pos = gimage_get_layer_index (gimage, lw->layer)) != pos) - layers_dialog_position_layer ((lw->layer), gimage_pos); + layers_dialog_position_layer (lw->layer, gimage_pos); pos++; } @@ -629,9 +567,11 @@ layers_dialog_flush () /* If there is an active channel, this list is single select */ if (layersD->active_channel != NULL) - gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), GTK_SELECTION_SINGLE); + gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), + GTK_SELECTION_SINGLE); else - gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), GTK_SELECTION_BROWSE); + gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), + GTK_SELECTION_BROWSE); } /* set the menus if floating sel status has changed */ @@ -644,321 +584,21 @@ layers_dialog_flush () layer_widget_layer_flush, NULL); } - -void -layers_dialog_free () -{ - GSList *list; - LayerWidget *lw; - - if (layersD == NULL) - return; - - /* Free all elements in the layers listbox */ - gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); - - list = layersD->layer_widgets; - while (list) - { - lw = (LayerWidget *) list->data; - list = g_slist_next(list); - layer_widget_delete (lw); - } - layersD->layer_widgets = NULL; - layersD->active_layer = NULL; - layersD->active_channel = NULL; - layersD->floating_sel = NULL; - - if (layersD->layer_preview) - gtk_object_sink (GTK_OBJECT (layersD->layer_preview)); - if (layersD->green_gc) - gdk_gc_destroy (layersD->green_gc); - if (layersD->red_gc) - gdk_gc_destroy (layersD->red_gc); - - if (layersD->ops_menu) - gtk_object_sink (GTK_OBJECT (layersD->ops_menu)); - - g_free (layersD); - layersD = NULL; -} - - -/*************************************/ -/* layers dialog widget routines */ -/*************************************/ - -GtkWidget * -layers_dialog_create () -{ - GtkWidget *vbox; - GtkWidget *util_box; - GtkWidget *button_box; - GtkWidget *label; - GtkWidget *menu; - GtkWidget *slider; - GtkWidget *listbox; - - - if (!layersD) - { - layersD = g_malloc (sizeof (LayersDialog)); - layersD->layer_preview = NULL; - layersD->gimage = NULL; - layersD->active_layer = NULL; - layersD->active_channel = NULL; - layersD->floating_sel = NULL; - layersD->layer_widgets = NULL; - layersD->accel_group = gtk_accel_group_new (); - layersD->green_gc = NULL; - layersD->red_gc = NULL; - - if (preview_size) - { - layersD->layer_preview = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_size (GTK_PREVIEW (layersD->layer_preview), preview_size, preview_size); - } - - /* The main vbox */ - layersD->vbox = vbox = gtk_vbox_new (FALSE, 1); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); - - /* The layers commands pulldown menu */ - layersD->ops_menu = build_menu (layers_ops, layersD->accel_group); - - /* The Mode option menu, and the preserve transparency */ - layersD->mode_box = util_box = gtk_hbox_new (FALSE, 1); - gtk_box_pack_start (GTK_BOX (vbox), util_box, FALSE, FALSE, 0); - - label = gtk_label_new (_("Mode:")); - gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); - - menu = build_menu (option_items, NULL); - layersD->mode_option_menu = gtk_option_menu_new (); - gtk_box_pack_start (GTK_BOX (util_box), layersD->mode_option_menu, FALSE, FALSE, 2); - - gtk_widget_show (label); - gtk_widget_show (layersD->mode_option_menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (layersD->mode_option_menu), menu); - - layersD->preserve_trans = gtk_check_button_new_with_label (_("Keep Trans.")); - gtk_box_pack_start (GTK_BOX (util_box), layersD->preserve_trans, FALSE, FALSE, 2); - gtk_signal_connect (GTK_OBJECT (layersD->preserve_trans), "toggled", - (GtkSignalFunc) preserve_trans_update, - layersD); - gtk_widget_show (layersD->preserve_trans); - gtk_widget_show (util_box); - - - /* Opacity scale */ - layersD->opacity_box = util_box = gtk_hbox_new (FALSE, 1); - gtk_box_pack_start (GTK_BOX (vbox), util_box, FALSE, FALSE, 0); - label = gtk_label_new (_("Opacity:")); - gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); - layersD->opacity_data = GTK_ADJUSTMENT (gtk_adjustment_new (100.0, 0.0, 100.0, 1.0, 1.0, 0.0)); - slider = gtk_hscale_new (layersD->opacity_data); - gtk_range_set_update_policy (GTK_RANGE (slider), - GTK_UPDATE_CONTINUOUS); - gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_RIGHT); - gtk_box_pack_start (GTK_BOX (util_box), slider, TRUE, TRUE, 0); - gtk_signal_connect (GTK_OBJECT (layersD->opacity_data), "value_changed", - (GtkSignalFunc) opacity_scale_update, - layersD); - - gtk_widget_show (label); - gtk_widget_show (slider); - gtk_widget_show (util_box); - - - /* The layers listbox */ - listbox = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_set_usize (listbox, LAYER_LIST_WIDTH, LAYER_LIST_HEIGHT); - gtk_box_pack_start (GTK_BOX (vbox), listbox, TRUE, TRUE, 2); - - layersD->layer_list = gtk_list_new (); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (listbox), - layersD->layer_list); - gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), GTK_SELECTION_BROWSE); - gtk_signal_connect (GTK_OBJECT (layersD->layer_list), "event", - (GtkSignalFunc) layer_list_events, - layersD); - gtk_container_set_focus_vadjustment (GTK_CONTAINER (layersD->layer_list), - gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (listbox))); - GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (listbox)->vscrollbar, GTK_CAN_FOCUS); - - gtk_widget_show (layersD->layer_list); - gtk_widget_show (listbox); - - /* The ops buttons */ - - button_box = ops_button_box_new (lc_shell, tool_tips, layers_ops_buttons,OPS_BUTTON_NORMAL); - - gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); - gtk_widget_show (button_box); - - /* Set up signals for map/unmap for the accelerators */ - gtk_signal_connect (GTK_OBJECT (layersD->vbox), "map", - (GtkSignalFunc) layers_dialog_map_callback, - NULL); - gtk_signal_connect (GTK_OBJECT (layersD->vbox), "unmap", - (GtkSignalFunc) layers_dialog_unmap_callback, - NULL); - - gtk_widget_show (vbox); - } - - return layersD->vbox; -} - -typedef struct{ - GImage** def; - int* default_index; - MenuItemCallback callback; - GtkWidget* menu; - int num_items; - GImage* id; -}IMCBData; - -static void -create_image_menu_cb (gpointer im, gpointer d) -{ - GimpImage* gimage = GIMP_IMAGE (im); - IMCBData* data = (IMCBData*)d; - char* image_name; - char* menu_item_label; - GtkWidget *menu_item; - - /* make sure the default index gets set to _something_, if possible */ - if (*data->default_index == -1) - { - data->id = gimage; - *data->default_index = data->num_items; - } - - if (gimage == *data->def) - { - data->id = *data->def; - *data->default_index = data->num_items; - } - - image_name = g_basename (gimage_filename (gimage)); - menu_item_label = g_strdup_printf ("%s-%d", image_name, - pdb_image_to_id (gimage)); - menu_item = gtk_menu_item_new_with_label (menu_item_label); - gtk_signal_connect (GTK_OBJECT (menu_item), "activate", - (GtkSignalFunc) data->callback, - (gpointer) ((long) gimage)); - gtk_container_add (GTK_CONTAINER (data->menu), menu_item); - gtk_widget_show (menu_item); - - g_free (menu_item_label); - data->num_items ++; -} - -GtkWidget * -create_image_menu (GimpImage** def, - int *default_index, - MenuItemCallback callback) -{ - IMCBData data; - - data.def = def; - data.default_index = default_index; - data.callback = callback; - data.menu = gtk_menu_new (); - data.num_items = 0; - data.id = NULL; - - *default_index = -1; - - gimage_foreach (create_image_menu_cb, &data); - - if (!data.num_items) - { - GtkWidget* menu_item; - menu_item = gtk_menu_item_new_with_label (_("none")); - gtk_container_add (GTK_CONTAINER (data.menu), menu_item); - gtk_widget_show (menu_item); - } - - *def = data.id; - - return data.menu; -} - -void -layers_dialog_update (GimpImage* gimage) -{ - Layer *layer; - LayerWidget *lw; - GSList *list; - GList *item_list; - - if (!layersD) - return; - if (layersD->gimage == gimage) - return; - - layersD->gimage = gimage; - - suspend_gimage_notify++; - - /* Free all elements in the layers listbox */ - gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); - - list = layersD->layer_widgets; - while (list) - { - lw = (LayerWidget *) list->data; - list = g_slist_next(list); - layer_widget_delete (lw); - } - if (layersD->layer_widgets) - g_warning ("layersD->layer_widgets not empty!"); - layersD->layer_widgets = NULL; - - /* Find the preview extents */ - layers_dialog_preview_extents (); - - layersD->active_layer = NULL; - layersD->active_channel = NULL; - layersD->floating_sel = NULL; - - list = gimage->layers; - item_list = NULL; - - while (list) - { - /* create a layer list item */ - layer = (Layer *) list->data; - lw = create_layer_widget (gimage, layer); - layersD->layer_widgets = g_slist_append (layersD->layer_widgets, lw); - item_list = g_list_append (item_list, lw->list_item); - - list = g_slist_next (list); - } - - /* get the index of the active layer */ - if (item_list) - gtk_list_insert_items (GTK_LIST (layersD->layer_list), item_list, 0); - - gtk_signal_connect (GTK_OBJECT (gimage), - "destroy", - GTK_SIGNAL_FUNC (lc_dialog_update_cb), - NULL); - suspend_gimage_notify--; -} - - void layers_dialog_clear () { ops_button_box_set_insensitive (layers_ops_buttons); - layersD->gimage = NULL; + suspend_gimage_notify++; gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); + suspend_gimage_notify--; + + layersD->gimage = NULL; } +/***********************/ +/* Preview functions */ +/***********************/ void render_preview (TempBuf *preview_buf, @@ -1193,6 +833,10 @@ render_fs_preview (GtkWidget *widget, } +/*************************************/ +/* layers dialog widget routines */ +/*************************************/ + static void layers_dialog_preview_extents () { @@ -1235,6 +879,8 @@ layers_dialog_set_menu_sensitivity () gint gimage; /* is there a gimage */ gint lp; /* layers present */ gint alpha; /* alpha channel present */ + gint lind; /* layer index */ + gint lnum; /* number of layers */ Layer *layer; lp = FALSE; @@ -1255,50 +901,70 @@ layers_dialog_set_menu_sensitivity () if (gimage) lp = (layersD->gimage->layers != NULL); - /* new layer */ - gtk_widget_set_sensitive (layers_ops[0].widget, gimage); - gtk_widget_set_sensitive (layers_ops_buttons[0].widget, gimage); - /* raise layer */ - gtk_widget_set_sensitive (layers_ops[1].widget, fs && ac && gimage && lp && alpha); - gtk_widget_set_sensitive (layers_ops_buttons[1].widget, fs && ac && gimage && lp && alpha); - /* lower layer */ - gtk_widget_set_sensitive (layers_ops[2].widget, fs && ac && gimage && lp && alpha); - gtk_widget_set_sensitive (layers_ops_buttons[2].widget, fs && ac && gimage && lp && alpha); - /* duplicate layer */ - gtk_widget_set_sensitive (layers_ops[3].widget, fs && ac && gimage && lp); - gtk_widget_set_sensitive (layers_ops_buttons[3].widget, fs && ac && gimage && lp); - /* delete layer */ - gtk_widget_set_sensitive (layers_ops[4].widget, ac && gimage && lp); - gtk_widget_set_sensitive (layers_ops_buttons[4].widget, ac && gimage && lp); - /* scale layer */ - gtk_widget_set_sensitive (layers_ops[5].widget, ac && gimage && lp); - /* resize layer */ - gtk_widget_set_sensitive (layers_ops[6].widget, ac && gimage && lp); - /* add layer mask */ - gtk_widget_set_sensitive (layers_ops[7].widget, fs && ac && gimage && !lm && lp && alpha); - /* apply layer mask */ - gtk_widget_set_sensitive (layers_ops[8].widget, fs && ac && gimage && lm && lp); - /* anchor layer */ - gtk_widget_set_sensitive (layers_ops[9].widget, !fs && ac && gimage && lp); - gtk_widget_set_sensitive (layers_ops_buttons[5].widget, !fs && ac && gimage && lp); - /* merge visible layers */ - gtk_widget_set_sensitive (layers_ops[10].widget, fs && ac && gimage && lp); - /* merge visible layers */ - gtk_widget_set_sensitive (layers_ops[11].widget, fs && ac && gimage && lp); - /* flatten image */ - gtk_widget_set_sensitive (layers_ops[12].widget, fs && ac && gimage && lp); - /* alpha select */ - gtk_widget_set_sensitive (layers_ops[13].widget, fs && ac && gimage && lp && alpha); - /* mask select */ - gtk_widget_set_sensitive (layers_ops[14].widget, fs && ac && gimage && lm && lp); - /* add alpha */ - gtk_widget_set_sensitive (layers_ops[15].widget, !alpha); - /* raise layer to top */ - gtk_widget_set_sensitive (layers_ops[16].widget, fs && ac && gimage && lp && alpha); - /* lower layer to bottom */ - gtk_widget_set_sensitive (layers_ops[17].widget, fs && ac && gimage && lp); + lind = -1; + lnum = -1; + if (lp) + { + lind = gimage_get_layer_index (layersD->gimage, + layersD->gimage->active_layer); + lnum = g_slist_length (layersD->gimage->layers); + } - /* set mode, preserve transparency and opacity to insensitive if there are no layers */ + menus_set_sensitive (_("/Stack/Previous Layer"), + fs && ac && gimage && lp && lind > 0); + menus_set_sensitive (_("/Stack/Next Layer"), + fs && ac && gimage && lp && lind < (lnum - 1)); + + menus_set_sensitive (_("/Stack/Raise Layer"), + fs && ac && gimage && lp && alpha && lind > 0); + gtk_widget_set_sensitive (layers_ops_buttons[1].widget, + fs && ac && gimage && lp && alpha && lind > 0); + + menus_set_sensitive (_("/Stack/Lower Layer"), + fs && ac && gimage && lp && lind < (lnum - 1)); + gtk_widget_set_sensitive (layers_ops_buttons[2].widget, + fs && ac && gimage && lp && lind < (lnum - 1)); + + menus_set_sensitive (_("/Stack/Layer to Top"), + fs && ac && gimage && lp && alpha && lind > 0); + menus_set_sensitive (_("/Stack/Layer to Bottom"), + fs && ac && gimage && lp && lind < (lnum - 1)); + + menus_set_sensitive (_("/New Layer"), gimage); + gtk_widget_set_sensitive (layers_ops_buttons[0].widget, gimage); + + menus_set_sensitive (_("/Duplicate Layer"), fs && ac && gimage && lp); + gtk_widget_set_sensitive (layers_ops_buttons[3].widget, + fs && ac && gimage && lp); + + menus_set_sensitive (_("/Delete Layer"), ac && gimage && lp); + gtk_widget_set_sensitive (layers_ops_buttons[4].widget, ac && gimage && lp); + + menus_set_sensitive (_("/Anchor Layer"), !fs && ac && gimage && lp); + gtk_widget_set_sensitive (layers_ops_buttons[5].widget, + !fs && ac && gimage && lp); + + menus_set_sensitive (_("/Scale Layer"), ac && gimage && lp); + menus_set_sensitive (_("/Resize Layer"), ac && gimage && lp); + + menus_set_sensitive (_("/Merge Visible Layers"), + fs && ac && gimage && lp); + menus_set_sensitive (_("/Merge Down"), fs && ac && gimage && lp); + menus_set_sensitive (_("/Flatten Image"), fs && ac && gimage && lp); + + menus_set_sensitive (_("/Add Layer Mask"), + fs && ac && gimage && !lm && lp && alpha); + menus_set_sensitive (_("/Apply Layer Mask"), + fs && ac && gimage && lm && lp); + menus_set_sensitive (_("/Alpha to Selection"), + fs && ac && gimage && lp && alpha); + menus_set_sensitive (_("/Mask to Selection"), + fs && ac && gimage && lm && lp); + menus_set_sensitive (_("/Add Alpha Channel"), !alpha); + + /* set mode, preserve transparency and opacity to insensitive + * if there are no layers + */ gtk_widget_set_sensitive (layersD->preserve_trans, lp); gtk_widget_set_sensitive (layersD->opacity_box, lp); gtk_widget_set_sensitive (layersD->mode_box, lp); @@ -1361,7 +1027,7 @@ layers_dialog_unset_layer (Layer * layer) static void layers_dialog_position_layer (Layer * layer, - int new_index) + int new_index) { LayerWidget *layer_widget; GList *list = NULL; @@ -1401,7 +1067,7 @@ layers_dialog_add_layer (Layer *layer) item_list = NULL; - layer_widget = create_layer_widget (gimage, layer); + layer_widget = layer_widget_create (gimage, layer); item_list = g_list_append (item_list, layer_widget->list_item); position = gimage_get_layer_index (gimage, layer); @@ -1473,19 +1139,15 @@ layers_dialog_remove_layer_mask (Layer * layer) static gint paint_mode_menu_get_position (gint mode) { - /* FIXME this is an ugly hack that should stay around only until - * the layers dialog is rewritten + /* FIXME this is an ugly hack that should stay around only until + * the layers dialog is rewritten */ - int i = 0; + int i; + + for (i = 0; option_items[i].label != NULL; i++) + if (mode == (gint) (option_items[i].user_data)) + return i; - while (option_items [i].label != NULL) - { - if (mode == (gint) (option_items[i].user_data)) - return i; - else - i++; - } - g_message (_("Unknown layer mode")); return 0; } @@ -1500,7 +1162,7 @@ paint_mode_menu_callback (GtkWidget *w, if (! (gimage = layersD->gimage)) return; - if (! (layer = (gimage->active_layer))) + if (! (layer = gimage->active_layer)) return; /* If the layer has an alpha channel, set the transparency and redraw */ @@ -1511,26 +1173,13 @@ paint_mode_menu_callback (GtkWidget *w, { layer->mode = mode; - drawable_update (GIMP_DRAWABLE(layer), 0, 0, GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height); + drawable_update (GIMP_DRAWABLE (layer), 0, 0, GIMP_DRAWABLE (layer)->width, GIMP_DRAWABLE (layer)->height); gdisplays_flush (); } } } -static void -image_menu_callback (GtkWidget *w, - gpointer client_data) -{ - if (!lc_shell) - return; - layers_dialog_update (GIMP_IMAGE(client_data)); - channels_dialog_update (GIMP_IMAGE(client_data)); - paths_dialog_update (GIMP_IMAGE(client_data)); - gdisplays_flush (); -} - - static void opacity_scale_update (GtkAdjustment *adjustment, gpointer data) @@ -1541,8 +1190,7 @@ opacity_scale_update (GtkAdjustment *adjustment, if (! (gimage = layersD->gimage)) return; - - if (! (layer = (gimage->active_layer))) + if (! (layer = gimage->active_layer)) return; /* add the 0.001 to insure there are no subtle rounding errors */ @@ -1551,7 +1199,9 @@ opacity_scale_update (GtkAdjustment *adjustment, { layer->opacity = opacity; - drawable_update (GIMP_DRAWABLE(layer), 0, 0, GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height); + drawable_update (GIMP_DRAWABLE (layer), 0, 0, + GIMP_DRAWABLE (layer)->width, + GIMP_DRAWABLE (layer)->height); gdisplays_flush (); } } @@ -1566,14 +1216,13 @@ preserve_trans_update (GtkWidget *w, if (! (gimage = layersD->gimage)) return; - - if (! (layer = (gimage->active_layer))) + if (! (layer = gimage->active_layer)) return; if (GTK_TOGGLE_BUTTON (w)->active) - layer->preserve_trans = 1; + layer->preserve_trans = TRUE; else - layer->preserve_trans = 0; + layer->preserve_trans = FALSE; } @@ -1590,7 +1239,8 @@ layer_list_events (GtkWidget *widget, if (GTK_IS_LIST_ITEM (event_widget)) { - layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (event_widget)); + layer_widget = + (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (event_widget)); switch (event->type) { @@ -1598,7 +1248,12 @@ layer_list_events (GtkWidget *widget, bevent = (GdkEventButton *) event; if (bevent->button == 3 || bevent->button == 2) - gtk_menu_popup (GTK_MENU (layersD->ops_menu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); + { + gtk_menu_popup (GTK_MENU (layersD->ops_menu), + NULL, NULL, NULL, NULL, + bevent->button, bevent->time); + return TRUE; + } break; case GDK_2BUTTON_PRESS: @@ -1619,7 +1274,7 @@ layer_list_events (GtkWidget *widget, default: return FALSE; } - return TRUE; + return FALSE; default: break; @@ -1638,10 +1293,10 @@ static void layers_dialog_map_callback (GtkWidget *w, gpointer client_data) { - if (!layersD) + if (! layersD) return; - - gtk_window_add_accel_group (GTK_WINDOW (lc_shell), + + gtk_window_add_accel_group (GTK_WINDOW (lc_dialog->shell), layersD->accel_group); } @@ -1649,48 +1304,78 @@ static void layers_dialog_unmap_callback (GtkWidget *w, gpointer client_data) { - if (!layersD) + if (! layersD) return; - - gtk_window_remove_accel_group (GTK_WINDOW (lc_shell), + + gtk_window_remove_accel_group (GTK_WINDOW (lc_dialog->shell), layersD->accel_group); } -static void -layers_dialog_new_layer_callback (GtkWidget *w, - gpointer client_data) +void +layers_dialog_previous_layer_callback (GtkWidget *w, + gpointer client_data) { GImage *gimage; - Layer *layer; + int current_layer; + Layer *new_layer; - /* if there is a currently selected gimage, request a new layer - */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; - /* If there is a floating selection, the new command transforms - * the current fs into a new layer + current_layer = + gimage_get_layer_index (gimage, gimage->active_layer); + + /* FIXME: don't use internal knowledge about layer lists + * TODO : implement gimage_get_layer_by_index() */ - if ((layer = gimage_floating_sel (gimage))) + new_layer = + (Layer *) g_slist_nth_data (gimage->layers, current_layer - 1); + + if (new_layer) { - floating_sel_to_layer (layer); - + gimage_set_active_layer (gimage, new_layer); gdisplays_flush (); } - else - layers_dialog_new_layer_query (layersD->gimage); } +void +layers_dialog_next_layer_callback (GtkWidget *w, + gpointer client_data) +{ + GImage *gimage; + int current_layer; + Layer *new_layer; -static void + if (! layersD) + return; + if (! (gimage = layersD->gimage)) + return; + + current_layer = + gimage_get_layer_index (gimage, gimage->active_layer); + + /* FIXME: don't use internal knowledge about layer lists + * TODO : implement gimage_get_layer_by_index() + */ + new_layer = + (Layer *) g_slist_nth_data (gimage->layers, current_layer + 1); + + if (new_layer) + { + gimage_set_active_layer (gimage, new_layer); + gdisplays_flush (); + } +} + +void layers_dialog_raise_layer_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1699,30 +1384,28 @@ layers_dialog_raise_layer_callback (GtkWidget *w, gdisplays_flush (); } - -static void +void layers_dialog_lower_layer_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; gimage_lower_layer (gimage, gimage->active_layer); - gdisplays_flush (); } -static void +void layers_dialog_raise_layer_to_top_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1735,13 +1418,13 @@ layers_dialog_raise_layer_to_top_callback (GtkWidget *w, } -static void +void layers_dialog_lower_layer_to_bottom_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1753,7 +1436,34 @@ layers_dialog_lower_layer_to_bottom_callback (GtkWidget *w, } } -static void +void +layers_dialog_new_layer_callback (GtkWidget *w, + gpointer client_data) +{ + GImage *gimage; + Layer *layer; + + /* if there is a currently selected gimage, request a new layer + */ + if (! layersD) + return; + if (! (gimage = layersD->gimage)) + return; + + /* If there is a floating selection, the new command transforms + * the current fs into a new layer + */ + if ((layer = gimage_floating_sel (gimage))) + { + floating_sel_to_layer (layer); + + gdisplays_flush (); + } + else + layers_dialog_new_layer_query (layersD->gimage); +} + +void layers_dialog_duplicate_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1763,7 +1473,7 @@ layers_dialog_duplicate_layer_callback (GtkWidget *w, /* if there is a currently selected gimage, request a new layer */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1781,8 +1491,7 @@ layers_dialog_duplicate_layer_callback (GtkWidget *w, gdisplays_flush (); } - -static void +void layers_dialog_delete_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1791,7 +1500,7 @@ layers_dialog_delete_layer_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1808,8 +1517,7 @@ layers_dialog_delete_layer_callback (GtkWidget *w, gdisplays_flush (); } - -static void +void layers_dialog_scale_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1817,7 +1525,7 @@ layers_dialog_scale_layer_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1825,8 +1533,7 @@ layers_dialog_scale_layer_callback (GtkWidget *w, layers_dialog_scale_layer_query (gimage, gimage->active_layer); } - -static void +void layers_dialog_resize_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1834,7 +1541,7 @@ layers_dialog_resize_layer_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1842,8 +1549,7 @@ layers_dialog_resize_layer_callback (GtkWidget *w, layers_dialog_resize_layer_query (gimage, gimage->active_layer); } - -static void +void layers_dialog_add_layer_mask_callback (GtkWidget *w, gpointer client_data) { @@ -1851,7 +1557,7 @@ layers_dialog_add_layer_mask_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1859,8 +1565,7 @@ layers_dialog_add_layer_mask_callback (GtkWidget *w, layers_dialog_add_mask_query (gimage->active_layer); } - -static void +void layers_dialog_apply_layer_mask_callback (GtkWidget *w, gpointer client_data) { @@ -1869,21 +1574,20 @@ layers_dialog_apply_layer_mask_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; /* Make sure there is a layer mask to apply */ - if ((layer = (gimage->active_layer)) != NULL) + if ((layer = gimage->active_layer) != NULL) { if (layer->mask) layers_dialog_apply_mask_query (gimage->active_layer); } } - -static void +void layers_dialog_anchor_layer_callback (GtkWidget *w, gpointer client_data) { @@ -1891,7 +1595,7 @@ layers_dialog_anchor_layer_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1900,8 +1604,7 @@ layers_dialog_anchor_layer_callback (GtkWidget *w, gdisplays_flush (); } - -static void +void layers_dialog_merge_layers_callback (GtkWidget *w, gpointer client_data) { @@ -1909,7 +1612,7 @@ layers_dialog_merge_layers_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1917,13 +1620,15 @@ layers_dialog_merge_layers_callback (GtkWidget *w, layers_dialog_layer_merge_query (gimage, TRUE); } -static void -layers_dialog_merge_down_callback (GtkWidget *w, gpointer client_data) +void +layers_dialog_merge_down_callback (GtkWidget *w, + gpointer client_data) { GImage *gimage; + /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1932,7 +1637,7 @@ layers_dialog_merge_down_callback (GtkWidget *w, gpointer client_data) gdisplays_flush (); } -static void +void layers_dialog_flatten_image_callback (GtkWidget *w, gpointer client_data) { @@ -1940,7 +1645,7 @@ layers_dialog_flatten_image_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1950,7 +1655,7 @@ layers_dialog_flatten_image_callback (GtkWidget *w, } -static void +void layers_dialog_alpha_select_callback (GtkWidget *w, gpointer client_data) { @@ -1958,7 +1663,7 @@ layers_dialog_alpha_select_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1968,7 +1673,7 @@ layers_dialog_alpha_select_callback (GtkWidget *w, } -static void +void layers_dialog_mask_select_callback (GtkWidget *w, gpointer client_data) { @@ -1976,7 +1681,7 @@ layers_dialog_mask_select_callback (GtkWidget *w, /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; @@ -1986,83 +1691,28 @@ layers_dialog_mask_select_callback (GtkWidget *w, } -static void +void layers_dialog_add_alpha_channel_callback (GtkWidget *w, gpointer client_data) { GImage *gimage; - Layer *layer; + Layer *layer; /* if there is a currently selected gimage */ - if (!layersD) + if (! layersD) return; if (! (gimage = layersD->gimage)) return; - if (! (layer = gimage_get_active_layer (gimage))) return; - /* Add an alpha channel */ + /* Add an alpha channel */ layer_add_alpha (layer); gdisplays_flush (); } -static void -lc_dialog_auto_callback (GtkWidget *toggle_button, - gpointer client_data) -{ - if (layersD) - { - layersD->auto_follow_active = - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button)); - - if (layersD->auto_follow_active) - lc_dialog_change_image (image_context, - (GimpImage *) gimp_set_get_active (image_context), - NULL); - } -} - - -static gint -lc_dialog_close_callback (GtkWidget *w, - gpointer client_data) -{ - if (layersD) - layersD->gimage = NULL; - - gtk_widget_hide (lc_shell); - - return TRUE; -} - - -static void -lc_dialog_update_cb (GimpSet *set, - GimpImage *image, - gpointer user_data) -{ - lc_dialog_update_image_list (); -} - - -static void -lc_dialog_change_image (GimpSet *set, - GimpImage *gimage, - gpointer user_data) -{ - if (layersD && layersD->auto_follow_active && gimage) { - layers_dialog_update (gimage); - channels_dialog_update (gimage); - paths_dialog_update (gimage); - lc_dialog_update_image_list (); - gdisplays_flush (); - } -} - - /****************************/ /* layer widget functions */ /****************************/ @@ -2073,7 +1723,7 @@ layer_widget_get_ID (Layer * ID) LayerWidget *lw; GSList *list; - if (!layersD) + if (! layersD) return NULL; list = layersD->layer_widgets; @@ -2090,9 +1740,8 @@ layer_widget_get_ID (Layer * ID) return NULL; } - static LayerWidget * -create_layer_widget (GImage *gimage, +layer_widget_create (GImage *gimage, Layer *layer) { LayerWidget *layer_widget; @@ -2146,7 +1795,8 @@ create_layer_widget (GImage *gimage, alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_box_pack_start (GTK_BOX (hbox), alignment, FALSE, TRUE, 2); layer_widget->eye_widget = gtk_drawing_area_new (); - gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->eye_widget), eye_width, eye_height); + gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->eye_widget), + eye_width, eye_height); gtk_widget_set_events (layer_widget->eye_widget, BUTTON_EVENT_MASK); gtk_signal_connect (GTK_OBJECT (layer_widget->eye_widget), "event", (GtkSignalFunc) layer_widget_button_events, @@ -2160,7 +1810,8 @@ create_layer_widget (GImage *gimage, alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_box_pack_start (GTK_BOX (hbox), alignment, FALSE, TRUE, 2); layer_widget->linked_widget = gtk_drawing_area_new (); - gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->linked_widget), eye_width, eye_height); + gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->linked_widget), + eye_width, eye_height); gtk_widget_set_events (layer_widget->linked_widget, BUTTON_EVENT_MASK); gtk_signal_connect (GTK_OBJECT (layer_widget->linked_widget), "event", (GtkSignalFunc) layer_widget_button_events, @@ -2205,7 +1856,7 @@ create_layer_widget (GImage *gimage, if (layer_is_floating_sel (layer)) layer_widget->label = gtk_label_new (_("Floating Selection")); else - layer_widget->label = gtk_label_new (layer_get_name(layer)); + layer_widget->label = gtk_label_new (layer_get_name (layer)); gtk_box_pack_start (GTK_BOX (hbox), layer_widget->label, FALSE, FALSE, 2); gtk_widget_show (layer_widget->label); @@ -2216,19 +1867,19 @@ create_layer_widget (GImage *gimage, (GtkSignalFunc) layer_widget_button_events, layer_widget); gtk_object_set_user_data (GTK_OBJECT (layer_widget->clip_widget), layer_widget); - gtk_box_pack_start (GTK_BOX (vbox), layer_widget->clip_widget, FALSE, FALSE, 0); - /* gtk_widget_show (layer_widget->clip_widget); */ + gtk_box_pack_start (GTK_BOX (vbox), layer_widget->clip_widget, + FALSE, FALSE, 0); + /* gtk_widget_show (layer_widget->clip_widget); */ gtk_widget_show (hbox); gtk_widget_show (vbox); gtk_widget_show (list_item); - + gtk_widget_ref (layer_widget->list_item); return layer_widget; } - static void layer_widget_delete (LayerWidget *layer_widget) { @@ -2245,14 +1896,13 @@ layer_widget_delete (LayerWidget *layer_widget) g_free (layer_widget); } - static void layer_widget_select_update (GtkWidget *w, gpointer data) { LayerWidget *layer_widget; - if ((layer_widget = (LayerWidget *) data) == NULL) + if (! (layer_widget = (LayerWidget *) data)) return; /* Is the list item being selected? */ @@ -2269,7 +1919,6 @@ layer_widget_select_update (GtkWidget *w, } } - static gint layer_widget_button_events (GtkWidget *widget, GdkEvent *event) @@ -2299,13 +1948,15 @@ layer_widget_button_events (GtkWidget *widget, case GDK_BUTTON_PRESS: return_val = TRUE; - bevent = (GdkEventButton *) event; - if (bevent->button == 3) { - gtk_menu_popup (GTK_MENU (layersD->ops_menu), NULL, NULL, NULL, NULL, 3, bevent->time); - return TRUE; - } + if (bevent->button == 3) + { + gtk_menu_popup (GTK_MENU (layersD->ops_menu), + NULL, NULL, NULL, NULL, + 3, bevent->time); + return TRUE; + } button_down = 1; click_widget = widget; @@ -2401,7 +2052,6 @@ layer_widget_button_events (GtkWidget *widget, return return_val; } - static gint layer_widget_preview_events (GtkWidget *widget, GdkEvent *event) @@ -2446,11 +2096,14 @@ layer_widget_preview_events (GtkWidget *widget, case GDK_BUTTON_PRESS: /* Control-button press disables the application of the mask */ bevent = (GdkEventButton *) event; - - if (bevent->button == 3) { - gtk_menu_popup (GTK_MENU (layersD->ops_menu), NULL, NULL, NULL, NULL, 3, bevent->time); - return TRUE; - } + + if (bevent->button == 3) + { + gtk_menu_popup (GTK_MENU (layersD->ops_menu), + NULL, NULL, NULL, NULL, + 3, bevent->time); + return TRUE; + } if (event->button.state & GDK_CONTROL_MASK) { @@ -2699,7 +2352,6 @@ layer_widget_preview_redraw (LayerWidget *layer_widget, } } - static void layer_widget_no_preview_redraw (LayerWidget *layer_widget, int preview_type) @@ -2792,7 +2444,6 @@ layer_widget_no_preview_redraw (LayerWidget *layer_widget, pixmap, 0, 0, 2, 2, width, height); } - static void layer_widget_eye_redraw (LayerWidget *layer_widget) { @@ -2930,7 +2581,6 @@ layer_widget_clip_redraw (LayerWidget *layer_widget) gdk_window_clear (layer_widget->clip_widget->window); } - static void layer_widget_exclusive_visible (LayerWidget *layer_widget) { @@ -3088,7 +2738,6 @@ layer_widget_layer_flush (GtkWidget *widget, /* * The new layer query dialog */ - typedef struct _NewLayerOptions NewLayerOptions; struct _NewLayerOptions { @@ -3362,7 +3011,6 @@ layers_dialog_new_layer_query (GimpImage* gimage) /* * The edit layer attributes dialog */ - typedef struct _EditLayerOptions EditLayerOptions; struct _EditLayerOptions { @@ -3427,20 +3075,22 @@ edit_layer_query_delete_callback (GtkWidget *w, static void layers_dialog_edit_layer_query (LayerWidget *layer_widget) { - static ActionAreaItem action_items[2] = - { - { N_("OK"), edit_layer_query_ok_callback, NULL, NULL }, - { N_("Cancel"), edit_layer_query_cancel_callback, NULL, NULL } - }; EditLayerOptions *options; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; + static ActionAreaItem action_items[] = + { + { N_("OK"), edit_layer_query_ok_callback, NULL, NULL }, + { N_("Cancel"), edit_layer_query_cancel_callback, NULL, NULL } + }; + /* the new options structure */ options = (EditLayerOptions *) g_malloc (sizeof (EditLayerOptions)); options->layer = layer_widget->layer; options->gimage = layer_widget->gimage; + /* the dialog */ options->query_box = gtk_dialog_new (); gtk_window_set_wmclass (GTK_WINDOW (options->query_box), "edit_layer_attrributes", "Gimp"); @@ -3461,15 +3111,19 @@ layers_dialog_edit_layer_query (LayerWidget *layer_widget) /* the name entry hbox, label and entry */ hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + label = gtk_label_new (_("Layer name: ")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); + options->name_entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (hbox), options->name_entry, TRUE, TRUE, 0); gtk_entry_set_text (GTK_ENTRY (options->name_entry), ((layer_is_floating_sel (layer_widget->layer) ? - _("Floating Selection") : layer_get_name(layer_widget->layer)))); + _("Floating Selection") : + layer_get_name(layer_widget->layer)))); gtk_widget_show (options->name_entry); + gtk_widget_show (hbox); action_items[0].user_data = options; @@ -3963,11 +3617,12 @@ layers_dialog_resize_layer_query (GImage * gimage, typedef struct _LayerMergeOptions LayerMergeOptions; -struct _LayerMergeOptions { +struct _LayerMergeOptions +{ GtkWidget *query_box; - GimpImage* gimage; - int merge_visible; - MergeType merge_type; + GimpImage *gimage; + int merge_visible; + MergeType merge_type; }; static void @@ -4056,14 +3711,14 @@ layers_dialog_layer_merge_query (GImage *gimage, GtkWidget *radio_box; GtkWidget *radio_button; GSList *group = NULL; - int i; - char *button_names[3] = + gint i; + static gchar *button_names[] = { N_("Expanded as necessary"), N_("Clipped to image"), N_("Clipped to bottom layer") }; - ActionCallback button_callbacks[3] = + static ActionCallback button_callbacks[] = { expand_as_necessary_callback, clip_to_image_callback, @@ -4112,7 +3767,8 @@ layers_dialog_layer_merge_query (GImage *gimage, /* the radio buttons */ for (i = 0; i < 3; i++) { - radio_button = gtk_radio_button_new_with_label (group, gettext(button_names[i])); + radio_button = + gtk_radio_button_new_with_label (group, gettext(button_names[i])); group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button)); gtk_box_pack_start (GTK_BOX (radio_box), radio_button, FALSE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (radio_button), "toggled", @@ -4130,4 +3786,3 @@ layers_dialog_layer_merge_query (GImage *gimage, gtk_widget_show (vbox); gtk_widget_show (options->query_box); } - diff --git a/app/layers_dialog.h b/app/layers_dialog.h index c792630a23..dbc1237b04 100644 --- a/app/layers_dialog.h +++ b/app/layers_dialog.h @@ -15,15 +15,28 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __LAYERS_DIALOG_H__ -#define __LAYERS_DIALOG_H__ +#ifndef __LAYERS_DIALOG_H__ +#define __LAYERS_DIALOG_H__ -#include "gimpimageF.h" +void layers_dialog_previous_layer_callback (GtkWidget *, gpointer); +void layers_dialog_next_layer_callback (GtkWidget *, gpointer); +void layers_dialog_raise_layer_callback (GtkWidget *, gpointer); +void layers_dialog_lower_layer_callback (GtkWidget *, gpointer); +void layers_dialog_raise_layer_to_top_callback (GtkWidget *, gpointer); +void layers_dialog_lower_layer_to_bottom_callback (GtkWidget *, gpointer); +void layers_dialog_new_layer_callback (GtkWidget *, gpointer); +void layers_dialog_duplicate_layer_callback (GtkWidget *, gpointer); +void layers_dialog_delete_layer_callback (GtkWidget *, gpointer); +void layers_dialog_scale_layer_callback (GtkWidget *, gpointer); +void layers_dialog_resize_layer_callback (GtkWidget *, gpointer); +void layers_dialog_add_layer_mask_callback (GtkWidget *, gpointer); +void layers_dialog_apply_layer_mask_callback (GtkWidget *, gpointer); +void layers_dialog_anchor_layer_callback (GtkWidget *, gpointer); +void layers_dialog_merge_layers_callback (GtkWidget *, gpointer); +void layers_dialog_merge_down_callback (GtkWidget *, gpointer); +void layers_dialog_flatten_image_callback (GtkWidget *, gpointer); +void layers_dialog_alpha_select_callback (GtkWidget *, gpointer); +void layers_dialog_mask_select_callback (GtkWidget *, gpointer); +void layers_dialog_add_alpha_channel_callback (GtkWidget *, gpointer); -void lc_dialog_create (GimpImage*); -void lc_dialog_update_image_list (void); -void lc_dialog_free (void); -void lc_dialog_rebuild (int); -void layers_dialog_flush (void); - -#endif /* __LAYERS_DIALOG_H__ */ +#endif /* __LAYERS_DIALOG_H__ */ diff --git a/app/layers_dialogP.h b/app/layers_dialogP.h index 6974c988de..e6595965f2 100644 --- a/app/layers_dialogP.h +++ b/app/layers_dialogP.h @@ -15,29 +15,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __LAYERS_DIALOGP_H__ -#define __LAYERS_DIALOGP_H__ +#ifndef __LAYERS_DIALOG_P_H__ +#define __LAYERS_DIALOG_P_H__ -#include "buildmenu.h" +void render_fs_preview (GtkWidget *, GdkPixmap *); +void render_preview (TempBuf *, GtkWidget *, int, int, int); -GtkWidget * layers_dialog_create (void); -GtkWidget * channels_dialog_create (void); - -GtkWidget * create_image_menu (GimpImage **, int *, MenuItemCallback); - -void layers_dialog_update (GimpImage*); -void channels_dialog_update (GimpImage*); - -void layers_dialog_clear (void); -void channels_dialog_clear (void); - -void layers_dialog_free (void); -void channels_dialog_free (void); - -void render_fs_preview (GtkWidget *, GdkPixmap *); -void render_preview (TempBuf *, GtkWidget *, int, int, int); - -/* Main dialog widget */ -extern GtkWidget *lc_shell; - -#endif /* __LAYERS_DIALOGP_H__ */ +#endif /* __LAYERS_DIALOG_P_H__ */ diff --git a/app/lc_dialog.c b/app/lc_dialog.c new file mode 100644 index 0000000000..0ad4ce2d54 --- /dev/null +++ b/app/lc_dialog.c @@ -0,0 +1,479 @@ +/* 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 "appenv.h" +#include "actionarea.h" +#include "buildmenu.h" +#include "dialog_handler.h" +#include "gimage.h" +#include "gimprc.h" +#include "gimpset.h" +#include "interface.h" +#include "image_render.h" +#include "lc_dialog.h" +#include "lc_dialogP.h" +#include "session.h" + +#include "libgimp/gimpintl.h" + +/* local function prototypes */ +static void lc_dialog_update (GimpImage *); +static void lc_dialog_image_menu_callback (GtkWidget *, gpointer); +static void lc_dialog_auto_callback (GtkWidget *, gpointer); +static gint lc_dialog_close_callback (GtkWidget *, gpointer); +static void lc_dialog_add_cb (GimpSet *, GimpImage *, gpointer); +static void lc_dialog_remove_cb (GimpSet *, GimpImage *, gpointer); +static void lc_dialog_change_image (GimpSet *, GimpImage *, gpointer); +static void lc_dialog_destroy_cb (GimpImage *, gpointer); + +/* FIXME: move these to a better place */ +static GtkWidget * lc_dialog_create_image_menu (GimpImage **, int *, + MenuItemCallback); +static void lc_dialog_create_image_menu_cb (gpointer, gpointer); + +/* the main dialog structure */ +LCDialog * lc_dialog = NULL; + +/*********************************/ +/* Public L&C dialog functions */ +/*********************************/ + +void +lc_dialog_create (GimpImage* gimage) +{ + GtkWidget *util_box; + GtkWidget *auto_button; + GtkWidget *button; + GtkWidget *label; + GtkWidget *notebook; + GtkWidget *separator; + int default_index; + + if (lc_dialog) + { + if (! GTK_WIDGET_VISIBLE (lc_dialog->shell)) + { + gtk_widget_show (lc_dialog->shell); + } + else + { + gdk_window_raise (lc_dialog->shell->window); + } + + lc_dialog_update (gimage); + lc_dialog_update_image_list (); + + return; + } + + lc_dialog = g_malloc (sizeof (LCDialog)); + lc_dialog->shell = gtk_dialog_new (); + lc_dialog->gimage = NULL; + lc_dialog->auto_follow_active = TRUE; + + /* Register the dialog */ + dialog_register (lc_dialog->shell); + + gtk_window_set_title (GTK_WINDOW (lc_dialog->shell), _("Layers & Channels")); + gtk_window_set_wmclass (GTK_WINDOW (lc_dialog->shell), + "layers_and_channels", "Gimp"); + session_set_window_geometry (lc_dialog->shell, &lc_dialog_session_info, TRUE); + + /* Handle the WM delete event */ + gtk_signal_connect (GTK_OBJECT (lc_dialog->shell), "delete_event", + GTK_SIGNAL_FUNC (lc_dialog_close_callback), NULL); + + /* The toplevel vbox */ + lc_dialog->subshell = gtk_vbox_new (FALSE, 1); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (lc_dialog->shell)->vbox), + lc_dialog->subshell); + + /* The hbox to hold the image option menu box */ + util_box = gtk_hbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (util_box), 2); + gtk_box_pack_start (GTK_BOX (lc_dialog->subshell), util_box, FALSE, FALSE, 0); + + /* The GIMP image option menu */ + label = gtk_label_new (_("Image:")); + gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); + gtk_widget_show (label); + + lc_dialog->image_option_menu = gtk_option_menu_new (); + lc_dialog->image_menu = + lc_dialog_create_image_menu (&gimage, &default_index, + lc_dialog_image_menu_callback); + gtk_box_pack_start (GTK_BOX (util_box), lc_dialog->image_option_menu, + TRUE, TRUE, 0); + gtk_widget_show (lc_dialog->image_option_menu); + + gtk_option_menu_set_menu (GTK_OPTION_MENU (lc_dialog->image_option_menu), + lc_dialog->image_menu); + if (default_index != -1) + gtk_option_menu_set_history + (GTK_OPTION_MENU (lc_dialog->image_option_menu), default_index); + + /* The Auto-button */ + auto_button = gtk_toggle_button_new_with_label (_("Auto")); + gtk_box_pack_start (GTK_BOX (util_box), auto_button, FALSE, FALSE, 0); + gtk_signal_connect (GTK_OBJECT (auto_button), "clicked", + (GtkSignalFunc) lc_dialog_auto_callback, + auto_button); + gtk_widget_show (auto_button); + /* State will be set, when the sub-dialogs exists (see below) */ + + gtk_widget_show (util_box); + + separator = gtk_hseparator_new (); + gtk_box_pack_start (GTK_BOX (lc_dialog->subshell), separator, + FALSE, FALSE, 0); + gtk_widget_show (separator); + + /* The notebook widget */ + notebook = gtk_notebook_new (); + gtk_container_set_border_width (GTK_CONTAINER (notebook), 2); + gtk_box_pack_start (GTK_BOX (lc_dialog->subshell), notebook, TRUE, TRUE, 0); + + label = gtk_label_new (_("Layers")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), + layers_dialog_create (), label); + gtk_widget_show (label); + + label = gtk_label_new (_("Channels")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), + channels_dialog_create (), label); + gtk_widget_show (label); + + label = gtk_label_new (_("Paths")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), + paths_dialog_create (), label); + gtk_widget_show (label); + + /* Now all notebook pages exist, we can set the Auto-togglebutton */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (auto_button), + lc_dialog->auto_follow_active); + + gtk_widget_show (notebook); + + /* The action area */ + gtk_container_set_border_width + (GTK_CONTAINER (GTK_DIALOG (lc_dialog->shell)->action_area), 1); + + /* The close button */ + button = gtk_button_new_with_label (_("Close")); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (lc_dialog->shell)->action_area), + button, TRUE, TRUE, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + (GtkSignalFunc) lc_dialog_close_callback, + lc_dialog->shell); + gtk_widget_show (button); + + /* Make sure the channels page is realized */ + gtk_notebook_set_page (GTK_NOTEBOOK (notebook), 1); + gtk_notebook_set_page (GTK_NOTEBOOK (notebook), 0); + + gtk_signal_connect (GTK_OBJECT (image_context), "add", + GTK_SIGNAL_FUNC (lc_dialog_add_cb), NULL); + gtk_signal_connect (GTK_OBJECT (image_context), "remove", + GTK_SIGNAL_FUNC (lc_dialog_remove_cb), NULL); + gtk_signal_connect (GTK_OBJECT (image_context), "active_changed", + GTK_SIGNAL_FUNC (lc_dialog_change_image), NULL); + + lc_dialog_update (gimage); + lc_dialog_update_image_list (); + + gtk_widget_show (lc_dialog->subshell); + gtk_widget_show (lc_dialog->shell); + + gdisplays_flush (); +} + +void +lc_dialog_free () +{ + if (lc_dialog == NULL) + return; + + session_get_window_info (lc_dialog->shell, &lc_dialog_session_info); + + layers_dialog_free (); + channels_dialog_free (); + + gtk_widget_destroy (lc_dialog->shell); + + g_free (lc_dialog); + lc_dialog = NULL; +} + +void +lc_dialog_rebuild (int new_preview_size) +{ + GimpImage* gimage; + int flag; + + gimage = NULL; + + flag = 0; + if (lc_dialog) + { + flag = 1; + gimage = lc_dialog->gimage; + lc_dialog_free (); + } + + preview_size = new_preview_size; + render_setup (transparency_type, transparency_size); + + if (flag) + lc_dialog_create (gimage); +} + +void +lc_dialog_flush () +{ + if (! lc_dialog || lc_dialog->gimage == NULL) + return; + + layers_dialog_flush (); + channels_dialog_flush (); + paths_dialog_flush (); +} + +void +lc_dialog_update_image_list () +{ + GimpImage* default_gimage; + int default_index; + + if (lc_dialog == NULL) + return; + + default_gimage = lc_dialog->gimage; + lc_dialog->image_menu = + lc_dialog_create_image_menu (&default_gimage, &default_index, + lc_dialog_image_menu_callback); + gtk_option_menu_set_menu (GTK_OPTION_MENU (lc_dialog->image_option_menu), + lc_dialog->image_menu); + + if (default_index != -1) + { + gtk_option_menu_set_history + (GTK_OPTION_MENU (lc_dialog->image_option_menu), default_index); + + lc_dialog_update (default_gimage); + gdisplays_flush (); + + if (! GTK_WIDGET_IS_SENSITIVE (lc_dialog->subshell) ) + gtk_widget_set_sensitive (lc_dialog->subshell, TRUE); + } + else + { + layers_dialog_clear (); + channels_dialog_clear (); + + lc_dialog->gimage = NULL; + + if (GTK_WIDGET_IS_SENSITIVE (lc_dialog->subshell)) + gtk_widget_set_sensitive (lc_dialog->subshell, FALSE); + } +} + +/**********************************/ +/* Private L&C dialog functions */ +/**********************************/ + +static void +lc_dialog_update (GimpImage* gimage) +{ + if (! lc_dialog || lc_dialog->gimage == gimage) + return; + + lc_dialog->gimage = gimage; + + layers_dialog_update (gimage); + channels_dialog_update (gimage); + paths_dialog_update (gimage); + + if (gimage) + { + gtk_signal_connect (GTK_OBJECT (gimage), "destroy", + GTK_SIGNAL_FUNC (lc_dialog_destroy_cb), NULL); + } +} + +typedef struct +{ + GImage **def; + int *default_index; + MenuItemCallback callback; + GtkWidget *menu; + int num_items; + GImage *id; +} IMCBData; + +static void +lc_dialog_create_image_menu_cb (gpointer im, + gpointer d) +{ + GimpImage *gimage = GIMP_IMAGE (im); + IMCBData *data = (IMCBData *) d; + char *image_name; + char *menu_item_label; + GtkWidget *menu_item; + + /* make sure the default index gets set to _something_, if possible */ + if (*data->default_index == -1) + { + data->id = gimage; + *data->default_index = data->num_items; + } + + if (gimage == *data->def) + { + data->id = *data->def; + *data->default_index = data->num_items; + } + + image_name = g_basename (gimage_filename (gimage)); + menu_item_label = + g_strdup_printf ("%s-%d", image_name, pdb_image_to_id (gimage)); + menu_item = gtk_menu_item_new_with_label (menu_item_label); + gtk_signal_connect (GTK_OBJECT (menu_item), "activate", + (GtkSignalFunc) data->callback, gimage); + gtk_container_add (GTK_CONTAINER (data->menu), menu_item); + gtk_widget_show (menu_item); + + g_free (menu_item_label); + data->num_items ++; +} + +static GtkWidget * +lc_dialog_create_image_menu (GimpImage **def, + int *default_index, + MenuItemCallback callback) +{ + IMCBData data; + + data.def = def; + data.default_index = default_index; + data.callback = callback; + data.menu = gtk_menu_new (); + data.num_items = 0; + data.id = NULL; + + *default_index = -1; + + gimage_foreach (lc_dialog_create_image_menu_cb, &data); + + if (! data.num_items) + { + GtkWidget *menu_item; + + menu_item = gtk_menu_item_new_with_label (_("none")); + gtk_container_add (GTK_CONTAINER (data.menu), menu_item); + gtk_widget_show (menu_item); + } + + *def = data.id; + + return data.menu; +} + +static void +lc_dialog_image_menu_callback (GtkWidget *w, + gpointer client_data) +{ + if (! lc_dialog) + return; + + lc_dialog_update (GIMP_IMAGE (client_data)); + gdisplays_flush (); +} + +static void +lc_dialog_auto_callback (GtkWidget *toggle_button, + gpointer client_data) +{ + GimpImage *gimage; + + if (! lc_dialog) + return; + + lc_dialog->auto_follow_active = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button)); + + gimage = (GimpImage *) gimp_set_get_active (image_context); + + if (lc_dialog->auto_follow_active && gimage) + lc_dialog_change_image (image_context, gimage, NULL); +} + +static gint +lc_dialog_close_callback (GtkWidget *w, + gpointer client_data) +{ + if (! lc_dialog) + return TRUE; + + lc_dialog->gimage = NULL; + gtk_widget_hide (lc_dialog->shell); + + return TRUE; +} + +static void +lc_dialog_add_cb (GimpSet *set, + GimpImage *gimage, + gpointer user_data) +{ + if (! lc_dialog) + return; + + lc_dialog_update_image_list (); +} + +static void +lc_dialog_remove_cb (GimpSet *set, + GimpImage *gimage, + gpointer user_data) +{ + if (! lc_dialog) + return; + + lc_dialog_update_image_list (); +} + +static void +lc_dialog_change_image (GimpSet *set, + GimpImage *gimage, + gpointer user_data) +{ + if (lc_dialog && lc_dialog->auto_follow_active && gimage) + { + lc_dialog_update (gimage); + lc_dialog_update_image_list (); + } +} + +static void +lc_dialog_destroy_cb (GimpImage *gimage, + gpointer user_data) +{ + if (! lc_dialog) + return; + + lc_dialog_update_image_list (); +} diff --git a/app/lc_dialog.h b/app/lc_dialog.h new file mode 100644 index 0000000000..7779ed62cc --- /dev/null +++ b/app/lc_dialog.h @@ -0,0 +1,32 @@ +/* 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 __LC_DIALOG_H__ +#define __LC_DIALOG_H__ + +#include "gimpimageF.h" + +void lc_dialog_create (GimpImage *gimage); +void lc_dialog_free (void); + +void lc_dialog_rebuild (int); /* implies free & create */ + +void lc_dialog_flush (void); + +void lc_dialog_update_image_list (void); + +#endif /* __LC_DIALOG_H__ */ diff --git a/app/lc_dialogP.h b/app/lc_dialogP.h new file mode 100644 index 0000000000..80150f7318 --- /dev/null +++ b/app/lc_dialogP.h @@ -0,0 +1,57 @@ +/* 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 __LC_DIALOGP_H__ +#define __LC_DIALOGP_H__ + +typedef struct _LCDialog LCDialog; + +struct _LCDialog +{ + GtkWidget *shell; + GtkWidget *subshell; + + GtkWidget *image_menu; + GtkWidget *image_option_menu; + + GimpImage *gimage; + gboolean auto_follow_active; +}; + +GtkWidget * layers_dialog_create (void); +GtkWidget * channels_dialog_create (void); +GtkWidget * paths_dialog_create (void); + +void layers_dialog_free (void); +void channels_dialog_free (void); +void paths_dialog_free (void); + +void layers_dialog_update (GimpImage *); +void channels_dialog_update (GimpImage *); +void paths_dialog_update (GimpImage *); + +void layers_dialog_flush (void); +void channels_dialog_flush (void); +void paths_dialog_flush (void); + +void layers_dialog_clear (void); +void channels_dialog_clear (void); + +/* Main dialog structure */ +extern LCDialog *lc_dialog; + +#endif /* __LC_DIALOGP_H__ */ diff --git a/app/menus.c b/app/menus.c index 9c67fc91ac..7281eaaab9 100644 --- a/app/menus.c +++ b/app/menus.c @@ -19,13 +19,16 @@ #include #include #include "appenv.h" +#include "channels_dialog.h" #include "colormaps.h" #include "commands.h" #include "fileops.h" #include "general.h" #include "gimprc.h" #include "interface.h" +#include "layers_dialog.h" #include "menus.h" +#include "paths_dialog.h" #include "paint_funcs.h" #include "procedural_db.h" #include "scale.h" @@ -168,6 +171,7 @@ static const GtkItemFactoryEntry image_entries[] = { N_("/Layers/Alpha To Selection"), NULL, layers_alpha_select_cmd_callback, 0 }, { N_("/Layers/Mask To Selection"), NULL, layers_mask_select_cmd_callback, 0 }, { N_("/Layers/Add Alpha Channel"), NULL, layers_add_alpha_channel_cmd_callback, 0 }, + { N_("/Layers/---"), NULL, NULL, 0, "" }, /* these are built on the fly */ @@ -240,13 +244,74 @@ static const GtkItemFactoryEntry save_entries[] = static guint n_save_entries = sizeof (save_entries) / sizeof (save_entries[0]); static GtkItemFactory *save_factory = NULL; +static const GtkItemFactoryEntry layers_entries[] = +{ + { N_("/New Layer"), "N", layers_dialog_new_layer_callback, 0 }, + { N_("/Stack/Previous Layer"), "Prior", layers_dialog_previous_layer_callback, 0 }, + { N_("/Stack/Next Layer"), "Next", layers_dialog_next_layer_callback, 0 }, + { N_("/Stack/Raise Layer"), "Prior", layers_dialog_raise_layer_callback, 0 }, + { N_("/Stack/Lower Layer"), "Next", layers_dialog_lower_layer_callback, 0 }, + { N_("/Stack/Layer to Top"), "Prior", layers_dialog_raise_layer_to_top_callback, 0 }, + { N_("/Stack/Layer to Bottom"), "Next", layers_dialog_lower_layer_to_bottom_callback, 0 }, + { N_("/Duplicate Layer"), "C", layers_dialog_duplicate_layer_callback, 0 }, + { N_("/Delete Layer"), "X", layers_dialog_delete_layer_callback, 0 }, + { N_("/Anchor Layer"), "H", layers_dialog_anchor_layer_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Scale Layer"), "S", layers_dialog_scale_layer_callback, 0 }, + { N_("/Resize Layer"), "R", layers_dialog_resize_layer_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Merge Visible Layers"), "M", layers_dialog_merge_layers_callback, 0 }, + { N_("/Merge Down"), "M", layers_dialog_merge_down_callback, 0 }, + { N_("/Flatten Image"), NULL, layers_dialog_flatten_image_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Add Layer Mask"), NULL, layers_dialog_add_layer_mask_callback, 0 }, + { N_("/Apply Layer Mask"), NULL, layers_dialog_apply_layer_mask_callback, 0 }, + { N_("/Alpha to Selection"), NULL, layers_dialog_alpha_select_callback, 0 }, + { N_("/Mask to Selection"), NULL, layers_dialog_mask_select_callback, 0 }, + { N_("/Add Alpha Channel"), NULL, layers_dialog_add_alpha_channel_callback, 0 } +}; +static guint n_layers_entries = sizeof (layers_entries) / sizeof (layers_entries[0]); +static GtkItemFactory *layers_factory = NULL; + +static const GtkItemFactoryEntry channels_entries[] = +{ + { N_("/New Channel"), "N", channels_dialog_new_channel_callback, 0 }, + { N_("/Raise Channel"), "F", channels_dialog_raise_channel_callback, 0 }, + { N_("/Lower Channel"), "B", channels_dialog_lower_channel_callback, 0 }, + { N_("/Duplicate Channel"), "C", channels_dialog_duplicate_channel_callback, 0 }, + { N_("/Delete Channel"), "X", channels_dialog_delete_channel_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Channel to Selection"), "S", channels_dialog_channel_to_sel_callback, 0 }, + { N_("/Add to Selection"), NULL, channels_dialog_add_channel_to_sel_callback, 0 }, + { N_("/Subtract From Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 }, + { N_("/Intersect With Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 } +}; +static guint n_channels_entries = sizeof (channels_entries) / sizeof (channels_entries[0]); +static GtkItemFactory *channels_factory = NULL; + +static const GtkItemFactoryEntry paths_entries[] = +{ + { N_("/New Path"), "N", paths_dialog_new_path_callback, 0 }, + { N_("/Duplicate Path"), "U", paths_dialog_dup_path_callback, 0 }, + { N_("/Delete Path"), "X", paths_dialog_delete_path_callback, 0 }, + { N_("/Path to Selection"), "S", paths_dialog_path_to_sel_callback, 0 }, + { N_("/Stroke Path"), "T", paths_dialog_stroke_path_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Copy Path"), "C", paths_dialog_copy_path_callback, 0 }, + { N_("/Paste Path"), "V", paths_dialog_paste_path_callback, 0 }, + { N_("/Import Path"), "I", paths_dialog_import_path_callback, 0 }, + { N_("/Export Path"), "E", paths_dialog_export_path_callback, 0 } +}; +static guint n_paths_entries = sizeof (paths_entries) / sizeof (paths_entries[0]); +static GtkItemFactory *paths_factory = NULL; + static int initialize = TRUE; extern int num_tools; void -menus_get_toolbox_menubar (GtkWidget **menubar, - GtkAccelGroup **accel_group) +menus_get_toolbox_menubar (GtkWidget **menubar, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -258,8 +323,8 @@ menus_get_toolbox_menubar (GtkWidget **menubar, } void -menus_get_image_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_image_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -271,8 +336,8 @@ menus_get_image_menu (GtkWidget **menu, } void -menus_get_load_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_load_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -284,8 +349,8 @@ menus_get_load_menu (GtkWidget **menu, } void -menus_get_save_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_save_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -296,9 +361,48 @@ menus_get_save_menu (GtkWidget **menu, *accel_group = save_factory->accel_group; } +void +menus_get_layers_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = layers_factory->widget; + if (accel_group) + *accel_group = layers_factory->accel_group; +} + +void +menus_get_channels_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = channels_factory->widget; + if (accel_group) + *accel_group = channels_factory->accel_group; +} + +void +menus_get_paths_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = paths_factory->widget; + if (accel_group) + *accel_group = paths_factory->accel_group; +} + void menus_create (GtkMenuEntry *entries, - int nmenu_entries) + int n_menu_entries) { GtkItemFactory *ifactory; GtkWidget *menu_item; @@ -308,10 +412,10 @@ menus_create (GtkMenuEntry *entries, if (initialize) menus_init (); - gtk_item_factory_create_menu_entries (nmenu_entries, entries); + gtk_item_factory_create_menu_entries (n_menu_entries, entries); - for (i = 0; i < nmenu_entries; i++) - if (!strncmp(entries[i].path, "", 7)) + for (i = 0; i < n_menu_entries; i++) + if (! strncmp (entries[i].path, "", 7)) redo_image_menu = TRUE; if (redo_image_menu) @@ -344,7 +448,6 @@ menus_tools_create (ToolInfo *tool_info) &entry, (gpointer)tool_info, 2); - } void @@ -418,6 +521,9 @@ menus_quit (void) gtk_object_unref (GTK_OBJECT (image_factory)); gtk_object_unref (GTK_OBJECT (load_factory)); gtk_object_unref (GTK_OBJECT (save_factory)); + gtk_object_unref (GTK_OBJECT (layers_factory)); + gtk_object_unref (GTK_OBJECT (channels_factory)); + gtk_object_unref (GTK_OBJECT (paths_factory)); } } @@ -586,27 +692,29 @@ translate_entries (const GtkItemFactoryEntry *entries, gint n) gint i; GtkItemFactoryEntry *ret; - ret=g_malloc( sizeof(GtkItemFactoryEntry) * n ); - for (i=0; i", NULL); - translated_entries=translate_entries(image_entries, n_image_entries); + translated_entries = translate_entries (image_entries, n_image_entries); gtk_item_factory_create_items_ac (image_factory, n_image_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_image_entries); + free_translated_entries (translated_entries, n_image_entries); + load_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); - translated_entries=translate_entries(load_entries, n_load_entries); + translated_entries = translate_entries (load_entries, n_load_entries); gtk_item_factory_create_items_ac (load_factory, n_load_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_load_entries); + free_translated_entries (translated_entries, n_load_entries); + save_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); - translated_entries=translate_entries(load_entries, n_save_entries); + translated_entries = translate_entries (load_entries, n_save_entries); gtk_item_factory_create_items_ac (save_factory, n_save_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_save_entries); + free_translated_entries (translated_entries, n_save_entries); + + layers_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (layers_entries, n_layers_entries); + gtk_item_factory_create_items_ac (layers_factory, + n_layers_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_layers_entries); + + channels_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (channels_entries, n_channels_entries); + gtk_item_factory_create_items_ac (channels_factory, + n_channels_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_channels_entries); + + paths_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (paths_entries, n_paths_entries); + gtk_item_factory_create_items_ac (paths_factory, + n_paths_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_paths_entries); + for (i = 0; i < num_tools; i++) { /* FIXME this need to use access functions to check a flag */ if (tool_info[i].menu_path) menus_tools_create (tool_info+i); } + filename = gimp_personal_rc_file ("menurc"); gtk_item_factory_parse_rc (filename); g_free (filename); diff --git a/app/menus.h b/app/menus.h index 39d870aaa2..880d778b11 100644 --- a/app/menus.h +++ b/app/menus.h @@ -18,27 +18,34 @@ #ifndef __MENUS_H__ #define __MENUS_H__ - #include "gtk/gtk.h" +void menus_get_toolbox_menubar (GtkWidget **menubar, + GtkAccelGroup **accel_group); +void menus_get_image_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_load_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_save_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_layers_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_channels_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_paths_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); + +void menus_create (GtkMenuEntry *entries, + gint n_menu_entries); +void menus_destroy (gchar *path); -void menus_get_toolbox_menubar (GtkWidget **menubar, - GtkAccelGroup **accel_group); -void menus_get_image_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_get_load_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_get_save_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_create (GtkMenuEntry *entries, - int nmenu_entries); -void menus_set_sensitive (char *path, - int sensitive); -void menus_set_state (char *path, - int state); -void menus_destroy (char *path); void menus_quit (void); -void menus_last_opened_add (gchar *filename); +void menus_set_sensitive (gchar *path, + gint sensitive); +void menus_set_state (gchar *path, + gint state); -#endif /* MENUS_H */ +void menus_last_opened_add (gchar *filename); + +#endif /* __MENUS_H__ */ diff --git a/app/menus/menus.c b/app/menus/menus.c index 9c67fc91ac..7281eaaab9 100644 --- a/app/menus/menus.c +++ b/app/menus/menus.c @@ -19,13 +19,16 @@ #include #include #include "appenv.h" +#include "channels_dialog.h" #include "colormaps.h" #include "commands.h" #include "fileops.h" #include "general.h" #include "gimprc.h" #include "interface.h" +#include "layers_dialog.h" #include "menus.h" +#include "paths_dialog.h" #include "paint_funcs.h" #include "procedural_db.h" #include "scale.h" @@ -168,6 +171,7 @@ static const GtkItemFactoryEntry image_entries[] = { N_("/Layers/Alpha To Selection"), NULL, layers_alpha_select_cmd_callback, 0 }, { N_("/Layers/Mask To Selection"), NULL, layers_mask_select_cmd_callback, 0 }, { N_("/Layers/Add Alpha Channel"), NULL, layers_add_alpha_channel_cmd_callback, 0 }, + { N_("/Layers/---"), NULL, NULL, 0, "" }, /* these are built on the fly */ @@ -240,13 +244,74 @@ static const GtkItemFactoryEntry save_entries[] = static guint n_save_entries = sizeof (save_entries) / sizeof (save_entries[0]); static GtkItemFactory *save_factory = NULL; +static const GtkItemFactoryEntry layers_entries[] = +{ + { N_("/New Layer"), "N", layers_dialog_new_layer_callback, 0 }, + { N_("/Stack/Previous Layer"), "Prior", layers_dialog_previous_layer_callback, 0 }, + { N_("/Stack/Next Layer"), "Next", layers_dialog_next_layer_callback, 0 }, + { N_("/Stack/Raise Layer"), "Prior", layers_dialog_raise_layer_callback, 0 }, + { N_("/Stack/Lower Layer"), "Next", layers_dialog_lower_layer_callback, 0 }, + { N_("/Stack/Layer to Top"), "Prior", layers_dialog_raise_layer_to_top_callback, 0 }, + { N_("/Stack/Layer to Bottom"), "Next", layers_dialog_lower_layer_to_bottom_callback, 0 }, + { N_("/Duplicate Layer"), "C", layers_dialog_duplicate_layer_callback, 0 }, + { N_("/Delete Layer"), "X", layers_dialog_delete_layer_callback, 0 }, + { N_("/Anchor Layer"), "H", layers_dialog_anchor_layer_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Scale Layer"), "S", layers_dialog_scale_layer_callback, 0 }, + { N_("/Resize Layer"), "R", layers_dialog_resize_layer_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Merge Visible Layers"), "M", layers_dialog_merge_layers_callback, 0 }, + { N_("/Merge Down"), "M", layers_dialog_merge_down_callback, 0 }, + { N_("/Flatten Image"), NULL, layers_dialog_flatten_image_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Add Layer Mask"), NULL, layers_dialog_add_layer_mask_callback, 0 }, + { N_("/Apply Layer Mask"), NULL, layers_dialog_apply_layer_mask_callback, 0 }, + { N_("/Alpha to Selection"), NULL, layers_dialog_alpha_select_callback, 0 }, + { N_("/Mask to Selection"), NULL, layers_dialog_mask_select_callback, 0 }, + { N_("/Add Alpha Channel"), NULL, layers_dialog_add_alpha_channel_callback, 0 } +}; +static guint n_layers_entries = sizeof (layers_entries) / sizeof (layers_entries[0]); +static GtkItemFactory *layers_factory = NULL; + +static const GtkItemFactoryEntry channels_entries[] = +{ + { N_("/New Channel"), "N", channels_dialog_new_channel_callback, 0 }, + { N_("/Raise Channel"), "F", channels_dialog_raise_channel_callback, 0 }, + { N_("/Lower Channel"), "B", channels_dialog_lower_channel_callback, 0 }, + { N_("/Duplicate Channel"), "C", channels_dialog_duplicate_channel_callback, 0 }, + { N_("/Delete Channel"), "X", channels_dialog_delete_channel_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Channel to Selection"), "S", channels_dialog_channel_to_sel_callback, 0 }, + { N_("/Add to Selection"), NULL, channels_dialog_add_channel_to_sel_callback, 0 }, + { N_("/Subtract From Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 }, + { N_("/Intersect With Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 } +}; +static guint n_channels_entries = sizeof (channels_entries) / sizeof (channels_entries[0]); +static GtkItemFactory *channels_factory = NULL; + +static const GtkItemFactoryEntry paths_entries[] = +{ + { N_("/New Path"), "N", paths_dialog_new_path_callback, 0 }, + { N_("/Duplicate Path"), "U", paths_dialog_dup_path_callback, 0 }, + { N_("/Delete Path"), "X", paths_dialog_delete_path_callback, 0 }, + { N_("/Path to Selection"), "S", paths_dialog_path_to_sel_callback, 0 }, + { N_("/Stroke Path"), "T", paths_dialog_stroke_path_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Copy Path"), "C", paths_dialog_copy_path_callback, 0 }, + { N_("/Paste Path"), "V", paths_dialog_paste_path_callback, 0 }, + { N_("/Import Path"), "I", paths_dialog_import_path_callback, 0 }, + { N_("/Export Path"), "E", paths_dialog_export_path_callback, 0 } +}; +static guint n_paths_entries = sizeof (paths_entries) / sizeof (paths_entries[0]); +static GtkItemFactory *paths_factory = NULL; + static int initialize = TRUE; extern int num_tools; void -menus_get_toolbox_menubar (GtkWidget **menubar, - GtkAccelGroup **accel_group) +menus_get_toolbox_menubar (GtkWidget **menubar, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -258,8 +323,8 @@ menus_get_toolbox_menubar (GtkWidget **menubar, } void -menus_get_image_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_image_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -271,8 +336,8 @@ menus_get_image_menu (GtkWidget **menu, } void -menus_get_load_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_load_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -284,8 +349,8 @@ menus_get_load_menu (GtkWidget **menu, } void -menus_get_save_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_save_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -296,9 +361,48 @@ menus_get_save_menu (GtkWidget **menu, *accel_group = save_factory->accel_group; } +void +menus_get_layers_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = layers_factory->widget; + if (accel_group) + *accel_group = layers_factory->accel_group; +} + +void +menus_get_channels_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = channels_factory->widget; + if (accel_group) + *accel_group = channels_factory->accel_group; +} + +void +menus_get_paths_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = paths_factory->widget; + if (accel_group) + *accel_group = paths_factory->accel_group; +} + void menus_create (GtkMenuEntry *entries, - int nmenu_entries) + int n_menu_entries) { GtkItemFactory *ifactory; GtkWidget *menu_item; @@ -308,10 +412,10 @@ menus_create (GtkMenuEntry *entries, if (initialize) menus_init (); - gtk_item_factory_create_menu_entries (nmenu_entries, entries); + gtk_item_factory_create_menu_entries (n_menu_entries, entries); - for (i = 0; i < nmenu_entries; i++) - if (!strncmp(entries[i].path, "", 7)) + for (i = 0; i < n_menu_entries; i++) + if (! strncmp (entries[i].path, "", 7)) redo_image_menu = TRUE; if (redo_image_menu) @@ -344,7 +448,6 @@ menus_tools_create (ToolInfo *tool_info) &entry, (gpointer)tool_info, 2); - } void @@ -418,6 +521,9 @@ menus_quit (void) gtk_object_unref (GTK_OBJECT (image_factory)); gtk_object_unref (GTK_OBJECT (load_factory)); gtk_object_unref (GTK_OBJECT (save_factory)); + gtk_object_unref (GTK_OBJECT (layers_factory)); + gtk_object_unref (GTK_OBJECT (channels_factory)); + gtk_object_unref (GTK_OBJECT (paths_factory)); } } @@ -586,27 +692,29 @@ translate_entries (const GtkItemFactoryEntry *entries, gint n) gint i; GtkItemFactoryEntry *ret; - ret=g_malloc( sizeof(GtkItemFactoryEntry) * n ); - for (i=0; i", NULL); - translated_entries=translate_entries(image_entries, n_image_entries); + translated_entries = translate_entries (image_entries, n_image_entries); gtk_item_factory_create_items_ac (image_factory, n_image_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_image_entries); + free_translated_entries (translated_entries, n_image_entries); + load_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); - translated_entries=translate_entries(load_entries, n_load_entries); + translated_entries = translate_entries (load_entries, n_load_entries); gtk_item_factory_create_items_ac (load_factory, n_load_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_load_entries); + free_translated_entries (translated_entries, n_load_entries); + save_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); - translated_entries=translate_entries(load_entries, n_save_entries); + translated_entries = translate_entries (load_entries, n_save_entries); gtk_item_factory_create_items_ac (save_factory, n_save_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_save_entries); + free_translated_entries (translated_entries, n_save_entries); + + layers_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (layers_entries, n_layers_entries); + gtk_item_factory_create_items_ac (layers_factory, + n_layers_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_layers_entries); + + channels_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (channels_entries, n_channels_entries); + gtk_item_factory_create_items_ac (channels_factory, + n_channels_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_channels_entries); + + paths_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (paths_entries, n_paths_entries); + gtk_item_factory_create_items_ac (paths_factory, + n_paths_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_paths_entries); + for (i = 0; i < num_tools; i++) { /* FIXME this need to use access functions to check a flag */ if (tool_info[i].menu_path) menus_tools_create (tool_info+i); } + filename = gimp_personal_rc_file ("menurc"); gtk_item_factory_parse_rc (filename); g_free (filename); diff --git a/app/menus/menus.h b/app/menus/menus.h index 39d870aaa2..880d778b11 100644 --- a/app/menus/menus.h +++ b/app/menus/menus.h @@ -18,27 +18,34 @@ #ifndef __MENUS_H__ #define __MENUS_H__ - #include "gtk/gtk.h" +void menus_get_toolbox_menubar (GtkWidget **menubar, + GtkAccelGroup **accel_group); +void menus_get_image_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_load_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_save_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_layers_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_channels_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_paths_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); + +void menus_create (GtkMenuEntry *entries, + gint n_menu_entries); +void menus_destroy (gchar *path); -void menus_get_toolbox_menubar (GtkWidget **menubar, - GtkAccelGroup **accel_group); -void menus_get_image_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_get_load_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_get_save_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_create (GtkMenuEntry *entries, - int nmenu_entries); -void menus_set_sensitive (char *path, - int sensitive); -void menus_set_state (char *path, - int state); -void menus_destroy (char *path); void menus_quit (void); -void menus_last_opened_add (gchar *filename); +void menus_set_sensitive (gchar *path, + gint sensitive); +void menus_set_state (gchar *path, + gint state); -#endif /* MENUS_H */ +void menus_last_opened_add (gchar *filename); + +#endif /* __MENUS_H__ */ diff --git a/app/paint_core.c b/app/paint_core.c index e2f2e48a45..e06baaef6c 100644 --- a/app/paint_core.c +++ b/app/paint_core.c @@ -21,14 +21,12 @@ #include #include "appenv.h" #include "gimpbrushlist.h" -#include "channels_dialog.h" #include "drawable.h" #include "errors.h" #include "gdisplay.h" #include "gimage_mask.h" #include "gimprc.h" #include "gradient.h" /* for grad_get_color_at() */ -#include "layers_dialog.h" #include "paint_funcs.h" #include "paint_core.h" #include "palette.h" diff --git a/app/paths_dialog.c b/app/paths_dialog.c index 7a01be97c8..f734a2eefc 100644 --- a/app/paths_dialog.c +++ b/app/paths_dialog.c @@ -16,7 +16,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Some of this code is based on the layers_dialog box code. */ - #include "config.h" #include @@ -28,7 +27,6 @@ #include "appenv.h" #include "draw_core.h" #include "actionarea.h" -#include "buildmenu.h" #include "colormaps.h" #include "drawable.h" #include "errors.h" @@ -41,18 +39,18 @@ #include "general.h" #include "image_render.h" #include "interface.h" -#include "layers_dialog.h" -#include "layers_dialogP.h" +#include "lc_dialogP.h" +#include "menus.h" #include "ops_buttons.h" #include "paint_funcs.h" #include "bezier_select.h" #include "bezier_selectP.h" #include "pathsP.h" #include "paths_dialog.h" +#include "paths_dialogP.h" #include "resize.h" #include "session.h" #include "undo.h" -#include "libgimp/gimpmatrix.h" #include "libgimp/gimpintl.h" @@ -72,9 +70,10 @@ #define rint(x) floor (x + 0.5) #endif -#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK +#define PREVIEW_EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | \ + GDK_ENTER_NOTIFY_MASK -#define PATHS_LIST_WIDTH 200 +#define PATHS_LIST_WIDTH 200 #define PATHS_LIST_HEIGHT 150 typedef struct { @@ -129,15 +128,8 @@ static void paths_dialog_realized (GtkWidget *widget); static void paths_select_row (GtkWidget *widget,gint row,gint column,GdkEventButton *event,gpointer data); static void paths_unselect_row (GtkWidget *widget,gint row,gint column,GdkEventButton *event,gpointer data); static gint paths_list_events (GtkWidget *widget,GdkEvent *event); -static void paths_dialog_new_path_callback (GtkWidget *, gpointer); -static void paths_dialog_delete_path_callback (GtkWidget *, gpointer); static void paths_dialog_map_callback (GtkWidget *w,gpointer client_data); static void paths_dialog_unmap_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_dup_path_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_copy_path_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_paste_path_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_stroke_path_callback(GtkWidget *w,gpointer client_data); -static void paths_dialog_path_to_sel_callback(GtkWidget *w,gpointer client_data); static void paths_dialog_destroy_cb (GimpImage *image); static void paths_update_paths(gpointer data,gint row); static GSList * pathpoints_copy(GSList *list); @@ -148,55 +140,29 @@ static void paths_dialog_new_point_callback (GtkWidget *, gpointer); static void paths_dialog_add_point_callback (GtkWidget *, gpointer); static void paths_dialog_delete_point_callback (GtkWidget *, gpointer); static void paths_dialog_edit_point_callback (GtkWidget *, gpointer); -static void paths_dialog_import_path_callback (GtkWidget *, gpointer); -static void paths_dialog_export_path_callback (GtkWidget *, gpointer); static void path_close(PATHP); - -static MenuItem paths_ops[] = -{ - { N_("New Path"), 'N', GDK_CONTROL_MASK, - paths_dialog_new_path_callback, NULL, NULL, NULL }, - { N_("Duplicate Path"), 'U', GDK_CONTROL_MASK, - paths_dialog_dup_path_callback, NULL, NULL, NULL }, - { N_("Path to Selection"), 'S', GDK_CONTROL_MASK, - paths_dialog_path_to_sel_callback, NULL, NULL, NULL }, - { N_("Stroke Path"), 'T', GDK_CONTROL_MASK, - paths_dialog_stroke_path_callback, NULL, NULL, NULL }, - { N_("Delete Path"), 'D', GDK_CONTROL_MASK, - paths_dialog_delete_path_callback, NULL, NULL, NULL }, - { N_("Import Path"), 'I', GDK_CONTROL_MASK, - paths_dialog_import_path_callback, NULL, NULL, NULL }, - { N_("Export Path"), 'E', GDK_CONTROL_MASK, - paths_dialog_export_path_callback, NULL, NULL, NULL }, - { N_("Copy Path"), 'C', GDK_CONTROL_MASK, - paths_dialog_copy_path_callback, NULL, NULL, NULL }, - { N_("Paste Path"), 'P', GDK_CONTROL_MASK, - paths_dialog_paste_path_callback, NULL, NULL, NULL }, - { NULL, 0, 0, NULL, NULL, NULL, NULL } -}; - -#define NEW_PATH_BUTTON 1 -#define DUP_PATH_BUTTON 2 -#define PATH_TO_SEL_BUTTON 3 -#define STROKE_PATH_BUTTON 4 -#define DEL_PATH_BUTTON 5 -#define COPY_PATH_BUTTON 8 -#define PASTE_PATH_BUTTON 9 +#define NEW_PATH_BUTTON 1 +#define DUP_PATH_BUTTON 2 +#define DEL_PATH_BUTTON 3 +#define PATH_TO_SEL_BUTTON 4 +#define STROKE_PATH_BUTTON 5 +#define COPY_PATH_BUTTON 8 +#define PASTE_PATH_BUTTON 9 static OpsButton paths_ops_buttons[] = { { new_xpm, paths_dialog_new_path_callback, NULL, N_("New Path"), NULL, 0 }, { duplicate_xpm, paths_dialog_dup_path_callback, NULL, N_("Duplicate Path"), NULL, 0 }, + { delete_xpm, paths_dialog_delete_path_callback, NULL, N_("Delete Path"), NULL, 0 }, { toselection_xpm, paths_dialog_path_to_sel_callback, NULL, N_("Path to Selection"), NULL, 0 }, { penstroke_xpm, paths_dialog_stroke_path_callback, NULL, N_("Stroke Path"), NULL, 0 }, - { delete_xpm, paths_dialog_delete_path_callback, NULL, N_("Delete Path"), NULL, 0 }, { NULL, NULL, NULL, NULL, NULL, 0 } }; -#define POINT_NEW_BUTTON 1 -#define POINT_ADD_BUTTON 2 -#define POINT_DEL_BUTTON 3 +#define POINT_NEW_BUTTON 1 +#define POINT_ADD_BUTTON 2 +#define POINT_DEL_BUTTON 3 #define POINT_EDIT_BUTTON 4 static OpsButton point_ops_buttons[] = @@ -209,35 +175,36 @@ static OpsButton point_ops_buttons[] = }; static void -paths_ops_button_set_sensitive(gint but,gboolean sensitive) +paths_ops_button_set_sensitive (gint but, + gboolean sensitive) { switch(but) { case NEW_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[0].widget,sensitive); + menus_set_sensitive (_("/New Path"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[0].widget,sensitive); break; case DUP_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[1].widget,sensitive); + menus_set_sensitive (_("/Duplicate Path"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[1].widget,sensitive); break; - case PATH_TO_SEL_BUTTON: - gtk_widget_set_sensitive(paths_ops[2].widget,sensitive); + case DEL_PATH_BUTTON: + menus_set_sensitive (_("/Delete Path"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[2].widget,sensitive); break; - case STROKE_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[3].widget,sensitive); + case PATH_TO_SEL_BUTTON: + menus_set_sensitive (_("/Path to Selection"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[3].widget,sensitive); break; - case DEL_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[4].widget,sensitive); + case STROKE_PATH_BUTTON: + menus_set_sensitive (_("/Stroke Path"), sensitive); gtk_widget_set_sensitive(paths_ops_buttons[4].widget,sensitive); break; case COPY_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[7].widget,sensitive); + menus_set_sensitive (_("/Copy Path"), sensitive); break; case PASTE_PATH_BUTTON: - gtk_widget_set_sensitive(paths_ops[8].widget,sensitive); + menus_set_sensitive (_("/Paste Path"), sensitive); break; default: g_warning(_("paths_ops_button_set_sensitive:: invalid button specified")); @@ -289,10 +256,8 @@ GtkWidget * paths_dialog_create() paths_dialog->vbox = vbox = gtk_vbox_new (FALSE, 1); /* The point operations */ - button_box = ops_button_box_new (lc_shell, - tool_tips, - point_ops_buttons, - OPS_BUTTON_RADIO); + button_box = ops_button_box_new (lc_dialog->shell, tool_tips, + point_ops_buttons, OPS_BUTTON_RADIO); gtk_container_set_border_width(GTK_CONTAINER(button_box),7); @@ -345,19 +310,16 @@ GtkWidget * paths_dialog_create() gtk_widget_show (vbox); - /* The ops buttons */ - - button_box = ops_button_box_new (lc_shell, - tool_tips, - paths_ops_buttons, - OPS_BUTTON_NORMAL); - + /* The ops buttons */ + button_box = ops_button_box_new (lc_dialog->shell, tool_tips, + paths_ops_buttons, OPS_BUTTON_NORMAL); gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); gtk_widget_show (button_box); - /* Set up signals for map/unmap for the accelerators */ - paths_dialog->accel_group = gtk_accel_group_new (); + menus_get_paths_menu (&paths_dialog->ops_menu, + &paths_dialog->accel_group); + /* Set up signals for map/unmap for the accelerators */ gtk_signal_connect (GTK_OBJECT (vbox), "map", (GtkSignalFunc) paths_dialog_map_callback, NULL); @@ -365,7 +327,6 @@ GtkWidget * paths_dialog_create() (GtkSignalFunc) paths_dialog_unmap_callback, NULL); - paths_dialog->ops_menu = build_menu (paths_ops,paths_dialog->accel_group); paths_ops_button_set_sensitive(DUP_PATH_BUTTON,FALSE); paths_ops_button_set_sensitive(DEL_PATH_BUTTON,FALSE); paths_ops_button_set_sensitive(STROKE_PATH_BUTTON,FALSE); @@ -1312,7 +1273,7 @@ paths_dialog_new_path(PATHIMAGELISTP *plp,gpointer points,GimpImage *gimage,gint return(bzp); } -static void +void paths_dialog_new_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp = paths_dialog_new_path(&paths_dialog->current_path_list, @@ -1333,7 +1294,7 @@ paths_dialog_new_path_callback (GtkWidget * widget, gpointer udata) point_ops_button_set_sensitive(POINT_EDIT_BUTTON,TRUE); } -static void +void paths_dialog_delete_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1383,7 +1344,7 @@ paths_dialog_delete_path_callback (GtkWidget * widget, gpointer udata) } -static void +void paths_dialog_paste_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1442,7 +1403,7 @@ paths_dialog_paste_path_callback (GtkWidget * widget, gpointer udata) paths_dialog->current_path_list->last_selected_row = tmprow; } -static void +void paths_dialog_copy_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1472,7 +1433,7 @@ paths_dialog_copy_path_callback (GtkWidget * widget, gpointer udata) paths_ops_button_set_sensitive(PASTE_PATH_BUTTON,TRUE); } -static void +void paths_dialog_dup_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1505,7 +1466,7 @@ paths_dialog_dup_path_callback (GtkWidget * widget, gpointer udata) paths_dialog->current_path_list->last_selected_row = tmprow; } -static void +void paths_dialog_path_to_sel_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1555,7 +1516,7 @@ paths_dialog_path_to_sel_callback (GtkWidget * widget, gpointer udata) } } -static void +void paths_dialog_stroke_path_callback (GtkWidget * widget, gpointer udata) { PATHP bzp; @@ -1583,7 +1544,7 @@ paths_dialog_map_callback (GtkWidget *w, if (!paths_dialog) return; - gtk_window_add_accel_group (GTK_WINDOW (gtk_widget_get_toplevel(paths_dialog->paths_list)), + gtk_window_add_accel_group (GTK_WINDOW (lc_dialog->shell), paths_dialog->accel_group); paths_dialog_preview_extents (); @@ -1596,7 +1557,7 @@ paths_dialog_unmap_callback (GtkWidget *w, if (!paths_dialog) return; - gtk_window_remove_accel_group (GTK_WINDOW (gtk_widget_get_toplevel(paths_dialog->paths_list)), + gtk_window_remove_accel_group (GTK_WINDOW (lc_dialog->shell), paths_dialog->accel_group); } @@ -2250,7 +2211,7 @@ path_store_callback() gtk_widget_show (file_dlg); } -static void +void paths_dialog_import_path_callback (GtkWidget * widget, gpointer udata) { /* Read and add at current position */ @@ -2258,7 +2219,7 @@ paths_dialog_import_path_callback (GtkWidget * widget, gpointer udata) } -static void +void paths_dialog_export_path_callback (GtkWidget * widget, gpointer udata) { /* Export the path to a file */ diff --git a/app/paths_dialog.h b/app/paths_dialog.h index c93cd7ef53..9ae20d3d88 100644 --- a/app/paths_dialog.h +++ b/app/paths_dialog.h @@ -15,18 +15,17 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - #ifndef __PATHS_DIALOG_H__ #define __PATHS_DIALOG_H__ -GtkWidget * paths_dialog_create(void); -void paths_dialog_update (GimpImage*); -void paths_newpoint_current(BezierSelect *, GDisplay *); -void paths_first_button_press(BezierSelect *,GDisplay *); -void paths_new_bezier_select_tool(void); -PATHP paths_get_bzpaths(void); -void paths_set_bzpaths(GImage*,PATHP); -void paths_dialog_flush(void); +void paths_dialog_new_path_callback (GtkWidget *, gpointer); +void paths_dialog_delete_path_callback (GtkWidget *, gpointer); +void paths_dialog_dup_path_callback (GtkWidget *, gpointer); +void paths_dialog_copy_path_callback (GtkWidget *, gpointer); +void paths_dialog_paste_path_callback (GtkWidget *, gpointer); +void paths_dialog_stroke_path_callback (GtkWidget *, gpointer); +void paths_dialog_path_to_sel_callback (GtkWidget *, gpointer); +void paths_dialog_import_path_callback (GtkWidget *, gpointer); +void paths_dialog_export_path_callback (GtkWidget *, gpointer); #endif /* __PATHS_DIALOG_H__ */ diff --git a/app/paths_dialogP.h b/app/paths_dialogP.h new file mode 100644 index 0000000000..75f085a983 --- /dev/null +++ b/app/paths_dialogP.h @@ -0,0 +1,27 @@ +/* The GIMP -- an image manipulation program + * Copyright (C) 1999 Andy Thomas alt@picnic.demon.co.uk + * + * 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 __PATHS_DIALOG_P_H__ +#define __PATHS_DIALOG_P_H__ + +void paths_newpoint_current (BezierSelect *, GDisplay *); +void paths_first_button_press (BezierSelect *, GDisplay *); +void paths_new_bezier_select_tool (void); +PATHP paths_get_bzpaths (void); +void paths_set_bzpaths (GImage*, PATHP); + +#endif /* __PATHS_DIALOG_P_H__ */ diff --git a/app/preferences_dialog.c b/app/preferences_dialog.c index 36debe3416..c0b2313ac6 100644 --- a/app/preferences_dialog.c +++ b/app/preferences_dialog.c @@ -23,7 +23,7 @@ #include "gimprc.h" #include "image_render.h" #include "interface.h" -#include "layers_dialog.h" +#include "lc_dialog.h" #include "layer_select.h" #include "paint_options.h" #include "session.h" diff --git a/app/tools/bezier_select.c b/app/tools/bezier_select.c index 6805664acb..03dab7986f 100644 --- a/app/tools/bezier_select.c +++ b/app/tools/bezier_select.c @@ -34,7 +34,7 @@ #include "actionarea.h" #include "bezier_select.h" #include "bezier_selectP.h" -#include "paths_dialog.h" +#include "paths_dialogP.h" #include "selection_options.h" #include "libgimp/gimpintl.h" diff --git a/app/tools/paint_core.c b/app/tools/paint_core.c index e2f2e48a45..e06baaef6c 100644 --- a/app/tools/paint_core.c +++ b/app/tools/paint_core.c @@ -21,14 +21,12 @@ #include #include "appenv.h" #include "gimpbrushlist.h" -#include "channels_dialog.h" #include "drawable.h" #include "errors.h" #include "gdisplay.h" #include "gimage_mask.h" #include "gimprc.h" #include "gradient.h" /* for grad_get_color_at() */ -#include "layers_dialog.h" #include "paint_funcs.h" #include "paint_core.h" #include "palette.h" diff --git a/app/tools/transform_core.c b/app/tools/transform_core.c index 8da4a9d12f..43f101fb5c 100644 --- a/app/tools/transform_core.c +++ b/app/tools/transform_core.c @@ -29,7 +29,6 @@ #include "gimprc.h" #include "info_dialog.h" #include "interface.h" -#include "layers_dialog.h" #include "palette.h" #include "transform_core.h" #include "transform_tool.h" diff --git a/app/transform_core.c b/app/transform_core.c index 8da4a9d12f..43f101fb5c 100644 --- a/app/transform_core.c +++ b/app/transform_core.c @@ -29,7 +29,6 @@ #include "gimprc.h" #include "info_dialog.h" #include "interface.h" -#include "layers_dialog.h" #include "palette.h" #include "transform_core.h" #include "transform_tool.h" diff --git a/app/undo.c b/app/undo.c index 7308b7106a..2f14b75e94 100644 --- a/app/undo.c +++ b/app/undo.c @@ -20,7 +20,6 @@ #include "appenv.h" #include "by_color_select.h" #include "channel.h" -#include "channels_dialog.h" #include "drawable.h" #include "errors.h" #include "floating_sel.h" diff --git a/app/widgets/gimpitemfactory.c b/app/widgets/gimpitemfactory.c index 9c67fc91ac..7281eaaab9 100644 --- a/app/widgets/gimpitemfactory.c +++ b/app/widgets/gimpitemfactory.c @@ -19,13 +19,16 @@ #include #include #include "appenv.h" +#include "channels_dialog.h" #include "colormaps.h" #include "commands.h" #include "fileops.h" #include "general.h" #include "gimprc.h" #include "interface.h" +#include "layers_dialog.h" #include "menus.h" +#include "paths_dialog.h" #include "paint_funcs.h" #include "procedural_db.h" #include "scale.h" @@ -168,6 +171,7 @@ static const GtkItemFactoryEntry image_entries[] = { N_("/Layers/Alpha To Selection"), NULL, layers_alpha_select_cmd_callback, 0 }, { N_("/Layers/Mask To Selection"), NULL, layers_mask_select_cmd_callback, 0 }, { N_("/Layers/Add Alpha Channel"), NULL, layers_add_alpha_channel_cmd_callback, 0 }, + { N_("/Layers/---"), NULL, NULL, 0, "" }, /* these are built on the fly */ @@ -240,13 +244,74 @@ static const GtkItemFactoryEntry save_entries[] = static guint n_save_entries = sizeof (save_entries) / sizeof (save_entries[0]); static GtkItemFactory *save_factory = NULL; +static const GtkItemFactoryEntry layers_entries[] = +{ + { N_("/New Layer"), "N", layers_dialog_new_layer_callback, 0 }, + { N_("/Stack/Previous Layer"), "Prior", layers_dialog_previous_layer_callback, 0 }, + { N_("/Stack/Next Layer"), "Next", layers_dialog_next_layer_callback, 0 }, + { N_("/Stack/Raise Layer"), "Prior", layers_dialog_raise_layer_callback, 0 }, + { N_("/Stack/Lower Layer"), "Next", layers_dialog_lower_layer_callback, 0 }, + { N_("/Stack/Layer to Top"), "Prior", layers_dialog_raise_layer_to_top_callback, 0 }, + { N_("/Stack/Layer to Bottom"), "Next", layers_dialog_lower_layer_to_bottom_callback, 0 }, + { N_("/Duplicate Layer"), "C", layers_dialog_duplicate_layer_callback, 0 }, + { N_("/Delete Layer"), "X", layers_dialog_delete_layer_callback, 0 }, + { N_("/Anchor Layer"), "H", layers_dialog_anchor_layer_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Scale Layer"), "S", layers_dialog_scale_layer_callback, 0 }, + { N_("/Resize Layer"), "R", layers_dialog_resize_layer_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Merge Visible Layers"), "M", layers_dialog_merge_layers_callback, 0 }, + { N_("/Merge Down"), "M", layers_dialog_merge_down_callback, 0 }, + { N_("/Flatten Image"), NULL, layers_dialog_flatten_image_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Add Layer Mask"), NULL, layers_dialog_add_layer_mask_callback, 0 }, + { N_("/Apply Layer Mask"), NULL, layers_dialog_apply_layer_mask_callback, 0 }, + { N_("/Alpha to Selection"), NULL, layers_dialog_alpha_select_callback, 0 }, + { N_("/Mask to Selection"), NULL, layers_dialog_mask_select_callback, 0 }, + { N_("/Add Alpha Channel"), NULL, layers_dialog_add_alpha_channel_callback, 0 } +}; +static guint n_layers_entries = sizeof (layers_entries) / sizeof (layers_entries[0]); +static GtkItemFactory *layers_factory = NULL; + +static const GtkItemFactoryEntry channels_entries[] = +{ + { N_("/New Channel"), "N", channels_dialog_new_channel_callback, 0 }, + { N_("/Raise Channel"), "F", channels_dialog_raise_channel_callback, 0 }, + { N_("/Lower Channel"), "B", channels_dialog_lower_channel_callback, 0 }, + { N_("/Duplicate Channel"), "C", channels_dialog_duplicate_channel_callback, 0 }, + { N_("/Delete Channel"), "X", channels_dialog_delete_channel_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Channel to Selection"), "S", channels_dialog_channel_to_sel_callback, 0 }, + { N_("/Add to Selection"), NULL, channels_dialog_add_channel_to_sel_callback, 0 }, + { N_("/Subtract From Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 }, + { N_("/Intersect With Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 } +}; +static guint n_channels_entries = sizeof (channels_entries) / sizeof (channels_entries[0]); +static GtkItemFactory *channels_factory = NULL; + +static const GtkItemFactoryEntry paths_entries[] = +{ + { N_("/New Path"), "N", paths_dialog_new_path_callback, 0 }, + { N_("/Duplicate Path"), "U", paths_dialog_dup_path_callback, 0 }, + { N_("/Delete Path"), "X", paths_dialog_delete_path_callback, 0 }, + { N_("/Path to Selection"), "S", paths_dialog_path_to_sel_callback, 0 }, + { N_("/Stroke Path"), "T", paths_dialog_stroke_path_callback, 0 }, + { "/---", NULL, NULL, 0, "" }, + { N_("/Copy Path"), "C", paths_dialog_copy_path_callback, 0 }, + { N_("/Paste Path"), "V", paths_dialog_paste_path_callback, 0 }, + { N_("/Import Path"), "I", paths_dialog_import_path_callback, 0 }, + { N_("/Export Path"), "E", paths_dialog_export_path_callback, 0 } +}; +static guint n_paths_entries = sizeof (paths_entries) / sizeof (paths_entries[0]); +static GtkItemFactory *paths_factory = NULL; + static int initialize = TRUE; extern int num_tools; void -menus_get_toolbox_menubar (GtkWidget **menubar, - GtkAccelGroup **accel_group) +menus_get_toolbox_menubar (GtkWidget **menubar, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -258,8 +323,8 @@ menus_get_toolbox_menubar (GtkWidget **menubar, } void -menus_get_image_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_image_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -271,8 +336,8 @@ menus_get_image_menu (GtkWidget **menu, } void -menus_get_load_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_load_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -284,8 +349,8 @@ menus_get_load_menu (GtkWidget **menu, } void -menus_get_save_menu (GtkWidget **menu, - GtkAccelGroup **accel_group) +menus_get_save_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) { if (initialize) menus_init (); @@ -296,9 +361,48 @@ menus_get_save_menu (GtkWidget **menu, *accel_group = save_factory->accel_group; } +void +menus_get_layers_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = layers_factory->widget; + if (accel_group) + *accel_group = layers_factory->accel_group; +} + +void +menus_get_channels_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = channels_factory->widget; + if (accel_group) + *accel_group = channels_factory->accel_group; +} + +void +menus_get_paths_menu (GtkWidget **menu, + GtkAccelGroup **accel_group) +{ + if (initialize) + menus_init (); + + if (menu) + *menu = paths_factory->widget; + if (accel_group) + *accel_group = paths_factory->accel_group; +} + void menus_create (GtkMenuEntry *entries, - int nmenu_entries) + int n_menu_entries) { GtkItemFactory *ifactory; GtkWidget *menu_item; @@ -308,10 +412,10 @@ menus_create (GtkMenuEntry *entries, if (initialize) menus_init (); - gtk_item_factory_create_menu_entries (nmenu_entries, entries); + gtk_item_factory_create_menu_entries (n_menu_entries, entries); - for (i = 0; i < nmenu_entries; i++) - if (!strncmp(entries[i].path, "", 7)) + for (i = 0; i < n_menu_entries; i++) + if (! strncmp (entries[i].path, "", 7)) redo_image_menu = TRUE; if (redo_image_menu) @@ -344,7 +448,6 @@ menus_tools_create (ToolInfo *tool_info) &entry, (gpointer)tool_info, 2); - } void @@ -418,6 +521,9 @@ menus_quit (void) gtk_object_unref (GTK_OBJECT (image_factory)); gtk_object_unref (GTK_OBJECT (load_factory)); gtk_object_unref (GTK_OBJECT (save_factory)); + gtk_object_unref (GTK_OBJECT (layers_factory)); + gtk_object_unref (GTK_OBJECT (channels_factory)); + gtk_object_unref (GTK_OBJECT (paths_factory)); } } @@ -586,27 +692,29 @@ translate_entries (const GtkItemFactoryEntry *entries, gint n) gint i; GtkItemFactoryEntry *ret; - ret=g_malloc( sizeof(GtkItemFactoryEntry) * n ); - for (i=0; i", NULL); - translated_entries=translate_entries(image_entries, n_image_entries); + translated_entries = translate_entries (image_entries, n_image_entries); gtk_item_factory_create_items_ac (image_factory, n_image_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_image_entries); + free_translated_entries (translated_entries, n_image_entries); + load_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); - translated_entries=translate_entries(load_entries, n_load_entries); + translated_entries = translate_entries (load_entries, n_load_entries); gtk_item_factory_create_items_ac (load_factory, n_load_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_load_entries); + free_translated_entries (translated_entries, n_load_entries); + save_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); - translated_entries=translate_entries(load_entries, n_save_entries); + translated_entries = translate_entries (load_entries, n_save_entries); gtk_item_factory_create_items_ac (save_factory, n_save_entries, translated_entries, NULL, 2); - free_translated_entries(translated_entries, n_save_entries); + free_translated_entries (translated_entries, n_save_entries); + + layers_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (layers_entries, n_layers_entries); + gtk_item_factory_create_items_ac (layers_factory, + n_layers_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_layers_entries); + + channels_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (channels_entries, n_channels_entries); + gtk_item_factory_create_items_ac (channels_factory, + n_channels_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_channels_entries); + + paths_factory = gtk_item_factory_new (GTK_TYPE_MENU, "", NULL); + translated_entries = translate_entries (paths_entries, n_paths_entries); + gtk_item_factory_create_items_ac (paths_factory, + n_paths_entries, + translated_entries, + NULL, 2); + free_translated_entries (translated_entries, n_paths_entries); + for (i = 0; i < num_tools; i++) { /* FIXME this need to use access functions to check a flag */ if (tool_info[i].menu_path) menus_tools_create (tool_info+i); } + filename = gimp_personal_rc_file ("menurc"); gtk_item_factory_parse_rc (filename); g_free (filename); diff --git a/app/widgets/gimpitemfactory.h b/app/widgets/gimpitemfactory.h index 39d870aaa2..880d778b11 100644 --- a/app/widgets/gimpitemfactory.h +++ b/app/widgets/gimpitemfactory.h @@ -18,27 +18,34 @@ #ifndef __MENUS_H__ #define __MENUS_H__ - #include "gtk/gtk.h" +void menus_get_toolbox_menubar (GtkWidget **menubar, + GtkAccelGroup **accel_group); +void menus_get_image_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_load_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_save_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_layers_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_channels_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); +void menus_get_paths_menu (GtkWidget **menu, + GtkAccelGroup **accel_group); + +void menus_create (GtkMenuEntry *entries, + gint n_menu_entries); +void menus_destroy (gchar *path); -void menus_get_toolbox_menubar (GtkWidget **menubar, - GtkAccelGroup **accel_group); -void menus_get_image_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_get_load_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_get_save_menu (GtkWidget **menu, - GtkAccelGroup **accel_group); -void menus_create (GtkMenuEntry *entries, - int nmenu_entries); -void menus_set_sensitive (char *path, - int sensitive); -void menus_set_state (char *path, - int state); -void menus_destroy (char *path); void menus_quit (void); -void menus_last_opened_add (gchar *filename); +void menus_set_sensitive (gchar *path, + gint sensitive); +void menus_set_state (gchar *path, + gint state); -#endif /* MENUS_H */ +void menus_last_opened_add (gchar *filename); + +#endif /* __MENUS_H__ */