mirror of
https://github.com/netfun2000/lcd4linux.git
synced 2026-02-27 09:44:34 +08:00
dynamic properties for Icon widget
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@744 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
This commit is contained in:
@@ -343,7 +343,8 @@ int drv_generic_graphic_icon_draw(WIDGET * W)
|
||||
unsigned char *bitmap = Icon->bitmap + YRES * Icon->curmap;
|
||||
int layer, row, col;
|
||||
int x, y;
|
||||
|
||||
int visible;
|
||||
|
||||
layer = W->layer;
|
||||
row = YRES * W->row;
|
||||
col = XRES * W->col;
|
||||
@@ -360,13 +361,16 @@ int drv_generic_graphic_icon_draw(WIDGET * W)
|
||||
/* maybe grow layout framebuffer */
|
||||
drv_generic_graphic_resizeFB(row + YRES, col + XRES);
|
||||
|
||||
/* Icon visible? */
|
||||
visible = P2N(&Icon->visible) > 0;
|
||||
|
||||
/* render icon */
|
||||
for (y = 0; y < YRES; y++) {
|
||||
int mask = 1 << XRES;
|
||||
for (x = 0; x < XRES; x++) {
|
||||
int i = (row + y) * LCOLS + col + x;
|
||||
mask >>= 1;
|
||||
if (Icon->visible) {
|
||||
if (visible) {
|
||||
if (bitmap[y] & mask)
|
||||
drv_generic_graphic_FB[layer][i] = fg;
|
||||
else
|
||||
@@ -376,10 +380,10 @@ int drv_generic_graphic_icon_draw(WIDGET * W)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* flush area */
|
||||
drv_generic_graphic_blit(row, col, YRES, XRES);
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
+6
-2
@@ -449,6 +449,7 @@ int drv_generic_text_icon_draw(WIDGET * W)
|
||||
static int icon_counter = 0;
|
||||
WIDGET_ICON *Icon = W->data;
|
||||
int row, col;
|
||||
int visible;
|
||||
int invalidate = 0;
|
||||
unsigned char ascii;
|
||||
|
||||
@@ -473,8 +474,11 @@ int drv_generic_text_icon_draw(WIDGET * W)
|
||||
Icon->ascii = CHAR0 + CHARS - icon_counter;
|
||||
}
|
||||
|
||||
/* Icon visible? */
|
||||
visible = P2N(&Icon->visible) > 0;
|
||||
|
||||
/* maybe redefine icon */
|
||||
if (Icon->curmap != Icon->prvmap && Icon->visible) {
|
||||
if (Icon->curmap != Icon->prvmap && visible) {
|
||||
Icon->prvmap = Icon->curmap;
|
||||
if (drv_generic_text_real_defchar)
|
||||
drv_generic_text_real_defchar(Icon->ascii, Icon->bitmap + YRES * Icon->curmap);
|
||||
@@ -482,7 +486,7 @@ int drv_generic_text_icon_draw(WIDGET * W)
|
||||
}
|
||||
|
||||
/* use blank if invisible */
|
||||
ascii = Icon->visible ? Icon->ascii : ' ';
|
||||
ascii = visible ? Icon->ascii : ' ';
|
||||
|
||||
/* transfer icon into layout buffer */
|
||||
LayoutFB[row * LCOLS + col] = ascii;
|
||||
|
||||
+11
-39
@@ -41,7 +41,7 @@
|
||||
#include "debug.h"
|
||||
#include "cfg.h"
|
||||
#include "qprintf.h"
|
||||
#include "evaluator.h"
|
||||
#include "property.h"
|
||||
#include "timer.h"
|
||||
#include "widget.h"
|
||||
#include "widget_icon.h"
|
||||
@@ -94,31 +94,13 @@ void widget_icon_update(void *Self)
|
||||
{
|
||||
WIDGET *W = (WIDGET *) Self;
|
||||
WIDGET_ICON *Icon = W->data;
|
||||
RESULT result = { 0, 0, 0, NULL };
|
||||
|
||||
/* process the parent only */
|
||||
if (W->parent == NULL) {
|
||||
|
||||
/* evaluate expressions */
|
||||
Icon->speed = 100;
|
||||
if (Icon->speed_tree != NULL) {
|
||||
Eval(Icon->speed_tree, &result);
|
||||
Icon->speed = R2N(&result);
|
||||
if (Icon->speed <= 0)
|
||||
Icon->speed = 0;
|
||||
else if (Icon->speed < 10)
|
||||
Icon->speed = 10;
|
||||
DelResult(&result);
|
||||
}
|
||||
|
||||
Icon->visible = 1;
|
||||
if (Icon->visible_tree != NULL) {
|
||||
Eval(Icon->visible_tree, &result);
|
||||
Icon->visible = R2N(&result);
|
||||
if (Icon->visible < 0)
|
||||
Icon->visible = 0;
|
||||
DelResult(&result);
|
||||
}
|
||||
/* evaluate properties */
|
||||
property_eval(&Icon->speed);
|
||||
property_eval(&Icon->visible);
|
||||
|
||||
/* rotate icon bitmap */
|
||||
Icon->curmap++;
|
||||
@@ -131,8 +113,8 @@ void widget_icon_update(void *Self)
|
||||
W->class->draw(W);
|
||||
|
||||
/* add a new one-shot timer */
|
||||
if (Icon->speed > 0) {
|
||||
timer_add(widget_icon_update, Self, Icon->speed, 1);
|
||||
if (P2N(&Icon->speed) > 0) {
|
||||
timer_add(widget_icon_update, Self, P2N(&Icon->speed), 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,19 +137,9 @@ int widget_icon_init(WIDGET * Self)
|
||||
Icon = malloc(sizeof(WIDGET_ICON));
|
||||
memset(Icon, 0, sizeof(WIDGET_ICON));
|
||||
|
||||
/* get raw expressions (we evaluate them ourselves) */
|
||||
Icon->speed_expr = cfg_get_raw(section, "speed", NULL);
|
||||
Icon->visible_expr = cfg_get_raw(section, "visible", NULL);
|
||||
|
||||
/* sanity check */
|
||||
if (Icon->speed_expr == NULL || *Icon->speed_expr == '\0') {
|
||||
error("Icon %s has no speed, using '100'", Self->name);
|
||||
Icon->speed_expr = "100";
|
||||
}
|
||||
|
||||
/* compile'em */
|
||||
Compile(Icon->speed_expr, &Icon->speed_tree);
|
||||
Compile(Icon->visible_expr, &Icon->visible_tree);
|
||||
/* load properties */
|
||||
property_load(section, "speed", "100", &Icon->speed);
|
||||
property_load(section, "visible", "1", &Icon->visible);
|
||||
|
||||
/* read bitmap */
|
||||
widget_icon_read_bitmap(section, Icon);
|
||||
@@ -204,8 +176,8 @@ int widget_icon_quit(WIDGET * Self)
|
||||
if (Self->parent == NULL) {
|
||||
if (Self->data) {
|
||||
WIDGET_ICON *Icon = Self->data;
|
||||
DelTree(Icon->speed_tree);
|
||||
DelTree(Icon->visible_tree);
|
||||
property_free(&Icon->speed);
|
||||
property_free(&Icon->visible);
|
||||
if (Icon->bitmap)
|
||||
free(Icon->bitmap);
|
||||
free(Self->data);
|
||||
|
||||
+7
-6
@@ -28,13 +28,13 @@
|
||||
#ifndef _WIDGET_ICON_H_
|
||||
#define _WIDGET_ICON_H_
|
||||
|
||||
|
||||
#include "property.h"
|
||||
|
||||
|
||||
typedef struct WIDGET_ICON {
|
||||
char *speed_expr; /* expression for update interval */
|
||||
void *speed_tree; /* pre-compiled expression for update interval */
|
||||
int speed; /* update interval (msec) */
|
||||
char *visible_expr; /* expression for visibility */
|
||||
void *visible_tree; /* pre-compiled expression for visibility */
|
||||
int visible; /* icon visible? */
|
||||
PROPERTY speed; /* update interval (msec) */
|
||||
PROPERTY visible; /* icon visible? */
|
||||
int ascii; /* ascii code of icon (depends on the driver) */
|
||||
int curmap; /* current bitmap sequence */
|
||||
int prvmap; /* previous bitmap sequence */
|
||||
@@ -42,6 +42,7 @@ typedef struct WIDGET_ICON {
|
||||
unsigned char *bitmap; /* bitmaps of (animated) icon */
|
||||
} WIDGET_ICON;
|
||||
|
||||
|
||||
extern WIDGET_CLASS Widget_Icon;
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user