static gint gimp_filter_history_compare (GimpProcedure *proc1, GimpProcedure *proc2) { /* the procedures can have the same name, but could still be two * different filters using the same operation, so also compare * their menu labels */ return (gimp_procedure_name_compare (proc1, proc2) || strcmp (gimp_procedure_get_menu_label (proc1), gimp_procedure_get_menu_label (proc2))); }
static void plug_in_actions_add_proc (GimpActionGroup *group, GimpPlugInProcedure *proc) { GimpProcedureActionEntry entry; const gchar *locale_domain; GList *list; locale_domain = gimp_plug_in_procedure_get_locale_domain (proc); entry.name = gimp_object_get_name (proc); entry.icon_name = gimp_viewable_get_icon_name (GIMP_VIEWABLE (proc)); entry.label = gimp_procedure_get_menu_label (GIMP_PROCEDURE (proc)); entry.accelerator = NULL; entry.tooltip = gimp_procedure_get_blurb (GIMP_PROCEDURE (proc)); entry.procedure = GIMP_PROCEDURE (proc); entry.help_id = gimp_procedure_get_help_id (GIMP_PROCEDURE (proc)); gimp_action_group_add_procedure_actions (group, &entry, 1, G_CALLBACK (plug_in_run_cmd_callback)); for (list = proc->menu_paths; list; list = g_list_next (list)) { const gchar *original = list->data; const gchar *translated = dgettext (locale_domain, original); if (plug_in_actions_check_translation (original, translated)) plug_in_actions_build_path (group, original, translated); else plug_in_actions_build_path (group, original, original); } if (proc->image_types_val) { GimpContext *context = gimp_get_user_context (group->gimp); GimpImage *image = gimp_context_get_image (context); GimpDrawable *drawable = NULL; gboolean sensitive; const gchar *tooltip; if (image) drawable = gimp_image_get_active_drawable (image); sensitive = gimp_procedure_get_sensitive (GIMP_PROCEDURE (proc), GIMP_OBJECT (drawable), &tooltip); gimp_action_group_set_action_sensitive (group, gimp_object_get_name (proc), sensitive); if (! sensitive && drawable && tooltip) gimp_action_group_set_action_tooltip (group, gimp_object_get_name (proc), tooltip); } }
static void filters_actions_history_changed (Gimp *gimp, GimpActionGroup *group) { GimpProcedure *proc; GimpActionGroup *plug_in_group; gint i; plug_in_group = filters_actions_get_plug_in_group (group); proc = gimp_filter_history_nth (gimp, 0); if (proc) { GtkAction *actual_action = NULL; const gchar *label; gchar *repeat; gchar *reshow; gboolean sensitive = FALSE; label = gimp_procedure_get_label (proc); repeat = g_strdup_printf (_("Re_peat \"%s\""), label); reshow = g_strdup_printf (_("R_e-Show \"%s\""), label); gimp_action_group_set_action_label (group, "filters-repeat", repeat); gimp_action_group_set_action_label (group, "filters-reshow", reshow); g_free (repeat); g_free (reshow); if (g_str_has_prefix (gimp_object_get_name (proc), "filters-")) { actual_action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), gimp_object_get_name (proc)); } else if (plug_in_group) { /* copy the sensitivity of the plug-in procedure's actual * action instead of calling filters_actions_update() * because doing the latter would set the sensitivity of * this image's action on all images' actions. See bug * #517683. */ actual_action = gtk_action_group_get_action (GTK_ACTION_GROUP (plug_in_group), gimp_object_get_name (proc)); } if (actual_action) sensitive = gtk_action_get_sensitive (actual_action); gimp_action_group_set_action_sensitive (group, "filters-repeat", sensitive); gimp_action_group_set_action_sensitive (group, "filters-reshow", sensitive); } else { gimp_action_group_set_action_label (group, "filters-repeat", _("Repeat Last")); gimp_action_group_set_action_label (group, "filters-reshow", _("Re-Show Last")); gimp_action_group_set_action_sensitive (group, "filters-repeat", FALSE); gimp_action_group_set_action_sensitive (group, "filters-reshow", FALSE); } for (i = 0; i < gimp_filter_history_length (gimp); i++) { GtkAction *action; GtkAction *actual_action = NULL; const gchar *label; gchar *name; gboolean sensitive = FALSE; name = g_strdup_printf ("filter-recent-%02d", i + 1); action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), name); g_free (name); proc = gimp_filter_history_nth (gimp, i); label = gimp_procedure_get_menu_label (proc); if (g_str_has_prefix (gimp_object_get_name (proc), "filters-")) { actual_action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), gimp_object_get_name (proc)); } else if (plug_in_group) { /* see comment above */ actual_action = gtk_action_group_get_action (GTK_ACTION_GROUP (plug_in_group), gimp_object_get_name (proc)); } if (actual_action) sensitive = gtk_action_get_sensitive (actual_action); g_object_set (action, "visible", TRUE, "sensitive", sensitive, "procedure", proc, "label", label, "icon-name", gimp_viewable_get_icon_name (GIMP_VIEWABLE (proc)), "tooltip", gimp_procedure_get_blurb (proc), NULL); } for (; i < gimp_filter_history_size (gimp); i++) { GtkAction *action; gchar *name = g_strdup_printf ("filter-recent-%02d", i + 1); action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), name); g_free (name); g_object_set (action, "visible", FALSE, "procedure", NULL, NULL); } }