📄 gtkcolorsel.c
字号:
/* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */#include <stdlib.h>#include <stdio.h>#include <math.h>#include <gdk/gdk.h>#include "gtkcolorsel.h"#include "gtkwindow.h"#include "gtkhbbox.h"#include "gtkintl.h"#include "gtkdnd.h"#include "gtkselection.h"/* * If you change the way the color values are stored, * please make sure to update the drag & drop support so it sends * across all the color info (currently RGBA). - Elliot */#ifndef M_PI#define M_PI 3.14159265358979323846#endif /* M_PI */#define DEGTORAD(a) (2.0*M_PI*a/360.0)#define SQR(a) (a*a)#define TIMER_DELAY 300#define CIRCLE_RADIUS 65#define WHEEL_WIDTH 2*CIRCLE_RADIUS+2#define WHEEL_HEIGHT 2*CIRCLE_RADIUS+2#define VALUE_WIDTH 32#define VALUE_HEIGHT WHEEL_HEIGHT#define SAMPLE_WIDTH WHEEL_WIDTH+VALUE_WIDTH+5#define SAMPLE_HEIGHT 28static void gtk_color_selection_class_init (GtkColorSelectionClass *klass);static void gtk_color_selection_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);static void gtk_color_selection_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);static void gtk_color_selection_init (GtkColorSelection *colorsel);static void gtk_color_selection_dialog_class_init (GtkColorSelectionDialogClass *klass);static void gtk_color_selection_dialog_init (GtkColorSelectionDialog *colorseldiag);enum { COLOR_CHANGED, LAST_SIGNAL};enum { RGB_INPUTS = 1 << 0, HSV_INPUTS = 1 << 1, OPACITY_INPUTS = 1 << 2};enum { SCALE, ENTRY, BOTH};enum { HUE, SATURATION, VALUE, RED, GREEN, BLUE, OPACITY, NUM_CHANNELS};enum { ARG_0, ARG_UPDATE_POLICY, ARG_USE_OPACITY};typedef struct{ gchar *label; gfloat lower, upper, step_inc, page_inc; GtkSignalFunc updater;} scale_val_type;#define HSV_TO_RGB() gtk_color_selection_hsv_to_rgb( \ colorsel->values[HUE], \ colorsel->values[SATURATION], \ colorsel->values[VALUE], \ &colorsel->values[RED], \ &colorsel->values[GREEN], \ &colorsel->values[BLUE])#define RGB_TO_HSV() gtk_color_selection_rgb_to_hsv( \ colorsel->values[RED], \ colorsel->values[GREEN], \ colorsel->values[BLUE], \ &colorsel->values[HUE], \ &colorsel->values[SATURATION], \ &colorsel->values[VALUE])static void gtk_color_selection_hsv_updater (GtkWidget *widget, gpointer data);static void gtk_color_selection_rgb_updater (GtkWidget *widget, gpointer data);static void gtk_color_selection_opacity_updater (GtkWidget *widget, gpointer data);static void gtk_color_selection_realize (GtkWidget *widget);static void gtk_color_selection_unrealize (GtkWidget *widget);static void gtk_color_selection_finalize (GtkObject *object);static void gtk_color_selection_color_changed (GtkColorSelection *colorsel);static void gtk_color_selection_update_input (GtkWidget *scale, GtkWidget *entry, gdouble value);static void gtk_color_selection_update_inputs (GtkColorSelection *colorsel, gint inputs, gint which);static void gtk_color_selection_update_value (GtkColorSelection *colorsel, gint y);static void gtk_color_selection_update_wheel (GtkColorSelection *colorsel, gint x, gint y);static void gtk_color_selection_value_resize (GtkWidget *widget, gpointer data);static gint gtk_color_selection_value_events (GtkWidget *area, GdkEvent *event);static gint gtk_color_selection_value_timeout (GtkColorSelection *colorsel);static void gtk_color_selection_wheel_resize (GtkWidget *widget, gpointer data);static gint gtk_color_selection_wheel_events (GtkWidget *area, GdkEvent *event);static gint gtk_color_selection_wheel_timeout (GtkColorSelection *colorsel);static void gtk_color_selection_sample_resize (GtkWidget *widget, gpointer data);static void gtk_color_selection_drag_begin (GtkWidget *widget, GdkDragContext *context, gpointer data);static void gtk_color_selection_drag_end (GtkWidget *widget, GdkDragContext *context, gpointer data);static void gtk_color_selection_drop_handle (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time, gpointer data);static void gtk_color_selection_drag_handle (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, gpointer data);static void gtk_color_selection_draw_wheel_marker (GtkColorSelection *colorsel);static void gtk_color_selection_draw_wheel_frame (GtkColorSelection *colorsel);static void gtk_color_selection_draw_value_marker (GtkColorSelection *colorsel);static void gtk_color_selection_draw_value_bar (GtkColorSelection *colorsel, gint resize);static void gtk_color_selection_draw_wheel (GtkColorSelection *colorsel, gint resize);static void gtk_color_selection_draw_sample (GtkColorSelection *colorsel, gint resize);static gint gtk_color_selection_eval_wheel (gint x, gint y, gdouble cx, gdouble cy, gdouble *h, gdouble *s);static void gtk_color_selection_hsv_to_rgb (gdouble h, gdouble s, gdouble v, gdouble *r, gdouble *g, gdouble *b);static void gtk_color_selection_rgb_to_hsv (gdouble r, gdouble g, gdouble b, gdouble *h, gdouble *s, gdouble *v);static GtkVBoxClass *color_selection_parent_class = NULL;static GtkWindowClass *color_selection_dialog_parent_class = NULL;static guint color_selection_signals[LAST_SIGNAL] = {0};static const gchar *value_index_key = "gtk-value-index";#define SF GtkSignalFuncstatic const scale_val_type scale_vals[NUM_CHANNELS] ={ {N_("Hue:"), 0.0, 360.0, 1.00, 10.00, (SF) gtk_color_selection_hsv_updater}, {N_("Saturation:"), 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_hsv_updater}, {N_("Value:"), 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_hsv_updater}, {N_("Red:"), 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_rgb_updater}, {N_("Green:"), 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_rgb_updater}, {N_("Blue:"), 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_rgb_updater}, {N_("Opacity:"), 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_opacity_updater}};GtkTypegtk_color_selection_get_type (void){ static GtkType color_selection_type = 0; if (!color_selection_type) { static const GtkTypeInfo colorsel_info = { "GtkColorSelection", sizeof (GtkColorSelection), sizeof (GtkColorSelectionClass), (GtkClassInitFunc) gtk_color_selection_class_init, (GtkObjectInitFunc) gtk_color_selection_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, (GtkClassInitFunc) NULL, }; color_selection_type = gtk_type_unique (GTK_TYPE_VBOX, &colorsel_info); } return color_selection_type;}static voidgtk_color_selection_class_init (GtkColorSelectionClass *klass){ GtkObjectClass *object_class; GtkWidgetClass *widget_class; GtkContainerClass *container_class; object_class = (GtkObjectClass*) klass; widget_class = (GtkWidgetClass*) klass; container_class = (GtkContainerClass*) klass; color_selection_parent_class = gtk_type_class (GTK_TYPE_VBOX); gtk_object_add_arg_type ("GtkColorSelection::policy", GTK_TYPE_UPDATE_TYPE, GTK_ARG_READWRITE, ARG_UPDATE_POLICY); gtk_object_add_arg_type ("GtkColorSelection::use_opacity", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_USE_OPACITY); color_selection_signals[COLOR_CHANGED] = gtk_signal_new ("color_changed", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (GtkColorSelectionClass, color_changed), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); gtk_object_class_add_signals (object_class, color_selection_signals, LAST_SIGNAL); object_class->set_arg = gtk_color_selection_set_arg; object_class->get_arg = gtk_color_selection_get_arg; object_class->finalize = gtk_color_selection_finalize; widget_class->realize = gtk_color_selection_realize; widget_class->unrealize = gtk_color_selection_unrealize;}static voidgtk_color_selection_init (GtkColorSelection *colorsel){ GtkWidget *frame, *hbox, *vbox, *hbox2, *label, *table; GtkObject *adj; gint old_mask, n; gchar txt[32]; for (n = RED; n <= OPACITY; n++) colorsel->values[n] = 1.0; RGB_TO_HSV (); for (n = HUE; n <= OPACITY; n++) colorsel->old_values[n] = colorsel->values[n]; colorsel->wheel_gc = NULL; colorsel->value_gc = NULL; colorsel->sample_gc = NULL; colorsel->wheel_buf = NULL; colorsel->value_buf = NULL; colorsel->sample_buf = NULL; colorsel->use_opacity = FALSE; colorsel->timer_active = FALSE; colorsel->policy = GTK_UPDATE_CONTINUOUS; hbox = gtk_hbox_new (FALSE, 5); gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); gtk_container_add (GTK_CONTAINER (colorsel), hbox); vbox = gtk_vbox_new (FALSE, 5); gtk_container_add (GTK_CONTAINER (hbox), vbox); gtk_widget_show (vbox); hbox2 = gtk_hbox_new (FALSE, 5); gtk_container_add (GTK_CONTAINER (vbox), hbox2); gtk_widget_show (hbox2); colorsel->wheel_area = gtk_preview_new (GTK_PREVIEW_COLOR); old_mask = gtk_widget_get_events(colorsel->wheel_area); gtk_widget_set_events (colorsel->wheel_area, old_mask | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); gtk_preview_size (GTK_PREVIEW (colorsel->wheel_area), WHEEL_WIDTH, WHEEL_HEIGHT); gtk_preview_set_expand (GTK_PREVIEW (colorsel->wheel_area), TRUE); gtk_container_add (GTK_CONTAINER (hbox2), colorsel->wheel_area); gtk_widget_show (colorsel->wheel_area); old_mask = gtk_widget_get_events (colorsel->wheel_area); gtk_signal_connect (GTK_OBJECT (colorsel->wheel_area), "event", (SF) gtk_color_selection_wheel_events, (gpointer) colorsel->wheel_area); gtk_signal_connect_after (GTK_OBJECT (colorsel->wheel_area), "expose_event", (SF) gtk_color_selection_wheel_events, (gpointer) colorsel->wheel_area); gtk_signal_connect_after (GTK_OBJECT (colorsel->wheel_area), "size_allocate", (SF) gtk_color_selection_wheel_resize, (gpointer) colorsel->wheel_area); gtk_object_set_data (GTK_OBJECT (colorsel->wheel_area), "_GtkColorSelection", (gpointer) colorsel); frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (frame), 0); gtk_box_pack_start (GTK_BOX (hbox2), frame, FALSE, TRUE, 0); gtk_widget_show (frame); colorsel->value_area = gtk_preview_new (GTK_PREVIEW_COLOR); gtk_preview_size (GTK_PREVIEW (colorsel->value_area), VALUE_WIDTH, VALUE_HEIGHT); gtk_preview_set_expand (GTK_PREVIEW (colorsel->value_area), TRUE); gtk_container_add (GTK_CONTAINER (frame), colorsel->value_area); gtk_widget_show (colorsel->value_area); old_mask = gtk_widget_get_events (colorsel->value_area); gtk_widget_set_events (colorsel->value_area, old_mask | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); gtk_signal_connect_after (GTK_OBJECT (colorsel->value_area), "expose_event", (SF) gtk_color_selection_value_events, (gpointer) colorsel->value_area); gtk_signal_connect_after (GTK_OBJECT (colorsel->value_area), "size_allocate", (SF) gtk_color_selection_value_resize, (gpointer) colorsel->value_area); gtk_signal_connect (GTK_OBJECT (colorsel->value_area), "event", (SF) gtk_color_selection_value_events, (gpointer) colorsel->value_area); gtk_object_set_data (GTK_OBJECT (colorsel->value_area), "_GtkColorSelection", (gpointer) colorsel); /* New/old color samples */ /* ===================== */ frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0); gtk_widget_show (frame);/* colorsel->sample_area_eb = gtk_button_new (); gtk_container_add (GTK_CONTAINER (frame), colorsel->sample_area_eb); gtk_widget_show (colorsel->sample_area_eb); */ colorsel->sample_area = gtk_preview_new (GTK_PREVIEW_COLOR); gtk_preview_size (GTK_PREVIEW (colorsel->sample_area), SAMPLE_WIDTH, SAMPLE_HEIGHT); gtk_preview_set_expand (GTK_PREVIEW (colorsel->sample_area), TRUE); gtk_container_add (GTK_CONTAINER (frame), colorsel->sample_area); gtk_widget_set_events(colorsel->sample_area, gtk_widget_get_events(colorsel->sample_area) | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); gtk_widget_show (colorsel->sample_area); gtk_signal_connect_after (GTK_OBJECT (colorsel->sample_area), "size_allocate", GTK_SIGNAL_FUNC (gtk_color_selection_sample_resize), colorsel->sample_area); gtk_object_set_data (GTK_OBJECT (colorsel->sample_area), "_GtkColorSelection", (gpointer) colorsel); table = gtk_table_new (NUM_CHANNELS, 3, FALSE); gtk_table_set_col_spacings (GTK_TABLE (table), 3); gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, TRUE, 0); for (n = HUE; n <= OPACITY; n++) { label = gtk_label_new (_(scale_vals[n].label)); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, n, n + 1); adj = gtk_adjustment_new (colorsel->values[n], scale_vals[n].lower, scale_vals[n].upper, scale_vals[n].step_inc, scale_vals[n].page_inc, 0.0); colorsel->scales[n] = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_widget_set_usize (colorsel->scales[n], 128, 0); gtk_scale_set_value_pos (GTK_SCALE (colorsel->scales[n]), GTK_POS_TOP); gtk_range_set_update_policy (GTK_RANGE (colorsel->scales[n]), colorsel->policy); gtk_scale_set_draw_value (GTK_SCALE (colorsel->scales[n]), FALSE); gtk_scale_set_digits (GTK_SCALE (colorsel->scales[n]), 2); gtk_table_attach_defaults (GTK_TABLE (table), colorsel->scales[n], 1, 2, n, n + 1); colorsel->entries[n] = gtk_entry_new (); gtk_widget_set_usize (colorsel->entries[n], 40, 0); sprintf (txt, "%.2f", colorsel->values[n]); gtk_entry_set_text (GTK_ENTRY (colorsel->entries[n]), txt); gtk_table_attach_defaults (GTK_TABLE (table), colorsel->entries[n], 2, 3, n, n + 1); if (n != OPACITY)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -