diff options
Diffstat (limited to 'plug-ins/imagemap/imap_cmd_gimp_guides.c')
-rw-r--r-- | plug-ins/imagemap/imap_cmd_gimp_guides.c | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/plug-ins/imagemap/imap_cmd_gimp_guides.c b/plug-ins/imagemap/imap_cmd_gimp_guides.c new file mode 100644 index 0000000..3f8fdd2 --- /dev/null +++ b/plug-ins/imagemap/imap_cmd_gimp_guides.c @@ -0,0 +1,260 @@ +/* + * This is a plug-in for GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-2004 Maurits Rijk m.rijk@chello.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 3 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, see <https://www.gnu.org/licenses/>. + * + */ + +#include "config.h" + +#include <stdio.h> + +#include <gtk/gtk.h> + +#include "libgimp/gimp.h" +#include "libgimpwidgets/gimpwidgets.h" + +#include "imap_commands.h" +#include "imap_default_dialog.h" +#include "imap_main.h" +#include "imap_rectangle.h" +#include "imap_table.h" + +#include "libgimp/stdplugins-intl.h" + +typedef struct { + DefaultDialog_t *dialog; + + ObjectList_t *list; + gint32 drawable_id; + + GtkWidget *alternate; + GtkWidget *all; + GtkWidget *left_border; + GtkWidget *right_border; + GtkWidget *upper_border; + GtkWidget *lower_border; + GtkWidget *url; +} GimpGuidesDialog_t; + +static gint +guide_sort_func(gconstpointer a, gconstpointer b) +{ + return GPOINTER_TO_INT(a) - GPOINTER_TO_INT(b); +} + +static void +gimp_guides_ok_cb(gpointer data) +{ + GimpGuidesDialog_t *param = (GimpGuidesDialog_t*) data; + gint guide_num; + GSList *hguides, *hg; + GSList *vguides, *vg; + gboolean all; + const gchar *url; + gint32 image_ID = gimp_item_get_image (param->drawable_id); + + /* First get some dialog values */ + + all = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->all)); + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->left_border))) + vguides = g_slist_append(NULL, GINT_TO_POINTER(0)); + else + vguides = NULL; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->right_border))) + vguides = g_slist_append(vguides, + GINT_TO_POINTER(gimp_image_width(image_ID))); + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->upper_border))) + hguides = g_slist_append(NULL, GINT_TO_POINTER(0)); + else + hguides = NULL; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->lower_border))) + hguides = g_slist_append(hguides, + GINT_TO_POINTER(gimp_image_height(image_ID))); + + url = gtk_entry_get_text(GTK_ENTRY(param->url)); + + /* Next get all the GIMP guides */ + + guide_num = gimp_image_find_next_guide(image_ID, 0); + + while (guide_num > 0) { + gint position = gimp_image_get_guide_position(image_ID, guide_num); + + if (gimp_image_get_guide_orientation(image_ID, guide_num) + == GIMP_ORIENTATION_HORIZONTAL) { + hguides = g_slist_insert_sorted(hguides, GINT_TO_POINTER(position), + guide_sort_func); + } else { /* GIMP_ORIENTATION_VERTICAL */ + vguides = g_slist_insert_sorted(vguides, GINT_TO_POINTER(position), + guide_sort_func); + } + guide_num = gimp_image_find_next_guide(image_ID, guide_num); + } + + /* Create the areas */ + + subcommand_start(_("Use Gimp Guides")); + + for (hg = hguides; hg && hg->next; + hg = (all) ? hg->next : hg->next->next) { + gint y = GPOINTER_TO_INT(hg->data); + gint height = GPOINTER_TO_INT(hg->next->data) - y; + for (vg = vguides; vg && vg->next; + vg = (all) ? vg->next : vg->next->next) { + gint x = GPOINTER_TO_INT(vg->data); + gint width = GPOINTER_TO_INT(vg->next->data) - x; + Object_t *obj = create_rectangle(x, y, width, height); + Command_t *command = create_command_new(param->list, obj); + + object_set_url(obj, url); + command_execute(command); + } + } + + subcommand_end(); + preview_redraw(); +} + +static GimpGuidesDialog_t* +make_gimp_guides_dialog(void) +{ + GimpGuidesDialog_t *data = g_new(GimpGuidesDialog_t, 1); + DefaultDialog_t *dialog; + GtkWidget *table, *frame, *hbox, *vbox; + GtkWidget *label; + + dialog = data->dialog = make_default_dialog(_("Use Gimp Guides")); + default_dialog_set_ok_cb(dialog, gimp_guides_ok_cb, data); + table = default_dialog_add_table(dialog, 3, 2); + + frame = gimp_frame_new(_("Create")); + gtk_widget_show(frame); + gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 1, 0, 1); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_container_add(GTK_CONTAINER(frame), hbox); + gtk_widget_show(hbox); + + data->alternate = + gtk_radio_button_new_with_mnemonic_from_widget(NULL, _("Al_ternate")); + gtk_box_pack_start(GTK_BOX(hbox), data->alternate, FALSE, FALSE, 0); + gtk_widget_show(data->alternate); + + data->all = gtk_radio_button_new_with_mnemonic_from_widget( + GTK_RADIO_BUTTON(data->alternate), _("A_ll")); + gtk_box_pack_start(GTK_BOX(hbox), data->all, FALSE, FALSE, 0); + gtk_widget_show(data->all); + + frame = gimp_frame_new(_("Add Additional Guides")); + gtk_widget_show(frame); + gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 1, 1, 2); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); + gtk_container_add(GTK_CONTAINER(frame), vbox); + gtk_widget_show(vbox); + + data->left_border = gtk_check_button_new_with_mnemonic(_("L_eft border")); + gtk_container_add(GTK_CONTAINER(vbox), data->left_border); + gtk_widget_show(data->left_border); + + data->right_border = gtk_check_button_new_with_mnemonic(_("_Right border")); + gtk_container_add(GTK_CONTAINER(vbox), data->right_border); + gtk_widget_show(data->right_border); + + data->upper_border = gtk_check_button_new_with_mnemonic(_("_Upper border")); + gtk_container_add(GTK_CONTAINER(vbox), data->upper_border); + gtk_widget_show(data->upper_border); + + data->lower_border = gtk_check_button_new_with_mnemonic(_("Lo_wer border")); + gtk_container_add(GTK_CONTAINER(vbox), data->lower_border); + gtk_widget_show(data->lower_border); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_table_attach_defaults(GTK_TABLE(table), hbox, 0, 2, 2, 3); + gtk_widget_show(hbox); + + label = gtk_label_new_with_mnemonic(_("_Base URL:")); + gtk_widget_show(label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + + data->url = gtk_entry_new(); + gtk_container_add(GTK_CONTAINER(hbox), data->url); + gtk_widget_show(data->url); + + gtk_label_set_mnemonic_widget (GTK_LABEL (label), data->url); + + return data; +} + +static void +init_gimp_guides_dialog(GimpGuidesDialog_t *dialog, ObjectList_t *list, + gint32 drawable_id) +{ + dialog->list = list; + dialog->drawable_id = drawable_id; +} + +static void +do_create_gimp_guides_dialog(ObjectList_t *list, gint32 drawable_id) +{ + static GimpGuidesDialog_t *dialog; + + if (!dialog) + dialog = make_gimp_guides_dialog(); + + init_gimp_guides_dialog(dialog, list, drawable_id); + default_dialog_show(dialog->dialog); +} + +static CmdExecuteValue_t gimp_guides_command_execute(Command_t *parent); + +static CommandClass_t gimp_guides_command_class = { + NULL, /* guides_command_destruct */ + gimp_guides_command_execute, + NULL, /* guides_command_undo */ + NULL /* guides_command_redo */ +}; + +typedef struct { + Command_t parent; + ObjectList_t *list; + gint32 drawable_id; +} GimpGuidesCommand_t; + +Command_t* +gimp_guides_command_new(ObjectList_t *list, gint32 drawable_id) +{ + GimpGuidesCommand_t *command = g_new(GimpGuidesCommand_t, 1); + command->list = list; + command->drawable_id = drawable_id; + return command_init(&command->parent, _("Use Gimp Guides"), + &gimp_guides_command_class); +} + +static CmdExecuteValue_t +gimp_guides_command_execute(Command_t *parent) +{ + GimpGuidesCommand_t *command = (GimpGuidesCommand_t*) parent; + do_create_gimp_guides_dialog(command->list, command->drawable_id); + return CMD_DESTRUCT; +} |