/*!
* \file
* <!--
- * Copyright 2003, 2004 Develer S.r.l. (http://www.develer.com/)
+ * Copyright 2003, 2004, 2006 Develer S.r.l. (http://www.develer.com/)
* Copyright 2000 Bernardo Innocenti <bernie@codewiz.org>
* All Rights Reserved.
* -->
/*#*
*#* $Log$
+ *#* Revision 1.7 2006/04/27 05:39:24 bernie
+ *#* Enhance text rendering to arbitrary x,y coords.
+ *#*
+ *#* Revision 1.6 2006/04/11 00:07:32 bernie
+ *#* Implemenent MF_SAVESEL flag.
+ *#*
*#* Revision 1.5 2006/03/22 09:49:51 bernie
*#* Simplifications from project_grl.
*#*
#include <avr/pgmspace.h> /* strncpy_P() */
#endif
+#if CONFIG_MENU_SMOOTH
+#include <drv/lcd_gfx.h>
+#endif
+
#if CONFIG_MENU_MENUBAR
#include "menubar.h"
#endif
#define PTRMSG(x) ((const char *)x)
#endif
-
/* Temporary fake defines for ABORT stuff... */
#define abort_top 0
#define PUSH_ABORT false
return cnt;
}
-#if 0 /* UNUSED */
-/**
- * Compute total number of visible entries, which excludes items
- * without a label.
- */
-static int menu_count_visible(const struct Menu *menu)
-{
- struct MenuItem *item;
- int visible_entries = 0;
-
- for (item = menu->items; (item->label || item->hook); ++item)
- {
- if (!(item->flags & MIF_HIDDEN))
- ++visible_entries;
- }
-
- return visible_entries;
-}
-#endif
-
#if CONFIG_MENU_MENUBAR
/*!
{
int ypos, cnt;
const char * PROGMEM title = PTRMSG(menu->title);
+ Bitmap *bm = menu->bitmap;
- ypos = menu->startrow;
+ ypos = bm->cr.ymin;
if (title)
- text_xprintf(menu->bitmap, ypos++, 0, STYLEF_UNDERLINE | STYLEF_BOLD | TEXT_CENTER | TEXT_FILL, title);
+ {
+ text_xyprintf(bm, 0, ypos, STYLEF_UNDERLINE | STYLEF_BOLD | TEXT_CENTER | TEXT_FILL, title);
+ ypos += bm->font->height;
+ }
+
+#if CONFIG_MENU_SMOOTH
+ static coord_t yoffset = 0;
+ static int old_first_item = 0;
+ static mtime_t old_time = 0; //UNUSED
+ static int speed;
+ coord_t old_ymin = bm->cr.ymin;
+
+ gfx_setClipRect(bm,
+ bm->cr.xmin, bm->cr.ymin + ypos,
+ bm->cr.xmax, bm->cr.ymax);
+
+ if (old_first_item != first_item)
+ {
+ speed = ABS(old_first_item - first_item) * 3;
+
+ if (old_first_item > first_item)
+ {
+ yoffset += speed;
+ if (yoffset > bm->font->height)
+ {
+ yoffset = 0;
+ --old_first_item;
+ }
+ }
+ else
+ {
+ yoffset -= speed;
+ if (yoffset < -bm->font->height)
+ {
+ yoffset = 0;
+ ++old_first_item;
+ }
+ }
+ first_item = old_first_item;
+ }
+ ypos += yoffset;
+#endif
for (cnt = 0; cnt < items_per_page; ++cnt)
{
if (!(item->flags & MIF_HIDDEN))
{
#if CPU_HARVARD
- text_xprintf_P
+ text_xyprintf_P
#else
- text_xprintf
+ text_xyprintf
#endif
(
- menu->bitmap, ypos++, 0,
+ bm, 0, ypos,
(first_item + cnt == selected) ? (STYLEF_INVERT | TEXT_FILL) : TEXT_FILL,
(item->flags & MIF_RAMLABEL) ? PSTR("%s%S") : PSTR("%S%S"),
PTRMSG(item->label),
( (item->flags & MIF_CHECKED) ? PSTR(":ON") : PSTR(":OFF") )
: ( (item->flags & MIF_CHECKED) ? PSTR("\04") : PSTR("") )
);
+ ypos += bm->font->height;
}
}
+
+#if CONFIG_MENU_SMOOTH
+ /* Restore old cliprect */
+ gfx_setClipRect(bm,
+ bm->cr.xmin, old_ymin,
+ bm->cr.xmax, bm->cr.ymax);
+
+ lcd_blitBitmap(&lcd_bitmap);
+#endif
}
items_per_page =
(menu->bitmap->height / menu->bitmap->font->height)
- - menu->startrow
#if CONFIG_MENU_MENUBAR
- 1 /* menu bar labels */
#endif
- (menu->title ? 1 : 0);
/* Selected item should be a visible entry */
- first_item = selected = menu_next_visible_item(menu, -1);
+ first_item = selected = menu_next_visible_item(menu, menu->selected - 1);
+
+ /* Clear screen */
+ text_clear(menu->bitmap);
for(;;)
{
while (selected >= first_item + items_per_page)
first_item = menu_next_visible_item(menu, first_item);
- /* Clear screen */
- text_clear(menu->bitmap);
menu_layout(menu, first_item, items_per_page, selected);
#if CONFIG_MENU_MENUBAR
menu_update_menubar(menu, &mb, selected);
#endif
+#if CONFIG_MENU_SMOOTH
+ key = kbd_peek();
+#else
key = kbd_get();
+#endif
if (key & K_OK)
{
/* Return userdata as result */
if (!menu->flags & MF_STICKY)
+ {
+ /* Store currently selected item before leaving. */
+ if (menu->flags & MF_SAVESEL)
+ CONST_CAST(struct Menu *, menu)->selected = selected;
return item->userdata;
+ }
+
+ /* Clear screen */
+ text_clear(menu->bitmap);
}
else if (key & K_UP)
{
}
else if (key & K_CANCEL && !(menu->flags & MF_TOPLEVEL))
{
+ /* Store currently selected item before leaving. */
+ if (menu->flags & MF_SAVESEL)
+ CONST_CAST(struct Menu *, menu)->selected = selected;
return 0;
}
}