summaryrefslogtreecommitdiffstats
path: root/plug-ins/imagemap/imap_cmd_gimp_guides.c
diff options
context:
space:
mode:
Diffstat (limited to 'plug-ins/imagemap/imap_cmd_gimp_guides.c')
-rw-r--r--plug-ins/imagemap/imap_cmd_gimp_guides.c260
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;
+}