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

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