Gimp/app/pdb/gimppluginprocedure.c
Michael Natterer ea8198e401 new function which checks a GimpImageType against the
2004-08-08  Michael Natterer  <mitch@gimp.org>

	* app/plug-in/plug-in-proc.[ch] (plug_in_proc_def_get_sensitive):
	new function which checks a GimpImageType against the
	proc_def->image_types_val mask.

	* app/actions/plug-in-actions.c: use the new function here. Also
	separated setting the "Repeat last" and "Reshow last" actions'
	labels from setting their sensitivity and made them use the same
	sensitivity logic as all other plug-in actions. Fixes bug #149567.
2004-08-08 10:53:19 +00:00

281 lines
6.5 KiB
C

/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <string.h>
#include <glib-object.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "libgimpbase/gimpbase.h"
#include "plug-in-types.h"
#include "core/gimp.h"
#include "plug-in.h"
#include "plug-ins.h"
#include "plug-in-proc.h"
#include "gimp-intl.h"
PlugInProcDef *
plug_in_proc_def_new (void)
{
PlugInProcDef *proc_def = g_new0 (PlugInProcDef, 1);
proc_def->icon_data_length = -1;
return proc_def;
}
void
plug_in_proc_def_free (PlugInProcDef *proc_def)
{
gint i;
g_return_if_fail (proc_def != NULL);
g_free (proc_def->db_info.name);
g_free (proc_def->db_info.blurb);
g_free (proc_def->db_info.help);
g_free (proc_def->db_info.author);
g_free (proc_def->db_info.copyright);
g_free (proc_def->db_info.date);
for (i = 0; i < proc_def->db_info.num_args; i++)
{
g_free (proc_def->db_info.args[i].name);
g_free (proc_def->db_info.args[i].description);
}
for (i = 0; i < proc_def->db_info.num_values; i++)
{
g_free (proc_def->db_info.values[i].name);
g_free (proc_def->db_info.values[i].description);
}
g_free (proc_def->db_info.args);
g_free (proc_def->db_info.values);
g_free (proc_def->prog);
g_free (proc_def->menu_label);
g_list_foreach (proc_def->menu_paths, (GFunc) g_free, NULL);
g_list_free (proc_def->menu_paths);
g_free (proc_def->icon_data);
g_free (proc_def->image_types);
g_free (proc_def->extensions);
g_free (proc_def->prefixes);
g_free (proc_def->magics);
g_free (proc_def->mime_type);
g_slist_foreach (proc_def->extensions_list, (GFunc) g_free, NULL);
g_slist_free (proc_def->extensions_list);
g_slist_foreach (proc_def->prefixes_list, (GFunc) g_free, NULL);
g_slist_free (proc_def->prefixes_list);
g_slist_foreach (proc_def->magics_list, (GFunc) g_free, NULL);
g_slist_free (proc_def->magics_list);
g_free (proc_def);
}
const ProcRecord *
plug_in_proc_def_get_proc (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
return &proc_def->db_info;
}
const gchar *
plug_in_proc_def_get_progname (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
switch (proc_def->db_info.proc_type)
{
case GIMP_PLUGIN:
case GIMP_EXTENSION:
return proc_def->prog;
case GIMP_TEMPORARY:
return ((PlugIn *) proc_def->db_info.exec_method.temporary.plug_in)->prog;
default:
break;
}
return NULL;
}
gchar *
plug_in_proc_def_get_label (const PlugInProcDef *proc_def,
const gchar *locale_domain)
{
const gchar *path;
gchar *stripped;
gchar *ellipses;
gchar *label;
g_return_val_if_fail (proc_def != NULL, NULL);
if (proc_def->menu_label)
path = dgettext (locale_domain, proc_def->menu_label);
else if (proc_def->menu_paths)
path = dgettext (locale_domain, proc_def->menu_paths->data);
else
return NULL;
stripped = gimp_strip_uline (path);
if (proc_def->menu_label)
label = g_strdup (stripped);
else
label = g_path_get_basename (stripped);
g_free (stripped);
ellipses = strstr (label, "...");
if (ellipses && ellipses == (label + strlen (label) - 3))
*ellipses = '\0';
return label;
}
const gchar *
plug_in_proc_def_get_stock_id (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
switch (proc_def->icon_type)
{
case GIMP_ICON_TYPE_STOCK_ID:
return proc_def->icon_data;
default:
return NULL;
}
}
GdkPixbuf *
plug_in_proc_def_get_pixbuf (const PlugInProcDef *proc_def)
{
GdkPixbuf *pixbuf = NULL;
GError *error = NULL;
g_return_val_if_fail (proc_def != NULL, NULL);
switch (proc_def->icon_type)
{
case GIMP_ICON_TYPE_INLINE_PIXBUF:
pixbuf = gdk_pixbuf_new_from_inline (proc_def->icon_data_length,
proc_def->icon_data, TRUE, &error);
if (! pixbuf)
{
g_printerr (error->message);
g_clear_error (&error);
}
break;
case GIMP_ICON_TYPE_IMAGE_FILE:
pixbuf = gdk_pixbuf_new_from_file (proc_def->icon_data, &error);
if (! pixbuf)
{
g_printerr (error->message);
g_clear_error (&error);
}
break;
default:
break;
}
return pixbuf;
}
gchar *
plug_in_proc_def_get_help_id (const PlugInProcDef *proc_def,
const gchar *help_domain)
{
gchar *help_id;
gchar *p;
g_return_val_if_fail (proc_def != NULL, NULL);
help_id = g_strdup (proc_def->db_info.name);
for (p = help_id; p && *p; p++)
if (*p == '_')
*p = '-';
if (help_domain)
{
gchar *domain_and_id;
domain_and_id = g_strconcat (help_domain, "?", help_id, NULL);
g_free (help_id);
return domain_and_id;
}
return help_id;
}
gboolean
plug_in_proc_def_get_sensitive (const PlugInProcDef *proc_def,
GimpImageType image_type)
{
gboolean sensitive;
g_return_val_if_fail (proc_def != NULL, FALSE);
switch (image_type)
{
case GIMP_RGB_IMAGE:
sensitive = proc_def->image_types_val & PLUG_IN_RGB_IMAGE;
break;
case GIMP_RGBA_IMAGE:
sensitive = proc_def->image_types_val & PLUG_IN_RGBA_IMAGE;
break;
case GIMP_GRAY_IMAGE:
sensitive = proc_def->image_types_val & PLUG_IN_GRAY_IMAGE;
break;
case GIMP_GRAYA_IMAGE:
sensitive = proc_def->image_types_val & PLUG_IN_GRAYA_IMAGE;
break;
case GIMP_INDEXED_IMAGE:
sensitive = proc_def->image_types_val & PLUG_IN_INDEXED_IMAGE;
break;
case GIMP_INDEXEDA_IMAGE:
sensitive = proc_def->image_types_val & PLUG_IN_INDEXEDA_IMAGE;
break;
default:
sensitive = FALSE;
break;
}
return sensitive ? TRUE : FALSE;
}