diff options
Diffstat (limited to 'libgimpwidgets/gimpcolornotebook.c')
-rw-r--r-- | libgimpwidgets/gimpcolornotebook.c | 547 |
1 files changed, 547 insertions, 0 deletions
diff --git a/libgimpwidgets/gimpcolornotebook.c b/libgimpwidgets/gimpcolornotebook.c new file mode 100644 index 0000000..ec405ce --- /dev/null +++ b/libgimpwidgets/gimpcolornotebook.c @@ -0,0 +1,547 @@ +/* LIBGIMP - The GIMP Library + * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball + * + * gimpcolornotebook.c + * Copyright (C) 2002 Michael Natterer <mitch@gimp.org> + * + * based on color_notebook module + * Copyright (C) 1998 Austin Donnelly <austin@greenend.org.uk> + * + * This library is free software: you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <gegl.h> +#include <gtk/gtk.h> + +#include "libgimpcolor/gimpcolor.h" + +#include "gimpwidgetstypes.h" + +#include "gimpcolornotebook.h" +#include "gimpcolorscales.h" +#include "gimphelpui.h" +#include "gimpwidgetsmarshal.h" +#include "gimp3migration.h" + +#include "libgimp/libgimp-intl.h" + + +/** + * SECTION: gimpcolornotebook + * @title: GimpColorNotebook + * @short_description: A #GimpColorSelector implementation. + * + * The #GimpColorNotebook widget is an implementation of a + * #GimpColorSelector. It serves as a container for + * #GimpColorSelectors. + **/ + + +#define DEFAULT_TAB_BORDER 0 +#define DEFAULT_TAB_ICON_SIZE GTK_ICON_SIZE_BUTTON + + +static void gimp_color_notebook_style_set (GtkWidget *widget, + GtkStyle *prev_style); + +static void gimp_color_notebook_togg_visible (GimpColorSelector *selector, + gboolean visible); +static void gimp_color_notebook_togg_sensitive (GimpColorSelector *selector, + gboolean sensitive); +static void gimp_color_notebook_set_show_alpha (GimpColorSelector *selector, + gboolean show_alpha); +static void gimp_color_notebook_set_color (GimpColorSelector *selector, + const GimpRGB *rgb, + const GimpHSV *hsv); +static void gimp_color_notebook_set_channel (GimpColorSelector *selector, + GimpColorSelectorChannel channel); +static void gimp_color_notebook_set_model_visible + (GimpColorSelector *selector, + GimpColorSelectorModel model, + gboolean gboolean); +static void gimp_color_notebook_set_config (GimpColorSelector *selector, + GimpColorConfig *config); + + +static void gimp_color_notebook_switch_page (GtkNotebook *gtk_notebook, + gpointer page, + guint page_num, + GimpColorNotebook *notebook); + +static void gimp_color_notebook_color_changed (GimpColorSelector *page, + const GimpRGB *rgb, + const GimpHSV *hsv, + GimpColorNotebook *notebook); +static void gimp_color_notebook_channel_changed (GimpColorSelector *page, + GimpColorSelectorChannel channel, + GimpColorNotebook *notebook); +static void gimp_color_notebook_model_visible_changed + (GimpColorSelector *page, + GimpColorSelectorModel model, + gboolean visible, + GimpColorNotebook *notebook); + +static GtkWidget * gimp_color_notebook_add_page (GimpColorNotebook *notebook, + GType page_type); +static void gimp_color_notebook_remove_selector (GtkContainer *container, + GtkWidget *widget, + GimpColorNotebook *notebook); + + +G_DEFINE_TYPE (GimpColorNotebook, gimp_color_notebook, + GIMP_TYPE_COLOR_SELECTOR) + +#define parent_class gimp_color_notebook_parent_class + + +static void +gimp_color_notebook_class_init (GimpColorNotebookClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GimpColorSelectorClass *selector_class = GIMP_COLOR_SELECTOR_CLASS (klass); + + widget_class->style_set = gimp_color_notebook_style_set; + + selector_class->name = "Notebook"; + selector_class->help_id = "gimp-colorselector-notebook"; + selector_class->set_toggles_visible = gimp_color_notebook_togg_visible; + selector_class->set_toggles_sensitive = gimp_color_notebook_togg_sensitive; + selector_class->set_show_alpha = gimp_color_notebook_set_show_alpha; + selector_class->set_color = gimp_color_notebook_set_color; + selector_class->set_channel = gimp_color_notebook_set_channel; + selector_class->set_model_visible = gimp_color_notebook_set_model_visible; + selector_class->set_config = gimp_color_notebook_set_config; + + gtk_widget_class_install_style_property (widget_class, + g_param_spec_int ("tab-border", + NULL, + "Width of the border around the tab contents", + 0, G_MAXINT, + DEFAULT_TAB_BORDER, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property (widget_class, + g_param_spec_enum ("tab-icon-size", + NULL, + "Size for icons displayed in the tab", + GTK_TYPE_ICON_SIZE, + DEFAULT_TAB_ICON_SIZE, + G_PARAM_READABLE)); +} + +static void +gimp_color_notebook_init (GimpColorNotebook *notebook) +{ + GType *selector_types; + guint n_selector_types; + guint i; + + notebook->notebook = gtk_notebook_new (); + gtk_notebook_popup_enable (GTK_NOTEBOOK (notebook->notebook)); + gtk_box_pack_start (GTK_BOX (notebook), notebook->notebook, TRUE, TRUE, 0); + gtk_widget_show (notebook->notebook); + + g_signal_connect (notebook->notebook, "switch-page", + G_CALLBACK (gimp_color_notebook_switch_page), + notebook); + g_signal_connect (notebook->notebook, "remove", + G_CALLBACK (gimp_color_notebook_remove_selector), + notebook); + + selector_types = g_type_children (GIMP_TYPE_COLOR_SELECTOR, + &n_selector_types); + + if (n_selector_types == 2) + { + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook->notebook), FALSE); + gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook->notebook), FALSE); + } + + for (i = 0; i < n_selector_types; i++) + { + /* skip ourselves */ + if (g_type_is_a (selector_types[i], GIMP_TYPE_COLOR_NOTEBOOK)) + continue; + + /* skip the "Scales" color selector */ + if (g_type_is_a (selector_types[i], GIMP_TYPE_COLOR_SCALES)) + continue; + + gimp_color_notebook_add_page (notebook, selector_types[i]); + } + + g_free (selector_types); +} + +static void +gimp_color_notebook_style_set (GtkWidget *widget, + GtkStyle *prev_style) +{ + GimpColorNotebook *notebook = GIMP_COLOR_NOTEBOOK (widget); + GList *list; + gint tab_border; + GtkIconSize icon_size; + + if (GTK_WIDGET_CLASS (parent_class)->style_set) + GTK_WIDGET_CLASS (parent_class)->style_set (widget, prev_style); + + gtk_widget_style_get (widget, + "tab-border", &tab_border, + "tab-icon_size", &icon_size, + NULL); + + g_object_set (notebook->notebook, + "tab-border", tab_border, + NULL); + + for (list = notebook->selectors; list; list = g_list_next (list)) + { + GimpColorSelectorClass *selector_class; + GtkWidget *image; + + selector_class = GIMP_COLOR_SELECTOR_GET_CLASS (list->data); + + image = gtk_image_new_from_icon_name (selector_class->icon_name, + icon_size); + gimp_help_set_help_data (image, gettext (selector_class->name), NULL); + + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook->notebook), + GTK_WIDGET (list->data), + image); + } +} + +static void +gimp_color_notebook_togg_visible (GimpColorSelector *selector, + gboolean visible) +{ + GimpColorNotebook *notebook = GIMP_COLOR_NOTEBOOK (selector); + GList *list; + + for (list = notebook->selectors; list; list = g_list_next (list)) + { + GimpColorSelector *child = list->data; + + gimp_color_selector_set_toggles_visible (child, visible); + } +} + +static void +gimp_color_notebook_togg_sensitive (GimpColorSelector *selector, + gboolean sensitive) +{ + GimpColorNotebook *notebook = GIMP_COLOR_NOTEBOOK (selector); + GList *list; + + for (list = notebook->selectors; list; list = g_list_next (list)) + { + GimpColorSelector *child = list->data; + + gimp_color_selector_set_toggles_sensitive (child, sensitive); + } +} + +static void +gimp_color_notebook_set_show_alpha (GimpColorSelector *selector, + gboolean show_alpha) +{ + GimpColorNotebook *notebook = GIMP_COLOR_NOTEBOOK (selector); + GList *list; + + for (list = notebook->selectors; list; list = g_list_next (list)) + { + GimpColorSelector *child = list->data; + + gimp_color_selector_set_show_alpha (child, show_alpha); + } +} + +static void +gimp_color_notebook_set_color (GimpColorSelector *selector, + const GimpRGB *rgb, + const GimpHSV *hsv) +{ + GimpColorNotebook *notebook = GIMP_COLOR_NOTEBOOK (selector); + + g_signal_handlers_block_by_func (notebook->cur_page, + gimp_color_notebook_color_changed, + notebook); + + gimp_color_selector_set_color (notebook->cur_page, rgb, hsv); + + g_signal_handlers_unblock_by_func (notebook->cur_page, + gimp_color_notebook_color_changed, + notebook); +} + +static void +gimp_color_notebook_set_channel (GimpColorSelector *selector, + GimpColorSelectorChannel channel) +{ + GimpColorNotebook *notebook = GIMP_COLOR_NOTEBOOK (selector); + + g_signal_handlers_block_by_func (notebook->cur_page, + gimp_color_notebook_channel_changed, + notebook); + + gimp_color_selector_set_channel (notebook->cur_page, channel); + + g_signal_handlers_unblock_by_func (notebook->cur_page, + gimp_color_notebook_channel_changed, + notebook); +} + +static void +gimp_color_notebook_set_model_visible (GimpColorSelector *selector, + GimpColorSelectorModel model, + gboolean visible) +{ + GimpColorNotebook *notebook = GIMP_COLOR_NOTEBOOK (selector); + + g_signal_handlers_block_by_func (notebook->cur_page, + gimp_color_notebook_model_visible_changed, + notebook); + + gimp_color_selector_set_model_visible (notebook->cur_page, model, visible); + + g_signal_handlers_unblock_by_func (notebook->cur_page, + gimp_color_notebook_model_visible_changed, + notebook); +} + +static void +gimp_color_notebook_set_config (GimpColorSelector *selector, + GimpColorConfig *config) +{ + GimpColorNotebook *notebook = GIMP_COLOR_NOTEBOOK (selector); + GList *list; + + for (list = notebook->selectors; list; list = g_list_next (list)) + { + GimpColorSelector *child = list->data; + + gimp_color_selector_set_config (child, config); + } +} + +static void +gimp_color_notebook_switch_page (GtkNotebook *gtk_notebook, + gpointer page, + guint page_num, + GimpColorNotebook *notebook) +{ + GimpColorSelector *selector = GIMP_COLOR_SELECTOR (notebook); + GtkWidget *page_widget; + GimpColorSelectorModel model; + + page_widget = gtk_notebook_get_nth_page (gtk_notebook, page_num); + + notebook->cur_page = GIMP_COLOR_SELECTOR (page_widget); + + g_signal_handlers_block_by_func (notebook->cur_page, + gimp_color_notebook_color_changed, + notebook); + g_signal_handlers_block_by_func (notebook->cur_page, + gimp_color_notebook_channel_changed, + notebook); + g_signal_handlers_block_by_func (notebook->cur_page, + gimp_color_notebook_model_visible_changed, + notebook); + + gimp_color_selector_set_color (notebook->cur_page, + &selector->rgb, + &selector->hsv); + gimp_color_selector_set_channel (notebook->cur_page, + gimp_color_selector_get_channel (selector)); + + for (model = GIMP_COLOR_SELECTOR_MODEL_RGB; + model <= GIMP_COLOR_SELECTOR_MODEL_HSV; + model++) + { + gboolean visible = gimp_color_selector_get_model_visible (selector, model); + + gimp_color_selector_set_model_visible (notebook->cur_page, model, + visible); + } + + g_signal_handlers_unblock_by_func (notebook->cur_page, + gimp_color_notebook_color_changed, + notebook); + g_signal_handlers_unblock_by_func (notebook->cur_page, + gimp_color_notebook_channel_changed, + notebook); + g_signal_handlers_unblock_by_func (notebook->cur_page, + gimp_color_notebook_model_visible_changed, + notebook); +} + +static void +gimp_color_notebook_color_changed (GimpColorSelector *page, + const GimpRGB *rgb, + const GimpHSV *hsv, + GimpColorNotebook *notebook) +{ + GimpColorSelector *selector = GIMP_COLOR_SELECTOR (notebook); + + selector->rgb = *rgb; + selector->hsv = *hsv; + + gimp_color_selector_color_changed (selector); +} + +static void +gimp_color_notebook_channel_changed (GimpColorSelector *page, + GimpColorSelectorChannel channel, + GimpColorNotebook *notebook) +{ + GimpColorSelector *selector = GIMP_COLOR_SELECTOR (notebook); + + gimp_color_selector_set_channel (selector, channel); +} + +static void +gimp_color_notebook_model_visible_changed (GimpColorSelector *page, + GimpColorSelectorModel model, + gboolean visible, + GimpColorNotebook *notebook) +{ + GimpColorSelector *selector = GIMP_COLOR_SELECTOR (notebook); + + gimp_color_selector_set_model_visible (selector, model, visible); +} + +static GtkWidget * +gimp_color_notebook_add_page (GimpColorNotebook *notebook, + GType page_type) +{ + GimpColorSelector *selector = GIMP_COLOR_SELECTOR (notebook); + GimpColorSelectorClass *selector_class; + GtkWidget *page; + GtkWidget *menu_widget; + GtkWidget *image; + GtkWidget *label; + gboolean show_alpha; + + page = gimp_color_selector_new (page_type, + &selector->rgb, + &selector->hsv, + gimp_color_selector_get_channel (selector)); + + if (! page) + return NULL; + + selector_class = GIMP_COLOR_SELECTOR_GET_CLASS (page); + + show_alpha = gimp_color_selector_get_show_alpha (GIMP_COLOR_SELECTOR (notebook)); + gimp_color_selector_set_show_alpha (GIMP_COLOR_SELECTOR (page), show_alpha); + + menu_widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); + + image = gtk_image_new_from_icon_name (selector_class->icon_name, + GTK_ICON_SIZE_MENU); + gtk_box_pack_start (GTK_BOX (menu_widget), image, FALSE, FALSE, 0); + gtk_widget_show (image); + + label = gtk_label_new (gettext (selector_class->name)); + gtk_box_pack_start (GTK_BOX (menu_widget), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + image = gtk_image_new_from_icon_name (selector_class->icon_name, + DEFAULT_TAB_ICON_SIZE); + gimp_help_set_help_data (image, gettext (selector_class->name), NULL); + + gtk_notebook_append_page_menu (GTK_NOTEBOOK (notebook->notebook), + page, image, menu_widget); + + if (! notebook->cur_page) + notebook->cur_page = GIMP_COLOR_SELECTOR (page); + + notebook->selectors = g_list_append (notebook->selectors, page); + + gtk_widget_show (page); + + g_signal_connect (page, "color-changed", + G_CALLBACK (gimp_color_notebook_color_changed), + notebook); + g_signal_connect (page, "channel-changed", + G_CALLBACK (gimp_color_notebook_channel_changed), + notebook); + g_signal_connect (page, "model-visible-changed", + G_CALLBACK (gimp_color_notebook_model_visible_changed), + notebook); + + return page; +} + +static void +gimp_color_notebook_remove_selector (GtkContainer *container, + GtkWidget *widget, + GimpColorNotebook *notebook) +{ + notebook->selectors = g_list_remove (notebook->selectors, widget); + + if (! notebook->selectors) + notebook->cur_page = NULL; +} + + +/** + * gimp_color_notebook_set_has_page: + * @notebook: A #GimpColorNotebook widget. + * @page_type: The #GType of the notebook page to add or remove. + * @has_page: Whether the page should be added or removed. + * + * This function adds and removed pages to / from a #GimpColorNotebook. + * The @page_type passed must be a #GimpColorSelector subtype. + * + * Return value: The new page widget, if @has_page was #TRUE, or #NULL + * if @has_page was #FALSE. + **/ +GtkWidget * +gimp_color_notebook_set_has_page (GimpColorNotebook *notebook, + GType page_type, + gboolean has_page) +{ + GList *list; + + g_return_val_if_fail (GIMP_IS_COLOR_NOTEBOOK (notebook), NULL); + g_return_val_if_fail (g_type_is_a (page_type, GIMP_TYPE_COLOR_SELECTOR), + NULL); + g_return_val_if_fail (! g_type_is_a (page_type, GIMP_TYPE_COLOR_NOTEBOOK), + NULL); + + for (list = notebook->selectors; list; list = g_list_next (list)) + { + GimpColorSelector *page = list->data; + + if (G_TYPE_FROM_INSTANCE (page) == page_type) + { + if (has_page) + return GTK_WIDGET (page); + + gtk_container_remove (GTK_CONTAINER (notebook->notebook), + GTK_WIDGET (page)); + + return NULL; + } + } + + if (! has_page) + return NULL; + + return gimp_color_notebook_add_page (notebook, page_type); +} |