FlippyPass/project/backend/ui.c

330 lines
No EOL
8.8 KiB
C

// 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 if (manager->page == 3) {
manager->p_ready = false;
manager->page = 2;
} 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: // View Passwords
ui_p_view(canvas, manager);
break;
case 3: // View Password
ui_p_vpass(canvas, manager);
break;
case 4: // Create password
ui_p_cpass(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 1: // Create password
manager->page = 4;
// Unloading prior password
if (manager->manager->current != NULL) {
FURI_LOG_D(TAG, "Freeing prior password");
free(manager->manager->current);
}
// Creating new one
manager->manager->current = pass_create("New Password", "username", "password", 0);
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]);
}
}
// Creating dot
canvas_draw_box(canvas, 10, 18 + (manager->selection * 10), 2, 2);
if (manager->p_ready) {
manager->p_ready = false;
switch (manager->input) {
case Up:
manager->selection--;
if(manager->selection < 0) {manager->selection = 0;}
break;
case Down:
manager->selection++;
if(manager->selection > 3) {manager->selection = 3;}
break;
case Left:
manager_switchpage(manager->manager, -1);
break;
case Right:
manager_switchpage(manager->manager, 1);
break;
case Ok:
char* pass_name = manager->manager->names[manager->selection];
if (strcmp(pass_name, "") == 0) {
break;
}
manager_loadpass(manager->manager, pass_name);
manager->page = 3;
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_p_vpass(Canvas* canvas, UIManager* manager) {
canvas_set_font(canvas, FontPrimary);
canvas_draw_str(canvas, 2, 11, manager->manager->current->name);
canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 12, 24, manager->manager->current->user);
canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 12, 34, manager->manager->current->phrase);
/* canvas_draw_icon(canvas, 98, 55, &I_ButtonCenter_7x7);
canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 106, 62, "Send"); */
}
void ui_p_cpass(Canvas* canvas, UIManager* manager) {
// Displaying password creation screen
canvas_set_font(canvas, FontPrimary);
canvas_draw_str(canvas, 2, 11, "Create Password");
canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 20, 23, manager->manager->current->name);
canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 20, 33, manager->manager->current->user);
canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 20, 43, manager->manager->current->phrase);
canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 25, 53, "Done");
}
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);
}