gtkledbar.c

Go to the documentation of this file.
00001 /*
00002  * $Id: gtkledbar.c,v 1.2 2002/11/16 01:51:58 zahl Exp $
00003  * GTKEXT - Extensions to The GIMP Toolkit
00004  * Copyright (C) 1998 Gregory McLean
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Library General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Library General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Library General Public
00017  * License along with this library; if not, write to the Free
00018  * Software Foundation, Inc., 59 Temple Place - Suite 330, Cambridge, MA 
00019  * 02139, USA.
00020  *
00021  * Eye candy!
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 ) /* horiz */
00088       table = gtk_table_new (1, segments, FALSE);
00089   else /* vert */
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 ) /* horiz */
00114           gtk_table_attach (GTK_TABLE (table), led_bar->segments[i],
00115                                      i, (i + 1), 0, 1, 0, 0, 0, 0);
00116       else /* vert */
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 ) /* horiz */
00146       table = gtk_table_new (2, segments+2, FALSE);
00147   else /* vert */
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 ) /* horiz */
00158       gtk_table_attach (GTK_TABLE (table), led0,
00159                         0, 1, 0, 1, 0, 0, 0, 0);
00160   else /* vert */
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 ){ /* horiz */
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{ /* vert */
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 /* EOF */
00376 
00377 
00378 

Generated on Sat Apr 1 09:04:12 2006 for GXSM by  doxygen 1.4.6