GUI module example: 2 button dialog (#308)
* GUI: reusable module example
This commit is contained in:
106
applications/gui/modules/dialog.c
Normal file
106
applications/gui/modules/dialog.c
Normal file
@@ -0,0 +1,106 @@
|
||||
#include "dialog.h"
|
||||
#include <furi.h>
|
||||
|
||||
struct Dialog {
|
||||
View* view;
|
||||
void* context;
|
||||
DialogResultCallback callback;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
const char* header_text;
|
||||
const char* text;
|
||||
const char* left_text;
|
||||
const char* right_text;
|
||||
} DialogModel;
|
||||
|
||||
static void dialog_view_draw_callback(Canvas* canvas, void* _model) {
|
||||
DialogModel* model = _model;
|
||||
// Prepare canvas
|
||||
canvas_clear(canvas);
|
||||
canvas_set_color(canvas, ColorBlack);
|
||||
// Draw header
|
||||
canvas_set_font(canvas, FontPrimary);
|
||||
canvas_draw_str(canvas, 2, 10, model->header_text);
|
||||
// Draw text
|
||||
canvas_set_font(canvas, FontSecondary);
|
||||
canvas_draw_str(canvas, 5, 22, model->text);
|
||||
// Draw buttons
|
||||
uint8_t bottom_base_line = canvas_height(canvas) - 2;
|
||||
canvas_set_font(canvas, FontPrimary);
|
||||
canvas_draw_str(canvas, 5, bottom_base_line, model->left_text);
|
||||
canvas_draw_str(canvas, 69, bottom_base_line, model->right_text);
|
||||
}
|
||||
|
||||
static bool dialog_view_input_callback(InputEvent* event, void* context) {
|
||||
Dialog* dialog = context;
|
||||
// Process key presses only
|
||||
if(event->state && dialog->callback) {
|
||||
if(event->input == InputLeft) {
|
||||
dialog->callback(DialogResultLeft, dialog->context);
|
||||
} else if(event->input == InputRight) {
|
||||
dialog->callback(DialogResultRight, dialog->context);
|
||||
}
|
||||
}
|
||||
// All input events consumed
|
||||
return true;
|
||||
}
|
||||
|
||||
Dialog* dialog_alloc() {
|
||||
Dialog* dialog = furi_alloc(sizeof(Dialog));
|
||||
dialog->view = view_alloc();
|
||||
view_set_context(dialog->view, dialog);
|
||||
view_allocate_model(dialog->view, ViewModelTypeLockFree, sizeof(DialogModel));
|
||||
view_set_draw_callback(dialog->view, dialog_view_draw_callback);
|
||||
view_set_input_callback(dialog->view, dialog_view_input_callback);
|
||||
return dialog;
|
||||
}
|
||||
|
||||
void dialog_free(Dialog* dialog) {
|
||||
furi_assert(dialog);
|
||||
view_free(dialog->view);
|
||||
free(dialog);
|
||||
}
|
||||
|
||||
View* dialog_get_view(Dialog* dialog) {
|
||||
furi_assert(dialog);
|
||||
return dialog->view;
|
||||
}
|
||||
|
||||
void dialog_set_result_callback(Dialog* dialog, DialogResultCallback callback) {
|
||||
furi_assert(dialog);
|
||||
dialog->callback = callback;
|
||||
}
|
||||
|
||||
void dialog_set_context(Dialog* dialog, void* context) {
|
||||
furi_assert(dialog);
|
||||
dialog->context = context;
|
||||
}
|
||||
|
||||
void dialog_set_header_text(Dialog* dialog, const char* text) {
|
||||
furi_assert(dialog);
|
||||
furi_assert(text);
|
||||
with_view_model(
|
||||
dialog->view, (DialogModel * model) { model->header_text = text; });
|
||||
}
|
||||
|
||||
void dialog_set_text(Dialog* dialog, const char* text) {
|
||||
furi_assert(dialog);
|
||||
furi_assert(text);
|
||||
with_view_model(
|
||||
dialog->view, (DialogModel * model) { model->text = text; });
|
||||
}
|
||||
|
||||
void dialog_set_left_button_text(Dialog* dialog, const char* text) {
|
||||
furi_assert(dialog);
|
||||
furi_assert(text);
|
||||
with_view_model(
|
||||
dialog->view, (DialogModel * model) { model->left_text = text; });
|
||||
}
|
||||
|
||||
void dialog_set_right_button_text(Dialog* dialog, const char* text) {
|
||||
furi_assert(dialog);
|
||||
furi_assert(text);
|
||||
with_view_model(
|
||||
dialog->view, (DialogModel * model) { model->right_text = text; });
|
||||
}
|
69
applications/gui/modules/dialog.h
Normal file
69
applications/gui/modules/dialog.h
Normal file
@@ -0,0 +1,69 @@
|
||||
#pragma once
|
||||
|
||||
#include <gui/view.h>
|
||||
|
||||
/* Dialog anonymous structure */
|
||||
typedef struct Dialog Dialog;
|
||||
|
||||
/* Dialog result */
|
||||
typedef enum {
|
||||
DialogResultLeft,
|
||||
DialogResultRight,
|
||||
} DialogResult;
|
||||
|
||||
/* Dialog result callback type
|
||||
* @warning comes from GUI thread
|
||||
*/
|
||||
typedef void (*DialogResultCallback)(DialogResult result, void* context);
|
||||
|
||||
/* Allocate and initialize dialog
|
||||
* This dialog used to ask simple questions like Yes/
|
||||
*/
|
||||
Dialog* dialog_alloc();
|
||||
|
||||
/* Deinitialize and free dialog
|
||||
* @param dialog - Dialog instance
|
||||
*/
|
||||
void dialog_free(Dialog* dialog);
|
||||
|
||||
/* Get dialog view
|
||||
* @param dialog - Dialog instance
|
||||
* @return View instance that can be used for embedding
|
||||
*/
|
||||
View* dialog_get_view(Dialog* dialog);
|
||||
|
||||
/* Set dialog header text
|
||||
* @param dialog - Dialog instance
|
||||
* @param text - text to be shown
|
||||
*/
|
||||
void dialog_set_result_callback(Dialog* dialog, DialogResultCallback callback);
|
||||
|
||||
/* Set dialog header text
|
||||
* @param dialog - Dialog instance
|
||||
* @param context - context pointer, will be passed to result callback
|
||||
*/
|
||||
void dialog_set_context(Dialog* dialog, void* context);
|
||||
|
||||
/* Set dialog header text
|
||||
* @param dialog - Dialog instance
|
||||
* @param text - text to be shown
|
||||
*/
|
||||
void dialog_set_header_text(Dialog* dialog, const char* text);
|
||||
|
||||
/* Set dialog text
|
||||
* @param dialog - Dialog instance
|
||||
* @param text - text to be shown
|
||||
*/
|
||||
void dialog_set_text(Dialog* dialog, const char* text);
|
||||
|
||||
/* Set left button text
|
||||
* @param dialog - Dialog instance
|
||||
* @param text - text to be shown
|
||||
*/
|
||||
void dialog_set_left_button_text(Dialog* dialog, const char* text);
|
||||
|
||||
/* Set right button text
|
||||
* @param dialog - Dialog instance
|
||||
* @param text - text to be shown
|
||||
*/
|
||||
void dialog_set_right_button_text(Dialog* dialog, const char* text);
|
Reference in New Issue
Block a user