From b9759497530c0cea5a221cb7d198ab0634bd39e5 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Wed, 28 Jul 1999 14:01:04 +0000 Subject: [PATCH] tweaked one more dialog box: "Changes were made to %s. Close anyway?" 1999-07-28 Michael Natterer * app/gdisplay_ops.c: tweaked one more dialog box: "Changes were made to %s. Close anyway?" * app/layers_dialog.c: Eek, layers_dialog_flush() was assuming that layers can be moved by one position only and thus traversed and reordered the same list at the same time. Should work with arbitrarily misplaced layers now. Fixed some strange dnd special cases and cleaned up the dnd code. --- ChangeLog | 11 + app/display/gimpdisplay-ops.c | 35 +- app/gdisplay_ops.c | 35 +- app/gui/layers-dialog.c | 677 +++++++++++++++++----------------- app/layers_dialog.c | 677 +++++++++++++++++----------------- 5 files changed, 711 insertions(+), 724 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9be6589133..96e9c0cac6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +1999-07-28 Michael Natterer + + * app/gdisplay_ops.c: tweaked one more dialog box: "Changes were + made to %s. Close anyway?" + + * app/layers_dialog.c: Eek, layers_dialog_flush() was assuming + that layers can be moved by one position only and thus traversed + and reordered the same list at the same time. Should work with + arbitrarily misplaced layers now. + Fixed some strange dnd special cases and cleaned up the dnd code. + Wed Jul 28 03:42:34 1999 Jay Cox (jay@elan) * app/pixel_regionP.h: new file that shold have gone with my last diff --git a/app/display/gimpdisplay-ops.c b/app/display/gimpdisplay-ops.c index a3d2dc79de..985324b43e 100644 --- a/app/display/gimpdisplay-ops.c +++ b/app/display/gimpdisplay-ops.c @@ -16,7 +16,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include -#include #include #include "appenv.h" #include "actionarea.h" @@ -33,9 +32,9 @@ #include "libgimp/gimpintl.h" -static void gdisplay_close_warning_callback (GtkWidget *, gpointer); +static void gdisplay_close_warning_callback (GtkWidget *, gpointer); static void gdisplay_cancel_warning_callback (GtkWidget *, gpointer); -static void gdisplay_close_warning_dialog (char *, GDisplay *); +static void gdisplay_close_warning_dialog (char *, GDisplay *); static GtkWidget *warning_dialog = NULL; @@ -121,7 +120,7 @@ gdisplay_close_window (GDisplay *gdisp, * to an image canvas. (a gimage with ref_count = 1) */ if (!kill_it && (gdisp->gimage->ref_count == 1) && - (gdisp->gimage->dirty > 0) && confirm_on_close ) + (gdisp->gimage->dirty > 0) && confirm_on_close) { gdisplay_close_warning_dialog (g_basename (gimage_filename (gdisp->gimage)), gdisp); @@ -326,9 +325,9 @@ gdisplay_delete_warning_callback (GtkWidget *widget, GdkEvent *event, gpointer client_data) { - menus_set_sensitive_locale ("", N_("/File/Close"), TRUE); + gdisplay_cancel_warning_callback (widget, client_data); - return FALSE; + return TRUE; } static void @@ -342,15 +341,16 @@ static void gdisplay_close_warning_dialog (char *image_name, GDisplay *gdisp) { - static ActionAreaItem mbox_action_items[2] = + GtkWidget *mbox; + GtkWidget *vbox; + GtkWidget *label; + gchar *warning_buf; + + static ActionAreaItem action_items[] = { { N_("Close"), gdisplay_close_warning_callback, NULL, NULL }, { N_("Cancel"), gdisplay_cancel_warning_callback, NULL, NULL } }; - GtkWidget *mbox; - GtkWidget *vbox; - GtkWidget *label; - char *warning_buf; /* FIXUP this will raise any prexsisting close dialogs, which can be a a bit confusing if you tried to close a new window because you had @@ -380,20 +380,21 @@ gdisplay_close_warning_dialog (char *image_name, mbox); vbox = gtk_vbox_new (FALSE, 1); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (mbox)->vbox), vbox, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (mbox)->vbox), vbox); gtk_widget_show (vbox); warning_buf = - g_strdup_printf(_("Changes were made to %s. Close anyway?"), image_name); + g_strdup_printf (_("Changes were made to %s.\n" + "Close anyway?"), image_name); label = gtk_label_new (warning_buf); gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0); gtk_widget_show (label); g_free (warning_buf); - mbox_action_items[0].user_data = mbox; - mbox_action_items[1].user_data = mbox; - build_action_area (GTK_DIALOG (mbox), mbox_action_items, 2, 0); + action_items[0].user_data = mbox; + action_items[1].user_data = mbox; + build_action_area (GTK_DIALOG (mbox), action_items, 2, 1); gtk_widget_show (mbox); } diff --git a/app/gdisplay_ops.c b/app/gdisplay_ops.c index a3d2dc79de..985324b43e 100644 --- a/app/gdisplay_ops.c +++ b/app/gdisplay_ops.c @@ -16,7 +16,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include -#include #include #include "appenv.h" #include "actionarea.h" @@ -33,9 +32,9 @@ #include "libgimp/gimpintl.h" -static void gdisplay_close_warning_callback (GtkWidget *, gpointer); +static void gdisplay_close_warning_callback (GtkWidget *, gpointer); static void gdisplay_cancel_warning_callback (GtkWidget *, gpointer); -static void gdisplay_close_warning_dialog (char *, GDisplay *); +static void gdisplay_close_warning_dialog (char *, GDisplay *); static GtkWidget *warning_dialog = NULL; @@ -121,7 +120,7 @@ gdisplay_close_window (GDisplay *gdisp, * to an image canvas. (a gimage with ref_count = 1) */ if (!kill_it && (gdisp->gimage->ref_count == 1) && - (gdisp->gimage->dirty > 0) && confirm_on_close ) + (gdisp->gimage->dirty > 0) && confirm_on_close) { gdisplay_close_warning_dialog (g_basename (gimage_filename (gdisp->gimage)), gdisp); @@ -326,9 +325,9 @@ gdisplay_delete_warning_callback (GtkWidget *widget, GdkEvent *event, gpointer client_data) { - menus_set_sensitive_locale ("", N_("/File/Close"), TRUE); + gdisplay_cancel_warning_callback (widget, client_data); - return FALSE; + return TRUE; } static void @@ -342,15 +341,16 @@ static void gdisplay_close_warning_dialog (char *image_name, GDisplay *gdisp) { - static ActionAreaItem mbox_action_items[2] = + GtkWidget *mbox; + GtkWidget *vbox; + GtkWidget *label; + gchar *warning_buf; + + static ActionAreaItem action_items[] = { { N_("Close"), gdisplay_close_warning_callback, NULL, NULL }, { N_("Cancel"), gdisplay_cancel_warning_callback, NULL, NULL } }; - GtkWidget *mbox; - GtkWidget *vbox; - GtkWidget *label; - char *warning_buf; /* FIXUP this will raise any prexsisting close dialogs, which can be a a bit confusing if you tried to close a new window because you had @@ -380,20 +380,21 @@ gdisplay_close_warning_dialog (char *image_name, mbox); vbox = gtk_vbox_new (FALSE, 1); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (mbox)->vbox), vbox, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (mbox)->vbox), vbox); gtk_widget_show (vbox); warning_buf = - g_strdup_printf(_("Changes were made to %s. Close anyway?"), image_name); + g_strdup_printf (_("Changes were made to %s.\n" + "Close anyway?"), image_name); label = gtk_label_new (warning_buf); gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0); gtk_widget_show (label); g_free (warning_buf); - mbox_action_items[0].user_data = mbox; - mbox_action_items[1].user_data = mbox; - build_action_area (GTK_DIALOG (mbox), mbox_action_items, 2, 0); + action_items[0].user_data = mbox; + action_items[1].user_data = mbox; + build_action_area (GTK_DIALOG (mbox), action_items, 2, 1); gtk_widget_show (mbox); } diff --git a/app/gui/layers-dialog.c b/app/gui/layers-dialog.c index e5be77d5bd..0a6abd12f2 100644 --- a/app/gui/layers-dialog.c +++ b/app/gui/layers-dialog.c @@ -41,6 +41,7 @@ #include "libgimp/gimplimits.h" #include "libgimp/gimpsizeentry.h" + #include "libgimp/gimpintl.h" #include "pixmaps/eye.xbm" @@ -141,53 +142,54 @@ struct _LayerWidget }; /* layers dialog widget routines */ -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 opacity_scale_update (GtkAdjustment *, gpointer); -static void preserve_trans_update (GtkWidget *, gpointer); -static gint layer_list_events (GtkWidget *, GdkEvent *); +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 *, gint); +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 *); /* for (un)installing the menu accelarators */ static void layers_dialog_map_callback (GtkWidget *, gpointer); static void layers_dialog_unmap_callback (GtkWidget *, gpointer); /* layer widget function prototypes */ -static void layer_widget_draw_drop_indicator (LayerWidget *, LayerDropType); -static void layer_widget_drag_indicator_callback (GtkWidget *, gpointer); -static void layer_widget_drag_leave_callback (GtkWidget *, - GdkDragContext *, - guint); +static LayerWidget *layer_widget_get_ID (Layer *); +static LayerWidget *layer_widget_create (GImage *, Layer *); + static gboolean layer_widget_drag_motion_callback (GtkWidget *, GdkDragContext *, gint, gint, guint); static gboolean layer_widget_drag_drop_callback (GtkWidget *, GdkDragContext *, gint, gint, guint); +static void layer_widget_drag_leave_callback (GtkWidget *, + GdkDragContext *, + guint); +static void layer_widget_drag_indicator_callback (GtkWidget *, gpointer); -static LayerWidget *layer_widget_get_ID (Layer *); -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_exclusive_visible (LayerWidget *); -static void layer_widget_layer_flush (GtkWidget *, gpointer); +static void layer_widget_draw_drop_indicator (LayerWidget *, LayerDropType); +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_exclusive_visible (LayerWidget *); +static void layer_widget_layer_flush (GtkWidget *, gpointer); /* assorted query dialogs */ static void layers_dialog_new_layer_query (GimpImage*); @@ -198,9 +200,10 @@ 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 *, gboolean); -/* - * Local data - */ +/****************/ +/* Local data */ +/****************/ + static LayersDialog *layersD = NULL; static GdkPixmap *eye_pixmap[] = { NULL, NULL, NULL }; @@ -276,6 +279,22 @@ static OpsButton layers_ops_buttons[] = { NULL, NULL, NULL, NULL, NULL, 0 } }; +/* dnd structures */ + +enum +{ + GIMP_TARGET_LAYER +}; + +static GtkTargetEntry layer_target_table[] = +{ + { "GIMP_LAYER", 0, GIMP_TARGET_LAYER } +}; + +static guint n_targets = (sizeof (layer_target_table) / + sizeof (layer_target_table[0])); + + /************************************/ /* Public layers dialog functions */ /************************************/ @@ -441,7 +460,7 @@ layers_dialog_free () } void -layers_dialog_invalidate_previews(GimpImage *gimage) +layers_dialog_invalidate_previews (GimpImage *gimage) { GSList *list = gimage->layers; Layer *layer; @@ -460,16 +479,17 @@ layers_dialog_invalidate_previews(GimpImage *gimage) void layers_dialog_update (GimpImage* gimage) { - Layer *layer; + Layer *layer; LayerWidget *lw; - GSList *list; - GList *item_list; + GSList *list; + GList *item_list; if (! layersD || layersD->gimage == gimage) return; layersD->gimage = gimage; + /* Make sure the gimage is not notified of this change */ suspend_gimage_notify++; /* Free all elements in the layers listbox */ @@ -484,7 +504,7 @@ layers_dialog_update (GimpImage* gimage) } if (layersD->layer_widgets) - g_warning ("layersD->layer_widgets not empty!"); + g_warning (_("layers_dialog_update(): layersD->layer_widgets not empty!")); layersD->layer_widgets = NULL; /* Find the preview extents */ @@ -494,18 +514,14 @@ layers_dialog_update (GimpImage* gimage) layersD->active_channel = NULL; layersD->floating_sel = NULL; - list = gimage->layers; item_list = NULL; - - while (list) + for (list = gimage->layers; list; list = g_slist_next (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 */ @@ -518,12 +534,11 @@ layers_dialog_update (GimpImage* gimage) void layers_dialog_flush () { - GImage *gimage; - Layer *layer; + GImage *gimage; + Layer *layer; LayerWidget *lw; - GSList *list; - int gimage_pos; - int pos; + GSList *list; + gint pos; if (!layersD || !(gimage = layersD->gimage)) return; @@ -534,31 +549,31 @@ layers_dialog_flush () { layersD->gimage = NULL; layers_dialog_update (gimage); + + return; } /* Set all current layer widgets to visited = FALSE */ - list = layersD->layer_widgets; - while (list) + for (list = layersD->layer_widgets; list; list = g_slist_next (list)) { lw = (LayerWidget *) list->data; lw->visited = FALSE; - list = g_slist_next (list); } /* Add any missing layers */ - list = gimage->layers; - while (list) + for (list = gimage->layers; list; list = g_slist_next (list)) { layer = (Layer *) list->data; lw = layer_widget_get_ID (layer); /* If the layer isn't in the layer widget list, add it */ if (lw == NULL) - layers_dialog_add_layer (layer); + { + /* sets visited = TRUE */ + layers_dialog_add_layer (layer); + } else lw->visited = TRUE; - - list = g_slist_next (list); } /* Remove any extraneous layers */ @@ -572,17 +587,11 @@ layers_dialog_flush () } /* Switch positions of items if necessary */ - list = layersD->layer_widgets; pos = 0; - while (list) + for (list = gimage->layers; list; list = g_slist_next (list)) { - lw = (LayerWidget *) list->data; - list = g_slist_next (list); - - if ((gimage_pos = gimage_get_layer_index (gimage, lw->layer)) != pos) - layers_dialog_position_layer (lw->layer, gimage_pos); - - pos++; + layer = (Layer *) list->data; + layers_dialog_position_layer (layer, pos++); } /* Set the active layer */ @@ -591,17 +600,7 @@ layers_dialog_flush () /* Set the active channel */ if (layersD->active_channel != gimage->active_channel) - { - layersD->active_channel = gimage->active_channel; - - /* 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); - else - gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), - GTK_SELECTION_BROWSE); - } + layersD->active_channel = gimage->active_channel; /* set the menus if floating sel status has changed */ if (layersD->floating_sel != gimage->floating_sel) @@ -611,7 +610,6 @@ layers_dialog_flush () gtk_container_foreach (GTK_CONTAINER (layersD->layer_list), layer_widget_layer_flush, NULL); - } void @@ -619,8 +617,11 @@ layers_dialog_clear () { ops_button_box_set_insensitive (layers_ops_buttons); + /* Make sure the gimage is not notified of this change */ suspend_gimage_notify++; + gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); + suspend_gimage_notify--; layersD->gimage = NULL; @@ -811,7 +812,6 @@ render_preview (TempBuf *preview_buf, } } - void render_fs_preview (GtkWidget *widget, GdkPixmap *pixmap) @@ -862,7 +862,6 @@ render_fs_preview (GtkWidget *widget, (y1 + (foldh - (foldh * i) / (foldw - 1)))); } - /*************************************/ /* layers dialog widget routines */ /*************************************/ @@ -1014,7 +1013,6 @@ layers_dialog_set_menu_sensitivity () gtk_widget_set_sensitive (layersD->mode_box, lp); } - static void layers_dialog_set_active_layer (Layer *layer) { @@ -1041,7 +1039,6 @@ layers_dialog_set_active_layer (Layer *layer) suspend_gimage_notify--; } - static void layers_dialog_unset_layer (Layer *layer) { @@ -1068,34 +1065,37 @@ layers_dialog_unset_layer (Layer *layer) suspend_gimage_notify--; } - static void layers_dialog_position_layer (Layer *layer, gint new_index) { - LayerWidget *layer_widget; + LayerWidget *layer_widget; GList *list = NULL; layer_widget = layer_widget_get_ID (layer); if (!layersD || !layer_widget) return; + if (new_index == g_slist_index (layersD->layer_widgets, layer_widget)) + return; + /* Make sure the gimage is not notified of this change */ suspend_gimage_notify++; /* Remove the layer from the dialog */ list = g_list_append (list, layer_widget->list_item); gtk_list_remove_items (GTK_LIST (layersD->layer_list), list); - layersD->layer_widgets = g_slist_remove (layersD->layer_widgets, layer_widget); + layersD->layer_widgets = g_slist_remove (layersD->layer_widgets, + layer_widget); /* Add it back at the proper index */ gtk_list_insert_items (GTK_LIST (layersD->layer_list), list, new_index); - layersD->layer_widgets = g_slist_insert (layersD->layer_widgets, layer_widget, new_index); + layersD->layer_widgets = g_slist_insert (layersD->layer_widgets, + layer_widget, new_index); suspend_gimage_notify--; } - static void layers_dialog_add_layer (Layer *layer) { @@ -1117,7 +1117,6 @@ layers_dialog_add_layer (Layer *layer) gtk_list_insert_items (GTK_LIST (layersD->layer_list), item_list, position); } - static void layers_dialog_remove_layer (Layer *layer) { @@ -1141,7 +1140,6 @@ layers_dialog_remove_layer (Layer *layer) suspend_gimage_notify--; } - static void layers_dialog_add_layer_mask (Layer *layer) { @@ -1159,7 +1157,6 @@ layers_dialog_add_layer_mask (Layer *layer) gtk_widget_draw (layer_widget->layer_preview, NULL); } - static void layers_dialog_remove_layer_mask (Layer *layer) { @@ -1177,6 +1174,10 @@ layers_dialog_remove_layer_mask (Layer *layer) gtk_widget_draw (layer_widget->layer_preview, NULL); } +/*****************************************************/ +/* paint mode, opacity & preserve trans. functions */ +/*****************************************************/ + static gint paint_mode_menu_get_position (gint mode) { @@ -1220,7 +1221,6 @@ paint_mode_menu_callback (GtkWidget *widget, } } - static void opacity_scale_update (GtkAdjustment *adjustment, gpointer data) @@ -1261,14 +1261,18 @@ preserve_trans_update (GtkWidget *widget, layer->preserve_trans = FALSE; } +/********************************/ +/* layer list events callback */ +/********************************/ + static gint layer_list_events (GtkWidget *widget, GdkEvent *event) { - GdkEventKey *kevent; + GdkEventKey *kevent; GdkEventButton *bevent; - GtkWidget *event_widget; - LayerWidget *layer_widget; + GtkWidget *event_widget; + LayerWidget *layer_widget; event_widget = gtk_get_event_widget (event); @@ -1319,7 +1323,6 @@ layer_list_events (GtkWidget *widget, return FALSE; } - /*****************************/ /* layers dialog callbacks */ /*****************************/ @@ -1346,6 +1349,10 @@ layers_dialog_unmap_callback (GtkWidget *widget, layersD->accel_group); } +/***********************************/ +/* callbacks exported to menus.c */ +/***********************************/ + void layers_dialog_previous_layer_callback (GtkWidget *widget, gpointer data) @@ -1435,14 +1442,10 @@ layers_dialog_raise_layer_to_top_callback (GtkWidget *widget, if (!layersD || !(gimage = layersD->gimage)) return; - if (NULL != gimage_raise_layer_to_top (gimage, gimage->active_layer)) - { - /* update, only needed if raise was performed */ - gdisplays_flush (); - } + gimage_raise_layer_to_top (gimage, gimage->active_layer); + gdisplays_flush (); } - void layers_dialog_lower_layer_to_bottom_callback (GtkWidget *widget, gpointer data) @@ -1452,11 +1455,8 @@ layers_dialog_lower_layer_to_bottom_callback (GtkWidget *widget, if (!layersD || !(gimage = layersD->gimage)) return; - if (NULL != gimage_lower_layer_to_bottom (gimage, gimage->active_layer)) - { - /* update, only needed if lower was performed */ - gdisplays_flush (); - } + gimage_lower_layer_to_bottom (gimage, gimage->active_layer); + gdisplays_flush (); } void @@ -1632,7 +1632,6 @@ layers_dialog_flatten_image_callback (GtkWidget *widget, gdisplays_flush (); } - void layers_dialog_alpha_select_callback (GtkWidget *widget, gpointer data) @@ -1646,7 +1645,6 @@ layers_dialog_alpha_select_callback (GtkWidget *widget, gdisplays_flush (); } - void layers_dialog_mask_select_callback (GtkWidget *widget, gpointer data) @@ -1660,7 +1658,6 @@ layers_dialog_mask_select_callback (GtkWidget *widget, gdisplays_flush (); } - void layers_dialog_add_alpha_channel_callback (GtkWidget *widget, gpointer data) @@ -1677,211 +1674,10 @@ layers_dialog_add_alpha_channel_callback (GtkWidget *widget, gdisplays_flush (); } - /****************************/ /* layer widget functions */ /****************************/ -enum -{ - GIMP_TARGET_LAYER -}; - -static GtkTargetEntry layer_target_table[] = -{ - { "GIMP_LAYER", 0, GIMP_TARGET_LAYER } -}; - -static guint n_targets = (sizeof (layer_target_table) / - sizeof (layer_target_table[0])); - -static void -layer_widget_draw_drop_indicator (LayerWidget *lw, - LayerDropType drop_type) -{ - static GdkGC *gc = NULL; - gint y = 0; - - if (!gc) - { - GdkColor fg, bg; - - gc = gdk_gc_new (lw->list_item->window); - - fg.pixel = 0xFFFFFFFF; - bg.pixel = 0x00000000; - - gdk_gc_set_function (gc, GDK_INVERT); - gdk_gc_set_foreground (gc, &fg); - gdk_gc_set_background (gc, &bg); - gdk_gc_set_line_attributes (gc, 5, GDK_LINE_SOLID, - GDK_CAP_BUTT, GDK_JOIN_MITER); - } - - if (drop_type != LAYER_DROP_NONE) - { - y = ((drop_type == LAYER_DROP_ABOVE) ? - 3 : lw->list_item->allocation.height - 4); - - gdk_draw_line (lw->list_item->window, gc, - 2, y, lw->list_item->allocation.width - 3, y); - } -} - -static void -layer_widget_drag_indicator_callback (GtkWidget *widget, - gpointer data) -{ - LayerWidget *lw; - - lw = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); - - layer_widget_draw_drop_indicator (lw, lw->drop_type); -} - -static void -layer_widget_drag_leave_callback (GtkWidget *widget, - GdkDragContext *context, - guint time) -{ - LayerWidget *lw; - - lw = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); - - lw->drop_type = LAYER_DROP_NONE; -} - -static gboolean -layer_widget_drag_motion_callback (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time) -{ - LayerWidget *dest; - gint dest_index; - GtkWidget *src_widget; - LayerWidget *src; - gint src_index; - gint difference; - - LayerDropType drop_type = LAYER_DROP_NONE; - GdkDragAction drag_action = GDK_ACTION_DEFAULT; - gboolean return_val = FALSE; - - dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); - - if (layer_has_alpha (dest->layer) && - (src_widget = gtk_drag_get_source_widget (context))) - { - src - = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); - - if (layer_has_alpha (src->layer)) - { - src_index = gimage_get_layer_index (layersD->gimage, src->layer); - dest_index = gimage_get_layer_index (layersD->gimage, dest->layer); - - difference = dest_index - src_index; - - drop_type = ((y < widget->allocation.height / 2) ? - LAYER_DROP_ABOVE : LAYER_DROP_BELOW); - - if (difference < 0 && - drop_type == LAYER_DROP_BELOW) - { - dest_index++; - } - else if (difference > 0 && - drop_type == LAYER_DROP_ABOVE) - { - dest_index--; - } - - if (src_index != dest_index) - { - drag_action = context->suggested_action; - return_val = TRUE; - } - else - { - drop_type = LAYER_DROP_NONE; - } - } - } - - gdk_drag_status (context, drag_action, time); - - if (drop_type != dest->drop_type) - { - layer_widget_draw_drop_indicator (dest, dest->drop_type); - layer_widget_draw_drop_indicator (dest, drop_type); - dest->drop_type = drop_type; - } - - return return_val; -} - -static gboolean -layer_widget_drag_drop_callback (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time) -{ - LayerWidget *dest; - gint dest_index; - GtkWidget *src_widget; - LayerWidget *src; - gint src_index; - gint difference; - - LayerDropType drop_type = LAYER_DROP_NONE; - gboolean return_val = FALSE; - - dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); - - if ((src_widget = gtk_drag_get_source_widget (context))) - { - src - = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); - - src_index = gimage_get_layer_index (layersD->gimage, src->layer); - dest_index = gimage_get_layer_index (layersD->gimage, dest->layer); - - difference = dest_index - src_index; - - drop_type = ((y < widget->allocation.height / 2) ? - LAYER_DROP_ABOVE : LAYER_DROP_BELOW); - - if (difference < 0 && - drop_type == LAYER_DROP_BELOW) - { - dest_index++; - } - else if (difference > 0 && - drop_type == LAYER_DROP_ABOVE) - { - dest_index--; - } - - if (src_index != dest_index) - { - gimage_position_layer (layersD->gimage, src->layer, dest_index); - gdisplays_flush (); - - return_val = TRUE; - } - } - - layer_widget_draw_drop_indicator (dest, dest->drop_type); - dest->drop_type = LAYER_DROP_NONE; - - gtk_drag_finish (context, return_val, FALSE, time); - - return return_val; -} - static LayerWidget * layer_widget_get_ID (Layer *ID) { @@ -2046,9 +1842,9 @@ layer_widget_create (GImage *gimage, gtk_signal_connect (GTK_OBJECT (list_item), "drag_leave", GTK_SIGNAL_FUNC (layer_widget_drag_leave_callback), NULL); - gtk_signal_connect_after (GTK_OBJECT (list_item), "drag_motion", - GTK_SIGNAL_FUNC (layer_widget_drag_motion_callback), - NULL); + gtk_signal_connect (GTK_OBJECT (list_item), "drag_motion", + GTK_SIGNAL_FUNC (layer_widget_drag_motion_callback), + NULL); gtk_signal_connect (GTK_OBJECT (list_item), "drag_drop", GTK_SIGNAL_FUNC (layer_widget_drag_drop_callback), NULL); @@ -2073,6 +1869,205 @@ layer_widget_create (GImage *gimage, return layer_widget; } +static gboolean +layer_widget_drag_motion_callback (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time) +{ + LayerWidget *dest; + gint dest_index; + GtkWidget *src_widget; + LayerWidget *src; + gint src_index; + gint difference; + + LayerDropType drop_type = LAYER_DROP_NONE; + GdkDragAction drag_action = GDK_ACTION_DEFAULT; + gboolean return_val = FALSE; + + dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); + + if (dest && + layer_has_alpha (dest->layer) && + (src_widget = gtk_drag_get_source_widget (context))) + { + src + = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); + + if (src && + layer_has_alpha (src->layer) && + ! layer_is_floating_sel (src->layer) && + src->layer == layersD->active_layer) + { + src_index = gimage_get_layer_index (layersD->gimage, src->layer); + dest_index = gimage_get_layer_index (layersD->gimage, dest->layer); + + difference = dest_index - src_index; + + drop_type = ((y < widget->allocation.height / 2) ? + LAYER_DROP_ABOVE : LAYER_DROP_BELOW); + + if (difference < 0 && + drop_type == LAYER_DROP_BELOW) + { + dest_index++; + } + else if (difference > 0 && + drop_type == LAYER_DROP_ABOVE) + { + dest_index--; + } + + if (src_index != dest_index) + { + drag_action = context->suggested_action; + return_val = TRUE; + } + else + { + drop_type = LAYER_DROP_NONE; + } + } + } + + gdk_drag_status (context, drag_action, time); + + if (drop_type != dest->drop_type) + { + layer_widget_draw_drop_indicator (dest, dest->drop_type); + layer_widget_draw_drop_indicator (dest, drop_type); + dest->drop_type = drop_type; + } + + return return_val; +} + +static gboolean +layer_widget_drag_drop_callback (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time) +{ + LayerWidget *dest; + gint dest_index; + GtkWidget *src_widget; + LayerWidget *src; + gint src_index; + gint difference; + + LayerDropType drop_type = LAYER_DROP_NONE; + gboolean return_val = FALSE; + + dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); + + if (dest && + layer_has_alpha (dest->layer) && + (src_widget = gtk_drag_get_source_widget (context))) + { + src + = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); + + if (src && + layer_has_alpha (src->layer) && + ! layer_is_floating_sel (src->layer) && + src->layer == layersD->active_layer) + { + src_index = gimage_get_layer_index (layersD->gimage, src->layer); + dest_index = gimage_get_layer_index (layersD->gimage, dest->layer); + + difference = dest_index - src_index; + + drop_type = ((y < widget->allocation.height / 2) ? + LAYER_DROP_ABOVE : LAYER_DROP_BELOW); + + if (difference < 0 && + drop_type == LAYER_DROP_BELOW) + { + dest_index++; + } + else if (difference > 0 && + drop_type == LAYER_DROP_ABOVE) + { + dest_index--; + } + + if (src_index != dest_index) + { + gimage_position_layer (layersD->gimage, src->layer, dest_index); + gdisplays_flush (); + + return_val = TRUE; + } + } + } + + layer_widget_draw_drop_indicator (dest, dest->drop_type); + dest->drop_type = LAYER_DROP_NONE; + + gtk_drag_finish (context, return_val, FALSE, time); + + return return_val; +} + +static void +layer_widget_drag_leave_callback (GtkWidget *widget, + GdkDragContext *context, + guint time) +{ + LayerWidget *layer_widget; + + layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); + + layer_widget->drop_type = LAYER_DROP_NONE; +} + +static void +layer_widget_drag_indicator_callback (GtkWidget *widget, + gpointer data) +{ + LayerWidget *layer_widget; + + layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); + + layer_widget_draw_drop_indicator (layer_widget, layer_widget->drop_type); +} + +static void +layer_widget_draw_drop_indicator (LayerWidget *layer_widget, + LayerDropType drop_type) +{ + static GdkGC *gc = NULL; + gint y = 0; + + if (!gc) + { + GdkColor fg, bg; + + gc = gdk_gc_new (layer_widget->list_item->window); + + fg.pixel = 0xFFFFFFFF; + bg.pixel = 0x00000000; + + gdk_gc_set_function (gc, GDK_INVERT); + gdk_gc_set_foreground (gc, &fg); + gdk_gc_set_background (gc, &bg); + gdk_gc_set_line_attributes (gc, 5, GDK_LINE_SOLID, + GDK_CAP_BUTT, GDK_JOIN_MITER); + } + + if (drop_type != LAYER_DROP_NONE) + { + y = ((drop_type == LAYER_DROP_ABOVE) ? + 3 : layer_widget->list_item->allocation.height - 4); + + gdk_draw_line (layer_widget->list_item->window, gc, + 2, y, layer_widget->list_item->allocation.width - 3, y); + } +} + static void layer_widget_delete (LayerWidget *layer_widget) { @@ -2931,10 +2926,9 @@ layer_widget_layer_flush (GtkWidget *widget, gtk_widget_draw (layer_widget->mask_preview, NULL); } - -/* - * The new layer query dialog - */ +/********************************/ +/* The new layer query dialog */ +/********************************/ typedef struct _NewLayerOptions NewLayerOptions; @@ -3026,7 +3020,6 @@ new_layer_query_delete_callback (GtkWidget *widget, return TRUE; } - static void new_layer_query_fill_type_callback (GtkWidget *widget, gpointer data) @@ -3208,10 +3201,9 @@ layers_dialog_new_layer_query (GimpImage* gimage) gtk_widget_show (options->query_box); } - -/* - * The edit layer attributes dialog - */ +/**************************************/ +/* The edit layer attributes dialog */ +/**************************************/ typedef struct _EditLayerOptions EditLayerOptions; @@ -3340,10 +3332,9 @@ layers_dialog_edit_layer_query (LayerWidget *layer_widget) gtk_widget_show (options->query_box); } - -/* - * The add mask query dialog - */ +/*******************************/ +/* The add mask query dialog */ +/*******************************/ typedef struct _AddMaskOptions AddMaskOptions; @@ -3488,10 +3479,9 @@ layers_dialog_add_mask_query (Layer *layer) gtk_widget_show (options->query_box); } - -/* - * The apply layer mask dialog - */ +/*********************************/ +/* The apply layer mask dialog */ +/*********************************/ typedef struct _ApplyMaskOptions ApplyMaskOptions; @@ -3599,10 +3589,9 @@ layers_dialog_apply_mask_query (Layer *layer) gtk_widget_show (options->query_box); } - -/* - * The scale layer dialog - */ +/****************************/ +/* The scale layer dialog */ +/****************************/ typedef struct _ScaleLayerOptions ScaleLayerOptions; @@ -3697,10 +3686,9 @@ layers_dialog_scale_layer_query (GImage *gimage, gtk_widget_show (options->resize->resize_shell); } - -/* - * The resize layer dialog - */ +/*****************************/ +/* The resize layer dialog */ +/*****************************/ typedef struct _ResizeLayerOptions ResizeLayerOptions; @@ -3797,10 +3785,9 @@ layers_dialog_resize_layer_query (GImage *gimage, gtk_widget_show (options->resize->resize_shell); } - -/* - * The layer merge dialog - */ +/****************************/ +/* The layer merge dialog */ +/****************************/ typedef struct _LayerMergeOptions LayerMergeOptions; diff --git a/app/layers_dialog.c b/app/layers_dialog.c index e5be77d5bd..0a6abd12f2 100644 --- a/app/layers_dialog.c +++ b/app/layers_dialog.c @@ -41,6 +41,7 @@ #include "libgimp/gimplimits.h" #include "libgimp/gimpsizeentry.h" + #include "libgimp/gimpintl.h" #include "pixmaps/eye.xbm" @@ -141,53 +142,54 @@ struct _LayerWidget }; /* layers dialog widget routines */ -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 opacity_scale_update (GtkAdjustment *, gpointer); -static void preserve_trans_update (GtkWidget *, gpointer); -static gint layer_list_events (GtkWidget *, GdkEvent *); +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 *, gint); +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 *); /* for (un)installing the menu accelarators */ static void layers_dialog_map_callback (GtkWidget *, gpointer); static void layers_dialog_unmap_callback (GtkWidget *, gpointer); /* layer widget function prototypes */ -static void layer_widget_draw_drop_indicator (LayerWidget *, LayerDropType); -static void layer_widget_drag_indicator_callback (GtkWidget *, gpointer); -static void layer_widget_drag_leave_callback (GtkWidget *, - GdkDragContext *, - guint); +static LayerWidget *layer_widget_get_ID (Layer *); +static LayerWidget *layer_widget_create (GImage *, Layer *); + static gboolean layer_widget_drag_motion_callback (GtkWidget *, GdkDragContext *, gint, gint, guint); static gboolean layer_widget_drag_drop_callback (GtkWidget *, GdkDragContext *, gint, gint, guint); +static void layer_widget_drag_leave_callback (GtkWidget *, + GdkDragContext *, + guint); +static void layer_widget_drag_indicator_callback (GtkWidget *, gpointer); -static LayerWidget *layer_widget_get_ID (Layer *); -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_exclusive_visible (LayerWidget *); -static void layer_widget_layer_flush (GtkWidget *, gpointer); +static void layer_widget_draw_drop_indicator (LayerWidget *, LayerDropType); +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_exclusive_visible (LayerWidget *); +static void layer_widget_layer_flush (GtkWidget *, gpointer); /* assorted query dialogs */ static void layers_dialog_new_layer_query (GimpImage*); @@ -198,9 +200,10 @@ 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 *, gboolean); -/* - * Local data - */ +/****************/ +/* Local data */ +/****************/ + static LayersDialog *layersD = NULL; static GdkPixmap *eye_pixmap[] = { NULL, NULL, NULL }; @@ -276,6 +279,22 @@ static OpsButton layers_ops_buttons[] = { NULL, NULL, NULL, NULL, NULL, 0 } }; +/* dnd structures */ + +enum +{ + GIMP_TARGET_LAYER +}; + +static GtkTargetEntry layer_target_table[] = +{ + { "GIMP_LAYER", 0, GIMP_TARGET_LAYER } +}; + +static guint n_targets = (sizeof (layer_target_table) / + sizeof (layer_target_table[0])); + + /************************************/ /* Public layers dialog functions */ /************************************/ @@ -441,7 +460,7 @@ layers_dialog_free () } void -layers_dialog_invalidate_previews(GimpImage *gimage) +layers_dialog_invalidate_previews (GimpImage *gimage) { GSList *list = gimage->layers; Layer *layer; @@ -460,16 +479,17 @@ layers_dialog_invalidate_previews(GimpImage *gimage) void layers_dialog_update (GimpImage* gimage) { - Layer *layer; + Layer *layer; LayerWidget *lw; - GSList *list; - GList *item_list; + GSList *list; + GList *item_list; if (! layersD || layersD->gimage == gimage) return; layersD->gimage = gimage; + /* Make sure the gimage is not notified of this change */ suspend_gimage_notify++; /* Free all elements in the layers listbox */ @@ -484,7 +504,7 @@ layers_dialog_update (GimpImage* gimage) } if (layersD->layer_widgets) - g_warning ("layersD->layer_widgets not empty!"); + g_warning (_("layers_dialog_update(): layersD->layer_widgets not empty!")); layersD->layer_widgets = NULL; /* Find the preview extents */ @@ -494,18 +514,14 @@ layers_dialog_update (GimpImage* gimage) layersD->active_channel = NULL; layersD->floating_sel = NULL; - list = gimage->layers; item_list = NULL; - - while (list) + for (list = gimage->layers; list; list = g_slist_next (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 */ @@ -518,12 +534,11 @@ layers_dialog_update (GimpImage* gimage) void layers_dialog_flush () { - GImage *gimage; - Layer *layer; + GImage *gimage; + Layer *layer; LayerWidget *lw; - GSList *list; - int gimage_pos; - int pos; + GSList *list; + gint pos; if (!layersD || !(gimage = layersD->gimage)) return; @@ -534,31 +549,31 @@ layers_dialog_flush () { layersD->gimage = NULL; layers_dialog_update (gimage); + + return; } /* Set all current layer widgets to visited = FALSE */ - list = layersD->layer_widgets; - while (list) + for (list = layersD->layer_widgets; list; list = g_slist_next (list)) { lw = (LayerWidget *) list->data; lw->visited = FALSE; - list = g_slist_next (list); } /* Add any missing layers */ - list = gimage->layers; - while (list) + for (list = gimage->layers; list; list = g_slist_next (list)) { layer = (Layer *) list->data; lw = layer_widget_get_ID (layer); /* If the layer isn't in the layer widget list, add it */ if (lw == NULL) - layers_dialog_add_layer (layer); + { + /* sets visited = TRUE */ + layers_dialog_add_layer (layer); + } else lw->visited = TRUE; - - list = g_slist_next (list); } /* Remove any extraneous layers */ @@ -572,17 +587,11 @@ layers_dialog_flush () } /* Switch positions of items if necessary */ - list = layersD->layer_widgets; pos = 0; - while (list) + for (list = gimage->layers; list; list = g_slist_next (list)) { - lw = (LayerWidget *) list->data; - list = g_slist_next (list); - - if ((gimage_pos = gimage_get_layer_index (gimage, lw->layer)) != pos) - layers_dialog_position_layer (lw->layer, gimage_pos); - - pos++; + layer = (Layer *) list->data; + layers_dialog_position_layer (layer, pos++); } /* Set the active layer */ @@ -591,17 +600,7 @@ layers_dialog_flush () /* Set the active channel */ if (layersD->active_channel != gimage->active_channel) - { - layersD->active_channel = gimage->active_channel; - - /* 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); - else - gtk_list_set_selection_mode (GTK_LIST (layersD->layer_list), - GTK_SELECTION_BROWSE); - } + layersD->active_channel = gimage->active_channel; /* set the menus if floating sel status has changed */ if (layersD->floating_sel != gimage->floating_sel) @@ -611,7 +610,6 @@ layers_dialog_flush () gtk_container_foreach (GTK_CONTAINER (layersD->layer_list), layer_widget_layer_flush, NULL); - } void @@ -619,8 +617,11 @@ layers_dialog_clear () { ops_button_box_set_insensitive (layers_ops_buttons); + /* Make sure the gimage is not notified of this change */ suspend_gimage_notify++; + gtk_list_clear_items (GTK_LIST (layersD->layer_list), 0, -1); + suspend_gimage_notify--; layersD->gimage = NULL; @@ -811,7 +812,6 @@ render_preview (TempBuf *preview_buf, } } - void render_fs_preview (GtkWidget *widget, GdkPixmap *pixmap) @@ -862,7 +862,6 @@ render_fs_preview (GtkWidget *widget, (y1 + (foldh - (foldh * i) / (foldw - 1)))); } - /*************************************/ /* layers dialog widget routines */ /*************************************/ @@ -1014,7 +1013,6 @@ layers_dialog_set_menu_sensitivity () gtk_widget_set_sensitive (layersD->mode_box, lp); } - static void layers_dialog_set_active_layer (Layer *layer) { @@ -1041,7 +1039,6 @@ layers_dialog_set_active_layer (Layer *layer) suspend_gimage_notify--; } - static void layers_dialog_unset_layer (Layer *layer) { @@ -1068,34 +1065,37 @@ layers_dialog_unset_layer (Layer *layer) suspend_gimage_notify--; } - static void layers_dialog_position_layer (Layer *layer, gint new_index) { - LayerWidget *layer_widget; + LayerWidget *layer_widget; GList *list = NULL; layer_widget = layer_widget_get_ID (layer); if (!layersD || !layer_widget) return; + if (new_index == g_slist_index (layersD->layer_widgets, layer_widget)) + return; + /* Make sure the gimage is not notified of this change */ suspend_gimage_notify++; /* Remove the layer from the dialog */ list = g_list_append (list, layer_widget->list_item); gtk_list_remove_items (GTK_LIST (layersD->layer_list), list); - layersD->layer_widgets = g_slist_remove (layersD->layer_widgets, layer_widget); + layersD->layer_widgets = g_slist_remove (layersD->layer_widgets, + layer_widget); /* Add it back at the proper index */ gtk_list_insert_items (GTK_LIST (layersD->layer_list), list, new_index); - layersD->layer_widgets = g_slist_insert (layersD->layer_widgets, layer_widget, new_index); + layersD->layer_widgets = g_slist_insert (layersD->layer_widgets, + layer_widget, new_index); suspend_gimage_notify--; } - static void layers_dialog_add_layer (Layer *layer) { @@ -1117,7 +1117,6 @@ layers_dialog_add_layer (Layer *layer) gtk_list_insert_items (GTK_LIST (layersD->layer_list), item_list, position); } - static void layers_dialog_remove_layer (Layer *layer) { @@ -1141,7 +1140,6 @@ layers_dialog_remove_layer (Layer *layer) suspend_gimage_notify--; } - static void layers_dialog_add_layer_mask (Layer *layer) { @@ -1159,7 +1157,6 @@ layers_dialog_add_layer_mask (Layer *layer) gtk_widget_draw (layer_widget->layer_preview, NULL); } - static void layers_dialog_remove_layer_mask (Layer *layer) { @@ -1177,6 +1174,10 @@ layers_dialog_remove_layer_mask (Layer *layer) gtk_widget_draw (layer_widget->layer_preview, NULL); } +/*****************************************************/ +/* paint mode, opacity & preserve trans. functions */ +/*****************************************************/ + static gint paint_mode_menu_get_position (gint mode) { @@ -1220,7 +1221,6 @@ paint_mode_menu_callback (GtkWidget *widget, } } - static void opacity_scale_update (GtkAdjustment *adjustment, gpointer data) @@ -1261,14 +1261,18 @@ preserve_trans_update (GtkWidget *widget, layer->preserve_trans = FALSE; } +/********************************/ +/* layer list events callback */ +/********************************/ + static gint layer_list_events (GtkWidget *widget, GdkEvent *event) { - GdkEventKey *kevent; + GdkEventKey *kevent; GdkEventButton *bevent; - GtkWidget *event_widget; - LayerWidget *layer_widget; + GtkWidget *event_widget; + LayerWidget *layer_widget; event_widget = gtk_get_event_widget (event); @@ -1319,7 +1323,6 @@ layer_list_events (GtkWidget *widget, return FALSE; } - /*****************************/ /* layers dialog callbacks */ /*****************************/ @@ -1346,6 +1349,10 @@ layers_dialog_unmap_callback (GtkWidget *widget, layersD->accel_group); } +/***********************************/ +/* callbacks exported to menus.c */ +/***********************************/ + void layers_dialog_previous_layer_callback (GtkWidget *widget, gpointer data) @@ -1435,14 +1442,10 @@ layers_dialog_raise_layer_to_top_callback (GtkWidget *widget, if (!layersD || !(gimage = layersD->gimage)) return; - if (NULL != gimage_raise_layer_to_top (gimage, gimage->active_layer)) - { - /* update, only needed if raise was performed */ - gdisplays_flush (); - } + gimage_raise_layer_to_top (gimage, gimage->active_layer); + gdisplays_flush (); } - void layers_dialog_lower_layer_to_bottom_callback (GtkWidget *widget, gpointer data) @@ -1452,11 +1455,8 @@ layers_dialog_lower_layer_to_bottom_callback (GtkWidget *widget, if (!layersD || !(gimage = layersD->gimage)) return; - if (NULL != gimage_lower_layer_to_bottom (gimage, gimage->active_layer)) - { - /* update, only needed if lower was performed */ - gdisplays_flush (); - } + gimage_lower_layer_to_bottom (gimage, gimage->active_layer); + gdisplays_flush (); } void @@ -1632,7 +1632,6 @@ layers_dialog_flatten_image_callback (GtkWidget *widget, gdisplays_flush (); } - void layers_dialog_alpha_select_callback (GtkWidget *widget, gpointer data) @@ -1646,7 +1645,6 @@ layers_dialog_alpha_select_callback (GtkWidget *widget, gdisplays_flush (); } - void layers_dialog_mask_select_callback (GtkWidget *widget, gpointer data) @@ -1660,7 +1658,6 @@ layers_dialog_mask_select_callback (GtkWidget *widget, gdisplays_flush (); } - void layers_dialog_add_alpha_channel_callback (GtkWidget *widget, gpointer data) @@ -1677,211 +1674,10 @@ layers_dialog_add_alpha_channel_callback (GtkWidget *widget, gdisplays_flush (); } - /****************************/ /* layer widget functions */ /****************************/ -enum -{ - GIMP_TARGET_LAYER -}; - -static GtkTargetEntry layer_target_table[] = -{ - { "GIMP_LAYER", 0, GIMP_TARGET_LAYER } -}; - -static guint n_targets = (sizeof (layer_target_table) / - sizeof (layer_target_table[0])); - -static void -layer_widget_draw_drop_indicator (LayerWidget *lw, - LayerDropType drop_type) -{ - static GdkGC *gc = NULL; - gint y = 0; - - if (!gc) - { - GdkColor fg, bg; - - gc = gdk_gc_new (lw->list_item->window); - - fg.pixel = 0xFFFFFFFF; - bg.pixel = 0x00000000; - - gdk_gc_set_function (gc, GDK_INVERT); - gdk_gc_set_foreground (gc, &fg); - gdk_gc_set_background (gc, &bg); - gdk_gc_set_line_attributes (gc, 5, GDK_LINE_SOLID, - GDK_CAP_BUTT, GDK_JOIN_MITER); - } - - if (drop_type != LAYER_DROP_NONE) - { - y = ((drop_type == LAYER_DROP_ABOVE) ? - 3 : lw->list_item->allocation.height - 4); - - gdk_draw_line (lw->list_item->window, gc, - 2, y, lw->list_item->allocation.width - 3, y); - } -} - -static void -layer_widget_drag_indicator_callback (GtkWidget *widget, - gpointer data) -{ - LayerWidget *lw; - - lw = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); - - layer_widget_draw_drop_indicator (lw, lw->drop_type); -} - -static void -layer_widget_drag_leave_callback (GtkWidget *widget, - GdkDragContext *context, - guint time) -{ - LayerWidget *lw; - - lw = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); - - lw->drop_type = LAYER_DROP_NONE; -} - -static gboolean -layer_widget_drag_motion_callback (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time) -{ - LayerWidget *dest; - gint dest_index; - GtkWidget *src_widget; - LayerWidget *src; - gint src_index; - gint difference; - - LayerDropType drop_type = LAYER_DROP_NONE; - GdkDragAction drag_action = GDK_ACTION_DEFAULT; - gboolean return_val = FALSE; - - dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); - - if (layer_has_alpha (dest->layer) && - (src_widget = gtk_drag_get_source_widget (context))) - { - src - = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); - - if (layer_has_alpha (src->layer)) - { - src_index = gimage_get_layer_index (layersD->gimage, src->layer); - dest_index = gimage_get_layer_index (layersD->gimage, dest->layer); - - difference = dest_index - src_index; - - drop_type = ((y < widget->allocation.height / 2) ? - LAYER_DROP_ABOVE : LAYER_DROP_BELOW); - - if (difference < 0 && - drop_type == LAYER_DROP_BELOW) - { - dest_index++; - } - else if (difference > 0 && - drop_type == LAYER_DROP_ABOVE) - { - dest_index--; - } - - if (src_index != dest_index) - { - drag_action = context->suggested_action; - return_val = TRUE; - } - else - { - drop_type = LAYER_DROP_NONE; - } - } - } - - gdk_drag_status (context, drag_action, time); - - if (drop_type != dest->drop_type) - { - layer_widget_draw_drop_indicator (dest, dest->drop_type); - layer_widget_draw_drop_indicator (dest, drop_type); - dest->drop_type = drop_type; - } - - return return_val; -} - -static gboolean -layer_widget_drag_drop_callback (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time) -{ - LayerWidget *dest; - gint dest_index; - GtkWidget *src_widget; - LayerWidget *src; - gint src_index; - gint difference; - - LayerDropType drop_type = LAYER_DROP_NONE; - gboolean return_val = FALSE; - - dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); - - if ((src_widget = gtk_drag_get_source_widget (context))) - { - src - = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); - - src_index = gimage_get_layer_index (layersD->gimage, src->layer); - dest_index = gimage_get_layer_index (layersD->gimage, dest->layer); - - difference = dest_index - src_index; - - drop_type = ((y < widget->allocation.height / 2) ? - LAYER_DROP_ABOVE : LAYER_DROP_BELOW); - - if (difference < 0 && - drop_type == LAYER_DROP_BELOW) - { - dest_index++; - } - else if (difference > 0 && - drop_type == LAYER_DROP_ABOVE) - { - dest_index--; - } - - if (src_index != dest_index) - { - gimage_position_layer (layersD->gimage, src->layer, dest_index); - gdisplays_flush (); - - return_val = TRUE; - } - } - - layer_widget_draw_drop_indicator (dest, dest->drop_type); - dest->drop_type = LAYER_DROP_NONE; - - gtk_drag_finish (context, return_val, FALSE, time); - - return return_val; -} - static LayerWidget * layer_widget_get_ID (Layer *ID) { @@ -2046,9 +1842,9 @@ layer_widget_create (GImage *gimage, gtk_signal_connect (GTK_OBJECT (list_item), "drag_leave", GTK_SIGNAL_FUNC (layer_widget_drag_leave_callback), NULL); - gtk_signal_connect_after (GTK_OBJECT (list_item), "drag_motion", - GTK_SIGNAL_FUNC (layer_widget_drag_motion_callback), - NULL); + gtk_signal_connect (GTK_OBJECT (list_item), "drag_motion", + GTK_SIGNAL_FUNC (layer_widget_drag_motion_callback), + NULL); gtk_signal_connect (GTK_OBJECT (list_item), "drag_drop", GTK_SIGNAL_FUNC (layer_widget_drag_drop_callback), NULL); @@ -2073,6 +1869,205 @@ layer_widget_create (GImage *gimage, return layer_widget; } +static gboolean +layer_widget_drag_motion_callback (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time) +{ + LayerWidget *dest; + gint dest_index; + GtkWidget *src_widget; + LayerWidget *src; + gint src_index; + gint difference; + + LayerDropType drop_type = LAYER_DROP_NONE; + GdkDragAction drag_action = GDK_ACTION_DEFAULT; + gboolean return_val = FALSE; + + dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); + + if (dest && + layer_has_alpha (dest->layer) && + (src_widget = gtk_drag_get_source_widget (context))) + { + src + = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); + + if (src && + layer_has_alpha (src->layer) && + ! layer_is_floating_sel (src->layer) && + src->layer == layersD->active_layer) + { + src_index = gimage_get_layer_index (layersD->gimage, src->layer); + dest_index = gimage_get_layer_index (layersD->gimage, dest->layer); + + difference = dest_index - src_index; + + drop_type = ((y < widget->allocation.height / 2) ? + LAYER_DROP_ABOVE : LAYER_DROP_BELOW); + + if (difference < 0 && + drop_type == LAYER_DROP_BELOW) + { + dest_index++; + } + else if (difference > 0 && + drop_type == LAYER_DROP_ABOVE) + { + dest_index--; + } + + if (src_index != dest_index) + { + drag_action = context->suggested_action; + return_val = TRUE; + } + else + { + drop_type = LAYER_DROP_NONE; + } + } + } + + gdk_drag_status (context, drag_action, time); + + if (drop_type != dest->drop_type) + { + layer_widget_draw_drop_indicator (dest, dest->drop_type); + layer_widget_draw_drop_indicator (dest, drop_type); + dest->drop_type = drop_type; + } + + return return_val; +} + +static gboolean +layer_widget_drag_drop_callback (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time) +{ + LayerWidget *dest; + gint dest_index; + GtkWidget *src_widget; + LayerWidget *src; + gint src_index; + gint difference; + + LayerDropType drop_type = LAYER_DROP_NONE; + gboolean return_val = FALSE; + + dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); + + if (dest && + layer_has_alpha (dest->layer) && + (src_widget = gtk_drag_get_source_widget (context))) + { + src + = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); + + if (src && + layer_has_alpha (src->layer) && + ! layer_is_floating_sel (src->layer) && + src->layer == layersD->active_layer) + { + src_index = gimage_get_layer_index (layersD->gimage, src->layer); + dest_index = gimage_get_layer_index (layersD->gimage, dest->layer); + + difference = dest_index - src_index; + + drop_type = ((y < widget->allocation.height / 2) ? + LAYER_DROP_ABOVE : LAYER_DROP_BELOW); + + if (difference < 0 && + drop_type == LAYER_DROP_BELOW) + { + dest_index++; + } + else if (difference > 0 && + drop_type == LAYER_DROP_ABOVE) + { + dest_index--; + } + + if (src_index != dest_index) + { + gimage_position_layer (layersD->gimage, src->layer, dest_index); + gdisplays_flush (); + + return_val = TRUE; + } + } + } + + layer_widget_draw_drop_indicator (dest, dest->drop_type); + dest->drop_type = LAYER_DROP_NONE; + + gtk_drag_finish (context, return_val, FALSE, time); + + return return_val; +} + +static void +layer_widget_drag_leave_callback (GtkWidget *widget, + GdkDragContext *context, + guint time) +{ + LayerWidget *layer_widget; + + layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); + + layer_widget->drop_type = LAYER_DROP_NONE; +} + +static void +layer_widget_drag_indicator_callback (GtkWidget *widget, + gpointer data) +{ + LayerWidget *layer_widget; + + layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); + + layer_widget_draw_drop_indicator (layer_widget, layer_widget->drop_type); +} + +static void +layer_widget_draw_drop_indicator (LayerWidget *layer_widget, + LayerDropType drop_type) +{ + static GdkGC *gc = NULL; + gint y = 0; + + if (!gc) + { + GdkColor fg, bg; + + gc = gdk_gc_new (layer_widget->list_item->window); + + fg.pixel = 0xFFFFFFFF; + bg.pixel = 0x00000000; + + gdk_gc_set_function (gc, GDK_INVERT); + gdk_gc_set_foreground (gc, &fg); + gdk_gc_set_background (gc, &bg); + gdk_gc_set_line_attributes (gc, 5, GDK_LINE_SOLID, + GDK_CAP_BUTT, GDK_JOIN_MITER); + } + + if (drop_type != LAYER_DROP_NONE) + { + y = ((drop_type == LAYER_DROP_ABOVE) ? + 3 : layer_widget->list_item->allocation.height - 4); + + gdk_draw_line (layer_widget->list_item->window, gc, + 2, y, layer_widget->list_item->allocation.width - 3, y); + } +} + static void layer_widget_delete (LayerWidget *layer_widget) { @@ -2931,10 +2926,9 @@ layer_widget_layer_flush (GtkWidget *widget, gtk_widget_draw (layer_widget->mask_preview, NULL); } - -/* - * The new layer query dialog - */ +/********************************/ +/* The new layer query dialog */ +/********************************/ typedef struct _NewLayerOptions NewLayerOptions; @@ -3026,7 +3020,6 @@ new_layer_query_delete_callback (GtkWidget *widget, return TRUE; } - static void new_layer_query_fill_type_callback (GtkWidget *widget, gpointer data) @@ -3208,10 +3201,9 @@ layers_dialog_new_layer_query (GimpImage* gimage) gtk_widget_show (options->query_box); } - -/* - * The edit layer attributes dialog - */ +/**************************************/ +/* The edit layer attributes dialog */ +/**************************************/ typedef struct _EditLayerOptions EditLayerOptions; @@ -3340,10 +3332,9 @@ layers_dialog_edit_layer_query (LayerWidget *layer_widget) gtk_widget_show (options->query_box); } - -/* - * The add mask query dialog - */ +/*******************************/ +/* The add mask query dialog */ +/*******************************/ typedef struct _AddMaskOptions AddMaskOptions; @@ -3488,10 +3479,9 @@ layers_dialog_add_mask_query (Layer *layer) gtk_widget_show (options->query_box); } - -/* - * The apply layer mask dialog - */ +/*********************************/ +/* The apply layer mask dialog */ +/*********************************/ typedef struct _ApplyMaskOptions ApplyMaskOptions; @@ -3599,10 +3589,9 @@ layers_dialog_apply_mask_query (Layer *layer) gtk_widget_show (options->query_box); } - -/* - * The scale layer dialog - */ +/****************************/ +/* The scale layer dialog */ +/****************************/ typedef struct _ScaleLayerOptions ScaleLayerOptions; @@ -3697,10 +3686,9 @@ layers_dialog_scale_layer_query (GImage *gimage, gtk_widget_show (options->resize->resize_shell); } - -/* - * The resize layer dialog - */ +/*****************************/ +/* The resize layer dialog */ +/*****************************/ typedef struct _ResizeLayerOptions ResizeLayerOptions; @@ -3797,10 +3785,9 @@ layers_dialog_resize_layer_query (GImage *gimage, gtk_widget_show (options->resize->resize_shell); } - -/* - * The layer merge dialog - */ +/****************************/ +/* The layer merge dialog */ +/****************************/ typedef struct _LayerMergeOptions LayerMergeOptions;