Преглед изворни кода

GUI: view enter, exit callbacks. (#326)

あく пре 5 година
родитељ
комит
2187dc7117

+ 20 - 0
applications/gui/view.c

@@ -40,6 +40,16 @@ void view_set_next_callback(View* view, ViewNavigationCallback callback) {
     view->next_callback = callback;
     view->next_callback = callback;
 }
 }
 
 
+void view_set_enter_callback(View* view, ViewCallback callback) {
+    furi_assert(view);
+    view->enter_callback = callback;
+}
+
+void view_set_exit_callback(View* view, ViewCallback callback) {
+    furi_assert(view);
+    view->exit_callback = callback;
+}
+
 void view_set_context(View* view, void* context) {
 void view_set_context(View* view, void* context) {
     furi_assert(view);
     furi_assert(view);
     furi_assert(context);
     furi_assert(context);
@@ -143,3 +153,13 @@ uint32_t view_next(View* view) {
         return VIEW_IGNORE;
         return VIEW_IGNORE;
     }
     }
 }
 }
+
+void view_enter(View* view) {
+    furi_assert(view);
+    if(view->enter_callback) view->enter_callback(view->context);
+}
+
+void view_exit(View* view) {
+    furi_assert(view);
+    if(view->exit_callback) view->exit_callback(view->context);
+}

+ 18 - 0
applications/gui/view.h

@@ -42,6 +42,12 @@ typedef bool (*ViewInputCallback)(InputEvent* event, void* context);
  */
  */
 typedef uint32_t (*ViewNavigationCallback)(void* context);
 typedef uint32_t (*ViewNavigationCallback)(void* context);
 
 
+/* View callback
+ * @param context, pointer to context
+ * @warning called from GUI thread
+ */
+typedef void (*ViewCallback)(void* context);
+
 /* View model types */
 /* View model types */
 typedef enum {
 typedef enum {
     /* Model is not allocated */
     /* Model is not allocated */
@@ -92,6 +98,18 @@ void view_set_previous_callback(View* view, ViewNavigationCallback callback);
  */
  */
 void view_set_next_callback(View* view, ViewNavigationCallback callback);
 void view_set_next_callback(View* view, ViewNavigationCallback callback);
 
 
+/* Set Enter callback
+ * @param view, pointer to View
+ * @param callback, callback
+ */
+void view_set_enter_callback(View* view, ViewCallback callback);
+
+/* Set Exit callback
+ * @param view, pointer to View
+ * @param callback, callback
+ */
+void view_set_exit_callback(View* view, ViewCallback callback);
+
 /* Set View Draw callback
 /* Set View Draw callback
  * @param view, pointer to View
  * @param view, pointer to View
  * @param context, context for callbacks
  * @param context, context for callbacks

+ 20 - 5
applications/gui/view_dispatcher.c

@@ -45,17 +45,14 @@ void view_dispatcher_add_view(ViewDispatcher* view_dispatcher, uint32_t view_id,
 void view_dispatcher_switch_to_view(ViewDispatcher* view_dispatcher, uint32_t view_id) {
 void view_dispatcher_switch_to_view(ViewDispatcher* view_dispatcher, uint32_t view_id) {
     furi_assert(view_dispatcher);
     furi_assert(view_dispatcher);
     if(view_id == VIEW_NONE) {
     if(view_id == VIEW_NONE) {
-        view_dispatcher->current_view = NULL;
-        view_port_enabled_set(view_dispatcher->view_port, false);
+        view_dispatcher_set_current_view(view_dispatcher, NULL);
     } else if(view_id == VIEW_IGNORE) {
     } else if(view_id == VIEW_IGNORE) {
     } else if(view_id == VIEW_DESTROY) {
     } else if(view_id == VIEW_DESTROY) {
         view_dispatcher_free(view_dispatcher);
         view_dispatcher_free(view_dispatcher);
     } else {
     } else {
         View** view_pp = ViewDict_get(view_dispatcher->views, view_id);
         View** view_pp = ViewDict_get(view_dispatcher->views, view_id);
         furi_check(view_pp != NULL);
         furi_check(view_pp != NULL);
-        view_dispatcher->current_view = *view_pp;
-        view_port_enabled_set(view_dispatcher->view_port, true);
-        view_port_update(view_dispatcher->view_port);
+        view_dispatcher_set_current_view(view_dispatcher, *view_pp);
     }
     }
 }
 }
 
 
@@ -103,6 +100,24 @@ void view_dispatcher_input_callback(InputEvent* event, void* context) {
     }
     }
 }
 }
 
 
+void view_dispatcher_set_current_view(ViewDispatcher* view_dispatcher, View* view) {
+    furi_assert(view_dispatcher);
+    // Dispatch view exit event
+    if(view_dispatcher->current_view) {
+        view_exit(view_dispatcher->current_view);
+    }
+    // Set current view
+    view_dispatcher->current_view = view;
+    // Dispatch view enter event
+    if(view_dispatcher->current_view) {
+        view_enter(view_dispatcher->current_view);
+        view_port_enabled_set(view_dispatcher->view_port, true);
+        view_port_update(view_dispatcher->view_port);
+    } else {
+        view_port_enabled_set(view_dispatcher->view_port, false);
+    }
+}
+
 void view_dispatcher_update(ViewDispatcher* view_dispatcher, View* view) {
 void view_dispatcher_update(ViewDispatcher* view_dispatcher, View* view) {
     furi_assert(view_dispatcher);
     furi_assert(view_dispatcher);
     furi_assert(view);
     furi_assert(view);

+ 3 - 0
applications/gui/view_dispatcher_i.h

@@ -20,5 +20,8 @@ void view_dispatcher_draw_callback(Canvas* canvas, void* context);
 /* ViewPort Input Callback */
 /* ViewPort Input Callback */
 void view_dispatcher_input_callback(InputEvent* event, void* context);
 void view_dispatcher_input_callback(InputEvent* event, void* context);
 
 
+/* Set current view, dispatches view enter and exit */
+void view_dispatcher_set_current_view(ViewDispatcher* view_dispatcher, View* view);
+
 /* View to ViewDispatcher update event */
 /* View to ViewDispatcher update event */
 void view_dispatcher_update(ViewDispatcher* view_dispatcher, View* view);
 void view_dispatcher_update(ViewDispatcher* view_dispatcher, View* view);

+ 8 - 0
applications/gui/view_i.h

@@ -16,6 +16,8 @@ struct View {
     ViewModelType model_type;
     ViewModelType model_type;
     ViewNavigationCallback previous_callback;
     ViewNavigationCallback previous_callback;
     ViewNavigationCallback next_callback;
     ViewNavigationCallback next_callback;
+    ViewCallback enter_callback;
+    ViewCallback exit_callback;
     void* model;
     void* model;
     void* context;
     void* context;
 };
 };
@@ -37,3 +39,9 @@ uint32_t view_previous(View* view);
 
 
 /* Next Callback for View dispatcher */
 /* Next Callback for View dispatcher */
 uint32_t view_next(View* view);
 uint32_t view_next(View* view);
+
+/* Enter Callback for View dispatcher */
+void view_enter(View* view);
+
+/* Exit Callback for View dispatcher */
+void view_exit(View* view);

+ 3 - 1
applications/gui/view_port.h

@@ -51,7 +51,9 @@ uint8_t view_port_get_height(ViewPort* view_port);
 
 
 /*
 /*
  * Enable or disable view_port rendering.
  * Enable or disable view_port rendering.
- * @param enabled.
+ * @param view_port - ViewPort instance
+ * @param enabled
+ * @warning automatically dispatches update event
  */
  */
 void view_port_enabled_set(ViewPort* view_port, bool enabled);
 void view_port_enabled_set(ViewPort* view_port, bool enabled);
 bool view_port_is_enabled(ViewPort* view_port);
 bool view_port_is_enabled(ViewPort* view_port);