mirror of https://github.com/GNOME/gimp.git
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:
parent
6cd82f05de
commit
ac98e8fa81
44
ChangeLog
44
ChangeLog
|
@ -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:
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
@ -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__ */
|
||||
|
|
202
app/gui/menus.c
202
app/gui/menus.c
|
@ -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);
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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"
|
||||
|
|
1467
app/layers_dialog.c
1467
app/layers_dialog.c
File diff suppressed because it is too large
Load Diff
|
@ -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__ */
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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 ();
|
||||
}
|
|
@ -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__ */
|
|
@ -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__ */
|
202
app/menus.c
202
app/menus.c
|
@ -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);
|
||||
|
|
43
app/menus.h
43
app/menus.h
|
@ -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__ */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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__ */
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__ */
|
||||
|
|
Loading…
Reference in New Issue