Subghz app example (#365)
* Gui: ported submenu and view_dispatcher_remove_view from iButton branch * App gui-test: use backported submenu api * App subghz: initial commit * App subghz: syntax fix * App gui-test: fix submenu callback * App subghz: add subfolders to build * Gui view: c++ verison of with_view_model * Subghz app: simple spectrum settings view * Subghz app: add spectrum settings view to view manager * Subghz app: spectrum settings scene Co-authored-by: coreglitch <mail@s3f.ru>
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
|
||||
struct SubmenuItem {
|
||||
const char* label;
|
||||
uint32_t index;
|
||||
SubmenuItemCallback callback;
|
||||
void* callback_context;
|
||||
};
|
||||
@@ -108,6 +109,7 @@ Submenu* submenu_alloc() {
|
||||
submenu->view, (SubmenuModel * model) {
|
||||
SubmenuItemArray_init(model->items);
|
||||
model->position = 0;
|
||||
model->window_position = 0;
|
||||
return true;
|
||||
});
|
||||
|
||||
@@ -134,6 +136,7 @@ View* submenu_get_view(Submenu* submenu) {
|
||||
SubmenuItem* submenu_add_item(
|
||||
Submenu* submenu,
|
||||
const char* label,
|
||||
uint32_t index,
|
||||
SubmenuItemCallback callback,
|
||||
void* callback_context) {
|
||||
SubmenuItem* item = NULL;
|
||||
@@ -144,6 +147,7 @@ SubmenuItem* submenu_add_item(
|
||||
submenu->view, (SubmenuModel * model) {
|
||||
item = SubmenuItemArray_push_new(model->items);
|
||||
item->label = label;
|
||||
item->index = index;
|
||||
item->callback = callback;
|
||||
item->callback_context = callback_context;
|
||||
return true;
|
||||
@@ -152,6 +156,18 @@ SubmenuItem* submenu_add_item(
|
||||
return item;
|
||||
}
|
||||
|
||||
void submenu_clean(Submenu* submenu) {
|
||||
furi_assert(submenu);
|
||||
|
||||
with_view_model(
|
||||
submenu->view, (SubmenuModel * model) {
|
||||
SubmenuItemArray_clean(model->items);
|
||||
model->position = 0;
|
||||
model->window_position = 0;
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
void submenu_process_up(Submenu* submenu) {
|
||||
with_view_model(
|
||||
submenu->view, (SubmenuModel * model) {
|
||||
@@ -162,7 +178,9 @@ void submenu_process_up(Submenu* submenu) {
|
||||
}
|
||||
} else {
|
||||
model->position = SubmenuItemArray_size(model->items) - 1;
|
||||
model->window_position = model->position - 3;
|
||||
if(model->position > 3) {
|
||||
model->window_position = model->position - 3;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
@@ -197,6 +215,6 @@ void submenu_process_ok(Submenu* submenu) {
|
||||
});
|
||||
|
||||
if(item && item->callback) {
|
||||
item->callback(item->callback_context);
|
||||
item->callback(item->callback_context, item->index);
|
||||
}
|
||||
}
|
@@ -1,10 +1,14 @@
|
||||
#pragma once
|
||||
#include <gui/view.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Submenu anonymous structure */
|
||||
typedef struct Submenu Submenu;
|
||||
typedef struct SubmenuItem SubmenuItem;
|
||||
typedef void (*SubmenuItemCallback)(void* context);
|
||||
typedef void (*SubmenuItemCallback)(void* context, uint32_t index);
|
||||
|
||||
/* Allocate and initialize submenu
|
||||
* This submenu is used to select one option
|
||||
@@ -25,6 +29,7 @@ View* submenu_get_view(Submenu* submenu);
|
||||
/* Add item to submenu
|
||||
* @param submenu - Submenu instance
|
||||
* @param label - menu item label
|
||||
* @param index - menu item index, used for callback, may be the same with other items
|
||||
* @param callback - menu item callback
|
||||
* @param callback_context - menu item callback context
|
||||
* @return SubmenuItem instance that can be used to modify or delete that item
|
||||
@@ -32,5 +37,15 @@ View* submenu_get_view(Submenu* submenu);
|
||||
SubmenuItem* submenu_add_item(
|
||||
Submenu* submenu,
|
||||
const char* label,
|
||||
uint32_t index,
|
||||
SubmenuItemCallback callback,
|
||||
void* callback_context);
|
||||
void* callback_context);
|
||||
|
||||
/* Remove all items from submenu
|
||||
* @param submenu - Submenu instance
|
||||
*/
|
||||
void submenu_clean(Submenu* submenu);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
@@ -141,6 +141,18 @@ void* view_get_model(View* view);
|
||||
*/
|
||||
void view_commit_model(View* view, bool update);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define with_view_model_cpp(view, type, var, function_body) \
|
||||
{ \
|
||||
type* p = static_cast<type*>(view_get_model(view)); \
|
||||
bool update = [&](type * var) function_body(p); \
|
||||
view_commit_model(view, update); \
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* With clause for view model
|
||||
* @param view, View instance pointer
|
||||
@@ -153,7 +165,4 @@ void view_commit_model(View* view, bool update);
|
||||
bool update = ({ bool __fn__ function_body __fn__; })(p); \
|
||||
view_commit_model(view, update); \
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
@@ -42,6 +42,17 @@ void view_dispatcher_add_view(ViewDispatcher* view_dispatcher, uint32_t view_id,
|
||||
view_set_dispatcher(view, view_dispatcher);
|
||||
}
|
||||
|
||||
void view_dispatcher_remove_view(ViewDispatcher* view_dispatcher, uint32_t view_id) {
|
||||
furi_assert(view_dispatcher);
|
||||
|
||||
// Disable the view if it is active
|
||||
if(view_dispatcher->current_view == *ViewDict_get(view_dispatcher->views, view_id)) {
|
||||
view_dispatcher_set_current_view(view_dispatcher, NULL);
|
||||
}
|
||||
// Remove view
|
||||
ViewDict_erase(view_dispatcher->views, view_id);
|
||||
}
|
||||
|
||||
void view_dispatcher_switch_to_view(ViewDispatcher* view_dispatcher, uint32_t view_id) {
|
||||
furi_assert(view_dispatcher);
|
||||
if(view_id == VIEW_NONE) {
|
||||
|
@@ -33,6 +33,12 @@ void view_dispatcher_free(ViewDispatcher* view_dispatcher);
|
||||
*/
|
||||
void view_dispatcher_add_view(ViewDispatcher* view_dispatcher, uint32_t view_id, View* view);
|
||||
|
||||
/* Remove view from ViewDispatcher
|
||||
* @param view_dispatcher, ViewDispatcher instance
|
||||
* @param view_id, View id to remove
|
||||
*/
|
||||
void view_dispatcher_remove_view(ViewDispatcher* view_dispatcher, uint32_t view_id);
|
||||
|
||||
/* Switch to View
|
||||
* @param view_dispatcher, ViewDispatcher instance
|
||||
* @param view_id, View id to register
|
||||
|
Reference in New Issue
Block a user