Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSG <who.just.the.doctor@gmail.com>2021-06-15 14:01:56 +0300
committerGitHub <noreply@github.com>2021-06-15 14:01:56 +0300
commit0b14db4fb33d4466a02c0c85b01321bece5d6537 (patch)
treec2420528bad84a7e9930e7f17f8d95a300e9a43f /applications/scened-app-example
parent3a2121bbb8f26d1c790e8bf1d6c53e44892486a8 (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')
-rw-r--r--applications/scened-app-example/scene/scened-app-scene-byte-input.cpp35
-rw-r--r--applications/scened-app-example/scene/scened-app-scene-byte-input.h19
-rw-r--r--applications/scened-app-example/scene/scened-app-scene-start.cpp47
-rw-r--r--applications/scened-app-example/scene/scened-app-scene-start.h13
-rw-r--r--applications/scened-app-example/scened-app-launcher.cpp10
-rw-r--r--applications/scened-app-example/scened-app.cpp20
-rw-r--r--applications/scened-app-example/scened-app.h47
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