/* gtkDPSlinesel.c --- DPS line style selection widget * Copyright (C) 1999 Masatake YAMATO * * Author: Masatake YAMATO * Created: Sun Oct 3 00:00:21 1999 * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include "gtkDPSlinesel.h" #include "gtkDPSarea.h" #include "gtkDPSintl.h" #include #include #include #include #include #include #include #include #include #include #include #define DEFAULT_AREA_WIDTH 80 #define DEFAULT_AREA_HEIGHT 150 static GtkVBoxClass *parent_class; static void gtk_dps_line_selection_class_init (GtkDPSLineSelectionClass * klass); static void gtk_dps_line_selection_init (GtkDPSLineSelection * linesel); static void gtk_dps_line_selection_set_arg(GtkObject * object, GtkArg * arg, guint arg_id); static void gtk_dps_line_selection_get_arg(GtkObject * object, GtkArg * arg, guint arg_id); static void gtk_dps_line_selection_destroy (GtkObject * object); static GtkWidget * width_frame_new (GtkDPSLineSelection * linesel); static GtkWidget * miter_limit_frame_new (GtkDPSLineSelection * linesel); static GtkWidget * join_frame_new (GtkDPSLineSelection * linesel); static GtkWidget * cap_frame_new (GtkDPSLineSelection * linesel); static GtkWidget * dash_pattern_frame_new(GtkDPSLineSelection * linesel); static void gtk_dps_line_selection_draw_lazy (GtkDPSArea *area, GdkRectangle *x_rectangle, GdkDPSRectangle *dps_rectangle, gpointer user_data); static void gtk_dps_line_selection_coordtr_update(GtkDPSArea *area, GdkDPSCoordtr * coordtr, gpointer user_data); static void gtk_dps_line_selection_draw_triangle(GtkDPSLineSelection * linesel, GtkDPSArea *area); static void gtk_dps_line_selection_draw(GtkDPSLineSelection * linesel); static void gtk_dps_line_selection_line_width_changed(GtkAdjustment *adjustment, gpointer user_data); static void gtk_dps_line_selection_miter_limit_changed(GtkAdjustment *adjustment, gpointer user_data); static void gtk_dps_line_selection_join_style_changed(GtkRadioButton * button, gpointer user_data); static void gtk_dps_line_selection_cap_style_changed(GtkRadioButton * button, gpointer user_data); static void gtk_real_dps_line_selection_line_change(GtkDPSLineSelection * linesel); static void dash_pattern_toggled(GtkObject *, gpointer user_data); static void dash_pattern_changed(GtkAdjustment *adjustment, gpointer user_data); enum { LINE_CHANGED, LAST_SIGNAL }; static guint linesel_signals[LAST_SIGNAL] = {0}; enum { ARG_0, ARG_LINE_WIDTH, ARG_MITER_LIMIT, ARG_JOIN_STYLE, ARG_CAP_STYLE /* TODO: Dash pattern is not supported yet. */ }; GtkWidget * gtk_dps_line_selection_new(void) { GtkDPSLineSelection * linesel; linesel = gtk_type_new(gtk_dps_line_selection_get_type ()); return GTK_WIDGET(linesel); } GtkType gtk_dps_line_selection_get_type (void) { static GtkType dps_line_selection_type = 0; if (!dps_line_selection_type) { GtkTypeInfo dps_line_selection_info = { "GtkDPSLineSelection", sizeof (GtkDPSLineSelection), sizeof (GtkDPSLineSelectionClass), (GtkClassInitFunc) gtk_dps_line_selection_class_init, (GtkObjectInitFunc) gtk_dps_line_selection_init, NULL, NULL, }; dps_line_selection_type = gtk_type_unique(gtk_vbox_get_type (), &dps_line_selection_info); } return dps_line_selection_type; } static void gtk_dps_line_selection_class_init (GtkDPSLineSelectionClass * klass) { GtkObjectClass *object_class = (GtkObjectClass *) klass; /* GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; */ gtk_object_add_arg_type ("GtkDPSLineSelection::line_width", GTK_TYPE_FLOAT, GTK_ARG_READWRITE, ARG_LINE_WIDTH); gtk_object_add_arg_type ("GtkDPSLineSelection::miter_limit", GTK_TYPE_FLOAT, GTK_ARG_READWRITE, ARG_MITER_LIMIT); gtk_object_add_arg_type ("GtkDPSLineSelection::join_style", GTK_TYPE_ENUM, GTK_ARG_READWRITE, ARG_JOIN_STYLE); gtk_object_add_arg_type ("GtkDPSLineSelection::cap_style", GTK_TYPE_ENUM, GTK_ARG_READWRITE, ARG_CAP_STYLE); linesel_signals[LINE_CHANGED] = gtk_signal_new ("line_changed", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET(GtkDPSLineSelectionClass, line_changed), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); klass->line_changed = gtk_real_dps_line_selection_line_change; gtk_object_class_add_signals (object_class, linesel_signals, LAST_SIGNAL); parent_class = gtk_type_class (gtk_vbox_get_type()); object_class->set_arg = gtk_dps_line_selection_set_arg; object_class->get_arg = gtk_dps_line_selection_get_arg; object_class->destroy = gtk_dps_line_selection_destroy; } static void gtk_dps_line_selection_init (GtkDPSLineSelection * linesel) { GtkWidget * hbox; GtkWidget * display_frame; GtkWidget * right_table; GtkWidget * width_frame; GtkWidget * miter_limit_frame; GtkWidget * join_frame; GtkWidget * cap_frame; GtkWidget * dash_pattern_frame; linesel->dash_pattern = gdk_dps_dash_pattern_new(6); linesel->empty_dash_pattern = gdk_dps_dash_pattern_new(6); hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(linesel), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); /* display frame */ display_frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (display_frame), GTK_SHADOW_IN); gtk_box_pack_start(GTK_BOX(hbox), display_frame, TRUE, TRUE, 0); /* ??? */ gtk_container_set_border_width (GTK_CONTAINER (display_frame), 4); gtk_widget_show (display_frame); /* dps area */ linesel->dps_area = gtk_dps_area_new (0); gtk_dps_area_size(GTK_DPS_AREA(linesel->dps_area), DEFAULT_AREA_WIDTH, DEFAULT_AREA_HEIGHT); gtk_signal_connect(GTK_OBJECT(linesel->dps_area), "draw_lazy", (GtkSignalFunc) gtk_dps_line_selection_draw_lazy, linesel); gtk_signal_connect(GTK_OBJECT(linesel->dps_area), "coordtr_update", (GtkSignalFunc) gtk_dps_line_selection_coordtr_update, linesel); gtk_container_add (GTK_CONTAINER (display_frame), linesel->dps_area); gtk_widget_show(linesel->dps_area); /* right table */ right_table = gtk_table_new(2, 2, FALSE); gtk_box_pack_end(GTK_BOX(hbox), right_table, FALSE, TRUE, 0); /* ??? */ gtk_widget_show (right_table); /* width_frame */ width_frame = width_frame_new(linesel); gtk_table_attach (GTK_TABLE(right_table), width_frame, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_show (width_frame); /* miter_limit_frame */ miter_limit_frame = miter_limit_frame_new(linesel); gtk_table_attach (GTK_TABLE(right_table), miter_limit_frame, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_show (miter_limit_frame); /* join frame */ join_frame = join_frame_new (linesel); gtk_container_set_border_width (GTK_CONTAINER (join_frame), 1); gtk_table_attach (GTK_TABLE(right_table), join_frame, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_show(join_frame); /* cap frame */ cap_frame = cap_frame_new (linesel); gtk_container_set_border_width (GTK_CONTAINER (cap_frame), 2); gtk_table_attach (GTK_TABLE(right_table), cap_frame, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_show(cap_frame); dash_pattern_frame = dash_pattern_frame_new(linesel); gtk_box_pack_start(GTK_BOX(linesel), dash_pattern_frame, TRUE, TRUE, 0); gtk_widget_show(dash_pattern_frame); } static void gtk_dps_line_selection_set_arg(GtkObject * object, GtkArg * arg, guint arg_id) { GtkDPSLineSelection * linesel; linesel = GTK_DPS_LINE_SELECTION(object); switch (arg_id) { case ARG_LINE_WIDTH: gtk_dps_line_selection_set_line_width(linesel, GTK_VALUE_FLOAT(*arg)); break; case ARG_MITER_LIMIT: gtk_dps_line_selection_set_miter_limit(linesel, GTK_VALUE_FLOAT(*arg)); break; case ARG_JOIN_STYLE: gtk_dps_line_selection_set_join_style(linesel, GTK_VALUE_ENUM(*arg)); break; case ARG_CAP_STYLE: gtk_dps_line_selection_set_cap_style(linesel, GTK_VALUE_ENUM(*arg)); break; default: break; } } static void gtk_dps_line_selection_get_arg(GtkObject * object, GtkArg * arg, guint arg_id) { GtkDPSLineSelection * linesel; linesel = GTK_DPS_LINE_SELECTION(object); switch (arg_id) { case ARG_LINE_WIDTH: GTK_VALUE_FLOAT(*arg) = gtk_dps_line_selection_get_line_width(linesel); break; case ARG_MITER_LIMIT: GTK_VALUE_FLOAT(*arg) = gtk_dps_line_selection_get_miter_limit(linesel); break; case ARG_JOIN_STYLE: GTK_VALUE_ENUM (*arg) = gtk_dps_line_selection_get_join_style(linesel); break; case ARG_CAP_STYLE: GTK_VALUE_ENUM (*arg) = gtk_dps_line_selection_get_cap_style(linesel); break; default: arg->type = GTK_TYPE_INVALID; break; } } static void gtk_dps_line_selection_destroy (GtkObject * object) { GtkDPSLineSelection * linesel; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_DPS_LINE_SELECTION (object)); linesel = GTK_DPS_LINE_SELECTION(object); gdk_dps_dash_pattern_free(linesel->dash_pattern); linesel->dash_pattern = NULL; gdk_dps_dash_pattern_free(linesel->empty_dash_pattern); linesel->empty_dash_pattern = NULL; if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } static GtkWidget * width_frame_new (GtkDPSLineSelection * linesel) { GtkWidget * width_frame = gtk_frame_new ( _("Width")); GtkWidget * width_spin; /* width_spin */ linesel->line_width_adj = gtk_adjustment_new (1.0, 0.0, 30.0, 0.1, 1.0, 0.0); width_spin = gtk_spin_button_new (GTK_ADJUSTMENT(linesel->line_width_adj), 1.0, 2); /* ??? */ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (width_spin), TRUE); gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (width_spin), GTK_SHADOW_OUT); gtk_container_add (GTK_CONTAINER (width_frame), width_spin); gtk_widget_show(width_spin); gtk_signal_connect (linesel->line_width_adj, "value_changed", GTK_SIGNAL_FUNC (gtk_dps_line_selection_line_width_changed), linesel); return width_frame; } static GtkWidget * miter_limit_frame_new (GtkDPSLineSelection * linesel) { GtkWidget * miter_limit_frame = gtk_frame_new ( _("Miter limit")); GtkWidget * miter_limit_spin; /* miter_limit_spin */ linesel->miter_limit_adj = gtk_adjustment_new (10.0, 1.0, 300.0, 1.0, 5.0, 0.0); miter_limit_spin = gtk_spin_button_new (GTK_ADJUSTMENT(linesel->miter_limit_adj), 0, 0); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (miter_limit_spin), TRUE); gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (miter_limit_spin), GTK_SHADOW_OUT); gtk_container_add (GTK_CONTAINER (miter_limit_frame), miter_limit_spin); gtk_widget_show(miter_limit_spin); gtk_signal_connect (linesel->miter_limit_adj, "value_changed", GTK_SIGNAL_FUNC (gtk_dps_line_selection_miter_limit_changed), linesel); return miter_limit_frame; } static GtkWidget * join_frame_new (GtkDPSLineSelection * linesel) { GtkWidget * tmp; GtkWidget * frame = gtk_frame_new( _("Join style")); GtkWidget * vbox = gtk_vbox_new (FALSE, 1); GSList * group = NULL; gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); gtk_container_add (GTK_CONTAINER (frame), vbox); gtk_widget_show(vbox); tmp = gtk_radio_button_new_with_label (group, _("Miter")); linesel->join_buttons[GDK_DPS_JOIN_MITER] = tmp; group = gtk_radio_button_group (GTK_RADIO_BUTTON (tmp)); gtk_box_pack_start (GTK_BOX(vbox), tmp, FALSE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(tmp), "clicked", GTK_SIGNAL_FUNC (gtk_dps_line_selection_join_style_changed), linesel); gtk_widget_show(tmp); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmp), TRUE); tmp = gtk_radio_button_new_with_label(group, _("Round")); linesel->join_buttons[GDK_DPS_JOIN_ROUND] = tmp; group = gtk_radio_button_group (GTK_RADIO_BUTTON (tmp)); gtk_box_pack_start (GTK_BOX(vbox), tmp, FALSE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(tmp), "clicked", GTK_SIGNAL_FUNC (gtk_dps_line_selection_join_style_changed), linesel); gtk_widget_show(tmp); tmp = gtk_radio_button_new_with_label(group, _("Bevel")); linesel->join_buttons[GDK_DPS_JOIN_BEVEL] = tmp; group = gtk_radio_button_group (GTK_RADIO_BUTTON (tmp)); gtk_box_pack_start (GTK_BOX(vbox), tmp, FALSE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(tmp), "clicked", GTK_SIGNAL_FUNC (gtk_dps_line_selection_join_style_changed), linesel); gtk_widget_show(tmp); return frame; } static GtkWidget * cap_frame_new (GtkDPSLineSelection * linesel) { GtkWidget * tmp; GtkWidget * frame = gtk_frame_new( _("Cap style")); GtkWidget * vbox = gtk_vbox_new (FALSE, 1); GSList * group = NULL; gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); gtk_container_add (GTK_CONTAINER (frame), vbox); gtk_widget_show(vbox); tmp = gtk_radio_button_new_with_label (group, _("Butt")); linesel->cap_buttons[GDK_DPS_CAP_BUTT] = tmp; group = gtk_radio_button_group (GTK_RADIO_BUTTON (tmp)); gtk_box_pack_start (GTK_BOX(vbox), tmp, FALSE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(tmp), "clicked", GTK_SIGNAL_FUNC (gtk_dps_line_selection_cap_style_changed), linesel); gtk_widget_show(tmp); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmp), TRUE); tmp = gtk_radio_button_new_with_label(group, _("Round")); linesel->cap_buttons[GDK_DPS_CAP_ROUND] = tmp; group = gtk_radio_button_group (GTK_RADIO_BUTTON (tmp)); gtk_box_pack_start (GTK_BOX(vbox), tmp, FALSE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(tmp), "clicked", GTK_SIGNAL_FUNC (gtk_dps_line_selection_cap_style_changed), linesel); gtk_widget_show(tmp); tmp = gtk_radio_button_new_with_label(group, _("Square")); linesel->cap_buttons[GDK_DPS_CAP_SQUARE] = tmp; group = gtk_radio_button_group (GTK_RADIO_BUTTON (tmp)); gtk_box_pack_start (GTK_BOX(vbox), tmp, FALSE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(tmp), "clicked", GTK_SIGNAL_FUNC (gtk_dps_line_selection_cap_style_changed), linesel); gtk_widget_show(tmp); return frame; } static GtkWidget * dash_pattern_frame_new(GtkDPSLineSelection * linesel) { GtkWidget * frame = gtk_frame_new( _("Dash pattern")); GtkWidget * vbox = gtk_vbox_new (FALSE, 1); GtkWidget * label; GtkWidget * spin_button; int i; gtk_widget_show(frame); linesel->dash_pattern_entries_table = gtk_table_new(6, 2, FALSE); gtk_container_add (GTK_CONTAINER (frame), vbox); gtk_widget_show(vbox); linesel->dash_pattern_check = gtk_check_button_new_with_label( _("Enable dash pattern")); gtk_signal_connect(GTK_OBJECT(linesel->dash_pattern_check), "toggled", GTK_SIGNAL_FUNC(dash_pattern_toggled), linesel); gtk_box_pack_start(GTK_BOX(vbox), linesel->dash_pattern_check, FALSE, FALSE, 1); gtk_widget_show(linesel->dash_pattern_check); gtk_box_pack_start(GTK_BOX(vbox), linesel->dash_pattern_entries_table, TRUE, TRUE, 1); /* gtk_widget_show(linesel->dash_pattern_entries_table); */ for (i = 0; i < 6; i++) { linesel->dash_pattern_adjs[i] = gtk_adjustment_new (0.0, 0.0, 20.0, 0.1, 1.0, 0.0); spin_button = gtk_spin_button_new(GTK_ADJUSTMENT(linesel->dash_pattern_adjs[i]), 1.0, 2); /* ??? */ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spin_button), FALSE); gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spin_button), GTK_SHADOW_OUT); gtk_signal_connect (linesel->dash_pattern_adjs[i], "value_changed", GTK_SIGNAL_FUNC (dash_pattern_changed), linesel); gtk_table_attach (GTK_TABLE(linesel->dash_pattern_entries_table), spin_button, i, i+1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 1, 0); gtk_widget_show(spin_button); if (i%2 == 0) label = gtk_label_new( _("Line")); else label = gtk_label_new( _("Space")); gtk_misc_set_padding (GTK_MISC(label), 1, 2); gtk_table_attach (GTK_TABLE(linesel->dash_pattern_entries_table), label, i, i+1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_show(label); } return frame; } static void dash_pattern_toggled(GtkObject * object, gpointer user_data) { int i; gboolean status; GtkDPSLineSelection * linesel; g_return_if_fail(object); g_return_if_fail(user_data); g_return_if_fail(GTK_IS_DPS_LINE_SELECTION(user_data)); linesel = GTK_DPS_LINE_SELECTION(user_data); status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linesel->dash_pattern_check)); if (status == FALSE) { for (i = 0; i < 6; i++) gtk_adjustment_set_value(GTK_ADJUSTMENT(linesel->dash_pattern_adjs[i]), 0.0); gtk_widget_hide (linesel->dash_pattern_entries_table); } else gtk_widget_show (linesel->dash_pattern_entries_table); gtk_signal_emit(GTK_OBJECT(user_data), linesel_signals[LINE_CHANGED]); } static void dash_pattern_changed(GtkAdjustment *adjustment, gpointer user_data) { gboolean status; GtkDPSLineSelection * linesel; g_return_if_fail(user_data); g_return_if_fail(GTK_IS_DPS_LINE_SELECTION(user_data)); linesel = GTK_DPS_LINE_SELECTION(user_data); status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linesel->dash_pattern_check)); if (status == TRUE) gtk_signal_emit(GTK_OBJECT(user_data), linesel_signals[LINE_CHANGED]); } static void gtk_dps_line_selection_draw_lazy (GtkDPSArea *area, GdkRectangle *x_rectangle, GdkDPSRectangle *dps_rectangle, gpointer user_data) { GtkDPSLineSelection * linesel; g_return_if_fail(area); g_return_if_fail(dps_rectangle); g_return_if_fail(user_data); g_return_if_fail(GTK_IS_DPS_AREA(area)); linesel = GTK_DPS_LINE_SELECTION(user_data); gtk_dps_widget_begin(area); DPSsetrgbcolor(raw_ctxt, 1.0, 1.0, 1.0); DPSrectfill(raw_ctxt, dps_rectangle->x, dps_rectangle->y, dps_rectangle->width, dps_rectangle->height); DPSinitviewclip(raw_ctxt); gtk_dps_widget_end(); gtk_dps_line_selection_draw_triangle(linesel, area); } static void gtk_dps_line_selection_coordtr_update(GtkDPSArea *area, GdkDPSCoordtr * coordtr, gpointer user_data) { GtkDPSLineSelection * linesel; g_return_if_fail(area); g_return_if_fail(coordtr); g_return_if_fail(user_data); g_return_if_fail(GTK_IS_DPS_AREA(area)); linesel = GTK_DPS_LINE_SELECTION(user_data); gtk_dps_line_selection_draw(linesel); } static void gtk_dps_line_selection_draw(GtkDPSLineSelection * linesel) { GtkDPSArea * area; g_return_if_fail(linesel); g_return_if_fail(GTK_IS_DPS_LINE_SELECTION(linesel)); area = GTK_DPS_AREA(linesel->dps_area); if (TRUE != GTK_WIDGET_REALIZED(area)) return ; gtk_dps_widget_begin(area); DPSerasepage(raw_ctxt); gtk_dps_widget_end(); gtk_dps_line_selection_draw_triangle(linesel, area); } static void gtk_dps_line_selection_draw_triangle(GtkDPSLineSelection * linesel, GtkDPSArea *area) { /* 1 /\ / \ / \ / \ 2 ------ 0 3 */ gfloat x[4]; gfloat y[4]; gfloat dash_pattern_array[6]; gfloat dash_pattern_phase; gfloat width, height; gfloat line_width; gfloat miter_limit; GdkDPSJoinStyle join_style ; GdkDPSCapStyle cap_style; GdkDPSDashPattern * dash_pattern; g_return_if_fail(linesel); g_return_if_fail(area); if (TRUE != GTK_WIDGET_REALIZED(area)) return ; line_width = gtk_dps_line_selection_get_line_width(linesel); join_style = gtk_dps_line_selection_get_join_style(linesel); cap_style = gtk_dps_line_selection_get_cap_style(linesel); miter_limit = gtk_dps_line_selection_get_miter_limit(linesel); dash_pattern = gtk_dps_line_selection_get_dash_pattern(linesel); if (TRUE == gdk_dps_dash_pattern_empty(dash_pattern)) dash_pattern = NULL; else { gdk_dps_dash_pattern_get(dash_pattern, dash_pattern_array); dash_pattern_phase = gdk_dps_dash_pattern_phase(dash_pattern); } gtk_dps_area_get_size(area, &width, &height); x [0] = width * 0.8; y [0] = height * 0.15; x [1] = width * 0.5; y [1] = height * 0.8; x [2] = width * 0.2; y [2] = height * 0.15; x [3] = width * 0.55; y [3] = height * 0.15; gtk_dps_widget_begin(area); { /* Black body line */ if (dash_pattern) { DPSsetdash(raw_ctxt, dash_pattern_array, 6, dash_pattern_phase); } else { DPSsetdash(raw_ctxt, 0, 0, 0.0); } DPSsetrgbcolor(raw_ctxt, 0.0, 0.0, 0.0); DPSsetlinewidth(raw_ctxt, line_width); DPSsetlinecap(raw_ctxt, cap_style); DPSsetlinejoin(raw_ctxt, join_style); DPSsetmiterlimit(raw_ctxt, miter_limit); DPSmoveto(raw_ctxt, x[0], y[0]); DPSlineto(raw_ctxt, x[1], y[1]); DPSlineto(raw_ctxt, x[2], y[2]); DPSlineto(raw_ctxt, x[3], y[3]); DPSstroke(raw_ctxt); /* Red bone line */ DPSsetdash(raw_ctxt, 0, 0, 0.0); DPSsetrgbcolor(raw_ctxt, 1.0, 0.1, 0.1); DPSsetlinewidth(raw_ctxt, 0.0); DPSmoveto(raw_ctxt, x[0], y[0]); DPSlineto(raw_ctxt, x[1], y[1]); DPSlineto(raw_ctxt, x[2], y[2]); DPSlineto(raw_ctxt, x[3], y[3]); DPSstroke(raw_ctxt); } gtk_dps_widget_end(); } static void gtk_dps_line_selection_line_width_changed(GtkAdjustment *adjustment, gpointer user_data) { gtk_signal_emit(GTK_OBJECT(user_data), linesel_signals[LINE_CHANGED]); } static void gtk_dps_line_selection_miter_limit_changed(GtkAdjustment *adjustment, gpointer user_data) { /* TODO: Check join style */ gtk_signal_emit(GTK_OBJECT(user_data), linesel_signals[LINE_CHANGED]); } static void gtk_dps_line_selection_join_style_changed(GtkRadioButton * button, gpointer user_data) { gtk_signal_emit(GTK_OBJECT(user_data), linesel_signals[LINE_CHANGED]); } static void gtk_dps_line_selection_cap_style_changed(GtkRadioButton * button, gpointer user_data) { gtk_signal_emit(GTK_OBJECT(user_data), linesel_signals[LINE_CHANGED]); } gfloat gtk_dps_line_selection_get_line_width (GtkDPSLineSelection * linesel) { GtkAdjustment * adj; g_return_val_if_fail (linesel, -1.0); g_return_val_if_fail (GTK_IS_DPS_LINE_SELECTION(linesel), -1.0); g_return_val_if_fail(linesel->line_width_adj, -1.0); adj = GTK_ADJUSTMENT(linesel->line_width_adj); return adj->value; } gfloat gtk_dps_line_selection_get_miter_limit (GtkDPSLineSelection *linesel) { GtkAdjustment * adj; g_return_val_if_fail (linesel, -1.0); g_return_val_if_fail (GTK_IS_DPS_LINE_SELECTION(linesel), -1.0); g_return_val_if_fail(linesel->miter_limit_adj, -1.0); adj = GTK_ADJUSTMENT(linesel->miter_limit_adj); return adj->value; } GdkDPSJoinStyle gtk_dps_line_selection_get_join_style(GtkDPSLineSelection * linesel) { gint i; gboolean status; g_return_val_if_fail(linesel, 0); g_return_val_if_fail(GTK_IS_DPS_LINE_SELECTION(linesel), 0); for (i = 0; i < 3; i++) { status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linesel->join_buttons[i])); if (TRUE == status) return (GdkDPSJoinStyle)i; } g_assert_not_reached(); return 0; /* Not reached */ } GdkDPSCapStyle gtk_dps_line_selection_get_cap_style(GtkDPSLineSelection * linesel) { gint i; gboolean status; g_return_val_if_fail(linesel, 0); g_return_val_if_fail(GTK_IS_DPS_LINE_SELECTION(linesel), 0); for (i = 0; i < 3; i++) { status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linesel->cap_buttons[i])); if (TRUE == status) return (GdkDPSCapStyle)i; } g_assert_not_reached(); return 0; /* Not reached */ } static void gtk_real_dps_line_selection_line_change(GtkDPSLineSelection * linesel) { /* Pull data */ gtk_dps_line_selection_draw(linesel); } GdkDPSDashPattern* gtk_dps_line_selection_get_dash_pattern(GtkDPSLineSelection * linesel) { gboolean status; gint i; gfloat value; g_return_val_if_fail(linesel, NULL); g_return_val_if_fail(GTK_IS_DPS_LINE_SELECTION(linesel), NULL); status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linesel->dash_pattern_check)); if (status == TRUE) { for (i = 0; i < 6; i++) { value = GTK_ADJUSTMENT(linesel->dash_pattern_adjs[i])->value; gdk_dps_dash_pattern_set_at(linesel->dash_pattern, i, value); } return linesel->dash_pattern; } else return linesel->empty_dash_pattern; } void gtk_dps_line_selection_set_line_width (GtkDPSLineSelection * linesel, gfloat line_width) { g_return_if_fail(linesel); g_return_if_fail(GTK_IS_DPS_LINE_SELECTION(linesel)); g_return_if_fail(line_width >= 0.0); gtk_adjustment_set_value(GTK_ADJUSTMENT(linesel->line_width_adj), line_width); } void gtk_dps_line_selection_set_miter_limit (GtkDPSLineSelection * linesel, gfloat miter_limit) { g_return_if_fail(linesel); g_return_if_fail(GTK_IS_DPS_LINE_SELECTION(linesel)); g_return_if_fail(miter_limit >= 0.0); gtk_adjustment_set_value(GTK_ADJUSTMENT(linesel->miter_limit_adj), miter_limit); } void gtk_dps_line_selection_set_join_style(GtkDPSLineSelection * linesel, GdkDPSJoinStyle join_style) { g_return_if_fail(gdk_dps_join_style_is_in_range(join_style) == TRUE); g_return_if_fail(linesel); g_return_if_fail(GTK_IS_DPS_LINE_SELECTION(linesel)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linesel->join_buttons[join_style]), TRUE); } void gtk_dps_line_selection_set_cap_style(GtkDPSLineSelection * linesel, GdkDPSCapStyle cap_style) { g_return_if_fail(gdk_dps_cap_style_is_in_range(cap_style) == TRUE); g_return_if_fail(linesel); g_return_if_fail(GTK_IS_DPS_LINE_SELECTION(linesel)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linesel->cap_buttons[cap_style]), TRUE); } void gtk_dps_line_selection_set_dash_pattern(GtkDPSLineSelection * linesel, GdkDPSDashPattern* dash_pattern) { gboolean status; gint length, i; gfloat value; g_return_if_fail(linesel); g_return_if_fail(dash_pattern); length = gdk_dps_dash_pattern_length(dash_pattern); g_return_if_fail(length < 6); status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linesel->dash_pattern_check)); if (status != FALSE) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linesel->dash_pattern_check), FALSE); for (i = 0; i < length; i++) { value = gdk_dps_dash_pattern_get_at(dash_pattern, i); gtk_adjustment_set_value(GTK_ADJUSTMENT(linesel->dash_pattern_adjs[i]), value); } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linesel->dash_pattern_check), TRUE); }