// Header #include "ui.h" // Functions - Private void int_to_str(int num, char* str) { int i = 0; int is_negative = 0; // Handle 0 explicitly if (num == 0) { str[i++] = '0'; str[i] = '\0'; return; } // Handle negative numbers if (num < 0) { is_negative = 1; num = -num; } // Process each digit while (num != 0) { str[i++] = (num % 10) + '0'; num = num / 10; } // If the number was negative, append '-' if (is_negative) { str[i++] = '-'; } // Append the null terminator str[i] = '\0'; // Reverse the string int start = 0; int end = i - 1; while (start < end) { char temp = str[start]; str[start] = str[end]; str[end] = temp; start++; end--; } } // Functions UIManager* ui_create() { // Creating the UI Manager UIManager* result = malloc(sizeof(UIManager)); // Defining basic variables result->running = true; result->selection = 0; result->page = 0; result->p_avail = true; result->p_ready = false; // Creating a GUI result->gui = furi_record_open(RECORD_GUI); // Creating a canvas result->canvas = view_port_alloc(); view_port_draw_callback_set(result->canvas, ui_draw, result); view_port_input_callback_set(result->canvas, ui_input, result); gui_add_view_port(result->gui, result->canvas, GuiLayerFullscreen); // Creating the manager result->manager = manager_create(); manager_loadnames(result->manager, result->manager->page); // Returning the UI Manager return result; } void ui_input(InputEvent* event, void* ctx) { // Turning the context back into the UI Manager UIManager* manager = (UIManager*)ctx; // Getting input if ((event->type == InputTypePress || event->type == InputTypeShort) && manager->p_avail) { manager->p_avail = false; manager->p_ready = true; switch(event->key) { case InputKeyUp: manager->input = Up; break; case InputKeyDown: manager->input = Down; break; case InputKeyLeft: manager->input = Left; break; case InputKeyRight: manager->input = Right; break; case InputKeyOk: manager->input = Ok; break; case InputKeyBack: manager->input = Back; break; default: break; } } if (event->type == InputTypeRelease) { manager->p_avail = true; manager->input = None; } } void ui_quit(UIManager* manager) { if (!(manager->p_ready && manager->input == Back)) {return;} if(manager->page == 0) { manager->running = false; } else { manager->p_ready = false; manager->page = 0; } } void ui_draw(Canvas* canvas, void* ctx) { // Context into Result UIManager* manager = (UIManager*)ctx; // Switching page switch(manager->page){ case 0: // Main Menu ui_p_mainmenu(canvas, manager); break; case 1: // About Me ui_p_about(canvas); break; case 2: // Create Password ui_p_view(canvas, manager); break; } } void ui_p_mainmenu(Canvas* canvas, UIManager* manager) { // Menu Options canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 2, 11, "FlippyPass"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 22, 25, "View Passwords"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 22, 45, "View Archive"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 22, 35, "Create Password"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 22, 55, "About"); // Cursor if(manager->p_ready) { // We used a press manager->p_ready = false; // Reacting switch (manager->input){ case Up: manager->selection--; break; case Down: manager->selection++; break; case Ok: switch(manager->selection) { case 0: // View Passwords manager->page = 2; break; case 3: // About Me manager->page = 1; break; default: break; } break; default: break; } // Min & Max if (manager->selection > 3) { manager->selection = 0; } else if (manager->selection < 0) { manager->selection = 3; } } // Placing the spot at the cursor canvas_draw_box(canvas, 15, 20 + (manager->selection * 10), 2, 2); } void ui_p_about(Canvas* canvas) { canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 2, 11, "FlippyPass"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 3, 23, "A really easy to use Password"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 3, 32, "Manager for the Flipper-Zero."); } void ui_p_view(Canvas* canvas, UIManager* manager){ canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 2, 11, "FlippyPass"); // Counting through password names for (int i = 0; i < 4; i++) { if (manager->manager->names[i] != NULL) { canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 15, 23 + (i * 10), manager->manager->names[i]); } } if (manager->p_ready) { manager->p_ready = false; switch (manager->input) { case Up: break; case Down: break; case Left: manager_switchpage(manager->manager, -1); break; case Right: manager_switchpage(manager->manager, 1); break; case Ok: break; default: break; } } char page[12]; int_to_str(manager->manager->page, page + 1); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 106, 62, page); } void ui_delete(UIManager* manager) { manager_delete(manager->manager); view_port_enabled_set(manager->canvas, false); gui_remove_view_port(manager->gui, manager->canvas); view_port_free(manager->canvas); furi_record_close(RECORD_GUI); free(manager); }