00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "gtkledbar.h"
00025 #include <gtk/gtklabel.h>
00026 #include <gtk/gtktable.h>
00027
00028 static void led_bar_class_init (LedBarClass *klass);
00029 static void led_bar_init (LedBar *led_bar);
00030
00031 guint
00032 led_bar_get_type ()
00033 {
00034 static guint led_bar_type = 0;
00035
00036 if (!led_bar_type)
00037 {
00038 GtkTypeInfo led_bar_info = {
00039 "LedBar",
00040 sizeof (LedBar),
00041 sizeof (LedBarClass),
00042 (GtkClassInitFunc) led_bar_class_init,
00043 (GtkObjectInitFunc) led_bar_init,
00044 NULL,
00045 NULL,
00046 NULL,
00047 };
00048
00049 led_bar_type = gtk_type_unique (gtk_vbox_get_type (), &led_bar_info);
00050 }
00051 return led_bar_type;
00052 }
00053
00054 static void
00055 led_bar_class_init (LedBarClass *class)
00056 {
00057 GtkObjectClass *object_class;
00058
00059 object_class = (GtkObjectClass *) class;
00060
00061 }
00062
00063 static void
00064 led_bar_init (LedBar *led_bar)
00065 {
00066 led_bar->num_segments = 0;
00067 led_bar->lit_segments = 0;
00068 led_bar->seq_segment = 0;
00069 led_bar->seq_dir = 1;
00070 }
00071
00072 GtkWidget *
00073 led_bar_new (gint segments, gint orientation )
00074 {
00075 LedBar *led_bar;
00076 GtkWidget *table;
00077 gint i;
00078 GdkColor active;
00079 GdkColor inactive;
00080 gint half, full;
00081
00082 led_bar = gtk_type_new (led_bar_get_type ());
00083 if (segments > MAX_SEGMENTS)
00084 segments = MAX_SEGMENTS;
00085 led_bar->num_segments = segments;
00086 led_bar->orientation = orientation;
00087 if ( !orientation )
00088 table = gtk_table_new (1, segments, FALSE);
00089 else
00090 table = gtk_table_new (segments, 1, FALSE);
00091 gtk_container_add (GTK_CONTAINER (led_bar), table);
00092 gtk_widget_show (table);
00093 half = .50 * segments;
00094 full = .75 * segments;
00095 gdk_color_parse ("#00F100", &active);
00096 gdk_color_parse ("#008C00", &inactive);
00097 for (i = 0; i < segments; i++)
00098 {
00099 if (i >= half && i <= full)
00100 {
00101 gdk_color_parse ("#F1EE00", &active);
00102 gdk_color_parse ("#8CAA00", &inactive);
00103 }
00104 else
00105 if (i >= full)
00106 {
00107 gdk_color_parse ("#F10000", &active);
00108 gdk_color_parse ("#8C0000", &inactive);
00109 }
00110 led_bar->segments[i] = gtk_led_new ();
00111 gtk_led_set_colors (GTK_LED (led_bar->segments[i]), &active, &inactive);
00112
00113 if ( !orientation )
00114 gtk_table_attach (GTK_TABLE (table), led_bar->segments[i],
00115 i, (i + 1), 0, 1, 0, 0, 0, 0);
00116 else
00117 gtk_table_attach (GTK_TABLE (table), led_bar->segments[i],
00118 0, 1, (segments - i - 1), (segments - i),
00119 0, 0, 0, 0 );
00120 gtk_widget_show (led_bar->segments[i]);
00121 }
00122
00123 return GTK_WIDGET (led_bar);
00124 }
00125
00126 GtkWidget *
00127 led_bar_new_with_decades (gint segments, gint decades, gint firstdecade, gint orientation )
00128 {
00129 LedBar *led_bar;
00130 GtkWidget *table;
00131 GtkWidget *label;
00132 GtkWidget *led0;
00133 gint i;
00134 GdkColor active;
00135 GdkColor inactive;
00136 gint half, full;
00137 gint ndecade;
00138 gchar *declab;
00139
00140 led_bar = gtk_type_new (led_bar_get_type ());
00141 if (segments > MAX_SEGMENTS)
00142 segments = MAX_SEGMENTS;
00143 led_bar->num_segments = segments;
00144 led_bar->orientation = orientation;
00145 if ( !orientation )
00146 table = gtk_table_new (2, segments+2, FALSE);
00147 else
00148 table = gtk_table_new (segments+2, 2, FALSE);
00149 gtk_container_add (GTK_CONTAINER (led_bar), table);
00150 gtk_widget_show (table);
00151 ndecade = segments / decades;
00152 half = .50 * segments;
00153 full = .75 * segments;
00154 gdk_color_parse ("#000000", &active);
00155 gdk_color_parse ("#000000", &inactive);
00156 led0 = gtk_led_new ();
00157 if ( !orientation )
00158 gtk_table_attach (GTK_TABLE (table), led0,
00159 0, 1, 0, 1, 0, 0, 0, 0);
00160 else
00161 gtk_table_attach (GTK_TABLE (table), led0,
00162 0, 1, (segments + 1 - 1 + 1), (segments + 1 + 1),
00163 0, 0, 0, 0 );
00164 gtk_widget_show (led0);
00165 for (i = 0; i < segments; i++)
00166 {
00167 gdk_color_parse ("#00F100", &active);
00168 gdk_color_parse ("#006C00", &inactive);
00169 if (i >= half && i <= full)
00170 {
00171 gdk_color_parse ("#F1EE00", &active);
00172 gdk_color_parse ("#6C8A00", &inactive);
00173 }
00174 else
00175 if (i >= full)
00176 {
00177 gdk_color_parse ("#F10000", &active);
00178 gdk_color_parse ("#6C0000", &inactive);
00179 }
00180 if(!(i%ndecade))
00181 gdk_color_parse ("#000000", &inactive);
00182
00183 led_bar->segments[i] = gtk_led_new ();
00184 gtk_led_set_colors (GTK_LED (led_bar->segments[i]), &active, &inactive);
00185
00186 if ( !orientation ){
00187 gtk_table_attach (GTK_TABLE (table), led_bar->segments[i],
00188 i+1, (i + 2), 0, 1, 0, 0, 0, 0);
00189 if(!(i%ndecade)){
00190 label = gtk_label_new( declab = g_strdup_printf("%d",firstdecade+i/ndecade) );
00191 g_free(declab);
00192 gtk_table_attach (GTK_TABLE (table), label,
00193 i+1 - 1, (i + 2 + 1), 1, 2, GTK_FILL, 0, 0, 0);
00194 gtk_widget_show(label);
00195 }
00196 }
00197 else{
00198 gtk_table_attach (GTK_TABLE (table), led_bar->segments[i],
00199 0, 1, (segments - i - 1 + 1), (segments - i + 1),
00200 0, 0, 0, 0 );
00201 if(!(i%ndecade)){
00202 label = gtk_label_new( declab = g_strdup_printf("%d",firstdecade+i/ndecade) );
00203 g_free(declab);
00204 gtk_table_attach (GTK_TABLE (table), label,
00205 1, 2, (segments - i - 2 + 1), (segments - i + 2 + 1),
00206 0, GTK_FILL, 0, 0 );
00207 gtk_widget_show(label);
00208 }
00209 }
00210 gtk_widget_show (led_bar->segments[i]);
00211 }
00212
00213 return GTK_WIDGET (led_bar);
00214 }
00215
00216 gint
00217 led_bar_get_num_segments (GtkWidget *bar)
00218 {
00219 g_return_val_if_fail (bar != NULL, 0);
00220 g_return_val_if_fail (IS_LEDBAR (bar), 0);
00221
00222 return (LEDBAR (bar)->num_segments);
00223 }
00224
00225 void
00226 led_bar_light_segments (GtkWidget *bar, gint num)
00227 {
00228 LedBar *led_bar;
00229 int i;
00230
00231 g_return_if_fail (bar != NULL);
00232 g_return_if_fail (IS_LEDBAR (bar));
00233
00234 led_bar = LEDBAR (bar);
00235 if (num == 0 && led_bar->lit_segments == 0)
00236 return;
00237 if (num < led_bar->lit_segments)
00238 {
00239 for (i = 0; i < num; i++)
00240 {
00241 gtk_led_set_state (GTK_LED (led_bar->segments[i]),
00242 GTK_STATE_SELECTED,
00243 TRUE);
00244 }
00245 }
00246 else
00247 {
00248 for (i = led_bar->lit_segments; i < num; i++)
00249 gtk_led_set_state (GTK_LED (led_bar->segments[i]),
00250 GTK_STATE_SELECTED,
00251 TRUE);
00252 }
00253 led_bar->lit_segments = i;
00254 }
00255
00256 void
00257 led_bar_unlight_segments (GtkWidget *bar, gint num)
00258 {
00259 LedBar *led_bar;
00260 int i;
00261
00262 g_return_if_fail (bar != NULL);
00263 g_return_if_fail (IS_LEDBAR (bar));
00264
00265 led_bar = LEDBAR (bar);
00266 if (led_bar->lit_segments == 0)
00267 return;
00268
00269 for (i = 0; i < num; i++) {
00270 gtk_led_set_state (GTK_LED (led_bar->segments[i]),
00271 GTK_STATE_SELECTED,
00272 FALSE);
00273 }
00274 led_bar->lit_segments -= num;
00275 if (led_bar->lit_segments < 0)
00276 led_bar->lit_segments = 0;
00277 }
00278
00279 void
00280 led_bar_light_segment (GtkWidget *bar, gint segment)
00281 {
00282 LedBar *led_bar;
00283
00284 g_return_if_fail (bar != NULL);
00285 g_return_if_fail (IS_LEDBAR (bar));
00286
00287 led_bar = LEDBAR (bar);
00288 gtk_led_set_state (GTK_LED (led_bar->segments[segment]),
00289 GTK_STATE_SELECTED,
00290 TRUE);
00291 }
00292
00293 void
00294 led_bar_unlight_segment (GtkWidget *bar, gint segment)
00295 {
00296 LedBar *led_bar;
00297
00298 g_return_if_fail (bar != NULL);
00299 g_return_if_fail (IS_LEDBAR (bar));
00300
00301 led_bar = LEDBAR (bar);
00302 gtk_led_set_state (GTK_LED (led_bar->segments[segment]),
00303 GTK_STATE_SELECTED,
00304 FALSE);
00305 }
00306
00307 void
00308 led_bar_light_percent (GtkWidget *bar, gfloat percent)
00309 {
00310 LedBar *led_bar;
00311 gint num, i;
00312
00313 g_return_if_fail (bar != NULL);
00314 g_return_if_fail (IS_LEDBAR (bar));
00315
00316 led_bar = LEDBAR (bar);
00317 num = percent * led_bar->num_segments;
00318 led_bar->lit_segments = num;
00319 for (i = 0; i < led_bar->num_segments; i++)
00320 {
00321 if (num > 0 )
00322 {
00323 if (! (GTK_LED (led_bar->segments[i])->is_on))
00324 gtk_led_set_state (GTK_LED (led_bar->segments[i]),
00325 GTK_STATE_SELECTED,
00326 TRUE);
00327 num--;
00328 } else {
00329 if (GTK_LED (led_bar->segments[i])->is_on)
00330 gtk_led_set_state (GTK_LED (led_bar->segments[i]),
00331 GTK_STATE_SELECTED,
00332 FALSE);
00333 }
00334 }
00335 }
00336
00337 void
00338 led_bar_clear (GtkWidget *bar)
00339 {
00340 LedBar *led_bar;
00341 int i;
00342
00343 g_return_if_fail (bar != NULL);
00344 g_return_if_fail (IS_LEDBAR (bar));
00345
00346 led_bar = LEDBAR (bar);
00347 for (i = 0; i < led_bar->num_segments; i++)
00348 {
00349 if (GTK_LED (led_bar->segments[i])->is_on)
00350 gtk_led_set_state (GTK_LED (led_bar->segments[i]),
00351 GTK_STATE_SELECTED,
00352 FALSE);
00353 }
00354 }
00355
00356 void
00357 led_bar_sequence_step (GtkWidget *bar)
00358 {
00359 LedBar *led_bar;
00360
00361 g_return_if_fail (bar != NULL);
00362 g_return_if_fail (IS_LEDBAR (bar));
00363
00364 led_bar = LEDBAR (bar);
00365 if (led_bar->seq_segment >= (led_bar->num_segments - 1))
00366 led_bar->seq_dir = -1;
00367 else if (led_bar->seq_segment <= 0)
00368 led_bar->seq_dir = 1;
00369
00370 led_bar_unlight_segment (GTK_WIDGET(led_bar), led_bar->seq_segment);
00371 led_bar->seq_segment += led_bar->seq_dir;
00372 led_bar_light_segment (GTK_WIDGET(led_bar), led_bar->seq_segment);
00373 }
00374
00375
00376
00377
00378