updated the imagemap plug-in

--Sven
This commit is contained in:
Sven Neumann 1999-10-24 20:57:17 +00:00
parent 88e0cc3155
commit ecfb8a1210
76 changed files with 2078 additions and 561 deletions

View File

@ -1,3 +1,7 @@
Sun Oct 24 22:53:17 MEST 1999 Sven Neumann <sven@gimp.org>
* plug-ins/imagemap/* updated imagemap to version 1.3
Sun Oct 24 16:49:13 CEST 1999 Marc Lehmann <pcg@goof.com>
* tools/pdbgen/pdb/drawable.pdb, all calls: fixed some improperly

View File

@ -1,20 +1,55 @@
Sat Aug 28 16:32:03 1999 Maurits Rijk <maurits@frop.edu>
Thu Oct 21 19:58:39 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* release version 1.3
Sat Oct 9 11:39:14 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_main.c (dialog): removed some obsolete funcs.
Sun Oct 3 20:25:32 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_grid.c: prepare for i8n
* imap_polygon.c (polygon_free_list): added
(polygon_assign): free list before adding new points
Sun Sep 26 13:44:15 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_cmd_select_prev.c: created
* imap_cmd_select_prev.h: created
* imap_cmd_select_next.c: created
* imap_cmd_select_next.h: created
* imap_cmd_object_move.c: created
* imap_cmd_object_move.h: created
Wed Sep 8 19:07:19 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_taglist.h: created
* imap_taglist.c: created
Sat Aug 28 16:32:03 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* release version 1.2
Sun Aug 15 16:54:43 1999 Maurits Rijk <maurits@frop.edu>
Sun Aug 15 16:54:43 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_cmd_select_region.h: created
* imap_cmd_move_sash.c: created
Mon Aug 9 22:33:12 1999 Maurits Rijk <maurits@frop.edu>
Mon Aug 9 22:33:12 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_cmd_cut_object.c: created
* imap_cmd_cut_object.h: created
Sun Aug 8 12:54:44 1999 Maurits Rijk <maurits@frop.edu>
Sun Aug 8 12:54:44 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_cmd_cut.c: created
@ -26,26 +61,26 @@ Sun Aug 8 12:54:44 1999 Maurits Rijk <maurits@frop.edu>
* imap_object_popup.h: created
Sat Jul 31 12:34:00 1999 Maurits Rijk <maurits@frop.edu>
Sat Jul 31 12:34:00 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_toolbar.c: Added redo and undo button to toolbar.
Wed Jul 28 22:17:09 1999 Maurits Rijk <maurits@frop.edu>
Wed Jul 28 22:17:09 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_object.c (object_on_button_press): fixed 'round to grid' bug
for polygons.
Tue Jul 27 23:19:00 1999 Maurits Rijk <maurits@frop.edu>
Tue Jul 27 23:19:00 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_edit_area_info.c: use BrowseWidget_t for URL.
Mon Jul 26 22:00:58 1999 Maurits Rijk <maurits@frop.edu>
Mon Jul 26 22:00:58 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_browse.c: created
* imap_object.c (object_list_move_selected_up): fixed move up/down bug.
Mon Jun 28 18:05:24 1999 Maurits Rijk <maurits@frop.edu>
Mon Jun 28 18:05:24 1999 Maurits Rijk <lpeek.mrijk@consunet.nl>
* imap_main.c (dialog): fixed annoying bug

View File

@ -73,12 +73,16 @@ imagemap_SOURCES = \
imap_cmd_move_down.h \
imap_cmd_move_sash.c \
imap_cmd_move_sash.h \
imap_cmd_move_selected.c \
imap_cmd_move_selected.h \
imap_cmd_move_to_front.c \
imap_cmd_move_to_front.h \
imap_cmd_move_up.c \
imap_cmd_move_up.h \
imap_cmd_object_down.c \
imap_cmd_object_down.h \
imap_cmd_object_move.c \
imap_cmd_object_move.h \
imap_cmd_object_up.c \
imap_cmd_object_up.h \
imap_cmd_paste.c \
@ -87,6 +91,10 @@ imagemap_SOURCES = \
imap_cmd_select.h \
imap_cmd_select_all.c \
imap_cmd_select_all.h \
imap_cmd_select_next.c \
imap_cmd_select_next.h \
imap_cmd_select_prev.c \
imap_cmd_select_prev.h \
imap_cmd_select_region.c \
imap_cmd_select_region.h \
imap_cmd_send_to_back.c \
@ -147,6 +155,8 @@ imagemap_SOURCES = \
imap_string.h \
imap_table.c \
imap_table.h \
imap_taglist.c \
imap_taglist.h \
imap_toolbar.c \
imap_toolbar.h \
imap_tools.c \

View File

@ -1,3 +1,17 @@
What's new in GIMP Imagemap plug-in 1.3
* 'Follow' mode to dynamically update object dimensions.
* Added 'Most recently used' and 'Number of Undo levels' to Preferences menu.
* Movement of objects with cursor keys (left/right/up/down). Select next/prev
object with TAB key.
* Double-click in selection brings up Area dialog.
* Drop links (e.g. from Netscape) into the selection list updates the URL.
* Drop links (e.g. from Netscape) onto an object in the preview window updates
the URL.
* A few bug fixes.
* Lot's of internationalization preparations.
* Grid can be dynamically updated when changing grid parameters.
What's new in GIMP Imagemap plug-in 1.2
* Implemented Undo/Redo

View File

@ -1,4 +1,4 @@
This is the GIMP Imagemap plug-in version 1.2. See the INSTALL file for
This is the GIMP Imagemap plug-in version 1.3. See the INSTALL file for
build instructions.
More information can be found on my homepage at

View File

@ -1,14 +1,6 @@
Version 1.3
* 'Follow' mode to dynamically update object dimensions.
* Configuration script
* Handle double-click in selection
* Movement/resizing of objects with cursor keys.
* implement dynamically adjustable grid.
* Snap to grid during resize.
Version 1.4
* Snap to grid during resize.
* 'Divider' object.
* Move polygon sides.
* Gimp style guides.
@ -16,6 +8,7 @@ Version 1.4
Version 1.5
* Standalone version
* Configuration script
* Warning icon for area's without URL.
* Add HTML 4.0 tags (TABINDEX, ACCESKEY)
* User-definable tags
@ -46,5 +39,9 @@ Miscellaneous
* Compare image-name in HTML file with loaded image and issue warning
if different.
* Restrict to screen size for large images.
* Internationalization
* Drag & drop within selection
* Don't redraw complete polygon while moving a sash.
* Compliancy with GIMP 1.1.x:
- Use GIMP's 1.1.x new help system
- Tear-off menu's
- Arrow button with similar action as pop-up in upper left of preview window
- Paner widget in lower right of preview window for fast navigation.

View File

@ -23,21 +23,22 @@
#include "imap_about.h"
#include "imap_default_dialog.h"
#include "libgimp/stdplugins-intl.h"
void
do_about_dialog(void)
{
static DefaultDialog_t *dialog;
if (!dialog) {
dialog = make_default_dialog("About");
dialog = make_default_dialog(_("About"));
default_dialog_hide_cancel_button(dialog);
default_dialog_hide_apply_button(dialog);
default_dialog_set_label(
dialog,
"Imagemap plug-in 1.2\n\n"
"Copyright(c) 1999 by Maurits Rijk\n"
"lpeek.mrijk@consunet.nl \n\n"
" Released under the GNU General Public License ");
_("Imagemap plug-in 1.3\n\n"
"Copyright(c) 1999 by Maurits Rijk\n"
"lpeek.mrijk@consunet.nl \n\n"
" Released under the GNU General Public License "));
}
default_dialog_show(dialog);
}

View File

@ -22,7 +22,6 @@
*/
#include "imap_browse.h"
#include "imap_main.h"
#include "open.xpm"
@ -88,7 +87,6 @@ browse_widget_new(const gchar *name)
GdkPixmap *icon;
GdkBitmap *mask;
GtkStyle *style;
GtkWidget *top = get_top_widget();
browse->file_selection = NULL;
browse->name = name;
@ -107,10 +105,11 @@ browse_widget_new(const gchar *name)
gtk_widget_show(browse->file);
browse->button = button = gtk_button_new();
style = gtk_widget_get_style(top);
icon = gdk_pixmap_create_from_xpm_d(top->window, &mask,
&style->bg[GTK_STATE_NORMAL],
open_xpm);
style = gtk_widget_get_style(button);
icon = gdk_pixmap_colormap_create_from_xpm_d(
button->window, gtk_widget_get_colormap(button), &mask,
&style->bg[GTK_STATE_NORMAL], open_xpm);
iconw = gtk_pixmap_new(icon, mask);
gtk_widget_show(iconw);
gtk_container_add(GTK_CONTAINER(button), iconw);

View File

@ -216,7 +216,7 @@ static const short yycheck[] = { 3,
0, 15, 12, 10, 0, 14, 12, 15
};
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
#line 3 "/usr/lib/bison.simple"
#line 3 "bison.simple"
/* Skeleton output parser for bison,
Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
@ -409,7 +409,7 @@ __yy_memcpy (char *to, char *from, int count)
#endif
#endif
#line 196 "/usr/lib/bison.simple"
#line 196 "bison.simple"
/* The user can define YYPARSE_PARAM as the name of an argument to be passed
into yyparse. The argument should have type void *.
@ -794,7 +794,7 @@ case 22:
break;}
}
/* the action file gets copied in in place of this dollarsign */
#line 498 "/usr/lib/bison.simple"
#line 498 "bison.simple"
yyvsp -= yylen;
yyssp -= yylen;

View File

@ -24,6 +24,7 @@
#include <math.h>
#include "imap_circle.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_misc.h"
#include "imap_object_popup.h"
@ -33,7 +34,7 @@
static gboolean circle_is_valid(Object_t *obj);
static Object_t *circle_clone(Object_t *obj);
static Object_t *circle_assign(Object_t *obj, Object_t *des);
static void circle_assign(Object_t *obj, Object_t *des);
static void circle_draw(Object_t* obj, GdkWindow *window, GdkGC* gc);
static void circle_draw_sashes(Object_t* obj, GdkWindow *window, GdkGC* gc);
static MoveSashFunc_t circle_near_sash(Object_t *obj, gint x, gint y);
@ -42,7 +43,7 @@ static void circle_get_dimensions(Object_t *obj, gint *x, gint *y,
gint *width, gint *height);
static void circle_resize(Object_t *obj, gint percentage_x, gint percentage_y);
static void circle_move(Object_t *obj, gint dx, gint dy);
static gpointer circle_create_info_tab(GtkWidget *notebook);
static gpointer circle_create_info_widget(GtkWidget *frame);
static void circle_fill_info_tab(Object_t *obj, gpointer data);
static void circle_set_initial_focus(Object_t *obj, gpointer data);
static void circle_update(Object_t* obj, gpointer data);
@ -55,6 +56,7 @@ static void circle_write_ncsa(Object_t* obj, gpointer param,
static char** circle_get_icon_data(void);
static ObjectClass_t circle_class = {
"Circle",
NULL, /* info_dialog */
NULL, /* icon */
NULL, /* mask */
@ -71,7 +73,8 @@ static ObjectClass_t circle_class = {
circle_get_dimensions,
circle_resize,
circle_move,
circle_create_info_tab,
circle_create_info_widget,
circle_fill_info_tab, /* circle_update_info_widget */
circle_fill_info_tab,
circle_set_initial_focus,
circle_update,
@ -110,7 +113,7 @@ circle_clone(Object_t *obj)
return &clone->obj;
}
static Object_t*
static void
circle_assign(Object_t *obj, Object_t *des)
{
Circle_t *src_circle = ObjectToCircle(obj);
@ -118,7 +121,6 @@ circle_assign(Object_t *obj, Object_t *des)
des_circle->x = src_circle->x;
des_circle->y = src_circle->y;
des_circle->r = src_circle->r;
return object_copy(obj, des);
}
static void
@ -206,45 +208,73 @@ circle_move(Object_t *obj, gint dx, gint dy)
}
typedef struct {
Object_t *obj;
GtkWidget *x;
GtkWidget *y;
GtkWidget *r;
} CircleProperties_t;
static void
x_changed_cb(GtkWidget *widget, gpointer data)
{
Object_t *obj = ((CircleProperties_t*) data)->obj;
gint x = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
ObjectToCircle(obj)->x = x;
edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog);
}
static void
y_changed_cb(GtkWidget *widget, gpointer data)
{
Object_t *obj = ((CircleProperties_t*) data)->obj;
gint y = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
ObjectToCircle(obj)->y = y;
edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog);
}
static void
r_changed_cb(GtkWidget *widget, gpointer data)
{
Object_t *obj = ((CircleProperties_t*) data)->obj;
gint r = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
ObjectToCircle(obj)->r = r;
edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog);
}
static gpointer
circle_create_info_tab(GtkWidget *notebook)
circle_create_info_widget(GtkWidget *frame)
{
CircleProperties_t *props = g_new(CircleProperties_t, 1);
GtkWidget *vbox, *table, *label;
GtkWidget *table;
gint max_width = get_image_width();
gint max_height = get_image_height();
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
table = gtk_table_new(3, 3, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(frame), table);
gtk_container_set_border_width(GTK_CONTAINER(table), 10);
gtk_table_set_row_spacings(GTK_TABLE(table), 10);
gtk_table_set_col_spacings(GTK_TABLE(table), 10);
gtk_widget_show(table);
create_label_in_table(table, 0, 0, "Center x:");
create_label_in_table(table, 0, 0, _("Center x:"));
props->x = create_spin_button_in_table(table, 0, 1, 1, 0, max_width - 1);
create_label_in_table(table, 0, 2, "pixels");
gtk_signal_connect(GTK_OBJECT(props->x), "changed",
(GtkSignalFunc) x_changed_cb, (gpointer) props);
create_label_in_table(table, 0, 2, _("pixels"));
create_label_in_table(table, 1, 0, "Center y:");
create_label_in_table(table, 1, 0, _("Center y:"));
props->y = create_spin_button_in_table(table, 1, 1, 1, 0, max_height - 1);
create_label_in_table(table, 1, 2, "pixels");
gtk_signal_connect(GTK_OBJECT(props->y), "changed",
(GtkSignalFunc) y_changed_cb, (gpointer) props);
create_label_in_table(table, 1, 2, _("pixels"));
create_label_in_table(table, 2, 0, "Radius:");
create_label_in_table(table, 2, 0, _("Radius:"));
props->r = create_spin_button_in_table(table, 2, 1, 1, 1, G_MAXINT);
create_label_in_table(table, 2, 2, "pixels");
gtk_signal_connect(GTK_OBJECT(props->r), "changed",
(GtkSignalFunc) r_changed_cb, (gpointer) props);
create_label_in_table(table, 2, 2, _("pixels"));
label = gtk_label_new("Circle");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
return props;
}
@ -254,6 +284,7 @@ circle_fill_info_tab(Object_t *obj, gpointer data)
Circle_t *circle = ObjectToCircle(obj);
CircleProperties_t *props = (CircleProperties_t*) data;
props->obj = obj;
gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->x), circle->x);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->y), circle->y);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->r), circle->r);

View File

@ -23,9 +23,10 @@
#include "imap_cmd_clear.h"
#include "imap_cmd_delete.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static gboolean clear_command_execute(Command_t *parent);
static CmdExecuteValue_t clear_command_execute(Command_t *parent);
static void clear_command_undo(Command_t *parent);
static void clear_command_redo(Command_t *parent);
@ -46,7 +47,7 @@ clear_command_new(ObjectList_t *list)
{
ClearCommand_t *command = g_new(ClearCommand_t, 1);
command->list = list;
return command_init(&command->parent, "Clear", &clear_command_class);
return command_init(&command->parent, _("Clear"), &clear_command_class);
}
static void
@ -57,7 +58,7 @@ remove_one_object(Object_t *obj, gpointer data)
delete_command_new(command->list, obj));
}
static gboolean
static CmdExecuteValue_t
clear_command_execute(Command_t *parent)
{
ClearCommand_t *command = (ClearCommand_t*) parent;
@ -68,7 +69,7 @@ clear_command_execute(Command_t *parent)
object_list_remove_remove_cb(command->list, id);
redraw_preview(); /* Fix me! */
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -21,10 +21,10 @@
*
*/
#include <stdio.h>
#include "imap_cmd_copy.h"
#include "libgimp/stdplugins-intl.h"
static gboolean copy_command_execute(Command_t *parent);
static CmdExecuteValue_t copy_command_execute(Command_t *parent);
static void copy_command_undo(Command_t *parent);
static CommandClass_t copy_command_class = {
@ -46,17 +46,17 @@ copy_command_new(ObjectList_t *list)
CopyCommand_t *command = g_new(CopyCommand_t, 1);
command->list = list;
command->paste_buffer = NULL;
return command_init(&command->parent, "Copy", &copy_command_class);
return command_init(&command->parent, _("Copy"), &copy_command_class);
}
static gboolean
static CmdExecuteValue_t
copy_command_execute(Command_t *parent)
{
CopyCommand_t *command = (CopyCommand_t*) parent;
command->paste_buffer = object_list_copy(command->paste_buffer,
get_paste_buffer());
object_list_copy_to_paste_buffer(command->list);
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -22,9 +22,10 @@
*/
#include "imap_cmd_copy_object.h"
#include "libgimp/stdplugins-intl.h"
static void copy_object_command_destruct(Command_t *parent);
static gboolean copy_object_command_execute(Command_t *parent);
static CmdExecuteValue_t copy_object_command_execute(Command_t *parent);
static void copy_object_command_undo(Command_t *parent);
static CommandClass_t copy_object_command_class = {
@ -46,7 +47,8 @@ copy_object_command_new(Object_t *obj)
CopyObjectCommand_t *command = g_new(CopyObjectCommand_t, 1);
command->obj = object_ref(obj);
command->paste_buffer = NULL;
return command_init(&command->parent, "Copy", &copy_object_command_class);
return command_init(&command->parent, _("Copy"),
&copy_object_command_class);
}
static void
@ -56,7 +58,7 @@ copy_object_command_destruct(Command_t *parent)
object_unref(command->obj);
}
static gboolean
static CmdExecuteValue_t
copy_object_command_execute(Command_t *parent)
{
CopyObjectCommand_t *command = (CopyObjectCommand_t*) parent;
@ -67,7 +69,7 @@ copy_object_command_execute(Command_t *parent)
clear_paste_buffer();
object_list_append(paste_buffer, object_clone(command->obj));
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -22,9 +22,10 @@
*/
#include "imap_cmd_create.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static gboolean create_command_execute(Command_t *parent);
static CmdExecuteValue_t create_command_execute(Command_t *parent);
static void create_command_destruct(Command_t *parent);
static void create_command_undo(Command_t *parent);
@ -48,7 +49,7 @@ create_command_new(ObjectList_t *list, Object_t *obj)
CreateCommand_t *command = g_new(CreateCommand_t, 1);
command->list = list;
command->obj = object_ref(obj);
return command_init(&command->parent, "Create", &create_command_class);
return command_init(&command->parent, _("Create"), &create_command_class);
}
static void
@ -58,14 +59,14 @@ create_command_destruct(Command_t *parent)
object_unref(command->obj);
}
static gboolean
static CmdExecuteValue_t
create_command_execute(Command_t *parent)
{
CreateCommand_t *command = (CreateCommand_t*) parent;
command->changed = object_list_get_changed(command->list);
object_list_append(command->list, object_ref(command->obj));
redraw_preview(); /* fix me! */
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -23,10 +23,11 @@
#include "imap_cmd_delete.h"
#include "imap_cmd_cut.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static void cut_command_destruct(Command_t *parent);
static gboolean cut_command_execute(Command_t *parent);
static CmdExecuteValue_t cut_command_execute(Command_t *parent);
static void cut_command_undo(Command_t *parent);
static void cut_command_redo(Command_t *parent);
@ -49,7 +50,7 @@ cut_command_new(ObjectList_t *list)
CutCommand_t *command = g_new(CutCommand_t, 1);
command->list = list;
command->paste_buffer = NULL;
return command_init(&command->parent, "Cut", &cut_command_class);
return command_init(&command->parent, _("Cut"), &cut_command_class);
}
static void
@ -67,7 +68,7 @@ remove_one_object(Object_t *obj, gpointer data)
delete_command_new(command->list, obj));
}
static gboolean
static CmdExecuteValue_t
cut_command_execute(Command_t *parent)
{
CutCommand_t *command = (CutCommand_t*) parent;
@ -80,7 +81,7 @@ cut_command_execute(Command_t *parent)
object_list_remove_remove_cb(command->list, id);
redraw_preview(); /* Fix me! */
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -24,9 +24,10 @@
#include "imap_cmd_copy_object.h"
#include "imap_cmd_cut_object.h"
#include "imap_cmd_delete.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static gboolean cut_object_command_execute(Command_t *parent);
static CmdExecuteValue_t cut_object_command_execute(Command_t *parent);
static void cut_object_command_undo(Command_t *parent);
static void cut_object_command_redo(Command_t *parent);
@ -47,19 +48,19 @@ cut_object_command_new(Object_t *obj)
CutObjectCommand_t *command = g_new(CutObjectCommand_t, 1);
Command_t *parent;
parent = command_init(&command->parent, "Cut", &cut_object_command_class);
parent = command_init(&command->parent, _("Cut"),
&cut_object_command_class);
command_add_subcommand(parent, copy_object_command_new(obj));
command_add_subcommand(parent, delete_command_new(obj->list, obj));
return parent;
}
static gboolean
static CmdExecuteValue_t
cut_object_command_execute(Command_t *parent)
{
redraw_preview(); /* fix me! */
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -22,11 +22,11 @@
*/
#include "imap_cmd_delete.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static void delete_command_destruct(Command_t *parent);
static gboolean delete_command_execute(Command_t *parent);
static CmdExecuteValue_t delete_command_execute(Command_t *parent);
static void delete_command_undo(Command_t *parent);
static CommandClass_t delete_command_class = {
@ -50,7 +50,7 @@ delete_command_new(ObjectList_t *list, Object_t *obj)
DeleteCommand_t *command = g_new(DeleteCommand_t, 1);
command->list = list;
command->obj = object_ref(obj);
return command_init(&command->parent, "Delete",
return command_init(&command->parent, _("Delete"),
&delete_command_class);
}
@ -61,14 +61,14 @@ delete_command_destruct(Command_t *parent)
object_unref(command->obj);
}
static gboolean
static CmdExecuteValue_t
delete_command_execute(Command_t *parent)
{
DeleteCommand_t *command = (DeleteCommand_t*) parent;
command->changed = object_list_get_changed(command->list);
command->position = object_get_position_in_list(command->obj);
object_list_remove(command->list, command->obj);
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -22,10 +22,11 @@
*/
#include "imap_cmd_delete_point.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_polygon.h"
static gboolean delete_point_command_execute(Command_t *parent);
static CmdExecuteValue_t delete_point_command_execute(Command_t *parent);
static void delete_point_command_undo(Command_t *parent);
static CommandClass_t delete_point_command_class = {
@ -53,11 +54,11 @@ delete_point_command_new(Object_t *obj, GdkPoint *point)
command->copy = *point;
command->position = g_list_index(command->polygon->points,
(gpointer) point);
return command_init(&command->parent, "Delete Point",
return command_init(&command->parent, _("Delete Point"),
&delete_point_command_class);
}
static gboolean
static CmdExecuteValue_t
delete_point_command_execute(Command_t *parent)
{
DeletePointCommand_t *command = (DeletePointCommand_t*) parent;
@ -67,7 +68,7 @@ delete_point_command_execute(Command_t *parent)
g_free(p->data);
polygon->points = g_list_remove_link(polygon->points, p);
redraw_preview(); /* Fix me! */
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -22,7 +22,7 @@
*/
#include "imap_cmd_edit_object.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static void edit_object_command_destruct(Command_t *parent);
@ -47,7 +47,7 @@ edit_object_command_new(Object_t *obj)
EditObjectCommand_t *command = g_new(EditObjectCommand_t, 1);
command->obj = object_ref(obj);
command->copy = object_clone(obj);
return command_init(&command->parent, "Edit Object",
return command_init(&command->parent, _("Edit Object"),
&edit_object_command_class);
}

View File

@ -26,6 +26,7 @@
#include "imap_cmd_create.h"
#include "imap_default_dialog.h"
#include "imap_cmd_guides.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_rectangle.h"
#include "imap_table.h"
@ -66,7 +67,7 @@ guides_ok_cb(gpointer data)
rows = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->no_down));
cols = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->no_across));
subcommand_start("Create Guides");
subcommand_start(_("Create Guides"));
y = top;
for (i = 0; i < rows; i++) {
gint x = left;
@ -106,7 +107,7 @@ recalc_bounds(GtkWidget *widget, gpointer data)
bound_w = (width + hspace) * cols - hspace;
bound_h = (height + vspace) * rows - vspace;
sprintf(bounds, "Resulting Guide Bounds: %d,%d to %d,%d (%d areas)",
sprintf(bounds, _("Resulting Guide Bounds: %d,%d to %d,%d (%d areas)"),
left, top, left + bound_w, top + bound_h, rows * cols);
if (left + bound_w > get_image_width() ||
top + bound_h > get_image_height()) {
@ -130,10 +131,10 @@ make_guides_dialog()
default_dialog_set_ok_cb(dialog, guides_ok_cb, data);
label = gtk_label_new(
"Guides are pre-defined rectangles covering the image. You define\n"
"them by their width, height, and spacing from each other. This\n"
"allows you to rapidly create the most common image map type -\n"
"image collection of \"thumbnails\", suitable for navigation bars.");
_("Guides are pre-defined rectangles covering the image. You define\n"
"them by their width, height, and spacing from each other. This\n"
"allows you to rapidly create the most common image map type -\n"
"image collection of \"thumbnails\", suitable for navigation bars."));
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
gtk_container_set_border_width(
GTK_CONTAINER(GTK_DIALOG(dialog->dialog)->vbox), 10);
@ -158,42 +159,42 @@ make_guides_dialog()
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog->dialog)->vbox), table);
gtk_widget_show(table);
create_label_in_table(table, 0, 0, "Width");
create_label_in_table(table, 0, 0, _("Width"));
data->width = create_spin_button_in_table(table, 0, 1, 32, 1, 100);
gtk_signal_connect(GTK_OBJECT(data->width), "changed",
GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data);
create_label_in_table(table, 0, 2, "Left Start at");
create_label_in_table(table, 0, 2, _("Left Start at"));
data->left = create_spin_button_in_table(table, 0, 3, 0, 0, 100);
gtk_signal_connect(GTK_OBJECT(data->left), "changed",
GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data);
create_label_in_table(table, 1, 0, "Height");
create_label_in_table(table, 1, 0, _("Height"));
data->height = create_spin_button_in_table(table, 1, 1, 32, 1, 100);
gtk_signal_connect(GTK_OBJECT(data->height), "changed",
GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data);
create_label_in_table(table, 1, 2, "Top Start at");
create_label_in_table(table, 1, 2, _("Top Start at"));
data->top = create_spin_button_in_table(table, 1, 3, 0, 0, 100);
gtk_signal_connect(GTK_OBJECT(data->top), "changed",
GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data);
create_label_in_table(table, 2, 0, "Horz. Spacing");
create_label_in_table(table, 2, 0, _("Horz. Spacing"));
data->horz_spacing = create_spin_button_in_table(table, 2, 1, 0, 0, 100);
gtk_signal_connect(GTK_OBJECT(data->horz_spacing), "changed",
GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data);
create_label_in_table(table, 2, 2, "No. Across");
create_label_in_table(table, 2, 2, _("No. Across"));
data->no_across = create_spin_button_in_table(table, 2, 3, 0, 0, 100);
gtk_signal_connect(GTK_OBJECT(data->no_across), "changed",
GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data);
create_label_in_table(table, 3, 0, "Vert. Spacing");
create_label_in_table(table, 3, 0, _("Vert. Spacing"));
data->vert_spacing = create_spin_button_in_table(table, 3, 1, 0, 0, 100);
gtk_signal_connect(GTK_OBJECT(data->vert_spacing), "changed",
GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data);
create_label_in_table(table, 3, 2, "No. Down");
create_label_in_table(table, 3, 2, _("No. Down"));
data->no_down = create_spin_button_in_table(table, 3, 3, 0, 0, 100);
gtk_signal_connect(GTK_OBJECT(data->no_down), "changed",
GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data);
@ -218,11 +219,11 @@ init_guides_dialog(GuidesDialog_t *dialog, ObjectList_t *list)
char dimension[128];
dialog->list = list;
sprintf(dimension, "Image dimensions: %d x %d", get_image_width(),
sprintf(dimension, _("Image dimensions: %d x %d"), get_image_width(),
get_image_height());
gtk_label_set_text(GTK_LABEL(dialog->image_dimensions), dimension);
gtk_label_set_text(GTK_LABEL(dialog->guide_bounds),
"Resulting Guide Bounds: 0,0 to 0,0 (0 areas)");
_("Resulting Guide Bounds: 0,0 to 0,0 (0 areas)"));
gtk_widget_grab_focus(dialog->width);
}
@ -238,7 +239,7 @@ do_create_guides_dialog(ObjectList_t *list)
default_dialog_show(dialog->dialog);
}
static gboolean guides_command_execute(Command_t *parent);
static CmdExecuteValue_t guides_command_execute(Command_t *parent);
static CommandClass_t guides_command_class = {
NULL, /* guides_command_destruct */
@ -257,13 +258,13 @@ guides_command_new(ObjectList_t *list)
{
GuidesCommand_t *command = g_new(GuidesCommand_t, 1);
command->list = list;
return command_init(&command->parent, "Guides", &guides_command_class);
return command_init(&command->parent, _("Guides"), &guides_command_class);
}
static gboolean
static CmdExecuteValue_t
guides_command_execute(Command_t *parent)
{
GuidesCommand_t *command = (GuidesCommand_t*) parent;
do_create_guides_dialog(command->list);
return FALSE;
return CMD_DESTRUCT;
}

View File

@ -22,10 +22,11 @@
*/
#include "imap_cmd_insert_point.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_polygon.h"
static gboolean insert_point_command_execute(Command_t *parent);
static CmdExecuteValue_t insert_point_command_execute(Command_t *parent);
static void insert_point_command_undo(Command_t *parent);
static CommandClass_t insert_point_command_class = {
@ -53,11 +54,11 @@ insert_point_command_new(Object_t *obj, gint x, gint y, gint edge)
command->x = x;
command->y = y;
command->edge = edge;
return command_init(&command->parent, "Insert Point",
return command_init(&command->parent, _("Insert Point"),
&insert_point_command_class);
}
static gboolean
static CmdExecuteValue_t
insert_point_command_execute(Command_t *parent)
{
InsertPointCommand_t *command = (InsertPointCommand_t*) parent;
@ -75,7 +76,7 @@ insert_point_command_execute(Command_t *parent)
}
redraw_preview();
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -21,35 +21,63 @@
*
*/
#include "imap_cmd_copy.h"
#include "imap_cmd_move.h"
#include "imap_cmd_object_move.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static void move_command_destruct(Command_t *parent);
static gboolean move_command_execute(Command_t *parent);
static void move_command_undo(Command_t *parent);
static CmdExecuteValue_t move_command_execute(Command_t *parent);
CommandClass_t move_command_class = {
move_command_destruct,
move_command_execute,
move_command_undo,
NULL, /* move_command_undo */
NULL /* move_command_redo */
};
typedef struct {
Command_t parent;
PreferencesData_t *preferences;
Preview_t *preview;
Object_t *obj;
gint dx;
gint dy;
gint start_x;
gint start_y;
gint obj_start_x;
gint obj_start_y;
gint obj_x;
gint obj_y;
gint obj_width;
gint obj_height;
gint image_width;
gint image_height;
GdkCursorType cursor; /* Remember previous cursor */
gboolean moved_first_time;
} MoveCommand_t;
Command_t*
move_command_new(Object_t *obj, gint dx, gint dy)
move_command_new(Preview_t *preview, Object_t *obj, gint x, gint y)
{
MoveCommand_t *command = g_new(MoveCommand_t, 1);
command->preferences = get_preferences();
command->preview = preview;
command->obj = object_ref(obj);
command->dx = dx;
command->dy = dy;
return command_init(&command->parent, "Move", &move_command_class);
command->start_x = x;
command->start_y = y;
object_get_dimensions(obj, &command->obj_x, &command->obj_y,
&command->obj_width, &command->obj_height);
command->obj_start_x = command->obj_x;
command->obj_start_y = command->obj_y;
command->image_width = get_image_width();
command->image_height = get_image_height();
command->moved_first_time = TRUE;
return command_init(&command->parent, _("Move"), &move_command_class);
}
static void
@ -59,20 +87,79 @@ move_command_destruct(Command_t *parent)
object_unref(command->obj);
}
static gboolean
move_command_execute(Command_t *parent)
static void
button_motion(GtkWidget *widget, GdkEventMotion *event, gpointer data)
{
MoveCommand_t *command = (MoveCommand_t*) parent;
object_move(command->obj, command->dx, command->dy);
redraw_preview(); /* fix me! */
return TRUE;
MoveCommand_t *command = (MoveCommand_t*) data;
Object_t *obj = command->obj;
gint dx = get_real_coord((gint) event->x) - command->start_x;
gint dy = get_real_coord((gint) event->y) - command->start_y;
if (command->moved_first_time) {
command->moved_first_time = FALSE;
command->cursor = preview_set_cursor(command->preview, GDK_FLEUR);
gdk_gc_set_function(command->preferences->normal_gc, GDK_EQUIV);
gdk_gc_set_function(command->preferences->selected_gc, GDK_EQUIV);
hide_url();
}
if (command->obj_x + dx < 0)
dx = -command->obj_x;
if (command->obj_x + command->obj_width + dx > command->image_width)
dx = command->image_width - command->obj_width - command->obj_x;
if (command->obj_y + dy < 0)
dy = -command->obj_y;
if (command->obj_y + command->obj_height + dy > command->image_height)
dy = command->image_height - command->obj_height - command->obj_y;
if (dx || dy) {
command->start_x = get_real_coord((gint) event->x);
command->start_y = get_real_coord((gint) event->y);
command->obj_x += dx;
command->obj_y += dy;
object_draw(obj, widget->window);
object_move(obj, dx, dy);
object_draw(obj, widget->window);
}
}
static void
move_command_undo(Command_t *parent)
button_release(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
MoveCommand_t *command = (MoveCommand_t*) parent;
object_move(command->obj, -command->dx, -command->dy);
redraw_preview(); /* fix me! */
MoveCommand_t *command = (MoveCommand_t*) data;
gtk_signal_disconnect_by_func(GTK_OBJECT(widget),
(GtkSignalFunc) button_motion, data);
gtk_signal_disconnect_by_func(GTK_OBJECT(widget),
(GtkSignalFunc) button_release, data);
if (!command->moved_first_time) {
preview_set_cursor(command->preview, command->cursor);
gdk_gc_set_function(command->preferences->normal_gc, GDK_COPY);
gdk_gc_set_function(command->preferences->selected_gc, GDK_COPY);
show_url();
}
command->obj_x -= command->obj_start_x;
command->obj_y -= command->obj_start_y;
if (command->obj_x || command->obj_y)
command_list_add(object_move_command_new(command->obj, command->obj_x,
command->obj_y));
preview_thaw();
}
static CmdExecuteValue_t
move_command_execute(Command_t *parent)
{
MoveCommand_t *command = (MoveCommand_t*) parent;
GtkWidget *widget = command->preview->preview;
preview_freeze();
gtk_signal_connect(GTK_OBJECT(widget), "button_release_event",
(GtkSignalFunc) button_release, command);
gtk_signal_connect(GTK_OBJECT(widget), "motion_notify_event",
(GtkSignalFunc) button_motion, command);
return CMD_DESTRUCT;
}

View File

@ -26,7 +26,8 @@
#include "imap_command.h"
#include "imap_object.h"
#include "imap_preview.h"
Command_t *move_command_new(Object_t *obj, gint x, gint y);
Command_t *move_command_new(Preview_t *preview, Object_t *obj, gint x, gint y);
#endif /* _IMAP_CMD_MOVE_H */

View File

@ -23,9 +23,10 @@
#include "imap_cmd_copy.h"
#include "imap_cmd_object_down.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static gboolean move_down_command_execute(Command_t *parent);
static CmdExecuteValue_t move_down_command_execute(Command_t *parent);
static void move_down_command_undo(Command_t *parent);
static void move_down_command_redo(Command_t *parent);
@ -48,7 +49,7 @@ move_down_command_new(ObjectList_t *list)
MoveDownCommand_t *command = g_new(MoveDownCommand_t, 1);
command->list = list;
command->add = FALSE;
return command_init(&command->parent, "Move Down",
return command_init(&command->parent, _("Move Down"),
&move_down_command_class);
}
@ -67,7 +68,7 @@ move_down_one_object(Object_t *obj, gpointer data)
}
}
static gboolean
static CmdExecuteValue_t
move_down_command_execute(Command_t *parent)
{
MoveDownCommand_t *command = (MoveDownCommand_t*) parent;
@ -78,7 +79,7 @@ move_down_command_execute(Command_t *parent)
object_list_remove_move_cb(command->list, id);
redraw_preview(); /* fix me! */
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -23,6 +23,7 @@
#include "imap_cmd_copy.h"
#include "imap_cmd_edit_object.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
COMMAND_PROTO(move_sash_command);
@ -60,7 +61,7 @@ move_sash_command_new(GtkWidget *widget, Object_t *obj,
command->image_height = get_image_height();
command->sash_func = sash_func;
parent = command_init(&command->parent, "Move Sash",
parent = command_init(&command->parent, _("Move Sash"),
&move_sash_command_class);
command_add_subcommand(parent, edit_object_command_new(obj));
@ -105,6 +106,7 @@ sash_move(GtkWidget *widget, GdkEventMotion *event, gpointer data)
object_draw(obj, widget->window);
command->sash_func(obj, dx, dy);
object_emit_geometry_signal(obj);
object_draw(obj, widget->window);
}
@ -121,23 +123,25 @@ sash_end(GtkWidget *widget, GdkEventButton *event, gpointer data)
if (obj->class->normalize)
object_normalize(obj);
gdk_gc_set_function(get_preferences()->selected_gc, GDK_COPY);
redraw_preview();
/* redraw_preview(); */
preview_thaw();
show_url();
}
static gboolean
static CmdExecuteValue_t
move_sash_command_execute(Command_t *parent)
{
MoveSashCommand_t *command = (MoveSashCommand_t*) parent;
hide_url();
preview_freeze();
gtk_signal_connect(GTK_OBJECT(command->widget), "button_release_event",
(GtkSignalFunc) sash_end, command);
gtk_signal_connect(GTK_OBJECT(command->widget), "motion_notify_event",
(GtkSignalFunc) sash_move, command);
gdk_gc_set_function(get_preferences()->selected_gc, GDK_EQUIV);
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -0,0 +1,76 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 "imap_cmd_move_selected.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static CmdExecuteValue_t move_selected_command_execute(Command_t *parent);
static void move_selected_command_undo(Command_t *parent);
CommandClass_t move_selected_command_class = {
NULL, /* move_selected_command_destruct */
move_selected_command_execute,
move_selected_command_undo,
NULL /* move_selected_command_redo */
};
typedef struct {
Command_t parent;
ObjectList_t *list;
gint dx;
gint dy;
} MoveSelectedCommand_t;
Command_t*
move_selected_command_new(ObjectList_t *list, gint dx, gint dy)
{
MoveSelectedCommand_t *command = g_new(MoveSelectedCommand_t, 1);
command->list = list;
command->dx = dx;
command->dy = dy;
return command_init(&command->parent, _("Move Selected Objects"),
&move_selected_command_class);
}
static CmdExecuteValue_t
move_selected_command_execute(Command_t *parent)
{
MoveSelectedCommand_t *command = (MoveSelectedCommand_t*) parent;
object_list_move_selected(command->list, command->dx, command->dy);
#ifdef _OLD_
redraw_preview(); /* fix me! */
#endif
return CMD_APPEND;
}
static void
move_selected_command_undo(Command_t *parent)
{
MoveSelectedCommand_t *command = (MoveSelectedCommand_t*) parent;
object_list_move_selected(command->list, -command->dx, -command->dy);
#ifdef _OLD_
redraw_preview(); /* fix me! */
#endif
}

View File

@ -0,0 +1,32 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 _IMAP_CMD_MOVE_SELECTED_H
#define _IMAP_CMD_MOVE_SELECTED_H
#include "imap_command.h"
#include "imap_object.h"
Command_t *move_selected_command_new(ObjectList_t *list, gint dx, gint dy);
#endif /* _IMAP_CMD_MOVE_SELECTED_H */

View File

@ -26,7 +26,7 @@
#include "imap_cmd_move_to_front.h"
#include "imap_main.h"
static gboolean move_to_front_command_execute(Command_t *parent);
static CmdExecuteValue_t move_to_front_command_execute(Command_t *parent);
static void move_to_front_command_undo(Command_t *parent);
static void move_to_front_command_redo(Command_t *parent);
@ -67,7 +67,7 @@ add_one_object(Object_t *obj, gpointer data)
create_command_new(command->list, obj));
}
static gboolean
static CmdExecuteValue_t
move_to_front_command_execute(Command_t *parent)
{
MoveToFrontCommand_t *command = (MoveToFrontCommand_t*) parent;
@ -80,7 +80,7 @@ move_to_front_command_execute(Command_t *parent)
redraw_preview(); /* Fix me! */
object_list_remove_remove_cb(command->list, id1);
object_list_remove_add_cb(command->list, id2);
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -23,9 +23,10 @@
#include "imap_cmd_move_up.h"
#include "imap_cmd_object_up.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static gboolean move_up_command_execute(Command_t *parent);
static CmdExecuteValue_t move_up_command_execute(Command_t *parent);
static void move_up_command_undo(Command_t *parent);
static void move_up_command_redo(Command_t *parent);
@ -48,7 +49,7 @@ move_up_command_new(ObjectList_t *list)
MoveUpCommand_t *command = g_new(MoveUpCommand_t, 1);
command->list = list;
command->add = FALSE;
return command_init(&command->parent, "Move Up", &move_up_command_class);
return command_init(&command->parent, _("Move Up"), &move_up_command_class);
}
static void
@ -66,7 +67,7 @@ move_up_one_object(Object_t *obj, gpointer data)
}
}
static gboolean
static CmdExecuteValue_t
move_up_command_execute(Command_t *parent)
{
MoveUpCommand_t *command = (MoveUpCommand_t*) parent;
@ -77,7 +78,7 @@ move_up_command_execute(Command_t *parent)
object_list_remove_move_cb(command->list, id);
redraw_preview(); /* fix me! */
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -22,10 +22,11 @@
*/
#include "imap_cmd_copy.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static void object_down_command_destruct(Command_t *parent);
static gboolean object_down_command_execute(Command_t *parent);
static CmdExecuteValue_t object_down_command_execute(Command_t *parent);
static void object_down_command_undo(Command_t *parent);
CommandClass_t object_down_command_class = {
@ -47,7 +48,7 @@ object_down_command_new(ObjectList_t *list, Object_t *obj)
ObjectDownCommand_t *command = g_new(ObjectDownCommand_t, 1);
command->list = list;
command->obj = object_ref(obj);
return command_init(&command->parent, "Move Down",
return command_init(&command->parent, _("Move Down"),
&object_down_command_class);
}
@ -58,13 +59,13 @@ object_down_command_destruct(Command_t *parent)
object_unref(command->obj);
}
static gboolean
static CmdExecuteValue_t
object_down_command_execute(Command_t *parent)
{
ObjectDownCommand_t *command = (ObjectDownCommand_t*) parent;
object_list_move_down(command->list, command->obj);
redraw_preview(); /* fix me! */
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -0,0 +1,84 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 "imap_cmd_object_move.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static void object_move_command_destruct(Command_t *parent);
static CmdExecuteValue_t object_move_command_execute(Command_t *parent);
static void object_move_command_undo(Command_t *parent);
CommandClass_t object_move_command_class = {
object_move_command_destruct,
object_move_command_execute,
object_move_command_undo,
NULL /* object_move_command_redo */
};
typedef struct {
Command_t parent;
Object_t *obj;
gint dx;
gint dy;
} ObjectMoveCommand_t;
Command_t*
object_move_command_new(Object_t *obj, gint dx, gint dy)
{
ObjectMoveCommand_t *command = g_new(ObjectMoveCommand_t, 1);
command->obj = object_ref(obj);
command->dx = dx;
command->dy = dy;
return command_init(&command->parent, _("Move"),
&object_move_command_class);
}
static void
object_move_command_destruct(Command_t *parent)
{
ObjectMoveCommand_t *command = (ObjectMoveCommand_t*) parent;
object_unref(command->obj);
}
static CmdExecuteValue_t
object_move_command_execute(Command_t *parent)
{
ObjectMoveCommand_t *command = (ObjectMoveCommand_t*) parent;
object_move(command->obj, command->dx, command->dy);
#ifdef _OLD_
redraw_preview(); /* fix me! */
#endif
return CMD_APPEND;
}
static void
object_move_command_undo(Command_t *parent)
{
ObjectMoveCommand_t *command = (ObjectMoveCommand_t*) parent;
object_move(command->obj, -command->dx, -command->dy);
#ifdef _OLD_
redraw_preview(); /* fix me! */
#endif
}

View File

@ -0,0 +1,32 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 _IMAP_CMD_OBJECT_MOVE_H
#define _IMAP_CMD_OBJECT_MOVE_H
#include "imap_command.h"
#include "imap_object.h"
Command_t *object_move_command_new(Object_t *obj, gint x, gint y);
#endif /* _IMAP_CMD_OBJECT_MOVE_H */

View File

@ -22,10 +22,11 @@
*/
#include "imap_cmd_copy.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static void object_up_command_destruct(Command_t *parent);
static gboolean object_up_command_execute(Command_t *parent);
static CmdExecuteValue_t object_up_command_execute(Command_t *parent);
static void object_up_command_undo(Command_t *parent);
CommandClass_t object_up_command_class = {
@ -47,7 +48,7 @@ object_up_command_new(ObjectList_t *list, Object_t *obj)
ObjectUpCommand_t *command = g_new(ObjectUpCommand_t, 1);
command->list = list;
command->obj = object_ref(obj);
return command_init(&command->parent, "Move Up",
return command_init(&command->parent, _("Move Up"),
&object_up_command_class);
}
@ -58,13 +59,13 @@ object_up_command_destruct(Command_t *parent)
object_unref(command->obj);
}
static gboolean
static CmdExecuteValue_t
object_up_command_execute(Command_t *parent)
{
ObjectUpCommand_t *command = (ObjectUpCommand_t*) parent;
object_list_move_up(command->list, command->obj);
redraw_preview(); /* fix me! */
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -23,9 +23,10 @@
#include "imap_cmd_create.h"
#include "imap_cmd_paste.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static gboolean paste_command_execute(Command_t *parent);
static CmdExecuteValue_t paste_command_execute(Command_t *parent);
static CommandClass_t paste_command_class = {
NULL, /* paste_command_destruct, */
@ -44,7 +45,7 @@ paste_command_new(ObjectList_t *list)
{
PasteCommand_t *command = g_new(PasteCommand_t, 1);
command->list = list;
return command_init(&command->parent, "Paste", &paste_command_class);
return command_init(&command->parent, _("Paste"), &paste_command_class);
}
static void
@ -55,7 +56,7 @@ paste_one_object(Object_t *obj, gpointer data)
create_command_new(command->list, obj));
}
static gboolean
static CmdExecuteValue_t
paste_command_execute(Command_t *parent)
{
PasteCommand_t *command = (PasteCommand_t*) parent;
@ -65,7 +66,7 @@ paste_command_execute(Command_t *parent)
object_list_paste(command->list);
redraw_preview(); /* Fix me! */
object_list_remove_add_cb(command->list, id);
return TRUE;
return CMD_APPEND;
}

View File

@ -22,11 +22,11 @@
*/
#include "imap_cmd_select.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static void select_command_destruct(Command_t *parent);
static gboolean select_command_execute(Command_t *parent);
static CmdExecuteValue_t select_command_execute(Command_t *parent);
static void select_command_undo(Command_t *parent);
static CommandClass_t select_command_class = {
@ -46,7 +46,7 @@ select_command_new(Object_t *obj)
{
SelectCommand_t *command = g_new(SelectCommand_t, 1);
command->obj = object_ref(obj);
return command_init(&command->parent, "Select", &select_command_class);
return command_init(&command->parent, _("Select"), &select_command_class);
}
static void
@ -56,12 +56,12 @@ select_command_destruct(Command_t *parent)
object_unref(command->obj);
}
static gboolean
static CmdExecuteValue_t
select_command_execute(Command_t *parent)
{
SelectCommand_t *command = (SelectCommand_t*) parent;
object_select(command->obj);
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -23,9 +23,10 @@
#include "imap_cmd_select.h"
#include "imap_cmd_select_all.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static gboolean select_all_command_execute(Command_t *parent);
static CmdExecuteValue_t select_all_command_execute(Command_t *parent);
static void select_all_command_undo(Command_t *parent);
static void select_all_command_redo(Command_t *parent);
@ -46,7 +47,7 @@ select_all_command_new(ObjectList_t *list)
{
SelectAllCommand_t *command = g_new(SelectAllCommand_t, 1);
command->list = list;
return command_init(&command->parent, "Select All",
return command_init(&command->parent, _("Select All"),
&select_all_command_class);
}
@ -57,20 +58,20 @@ select_one_object(Object_t *obj, gpointer data)
command_add_subcommand(&command->parent, select_command_new(obj));
}
static gboolean
static CmdExecuteValue_t
select_all_command_execute(Command_t *parent)
{
SelectAllCommand_t *command = (SelectAllCommand_t*) parent;
gpointer id;
gboolean rvalue;
CmdExecuteValue_t rvalue;
id = object_list_add_select_cb(command->list, select_one_object, command);
if (object_list_select_all(command->list)) {
redraw_preview(); /* Fix me! */
rvalue = TRUE;
rvalue = CMD_APPEND;
} else {
rvalue = FALSE;
rvalue = CMD_DESTRUCT;
}
object_list_remove_select_cb(command->list, id);
return rvalue;

View File

@ -0,0 +1,91 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 "imap_cmd_select.h"
#include "imap_cmd_select_next.h"
#include "imap_cmd_unselect.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static CmdExecuteValue_t select_next_command_execute(Command_t *parent);
static void select_next_command_undo(Command_t *command);
static void select_next_command_redo(Command_t *command);
static CommandClass_t select_next_command_class = {
NULL, /* select_next_command_destruct */
select_next_command_execute,
select_next_command_undo,
select_next_command_redo
};
typedef struct {
Command_t parent;
ObjectList_t *list;
} SelectNextCommand_t;
Command_t*
select_next_command_new(ObjectList_t *list)
{
SelectNextCommand_t *command = g_new(SelectNextCommand_t, 1);
command->list = list;
return command_init(&command->parent, _("Select Next"),
&select_next_command_class);
}
static void
select_one_object(Object_t *obj, gpointer data)
{
SelectNextCommand_t *command = (SelectNextCommand_t*) data;
Command_t *sub_command;
sub_command = (obj->selected)
? select_command_new(obj) : unselect_command_new(obj);
command_add_subcommand(&command->parent, sub_command);
}
static CmdExecuteValue_t
select_next_command_execute(Command_t *parent)
{
SelectNextCommand_t *command = (SelectNextCommand_t*) parent;
ObjectList_t *list = command->list;
gpointer id;
id = object_list_add_select_cb(list, select_one_object, command);
object_list_select_next(list);
object_list_remove_select_cb(list, id);
return CMD_APPEND;
}
static void
select_next_command_undo(Command_t *command)
{
redraw_preview(); /* Fix me! */
}
static void
select_next_command_redo(Command_t *command)
{
redraw_preview(); /* Fix me! */
}

View File

@ -0,0 +1,32 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 _IMAP_CMD_SELECT_NEXT_H
#define _IMAP_CMD_SELECT_NEXT_H
#include "imap_command.h"
#include "imap_object.h"
Command_t *select_next_command_new(ObjectList_t *list);
#endif /* _IMAP_CMD_SELECT_NEXT_H */

View File

@ -0,0 +1,90 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 "imap_cmd_select.h"
#include "imap_cmd_select_prev.h"
#include "imap_cmd_unselect.h"
#include "imap_main.h"
static CmdExecuteValue_t select_prev_command_execute(Command_t *parent);
static void select_prev_command_undo(Command_t *command);
static void select_prev_command_redo(Command_t *command);
static CommandClass_t select_prev_command_class = {
NULL, /* select_prev_command_destruct */
select_prev_command_execute,
select_prev_command_undo,
select_prev_command_redo
};
typedef struct {
Command_t parent;
ObjectList_t *list;
} SelectPrevCommand_t;
Command_t*
select_prev_command_new(ObjectList_t *list)
{
SelectPrevCommand_t *command = g_new(SelectPrevCommand_t, 1);
command->list = list;
return command_init(&command->parent, "Select Previous",
&select_prev_command_class);
}
static void
select_one_object(Object_t *obj, gpointer data)
{
SelectPrevCommand_t *command = (SelectPrevCommand_t*) data;
Command_t *sub_command;
sub_command = (obj->selected)
? select_command_new(obj) : unselect_command_new(obj);
command_add_subcommand(&command->parent, sub_command);
}
static CmdExecuteValue_t
select_prev_command_execute(Command_t *parent)
{
SelectPrevCommand_t *command = (SelectPrevCommand_t*) parent;
ObjectList_t *list = command->list;
gpointer id;
id = object_list_add_select_cb(list, select_one_object, command);
object_list_select_prev(list);
object_list_remove_select_cb(list, id);
return CMD_APPEND;
}
static void
select_prev_command_undo(Command_t *command)
{
redraw_preview(); /* Fix me! */
}
static void
select_prev_command_redo(Command_t *command)
{
redraw_preview(); /* Fix me! */
}

View File

@ -0,0 +1,32 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 _IMAP_CMD_SELECT_PREV_H
#define _IMAP_CMD_SELECT_PREV_H
#include "imap_command.h"
#include "imap_object.h"
Command_t *select_prev_command_new(ObjectList_t *list);
#endif /* _IMAP_CMD_SELECT_PREV_H */

View File

@ -25,9 +25,10 @@
#include "imap_cmd_select.h"
#include "imap_cmd_select_region.h"
#include "imap_cmd_unselect_all.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static gboolean select_region_command_execute(Command_t *parent);
static CmdExecuteValue_t select_region_command_execute(Command_t *parent);
static void select_region_command_undo(Command_t *parent);
static void select_region_command_redo(Command_t *parent);
@ -45,6 +46,7 @@ typedef struct {
gint x;
gint y;
Object_t *obj;
Command_t *unselect_command;
} SelectRegionCommand_t;
Command_t*
@ -58,11 +60,12 @@ select_region_command_new(GtkWidget *widget, ObjectList_t *list, gint x,
command->list = list;
command->x = x;
command->y = y;
(void) command_init(&command->parent, "Select Region",
(void) command_init(&command->parent, _("Select Region"),
&select_region_command_class);
sub_command = unselect_all_command_new(list, NULL);
command_add_subcommand(&command->parent, sub_command);
command->unselect_command = sub_command;
return &command->parent;
}
@ -96,6 +99,7 @@ select_release(GtkWidget *widget, GdkEventButton *event, gpointer data)
Object_t *obj = command->obj;
Rectangle_t *rectangle = ObjectToRectangle(obj);
gpointer id;
gint count;
gtk_signal_disconnect_by_func(GTK_OBJECT(widget),
(GtkSignalFunc) select_motion, data);
@ -107,19 +111,24 @@ select_release(GtkWidget *widget, GdkEventButton *event, gpointer data)
gdk_gc_set_function(get_preferences()->normal_gc, GDK_COPY);
id = object_list_add_select_cb(command->list, select_one_object, command);
if (object_list_select_region(command->list, rectangle->x, rectangle->y,
rectangle->width, rectangle->height))
redraw_preview();
count = object_list_select_region(command->list, rectangle->x, rectangle->y,
rectangle->width, rectangle->height);
object_list_remove_select_cb(command->list, id);
if (count) {
redraw_preview(); /* Fix me! */
command_list_add(&command->parent);
} else { /* Nothing selected */
if (command->unselect_command->sub_commands)
command_list_add(&command->parent);
}
object_unref(obj);
}
static gboolean
static CmdExecuteValue_t
select_region_command_execute(Command_t *parent)
{
SelectRegionCommand_t *command = (SelectRegionCommand_t*) parent;
/* Command_t *sub_command; */
command->obj = create_rectangle(command->x, command->y, 0, 0);
gtk_signal_connect(GTK_OBJECT(command->widget), "button_release_event",
@ -127,14 +136,9 @@ select_region_command_execute(Command_t *parent)
gtk_signal_connect(GTK_OBJECT(command->widget), "motion_notify_event",
(GtkSignalFunc) select_motion, command);
#ifdef _OLD_
sub_command = unselect_all_command_new(command->list, NULL);
command_add_subcommand(parent, sub_command);
command_execute(sub_command);
#endif
gdk_gc_set_function(get_preferences()->normal_gc, GDK_EQUIV);
return TRUE;
return CMD_IGNORE;
}
static void

View File

@ -24,9 +24,10 @@
#include "imap_cmd_create.h"
#include "imap_cmd_delete.h"
#include "imap_cmd_send_to_back.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static gboolean send_to_back_command_execute(Command_t *parent);
static CmdExecuteValue_t send_to_back_command_execute(Command_t *parent);
static void send_to_back_command_undo(Command_t *parent);
static void send_to_back_command_redo(Command_t *parent);
@ -47,7 +48,7 @@ send_to_back_command_new(ObjectList_t *list)
{
SendToBackCommand_t *command = g_new(SendToBackCommand_t, 1);
command->list = list;
return command_init(&command->parent, "Send To Back",
return command_init(&command->parent, _("Send To Back"),
&send_to_back_command_class);
}
@ -67,7 +68,7 @@ add_one_object(Object_t *obj, gpointer data)
create_command_new(command->list, obj));
}
static gboolean
static CmdExecuteValue_t
send_to_back_command_execute(Command_t *parent)
{
SendToBackCommand_t *command = (SendToBackCommand_t*) parent;
@ -80,7 +81,7 @@ send_to_back_command_execute(Command_t *parent)
redraw_preview(); /* Fix me! */
object_list_remove_remove_cb(command->list, id1);
object_list_remove_add_cb(command->list, id2);
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -22,11 +22,11 @@
*/
#include "imap_cmd_unselect.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
static void unselect_command_destruct(Command_t *parent);
static gboolean unselect_command_execute(Command_t *parent);
static CmdExecuteValue_t unselect_command_execute(Command_t *parent);
static void unselect_command_undo(Command_t *parent);
static CommandClass_t unselect_command_class = {
@ -46,7 +46,7 @@ unselect_command_new(Object_t *obj)
{
UnselectCommand_t *command = g_new(UnselectCommand_t, 1);
command->obj = object_ref(obj);
return command_init(&command->parent, "Unselect",
return command_init(&command->parent, _("Unselect"),
&unselect_command_class);
}
@ -57,12 +57,12 @@ unselect_command_destruct(Command_t *command)
object_unref(unselect_command->obj);
}
static gboolean
static CmdExecuteValue_t
unselect_command_execute(Command_t *command)
{
UnselectCommand_t *unselect_command = (UnselectCommand_t*) command;
object_unselect(unselect_command->obj);
return TRUE;
return CMD_APPEND;
}
static void

View File

@ -23,6 +23,7 @@
#include "imap_cmd_unselect.h"
#include "imap_cmd_unselect_all.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
COMMAND_PROTO(unselect_all_command);
@ -46,7 +47,7 @@ unselect_all_command_new(ObjectList_t *list, Object_t *exception)
UnselectAllCommand_t *command = g_new(UnselectAllCommand_t, 1);
command->list = list;
command->exception = (exception) ? object_ref(exception) : exception;
return command_init(&command->parent, "Unselect All",
return command_init(&command->parent, _("Unselect All"),
&unselect_all_command_class);
}
@ -65,20 +66,20 @@ select_one_object(Object_t *obj, gpointer data)
command_add_subcommand(&command->parent, unselect_command_new(obj));
}
static gboolean
static CmdExecuteValue_t
unselect_all_command_execute(Command_t *parent)
{
UnselectAllCommand_t *command = (UnselectAllCommand_t*) parent;
gpointer id;
gboolean rvalue;
CmdExecuteValue_t rvalue;
id = object_list_add_select_cb(command->list, select_one_object,
command);
if (object_list_deselect_all(command->list, command->exception)) {
redraw_preview(); /* Fix me! */
rvalue = TRUE;
rvalue = CMD_APPEND;
} else {
rvalue = FALSE;
rvalue = CMD_DESTRUCT;
}
object_list_remove_select_cb(command->list, id);
return rvalue;

View File

@ -24,7 +24,6 @@
#include <stdio.h>
#include "imap_command.h"
#define DEFAULT_UNDO_LEVELS 10
#define INFINITE_UNDO_LEVELS -1
static void command_destruct(Command_t *command);
@ -169,10 +168,38 @@ subcommand_end(void)
command_list_end(_current_command_list);
}
static void
_command_list_set_undo_level(CommandList_t *list, gint level)
{
gint diff = g_list_length(list->list) - level;
if (diff > 0) {
GList *p, *q;
/* first remove data at the front */
for (p = list->list; diff && p != list->undo; p = q, diff--) {
Command_t *curr = (Command_t*) p->data;
q = p->next;
command_destruct(curr);
list->list = g_list_remove_link(list->list, p);
}
/* If still to long start removing redo levels at the end */
for (p = g_list_last(list->list); diff && p != list->undo; p = q,
diff--) {
Command_t *curr = (Command_t*) p->data;
q = p->prev;
command_destruct(curr);
list->list = g_list_remove_link(list->list, p);
}
command_list_callback_call(&list->update_cb,
(Command_t*) list->undo->data);
}
list->undo_levels = level;
}
void
command_list_set_undo_level(gint level)
{
/* Fix me */
_command_list_set_undo_level(&_command_list, level);
}
Command_t*
@ -219,9 +246,10 @@ command_execute(Command_t *command)
if (command->sub_commands)
command_list_execute(command->sub_commands);
if (command->class->execute) {
if (command->class->execute(command))
CmdExecuteValue_t value = command->class->execute(command);
if (value == CMD_APPEND)
command_list_add(command);
else
else if (value == CMD_DESTRUCT)
command_destruct(command);
}
}
@ -324,7 +352,7 @@ command_add_subcommand(Command_t *command, Command_t *sub_command)
subcommand_list_add(command->sub_commands, sub_command);
}
static gboolean basic_command_execute(Command_t *command);
static CmdExecuteValue_t basic_command_execute(Command_t *command);
static CommandClass_t basic_command_class = {
NULL, /* basic_command_destruct */
@ -346,11 +374,11 @@ command_new(void (*func)(void))
return command_init(&command->parent, "Unknown", &basic_command_class);
}
static gboolean
static CmdExecuteValue_t
basic_command_execute(Command_t *command)
{
((BasicCommand_t*) command)->func();
return FALSE;
return CMD_DESTRUCT;
}

View File

@ -26,19 +26,23 @@
#include "imap_object.h"
#define DEFAULT_UNDO_LEVELS 10
typedef struct CommandClass_t CommandClass_t;
typedef struct Command_t Command_t;
typedef struct CommandList_t CommandList_t;
typedef enum {CMD_APPEND, CMD_DESTRUCT, CMD_IGNORE} CmdExecuteValue_t;
#define COMMAND_PROTO(class) \
static void class##_destruct(Command_t *command); \
static gboolean class##_execute(Command_t *command); \
static CmdExecuteValue_t class##_execute(Command_t *command); \
static void class##_undo(Command_t *command); \
static void class##_redo(Command_t *command)
struct CommandClass_t {
void (*destruct)(Command_t*);
gboolean (*execute)(Command_t*);
CmdExecuteValue_t (*execute)(Command_t*);
void (*undo)(Command_t*);
void (*redo)(Command_t*);
};

View File

@ -157,16 +157,16 @@ tag : shape_tag
shape_tag : SHAPE '=' STRING
{
if (!strcasecmp($3, "RECT")) {
if (!g_strcasecmp($3, "RECT")) {
current_object = create_rectangle(0, 0, 0, 0);
current_type = RECTANGLE;
} else if (!strcasecmp($3, "CIRCLE")) {
} else if (!g_strcasecmp($3, "CIRCLE")) {
current_object = create_circle(0, 0, 0);
current_type = CIRCLE;
} else if (!strcasecmp($3, "POLY")) {
} else if (!g_strcasecmp($3, "POLY")) {
current_object = create_polygon(NULL);
current_type = POLYGON;
} else if (!strcasecmp($3, "DEFAULT")) {
} else if (!g_strcasecmp($3, "DEFAULT")) {
current_type = UNDEFINED;
}
}

View File

@ -29,6 +29,7 @@
#include "imap_default_dialog.h"
#include "imap_edit_area_info.h"
#include "imap_main.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_table.h"
static gint callback_lock;
@ -163,7 +164,7 @@ create_link_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook)
gtk_table_set_row_spacings(GTK_TABLE(table), 10);
gtk_widget_show(table);
frame = gtk_frame_new("Link Type");
frame = gtk_frame_new(_("Link Type"));
gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 2, 0, 1);
gtk_widget_show(frame);
@ -172,53 +173,55 @@ create_link_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook)
gtk_widget_show(subtable);
dialog->web_site = create_radio_button_in_table(subtable, NULL, 0, 0,
"Web Site");
_("Web Site"));
gtk_signal_connect(GTK_OBJECT(dialog->web_site), "toggled",
(GtkSignalFunc) select_web_cb, (gpointer) dialog);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->web_site));
dialog->ftp_site = create_radio_button_in_table(subtable, group, 0, 1,
"Ftp Site");
_("Ftp Site"));
gtk_signal_connect(GTK_OBJECT(dialog->ftp_site), "toggled",
(GtkSignalFunc) select_ftp_cb, (gpointer) dialog);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->ftp_site));
dialog->gopher = create_radio_button_in_table(subtable, group, 0, 2,
"Gopher");
_("Gopher"));
gtk_signal_connect(GTK_OBJECT(dialog->gopher), "toggled",
(GtkSignalFunc) select_gopher_cb, (gpointer) dialog);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->gopher));
dialog->other = create_radio_button_in_table(subtable, group, 0, 3,
"Other");
_("Other"));
gtk_signal_connect(GTK_OBJECT(dialog->other), "toggled",
(GtkSignalFunc) select_other_cb, (gpointer) dialog);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->other));
dialog->file = create_radio_button_in_table(subtable, group, 1, 0, "File");
dialog->file = create_radio_button_in_table(subtable, group, 1, 0,
_("File"));
gtk_signal_connect(GTK_OBJECT(dialog->file), "toggled",
(GtkSignalFunc) select_file_cb, (gpointer) dialog);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->file));
dialog->wais = create_radio_button_in_table(subtable, group, 1, 1, "WAIS");
dialog->wais = create_radio_button_in_table(subtable, group, 1, 1,
_("WAIS"));
gtk_signal_connect(GTK_OBJECT(dialog->wais), "toggled",
(GtkSignalFunc) select_wais_cb, (gpointer) dialog);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->wais));
dialog->telnet = create_radio_button_in_table(subtable, group, 1, 2,
"Telnet");
_("Telnet"));
gtk_signal_connect(GTK_OBJECT(dialog->telnet), "toggled",
(GtkSignalFunc) select_telnet_cb, (gpointer) dialog);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->telnet));
dialog->email = create_radio_button_in_table(subtable, group, 1, 3,
"e-mail");
_("e-mail"));
gtk_signal_connect(GTK_OBJECT(dialog->email), "toggled",
(GtkSignalFunc) select_email_cb, (gpointer) dialog);
create_label_in_table(
table, 2, 0,
"URL to activate when this area is clicked: (required)");
_("URL to activate when this area is clicked: (required)"));
browse = browse_widget_new("Select HTML file");
browse_widget_set_filter(browse, relative_filter, (gpointer) dialog);
@ -228,23 +231,70 @@ create_link_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook)
GTK_SIGNAL_FUNC(url_changed), dialog);
dialog->relative_link = create_check_button_in_table(table, 4, 0,
"Relative link");
_("Relative link"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->relative_link),
TRUE);
create_label_in_table(
table, 6, 0,
"Target frame name/ID: (optional - used for FRAMES only)");
_("Target frame name/ID: (optional - used for FRAMES only)"));
dialog->target = create_entry_in_table(table, 7, 0);
create_label_in_table(table, 9, 0,
"Comment about this area: (optional)");
_("Comment about this area: (optional)"));
dialog->comment = create_entry_in_table(table, 10, 0);
label = gtk_label_new("Link");
label = gtk_label_new(_("Link"));
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label);
}
static void
geometry_changed(Object_t *obj, gpointer data)
{
AreaInfoDialog_t *dialog = (AreaInfoDialog_t*) data;
if (dialog->geometry_lock) {
dialog->geometry_lock = FALSE;
} else {
if (dialog->obj == obj) {
object_update_info_widget(obj, dialog->infotab);
obj->class->assign(obj, dialog->clone);
}
}
}
static void
toggle_preview_cb(GtkWidget *widget, AreaInfoDialog_t *param)
{
param->preview = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
edit_area_info_dialog_emit_geometry_signal(param);
}
static void
create_info_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook)
{
GtkWidget *vbox, *frame, *preview, *label;
Object_t *obj = dialog->obj;
vbox = gtk_vbox_new(FALSE, 1);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
gtk_widget_show(vbox);
frame = gtk_frame_new(_("Dimensions"));
gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
gtk_widget_show(frame);
preview = gtk_check_button_new_with_label(_("Preview"));
gtk_signal_connect(GTK_OBJECT(preview), "toggled",
(GtkSignalFunc) toggle_preview_cb, (gpointer) dialog);
gtk_box_pack_start(GTK_BOX(vbox), preview, FALSE, FALSE, 0);
gtk_widget_show(preview);
dialog->infotab = obj->class->create_info_widget(frame);
label = gtk_label_new(obj->class->name);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
}
static void
create_java_script_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook)
{
@ -271,24 +321,37 @@ create_java_script_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook)
create_label_in_table(table, 9, 0, "onBlur (HTML 4.0):");
dialog->blur = create_entry_in_table(table, 10, 0);
label = gtk_label_new("JavaScript");
label = gtk_label_new(_("JavaScript"));
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
}
static gboolean
object_was_changed(AreaInfoDialog_t *dialog)
{
Object_t *clone = dialog->clone;
Object_t *obj = dialog->obj;
gint old_x, old_y, old_width, old_height;
gint new_x, new_y, new_width, new_height;
object_get_dimensions(clone, &old_x, &old_y, &old_width, &old_height);
object_get_dimensions(obj, &new_x, &new_y, &new_width, &new_height);
return new_x != old_x || new_y != old_y || new_width != old_width ||
new_height != old_height || clone->selected != obj->selected;
}
static void
edit_area_ok_cb(gpointer data)
{
AreaInfoDialog_t *param = (AreaInfoDialog_t*) data;
Object_t *obj = param->obj;
gint old_x, old_y, old_width, old_height;
gint new_x, new_y, new_width, new_height;
object_list_remove_geometry_cb(obj->list, param->geometry_cb_id);
/* Fix me: nasty hack */
if (param->add)
command_list_add(edit_object_command_new(obj));
object_get_dimensions(obj, &old_x, &old_y, &old_width, &old_height);
object_set_url(obj, gtk_entry_get_text(GTK_ENTRY(param->url)));
object_set_target(obj, gtk_entry_get_text(GTK_ENTRY(param->target)));
object_set_comment(obj, gtk_entry_get_text(GTK_ENTRY(param->comment)));
@ -301,17 +364,27 @@ edit_area_ok_cb(gpointer data)
update_shape(obj);
object_unlock(obj);
object_get_dimensions(obj, &new_x, &new_y, &new_width, &new_height);
if (new_x != old_x || new_y != old_y || new_width != old_width ||
new_height != old_height)
if (object_was_changed(param))
redraw_preview();
object_unref(param->clone);
}
static void
edit_area_cancel_cb(gpointer data)
{
Object_t *obj = ((AreaInfoDialog_t*) data)->obj;
AreaInfoDialog_t *dialog = (AreaInfoDialog_t*) data;
Object_t *obj = dialog->obj;
gboolean changed = object_was_changed(dialog);
gboolean selected = obj->selected;
object_list_remove_geometry_cb(obj->list, dialog->geometry_cb_id);
object_unlock(obj);
object_assign(dialog->clone, obj);
obj->selected = selected;
object_unref(dialog->clone);
if (changed)
redraw_preview();
}
static void
@ -335,9 +408,11 @@ create_edit_area_info_dialog(Object_t *obj)
AreaInfoDialog_t *data = g_new(AreaInfoDialog_t, 1);
GtkWidget *notebook;
data->geometry_lock = FALSE;
data->preview = FALSE;
data->obj = obj;
data->browse = NULL;
data->dialog = make_default_dialog("Area Settings");
data->dialog = make_default_dialog(_("Area Settings"));
default_dialog_set_ok_cb(data->dialog, edit_area_ok_cb, data);
default_dialog_set_cancel_cb(data->dialog, edit_area_cancel_cb, data);
@ -349,7 +424,7 @@ create_edit_area_info_dialog(Object_t *obj)
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(data->dialog->dialog)->vbox),
notebook, TRUE, TRUE, 10);
create_link_tab(data, notebook);
data->infotab = obj->class->create_info_tab(notebook);
create_info_tab(data, notebook);
create_java_script_tab(data, notebook);
gtk_widget_show(notebook);
@ -365,8 +440,9 @@ edit_area_info_dialog_show(AreaInfoDialog_t *dialog, Object_t *obj,
object_unlock(dialog->obj);
object_lock(obj);
dialog->obj = obj;
dialog->clone = object_clone(obj);
dialog->add = add;
obj->class->fill_info_tab(obj, dialog->infotab);
object_fill_info_tab(obj, dialog->infotab);
gtk_entry_set_text(GTK_ENTRY(dialog->url), obj->url);
gtk_entry_set_text(GTK_ENTRY(dialog->target), obj->target);
gtk_entry_set_text(GTK_ENTRY(dialog->comment), obj->comment);
@ -376,9 +452,20 @@ edit_area_info_dialog_show(AreaInfoDialog_t *dialog, Object_t *obj,
gtk_entry_set_text(GTK_ENTRY(dialog->blur), obj->blur);
gtk_widget_grab_focus(dialog->url);
sprintf(title, "Area #%d Settings", object_get_position_in_list(obj) + 1);
dialog->geometry_cb_id =
object_list_add_geometry_cb(obj->list, geometry_changed, dialog);
sprintf(title, _("Area #%d Settings"),
object_get_position_in_list(obj) + 1);
default_dialog_set_title(dialog->dialog, title);
default_dialog_show(dialog->dialog);
}
void
edit_area_info_dialog_emit_geometry_signal(AreaInfoDialog_t *dialog)
{
if (dialog->preview) {
dialog->geometry_lock = TRUE;
object_emit_geometry_signal(dialog->obj);
}
}

View File

@ -34,7 +34,10 @@ typedef struct AreaInfoDialog_t AreaInfoDialog_t;
struct AreaInfoDialog_t {
DefaultDialog_t *dialog;
Object_t *obj;
Object_t *clone;
gboolean add;
gboolean geometry_lock;
gboolean preview;
GtkWidget *notebook;
GtkWidget *web_site;
@ -55,10 +58,12 @@ struct AreaInfoDialog_t {
GtkWidget *blur;
GtkWidget *browse;
gpointer infotab;
gpointer geometry_cb_id;
};
AreaInfoDialog_t *create_edit_area_info_dialog(Object_t *obj);
void edit_area_info_dialog_show(AreaInfoDialog_t *dialog, Object_t *obj,
gboolean add);
void edit_area_info_dialog_emit_geometry_signal(AreaInfoDialog_t *dialog);
#endif /* _IMAP_EDIT_AREA_INFO_H */

View File

@ -26,6 +26,7 @@
#include "imap_default_dialog.h"
#include "imap_file.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_table.h"
@ -42,7 +43,7 @@ open_cb(GtkWidget *widget, gpointer data)
gtk_widget_hide((GtkWidget*) data);
load(filename);
} else {
do_file_error_dialog("Error opening file", filename);
do_file_error_dialog(_("Error opening file"), filename);
}
}
@ -51,7 +52,7 @@ do_file_open_dialog(void)
{
static GtkWidget *dialog;
if (!dialog) {
dialog = gtk_file_selection_new("Load Imagemap");
dialog = gtk_file_selection_new(_("Load Imagemap"));
gtk_signal_connect_object(
GTK_OBJECT(GTK_FILE_SELECTION(dialog)->cancel_button),
"clicked", GTK_SIGNAL_FUNC(gtk_widget_hide), GTK_OBJECT(dialog));
@ -74,13 +75,13 @@ do_file_exists_dialog(gpointer data)
static DefaultDialog_t *dialog;
if (!dialog) {
dialog = make_default_dialog("File exists!");
dialog = make_default_dialog(_("File exists!"));
default_dialog_hide_apply_button(dialog);
default_dialog_set_ok_cb(dialog, really_overwrite, data);
default_dialog_set_label(
dialog,
"File already exists.\n"
" Do you really want to overwrite? ");
_("File already exists.\n"
" Do you really want to overwrite? "));
}
default_dialog_show(dialog);
}
@ -111,7 +112,7 @@ do_file_save_as_dialog(void)
{
static GtkWidget *dialog;
if (!dialog) {
dialog = gtk_file_selection_new("Save Imagemap");
dialog = gtk_file_selection_new(_("Save Imagemap"));
gtk_signal_connect_object(
GTK_OBJECT(GTK_FILE_SELECTION(dialog)->cancel_button),
"clicked", GTK_SIGNAL_FUNC(gtk_widget_hide), GTK_OBJECT(dialog));
@ -134,7 +135,7 @@ create_file_error_dialog()
DefaultDialog_t *dialog;
GtkWidget *table;
file_dialog->dialog = dialog = make_default_dialog("Error");
file_dialog->dialog = dialog = make_default_dialog(_("Error"));
default_dialog_hide_apply_button(dialog);
default_dialog_hide_cancel_button(dialog);

View File

@ -22,6 +22,7 @@
*/
#include "imap_grid.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_menu.h"
#include "imap_popup.h"
@ -43,8 +44,9 @@ static void
grid_settings_ok_cb(gpointer data)
{
GridDialog_t *param = (GridDialog_t*) data;
gint new_snap;
grid_snap = GTK_TOGGLE_BUTTON(param->snap)->active;
new_snap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->snap));
grid_width = gtk_spin_button_get_value_as_int(
GTK_SPIN_BUTTON(param->width));
grid_height = gtk_spin_button_get_value_as_int(
@ -54,10 +56,12 @@ grid_settings_ok_cb(gpointer data)
grid_top = gtk_spin_button_get_value_as_int(
GTK_SPIN_BUTTON(param->top));
main_toolbar_set_grid(grid_snap);
popup_check_grid(grid_snap);
menu_check_grid(grid_snap);
if (grid_snap != new_snap) {
grid_snap = new_snap;
main_toolbar_set_grid(grid_snap);
popup_check_grid(grid_snap);
menu_check_grid(grid_snap);
}
redraw_preview();
}
@ -65,18 +69,63 @@ static void
snap_toggled_cb(GtkWidget *widget, gpointer data)
{
GridDialog_t *param = (GridDialog_t*) data;
gint sensitive = GTK_TOGGLE_BUTTON(widget)->active;
gint sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
gtk_widget_set_sensitive(param->type_frame, sensitive);
gtk_widget_set_sensitive(param->granularity_frame, sensitive);
gtk_widget_set_sensitive(param->offset_frame, sensitive);
gtk_widget_set_sensitive(param->preview, sensitive);
}
static void
type_toggled_cb(GtkWidget *widget, gpointer data)
{
if (GTK_WIDGET_STATE(widget) & GTK_STATE_SELECTED)
if (GTK_WIDGET_STATE(widget) & GTK_STATE_SELECTED) {
grid_type = (gint) data;
redraw_preview();
}
}
static void
toggle_preview_cb(GtkWidget *widget, GridDialog_t *param)
{
param->enable_preview =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
redraw_preview();
}
static void
grid_assign_value(GtkWidget *widget, gpointer data, gint *value)
{
GridDialog_t *dialog = (GridDialog_t*) data;
if (dialog->enable_preview) {
*value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
redraw_preview(); /* Fix me! */
}
}
static void
width_changed_cb(GtkWidget *widget, gpointer data)
{
grid_assign_value(widget, data, &grid_width);
}
static void
height_changed_cb(GtkWidget *widget, gpointer data)
{
grid_assign_value(widget, data, &grid_height);
}
static void
left_changed_cb(GtkWidget *widget, gpointer data)
{
grid_assign_value(widget, data, &grid_left);
}
static void
top_changed_cb(GtkWidget *widget, gpointer data)
{
grid_assign_value(widget, data, &grid_top);
}
static GridDialog_t*
@ -90,10 +139,10 @@ create_grid_settings_dialog()
GtkWidget *button;
GSList* group;
data->dialog = dialog = make_default_dialog("Grid Settings");
data->dialog = dialog = make_default_dialog(_("Grid Settings"));
default_dialog_set_ok_cb(dialog, grid_settings_ok_cb, (gpointer) data);
main_table = gtk_table_new(3, 2, FALSE);
main_table = gtk_table_new(4, 2, FALSE);
gtk_container_set_border_width(GTK_CONTAINER(main_table), 10);
gtk_table_set_row_spacings(GTK_TABLE(main_table), 10);
gtk_table_set_col_spacings(GTK_TABLE(main_table), 10);
@ -101,27 +150,27 @@ create_grid_settings_dialog()
main_table, TRUE, TRUE, 10);
gtk_widget_show(main_table);
data->snap = gtk_check_button_new_with_label("Snap-To Grid Enabled");
data->snap = gtk_check_button_new_with_label(_("Snap-To Grid Enabled"));
gtk_signal_connect(GTK_OBJECT(data->snap), "toggled",
(GtkSignalFunc) snap_toggled_cb, data);
gtk_table_attach_defaults(GTK_TABLE(main_table), data->snap, 0, 1, 0, 1);
gtk_widget_show(data->snap);
data->type_frame = frame = gtk_frame_new("Grid Visibility and Type");
data->type_frame = frame = gtk_frame_new(_("Grid Visibility and Type"));
gtk_widget_show(frame);
gtk_table_attach_defaults(GTK_TABLE(main_table), frame, 0, 2, 1, 2);
hbox = gtk_hbox_new(FALSE, 1);
gtk_container_add(GTK_CONTAINER(frame), hbox);
gtk_widget_show(hbox);
data->hidden = button = gtk_radio_button_new_with_label(NULL, "Hidden");
data->hidden = button = gtk_radio_button_new_with_label(NULL, _("Hidden"));
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc) type_toggled_cb, (gpointer) GRID_HIDDEN);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 10);
gtk_widget_show(button);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
data->lines = button = gtk_radio_button_new_with_label(group, "Lines");
data->lines = button = gtk_radio_button_new_with_label(group, _("Lines"));
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc) type_toggled_cb, (gpointer) GRID_LINES);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -129,40 +178,60 @@ create_grid_settings_dialog()
gtk_widget_show(button);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
data->crosses = button = gtk_radio_button_new_with_label(group, "Crosses");
data->crosses = button = gtk_radio_button_new_with_label(group,
_("Crosses"));
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc) type_toggled_cb,
(gpointer) GRID_CROSSES);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 10);
gtk_widget_show(button);
data->granularity_frame = frame = gtk_frame_new("Grid Granularity");
data->granularity_frame = frame = gtk_frame_new(_("Grid Granularity"));
gtk_table_attach_defaults(GTK_TABLE(main_table), frame, 0, 1, 2, 3);
table = gtk_table_new(2, 3, FALSE);
gtk_container_set_border_width(GTK_CONTAINER(table), 10);
gtk_table_set_row_spacings(GTK_TABLE(table), 10);
gtk_table_set_col_spacings(GTK_TABLE(table), 10);
gtk_container_add(GTK_CONTAINER(frame), table);
create_label_in_table(table, 0, 0, "Width");
create_label_in_table(table, 0, 0, _("Width"));
data->width = create_spin_button_in_table(table, 0, 1, 15, 1, 100);
create_label_in_table(table, 0, 2, "pixels");
create_label_in_table(table, 1, 0, "Height");
gtk_signal_connect(GTK_OBJECT(data->width), "changed",
(GtkSignalFunc) width_changed_cb, (gpointer) data);
create_label_in_table(table, 0, 2, _("pixels"));
create_label_in_table(table, 1, 0, _("Height"));
data->height = create_spin_button_in_table(table, 1, 1, 15, 1, 100);
create_label_in_table(table, 1, 2, "pixels");
gtk_signal_connect(GTK_OBJECT(data->height), "changed",
(GtkSignalFunc) height_changed_cb, (gpointer) data);
create_label_in_table(table, 1, 2, _("pixels"));
gtk_widget_show(table);
gtk_widget_show(frame);
data->offset_frame = frame = gtk_frame_new("Grid Offset");
data->offset_frame = frame = gtk_frame_new(_("Grid Offset"));
gtk_table_attach_defaults(GTK_TABLE(main_table), frame, 1, 2, 2, 3);
table = gtk_table_new(2, 2, FALSE);
gtk_container_set_border_width(GTK_CONTAINER(table), 10);
gtk_table_set_row_spacings(GTK_TABLE(table), 10);
gtk_table_set_col_spacings(GTK_TABLE(table), 10);
gtk_container_add(GTK_CONTAINER(frame), table);
data->left = create_spin_button_in_table(table, 0, 0, 0, 0, 100);
create_label_in_table(table, 0, 1, "pixels from left");
gtk_signal_connect(GTK_OBJECT(data->left), "changed",
(GtkSignalFunc) left_changed_cb, (gpointer) data);
create_label_in_table(table, 0, 1, _("pixels from left"));
data->top = create_spin_button_in_table(table, 1, 0, 0, 0, 100);
create_label_in_table(table, 1, 1, "pixels from top");
gtk_signal_connect(GTK_OBJECT(data->top), "changed",
(GtkSignalFunc) top_changed_cb, (gpointer) data);
create_label_in_table(table, 1, 1, _("pixels from top"));
data->preview = create_check_button_in_table(main_table, 3, 0,
_("Preview"));
gtk_signal_connect(GTK_OBJECT(data->preview), "toggled",
(GtkSignalFunc) toggle_preview_cb, (gpointer) data);
gtk_widget_show(data->preview);
snap_toggled_cb(data->snap, data);
@ -234,14 +303,11 @@ draw_grid(GtkWidget *preview)
gdk_gc_set_line_attributes(grid_gc, 1, GDK_LINE_ON_OFF_DASH,
GDK_CAP_BUTT, GDK_JOIN_BEVEL);
}
gdk_gc_set_function(preview->style->black_gc, GDK_INVERT);
if (grid_type == GRID_LINES)
draw_lines(preview->window, preview->style->black_gc, width, height);
draw_lines(preview->window, grid_gc, width, height);
else
draw_crosses(preview->window, preview->style->black_gc, width,
height);
gdk_gc_set_function(preview->style->black_gc, GDK_COPY);
}
}
@ -253,14 +319,39 @@ toggle_grid(void)
return grid_snap;
}
static gint
grid_nearest_x(gint x)
{
return grid_left + (x - grid_left + grid_width / 2) / grid_width
* grid_width;
}
static gint
grid_nearest_y(gint y)
{
return grid_top + (y - grid_top + grid_height / 2) / grid_height
* grid_height;
}
void
round_to_grid(gint *x, gint *y)
{
if (grid_snap) {
*x = grid_left + (*x - grid_left + grid_width / 2) / grid_width
* grid_width;
*y = grid_top + (*y - grid_top + grid_height / 2) / grid_height
* grid_height;
*x = grid_nearest_x(*x);
*y = grid_nearest_y(*y);
}
}
gboolean
grid_near_x(gint x)
{
return grid_snap && grid_type != GRID_HIDDEN
&& abs(grid_nearest_x(x) - x) <= 1;
}
gboolean
grid_near_y(gint y)
{
return grid_snap && grid_type != GRID_HIDDEN
&& abs(grid_nearest_x(y) - y) <= 1;
}

View File

@ -39,6 +39,9 @@ typedef struct {
GtkWidget *hidden;
GtkWidget *lines;
GtkWidget *crosses;
GtkWidget *preview;
gboolean enable_preview;
} GridDialog_t;
void do_grid_settings_dialog();
@ -46,4 +49,7 @@ void draw_grid(GtkWidget *preview);
gboolean toggle_grid();
void round_to_grid(gint *x, gint *y);
gboolean grid_near_x(gint x);
gboolean grid_near_y(gint y);
#endif /* _IMAP_GRID_H */

View File

@ -26,6 +26,7 @@
#include <stdio.h>
#include <string.h>
#include "libgimp/gimp.h"
#include "gdk/gdkkeysyms.h" /* for keyboard values */
#include "gtk/gtk.h"
#include "imap_about.h"
@ -38,11 +39,15 @@
#include "imap_cmd_move.h"
#include "imap_cmd_move_down.h"
#include "imap_cmd_move_sash.h"
#include "imap_cmd_move_selected.h"
#include "imap_cmd_move_to_front.h"
#include "imap_cmd_move_up.h"
#include "imap_cmd_object_move.h"
#include "imap_cmd_paste.h"
#include "imap_cmd_select.h"
#include "imap_cmd_select_all.h"
#include "imap_cmd_select_next.h"
#include "imap_cmd_select_prev.h"
#include "imap_cmd_select_region.h"
#include "imap_cmd_send_to_back.h"
#include "imap_cmd_unselect.h"
@ -51,6 +56,7 @@
#include "imap_edit_area_info.h"
#include "imap_file.h"
#include "imap_grid.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_menu.h"
#include "imap_object.h"
@ -73,7 +79,7 @@
/* Global variables */
static MapInfo_t _map_info;
static PreferencesData_t _preferences = {CSIM, TRUE, FALSE, TRUE, TRUE, FALSE,
FALSE, 4};
FALSE, DEFAULT_UNDO_LEVELS, DEFAULT_MRU_SIZE};
static MRU_t *_mru;
static GdkCursorType _cursor;
@ -124,6 +130,8 @@ static void query()
static int nargs = sizeof (args) / sizeof (args[0]);
static int nreturn_vals = 0;
INIT_I18N();
gimp_install_procedure("plug_in_imagemap",
"Creates a clickable imagemap.",
"",
@ -146,6 +154,8 @@ run(char *name, int n_params, GParam *param, int *nreturn_vals,
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
INIT_I18N_UI();
*nreturn_vals = 1;
*return_vals = values;
@ -194,12 +204,6 @@ get_preferences(void)
return &_preferences;
}
GtkWidget*
get_top_widget(void)
{
return _dlg;
}
static void
init_preferences(void)
{
@ -242,6 +246,9 @@ init_preferences(void)
gdk_gc_set_background(_preferences.normal_gc, &colors->normal_bg);
gdk_gc_set_foreground(_preferences.selected_gc, &colors->selected_fg);
gdk_gc_set_background(_preferences.selected_gc, &colors->selected_bg);
mru_set_size(_mru, _preferences.mru_size);
command_list_set_undo_level(_preferences.undo_levels);
}
/* Get yellow for tooltips */
@ -377,13 +384,13 @@ draw_polygon(GdkWindow *window, GdkGC *gc, GList *list)
static gboolean _preview_redraw_blocked;
static void
void
preview_freeze(void)
{
_preview_redraw_blocked = TRUE;
}
static void
void
preview_thaw(void)
{
_preview_redraw_blocked = FALSE;
@ -393,7 +400,8 @@ preview_thaw(void)
void
redraw_preview(void)
{
preview_redraw(_preview);
if (!_preview_redraw_blocked)
preview_redraw(_preview);
}
static void
@ -509,8 +517,8 @@ main_set_title(const char *filename)
char *p;
g_strreplace(&_filename, filename);
p = (filename) ? g_basename(filename) : "<Untitled>";
sprintf(title, "%s - ImageMap 1.2", p);
p = (filename) ? g_basename(filename) : _("<Untitled>");
sprintf(title, "%s - ImageMap 1.3", p);
gtk_window_set_title(GTK_WINDOW(_dlg), title);
}
@ -540,67 +548,6 @@ hide_url(void)
statusbar_clear_status(_statusbar);
}
static gint start_x, start_y;
static gint obj_start_x, obj_start_y;
static gint obj_x, obj_y, obj_width, obj_height;
static gboolean _moved_first_time = TRUE;
static void
button_motion(GtkWidget *widget, GdkEventMotion *event, gpointer data)
{
Object_t *obj = (Object_t*) data;
gint dx = GET_REAL_COORD((gint) event->x) - start_x;
gint dy = GET_REAL_COORD((gint) event->y) - start_y;
if (_moved_first_time) {
_moved_first_time = FALSE;
preview_set_cursor(_preview, GDK_FLEUR);
gdk_gc_set_function(_preferences.normal_gc, GDK_EQUIV);
gdk_gc_set_function(_preferences.selected_gc, GDK_EQUIV);
hide_url();
}
if (obj_x + dx < 0)
dx = -obj_x;
if (obj_x + obj_width + dx > _image_width)
dx = _image_width - obj_width - obj_x;
if (obj_y + dy < 0)
dy = -obj_y;
if (obj_y + obj_height + dy > _image_height)
dy = _image_height - obj_height - obj_y;
if (dx || dy) {
start_x = GET_REAL_COORD((gint) event->x);
start_y = GET_REAL_COORD((gint) event->y);
obj_x += dx;
obj_y += dy;
object_draw(obj, widget->window);
object_move(obj, dx, dy);
object_draw(obj, widget->window);
}
}
static void
button_release(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
gtk_signal_disconnect_by_func(GTK_OBJECT(widget),
(GtkSignalFunc) button_motion, data);
gtk_signal_disconnect_by_func(GTK_OBJECT(widget),
(GtkSignalFunc) button_release, data);
_moved_first_time = TRUE;
preview_set_cursor(_preview, _cursor);
gdk_gc_set_function(_preferences.normal_gc, GDK_COPY);
gdk_gc_set_function(_preferences.selected_gc, GDK_COPY);
redraw_preview();
show_url();
obj_x -= obj_start_x;
obj_y -= obj_start_y;
if (obj_x || obj_y)
command_list_add(move_command_new((Object_t*) data, obj_x, obj_y));
}
void
select_shape(GtkWidget *widget, GdkEventButton *event)
{
@ -640,15 +587,8 @@ select_shape(GtkWidget *widget, GdkEventButton *event)
}
command_execute(command);
start_x = x;
start_y = y;
object_get_dimensions(obj, &obj_x, &obj_y, &obj_width, &obj_height);
obj_start_x = obj_x;
obj_start_y = obj_y;
gtk_signal_connect(GTK_OBJECT(widget), "button_release_event",
(GtkSignalFunc) button_release, obj);
gtk_signal_connect(GTK_OBJECT(widget), "motion_notify_event",
(GtkSignalFunc) button_motion, obj);
command = move_command_new(_preview, obj, x, y);
command_execute(command);
} else { /* Start selection rectangle */
command = select_region_command_new(widget, _shapes, x, y);
command_execute(command);
@ -725,12 +665,12 @@ do_data_changed_dialog(void (*continue_cb)(gpointer), gpointer param)
static DefaultDialog_t *dialog;
if (!dialog) {
dialog = make_default_dialog("Data changed");
dialog = make_default_dialog(_("Data changed"));
default_dialog_hide_apply_button(dialog);
default_dialog_set_label(
dialog,
" Some data has been changed. \n"
"Do you really want to continue?");
_(" Some data has been changed. \n"
"Do you really want to continue?"));
}
default_dialog_set_ok_cb(dialog, continue_cb, param);
default_dialog_show(dialog);
@ -833,7 +773,7 @@ save_as_cern(gpointer param, OutputFunc_t output)
write_cern_comment(param, output);
output(param, "-:Please do not edit lines starting with \"#$\"\n");
write_cern_comment(param, output);
output(param, "VERSION:1.2\n");
output(param, "VERSION:1.3\n");
write_cern_comment(param, output);
output(param, "TITLE:%s\n", _map_info.title);
write_cern_comment(param, output);
@ -868,7 +808,7 @@ save_as_csim(gpointer param, OutputFunc_t output)
output(param, "<!-- #$-:GIMP Imagemap Plugin by Maurits Rijk -->\n");
output(param,
"<!-- #$-:Please do not edit lines starting with \"#$\" -->\n");
output(param, "<!-- #$VERSION:1.2 -->\n");
output(param, "<!-- #$VERSION:1.3 -->\n");
output(param, "<!-- #$AUTHOR:%s -->\n", _map_info.author);
description = g_strdup(_map_info.description);
@ -892,7 +832,7 @@ save_as_ncsa(gpointer param, OutputFunc_t output)
output(param, "#$-:Image Map file created by GIMP Imagemap Plugin\n");
output(param, "#$-:GIMP Imagemap Plugin by Maurits Rijk\n");
output(param, "#$-:Please do not edit lines starting with \"#$\"\n");
output(param, "#$VERSION:1.2\n");
output(param, "#$VERSION:1.3\n");
output(param, "#$TITLE:%s\n", _map_info.title);
output(param, "#$AUTHOR:%s\n", _map_info.author);
output(param, "#$FORMAT:ncsa\n");
@ -1051,6 +991,17 @@ preview_move(GtkWidget *widget, GdkEventMotion *event)
statusbar_clear_status(_statusbar);
}
}
#ifdef _NOT_READY_YET_
if (!obj) {
if (grid_near_x(x)) {
preview_set_cursor(_preview, GDK_SB_H_DOUBLE_ARROW);
} else if (grid_near_y(y)) {
preview_set_cursor(_preview, GDK_SB_V_DOUBLE_ARROW);
} else {
preview_set_cursor(_preview, _cursor);
}
}
#endif
}
static void
@ -1072,13 +1023,103 @@ button_press(GtkWidget* widget, GdkEventButton* event, gpointer data)
_button_press_func(widget, event, _button_press_param);
}
#ifdef _NOT_READY_YET_
/* A few global vars for key movement */
static gint _timeout;
static guint _keyval;
static gint _dx, _dy;
static void
move_selected_objects(gint dx, gint dy, gboolean fast)
{
if (fast) {
dx *= 5;
dy *= 5;
}
_dx += dx;
_dy += dy;
gdk_gc_set_function(_preferences.normal_gc, GDK_EQUIV);
gdk_gc_set_function(_preferences.selected_gc, GDK_EQUIV);
object_list_draw_selected(_shapes, _preview->preview->window);
object_list_move_selected(_shapes, dx, dy);
object_list_draw_selected(_shapes, _preview->preview->window);
gdk_gc_set_function(_preferences.normal_gc, GDK_COPY);
gdk_gc_set_function(_preferences.selected_gc, GDK_COPY);
}
static gboolean
key_timeout_cb(gpointer data)
{
switch (_keyval) {
case GDK_Left:
case GDK_Right:
case GDK_Up:
case GDK_Down:
command_list_add(move_selected_command_new(_shapes, _dx, _dy));
_dx = _dy = 0;
break;
}
preview_thaw();
return FALSE;
}
static gboolean
key_press_cb(GtkWidget *widget, GdkEventKey *event)
{
gint handled = FALSE;
gboolean shift = event->state & GDK_SHIFT_MASK;
Command_t *command;
preview_freeze();
if (_timeout)
gtk_timeout_remove(_timeout);
switch (event->keyval) {
case GDK_Left:
move_selected_objects(-1, 0, shift);
handled = TRUE;
break;
case GDK_Right:
move_selected_objects(1, 0, shift);
handled = TRUE;
break;
case GDK_Up:
move_selected_objects(0, -1, shift);
handled = TRUE;
break;
case GDK_Down:
move_selected_objects(0, 1, shift);
handled = TRUE;
break;
case GDK_Tab:
if (shift)
command = select_prev_command_new(_shapes);
else
command = select_next_command_new(_shapes);
command_execute(command);
handled = TRUE;
break;
}
if (handled)
gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event");
return handled;
}
static gboolean
key_release_cb(GtkWidget *widget, GdkEventKey *event)
{
_keyval = event->keyval;
_timeout = gtk_timeout_add(250, key_timeout_cb, NULL);
return FALSE;
}
static void
geometry_changed(Object_t *obj, gpointer data)
{
redraw_preview();
redraw_preview(); /* Fix me! */
}
#endif
static void
data_changed(Object_t *obj, gpointer data)
@ -1286,7 +1327,6 @@ dialog(GDrawable *drawable)
GtkWidget *hbox;
GtkWidget *main_vbox;
Tools_t *tools;
guchar *color_cube;
gchar **argv;
gint argc = 1;
Menu_t *menu;
@ -1300,13 +1340,9 @@ dialog(GDrawable *drawable)
gdk_set_use_xshm(gimp_use_xshm());
gtk_preview_set_gamma(gimp_gamma());
gtk_preview_set_install_cmap(gimp_install_cmap());
color_cube = gimp_color_cube();
gtk_preview_set_color_cube(color_cube[0], color_cube[1],
color_cube[2], color_cube[3]);
gtk_widget_set_default_visual(gtk_preview_get_visual());
gtk_widget_set_default_colormap(gtk_preview_get_cmap());
gtk_widget_set_default_colormap(gdk_rgb_get_cmap());
_shapes = make_object_list();
@ -1319,6 +1355,11 @@ dialog(GDrawable *drawable)
gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc) close_callback, NULL);
gtk_signal_connect(GTK_OBJECT(dlg), "key_press_event",
(GtkSignalFunc) key_press_cb, NULL);
gtk_signal_connect(GTK_OBJECT(dlg), "key_release_event",
(GtkSignalFunc) key_release_cb, NULL);
main_vbox = gtk_vbox_new(FALSE, 1);
gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1);
gtk_container_add(GTK_CONTAINER(dlg), main_vbox);
@ -1394,7 +1435,7 @@ dialog(GDrawable *drawable)
add_preview_button_press_event(_preview, (GtkSignalFunc) button_press);
gtk_container_add(GTK_CONTAINER(hbox), _preview->window);
/* object_list_add_changed_cb(_shapes, geometry_changed, NULL); */
object_list_add_geometry_cb(_shapes, geometry_changed, NULL);
object_list_add_update_cb(_shapes, data_changed, NULL);
object_list_add_add_cb(_shapes, data_changed, NULL);
object_list_add_remove_cb(_shapes, data_changed, NULL);

View File

@ -24,12 +24,9 @@
#ifndef _IMAP_MAIN_H
#define _IMAP_MAIN_H
#include "gtk/gtk.h"
#include "imap_mru.h"
#include "imap_object.h"
#include "imap_preferences.h"
#include "imap_preview.h"
typedef enum {NCSA, CERN, CSIM} MapFormat_t;
@ -55,7 +52,7 @@ GdkColor *get_yellow(void);
MRU_t *get_mru(void);
MapInfo_t *get_map_info(void);
PreferencesData_t *get_preferences(void);
GtkWidget *get_top_widget(void);
gint get_image_width(void);
gint get_image_height(void);
@ -91,7 +88,10 @@ void edit_shape(gint x, gint y);
void do_popup_menu(GdkEventButton *event);
void draw_shapes(GtkWidget *preview);
void redraw_preview(void);
void preview_freeze(void);
void preview_thaw(void);
void show_url(void);
void hide_url(void);

View File

@ -449,14 +449,14 @@ menu_build_mru_items(MRU_t *mru)
}
i = 0;
for (p = mru->list; p; p = p->next, i++)
for (p = mru->list; p; p = p->next, i++) {
insert_item_with_label(_menu.file_menu, position++, (gchar*) p->data,
menu_mru, p->data);
}
insert_separator(_menu.file_menu, position);
_menu.nr_off_mru_items = i + 1;
}
void
menu_select_arrow(void)
{

View File

@ -25,8 +25,6 @@
#include "imap_mru.h"
#define DEFAULT_MRU_SIZE 4
MRU_t*
mru_create(void)
{
@ -85,9 +83,10 @@ mru_set_first(MRU_t *mru, const gchar *filename)
void
mru_set_size(MRU_t *mru, gint size)
{
if (size < mru->max_size) {
/* fix me */
}
gint diff;
for (diff = g_list_length(mru->list) - size; diff > 0; diff--)
mru_remove_link(mru, g_list_last(mru->list));
mru->max_size = size;
}

View File

@ -28,6 +28,8 @@
#include "gtk/gtk.h"
#define DEFAULT_MRU_SIZE 4
typedef struct {
GList *list;
gint max_size;

View File

@ -152,6 +152,12 @@ object_list_remove_move_cb(ObjectList_t *list, gpointer id)
object_list_callback_remove(&list->move_cb, id);
}
void
object_list_remove_geometry_cb(ObjectList_t *list, gpointer id)
{
object_list_callback_remove(&list->geometry_cb, id);
}
Object_t*
object_init(Object_t *obj, ObjectClass_t *class)
{
@ -216,7 +222,7 @@ object_clone(Object_t *obj)
return clone;
}
Object_t*
static Object_t*
object_copy(Object_t *src, Object_t *des)
{
des->class = src->class;
@ -235,7 +241,8 @@ object_copy(Object_t *src, Object_t *des)
Object_t*
object_assign(Object_t *obj, Object_t *des)
{
return obj->class->assign(obj, des);
obj->class->assign(obj, des);
return object_copy(obj, des);
}
void
@ -271,6 +278,13 @@ object_unselect(Object_t *obj)
object_list_callback_call(&obj->list->select_cb, obj);
}
void
object_move(Object_t *obj, gint dx, gint dy)
{
obj->class->move(obj, dx, dy);
object_list_callback_call(&obj->list->geometry_cb, obj);
}
void
object_remove(Object_t *obj)
{
@ -343,6 +357,18 @@ object_emit_changed_signal(Object_t *obj)
object_list_callback_call(&obj->list->changed_cb, obj);
}
void
object_emit_geometry_signal(Object_t *obj)
{
object_list_callback_call(&obj->list->geometry_cb, obj);
}
void
object_emit_update_signal(Object_t *obj)
{
object_list_callback_call(&obj->list->update_cb, obj);
}
GdkPixmap*
object_get_icon(Object_t *obj, GtkWidget *widget, GdkBitmap **mask)
{
@ -556,6 +582,17 @@ object_list_draw(ObjectList_t *list, GdkWindow *window)
object_draw((Object_t*) p->data, window);
}
void
object_list_draw_selected(ObjectList_t *list, GdkWindow *window)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected)
object_draw(obj, window);
}
}
Object_t*
object_list_find(ObjectList_t *list, gint x, gint y)
{
@ -706,6 +743,44 @@ object_list_select_all(ObjectList_t *list)
return count;
}
void
object_list_select_next(ObjectList_t *list)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected) {
object_unselect(obj);
p = (p->next) ? p->next : list->list;
object_select((Object_t*) p->data);
for (p = p->next; p; p = p->next) {
obj = (Object_t*) p->data;
if (obj->selected)
object_unselect(obj);
}
break;
}
}
}
void object_list_select_prev(ObjectList_t *list)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected) {
GList *q = (p->prev) ? p->prev : g_list_last(list->list);
for (; p; p = p->next) {
obj = (Object_t*) p->data;
if (obj->selected)
object_unselect(obj);
}
object_select((Object_t*) q->data);
break;
}
}
}
gint
object_list_select_region(ObjectList_t *list, gint x, gint y, gint width,
gint height)
@ -784,6 +859,17 @@ object_list_swap_next(ObjectList_t *list, GList *p)
object_list_callback_call(&list->move_cb, (Object_t*) p->next->data);
}
void
object_list_move_selected(ObjectList_t *list, gint dx, gint dy)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected)
object_move(obj, dx, dy);
}
}
void
object_list_move_up(ObjectList_t *list, Object_t *obj)
{

View File

@ -54,6 +54,7 @@ typedef void (*OutputFunc_t)(gpointer, const char*, ...);
struct AreaInfoDialog_t;
struct ObjectClass_t {
gchar *name;
AreaInfoDialog_t *info_dialog;
GdkPixmap *icon;
GdkBitmap *mask;
@ -61,7 +62,7 @@ struct ObjectClass_t {
gboolean (*is_valid)(Object_t *obj);
void (*destruct)(Object_t *obj);
Object_t* (*clone)(Object_t *obj);
Object_t* (*assign)(Object_t *obj, Object_t *des);
void (*assign)(Object_t *obj, Object_t *des);
void (*normalize)(Object_t *obj);
void (*draw)(Object_t *obj, GdkWindow *window, GdkGC* gc);
void (*draw_sashes)(Object_t *obj, GdkWindow *window, GdkGC* gc);
@ -71,7 +72,8 @@ struct ObjectClass_t {
gint *height);
void (*resize)(Object_t *obj, gint percentage_x, gint percentage_y);
void (*move)(Object_t *obj, gint dx, gint dy);
gpointer (*create_info_tab)(GtkWidget *notebook);
gpointer (*create_info_widget)(GtkWidget *frame);
void (*update_info_widget)(Object_t *obj, gpointer data);
void (*fill_info_tab)(Object_t *obj, gpointer data);
void (*set_initial_focus)(Object_t *obj, gpointer data);
void (*update)(Object_t *obj, gpointer data);
@ -86,13 +88,13 @@ struct ObjectClass_t {
Object_t *object_ref(Object_t *obj);
void object_unref(Object_t *obj);
Object_t* object_init(Object_t *obj, ObjectClass_t *class);
Object_t* object_copy(Object_t *src, Object_t *des);
Object_t* object_clone(Object_t *obj);
Object_t* object_assign(Object_t *src, Object_t *des);
void object_draw(Object_t *obj, GdkWindow *window);
void object_edit(Object_t *obj, gboolean add);
void object_select(Object_t *obj);
void object_unselect(Object_t *obj);
void object_move(Object_t *obj, gint dx, gint dy);
void object_remove(Object_t *obj);
void object_lock(Object_t *obj);
void object_unlock(Object_t *obj);
@ -105,7 +107,10 @@ void object_set_focus(Object_t *obj, const gchar *focus);
void object_set_blur(Object_t *obj, const gchar *blur);
gint object_get_position_in_list(Object_t *obj);
GdkPixmap* object_get_icon(Object_t *obj, GtkWidget *widget, GdkBitmap **mask);
void object_emit_changed_signal(Object_t *obj);
void object_emit_geometry_signal(Object_t *obj);
void object_emit_update_signal(Object_t *obj);
#define object_is_valid(obj) \
((obj)->class->is_valid(obj))
@ -116,15 +121,18 @@ void object_emit_changed_signal(Object_t *obj);
#define object_normalize(obj) \
((obj)->class->normalize(obj))
#define object_move(obj, dx, dy) \
((obj)->class->move((obj), (dx), (dy)))
#define object_resize(obj, per_x, per_y) \
((obj)->class->resize((obj), (per_x), (per_y)))
#define object_update(obj, data) \
((obj)->class->update((obj), (data)))
#define object_update_info_widget(obj, data) \
((obj)->class->update_info_widget((obj), (data)))
#define object_fill_info_tab(obj, data) \
((obj)->class->fill_info_tab((obj), (data)))
typedef struct {
Object_t *obj;
gboolean (*finish)(Object_t *obj, gint x, gint y);
@ -164,6 +172,7 @@ void object_list_remove(ObjectList_t *list, Object_t *object);
void object_list_remove_link(ObjectList_t *list, GList *link);
void object_list_update(ObjectList_t *list, Object_t *object);
void object_list_draw(ObjectList_t *list, GdkWindow *window);
void object_list_draw_selected(ObjectList_t *list, GdkWindow *window);
Object_t *object_list_find(ObjectList_t *list, gint x, gint y);
Object_t *object_list_near_sash(ObjectList_t *list, gint x, gint y,
MoveSashFunc_t *sash_func);
@ -176,12 +185,15 @@ void object_list_remove_all(ObjectList_t *list);
void object_list_delete_selected(ObjectList_t *list);
void object_list_edit_selected(ObjectList_t *list);
gint object_list_select_all(ObjectList_t *list);
void object_list_select_next(ObjectList_t *list);
void object_list_select_prev(ObjectList_t *list);
gint object_list_select_region(ObjectList_t *list, gint x, gint y, gint width,
gint height);
gint object_list_deselect_all(ObjectList_t *list, Object_t *exception);
gint object_list_nr_selected(ObjectList_t *list);
void object_list_resize(ObjectList_t *list, gint percentage_x,
gint percentage_y);
void object_list_move_selected(ObjectList_t *list, gint dx, gint dy);
void object_list_move_up(ObjectList_t *list, Object_t *obj);
void object_list_move_down(ObjectList_t *list, Object_t *obj);
void object_list_move_selected_up(ObjectList_t *list);
@ -222,6 +234,7 @@ void object_list_remove_add_cb(ObjectList_t *list, gpointer id);
void object_list_remove_select_cb(ObjectList_t *list, gpointer id);
void object_list_remove_remove_cb(ObjectList_t *list, gpointer id);
void object_list_remove_move_cb(ObjectList_t *list, gpointer id);
void object_list_remove_geometry_cb(ObjectList_t *list, gpointer id);
#define object_list_clear_changed(list) ((list)->changed = FALSE)
#define object_list_set_changed(list, ischanged) \

View File

@ -25,8 +25,8 @@
#include <stdio.h>
#include "imap_cmd_delete_point.h"
#include "imap_grid.h"
#include "imap_cmd_insert_point.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_misc.h"
#include "imap_object_popup.h"
@ -40,7 +40,7 @@
static gboolean polygon_is_valid(Object_t *obj);
static void polygon_destruct(Object_t *obj);
static Object_t *polygon_clone(Object_t *obj);
static Object_t *polygon_assign(Object_t *obj, Object_t *des);
static void polygon_assign(Object_t *obj, Object_t *des);
static void polygon_draw(Object_t* obj, GdkWindow *window, GdkGC* gc);
static void polygon_draw_sashes(Object_t* obj, GdkWindow *window, GdkGC* gc);
static MoveSashFunc_t polygon_near_sash(Object_t *obj, gint x, gint y);
@ -50,7 +50,8 @@ static void polygon_get_dimensions(Object_t *obj, gint *x, gint *y,
static void polygon_resize(Object_t *obj, gint percentage_x,
gint percentage_y);
static void polygon_move(Object_t *obj, gint dx, gint dy);
static gpointer polygon_create_info_tab(GtkWidget *notebook);
static gpointer polygon_create_info_widget(GtkWidget *frame);
static void polygon_update_info_widget(Object_t *obj, gpointer data);
static void polygon_fill_info_tab(Object_t *obj, gpointer data);
static void polygon_set_initial_focus(Object_t *obj, gpointer data);
static void polygon_update(Object_t* obj, gpointer data);
@ -64,6 +65,7 @@ static void polygon_do_popup(Object_t *obj, GdkEventButton *event);
static char** polygon_get_icon_data(void);
static ObjectClass_t polygon_class = {
N_("Polygon"),
NULL, /* info_dialog */
NULL, /* icon */
NULL, /* mask */
@ -80,7 +82,8 @@ static ObjectClass_t polygon_class = {
polygon_get_dimensions,
polygon_resize,
polygon_move,
polygon_create_info_tab,
polygon_create_info_widget,
polygon_update_info_widget,
polygon_fill_info_tab,
polygon_set_initial_focus,
polygon_update,
@ -99,13 +102,19 @@ create_polygon(GList *points)
return object_init(&polygon->obj, &polygon_class);
}
static void
polygon_free_list(Polygon_t *polygon)
{
g_list_foreach(polygon->points, (GFunc) g_free, NULL);
g_list_free(polygon->points);
polygon->points = NULL;
}
static void
polygon_destruct(Object_t *obj)
{
Polygon_t *polygon = ObjectToPolygon(obj);
g_list_foreach(polygon->points, (GFunc) g_free, NULL);
g_list_free(polygon->points);
polygon_free_list(polygon);
}
static gboolean
@ -130,19 +139,19 @@ polygon_clone(Object_t *obj)
return &clone->obj;
}
static Object_t*
static void
polygon_assign(Object_t *obj, Object_t *des)
{
Polygon_t *src_polygon = ObjectToPolygon(obj);
Polygon_t *des_polygon = ObjectToPolygon(des);
GList *p;
polygon_free_list(des_polygon);
for (p = src_polygon->points; p; p = p->next) {
GdkPoint *point = (GdkPoint*) p->data;
des_polygon->points = g_list_append(des_polygon->points,
new_point(point->x, point->y));
}
return object_copy(obj, des);
}
static void
@ -163,13 +172,14 @@ polygon_draw_sashes(Object_t *obj, GdkWindow *window, GdkGC *gc)
}
}
static GdkPoint *sash_point;
static GdkPoint *_sash_point;
static gint _sash_index;
static void
move_sash(Object_t *obj, gint dx, gint dy)
{
sash_point->x += dx;
sash_point->y += dy;
_sash_point->x += dx;
_sash_point->y += dy;
}
static MoveSashFunc_t
@ -177,10 +187,12 @@ polygon_near_sash(Object_t *obj, gint x, gint y)
{
Polygon_t *polygon = ObjectToPolygon(obj);
GList *p;
for (p = polygon->points; p; p = p->next) {
_sash_index = 0;
for (p = polygon->points; p; p = p->next, _sash_index++) {
GdkPoint *point = (GdkPoint*) p->data;
if (near_sash(point->x, point->y, x, y)) {
sash_point = point;
_sash_point = point;
return move_sash;
}
}
@ -276,6 +288,7 @@ polygon_move(Object_t *obj, gint dx, gint dy)
}
typedef struct {
Object_t *obj;
GtkWidget *list;
GtkWidget *x;
GtkWidget *y;
@ -284,6 +297,7 @@ typedef struct {
GtkWidget *append;
GtkWidget *remove;
gint selected_row;
gint timeout;
} PolygonProperties_t;
static void
@ -293,6 +307,8 @@ select_row_cb(GtkWidget *widget, gint row, gint column, GdkEventButton *event,
gchar *text;
data->selected_row = row;
_sash_point = g_list_nth(ObjectToPolygon(data->obj)->points, row)->data;
gtk_clist_get_text(GTK_CLIST(data->list), row, 0, &text);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->x), atoi(text));
@ -345,20 +361,39 @@ remove_button_clicked(GtkWidget *widget, PolygonProperties_t *data)
set_buttons_sensitivity(data);
}
static gpointer
polygon_create_info_tab(GtkWidget *notebook)
static void
x_changed_cb(GtkWidget *widget, gpointer data)
{
PolygonProperties_t *data = g_new(PolygonProperties_t, 1);
GtkWidget *hbox, *swin, *table, *label;
Object_t *obj = ((PolygonProperties_t*) data)->obj;
gint x = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
_sash_point->x = x;
edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog);
}
static void
y_changed_cb(GtkWidget *widget, gpointer data)
{
Object_t *obj = ((PolygonProperties_t*) data)->obj;
gint y = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
_sash_point->y = y;
edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog);
}
static gpointer
polygon_create_info_widget(GtkWidget *frame)
{
PolygonProperties_t *props = g_new(PolygonProperties_t, 1);
GtkWidget *hbox, *swin, *table;
GtkWidget *list;
gint max_width = get_image_width();
gint max_height = get_image_height();
gchar *titles[] = {"x (pixels)", "y (pixels)"};
gchar *titles[] = {N_("x (pixels)"), N_("y (pixels)")};
hbox = gtk_hbox_new(FALSE, 1);
gtk_container_add(GTK_CONTAINER(frame), hbox);
gtk_widget_show(hbox);
data->list = list = gtk_clist_new_with_titles(2, titles);
props->list = list = gtk_clist_new_with_titles(2, titles);
gtk_clist_column_titles_passive(GTK_CLIST(list));
swin = gtk_scrolled_window_new(NULL, NULL);
@ -379,7 +414,7 @@ polygon_create_info_tab(GtkWidget *notebook)
gtk_clist_set_column_justification(GTK_CLIST(list), 1, GTK_JUSTIFY_RIGHT);
gtk_signal_connect(GTK_OBJECT(list), "select_row",
GTK_SIGNAL_FUNC(select_row_cb), data);
GTK_SIGNAL_FUNC(select_row_cb), props);
gtk_clist_set_selection_mode(GTK_CLIST(list), GTK_SELECTION_SINGLE);
gtk_widget_show(list);
@ -391,43 +426,71 @@ polygon_create_info_tab(GtkWidget *notebook)
gtk_widget_show(table);
create_label_in_table(table, 0, 0, "x:");
data->x = create_spin_button_in_table(table, 0, 1, 1, 0, max_width - 1);
gtk_widget_set_usize(data->x, 64, -1);
create_label_in_table(table, 0, 2, "pixels");
props->x = create_spin_button_in_table(table, 0, 1, 1, 0, max_width - 1);
gtk_signal_connect(GTK_OBJECT(props->x), "changed",
(GtkSignalFunc) x_changed_cb, (gpointer) props);
gtk_widget_set_usize(props->x, 64, -1);
create_label_in_table(table, 0, 2, _("pixels"));
create_label_in_table(table, 1, 0, "y:");
data->y = create_spin_button_in_table(table, 1, 1, 1, 0, max_height - 1);
gtk_widget_set_usize(data->y, 64, -1);
create_label_in_table(table, 1, 2, "pixels");
props->y = create_spin_button_in_table(table, 1, 1, 1, 0, max_height - 1);
gtk_signal_connect(GTK_OBJECT(props->y), "changed",
(GtkSignalFunc) y_changed_cb, (gpointer) props);
gtk_widget_set_usize(props->y, 64, -1);
create_label_in_table(table, 1, 2, _("pixels"));
data->update = gtk_button_new_with_label("Update");
gtk_signal_connect(GTK_OBJECT(data->update), "clicked",
GTK_SIGNAL_FUNC(update_button_clicked), data);
gtk_table_attach_defaults(GTK_TABLE(table), data->update, 1, 2, 2, 3);
gtk_widget_show(data->update);
props->update = gtk_button_new_with_label(_("Update"));
gtk_signal_connect(GTK_OBJECT(props->update), "clicked",
GTK_SIGNAL_FUNC(update_button_clicked), props);
gtk_table_attach_defaults(GTK_TABLE(table), props->update, 1, 2, 2, 3);
gtk_widget_show(props->update);
data->insert = gtk_button_new_with_label("Insert");
gtk_signal_connect(GTK_OBJECT(data->insert), "clicked",
GTK_SIGNAL_FUNC(insert_button_clicked), data);
gtk_table_attach_defaults(GTK_TABLE(table), data->insert, 1, 2, 3, 4);
gtk_widget_show(data->insert);
props->insert = gtk_button_new_with_label(_("Insert"));
gtk_signal_connect(GTK_OBJECT(props->insert), "clicked",
GTK_SIGNAL_FUNC(insert_button_clicked), props);
gtk_table_attach_defaults(GTK_TABLE(table), props->insert, 1, 2, 3, 4);
gtk_widget_show(props->insert);
data->append = gtk_button_new_with_label("Append");
gtk_signal_connect(GTK_OBJECT(data->append), "clicked",
GTK_SIGNAL_FUNC(append_button_clicked), data);
gtk_table_attach_defaults(GTK_TABLE(table), data->append, 1, 2, 4, 5);
gtk_widget_show(data->append);
props->append = gtk_button_new_with_label(_("Append"));
gtk_signal_connect(GTK_OBJECT(props->append), "clicked",
GTK_SIGNAL_FUNC(append_button_clicked), props);
gtk_table_attach_defaults(GTK_TABLE(table), props->append, 1, 2, 4, 5);
gtk_widget_show(props->append);
data->remove = gtk_button_new_with_label("Remove");
gtk_signal_connect(GTK_OBJECT(data->remove), "clicked",
GTK_SIGNAL_FUNC(remove_button_clicked), data);
gtk_table_attach_defaults(GTK_TABLE(table), data->remove, 1, 2, 5, 6);
gtk_widget_show(data->remove);
props->remove = gtk_button_new_with_label(_("Remove"));
gtk_signal_connect(GTK_OBJECT(props->remove), "clicked",
GTK_SIGNAL_FUNC(remove_button_clicked), props);
gtk_table_attach_defaults(GTK_TABLE(table), props->remove, 1, 2, 5, 6);
gtk_widget_show(props->remove);
label = gtk_label_new("Polygon");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), hbox, label);
props->timeout = 0;
return data;
return props;
}
static gint
update_timeout(gpointer data)
{
PolygonProperties_t *props = (PolygonProperties_t*) data;
polygon_fill_info_tab(props->obj, data);
return FALSE;
}
static void
polygon_update_info_widget(Object_t *obj, gpointer data)
{
PolygonProperties_t *props = (PolygonProperties_t*) data;
gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->x), _sash_point->x);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->y), _sash_point->y);
if (props->selected_row != _sash_index) {
props->selected_row = _sash_index;
gtk_clist_select_row(GTK_CLIST(props->list), _sash_index, -1);
}
if (props->timeout)
gtk_timeout_remove(props->timeout);
props->timeout = gtk_timeout_add(1000, update_timeout, data);
}
static void
@ -437,6 +500,7 @@ polygon_fill_info_tab(Object_t *obj, gpointer data)
PolygonProperties_t *props = (PolygonProperties_t*) data;
GList *p;
props->obj = obj;
gtk_clist_freeze(GTK_CLIST(props->list));
gtk_clist_clear(GTK_CLIST(props->list));
for (p = polygon->points; p; p = p->next) {
@ -446,12 +510,11 @@ polygon_fill_info_tab(Object_t *obj, gpointer data)
text[0] = x;
text[1] = y;
sprintf(x, "%d", point->x);
sprintf(y, "%d", point->y);
gtk_clist_append(GTK_CLIST(props->list), text);
}
gtk_clist_select_row(GTK_CLIST(props->list), 0, -1);
gtk_clist_select_row(GTK_CLIST(props->list), _sash_index, -1);
gtk_clist_thaw(GTK_CLIST(props->list));
set_buttons_sensitivity(props);
@ -548,7 +611,7 @@ static void
polygon_delete_point(GtkWidget *widget, gpointer data)
{
Command_t *command = delete_point_command_new(get_popup_object(),
sash_point);
_sash_point);
command_execute(command);
}
@ -599,7 +662,7 @@ polygon_do_popup(Object_t *obj, GdkEventButton *event)
static ObjectPopup_t *delete_popup;
if (!delete_popup) {
delete_popup = make_object_popup();
object_popup_prepend_menu(delete_popup, "Delete Point",
object_popup_prepend_menu(delete_popup, _("Delete Point"),
polygon_delete_point, delete_popup);
}
object_handle_popup(delete_popup, obj, event);
@ -613,7 +676,7 @@ polygon_do_popup(Object_t *obj, GdkEventButton *event)
if (!insert_popup) {
insert_popup = make_object_popup();
object_popup_prepend_menu(insert_popup, "Insert Point",
object_popup_prepend_menu(insert_popup, _("Insert Point"),
polygon_insert_point, insert_popup);
}
object_handle_popup(insert_popup, obj, event);

View File

@ -25,9 +25,14 @@
#include <stdlib.h>
#include <string.h>
#include "libgimp/gimpenv.h"
#include "imap_command.h"
#include "imap_file.h"
#include "imap_main.h"
#include "imap_menu.h"
#include "imap_misc.h"
#include "imap_mru.h"
#include "imap_preferences.h"
#include "imap_table.h"
@ -100,6 +105,10 @@ parse_line(PreferencesData_t *data, char *line)
data->show_url_tip = parse_yes_no();
} else if (!strcmp(token, "use-doublesized")) {
data->use_doublesized = parse_yes_no();
} else if (!strcmp(token, "mru-size")) {
data->mru_size = parse_int();
} else if (!strcmp(token, "undo-levels")) {
data->undo_levels = parse_int();
} else if (!strcmp(token, "normal-fg-color")) {
parse_color(&colors->normal_fg);
} else if (!strcmp(token, "normal-bg-color")) {
@ -110,8 +119,6 @@ parse_line(PreferencesData_t *data, char *line)
parse_color(&colors->selected_bg);
} else if (!strcmp(token, "mru-entry")) {
parse_mru_entry();
} else if (!strcmp(token, "mru-size")) {
data->mru_size = parse_int();
} else {
/* Unrecognized, just ignore rest of line */
}
@ -124,7 +131,7 @@ preferences_load(PreferencesData_t *data)
char buf[256];
gchar *filename;
filename = g_strconcat(getenv("HOME"), "/.gimp/imagemaprc", NULL);
filename = g_strconcat(gimp_directory(), "/imagemaprc", NULL);
in = fopen(filename, "r");
g_free(filename);
@ -147,7 +154,7 @@ preferences_save(PreferencesData_t *data)
gchar *filename;
ColorSelData_t *colors = &data->colors;
filename = g_strconcat(getenv("HOME"), "/.gimp/imagemaprc", NULL);
filename = g_strconcat(gimp_directory(), "/imagemaprc", NULL);
out = fopen(filename, "w");
if (out) {
@ -171,6 +178,10 @@ preferences_save(PreferencesData_t *data)
(data->show_url_tip) ? "yes" : "no");
fprintf(out, "(use-doublesized %s)\n",
(data->use_doublesized) ? "yes" : "no");
fprintf(out, "(undo-levels %d)\n", data->undo_levels);
fprintf(out, "(mru-size %d)\n", data->mru_size);
fprintf(out, "(normal-fg-color %d %d %d)\n",
colors->normal_fg.red, colors->normal_fg.green,
colors->normal_fg.blue);
@ -199,6 +210,7 @@ preferences_ok_cb(gpointer data)
PreferencesDialog_t *param = (PreferencesDialog_t*) data;
PreferencesData_t *old_data = param->old_data;
ColorSelData_t *colors = &old_data->colors;
MRU_t *mru = get_mru();
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->cern)))
old_data->default_map_type = CERN;
@ -220,6 +232,14 @@ preferences_ok_cb(gpointer data)
old_data->use_doublesized = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(param->use_doublesized));
old_data->mru_size =
gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->mru_size));
old_data->undo_levels =
gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->undo_levels));
mru_set_size(mru, old_data->mru_size);
menu_build_mru_items(mru);
command_list_set_undo_level(old_data->undo_levels);
*colors = param->new_colors;
gdk_gc_set_foreground(old_data->normal_gc, &colors->normal_fg);
@ -446,6 +466,33 @@ create_general_tab(PreferencesDialog_t *data, GtkWidget *notebook)
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label);
}
static void
create_menu_tab(PreferencesDialog_t *data, GtkWidget *notebook)
{
GtkWidget *table;
GtkWidget *label;
GtkWidget *vbox;
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
table = gtk_table_new(2, 2, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(table), 10);
gtk_table_set_row_spacings(GTK_TABLE(table), 10);
gtk_table_set_col_spacings(GTK_TABLE(table), 10);
gtk_widget_show(table);
create_label_in_table(table, 0, 0, "Number of Undo levels (1 - 99):");
data->undo_levels = create_spin_button_in_table(table, 0, 1, 1, 1, 99);
create_label_in_table(table, 1, 0, "Number of MRU entries (1 - 16):");
data->mru_size = create_spin_button_in_table(table, 1, 1, 1, 1, 16);
label = gtk_label_new("Menu");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
}
static GtkWidget*
create_color_field(PreferencesDialog_t *data, GtkWidget *table, gint row,
gint col, GtkSignalFunc func)
@ -498,7 +545,7 @@ static void
switch_page(GtkWidget *widget, GtkNotebookPage *page, gint page_num,
gpointer data)
{
if (page_num == 1) {
if (page_num == 2) {
PreferencesDialog_t *param = (PreferencesDialog_t*) data;
set_button_colors(param, &param->old_colors);
}
@ -523,6 +570,7 @@ create_preferences_dialog()
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog->dialog)->vbox),
notebook, TRUE, TRUE, 10);
create_general_tab(data, notebook);
create_menu_tab(data, notebook);
create_colors_tab(data, notebook);
gtk_widget_show(notebook);
@ -566,5 +614,10 @@ do_preferences_dialog(void)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->use_doublesized),
old_data->use_doublesized);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->undo_levels),
old_data->undo_levels);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->mru_size),
old_data->mru_size);
default_dialog_show(dialog->dialog);
}

View File

@ -41,6 +41,7 @@ typedef struct {
gboolean keep_circles_round;
gboolean show_url_tip;
gboolean use_doublesized;
gint undo_levels;
gint mru_size;
ColorSelData_t colors;
GdkGC *normal_gc;
@ -59,6 +60,10 @@ typedef struct {
GtkWidget *keep_circles_round;
GtkWidget *show_url_tip;
GtkWidget *use_doublesized;
GtkWidget *undo_levels;
GtkWidget *mru_size;
GtkWidget *normal_fg;
GtkWidget *normal_bg;
GtkWidget *selected_fg;

View File

@ -23,10 +23,10 @@
#include "libgimp/gimp.h"
#include "imap_cmd_edit_object.h"
#include "imap_grid.h"
#include "imap_main.h"
#include "imap_preview.h"
#include "imap_rectangle.h"
#define PREVIEW_MASK GDK_EXPOSURE_MASK | \
GDK_MOTION_NOTIFY | \
@ -338,13 +338,43 @@ preview_zoom(Preview_t *preview, gint zoom_factor)
preview_redraw(preview);
}
void
GdkCursorType
preview_set_cursor(Preview_t *preview, GdkCursorType cursor_type)
{
GdkCursorType prev_cursor = preview->cursor;
GdkCursor *cursor = gdk_cursor_new(cursor_type);
gdk_window_set_cursor(preview->window->window, cursor);
gdk_cursor_destroy(cursor);
gdk_flush();
preview->cursor = cursor_type;
return prev_cursor;
}
static GtkTargetEntry target_table[] = {
{"STRING", 0, 1 },
{"text/plain", 0, 2 }
};
static void
handle_drop(GtkWidget *widget, GdkDragContext *context, gint x, gint y,
GtkSelectionData *data, guint info, guint time)
{
gboolean success = FALSE;
if (data->length >= 0 && data->format == 8) {
ObjectList_t *list = get_shapes();
Object_t *obj;
x = get_real_coord(x);
y = get_real_coord(y);
obj = object_list_find(list, x, y);
if (obj && !obj->locked) {
command_list_add(edit_object_command_new(obj));
object_set_url(obj, data->data);
object_emit_update_signal(obj);
success = TRUE;
}
}
gtk_drag_finish(context, success, FALSE, time);
}
Preview_t*
@ -367,6 +397,12 @@ make_preview(GDrawable *drawable)
(GtkSignalFunc) preview_expose,
data);
/* Handle drop of links in preview widget */
gtk_drag_dest_set(preview, GTK_DEST_DEFAULT_ALL, target_table,
2, GDK_ACTION_COPY);
gtk_signal_connect(GTK_OBJECT(preview), "drag_data_received",
GTK_SIGNAL_FUNC(handle_drop), NULL);
data->width = gimp_drawable_width(drawable->id);
data->height = gimp_drawable_height(drawable->id);
gtk_preview_size(GTK_PREVIEW(preview), data->width, data->height);

View File

@ -38,6 +38,8 @@ typedef struct {
gint height;
gint exp_id;
GPixelRgn src_rgn;
GdkCursorType cursor;
} Preview_t;
Preview_t *make_preview(GDrawable *drawable);
@ -52,6 +54,7 @@ gint preview_get_width(GtkWidget *preview);
gint preview_get_height(GtkWidget *preview);
void preview_zoom(Preview_t *preview, gint zoom_factor);
void preview_set_cursor(Preview_t *preview, GdkCursorType cursor_type);
GdkCursorType preview_set_cursor(Preview_t *preview,
GdkCursorType cursor_type);
#endif /* _IMAP_PREVIEW_H */

View File

@ -21,6 +21,7 @@
*
*/
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_misc.h"
#include "imap_object_popup.h"
@ -31,7 +32,7 @@
static gboolean rectangle_is_valid(Object_t *obj);
static Object_t *rectangle_clone(Object_t *obj);
static Object_t *rectangle_assign(Object_t *obj, Object_t *des);
static void rectangle_assign(Object_t *obj, Object_t *des);
static void rectangle_normalize(Object_t *obj);
static void rectangle_draw(Object_t *obj, GdkWindow *window, GdkGC* gc);
static void rectangle_draw_sashes(Object_t *obj, GdkWindow *window, GdkGC* gc);
@ -42,7 +43,7 @@ static void rectangle_get_dimensions(Object_t *obj, gint *x, gint *y,
static void rectangle_resize(Object_t *obj, gint percentage_x,
gint percentage_y);
static void rectangle_move(Object_t *obj, gint dx, gint dy);
static gpointer rectangle_create_info_tab(GtkWidget *notebook);
static gpointer rectangle_create_info_widget(GtkWidget *frame);
static void rectangle_fill_info_tab(Object_t *obj, gpointer data);
static void rectangle_set_initial_focus(Object_t *obj, gpointer data);
static void rectangle_update(Object_t *obj, gpointer data);
@ -55,6 +56,7 @@ static void rectangle_write_ncsa(Object_t *obj, gpointer param,
static char** rectangle_get_icon_data(void);
static ObjectClass_t rectangle_class = {
N_("Rectangle"),
NULL, /* info_dialog */
NULL, /* icon */
NULL, /* mask */
@ -71,7 +73,8 @@ static ObjectClass_t rectangle_class = {
rectangle_get_dimensions,
rectangle_resize,
rectangle_move,
rectangle_create_info_tab,
rectangle_create_info_widget,
rectangle_fill_info_tab, /* rectangle_update_info_widget */
rectangle_fill_info_tab,
rectangle_set_initial_focus,
rectangle_update,
@ -128,7 +131,7 @@ rectangle_clone(Object_t *obj)
return &clone->obj;
}
static Object_t*
static void
rectangle_assign(Object_t *obj, Object_t *des)
{
Rectangle_t *src_rectangle = ObjectToRectangle(obj);
@ -137,7 +140,6 @@ rectangle_assign(Object_t *obj, Object_t *des)
des_rectangle->y = src_rectangle->y;
des_rectangle->width = src_rectangle->width;
des_rectangle->height = src_rectangle->height;
return object_copy(obj, des);
}
static void
@ -317,58 +319,81 @@ typedef struct {
GtkWidget *height;
} RectangleProperties_t;
#ifdef _NOT_READY_YET_
static void
x_changed_cb(GtkWidget *widget, gpointer data)
{
Object_t *obj = ((RectangleProperties_t*) data)->obj;
gint x = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
ObjectToRectangle(obj)->x = x;
object_emit_changed_signal(obj);
edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog);
}
static void
y_changed_cb(GtkWidget *widget, gpointer data)
{
Object_t *obj = ((RectangleProperties_t*) data)->obj;
gint y = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
ObjectToRectangle(obj)->y = y;
edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog);
}
static void
width_changed_cb(GtkWidget *widget, gpointer data)
{
Object_t *obj = ((RectangleProperties_t*) data)->obj;
gint width = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
ObjectToRectangle(obj)->width = width;
edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog);
}
static void
height_changed_cb(GtkWidget *widget, gpointer data)
{
Object_t *obj = ((RectangleProperties_t*) data)->obj;
gint height = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
ObjectToRectangle(obj)->height = height;
edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog);
}
#endif
static gpointer
rectangle_create_info_tab(GtkWidget *notebook)
rectangle_create_info_widget(GtkWidget *frame)
{
RectangleProperties_t *props = g_new(RectangleProperties_t, 1);
GtkWidget *vbox, *table, *label;
GtkWidget *table;
gint max_width = get_image_width();
gint max_height = get_image_height();
vbox = gtk_vbox_new(FALSE, 1);
gtk_widget_show(vbox);
table = gtk_table_new(5, 3, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
table = gtk_table_new(4, 3, FALSE);
gtk_container_add(GTK_CONTAINER(frame), table);
gtk_container_set_border_width(GTK_CONTAINER(table), 10);
gtk_table_set_row_spacings(GTK_TABLE(table), 10);
gtk_table_set_col_spacings(GTK_TABLE(table), 10);
gtk_widget_show(table);
create_label_in_table(table, 0, 0, "Upper left x:");
create_label_in_table(table, 0, 0, _("Upper left x:"));
props->x = create_spin_button_in_table(table, 0, 1, 1, 0, max_width - 1);
/* gtk_signal_connect(GTK_OBJECT(props->x), "changed",
(GtkSignalFunc) x_changed_cb, (gpointer) props); */
create_label_in_table(table, 0, 2, "pixels");
gtk_signal_connect(GTK_OBJECT(props->x), "changed",
(GtkSignalFunc) x_changed_cb, (gpointer) props);
create_label_in_table(table, 0, 2, _("pixels"));
create_label_in_table(table, 1, 0, "Upper left y:");
create_label_in_table(table, 1, 0, _("Upper left y:"));
props->y = create_spin_button_in_table(table, 1, 1, 1, 0, max_height - 1);
create_label_in_table(table, 1, 2, "pixels");
gtk_signal_connect(GTK_OBJECT(props->y), "changed",
(GtkSignalFunc) y_changed_cb, (gpointer) props);
create_label_in_table(table, 1, 2, _("pixels"));
create_label_in_table(table, 2, 0, "Width:");
create_label_in_table(table, 2, 0, _("Width:"));
props->width = create_spin_button_in_table(table, 2, 1, 1, 1, max_width);
create_label_in_table(table, 2, 2, "pixels");
gtk_signal_connect(GTK_OBJECT(props->width), "changed",
(GtkSignalFunc) width_changed_cb, (gpointer) props);
create_label_in_table(table, 2, 2, _("pixels"));
create_label_in_table(table, 3, 0, "Height:");
create_label_in_table(table, 3, 0, _("Height:"));
props->height = create_spin_button_in_table(table, 3, 1, 1, 1, max_height);
create_label_in_table(table, 3, 2, "pixels");
/* create_check_button_in_table(table, 4, 0, "Preview");*/
label = gtk_label_new("Rectangle");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
gtk_signal_connect(GTK_OBJECT(props->height), "changed",
(GtkSignalFunc) height_changed_cb, (gpointer) props);
create_label_in_table(table, 3, 2, _("pixels"));
return props;
}

View File

@ -23,10 +23,12 @@
#include <stdio.h>
#include "imap_cmd_edit_object.h"
#include "imap_cmd_select.h"
#include "imap_cmd_unselect.h"
#include "imap_cmd_unselect_all.h"
#include "imap_edit_area_info.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_misc.h"
#include "imap_selection.h"
@ -62,14 +64,16 @@ select_row_cb(GtkWidget *widget, gint row, gint column, GdkEventButton *event,
{
data->selected_child = widget;
data->selected_row = row;
set_buttons(data);
if (data->select_lock) {
data->select_lock = FALSE;
} else {
Object_t *obj = gtk_clist_get_row_data(GTK_CLIST(data->list), row);
Command_t *command;
if (event->state & GDK_SHIFT_MASK) {
/* Note: event can be NULL if select_row_cb is called as a result of
a key press! */
if (event && event->state & GDK_SHIFT_MASK) {
command = select_command_new(obj);
} else {
Command_t *sub_command;
@ -104,6 +108,39 @@ unselect_row_cb(GtkWidget *widget, gint row, gint column,
set_buttons(data);
}
static void
row_move_cb(GtkWidget *widget, gint src, gint des)
{
printf("move: %d %d\n", src, des);
}
static gboolean doubleclick;
static void
button_press_cb(GtkWidget *widget, GdkEventButton *event, Selection_t *data)
{
if (event->button == 1) {
if (doubleclick) {
gint row, column;
doubleclick = FALSE;
if (gtk_clist_get_selection_info(GTK_CLIST(widget), (gint) event->x,
(gint) event->y, &row, &column)) {
Object_t *obj = gtk_clist_get_row_data(GTK_CLIST(data->list), row);
object_edit(obj, TRUE);
}
} else {
doubleclick = TRUE;
}
}
}
static void
button_release_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
if (event->button == 1)
doubleclick = FALSE;
}
static void
selection_command(GtkWidget *widget, gpointer data)
{
@ -264,6 +301,32 @@ toggle_order(GtkWidget *widget, gint column, gpointer data)
/* Fix me! */
}
static GtkTargetEntry target_table[] = {
{"STRING", 0, 1 },
{"text/plain", 0, 2 }
};
static void
handle_drop(GtkWidget *widget, GdkDragContext *context, gint x, gint y,
GtkSelectionData *data, guint info, guint time)
{
gboolean success = FALSE;
if (data->length >= 0 && data->format == 8) {
gint row, column;
if (gtk_clist_get_selection_info(GTK_CLIST(widget), x, y, &row,
&column)) {
Object_t *obj = gtk_clist_get_row_data(GTK_CLIST(widget), row + 1);
if (!obj->locked) {
command_list_add(edit_object_command_new(obj));
object_set_url(obj, data->data);
object_emit_update_signal(obj);
success = TRUE;
}
}
}
gtk_drag_finish(context, success, FALSE, time);
}
Selection_t*
make_selection(GtkWidget *window, ObjectList_t *object_list)
{
@ -271,7 +334,7 @@ make_selection(GtkWidget *window, ObjectList_t *object_list)
GtkWidget *swin, *frame, *hbox;
GtkWidget *toolbar;
GtkWidget *list;
gchar *titles[] = {"#", "URL", "Target", "Comment"};
gchar *titles[] = {"#", N_("URL"), N_("Target"), N_("Comment")};
data->object_list = object_list;
data->selected_child = NULL;
@ -292,21 +355,20 @@ make_selection(GtkWidget *window, ObjectList_t *object_list)
gtk_container_add(GTK_CONTAINER(hbox), toolbar);
/* Create selection */
frame = gtk_frame_new("Selection");
frame = gtk_frame_new(_("Selection"));
gtk_container_set_border_width(GTK_CONTAINER(frame), 10);
gtk_container_add(GTK_CONTAINER(hbox), frame);
gtk_widget_show(frame);
data->list = list = gtk_clist_new_with_titles(4, titles);
GTK_WIDGET_UNSET_FLAGS(data->list, GTK_CAN_FOCUS);
gtk_clist_column_titles_passive(GTK_CLIST(list));
gtk_clist_column_title_active(GTK_CLIST(list), 0);
gtk_clist_set_column_width(GTK_CLIST(list), 0, 16);
gtk_clist_set_column_width(GTK_CLIST(list), 1, 80);
gtk_clist_set_column_width(GTK_CLIST(list), 2, 64);
gtk_clist_set_column_width(GTK_CLIST(list), 3, 64);
gtk_signal_connect(GTK_OBJECT(list), "click_column",
GTK_SIGNAL_FUNC(toggle_order), (gpointer) data);
gtk_clist_set_reorderable(GTK_CLIST(list), TRUE);
/* Create scrollable window */
swin = gtk_scrolled_window_new(NULL, NULL);
@ -315,19 +377,35 @@ make_selection(GtkWidget *window, ObjectList_t *object_list)
gtk_widget_show(swin);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(swin), list);
gtk_object_set_user_data(GTK_OBJECT(list), data);
gtk_widget_show(list);
/* Drop support */
gtk_drag_dest_set(list, GTK_DEST_DEFAULT_ALL, target_table,
2, GDK_ACTION_COPY);
gtk_signal_connect(GTK_OBJECT(list), "drag_data_received",
GTK_SIGNAL_FUNC(handle_drop), NULL);
/* Callbacks we are interested in */
gtk_signal_connect(GTK_OBJECT(list), "click_column",
GTK_SIGNAL_FUNC(toggle_order), data);
gtk_signal_connect(GTK_OBJECT(list), "select_row",
GTK_SIGNAL_FUNC(select_row_cb), data);
gtk_signal_connect(GTK_OBJECT(list), "unselect_row",
GTK_SIGNAL_FUNC(unselect_row_cb), data);
gtk_signal_connect(GTK_OBJECT(list), "row_move",
GTK_SIGNAL_FUNC(row_move_cb), data);
/* For handling doubleclick */
gtk_signal_connect(GTK_OBJECT(list), "button_press_event",
GTK_SIGNAL_FUNC(button_press_cb), data);
gtk_signal_connect(GTK_OBJECT(list), "button_release_event",
GTK_SIGNAL_FUNC(button_release_cb), data);
gtk_clist_set_selection_mode(GTK_CLIST(list), GTK_SELECTION_MULTIPLE);
set_buttons(data);
/* Set callbacks we're interested in */
/* Set object list callbacks we're interested in */
object_list_add_add_cb(object_list, object_added_cb, data);
object_list_add_update_cb(object_list, object_updated_cb, data);
object_list_add_remove_cb(object_list, object_removed_cb, data);

View File

@ -22,6 +22,7 @@
*/
#include "imap_browse.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_settings.h"
#include "imap_string.h"
@ -63,7 +64,7 @@ make_settings_dialog()
DefaultDialog_t *dialog;
GSList *group;
dialog = data->dialog = make_default_dialog("Settings for this Mapfile");
dialog = data->dialog = make_default_dialog(_("Settings for this Mapfile"));
default_dialog_set_ok_cb(dialog, settings_ok_cb, (gpointer) data);
table = gtk_table_new(9, 3, FALSE);
@ -74,21 +75,21 @@ make_settings_dialog()
gtk_container_set_border_width(GTK_CONTAINER(table), 10);
gtk_widget_show(table);
create_label_in_table(table, 0, 0, "Filename:");
create_label_in_table(table, 0, 0, _("Filename:"));
data->filename = create_label_in_table(table, 0, 1, "");
create_label_in_table(table, 1, 0, "Image name:");
data->imagename = browse_widget_new("Select Image File");
create_label_in_table(table, 1, 0, _("Image name:"));
data->imagename = browse_widget_new(_("Select Image File"));
gtk_table_attach_defaults(GTK_TABLE(table), data->imagename->hbox, 1, 2,
1, 2);
create_label_in_table(table, 2, 0, "Title:");
create_label_in_table(table, 2, 0, _("Title:"));
data->title = create_entry_in_table(table, 2, 1);
create_label_in_table(table, 3, 0, "Author:");
create_label_in_table(table, 3, 0, _("Author:"));
data->author = create_entry_in_table(table, 3, 1);
create_label_in_table(table, 4, 0, "Default URL:");
create_label_in_table(table, 4, 0, _("Default URL:"));
data->default_url = create_entry_in_table(table, 4, 1);
create_label_in_table(table, 5, 0, "Description:");
create_label_in_table(table, 5, 0, _("Description:"));
data->description = gtk_text_new(NULL, NULL);
gtk_text_set_editable(GTK_TEXT(data->description), TRUE);
@ -103,7 +104,7 @@ make_settings_dialog()
GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show(vscrollbar);
frame = gtk_frame_new("Map file format");
frame = gtk_frame_new(_("Map file format"));
gtk_widget_show(frame);
gtk_table_attach_defaults(GTK_TABLE(table), frame, 1, 2, 9, 10);
hbox = gtk_hbox_new(FALSE, 1);
@ -144,7 +145,7 @@ do_settings_dialog(void)
dialog = make_settings_dialog();
gtk_label_set_text(GTK_LABEL(dialog->filename),
(filename) ? filename : "<Untitled>");
(filename) ? filename : _("<Untitled>"));
browse_widget_set_filename(dialog->imagename, info->image_name);
gtk_entry_set_text(GTK_ENTRY(dialog->title), info->title);
gtk_entry_set_text(GTK_ENTRY(dialog->author), info->author);
@ -164,3 +165,4 @@ do_settings_dialog(void)
gtk_text_insert(GTK_TEXT(dialog->description), NULL, NULL, NULL,
info->description, -1);
}

View File

@ -25,6 +25,7 @@
#include <stdio.h>
#include "imap_default_dialog.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_source.h"
@ -50,7 +51,7 @@ do_source_dialog(void)
if (!dialog) {
GtkWidget *window;
dialog = make_default_dialog("View Source");
dialog = make_default_dialog(_("View Source"));
default_dialog_hide_cancel_button(dialog);
default_dialog_hide_apply_button(dialog);

View File

@ -60,6 +60,7 @@ make_statusbar(GtkWidget *main_vbox, GtkWidget *window)
statusbar->xy = gtk_entry_new();
gtk_widget_set_usize(statusbar->xy, 64, -1);
gtk_entry_set_editable(GTK_ENTRY(statusbar->xy), FALSE);
GTK_WIDGET_UNSET_FLAGS(statusbar->xy, GTK_CAN_FOCUS);
gtk_box_pack_start(GTK_BOX(hbox), statusbar->xy, FALSE, FALSE, 0);
gtk_widget_show(statusbar->xy);
@ -74,6 +75,7 @@ make_statusbar(GtkWidget *main_vbox, GtkWidget *window)
statusbar->dimension = gtk_entry_new();
gtk_widget_set_usize(statusbar->dimension, 64, -1);
gtk_entry_set_editable(GTK_ENTRY(statusbar->dimension), FALSE);
GTK_WIDGET_UNSET_FLAGS(statusbar->dimension, GTK_CAN_FOCUS);
gtk_box_pack_start(GTK_BOX(hbox), statusbar->dimension, FALSE, FALSE, 0);
gtk_widget_show(statusbar->dimension);

View File

@ -26,7 +26,10 @@
gchar*
g_strreplace(gchar **old_str, const gchar *new_str)
{
g_free(*old_str);
return *old_str = g_strdup(new_str);
if (*old_str != new_str) {
g_free(*old_str);
*old_str = g_strdup(new_str);
}
return *old_str;
}

View File

@ -0,0 +1,122 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 <stdio.h>
#include "imap_string.h"
#include "imap_taglist.h"
static Tag_t*
tag_create(const gchar *name, const gchar *value)
{
Tag_t *tag = g_new(Tag_t, 1);
tag->name = g_strdup(name);
tag->value = g_strdup(value);
return tag;
}
static Tag_t*
tag_clone(Tag_t *src)
{
return tag_create(src->name, src->value);
}
static void
tag_destruct(Tag_t *tag)
{
g_free(tag->name);
g_free(tag->value);
g_free(tag);
}
static void
tag_write(Tag_t *tag)
{
printf("\"%s\"=\"%s\"\n", tag->name, tag->value);
}
TagList_t*
taglist_create(void)
{
TagList_t *tlist = g_new(TagList_t, 1);
tlist->list = NULL;
return tlist;
}
TagList_t*
taglist_clone(TagList_t *src)
{
return taglist_copy(src, taglist_create());
}
static void
taglist_remove_all(TagList_t *tlist)
{
GList *p;
for (p = tlist->list; p; p = p->next)
tag_destruct((Tag_t*) p->data);
g_list_free(tlist->list);
tlist->list = NULL;
}
TagList_t*
taglist_copy(TagList_t *src, TagList_t *des)
{
GList *p;
taglist_remove_all(des);
for (p = src->list; p; p = p->next)
des->list = g_list_append(des->list, tag_clone((Tag_t*) p->data));
return des;
}
void
taglist_destruct(TagList_t *tlist)
{
taglist_remove_all(tlist);
g_free(tlist);
}
void
taglist_set(TagList_t *tlist, const gchar *name, const gchar *value)
{
GList *p;
Tag_t *tag;
for (p = tlist->list; p; p = p->next) {
tag = (Tag_t*) p->data;
if (!g_strcasecmp(tag->name, name)) {
g_strreplace(&tag->value, value);
return;
}
}
/* Tag not found, add a new tag */
tlist->list = g_list_append(tlist->list, tag_create(name, value));
}
void
taglist_write(TagList_t *tlist)
{
GList *p;
for (p = tlist->list; p; p = p->next)
tag_write((Tag_t*) p->data);
}

View File

@ -0,0 +1,45 @@
/*
* This is a plug-in for the GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl
*
* 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 _IMAP_TAGLIST_H
#define _IMAP_TAGLIST_H
#include <glib.h>
typedef struct {
gchar *name;
gchar *value;
} Tag_t;
typedef struct {
GList *list;
} TagList_t;
TagList_t *taglist_create(void);
TagList_t *taglist_clone(TagList_t *src);
TagList_t *taglist_copy(TagList_t *src, TagList_t *des);
void taglist_destruct(TagList_t *tlist);
void taglist_set(TagList_t *tlist, const gchar *id, const gchar *value);
void taglist_write(TagList_t *tlist);
#endif /* _IMAP_TAGLIST_H */

View File

@ -21,6 +21,7 @@
*
*/
#include "libgimp/stdplugins-intl.h"
#include "imap_main.h"
#include "imap_misc.h"
#include "imap_toolbar.h"
@ -107,59 +108,60 @@ make_toolbar(GtkWidget *main_vbox, GtkWidget *window)
gtk_container_add(GTK_CONTAINER(handlebox), toolbar);
make_toolbar_icon(toolbar, window, open_xpm, "Open",
"Open", toolbar_command, &data->cmd_open);
make_toolbar_icon(toolbar, window, save_xpm, "Save",
_("Open"), toolbar_command, &data->cmd_open);
make_toolbar_icon(toolbar, window, save_xpm, _("Save"),
"Save", toolbar_command, &data->cmd_save);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
make_toolbar_icon(toolbar, window, preferences_xpm, "Preferences",
"Preferences", toolbar_command, &data->cmd_preferences);
_("Preferences"), toolbar_command,
&data->cmd_preferences);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
data->undo = make_toolbar_icon(toolbar, window, undo_xpm, "Undo",
"Undo", toolbar_command, &data->cmd_undo);
_("Undo"), toolbar_command, &data->cmd_undo);
gtk_widget_set_sensitive(data->undo, FALSE);
data->redo = make_toolbar_icon(toolbar, window, redo_xpm, "Redo",
"Redo", toolbar_command, &data->cmd_redo);
_("Redo"), toolbar_command, &data->cmd_redo);
gtk_widget_set_sensitive(data->redo, FALSE);
command_list_add_update_cb(command_list_changed, data);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
data->cut = make_toolbar_icon(toolbar, window, cut_xpm, "Cut",
"Cut", toolbar_command, &data->cmd_cut);
_("Cut"), toolbar_command, &data->cmd_cut);
gtk_widget_set_sensitive(data->cut, FALSE);
data->copy = make_toolbar_icon(toolbar, window, copy_xpm, "Copy",
"Copy", toolbar_command, &data->cmd_copy);
_("Copy"), toolbar_command, &data->cmd_copy);
gtk_widget_set_sensitive(data->copy, FALSE);
paste = make_toolbar_icon(toolbar, window, paste_xpm, "Paste",
"Paste", toolbar_command, &data->cmd_paste);
_("Paste"), toolbar_command, &data->cmd_paste);
gtk_widget_set_sensitive(paste, FALSE);
paste_buffer_add_add_cb(paste_buffer_added, (gpointer) paste);
paste_buffer_add_remove_cb(paste_buffer_removed, (gpointer) paste);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
data->zoom_in = make_toolbar_icon(toolbar, window, zoom_in_xpm, "ZoomIn",
"Zoom in", toolbar_command,
_("Zoom in"), toolbar_command,
&data->cmd_zoom_in);
data->zoom_out = make_toolbar_icon(toolbar, window, zoom_out_xpm, "ZoomOut",
"Zoom out", toolbar_command,
_("Zoom out"), toolbar_command,
&data->cmd_zoom_out);
gtk_widget_set_sensitive(data->zoom_out, FALSE);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
make_toolbar_icon(toolbar, window, map_info_xpm, "EditMapInfo",
"Edit Map Info", toolbar_command,
_("Edit Map Info"), toolbar_command,
&data->cmd_edit_map_info);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
data->to_front = make_toolbar_icon(toolbar, window, to_front_xpm, "ToFront",
"Move To Front", toolbar_command,
_("Move To Front"), toolbar_command,
&data->cmd_move_to_front);
gtk_widget_set_sensitive(data->to_front, FALSE);
data->to_back = make_toolbar_icon(toolbar, window, to_back_xpm, "ToBack",
"Send To Back", toolbar_command,
_("Send To Back"), toolbar_command,
&data->cmd_send_to_back);
gtk_widget_set_sensitive(data->to_back, FALSE);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
data->grid = make_toolbar_toggle_icon(toolbar, window, grid_xpm, "Grid",
"Grid", toolbar_command,
_("Grid"), toolbar_command,
&data->cmd_grid);
gtk_widget_show(toolbar);

View File

@ -24,6 +24,7 @@
#include "imap_circle.h"
#include "imap_edit_area_info.h"
#include "imap_main.h"
#include "libgimp/stdplugins-intl.h"
#include "imap_menu.h"
#include "imap_misc.h"
#include "imap_polygon.h"
@ -125,27 +126,27 @@ make_tools(GtkWidget *window)
gtk_container_add(GTK_CONTAINER(handlebox), toolbar);
_tools.arrow = make_toolbar_radio_icon(toolbar, window, NULL, arrow_xpm,
"Select", "Select existing area",
"Select", _("Select existing area"),
arrow_clicked, NULL);
_tools.rectangle = make_toolbar_radio_icon(toolbar, window, _tools.arrow,
rectangle_xpm, "Rectangle",
"Define Rectangle area",
_("Define Rectangle area"),
rectangle_clicked, NULL);
_tools.circle = make_toolbar_radio_icon(toolbar, window, _tools.rectangle,
circle_xpm, "Circle",
"Define Circle/Oval area",
_("Define Circle/Oval area"),
circle_clicked, NULL);
_tools.polygon = make_toolbar_radio_icon(toolbar, window, _tools.circle,
polygon_xpm, "Polygon",
"Define Polygon area",
_("Define Polygon area"),
polygon_clicked, NULL);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
_tools.edit = make_toolbar_icon(toolbar, window, edit_xpm, "Edit",
"Edit selected area info", tools_command,
_("Edit selected area info"), tools_command,
&_tools.cmd_edit);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
_tools.delete = make_toolbar_icon(toolbar, window, delete_xpm, "Delete",
"Delete selected area", tools_command,
_("Delete selected area"), tools_command,
&_tools.cmd_delete);
gtk_widget_show(toolbar);

View File

@ -1,7 +1,11 @@
Sun Oct 24 22:52:01 MEST 1999 Sven Neumann <sven@gimp.org>
* POTFILES.in: added imagemap plug-in
Sun Oct 24 18:58:16 MEST 1999 Sven Neumann <sven@gimp.org>
* de.po: Checked in first german version
(done by Felix Natter <f.natter@ndh.net>
(done by Felix Natter <f.natter@ndh.net>
and Daniel Eggert <Daniel.Egger@rz.fh-muenchen.de>)
1999-10-21 Kjartan Maraas <kmaraas@online.no>

View File

@ -3,20 +3,20 @@
plug-ins/AlienMap/AlienMap.c
plug-ins/AlienMap2/AlienMap2.c
plug-ins/common/CEL.c
plug-ins/common/CML_explorer.c
plug-ins/Lighting/lighting_main.c
plug-ins/Lighting/lighting_ui.c
plug-ins/bmp/bmp.c
plug-ins/bmp/bmpread.c
plug-ins/bmp/bmpwrite.c
plug-ins/borderaverage/borderaverage.c
plug-ins/common/CEL.c
plug-ins/common/CML_explorer.c
plug-ins/common/animationplay.c
plug-ins/common/animoptimize.c
plug-ins/common/apply_lens.c
plug-ins/common/autocrop.c
plug-ins/common/autostretch_hsv.c
plug-ins/common/blur.c
plug-ins/bmp/bmp.c
plug-ins/bmp/bmpread.c
plug-ins/bmp/bmpwrite.c
plug-ins/borderaverage/borderaverage.c
plug-ins/common/bumpmap.c
plug-ins/common/bz2.c
plug-ins/common/c_astretch.c
@ -29,6 +29,21 @@ plug-ins/common/cubism.c
plug-ins/common/decompose.c
plug-ins/common/depthmerge.c
plug-ins/common/destripe.c
plug-ins/common/gif.c
plug-ins/common/gifload.c
plug-ins/common/film.c
plug-ins/common/normalize.c
plug-ins/common/oilify.c
plug-ins/common/png.c
plug-ins/common/ps.c
plug-ins/common/rotate.c
plug-ins/common/rotators.c
plug-ins/common/threshold_alpha.c
plug-ins/common/warp.c
plug-ins/common/xbm.c
plug-ins/common/xpm.c
plug-ins/common/xwd.c
plug-ins/common/zealouscrop.c
plug-ins/gap/gap_arr_dialog.c
plug-ins/gap/gap_dbbrowser_utils.c
plug-ins/gap/gap_filter_foreach.c
@ -43,8 +58,6 @@ plug-ins/gap/gap_range_ops.c
plug-ins/gap/gap_resi_dialog.c
plug-ins/gap/gap_split.c
plug-ins/gap/resize.c
plug-ins/common/gif.c
plug-ins/common/gifload.c
plug-ins/gimpressionist/brush.c
plug-ins/gimpressionist/color.c
plug-ins/gimpressionist/general.c
@ -60,31 +73,54 @@ plug-ins/gimpressionist/preview.c
plug-ins/gimpressionist/repaint.c
plug-ins/gimpressionist/size.c
plug-ins/gimpressionist/sizemap.c
plug-ins/common/guillotine.c
plug-ins/common/jpeg.c
plug-ins/common/lic.c
plug-ins/common/mail.c
plug-ins/imagemap/imap_about.c
plug-ins/imagemap/imap_circle.c
plug-ins/imagemap/imap_cmd_clear.c
plug-ins/imagemap/imap_cmd_copy.c
plug-ins/imagemap/imap_cmd_copy_object.c
plug-ins/imagemap/imap_cmd_create.c
plug-ins/imagemap/imap_cmd_cut.c
plug-ins/imagemap/imap_cmd_cut_object.c
plug-ins/imagemap/imap_cmd_delete.c
plug-ins/imagemap/imap_cmd_delete_point.c
plug-ins/imagemap/imap_cmd_edit_object.c
plug-ins/imagemap/imap_cmd_guides.c
plug-ins/imagemap/imap_cmd_insert_point.c
plug-ins/imagemap/imap_cmd_move.c
plug-ins/imagemap/imap_cmd_move_down.c
plug-ins/imagemap/imap_cmd_move_sash.c
plug-ins/imagemap/imap_cmd_move_up.c
plug-ins/imagemap/imap_cmd_object_down.c
plug-ins/imagemap/imap_cmd_object_up.c
plug-ins/imagemap/imap_cmd_paste.c
plug-ins/imagemap/imap_cmd_select.c
plug-ins/imagemap/imap_cmd_select_all.c
plug-ins/imagemap/imap_cmd_select_region.c
plug-ins/imagemap/imap_cmd_send_to_back.c
plug-ins/imagemap/imap_cmd_unselect.c
plug-ins/imagemap/imap_cmd_unselect_all.c
plug-ins/imagemap/imap_edit_area_info.c
plug-ins/imagemap/imap_file.c
plug-ins/imagemap/imap_grid.c
plug-ins/imagemap/imap_main.c
plug-ins/imagemap/imap_polygon.c
plug-ins/imagemap/imap_rectangle.c
plug-ins/imagemap/imap_selection.c
plug-ins/imagemap/imap_settings.c
plug-ins/imagemap/imap_source.c
plug-ins/imagemap/imap_toolbar.c
plug-ins/imagemap/imap_tools.c
plug-ins/imagemap/imap_cmd_move_selected.c
plug-ins/imagemap/imap_cmd_object_move.c
plug-ins/imagemap/imap_cmd_select_next.c
plug-ins/mosaic/mosaic.c
plug-ins/common/normalize.c
plug-ins/common/oilify.c
plug-ins/common/png.c
plug-ins/print/print-escp2.c
plug-ins/print/print-pcl.c
plug-ins/print/print-ps.c
plug-ins/print/print.c
plug-ins/common/ps.c
plug-ins/common/rotate.c
plug-ins/common/rotators.c
plug-ins/sel2path/sel2path.c
plug-ins/struc/struc.c
plug-ins/common/threshold_alpha.c
plug-ins/common/warp.c
plug-ins/common/xbm.c
plug-ins/common/xpm.c
plug-ins/common/xwd.c
plug-ins/common/zealouscrop.c
plug-ins/script-fu/script-fu-console.c
plug-ins/script-fu/script-fu-scripts.c
plug-ins/script-fu/script-fu-server.c
plug-ins/script-fu/script-fu.c
plug-ins/common/film.c
plug-ins/sel2path/sel2path.c
plug-ins/struc/struc.c