summaryrefslogtreecommitdiffstats
path: root/app/dialogs/item-options-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--app/dialogs/item-options-dialog.c491
1 files changed, 491 insertions, 0 deletions
diff --git a/app/dialogs/item-options-dialog.c b/app/dialogs/item-options-dialog.c
new file mode 100644
index 0000000..84493d9
--- /dev/null
+++ b/app/dialogs/item-options-dialog.c
@@ -0,0 +1,491 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 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 <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpbase/gimpbase.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "dialogs-types.h"
+
+#include "config/gimpcoreconfig.h"
+
+#include "core/gimp.h"
+#include "core/gimpcontext.h"
+#include "core/gimpimage.h"
+#include "core/gimpitem.h"
+
+#include "widgets/gimpviewabledialog.h"
+#include "widgets/gimpwidgets-utils.h"
+
+#include "item-options-dialog.h"
+
+#include "gimp-intl.h"
+
+
+typedef struct _ItemOptionsDialog ItemOptionsDialog;
+
+struct _ItemOptionsDialog
+{
+ GimpImage *image;
+ GimpItem *item;
+ GimpContext *context;
+ gboolean visible;
+ gboolean linked;
+ GimpColorTag color_tag;
+ gboolean lock_content;
+ gboolean lock_position;
+ GimpItemOptionsCallback callback;
+ gpointer user_data;
+
+ GtkWidget *left_vbox;
+ GtkWidget *left_table;
+ gint table_row;
+ GtkWidget *name_entry;
+ GtkWidget *right_frame;
+ GtkWidget *right_vbox;
+ GtkWidget *lock_position_toggle;
+};
+
+
+/* local function prototypes */
+
+static void item_options_dialog_free (ItemOptionsDialog *private);
+static void item_options_dialog_response (GtkWidget *dialog,
+ gint response_id,
+ ItemOptionsDialog *private);
+static GtkWidget * check_button_with_icon_new (const gchar *label,
+ const gchar *icon_name,
+ GtkBox *vbox);
+
+
+/* public functions */
+
+GtkWidget *
+item_options_dialog_new (GimpImage *image,
+ GimpItem *item,
+ GimpContext *context,
+ GtkWidget *parent,
+ const gchar *title,
+ const gchar *role,
+ const gchar *icon_name,
+ const gchar *desc,
+ const gchar *help_id,
+ const gchar *name_label,
+ const gchar *lock_content_icon_name,
+ const gchar *lock_content_label,
+ const gchar *lock_position_label,
+ const gchar *item_name,
+ gboolean item_visible,
+ gboolean item_linked,
+ GimpColorTag item_color_tag,
+ gboolean item_lock_content,
+ gboolean item_lock_position,
+ GimpItemOptionsCallback callback,
+ gpointer user_data)
+{
+ ItemOptionsDialog *private;
+ GtkWidget *dialog;
+ GimpViewable *viewable;
+ GtkWidget *main_hbox;
+ GtkWidget *table;
+ GtkWidget *button;
+
+ g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
+ g_return_val_if_fail (item == NULL || GIMP_IS_ITEM (item), NULL);
+ g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
+ g_return_val_if_fail (GTK_IS_WIDGET (parent), NULL);
+ g_return_val_if_fail (title != NULL, NULL);
+ g_return_val_if_fail (role != NULL, NULL);
+ g_return_val_if_fail (icon_name != NULL, NULL);
+ g_return_val_if_fail (desc != NULL, NULL);
+ g_return_val_if_fail (help_id != NULL, NULL);
+ g_return_val_if_fail (callback != NULL, NULL);
+
+ private = g_slice_new0 (ItemOptionsDialog);
+
+ private->image = image;
+ private->item = item;
+ private->context = context;
+ private->visible = item_visible;
+ private->linked = item_linked;
+ private->color_tag = item_color_tag;
+ private->lock_content = item_lock_content;
+ private->lock_position = item_lock_position;
+ private->callback = callback;
+ private->user_data = user_data;
+
+ if (item)
+ viewable = GIMP_VIEWABLE (item);
+ else
+ viewable = GIMP_VIEWABLE (image);
+
+ dialog = gimp_viewable_dialog_new (viewable, context,
+ title, role, icon_name, desc,
+ parent,
+ gimp_standard_help_func, help_id,
+
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_OK"), GTK_RESPONSE_OK,
+
+ NULL);
+
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+ GTK_RESPONSE_OK,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (item_options_dialog_response),
+ private);
+
+ g_object_weak_ref (G_OBJECT (dialog),
+ (GWeakNotify) item_options_dialog_free, private);
+
+ g_object_set_data (G_OBJECT (dialog), "item-options-dialog-private", private);
+
+ main_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12);
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+ main_hbox, TRUE, TRUE, 0);
+ gtk_widget_show (main_hbox);
+
+ private->left_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_box_pack_start (GTK_BOX (main_hbox), private->left_vbox, TRUE, TRUE, 0);
+ gtk_widget_show (private->left_vbox);
+
+ private->left_table = table = gtk_table_new (1, 2, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (private->left_vbox), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ /* The name label and entry */
+ if (name_label)
+ {
+ GtkWidget *hbox;
+ GtkWidget *radio;
+ GtkWidget *radio_box;
+ GList *children;
+ GList *list;
+
+ private->name_entry = gtk_entry_new ();
+ gtk_entry_set_activates_default (GTK_ENTRY (private->name_entry), TRUE);
+ gtk_entry_set_text (GTK_ENTRY (private->name_entry), item_name);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, private->table_row++,
+ name_label, 0.0, 0.5,
+ private->name_entry, 1, FALSE);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, private->table_row++,
+ _("Color tag:"), 0.0, 0.5,
+ hbox, 1, TRUE);
+
+ radio_box = gimp_enum_radio_box_new (GIMP_TYPE_COLOR_TAG,
+ G_CALLBACK (gimp_radio_button_update),
+ &private->color_tag,
+ &radio);
+ gimp_int_radio_group_set_active (GTK_RADIO_BUTTON (radio),
+ private->color_tag);
+
+ children = gtk_container_get_children (GTK_CONTAINER (radio_box));
+
+ for (list = children;
+ list;
+ list = g_list_next (list))
+ {
+ GimpColorTag color_tag;
+ GimpRGB color;
+ GtkWidget *image;
+
+ radio = list->data;
+
+ g_object_ref (radio);
+ gtk_container_remove (GTK_CONTAINER (radio_box), radio);
+ g_object_set (radio, "draw-indicator", FALSE, NULL);
+ gtk_box_pack_start (GTK_BOX (hbox), radio, FALSE, FALSE, 0);
+ g_object_unref (radio);
+
+ gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (radio)));
+
+ color_tag = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (radio),
+ "gimp-item-data"));
+
+ if (gimp_get_color_tag_color (color_tag, &color, FALSE))
+ {
+ GtkSettings *settings = gtk_widget_get_settings (dialog);
+ gint w, h;
+
+ image = gimp_color_area_new (&color, GIMP_COLOR_AREA_FLAT, 0);
+ gimp_color_area_set_color_config (GIMP_COLOR_AREA (image),
+ context->gimp->config->color_management);
+ gtk_icon_size_lookup_for_settings (settings,
+ GTK_ICON_SIZE_MENU, &w, &h);
+ gtk_widget_set_size_request (image, w, h);
+ }
+ else
+ {
+ image = gtk_image_new_from_icon_name (GIMP_ICON_CLOSE,
+ GTK_ICON_SIZE_MENU);
+ }
+
+ gtk_container_add (GTK_CONTAINER (radio), image);
+ gtk_widget_show (image);
+ }
+
+ g_list_free (children);
+ gtk_widget_destroy (radio_box);
+ }
+
+ /* The switches frame & vbox */
+
+ private->right_frame = gimp_frame_new (_("Switches"));
+ gtk_box_pack_start (GTK_BOX (main_hbox), private->right_frame,
+ FALSE, FALSE, 0);
+ gtk_widget_show (private->right_frame);
+
+ private->right_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_container_add (GTK_CONTAINER (private->right_frame), private->right_vbox);
+ gtk_widget_show (private->right_vbox);
+
+ button = check_button_with_icon_new (_("_Visible"),
+ GIMP_ICON_VISIBLE,
+ GTK_BOX (private->right_vbox));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+ private->visible);
+ g_signal_connect (button, "toggled",
+ G_CALLBACK (gimp_toggle_button_update),
+ &private->visible);
+
+ button = check_button_with_icon_new (_("_Linked"),
+ GIMP_ICON_LINKED,
+ GTK_BOX (private->right_vbox));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+ private->linked);
+ g_signal_connect (button, "toggled",
+ G_CALLBACK (gimp_toggle_button_update),
+ &private->linked);
+
+ button = check_button_with_icon_new (lock_content_label,
+ lock_content_icon_name,
+ GTK_BOX (private->right_vbox));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+ private->lock_content);
+ g_signal_connect (button, "toggled",
+ G_CALLBACK (gimp_toggle_button_update),
+ &private->lock_content);
+
+ button = check_button_with_icon_new (lock_position_label,
+ GIMP_ICON_TOOL_MOVE,
+ GTK_BOX (private->right_vbox));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+ private->lock_position);
+ g_signal_connect (button, "toggled",
+ G_CALLBACK (gimp_toggle_button_update),
+ &private->lock_position);
+
+ private->lock_position_toggle = button;
+
+ return dialog;
+}
+
+GtkWidget *
+item_options_dialog_get_vbox (GtkWidget *dialog)
+{
+ ItemOptionsDialog *private;
+
+ g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+
+ private = g_object_get_data (G_OBJECT (dialog),
+ "item-options-dialog-private");
+
+ g_return_val_if_fail (private != NULL, NULL);
+
+ return private->left_vbox;
+}
+
+GtkWidget *
+item_options_dialog_get_table (GtkWidget *dialog,
+ gint *next_row)
+{
+ ItemOptionsDialog *private;
+
+ g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+ g_return_val_if_fail (next_row != NULL, NULL);
+
+ private = g_object_get_data (G_OBJECT (dialog),
+ "item-options-dialog-private");
+
+ g_return_val_if_fail (private != NULL, NULL);
+
+ *next_row = private->table_row;
+
+ return private->left_table;
+}
+
+GtkWidget *
+item_options_dialog_get_name_entry (GtkWidget *dialog)
+{
+ ItemOptionsDialog *private;
+
+ g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+
+ private = g_object_get_data (G_OBJECT (dialog),
+ "item-options-dialog-private");
+
+ g_return_val_if_fail (private != NULL, NULL);
+
+ return private->name_entry;
+}
+
+GtkWidget *
+item_options_dialog_get_lock_position (GtkWidget *dialog)
+{
+ ItemOptionsDialog *private;
+
+ g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+
+ private = g_object_get_data (G_OBJECT (dialog),
+ "item-options-dialog-private");
+
+ g_return_val_if_fail (private != NULL, NULL);
+
+ return private->lock_position_toggle;
+}
+
+void
+item_options_dialog_add_widget (GtkWidget *dialog,
+ const gchar *label,
+ GtkWidget *widget)
+{
+ ItemOptionsDialog *private;
+
+ g_return_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+
+ private = g_object_get_data (G_OBJECT (dialog),
+ "item-options-dialog-private");
+
+ g_return_if_fail (private != NULL);
+
+ gimp_table_attach_aligned (GTK_TABLE (private->left_table),
+ 0, private->table_row++,
+ label, 0.0, 0.5,
+ widget, 1, FALSE);
+}
+
+GtkWidget *
+item_options_dialog_add_switch (GtkWidget *dialog,
+ const gchar *icon_name,
+ const gchar *label)
+{
+ ItemOptionsDialog *private;
+
+ g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+ g_return_val_if_fail (icon_name != NULL, NULL);
+ g_return_val_if_fail (label != NULL, NULL);
+
+ private = g_object_get_data (G_OBJECT (dialog),
+ "item-options-dialog-private");
+
+ g_return_val_if_fail (private != NULL, NULL);
+
+ return check_button_with_icon_new (label, icon_name,
+ GTK_BOX (private->right_vbox));
+}
+
+void
+item_options_dialog_set_switches_visible (GtkWidget *dialog,
+ gboolean visible)
+{
+ ItemOptionsDialog *private;
+
+ g_return_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog));
+
+ private = g_object_get_data (G_OBJECT (dialog),
+ "item-options-dialog-private");
+
+ g_return_if_fail (private != NULL);
+
+ gtk_widget_set_visible (private->right_frame, visible);
+}
+
+
+/* private functions */
+
+static void
+item_options_dialog_free (ItemOptionsDialog *private)
+{
+ g_slice_free (ItemOptionsDialog, private);
+}
+
+static void
+item_options_dialog_response (GtkWidget *dialog,
+ gint response_id,
+ ItemOptionsDialog *private)
+{
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ const gchar *name = NULL;
+
+ if (private->name_entry)
+ name = gtk_entry_get_text (GTK_ENTRY (private->name_entry));
+
+ private->callback (dialog,
+ private->image,
+ private->item,
+ private->context,
+ name,
+ private->visible,
+ private->linked,
+ private->color_tag,
+ private->lock_content,
+ private->lock_position,
+ private->user_data);
+ }
+ else
+ {
+ gtk_widget_destroy (dialog);
+ }
+}
+
+static GtkWidget *
+check_button_with_icon_new (const gchar *label,
+ const gchar *icon_name,
+ GtkBox *vbox)
+{
+ GtkWidget *hbox;
+ GtkWidget *button;
+ GtkWidget *image;
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start (vbox, hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
+ gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+ gtk_widget_show (image);
+
+ button = gtk_check_button_new_with_mnemonic (label);
+ gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show (button);
+
+ return button;
+}