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

FL-819 new first start screen, add multiline text (#318)

* GUI Canvas: get current font height routine
* Dolphin: new start screen. GUI: new multiline element.
* Dolphin: up state version to reset it for everyone
* Dolphin: take maximum of idle screen height
* Dolphin: frames on first start screen.
あく 5 лет назад
Родитель
Сommit
cb4fb8e4ae
27 измененных файлов с 109 добавлено и 22 удалено
  1. 6 1
      applications/dolphin/dolphin.c
  2. 1 1
      applications/dolphin/dolphin_state.c
  3. 38 10
      applications/dolphin/dolphin_views.c
  4. 5 8
      applications/gui/canvas.c
  5. 6 1
      applications/gui/canvas.h
  6. 9 0
      applications/gui/canvas_i.h
  7. 34 1
      applications/gui/elements.c
  8. 7 0
      applications/gui/elements.h
  9. 3 0
      applications/gui/view.h
  10. BIN
      assets/icons/Dolphin/DolphinFirstStart0_128x54.png
  11. BIN
      assets/icons/Dolphin/DolphinFirstStart0_70x53.png
  12. BIN
      assets/icons/Dolphin/DolphinFirstStart1_128x54.png
  13. BIN
      assets/icons/Dolphin/DolphinFirstStart1_59x53.png
  14. BIN
      assets/icons/Dolphin/DolphinFirstStart2_128x54.png
  15. BIN
      assets/icons/Dolphin/DolphinFirstStart2_59x51.png
  16. BIN
      assets/icons/Dolphin/DolphinFirstStart3_128x54.png
  17. BIN
      assets/icons/Dolphin/DolphinFirstStart3_57x48.png
  18. BIN
      assets/icons/Dolphin/DolphinFirstStart4_128x54.png
  19. BIN
      assets/icons/Dolphin/DolphinFirstStart4_67x53.png
  20. BIN
      assets/icons/Dolphin/DolphinFirstStart5_128x54.png
  21. BIN
      assets/icons/Dolphin/DolphinFirstStart5_45x53.png
  22. BIN
      assets/icons/Dolphin/DolphinFirstStart6_128x54.png
  23. BIN
      assets/icons/Dolphin/DolphinFirstStart6_58x54.png
  24. BIN
      assets/icons/Dolphin/DolphinFirstStart7_128x54.png
  25. BIN
      assets/icons/Dolphin/DolphinFirstStart7_61x51.png
  26. BIN
      assets/icons/Dolphin/DolphinFirstStart8_128x54.png
  27. BIN
      assets/icons/Dolphin/DolphinFirstStart8_56x51.png

+ 6 - 1
applications/dolphin/dolphin.c

@@ -5,7 +5,12 @@ bool dolphin_view_first_start_input(InputEvent* event, void* context) {
     furi_assert(context);
     Dolphin* dolphin = context;
     if(event->state) {
-        if(event->input == InputRight) {
+        if(event->input == InputLeft) {
+            with_view_model(
+                dolphin->idle_view_first_start, (DolphinViewFirstStartModel * model) {
+                    if(model->page > 0) model->page--;
+                });
+        } else if(event->input == InputRight) {
             uint32_t page;
             with_view_model(
                 dolphin->idle_view_first_start,

+ 1 - 1
applications/dolphin/dolphin_state.c

@@ -14,7 +14,7 @@ typedef struct {
 #define DOLPHIN_DATA_DATA_ADDRESS (DOLPHIN_DATA_HEADER_ADDRESS + sizeof(DolphinDataHeader))
 
 #define DOLPHIN_DATA_HEADER_MAGIC 0xD0
-#define DOLPHIN_DATA_HEADER_VERSION 0x00
+#define DOLPHIN_DATA_HEADER_VERSION 0x01
 
 typedef struct {
     uint32_t limit_ibutton;

+ 38 - 10
applications/dolphin/dolphin_views.c

@@ -1,35 +1,63 @@
 #include "dolphin_views.h"
 #include <gui/view.h>
+#include <gui/gui.h>
+#include <gui/elements.h>
 
 void dolphin_view_first_start_draw(Canvas* canvas, void* model) {
     DolphinViewFirstStartModel* m = model;
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
+    canvas_set_font(canvas, FontSecondary);
+    uint8_t font_height = canvas_current_font_height(canvas);
+    uint8_t width = canvas_width(canvas);
+    uint8_t height = canvas_height(canvas);
     if(m->page == 0) {
-        canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart0_128x54);
+        canvas_draw_icon_name(canvas, 0, height - 53, I_DolphinFirstStart0_70x53);
+        elements_multiline_text(canvas, 75, 20, "Hey m8,\npress > to\ncontinue");
+        elements_frame(canvas, 72, 20 - font_height, width - 70 - 4, font_height * 3 + 4);
     } else if(m->page == 1) {
-        canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart1_128x54);
+        canvas_draw_icon_name(canvas, 0, height - 53, I_DolphinFirstStart1_59x53);
+        elements_multiline_text(canvas, 64, 20, "First Of All,\n...      >");
+        elements_frame(canvas, 61, 20 - font_height, width - 59 - 4, font_height * 2 + 4);
     } else if(m->page == 2) {
-        canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart2_128x54);
+        canvas_draw_icon_name(canvas, 0, height - 51, I_DolphinFirstStart2_59x51);
+        elements_multiline_text(canvas, 64, 20, "Thank you\nfor your\nsupport! >");
+        elements_frame(canvas, 61, 20 - font_height, width - 59 - 4, font_height * 3 + 4);
     } else if(m->page == 3) {
-        canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart3_128x54);
+        canvas_draw_icon_name(canvas, width - 57, height - 48, I_DolphinFirstStart3_57x48);
+        elements_multiline_text(canvas, 5, 20, "Kickstarter\ncampaign\nwas INSANE! >");
+        elements_frame(canvas, 2, 20 - font_height, width - 57 - 4, font_height * 3 + 4);
     } else if(m->page == 4) {
-        canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart4_128x54);
+        canvas_draw_icon_name(canvas, width - 67, height - 53, I_DolphinFirstStart4_67x53);
+        elements_multiline_text(canvas, 5, 10, "Now\nallow me\nto introduce\nmyself >");
+        elements_frame(canvas, 2, 10 - font_height, width - 67 - 4, font_height * 4 + 4);
     } else if(m->page == 5) {
-        canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart5_128x54);
+        canvas_draw_icon_name(canvas, 0, height - 53, I_DolphinFirstStart5_45x53);
+        elements_multiline_text(
+            canvas, 50, 20, "I am Flipper,\ncyberdolphin\nliving in your\npocket >");
+        elements_frame(canvas, 47, 20 - font_height, width - 45 - 4, font_height * 4 + 4);
     } else if(m->page == 6) {
-        canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart6_128x54);
+        canvas_draw_icon_name(canvas, 0, height - 54, I_DolphinFirstStart6_58x54);
+        elements_multiline_text(
+            canvas, 63, 20, "I can grow\n smart'n'cool\nif you use me\noften >");
+        elements_frame(canvas, 60, 20 - font_height, width - 58 - 4, font_height * 4 + 4);
     } else if(m->page == 7) {
-        canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart7_128x54);
+        canvas_draw_icon_name(canvas, width - 61, height - 51, I_DolphinFirstStart7_61x51);
+        elements_multiline_text(canvas, 5, 10, "As long as\nyou read, write\nand emulate >");
+        elements_frame(canvas, 2, 10 - font_height, width - 54 - 4, font_height * 3 + 4);
     } else if(m->page == 8) {
-        canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart8_128x54);
+        canvas_draw_icon_name(canvas, width - 56, height - 51, I_DolphinFirstStart8_56x51);
+        elements_multiline_text(
+            canvas, 5, 10, "You can check\nmy level and\nmood in the\nPassport menu");
+        elements_frame(canvas, 2, 10 - font_height, width - 56 - 4, font_height * 4 + 4);
     }
 }
 
 void dolphin_view_idle_main_draw(Canvas* canvas, void* model) {
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
-    canvas_draw_icon_name(canvas, 128 - 80, 0, I_Flipper_young_80x60);
+    canvas_draw_icon_name(
+        canvas, canvas_width(canvas) - 80, canvas_height(canvas) - 60 + 6, I_Flipper_young_80x60);
     canvas_set_font(canvas, FontSecondary);
     canvas_draw_str(canvas, 2, 10, "/\\: Stats");
     canvas_draw_str(canvas, 5, 32, "OK: Menu");

+ 5 - 8
applications/gui/canvas.c

@@ -3,14 +3,6 @@
 
 #include <furi.h>
 
-struct Canvas {
-    u8g2_t fb;
-    uint8_t offset_x;
-    uint8_t offset_y;
-    uint8_t width;
-    uint8_t height;
-};
-
 uint8_t u8g2_gpio_and_delay_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ptr);
 uint8_t u8x8_hw_spi_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ptr);
 
@@ -70,6 +62,11 @@ uint8_t canvas_height(Canvas* canvas) {
     return canvas->height;
 }
 
+uint8_t canvas_current_font_height(Canvas* canvas) {
+    furi_assert(canvas);
+    return u8g2_GetMaxCharHeight(&canvas->fb);
+}
+
 void canvas_clear(Canvas* canvas) {
     furi_assert(canvas);
     u8g2_ClearBuffer(&canvas->fb);

+ 6 - 1
applications/gui/canvas.h

@@ -1,7 +1,6 @@
 #pragma once
 
 #include <stdint.h>
-#include <u8g2.h>
 #include <gui/icon.h>
 #include <assets_icons_i.h>
 
@@ -30,6 +29,12 @@ uint8_t canvas_width(Canvas* canvas);
  */
 uint8_t canvas_height(Canvas* canvas);
 
+/*
+ * Get current font height
+ * @return height in pixels.
+ */
+uint8_t canvas_current_font_height(Canvas* canvas);
+
 /*
  * Clear canvas, clear rendering buffer
  */

+ 9 - 0
applications/gui/canvas_i.h

@@ -1,6 +1,15 @@
 #pragma once
 
 #include "canvas.h"
+#include <u8g2.h>
+
+struct Canvas {
+    u8g2_t fb;
+    uint8_t offset_x;
+    uint8_t offset_y;
+    uint8_t width;
+    uint8_t height;
+};
 
 /*
  * Allocate memory and initialize canvas

+ 34 - 1
applications/gui/elements.c

@@ -1,6 +1,14 @@
 #include "elements.h"
+#include "canvas_i.h"
+
+#include <furi.h>
+
+#include <string.h>
+#include <m-string.h>
 
 void elements_scrollbar(Canvas* canvas, uint8_t pos, uint8_t total) {
+    furi_assert(canvas);
+
     uint8_t width = canvas_width(canvas);
     uint8_t height = canvas_height(canvas);
     // prevent overflows
@@ -19,6 +27,8 @@ void elements_scrollbar(Canvas* canvas, uint8_t pos, uint8_t total) {
 }
 
 void elements_frame(Canvas* canvas, uint8_t x, uint8_t y, uint8_t width, uint8_t height) {
+    furi_assert(canvas);
+
     canvas_draw_line(canvas, x + 2, y, x + width - 2, y);
     canvas_draw_line(canvas, x + 1, y + height - 1, x + width, y + height - 1);
     canvas_draw_line(canvas, x + 2, y + height, x + width - 1, y + height);
@@ -28,4 +38,27 @@ void elements_frame(Canvas* canvas, uint8_t x, uint8_t y, uint8_t width, uint8_t
     canvas_draw_line(canvas, x + width, y + 2, x + width, y + height - 2);
 
     canvas_draw_dot(canvas, x + 1, y + 1);
-}
+}
+
+void elements_multiline_text(Canvas* canvas, uint8_t x, uint8_t y, char* text) {
+    furi_assert(canvas);
+    furi_assert(text);
+
+    uint8_t font_height = canvas_current_font_height(canvas);
+    string_t str;
+    string_init(str);
+    char* start = text;
+    char* end;
+    do {
+        end = strchr(start, '\n');
+        if(end) {
+            string_set_strn(str, start, end - start);
+        } else {
+            string_set_str(str, start);
+        }
+        canvas_draw_str(canvas, x, y, string_get_cstr(str));
+        start = end + 1;
+        y += font_height;
+    } while(end);
+    string_clear(str);
+}

+ 7 - 0
applications/gui/elements.h

@@ -22,6 +22,13 @@ void elements_scrollbar(Canvas* canvas, uint8_t pos, uint8_t total);
  */
 void elements_frame(Canvas* canvas, uint8_t x, uint8_t y, uint8_t width, uint8_t height);
 
+/*
+ * Draw multiline text
+ * @param x, y - top left corner coordinates
+ * @param text - string (possible multiline)
+ */
+void elements_multiline_text(Canvas* canvas, uint8_t x, uint8_t y, char* text);
+
 #ifdef __cplusplus
 }
 #endif

+ 3 - 0
applications/gui/view.h

@@ -3,6 +3,9 @@
 #include <input/input.h>
 #include "canvas.h"
 
+#include <stddef.h>
+#include <stdint.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif

BIN
assets/icons/Dolphin/DolphinFirstStart0_128x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart0_70x53.png


BIN
assets/icons/Dolphin/DolphinFirstStart1_128x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart1_59x53.png


BIN
assets/icons/Dolphin/DolphinFirstStart2_128x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart2_59x51.png


BIN
assets/icons/Dolphin/DolphinFirstStart3_128x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart3_57x48.png


BIN
assets/icons/Dolphin/DolphinFirstStart4_128x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart4_67x53.png


BIN
assets/icons/Dolphin/DolphinFirstStart5_128x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart5_45x53.png


BIN
assets/icons/Dolphin/DolphinFirstStart6_128x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart6_58x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart7_128x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart7_61x51.png


BIN
assets/icons/Dolphin/DolphinFirstStart8_128x54.png


BIN
assets/icons/Dolphin/DolphinFirstStart8_56x51.png