Import into DevLib.
[bertos.git] / gui / levelbar.c
diff --git a/gui/levelbar.c b/gui/levelbar.c
new file mode 100755 (executable)
index 0000000..591d257
--- /dev/null
@@ -0,0 +1,106 @@
+/**
+ * \file
+ * Copyright 2004, 2006 Develer S.r.l. (http://www.develer.com/)
+ * This file is part of DevLib - See README.devlib for information.
+ *
+ * \brief Graphics user interface element to display a level bar.
+ *
+ * \version $Id$
+ * \author Stefano Fedrigo <aleph@develer.com>
+ */
+
+#include "levelbar.h"
+
+
+/**
+ * Initialize the LevelBar widget with the bitmap associated,
+ * the value range and the coordinates in the bitmap.
+ * \note The levelbar should be at least 5 pixels wide and high
+ *       for correct borders drawing. No check is done on this.
+ */
+void lbar_init(struct LevelBar *lb, struct Bitmap *bmp, int type, int min, int max, int pos,
+               coord_t x1, coord_t y1, coord_t x2, coord_t y2)
+{
+       lb->bitmap = bmp;
+       lb->type = type;
+       lb->min = min;
+       lb->max = max;
+       lb->pos = pos;
+       lb->x1 = x1;
+       lb->y1 = y1;
+       lb->x2 = x2;
+       lb->y2 = y2;
+}
+
+
+/**
+ * Set the level.
+ */
+void lbar_setLevel(struct LevelBar *lb, int level)
+{
+       if (level < lb->min)
+               level = lb->min;
+       if (level > lb->max)
+               level = lb->max;
+
+       lb->pos = level;
+}
+
+
+/**
+ * Get current level.
+ */
+int lbar_getLevel(struct LevelBar *lb)
+{
+       return lb->pos;
+}
+
+
+/**
+ * Change level with respect to previous value
+ * (delta can be negative).
+ */
+void lbar_changeLevel(struct LevelBar *lb, int delta)
+{
+       lbar_setLevel(lb, lb->pos + delta);
+}
+
+
+/**
+ * Change the top limit.
+ */
+void lbar_setMax(struct LevelBar *lb, int max)
+{
+       lb->max = max;
+}
+
+
+/**
+ * Render the LevelBar on the bitmap.
+ */
+void lbar_draw(struct LevelBar *lb)
+{
+#define BORDERW 1
+#define BORDERH 1
+
+       /* Compute filled bar length in pixels */
+       int totlen = (lb->type & LBAR_HORIZONTAL) ? lb->x2 - lb->x1 - BORDERW*4 : lb->y2 - lb->y1 - BORDERH*4;
+       int range  = lb->max - lb->min;
+       int barlen = ((long)(lb->pos - lb->min) * (long)totlen + range - 1) / range;
+
+       // Draw border
+       gfx_rectDraw(lb->bitmap, lb->x1, lb->y1, lb->x2, lb->y2);
+
+       // Clear inside
+       gfx_rectClear(lb->bitmap, lb->x1 + BORDERW, lb->y1 + BORDERH, lb->x2 - BORDERW, lb->y2 - BORDERH);
+
+       // Draw bar
+       if (lb->type & LBAR_HORIZONTAL)
+               gfx_rectFill(lb->bitmap,
+                               lb->x1 + BORDERW*2, lb->y1 + BORDERH*2,
+                               lb->x1 + BORDERW*2 + barlen, lb->y2 - BORDERH*2);
+       else
+               gfx_rectFill(lb->bitmap,
+                               lb->x1 + BORDERW*2, lb->y2 - BORDERH*2 - barlen,
+                               lb->x2 - BORDERW*2, lb->y2 - BORDERH*2);
+}