Procházet zdrojové kódy

[FL-1498] Keyboard save focus (#730)

* text_input: set focus on Save button if text is set
* text_input: add clear API, format documentation
* all: rework text input clean with new API
gornekich před 4 roky
rodič
revize
2eafae6b90

+ 1 - 2
applications/archive/scenes/archive_scene_rename.c

@@ -75,6 +75,5 @@ bool archive_scene_rename_on_event(void* context, SceneManagerEvent event) {
 void archive_scene_rename_on_exit(void* context) {
     ArchiveApp* archive = (ArchiveApp*)context;
     // Clear view
-    text_input_set_header_text(archive->text_input, NULL);
-    text_input_set_result_callback(archive->text_input, NULL, NULL, NULL, 0, false);
+    text_input_clean(archive->text_input);
 }

+ 22 - 8
applications/gui/modules/text_input.c

@@ -369,6 +369,19 @@ TextInput* text_input_alloc() {
     view_set_draw_callback(text_input->view, text_input_view_draw_callback);
     view_set_input_callback(text_input->view, text_input_view_input_callback);
 
+    text_input_clean(text_input);
+
+    return text_input;
+}
+
+void text_input_free(TextInput* text_input) {
+    furi_assert(text_input);
+    view_free(text_input->view);
+    free(text_input);
+}
+
+void text_input_clean(TextInput* text_input) {
+    furi_assert(text_input);
     with_view_model(
         text_input->view, (TextInputModel * model) {
             model->text_buffer_size = 0;
@@ -376,16 +389,12 @@ TextInput* text_input_alloc() {
             model->selected_row = 0;
             model->selected_column = 0;
             model->clear_default_text = false;
+            model->text_buffer = NULL;
+            model->text_buffer_size = 0;
+            model->callback = NULL;
+            model->callback_context = NULL;
             return true;
         });
-
-    return text_input;
-}
-
-void text_input_free(TextInput* text_input) {
-    furi_assert(text_input);
-    view_free(text_input->view);
-    free(text_input);
 }
 
 View* text_input_get_view(TextInput* text_input) {
@@ -407,6 +416,11 @@ void text_input_set_result_callback(
             model->text_buffer = text_buffer;
             model->text_buffer_size = text_buffer_size;
             model->clear_default_text = clear_default_text;
+            if(text_buffer && text_buffer[0] != '\0') {
+                // Set focus on Save
+                model->selected_row = 2;
+                model->selected_column = 8;
+            }
             return true;
         });
 }

+ 16 - 19
applications/gui/modules/text_input.h

@@ -9,32 +9,31 @@ extern "C" {
 typedef struct TextInput TextInput;
 typedef void (*TextInputCallback)(void* context);
 
-/** 
- * @brief Allocate and initialize text input
- *        This text input is used to enter string
- * 
+/** Allocate and initialize text input
+ * This text input is used to enter string
+ * @return TextInput instance
  */
 TextInput* text_input_alloc();
 
-/** 
- * @brief Deinitialize and free text input
- * 
- * @param text_input - Text input instance
+/** Deinitialize and free text input
+ * @param text_input - TextInput instance
  */
 void text_input_free(TextInput* text_input);
 
-/**
- * @brief Get text input view
- * 
+/** Clean text input view
+ * Note: this function does not free memory
  * @param text_input - Text input instance
+ */
+void text_input_clean(TextInput* text_input);
+
+/** Get text input view
+ * @param text_input - TextInput instance
  * @return View instance that can be used for embedding
  */
 View* text_input_get_view(TextInput* text_input);
 
-/**
- * @brief Set text input result callback
- * 
- * @param text_input - Text input instance
+/** Set text input result callback
+ * @param text_input - TextInput instance
  * @param callback - callback fn
  * @param callback_context - callback context
  * @param text_buffer - pointer to YOUR text buffer, that we going to modify
@@ -49,10 +48,8 @@ void text_input_set_result_callback(
     size_t text_buffer_size,
     bool clear_default_text);
 
-/** 
- * @brief Set text input header text
- * 
- * @param text input - Text input instance
+/** Set text input header text
+ * @param text_input - TextInput instance
  * @param text - text to be shown
  */
 void text_input_set_header_text(TextInput* text_input, const char* text);

+ 1 - 2
applications/ibutton/scene/ibutton-scene-save-name.cpp

@@ -48,8 +48,7 @@ bool iButtonSceneSaveName::on_event(iButtonApp* app, iButtonEvent* event) {
 
 void iButtonSceneSaveName::on_exit(iButtonApp* app) {
     TextInput* text_input = app->get_view_manager()->get_text_input();
-    text_input_set_header_text(text_input, "");
-    text_input_set_result_callback(text_input, NULL, NULL, NULL, 0, false);
+    text_input_clean(text_input);
 }
 
 void iButtonSceneSaveName::text_input_callback(void* context) {

+ 1 - 2
applications/nfc/scenes/nfc_scene_save_name.c

@@ -60,6 +60,5 @@ void nfc_scene_save_name_on_exit(void* context) {
     Nfc* nfc = (Nfc*)context;
 
     // Clear view
-    text_input_set_header_text(nfc->text_input, NULL);
-    text_input_set_result_callback(nfc->text_input, NULL, NULL, NULL, 0, false);
+    text_input_clean(nfc->text_input);
 }

+ 1 - 2
applications/subghz/scenes/subghz_scene_save_name.c

@@ -61,6 +61,5 @@ void subghz_scene_save_name_on_exit(void* context) {
     SubGhz* subghz = context;
 
     // Clear view
-    text_input_set_header_text(subghz->text_input, NULL);
-    text_input_set_result_callback(subghz->text_input, NULL, NULL, NULL, 0, false);
+    text_input_clean(subghz->text_input);
 }

+ 1 - 2
lib/app-scened-template/view-modules/text-input-vm.cpp

@@ -13,8 +13,7 @@ View* TextInputVM::get_view() {
 }
 
 void TextInputVM::clean() {
-    set_result_callback(NULL, NULL, NULL, 0, false);
-    set_header_text("");
+    text_input_clean(text_input);
 }
 
 void TextInputVM::set_result_callback(