void gimp_filter_history_add (Gimp *gimp, GimpProcedure *procedure) { GList *link; g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (GIMP_IS_PROCEDURE (procedure)); /* return early if the procedure is already at the top */ if (gimp->filter_history && gimp_filter_history_compare (gimp->filter_history->data, procedure) == 0) return; /* ref new first then unref old, they might be the same */ g_object_ref (procedure); link = g_list_find_custom (gimp->filter_history, procedure, (GCompareFunc) gimp_filter_history_compare); if (link) { g_object_unref (link->data); gimp->filter_history = g_list_delete_link (gimp->filter_history, link); } gimp->filter_history = g_list_prepend (gimp->filter_history, procedure); link = g_list_nth (gimp->filter_history, gimp_filter_history_size (gimp)); if (link) { g_object_unref (link->data); gimp->filter_history = g_list_delete_link (gimp->filter_history, link); } gimp_filter_history_changed (gimp); }
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); } }
void filters_actions_setup (GimpActionGroup *group) { GimpProcedureActionEntry *entries; gint n_entries; gint i; gimp_action_group_add_actions (group, "filters-action", filters_menu_actions, G_N_ELEMENTS (filters_menu_actions)); gimp_action_group_add_string_actions (group, "filters-action", filters_actions, G_N_ELEMENTS (filters_actions), G_CALLBACK (filters_filter_cmd_callback)); gimp_action_group_add_enum_actions (group, "filters-action", filters_repeat_actions, G_N_ELEMENTS (filters_repeat_actions), G_CALLBACK (filters_repeat_cmd_callback)); for (i = 0; i < G_N_ELEMENTS (filters_actions); i++) { const GimpStringActionEntry *entry = &filters_actions[i]; const gchar *description; description = gegl_operation_get_key (entry->value, "description"); if (description) gimp_action_group_set_action_tooltip (group, entry->name, description); } n_entries = gimp_filter_history_size (group->gimp); entries = g_new0 (GimpProcedureActionEntry, n_entries); for (i = 0; i < n_entries; i++) { entries[i].name = g_strdup_printf ("filter-recent-%02d", i + 1); entries[i].icon_name = NULL; entries[i].label = ""; entries[i].accelerator = ""; entries[i].tooltip = NULL; entries[i].procedure = NULL; entries[i].help_id = GIMP_HELP_FILTER_RESHOW; } gimp_action_group_add_procedure_actions (group, entries, n_entries, G_CALLBACK (filters_history_cmd_callback)); for (i = 0; i < n_entries; i++) { gimp_action_group_set_action_visible (group, entries[i].name, FALSE); g_free ((gchar *) entries[i].name); } g_free (entries); g_signal_connect_object (group->gimp, "filter-history-changed", G_CALLBACK (filters_actions_history_changed), group, 0); filters_actions_history_changed (group->gimp, group); }