Procházet zdrojové kódy

Refactoring of code to show/hide the keyboard.

antirez před 3 roky
rodič
revize
8ca076c238
3 změnil soubory, kde provedl 39 přidání a 5 odebrání
  1. 3 0
      app.h
  2. 33 0
      ui.c
  3. 3 5
      view_info.c

+ 3 - 0
app.h

@@ -218,6 +218,9 @@ int get_current_subview(ProtoViewApp *app);
 void show_available_subviews(Canvas *canvas, ProtoViewApp *app, int last_subview);
 bool process_subview_updown(ProtoViewApp *app, InputEvent input, int last_subview);
 void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color);
+void show_keyboard(ProtoViewApp *app, char *buffer, uint32_t buflen,
+                   void (*done_callback)(void*));
+void dismiss_keyboard(ProtoViewApp *app);
 
 /* crc.c */
 uint8_t crc8(const uint8_t *data, size_t len, uint8_t init, uint8_t poly);

+ 33 - 0
ui.c

@@ -3,6 +3,11 @@
 
 #include "app.h"
 
+/* =========================== Subview handling ================================
+ * Note that these are not the Flipper subviews, but the subview system
+ * implemented inside ProtoView.
+ * ========================================================================== */
+
 /* Return the ID of the currently selected subview, of the current
  * view. */
 int get_current_subview(ProtoViewApp *app) {
@@ -41,6 +46,34 @@ bool process_subview_updown(ProtoViewApp *app, InputEvent input, int last_subvie
     return false;
 }
 
+/* ============================= Text input ====================================
+ * Normally we just use our own private UI widgets. However for the text input
+ * widget, that is quite complex, visualizes a keyboard and must be standardized
+ * for user coherent experience, we use the one provided by the Flipper
+ * framework. The following two functions allow to show the keyboard to get
+ * text and later dismiss it.
+ * ========================================================================== */
+
+/* Show the keyboard, take the user input and store it into the specified
+ * 'buffer' of 'buflen' total bytes. When the user is done, the done_callback
+ * is called passing the application context to it. Such callback needs
+ * to do whatever it wants with the input buffer and dismissi the keyboard
+ * calling: dismiss_keyboard(app); */
+void show_keyboard(ProtoViewApp *app, char *buffer, uint32_t buflen,
+                   void (*done_callback)(void*))
+{
+    app->show_text_input = true;
+    app->text_input_buffer = buffer;
+    app->text_input_buffer_len = buflen;
+    app->text_input_done_callback = done_callback;
+}
+
+void dismiss_keyboard(ProtoViewApp *app) {
+    view_dispatcher_stop(app->view_dispatcher);
+}
+
+/* =========================== Canvas extensions ============================ */
+
 void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color)
 {
     struct {

+ 3 - 5
view_info.c

@@ -97,7 +97,7 @@ void text_input_done_callback(void* context) {
     ProtoViewApp *app = context;
     InfoViewPrivData *privdata = app->view_privdata;
     free(privdata->filename);
-    view_dispatcher_stop(app->view_dispatcher);
+    dismiss_keyboard(app);
 }
 
 /* Handle input for the info view. */
@@ -121,10 +121,8 @@ void process_input_info(ProtoViewApp *app, InputEvent input) {
                 privdata->signal_display_start_row--;
         } else if (input.type == InputTypePress && input.key == InputKeyOk) {
             privdata->filename = malloc(SAVE_FILENAME_LEN);
-            app->show_text_input = true;
-            app->text_input_buffer = privdata->filename;
-            app->text_input_buffer_len = SAVE_FILENAME_LEN;
-            app->text_input_done_callback = text_input_done_callback;
+            show_keyboard(app, privdata->filename, SAVE_FILENAME_LEN,
+                          text_input_done_callback);
         }
     }
 }