280 lines
No EOL
7 KiB
C
280 lines
No EOL
7 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 {
|
|
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;
|
|
}
|
|
}
|
|
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]);
|
|
}
|
|
}
|
|
|
|
// 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];
|
|
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) {
|
|
// TODO: Do this after figuring out how to select password
|
|
UNUSED(canvas);
|
|
UNUSED(manager);
|
|
}
|
|
|
|
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);
|
|
} |