app/Makefile.am app/lc_dialog.[ch] app/lc_dialogP.h new files

1999-06-06  Michael Natterer  <mitschel@cs.tu-berlin.de>

	* 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.
This commit is contained in:
Michael Natterer 1999-06-06 17:26:51 +00:00 committed by Michael Natterer
parent 6cd82f05de
commit ac98e8fa81
54 changed files with 3406 additions and 2995 deletions

View File

@ -1,3 +1,47 @@
1999-06-06 Michael Natterer <mitschel@cs.tu-berlin.de>
* 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 <adam@gimp.org>
* fileops.c gimprc.c gimprc.h preferences_dialog.c:

View File

@ -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 \

View File

@ -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);

View File

@ -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"

View File

@ -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"

View File

@ -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<Shift> Add <Ctrl> Subtract <Shift><Ctrl> 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"
"<Shift> Add "
"<Ctrl> Subtract "
"<Shift><Ctrl> 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 (_("<Channels>/New Channel"), !fs_sens);
gtk_widget_set_sensitive (channels_ops_buttons[0].widget, !fs_sens);
menus_set_sensitive (_("<Channels>/Raise Channel"), !fs_sens && aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[1].widget,
!fs_sens && aux_sens);
menus_set_sensitive (_("<Channels>/Lower Channel"), !fs_sens && aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[2].widget,
!fs_sens && aux_sens);
menus_set_sensitive (_("<Channels>/Duplicate Channel"), !fs_sens && aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[3].widget,
!fs_sens && aux_sens);
menus_set_sensitive (_("<Channels>/Delete Channel"), !fs_sens && aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[4].widget,
!fs_sens && aux_sens);
menus_set_sensitive (_("<Channels>/Channel to Selection"), aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[5].widget, aux_sens);
menus_set_sensitive (_("<Channels>/Add to Selection"), aux_sens);
menus_set_sensitive (_("<Channels>/Subtract From Selection"), aux_sens);
menus_set_sensitive (_("<Channels>/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);

View File

@ -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__ */

View File

@ -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);

View File

@ -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"

View File

@ -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"

View File

@ -19,7 +19,6 @@
#include <stdlib.h>
#include <string.h>
#include "appenv.h"
#include "channels_dialog.h"
#include "drawable.h"
#include "layer.h"
#include "errors.h"

View File

@ -20,7 +20,6 @@
#include <string.h>
#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;
}

View File

@ -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);

View File

@ -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"

View File

@ -20,7 +20,6 @@
#include <string.h>
#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;
}

View File

@ -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);

View File

@ -19,7 +19,6 @@
#include <stdlib.h>
#include <string.h>
#include "appenv.h"
#include "channels_dialog.h"
#include "drawable.h"
#include "layer.h"
#include "errors.h"

View File

@ -20,7 +20,6 @@
#include <string.h>
#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;
}

View File

@ -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"

View File

@ -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"

View File

@ -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<Shift> Add <Ctrl> Subtract <Shift><Ctrl> 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"
"<Shift> Add "
"<Ctrl> Subtract "
"<Shift><Ctrl> 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 (_("<Channels>/New Channel"), !fs_sens);
gtk_widget_set_sensitive (channels_ops_buttons[0].widget, !fs_sens);
menus_set_sensitive (_("<Channels>/Raise Channel"), !fs_sens && aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[1].widget,
!fs_sens && aux_sens);
menus_set_sensitive (_("<Channels>/Lower Channel"), !fs_sens && aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[2].widget,
!fs_sens && aux_sens);
menus_set_sensitive (_("<Channels>/Duplicate Channel"), !fs_sens && aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[3].widget,
!fs_sens && aux_sens);
menus_set_sensitive (_("<Channels>/Delete Channel"), !fs_sens && aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[4].widget,
!fs_sens && aux_sens);
menus_set_sensitive (_("<Channels>/Channel to Selection"), aux_sens);
gtk_widget_set_sensitive (channels_ops_buttons[5].widget, aux_sens);
menus_set_sensitive (_("<Channels>/Add to Selection"), aux_sens);
menus_set_sensitive (_("<Channels>/Subtract From Selection"), aux_sens);
menus_set_sensitive (_("<Channels>/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);

View File

@ -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__ */

View File

@ -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);

View File

@ -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);

View File

@ -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);

File diff suppressed because it is too large Load Diff

View File

@ -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__ */

View File

@ -19,13 +19,16 @@
#include <stdlib.h>
#include <string.h>
#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, "<Separator>" },
/* 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"), "<control>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"), "<shift>Prior", layers_dialog_raise_layer_callback, 0 },
{ N_("/Stack/Lower Layer"), "<shift>Next", layers_dialog_lower_layer_callback, 0 },
{ N_("/Stack/Layer to Top"), "<control>Prior", layers_dialog_raise_layer_to_top_callback, 0 },
{ N_("/Stack/Layer to Bottom"), "<control>Next", layers_dialog_lower_layer_to_bottom_callback, 0 },
{ N_("/Duplicate Layer"), "<control>C", layers_dialog_duplicate_layer_callback, 0 },
{ N_("/Delete Layer"), "<control>X", layers_dialog_delete_layer_callback, 0 },
{ N_("/Anchor Layer"), "<control>H", layers_dialog_anchor_layer_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Scale Layer"), "<control>S", layers_dialog_scale_layer_callback, 0 },
{ N_("/Resize Layer"), "<control>R", layers_dialog_resize_layer_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Merge Visible Layers"), "<control>M", layers_dialog_merge_layers_callback, 0 },
{ N_("/Merge Down"), "<control><shift>M", layers_dialog_merge_down_callback, 0 },
{ N_("/Flatten Image"), NULL, layers_dialog_flatten_image_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ 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"), "<control>N", channels_dialog_new_channel_callback, 0 },
{ N_("/Raise Channel"), "<control>F", channels_dialog_raise_channel_callback, 0 },
{ N_("/Lower Channel"), "<control>B", channels_dialog_lower_channel_callback, 0 },
{ N_("/Duplicate Channel"), "<control>C", channels_dialog_duplicate_channel_callback, 0 },
{ N_("/Delete Channel"), "<control>X", channels_dialog_delete_channel_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Channel to Selection"), "<control>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"), "<control>N", paths_dialog_new_path_callback, 0 },
{ N_("/Duplicate Path"), "<control>U", paths_dialog_dup_path_callback, 0 },
{ N_("/Delete Path"), "<control>X", paths_dialog_delete_path_callback, 0 },
{ N_("/Path to Selection"), "<control>S", paths_dialog_path_to_sel_callback, 0 },
{ N_("/Stroke Path"), "<control>T", paths_dialog_stroke_path_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Copy Path"), "<control>C", paths_dialog_copy_path_callback, 0 },
{ N_("/Paste Path"), "<control>V", paths_dialog_paste_path_callback, 0 },
{ N_("/Import Path"), "<control>I", paths_dialog_import_path_callback, 0 },
{ N_("/Export Path"), "<control>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, "<Image>", 7))
for (i = 0; i < n_menu_entries; i++)
if (! strncmp (entries[i].path, "<Image>", 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<n; i++) {
/* Translation. Note the explicit use of gettext(). */
ret[i].path=g_strdup( gettext(entries[i].path) );
/* accelerator and item_type are not duped, only referenced */
ret[i].accelerator=entries[i].accelerator;
ret[i].callback=entries[i].callback;
ret[i].callback_action=entries[i].callback_action;
ret[i].item_type=entries[i].item_type;
}
ret = g_malloc (sizeof (GtkItemFactoryEntry) * n);
for (i=0; i<n; i++)
{
/* Translation. Note the explicit use of gettext(). */
ret[i].path = g_strdup (gettext (entries[i].path));
/* accelerator and item_type are not duped, only referenced */
ret[i].accelerator = entries[i].accelerator;
ret[i].callback = entries[i].callback;
ret[i].callback_action = entries[i].callback_action;
ret[i].item_type = entries[i].item_type;
}
return ret;
}
static void
free_translated_entries(GtkItemFactoryEntry *entries, gint n)
free_translated_entries (GtkItemFactoryEntry *entries, gint n)
{
gint i;
for (i=0; i<n; i++)
g_free(entries[i].path);
g_free(entries);
for (i = 0; i < n; i++)
g_free (entries[i].path);
g_free (entries);
}
@ -625,32 +733,60 @@ menus_init ()
menus_init_toolbox ();
image_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Image>", 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, "<Load>", 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, "<Save>", 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, "<Layers>", 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, "<Channels>", 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, "<Paths>", 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);

View File

@ -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__ */

View File

@ -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 <stdio.h>
@ -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 (_("<Paths>/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 (_("<Paths>/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 (_("<Paths>/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 (_("<Paths>/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 (_("<Paths>/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 (_("<Paths>/Copy Path"), sensitive);
break;
case PASTE_PATH_BUTTON:
gtk_widget_set_sensitive(paths_ops[8].widget,sensitive);
menus_set_sensitive (_("<Paths>/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 */

View File

@ -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__ */

View File

@ -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"

File diff suppressed because it is too large Load Diff

View File

@ -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__ */

View File

@ -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__ */

479
app/lc_dialog.c Normal file
View File

@ -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 ();
}

32
app/lc_dialog.h Normal file
View File

@ -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__ */

57
app/lc_dialogP.h Normal file
View File

@ -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__ */

View File

@ -19,13 +19,16 @@
#include <stdlib.h>
#include <string.h>
#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, "<Separator>" },
/* 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"), "<control>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"), "<shift>Prior", layers_dialog_raise_layer_callback, 0 },
{ N_("/Stack/Lower Layer"), "<shift>Next", layers_dialog_lower_layer_callback, 0 },
{ N_("/Stack/Layer to Top"), "<control>Prior", layers_dialog_raise_layer_to_top_callback, 0 },
{ N_("/Stack/Layer to Bottom"), "<control>Next", layers_dialog_lower_layer_to_bottom_callback, 0 },
{ N_("/Duplicate Layer"), "<control>C", layers_dialog_duplicate_layer_callback, 0 },
{ N_("/Delete Layer"), "<control>X", layers_dialog_delete_layer_callback, 0 },
{ N_("/Anchor Layer"), "<control>H", layers_dialog_anchor_layer_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Scale Layer"), "<control>S", layers_dialog_scale_layer_callback, 0 },
{ N_("/Resize Layer"), "<control>R", layers_dialog_resize_layer_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Merge Visible Layers"), "<control>M", layers_dialog_merge_layers_callback, 0 },
{ N_("/Merge Down"), "<control><shift>M", layers_dialog_merge_down_callback, 0 },
{ N_("/Flatten Image"), NULL, layers_dialog_flatten_image_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ 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"), "<control>N", channels_dialog_new_channel_callback, 0 },
{ N_("/Raise Channel"), "<control>F", channels_dialog_raise_channel_callback, 0 },
{ N_("/Lower Channel"), "<control>B", channels_dialog_lower_channel_callback, 0 },
{ N_("/Duplicate Channel"), "<control>C", channels_dialog_duplicate_channel_callback, 0 },
{ N_("/Delete Channel"), "<control>X", channels_dialog_delete_channel_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Channel to Selection"), "<control>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"), "<control>N", paths_dialog_new_path_callback, 0 },
{ N_("/Duplicate Path"), "<control>U", paths_dialog_dup_path_callback, 0 },
{ N_("/Delete Path"), "<control>X", paths_dialog_delete_path_callback, 0 },
{ N_("/Path to Selection"), "<control>S", paths_dialog_path_to_sel_callback, 0 },
{ N_("/Stroke Path"), "<control>T", paths_dialog_stroke_path_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Copy Path"), "<control>C", paths_dialog_copy_path_callback, 0 },
{ N_("/Paste Path"), "<control>V", paths_dialog_paste_path_callback, 0 },
{ N_("/Import Path"), "<control>I", paths_dialog_import_path_callback, 0 },
{ N_("/Export Path"), "<control>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, "<Image>", 7))
for (i = 0; i < n_menu_entries; i++)
if (! strncmp (entries[i].path, "<Image>", 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<n; i++) {
/* Translation. Note the explicit use of gettext(). */
ret[i].path=g_strdup( gettext(entries[i].path) );
/* accelerator and item_type are not duped, only referenced */
ret[i].accelerator=entries[i].accelerator;
ret[i].callback=entries[i].callback;
ret[i].callback_action=entries[i].callback_action;
ret[i].item_type=entries[i].item_type;
}
ret = g_malloc (sizeof (GtkItemFactoryEntry) * n);
for (i=0; i<n; i++)
{
/* Translation. Note the explicit use of gettext(). */
ret[i].path = g_strdup (gettext (entries[i].path));
/* accelerator and item_type are not duped, only referenced */
ret[i].accelerator = entries[i].accelerator;
ret[i].callback = entries[i].callback;
ret[i].callback_action = entries[i].callback_action;
ret[i].item_type = entries[i].item_type;
}
return ret;
}
static void
free_translated_entries(GtkItemFactoryEntry *entries, gint n)
free_translated_entries (GtkItemFactoryEntry *entries, gint n)
{
gint i;
for (i=0; i<n; i++)
g_free(entries[i].path);
g_free(entries);
for (i = 0; i < n; i++)
g_free (entries[i].path);
g_free (entries);
}
@ -625,32 +733,60 @@ menus_init ()
menus_init_toolbox ();
image_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Image>", 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, "<Load>", 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, "<Save>", 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, "<Layers>", 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, "<Channels>", 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, "<Paths>", 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);

View File

@ -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__ */

View File

@ -19,13 +19,16 @@
#include <stdlib.h>
#include <string.h>
#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, "<Separator>" },
/* 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"), "<control>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"), "<shift>Prior", layers_dialog_raise_layer_callback, 0 },
{ N_("/Stack/Lower Layer"), "<shift>Next", layers_dialog_lower_layer_callback, 0 },
{ N_("/Stack/Layer to Top"), "<control>Prior", layers_dialog_raise_layer_to_top_callback, 0 },
{ N_("/Stack/Layer to Bottom"), "<control>Next", layers_dialog_lower_layer_to_bottom_callback, 0 },
{ N_("/Duplicate Layer"), "<control>C", layers_dialog_duplicate_layer_callback, 0 },
{ N_("/Delete Layer"), "<control>X", layers_dialog_delete_layer_callback, 0 },
{ N_("/Anchor Layer"), "<control>H", layers_dialog_anchor_layer_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Scale Layer"), "<control>S", layers_dialog_scale_layer_callback, 0 },
{ N_("/Resize Layer"), "<control>R", layers_dialog_resize_layer_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Merge Visible Layers"), "<control>M", layers_dialog_merge_layers_callback, 0 },
{ N_("/Merge Down"), "<control><shift>M", layers_dialog_merge_down_callback, 0 },
{ N_("/Flatten Image"), NULL, layers_dialog_flatten_image_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ 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"), "<control>N", channels_dialog_new_channel_callback, 0 },
{ N_("/Raise Channel"), "<control>F", channels_dialog_raise_channel_callback, 0 },
{ N_("/Lower Channel"), "<control>B", channels_dialog_lower_channel_callback, 0 },
{ N_("/Duplicate Channel"), "<control>C", channels_dialog_duplicate_channel_callback, 0 },
{ N_("/Delete Channel"), "<control>X", channels_dialog_delete_channel_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Channel to Selection"), "<control>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"), "<control>N", paths_dialog_new_path_callback, 0 },
{ N_("/Duplicate Path"), "<control>U", paths_dialog_dup_path_callback, 0 },
{ N_("/Delete Path"), "<control>X", paths_dialog_delete_path_callback, 0 },
{ N_("/Path to Selection"), "<control>S", paths_dialog_path_to_sel_callback, 0 },
{ N_("/Stroke Path"), "<control>T", paths_dialog_stroke_path_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Copy Path"), "<control>C", paths_dialog_copy_path_callback, 0 },
{ N_("/Paste Path"), "<control>V", paths_dialog_paste_path_callback, 0 },
{ N_("/Import Path"), "<control>I", paths_dialog_import_path_callback, 0 },
{ N_("/Export Path"), "<control>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, "<Image>", 7))
for (i = 0; i < n_menu_entries; i++)
if (! strncmp (entries[i].path, "<Image>", 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<n; i++) {
/* Translation. Note the explicit use of gettext(). */
ret[i].path=g_strdup( gettext(entries[i].path) );
/* accelerator and item_type are not duped, only referenced */
ret[i].accelerator=entries[i].accelerator;
ret[i].callback=entries[i].callback;
ret[i].callback_action=entries[i].callback_action;
ret[i].item_type=entries[i].item_type;
}
ret = g_malloc (sizeof (GtkItemFactoryEntry) * n);
for (i=0; i<n; i++)
{
/* Translation. Note the explicit use of gettext(). */
ret[i].path = g_strdup (gettext (entries[i].path));
/* accelerator and item_type are not duped, only referenced */
ret[i].accelerator = entries[i].accelerator;
ret[i].callback = entries[i].callback;
ret[i].callback_action = entries[i].callback_action;
ret[i].item_type = entries[i].item_type;
}
return ret;
}
static void
free_translated_entries(GtkItemFactoryEntry *entries, gint n)
free_translated_entries (GtkItemFactoryEntry *entries, gint n)
{
gint i;
for (i=0; i<n; i++)
g_free(entries[i].path);
g_free(entries);
for (i = 0; i < n; i++)
g_free (entries[i].path);
g_free (entries);
}
@ -625,32 +733,60 @@ menus_init ()
menus_init_toolbox ();
image_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Image>", 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, "<Load>", 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, "<Save>", 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, "<Layers>", 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, "<Channels>", 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, "<Paths>", 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);

View File

@ -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__ */

View File

@ -21,14 +21,12 @@
#include <math.h>
#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"

View File

@ -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 <stdio.h>
@ -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 (_("<Paths>/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 (_("<Paths>/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 (_("<Paths>/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 (_("<Paths>/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 (_("<Paths>/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 (_("<Paths>/Copy Path"), sensitive);
break;
case PASTE_PATH_BUTTON:
gtk_widget_set_sensitive(paths_ops[8].widget,sensitive);
menus_set_sensitive (_("<Paths>/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 */

View File

@ -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__ */

27
app/paths_dialogP.h Normal file
View File

@ -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__ */

View File

@ -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"

View File

@ -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"

View File

@ -21,14 +21,12 @@
#include <math.h>
#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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -19,13 +19,16 @@
#include <stdlib.h>
#include <string.h>
#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, "<Separator>" },
/* 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"), "<control>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"), "<shift>Prior", layers_dialog_raise_layer_callback, 0 },
{ N_("/Stack/Lower Layer"), "<shift>Next", layers_dialog_lower_layer_callback, 0 },
{ N_("/Stack/Layer to Top"), "<control>Prior", layers_dialog_raise_layer_to_top_callback, 0 },
{ N_("/Stack/Layer to Bottom"), "<control>Next", layers_dialog_lower_layer_to_bottom_callback, 0 },
{ N_("/Duplicate Layer"), "<control>C", layers_dialog_duplicate_layer_callback, 0 },
{ N_("/Delete Layer"), "<control>X", layers_dialog_delete_layer_callback, 0 },
{ N_("/Anchor Layer"), "<control>H", layers_dialog_anchor_layer_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Scale Layer"), "<control>S", layers_dialog_scale_layer_callback, 0 },
{ N_("/Resize Layer"), "<control>R", layers_dialog_resize_layer_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Merge Visible Layers"), "<control>M", layers_dialog_merge_layers_callback, 0 },
{ N_("/Merge Down"), "<control><shift>M", layers_dialog_merge_down_callback, 0 },
{ N_("/Flatten Image"), NULL, layers_dialog_flatten_image_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ 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"), "<control>N", channels_dialog_new_channel_callback, 0 },
{ N_("/Raise Channel"), "<control>F", channels_dialog_raise_channel_callback, 0 },
{ N_("/Lower Channel"), "<control>B", channels_dialog_lower_channel_callback, 0 },
{ N_("/Duplicate Channel"), "<control>C", channels_dialog_duplicate_channel_callback, 0 },
{ N_("/Delete Channel"), "<control>X", channels_dialog_delete_channel_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Channel to Selection"), "<control>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"), "<control>N", paths_dialog_new_path_callback, 0 },
{ N_("/Duplicate Path"), "<control>U", paths_dialog_dup_path_callback, 0 },
{ N_("/Delete Path"), "<control>X", paths_dialog_delete_path_callback, 0 },
{ N_("/Path to Selection"), "<control>S", paths_dialog_path_to_sel_callback, 0 },
{ N_("/Stroke Path"), "<control>T", paths_dialog_stroke_path_callback, 0 },
{ "/---", NULL, NULL, 0, "<Separator>" },
{ N_("/Copy Path"), "<control>C", paths_dialog_copy_path_callback, 0 },
{ N_("/Paste Path"), "<control>V", paths_dialog_paste_path_callback, 0 },
{ N_("/Import Path"), "<control>I", paths_dialog_import_path_callback, 0 },
{ N_("/Export Path"), "<control>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, "<Image>", 7))
for (i = 0; i < n_menu_entries; i++)
if (! strncmp (entries[i].path, "<Image>", 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<n; i++) {
/* Translation. Note the explicit use of gettext(). */
ret[i].path=g_strdup( gettext(entries[i].path) );
/* accelerator and item_type are not duped, only referenced */
ret[i].accelerator=entries[i].accelerator;
ret[i].callback=entries[i].callback;
ret[i].callback_action=entries[i].callback_action;
ret[i].item_type=entries[i].item_type;
}
ret = g_malloc (sizeof (GtkItemFactoryEntry) * n);
for (i=0; i<n; i++)
{
/* Translation. Note the explicit use of gettext(). */
ret[i].path = g_strdup (gettext (entries[i].path));
/* accelerator and item_type are not duped, only referenced */
ret[i].accelerator = entries[i].accelerator;
ret[i].callback = entries[i].callback;
ret[i].callback_action = entries[i].callback_action;
ret[i].item_type = entries[i].item_type;
}
return ret;
}
static void
free_translated_entries(GtkItemFactoryEntry *entries, gint n)
free_translated_entries (GtkItemFactoryEntry *entries, gint n)
{
gint i;
for (i=0; i<n; i++)
g_free(entries[i].path);
g_free(entries);
for (i = 0; i < n; i++)
g_free (entries[i].path);
g_free (entries);
}
@ -625,32 +733,60 @@ menus_init ()
menus_init_toolbox ();
image_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Image>", 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, "<Load>", 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, "<Save>", 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, "<Layers>", 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, "<Channels>", 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, "<Paths>", 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);

View File

@ -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__ */