8 #include <yui/Libyui_config.h>
9 #include "ygtkratiobox.h"
10 #include "ygtkbargraph.h"
13 G_DEFINE_TYPE (
YGtkBarGraph, ygtk_bar_graph, GTK_TYPE_FRAME)
17 GtkWidget *box = ygtk_ratio_hbox_new (0);
18 gtk_widget_show (box);
19 gtk_container_add (GTK_CONTAINER (bar), box);
20 ygtk_bar_graph_set_style (bar, TRUE);
24 ygtk_bar_graph_get_preferred_height (GtkWidget *widget,
28 GTK_WIDGET_CLASS (ygtk_bar_graph_parent_class)->get_preferred_height (widget, minimal_height, natural_height);
29 *natural_height = *minimal_height = *minimal_height + 18;
33 ygtk_bar_graph_get_preferred_width (GtkWidget *widget,
37 GTK_WIDGET_CLASS (ygtk_bar_graph_parent_class)->get_preferred_width (widget, minimal_width, natural_width);
40 GtkWidget *ygtk_bar_graph_new (
void)
42 return g_object_new (YGTK_TYPE_BAR_GRAPH, NULL);
45 void ygtk_bar_graph_create_entries (
YGtkBarGraph *bar, guint entries)
47 YGtkRatioBox *box = YGTK_RATIO_BOX (gtk_bin_get_child(GTK_BIN (bar)));
51 for (i = entries; i < g_list_length (box->children); i++)
52 gtk_container_remove (GTK_CONTAINER (box),
53 (GtkWidget*) g_list_nth_data (box->children, i));
56 for (i = g_list_length (box->children); i < entries; i++) {
57 GtkWidget *label = ygtk_colored_label_new();
58 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER);
61 GtkWidget *lbox = gtk_event_box_new();
62 gtk_container_add (GTK_CONTAINER (lbox), label);
63 gtk_widget_show_all (lbox);
64 gtk_container_add (GTK_CONTAINER (box), lbox);
68 static GtkWidget *ygtk_bar_graph_get_label (
YGtkBarGraph *bar,
int index, GtkWidget **b)
70 YGtkRatioBox *hbox = YGTK_RATIO_BOX (gtk_bin_get_child(GTK_BIN (bar)));
71 GtkWidget *box = ((
YGtkRatioBoxChild *) g_list_nth_data (hbox->children, index))->widget;
73 return gtk_bin_get_child (GTK_BIN (box));
76 void ygtk_bar_graph_setup_entry (
YGtkBarGraph *bar,
int index,
const gchar *label_entry,
int value)
78 GtkWidget *box, *label;
79 label = ygtk_bar_graph_get_label (bar, index, &box);
86 GString *label_text = g_string_new (label_entry);
89 for (i = 0; i < label_text->len; i++)
90 if (label_text->str[i] ==
'%' && label_text->str[i+1] ==
'1') {
91 gchar *value_str = g_strdup_printf (
"%d", value);
92 label_text = g_string_erase (label_text, i, 2);
93 label_text = g_string_insert (label_text, i, value_str);
97 gtk_label_set_label (GTK_LABEL (label), label_text->str);
100 gtk_widget_set_tooltip_text (box, label_text->str);
101 g_string_free (label_text, TRUE);
105 gtk_widget_set_size_request (box, 0, -1);
106 YGtkRatioBox *hbox = YGTK_RATIO_BOX (gtk_bin_get_child(GTK_BIN (bar)));
107 ygtk_ratio_box_set_child_packing (hbox, box, MAX (value, 1));
111 const guint palette [][3] = {
142 const guint *color = palette [index % G_N_ELEMENTS (palette)];
143 GdkRGBA gcolor = { color[0] / 255., color[1] / 255., color[2] / 255., 0 };
144 ygtk_colored_label_set_background (color_label, &gcolor);
147 void ygtk_bar_graph_set_style (
YGtkBarGraph *bar, gboolean flat)
150 GtkShadowType shadow = flat ? GTK_SHADOW_OUT : GTK_SHADOW_NONE;
151 gtk_frame_set_shadow_type (GTK_FRAME (bar), shadow);
154 void ygtk_bar_graph_customize_bg (
YGtkBarGraph *bar,
int index, GdkRGBA *color)
156 GtkWidget *label = ygtk_bar_graph_get_label (bar, index, NULL);
157 ygtk_colored_label_set_background (YGTK_COLORED_LABEL (label), color);
160 void ygtk_bar_graph_customize_fg (
YGtkBarGraph *bar,
int index, GdkRGBA *color)
162 GtkWidget *label = ygtk_bar_graph_get_label (bar, index, NULL);
163 ygtk_colored_label_set_foreground (YGTK_COLORED_LABEL (label), color);
168 ygtk_bar_graph_parent_class = g_type_class_peek_parent (klass);
170 GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (klass);
171 widget_class->get_preferred_width = ygtk_bar_graph_get_preferred_width;
172 widget_class->get_preferred_height = ygtk_bar_graph_get_preferred_height;
184 static inline double pixel_clamp (
double val)
185 {
return MAX (0, MIN (1, val)); }
187 static gboolean ygtk_colored_label_on_draw (GtkWidget *widget, cairo_t *cr)
189 GtkStyleContext *ctx;
190 ctx = gtk_widget_get_style_context(widget);
193 gtk_style_context_get_background_color(ctx, GTK_STATE_NORMAL, &color);
196 int width = gtk_widget_get_allocated_width (widget);
197 int height = gtk_widget_get_allocated_height (widget);
198 cairo_scale (cr, width, height);
200 cairo_pattern_t *grad = cairo_pattern_create_linear (0, 0, 0, 1);
202 cairo_pattern_add_color_stop_rgba (grad, 0, pixel_clamp (color.red+.3), pixel_clamp (color.green+.3), pixel_clamp (color.blue+.3), 1);
203 cairo_pattern_add_color_stop_rgba (grad, 0.70, color.red, color.green, color.blue, 1);
204 cairo_pattern_add_color_stop_rgba (grad, 1, pixel_clamp (color.red-.2), pixel_clamp (color.green-.2), pixel_clamp (color.blue-.2), 1);
206 cairo_rectangle (cr, 0, 0, 1, 1);
207 cairo_set_source (cr, grad);
210 cairo_pattern_destroy (grad);
212 GTK_WIDGET_CLASS (ygtk_colored_label_parent_class)->draw (widget, cr);
216 GtkWidget *ygtk_colored_label_new (
void)
217 {
return g_object_new (YGTK_TYPE_COLORED_LABEL, NULL); }
219 void ygtk_colored_label_set_background (
YGtkColoredLabel *label, GdkRGBA *color)
220 { gtk_widget_override_background_color (GTK_WIDGET (label), GTK_STATE_NORMAL, color); }
222 void ygtk_colored_label_set_foreground (
YGtkColoredLabel *label, GdkRGBA *color)
223 { gtk_widget_override_color (GTK_WIDGET (label), GTK_STATE_NORMAL, color); }
227 ygtk_colored_label_parent_class = g_type_class_peek_parent (klass);
229 GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (klass);
230 widget_class->draw = ygtk_colored_label_on_draw;