add a "popup" menu variant (for the reflow profile editor)
This commit is contained in:
@@ -14,7 +14,8 @@
|
||||
#include "scene_menu.h"
|
||||
|
||||
struct Priv {
|
||||
Scene_paint_t basePaint;
|
||||
int _placeholder;
|
||||
//Scene_paint_t basePaint;
|
||||
};
|
||||
|
||||
static struct SceneEvent onSelect(struct MenuScene *self) {
|
||||
@@ -27,11 +28,13 @@ static struct SceneEvent onSelect(struct MenuScene *self) {
|
||||
opts->max = 350;
|
||||
return SceneEvent_OpenChild(NewScene_Number(opts), 0);
|
||||
}
|
||||
|
||||
if (self->selected == 1) {
|
||||
else if (self->selected == 1) {
|
||||
fire_enable(!fire_enabled());
|
||||
return SceneEvent_Repaint();
|
||||
}
|
||||
else if (self->selected == 2) {
|
||||
return SceneEvent_OpenChild(NewScene_PopupTest(), 1);
|
||||
}
|
||||
|
||||
return SceneEvent_None();
|
||||
}
|
||||
@@ -60,12 +63,12 @@ void print_labels(struct MenuItem *items) {
|
||||
} else {
|
||||
strncpy(items[1].label, "▶START", MENUITEM_LABEL_LEN);
|
||||
}
|
||||
|
||||
strncpy(items[2].label, "▶Item with popup", MENUITEM_LABEL_LEN);
|
||||
}
|
||||
|
||||
static void paint(struct MenuScene *self)
|
||||
{
|
||||
struct Priv *priv = self->extra;
|
||||
|
||||
print_labels(self->items);
|
||||
|
||||
LCD_clearDisplay(0);
|
||||
@@ -87,27 +90,26 @@ static void paint(struct MenuScene *self)
|
||||
|
||||
LCD_setBitmap(img, XLINE/2-24/2, 26, false, BLACK);
|
||||
|
||||
priv->basePaint((struct Scene *) self);
|
||||
MenuScene_Paint(self);
|
||||
}
|
||||
|
||||
struct Scene *NewScene_MenuTest() {
|
||||
struct MenuItem *items = calloc(2, sizeof(struct MenuItem));
|
||||
struct Scene *NewScene_MenuManual() {
|
||||
struct MenuItem *items = calloc(3, sizeof(struct MenuItem));
|
||||
|
||||
print_labels(items);
|
||||
|
||||
struct MenuScene * scene = NewScene_Menu(items, 2);
|
||||
struct MenuScene * scene = NewScene_Menu(items, 3);
|
||||
scene->onSelect = onSelect;
|
||||
|
||||
scene->x = XLINE;
|
||||
scene->ncols = 8;
|
||||
scene->ncols = 7;
|
||||
|
||||
// private data added by the subclass
|
||||
struct Priv *priv = calloc(1, sizeof(struct Priv));
|
||||
priv->basePaint = scene->base.paint;
|
||||
scene->base.paint = (Scene_paint_t) paint;
|
||||
|
||||
struct Priv *priv = calloc(1, sizeof(struct Priv));
|
||||
scene->extra = priv;
|
||||
scene->extra_deinit = (Scene_deinit_t) priv_deinit;
|
||||
scene->wraparound = true;
|
||||
|
||||
// add a child return handler (base does not use this)
|
||||
scene->base.onChildReturn = (Scene_onChildReturn_t) onChildReturn;
|
||||
|
||||
@@ -28,7 +28,7 @@ static void paint(struct MenuScene *self)
|
||||
#define HSCROLL_START_MS 750
|
||||
#define HSCROLL_MS 250
|
||||
|
||||
static void paint(struct MenuScene *self)
|
||||
void MenuScene_Paint(struct MenuScene *self)
|
||||
{
|
||||
LCD_setRect(self->x, self->y, self->x + self->ncols*6, self->y + self->nlines*9, 1, WHITE);
|
||||
|
||||
@@ -46,7 +46,7 @@ static void paint(struct MenuScene *self)
|
||||
}
|
||||
LCD_setStrEx(self->items[i].label, self->x + 1, self->y + row * 9 + 1, !selected, (struct TextStyle) {
|
||||
.bg = selected,
|
||||
.nowrap = 1,
|
||||
.limit = self->ncols,
|
||||
.skip = shift,
|
||||
});
|
||||
}
|
||||
@@ -143,7 +143,7 @@ static void deinit(struct MenuScene *self)
|
||||
struct MenuScene *NewScene_Menu(struct MenuItem *items, size_t items_len) {
|
||||
struct MenuScene *scene = calloc(1, sizeof(struct MenuScene));
|
||||
|
||||
scene->base.paint = (Scene_paint_t) paint;
|
||||
scene->base.paint = (Scene_paint_t) MenuScene_Paint;
|
||||
scene->base.onInput = (Scene_onInput_t) onInput;
|
||||
scene->base.deinit = (Scene_deinit_t) deinit;
|
||||
scene->base.onTick = (Scene_onTick_t) onTick;
|
||||
|
||||
@@ -78,4 +78,6 @@ struct MenuScene {
|
||||
*/
|
||||
struct MenuScene *NewScene_Menu(struct MenuItem *items, size_t items_len);
|
||||
|
||||
void MenuScene_Paint(struct MenuScene *self);
|
||||
|
||||
#endif //REFLOWER_SCENE_MENU_H
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <common_utils/utils.h>
|
||||
|
||||
#include "analog.h"
|
||||
#include "firehazard.h"
|
||||
#include "graphics/bitmaps.h"
|
||||
#include "liquid.h"
|
||||
#include "graphics/drawing.h"
|
||||
#include "graphics/display_spec.h"
|
||||
|
||||
#include "scenes.h"
|
||||
#include "scene_menu.h"
|
||||
|
||||
static void paint(struct MenuScene *self)
|
||||
{
|
||||
LCD_setShadeOverlay();
|
||||
|
||||
// frame around the menu items
|
||||
LCD_setRect(self->x - 3, self->y - 3, self->x + self->ncols*6 + 3, self->y + self->nlines * 9 + 2, true, WHITE);
|
||||
LCD_setRect(self->x - 2, self->y - 2, self->x + self->ncols*6 + 2, self->y + self->nlines * 9 + 1, false, BLACK);
|
||||
MenuScene_Paint(self);
|
||||
}
|
||||
|
||||
struct MenuScene *NewScene_PopupMenu(struct MenuItem *items, size_t items_len)
|
||||
{
|
||||
struct MenuScene * scene = NewScene_Menu(items, items_len);
|
||||
scene->x = 12;
|
||||
scene->y = 6;
|
||||
scene->ncols = 10;
|
||||
scene->nlines = MIN(items_len, 4);
|
||||
scene->base.paint = (Scene_paint_t) paint;
|
||||
return scene;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include "liquid.h"
|
||||
|
||||
#include "scenes.h"
|
||||
#include "scene_menu.h"
|
||||
|
||||
static struct SceneEvent onSelect(struct MenuScene *self) {
|
||||
return SceneEvent_Close(0, NULL);
|
||||
}
|
||||
|
||||
struct Scene *NewScene_PopupTest() {
|
||||
struct MenuItem *items = calloc(5, sizeof(struct MenuItem));
|
||||
|
||||
strncpy(items[0].label, "Item 1", MENUITEM_LABEL_LEN);
|
||||
strncpy(items[1].label, "Item Two", MENUITEM_LABEL_LEN);
|
||||
strncpy(items[2].label, "Item Three hereee", MENUITEM_LABEL_LEN);
|
||||
strncpy(items[3].label, "FOURTH", MENUITEM_LABEL_LEN);
|
||||
strncpy(items[4].label, "EXTRA SECRET FIFTH ITEM", MENUITEM_LABEL_LEN);
|
||||
|
||||
struct MenuScene * scene = NewScene_PopupMenu(items, 5);
|
||||
scene->onSelect = onSelect;
|
||||
|
||||
return (struct Scene *) scene;
|
||||
}
|
||||
@@ -18,13 +18,14 @@ struct RootScene {
|
||||
|
||||
static struct SceneEvent init(struct RootScene *self)
|
||||
{
|
||||
return SceneEvent_OpenChild(NewScene_Boot(), 1);
|
||||
return SceneEvent_OpenChild(NewScene_MenuManual(), 0);
|
||||
// return SceneEvent_OpenChild(NewScene_Boot(), 1); // TODO swap
|
||||
}
|
||||
|
||||
static struct SceneEvent onChildReturn(struct RootScene *self, uint32_t tag, int32_t status, void *data)
|
||||
{
|
||||
if (tag == 1) {
|
||||
return SceneEvent_OpenChild(NewScene_MenuTest(), 0);
|
||||
return SceneEvent_OpenChild(NewScene_MenuManual(), 0);
|
||||
}
|
||||
|
||||
// this should be unreachable
|
||||
|
||||
@@ -11,9 +11,13 @@
|
||||
|
||||
struct Scene *NewScene_Root(void);
|
||||
struct Scene *NewScene_Boot(void);
|
||||
struct Scene *NewScene_MenuTest(void);
|
||||
struct Scene *NewScene_MenuManual(void);
|
||||
|
||||
struct Scene *NewScene_PopupTest();
|
||||
|
||||
#include "scene_menu.h"
|
||||
#include "scene_number.h"
|
||||
|
||||
struct MenuScene *NewScene_PopupMenu(struct MenuItem *items, size_t items_len);
|
||||
|
||||
#endif //REFLOWER_SCENES_H
|
||||
|
||||
Reference in New Issue
Block a user