diff options
author | SG <who.just.the.doctor@gmail.com> | 2021-06-15 14:01:56 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-15 14:01:56 +0300 |
commit | 0b14db4fb33d4466a02c0c85b01321bece5d6537 (patch) | |
tree | c2420528bad84a7e9930e7f17f8d95a300e9a43f /applications/scened-app-example | |
parent | 3a2121bbb8f26d1c790e8bf1d6c53e44892486a8 (diff) |
C++ apps: templated scene controller (#517)
* C++ apps: templated scene controller
* templated app: fix type names
* templated app: text store component
* Applications: add "Templated Scene" application
* templated app: refractoring
* Gui module byte input: fix docs
* templated app: new byte input scene
* templated app: dialog ex view module
* templated app: popup view module
* templated app: dialog-ex view module, fix docs
* templated app: text input view module
* Gui module text input: fix docs
* Furi: duplicated include
* templated app: record holder (controller) class
* templated app: view modules can now be accessed via cast
* templated app: remove unused includes
* templated app: fix return code
Diffstat (limited to 'applications/scened-app-example')
7 files changed, 191 insertions, 0 deletions
diff --git a/applications/scened-app-example/scene/scened-app-scene-byte-input.cpp b/applications/scened-app-example/scene/scened-app-scene-byte-input.cpp new file mode 100644 index 00000000..19d81bc5 --- /dev/null +++ b/applications/scened-app-example/scene/scened-app-scene-byte-input.cpp @@ -0,0 +1,35 @@ +#include "scened-app-scene-byte-input.h" + +void ScenedAppSceneByteInput::on_enter(ScenedApp* app, bool need_restore) { + ByteInputVM* byte_input = app->view_controller; + auto callback = cbc::obtain_connector(this, &ScenedAppSceneByteInput::result_callback); + + byte_input->set_result_callback(callback, NULL, app, data, 4); + byte_input->set_header_text("Enter the key"); + + app->view_controller.switch_to<ByteInputVM>(); +} + +bool ScenedAppSceneByteInput::on_event(ScenedApp* app, ScenedApp::Event* event) { + bool consumed = false; + + if(event->type == ScenedApp::EventType::ByteEditResult) { + app->scene_controller.switch_to_previous_scene(); + consumed = true; + } + + return consumed; +} + +void ScenedAppSceneByteInput::on_exit(ScenedApp* app) { + app->view_controller.get<ByteInputVM>()->clean(); +} + +void ScenedAppSceneByteInput::result_callback(void* context, uint8_t* bytes, uint8_t bytes_count) { + ScenedApp* app = static_cast<ScenedApp*>(context); + ScenedApp::Event event; + + event.type = ScenedApp::EventType::ByteEditResult; + + app->view_controller.send_event(&event); +} diff --git a/applications/scened-app-example/scene/scened-app-scene-byte-input.h b/applications/scened-app-example/scene/scened-app-scene-byte-input.h new file mode 100644 index 00000000..de73ab12 --- /dev/null +++ b/applications/scened-app-example/scene/scened-app-scene-byte-input.h @@ -0,0 +1,19 @@ +#pragma once +#include "../scened-app.h" + +class ScenedAppSceneByteInput : public GenericScene<ScenedApp> { +public: + void on_enter(ScenedApp* app, bool need_restore) final; + bool on_event(ScenedApp* app, ScenedApp::Event* event) final; + void on_exit(ScenedApp* app) final; + +private: + void result_callback(void* context, uint8_t* bytes, uint8_t bytes_count); + + uint8_t data[4] = { + 0x01, + 0xA2, + 0xF4, + 0xD3, + }; +};
\ No newline at end of file diff --git a/applications/scened-app-example/scene/scened-app-scene-start.cpp b/applications/scened-app-example/scene/scened-app-scene-start.cpp new file mode 100644 index 00000000..0fe0f8a9 --- /dev/null +++ b/applications/scened-app-example/scene/scened-app-scene-start.cpp @@ -0,0 +1,47 @@ +#include "scened-app-scene-start.h" + +typedef enum { + SubmenuByteInput, +} SubmenuIndex; + +void ScenedAppSceneStart::on_enter(ScenedApp* app, bool need_restore) { + auto submenu = app->view_controller.get<SubmenuVM>(); + auto callback = cbc::obtain_connector(this, &ScenedAppSceneStart::submenu_callback); + + submenu->add_item("Byte Input", SubmenuByteInput, callback, app); + + if(need_restore) { + submenu->set_selected_item(submenu_item_selected); + } + app->view_controller.switch_to<SubmenuVM>(); +} + +bool ScenedAppSceneStart::on_event(ScenedApp* app, ScenedApp::Event* event) { + bool consumed = false; + + if(event->type == ScenedApp::EventType::MenuSelected) { + submenu_item_selected = event->payload.menu_index; + switch(event->payload.menu_index) { + case SubmenuByteInput: + app->scene_controller.switch_to_next_scene(ScenedApp::SceneType::ByteInputScene); + break; + } + consumed = true; + } + + return consumed; +} + +void ScenedAppSceneStart::on_exit(ScenedApp* app) { + app->view_controller.get<SubmenuVM>()->clean(); +} + +void ScenedAppSceneStart::submenu_callback(void* context, uint32_t index) { + ScenedApp* app = static_cast<ScenedApp*>(context); + ScenedApp::Event event; + + event.type = ScenedApp::EventType::MenuSelected; + event.payload.menu_index = index; + + app->view_controller.send_event(&event); +} diff --git a/applications/scened-app-example/scene/scened-app-scene-start.h b/applications/scened-app-example/scene/scened-app-scene-start.h new file mode 100644 index 00000000..d585ea1e --- /dev/null +++ b/applications/scened-app-example/scene/scened-app-scene-start.h @@ -0,0 +1,13 @@ +#pragma once +#include "../scened-app.h" + +class ScenedAppSceneStart : public GenericScene<ScenedApp> { +public: + void on_enter(ScenedApp* app, bool need_restore) final; + bool on_event(ScenedApp* app, ScenedApp::Event* event) final; + void on_exit(ScenedApp* app) final; + +private: + void submenu_callback(void* context, uint32_t index); + uint32_t submenu_item_selected = 0; +};
\ No newline at end of file diff --git a/applications/scened-app-example/scened-app-launcher.cpp b/applications/scened-app-example/scened-app-launcher.cpp new file mode 100644 index 00000000..58f52f11 --- /dev/null +++ b/applications/scened-app-example/scened-app-launcher.cpp @@ -0,0 +1,10 @@ +#include "scened-app.h" + +// app enter function +extern "C" int32_t scened_app(void* p) { + ScenedApp* app = new ScenedApp(); + app->run(); + delete app; + + return 0; +} diff --git a/applications/scened-app-example/scened-app.cpp b/applications/scened-app-example/scened-app.cpp new file mode 100644 index 00000000..56994218 --- /dev/null +++ b/applications/scened-app-example/scened-app.cpp @@ -0,0 +1,20 @@ +#include "scened-app.h" +#include "scene/scened-app-scene-start.h" +#include "scene/scened-app-scene-byte-input.h" + +ScenedApp::ScenedApp() + : scene_controller{this} + , text_store{128} + , notification{"notification"} { +} + +ScenedApp::~ScenedApp() { +} + +void ScenedApp::run() { + scene_controller.add_scene(SceneType::Start, new ScenedAppSceneStart()); + scene_controller.add_scene(SceneType::ByteInputScene, new ScenedAppSceneByteInput()); + + notification_message(notification, &sequence_blink_green_10); + scene_controller.process(100); +}
\ No newline at end of file diff --git a/applications/scened-app-example/scened-app.h b/applications/scened-app-example/scened-app.h new file mode 100644 index 00000000..d45dbf83 --- /dev/null +++ b/applications/scened-app-example/scened-app.h @@ -0,0 +1,47 @@ +#pragma once +#include <furi.h> +#include <api-hal.h> + +#include <generic-scene.hpp> +#include <scene-controller.hpp> +#include <view-controller.hpp> +#include <record-controller.hpp> +#include <text-store.h> + +#include <view-modules/submenu-vm.h> +#include <view-modules/byte-input-vm.h> + +#include <notification/notification-messages.h> + +class ScenedApp { +public: + enum class EventType : uint8_t { + GENERIC_EVENT_ENUM_VALUES, + MenuSelected, + ByteEditResult, + }; + + enum class SceneType : uint8_t { + GENERIC_SCENE_ENUM_VALUES, + ByteInputScene, + }; + + class Event { + public: + union { + int32_t menu_index; + } payload; + + EventType type; + }; + + SceneController<GenericScene<ScenedApp>, ScenedApp> scene_controller; + TextStore text_store; + ViewController<ScenedApp, SubmenuVM, ByteInputVM> view_controller; + RecordController<NotificationApp> notification; + + ~ScenedApp(); + ScenedApp(); + + void run(); +};
\ No newline at end of file |