Просмотр исходного кода

Implement submenu for start scene

TollyH 2 лет назад
Родитель
Сommit
891ff7d9a2
3 измененных файлов с 73 добавлено и 7 удалено
  1. 31 0
      mfc_editor_app.c
  2. 14 0
      mfc_editor_app_i.h
  3. 28 7
      scenes/mfc_editor_scene_start.c

+ 31 - 0
mfc_editor_app.c

@@ -1,5 +1,23 @@
 #include "mfc_editor_app_i.h"
 
+bool mfc_editor_app_custom_event_callback(void* context, uint32_t event) {
+    furi_assert(context);
+    MfcEditorApp* instance = context;
+    return scene_manager_handle_custom_event(instance->scene_manager, event);
+}
+
+bool mfc_editor_app_back_event_callback(void* context) {
+    furi_assert(context);
+    MfcEditorApp* instance = context;
+    return scene_manager_handle_back_event(instance->scene_manager);
+}
+
+void mfc_editor_app_tick_event_callback(void* context) {
+    furi_assert(context);
+    MfcEditorApp* instance = context;
+    scene_manager_handle_tick_event(instance->scene_manager);
+}
+
 MfcEditorApp* mfc_editor_app_alloc() {
     MfcEditorApp* instance = malloc(sizeof(MfcEditorApp));
 
@@ -7,6 +25,12 @@ MfcEditorApp* mfc_editor_app_alloc() {
     instance->scene_manager = scene_manager_alloc(&mfc_editor_scene_handlers, instance);
     view_dispatcher_enable_queue(instance->view_dispatcher);
     view_dispatcher_set_event_callback_context(instance->view_dispatcher, instance);
+    view_dispatcher_set_custom_event_callback(
+        instance->view_dispatcher, mfc_editor_app_custom_event_callback);
+    view_dispatcher_set_navigation_event_callback(
+        instance->view_dispatcher, mfc_editor_app_back_event_callback);
+    view_dispatcher_set_tick_event_callback(
+        instance->view_dispatcher, mfc_editor_app_tick_event_callback, 100);
 
     instance->gui = furi_record_open(RECORD_GUI);
     view_dispatcher_attach_to_gui(
@@ -14,12 +38,19 @@ MfcEditorApp* mfc_editor_app_alloc() {
 
     instance->nfc_device = nfc_device_alloc();
 
+    instance->submenu = submenu_alloc();
+    view_dispatcher_add_view(
+        instance->view_dispatcher, MfcEditorAppViewSubmenu, submenu_get_view(instance->submenu));
+
     return instance;
 }
 
 void mfc_editor_app_free(MfcEditorApp* instance) {
     furi_assert(instance);
 
+    view_dispatcher_remove_view(instance->view_dispatcher, MfcEditorAppViewSubmenu);
+    submenu_free(instance->submenu);
+
     view_dispatcher_free(instance->view_dispatcher);
     scene_manager_free(instance->scene_manager);
 

+ 14 - 0
mfc_editor_app_i.h

@@ -6,16 +6,30 @@
 #include <gui/scene_manager.h>
 #include <gui/view_dispatcher.h>
 
+#include <gui/modules/submenu.h>
+
 #include <nfc/nfc.h>
 #include <nfc/nfc_device.h>
 
 #include "mfc_editor_app.h"
 #include "scenes/mfc_editor_scene.h"
 
+#define TAG "MFCEditor"
+
+#define NFC_APP_FOLDER ANY_PATH("nfc")
+#define NFC_APP_EXTENSION ".nfc"
+#define NFC_APP_SHADOW_EXTENSION ".shd"
+
 struct MfcEditorApp {
     ViewDispatcher* view_dispatcher;
     SceneManager* scene_manager;
     Gui* gui;
 
     NfcDevice* nfc_device;
+
+    Submenu* submenu;
 };
+
+typedef enum {
+    MfcEditorAppViewSubmenu,
+} MfcEditorAppView;

+ 28 - 7
scenes/mfc_editor_scene_start.c

@@ -1,23 +1,44 @@
 #include "../mfc_editor_app_i.h"
 
+enum SubmenuIndex {
+    SubmenuIndexOpen,
+};
+
+void mfc_editor_scene_start_submenu_callback(void* context, uint32_t index) {
+    MfcEditorApp* instance = context;
+    view_dispatcher_send_custom_event(instance->view_dispatcher, index);
+}
+
 void mfc_editor_scene_start_on_enter(void* context) {
     MfcEditorApp* instance = context;
-    UNUSED(instance);
-    UNUSED(context);
+
+    Submenu* submenu = instance->submenu;
+    submenu_add_item(
+        submenu, "Open", SubmenuIndexOpen, mfc_editor_scene_start_submenu_callback, instance);
+
+    submenu_set_selected_item(
+        submenu, scene_manager_get_scene_state(instance->scene_manager, MfcEditorSceneStart));
+    view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewSubmenu);
 }
 
 bool mfc_editor_scene_start_on_event(void* context, SceneManagerEvent event) {
     MfcEditorApp* instance = context;
-    UNUSED(instance);
-    UNUSED(context);
-    UNUSED(event);
     bool consumed = false;
 
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == SubmenuIndexOpen) {
+            FURI_LOG_I(TAG, "Open item clicked");
+            scene_manager_set_scene_state(
+                instance->scene_manager, MfcEditorSceneStart, SubmenuIndexOpen);
+            consumed = true;
+        }
+    }
+
     return consumed;
 }
 
 void mfc_editor_scene_start_on_exit(void* context) {
     MfcEditorApp* instance = context;
-    UNUSED(instance);
-    UNUSED(context);
+
+    submenu_reset(instance->submenu);
 }