1 | #include <gtk/gtk.h> |
2 | |
3 | static GtkWidget * |
4 | create_level_bar (void) |
5 | { |
6 | GtkWidget *bar; |
7 | |
8 | bar = gtk_level_bar_new (); |
9 | gtk_level_bar_set_min_value (GTK_LEVEL_BAR (bar), value: 0.0); |
10 | gtk_level_bar_set_max_value (GTK_LEVEL_BAR (bar), value: 10.0); |
11 | |
12 | gtk_level_bar_add_offset_value (GTK_LEVEL_BAR (bar), |
13 | GTK_LEVEL_BAR_OFFSET_LOW, value: 1.0); |
14 | |
15 | gtk_level_bar_add_offset_value (GTK_LEVEL_BAR (bar), |
16 | GTK_LEVEL_BAR_OFFSET_HIGH, value: 9.0); |
17 | |
18 | gtk_level_bar_add_offset_value (GTK_LEVEL_BAR (bar), |
19 | name: "full" , value: 10.0); |
20 | |
21 | gtk_level_bar_add_offset_value (GTK_LEVEL_BAR (bar), |
22 | name: "my-offset" , value: 5.0); |
23 | |
24 | return bar; |
25 | } |
26 | |
27 | static void |
28 | add_custom_css (void) |
29 | { |
30 | GtkCssProvider *provider; |
31 | const char data[] = |
32 | "levelbar block.my-offset {" |
33 | " background: magenta;" |
34 | "}" ; |
35 | |
36 | provider = gtk_css_provider_new (); |
37 | gtk_css_provider_load_from_data (css_provider: provider, data, length: -1); |
38 | gtk_style_context_add_provider_for_display (display: gdk_display_get_default (), |
39 | GTK_STYLE_PROVIDER (provider), |
40 | GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); |
41 | } |
42 | |
43 | static gboolean |
44 | increase_level (gpointer data) |
45 | { |
46 | GtkLevelBar *bar = data; |
47 | double value; |
48 | |
49 | value = gtk_level_bar_get_value (self: bar); |
50 | value += 0.1; |
51 | if (value >= gtk_level_bar_get_max_value (self: bar)) |
52 | value = gtk_level_bar_get_min_value (self: bar); |
53 | gtk_level_bar_set_value (self: bar, value); |
54 | |
55 | return G_SOURCE_CONTINUE; |
56 | } |
57 | |
58 | static void |
59 | toggle (GtkSwitch *sw, GParamSpec *pspec, GtkLevelBar *bar) |
60 | { |
61 | if (gtk_switch_get_active (self: sw)) |
62 | gtk_level_bar_set_mode (self: bar, mode: GTK_LEVEL_BAR_MODE_DISCRETE); |
63 | else |
64 | gtk_level_bar_set_mode (self: bar, mode: GTK_LEVEL_BAR_MODE_CONTINUOUS); |
65 | } |
66 | |
67 | static void |
68 | quit_cb (GtkWidget *widget, |
69 | gpointer data) |
70 | { |
71 | gboolean *done = data; |
72 | |
73 | *done = TRUE; |
74 | |
75 | g_main_context_wakeup (NULL); |
76 | } |
77 | |
78 | int |
79 | main (int argc, char *argv[]) |
80 | { |
81 | GtkWidget *window; |
82 | GtkWidget *box; |
83 | GtkWidget *bar; |
84 | GtkWidget *box2; |
85 | GtkWidget *sw; |
86 | gboolean done = FALSE; |
87 | |
88 | gtk_init (); |
89 | |
90 | add_custom_css (); |
91 | |
92 | window = gtk_window_new (); |
93 | gtk_window_set_default_size (GTK_WINDOW (window), width: 500, height: 100); |
94 | box = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 10); |
95 | gtk_widget_set_margin_start (widget: box, margin: 20); |
96 | gtk_widget_set_margin_end (widget: box, margin: 20); |
97 | gtk_widget_set_margin_top (widget: box, margin: 20); |
98 | gtk_widget_set_margin_bottom (widget: box, margin: 20); |
99 | bar = create_level_bar (); |
100 | gtk_window_set_child (GTK_WINDOW (window), child: box); |
101 | gtk_box_append (GTK_BOX (box), child: bar); |
102 | box2 = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 10); |
103 | gtk_box_append (GTK_BOX (box), child: box2); |
104 | gtk_box_append (GTK_BOX (box2), child: gtk_label_new (str: "Discrete" )); |
105 | sw = gtk_switch_new (); |
106 | gtk_box_append (GTK_BOX (box2), child: sw); |
107 | g_signal_connect (sw, "notify::active" , G_CALLBACK (toggle), bar); |
108 | |
109 | gtk_widget_show (widget: window); |
110 | |
111 | g_signal_connect (window, "destroy" , G_CALLBACK (quit_cb), &done); |
112 | |
113 | g_timeout_add (interval: 100, function: increase_level, data: bar); |
114 | while (!done) |
115 | g_main_context_iteration (NULL, TRUE); |
116 | |
117 | return 0; |
118 | } |
119 | |
120 | |