Simple ViewPort demo - Hello World
This commit is contained in:
89
ui/viewport_demo/demo.c
Normal file
89
ui/viewport_demo/demo.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
|
||||
This is an example of using a ViewPort. It is a simple Hello World program that
|
||||
allows you to move a cursor around the screen with the arrow keys. Pressing
|
||||
the back button will exit the program.
|
||||
|
||||
Uncomment the different view_port_set_orientation() calls to see how the
|
||||
orientation of the screen and keypad change.
|
||||
|
||||
The code is from the Message Queue wiki page
|
||||
(https://github.com/jamisonderek/flipper-zero-tutorials/wiki/Message-Queue) and
|
||||
also the ViewPort section of the User Interface wiki page
|
||||
(https://github.com/jamisonderek/flipper-zero-tutorials/wiki/User-Interface#viewport).
|
||||
|
||||
*/
|
||||
|
||||
#include <furi.h>
|
||||
#include <gui/gui.h>
|
||||
|
||||
typedef enum {
|
||||
MyEventTypeKey,
|
||||
MyEventTypeDone,
|
||||
} MyEventType;
|
||||
|
||||
typedef struct {
|
||||
MyEventType type; // The reason for this event.
|
||||
InputEvent input; // This data is specific to keypress data.
|
||||
} MyEvent;
|
||||
|
||||
FuriMessageQueue* queue;
|
||||
int x = 32;
|
||||
int y = 48;
|
||||
|
||||
static void my_draw_callback(Canvas* canvas, void* context) {
|
||||
UNUSED(context);
|
||||
canvas_set_font(canvas, FontPrimary);
|
||||
canvas_draw_str(canvas, 5, 30, "Hello world");
|
||||
canvas_draw_str(canvas, x, y, "^");
|
||||
}
|
||||
|
||||
static void my_input_callback(InputEvent* input_event, void* context) {
|
||||
UNUSED(context);
|
||||
if(input_event->type == InputTypeShort) {
|
||||
if(input_event->key == InputKeyLeft) x--;
|
||||
if(input_event->key == InputKeyRight) x++;
|
||||
if(input_event->key == InputKeyUp) y--;
|
||||
if(input_event->key == InputKeyDown) y++;
|
||||
if(input_event->key == InputKeyBack) {
|
||||
MyEvent event;
|
||||
event.type = MyEventTypeDone;
|
||||
furi_message_queue_put(queue, &event, FuriWaitForever);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int32_t viewport_demo_app() {
|
||||
void* my_context = NULL;
|
||||
queue = furi_message_queue_alloc(8, sizeof(MyEvent));
|
||||
|
||||
ViewPort* view_port = view_port_alloc();
|
||||
view_port_draw_callback_set(view_port, my_draw_callback, my_context);
|
||||
view_port_input_callback_set(view_port, my_input_callback, my_context);
|
||||
//view_port_set_orientation(view_port, ViewPortOrientationHorizontal);
|
||||
//view_port_set_orientation(view_port, ViewPortOrientationHorizontalFlip); // upside down
|
||||
view_port_set_orientation(view_port, ViewPortOrientationVertical); // USB/keypad bottom
|
||||
//view_port_set_orientation(view_port, ViewPortOrientationVerticalFlip); // USB/keypad top
|
||||
|
||||
Gui* gui = furi_record_open(RECORD_GUI);
|
||||
gui_add_view_port(gui, view_port, GuiLayerFullscreen);
|
||||
|
||||
MyEvent event;
|
||||
bool keep_processing = true;
|
||||
while(keep_processing) {
|
||||
if(furi_message_queue_get(queue, &event, FuriWaitForever) == FuriStatusOk) {
|
||||
if(event.type == MyEventTypeDone) {
|
||||
keep_processing = false;
|
||||
}
|
||||
} else {
|
||||
keep_processing = false;
|
||||
}
|
||||
}
|
||||
|
||||
furi_message_queue_free(queue);
|
||||
view_port_enabled_set(view_port, false);
|
||||
gui_remove_view_port(gui, view_port);
|
||||
furi_record_close(RECORD_GUI);
|
||||
view_port_free(view_port);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user