mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-14 18:58:36 -07:00
Simplify main menu draw logic + fix scrolling text
This commit is contained in:
@@ -38,6 +38,35 @@ static void menu_process_left(Menu* menu);
|
|||||||
static void menu_process_right(Menu* menu);
|
static void menu_process_right(Menu* menu);
|
||||||
static void menu_process_ok(Menu* menu);
|
static void menu_process_ok(Menu* menu);
|
||||||
|
|
||||||
|
static void menu_short_name(MenuItem* item, FuriString* name) {
|
||||||
|
furi_string_set(name, item->label);
|
||||||
|
if(furi_string_start_with_str(name, "[")) {
|
||||||
|
size_t trim = furi_string_search_str(name, "] ", 1);
|
||||||
|
if(trim != STRING_FAILURE) {
|
||||||
|
furi_string_right(name, trim + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void menu_centered_icon(Canvas* canvas, MenuItem* item, size_t x, size_t y, size_t width, size_t height) {
|
||||||
|
if(item->icon) {
|
||||||
|
canvas_draw_icon_animation(
|
||||||
|
canvas,
|
||||||
|
x + (width - item->icon->icon->width) / 2,
|
||||||
|
y + (height - item->icon->icon->height) / 2,
|
||||||
|
item->icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t menu_scroll_counter(MenuModel* model, bool selected) {
|
||||||
|
if(!selected) return 0;
|
||||||
|
size_t scroll_counter = model->scroll_counter;
|
||||||
|
if(scroll_counter > 0) {
|
||||||
|
scroll_counter--;
|
||||||
|
}
|
||||||
|
return scroll_counter;
|
||||||
|
}
|
||||||
|
|
||||||
static void menu_draw_callback(Canvas* canvas, void* _model) {
|
static void menu_draw_callback(Canvas* canvas, void* _model) {
|
||||||
MenuModel* model = _model;
|
MenuModel* model = _model;
|
||||||
|
|
||||||
@@ -50,49 +79,15 @@ static void menu_draw_callback(Canvas* canvas, void* _model) {
|
|||||||
size_t shift_position;
|
size_t shift_position;
|
||||||
switch(XTREME_SETTINGS()->menu_style) {
|
switch(XTREME_SETTINGS()->menu_style) {
|
||||||
case MenuStyleList: {
|
case MenuStyleList: {
|
||||||
// First line
|
for(uint8_t i = 0; i < 3; i++) {
|
||||||
canvas_set_font(canvas, FontSecondary);
|
canvas_set_font(canvas, i == 1 ? FontPrimary : FontSecondary);
|
||||||
shift_position = (0 + position + items_count - 1) % items_count;
|
shift_position = (position + items_count + i - 1) % items_count;
|
||||||
item = MenuItemArray_get(model->items, shift_position);
|
item = MenuItemArray_get(model->items, shift_position);
|
||||||
if(item->icon) {
|
menu_centered_icon(canvas, item, 4, 3 + 22 * i, 14, 14);
|
||||||
canvas_draw_icon_animation(
|
size_t scroll_counter = menu_scroll_counter(model, i == 1);
|
||||||
canvas,
|
elements_scrollable_text_line_str(
|
||||||
4 + (14 - item->icon->icon->width) / 2,
|
canvas, 22, 14 + 22 * i, 98, item->label, scroll_counter, false, false);
|
||||||
3 + (14 - item->icon->icon->height) / 2,
|
|
||||||
item->icon);
|
|
||||||
}
|
}
|
||||||
canvas_draw_str(canvas, 22, 14, item->label);
|
|
||||||
// Second line main
|
|
||||||
canvas_set_font(canvas, FontPrimary);
|
|
||||||
shift_position = (1 + position + items_count - 1) % items_count;
|
|
||||||
item = MenuItemArray_get(model->items, shift_position);
|
|
||||||
if(item->icon) {
|
|
||||||
canvas_draw_icon_animation(
|
|
||||||
canvas,
|
|
||||||
4 + (14 - item->icon->icon->width) / 2,
|
|
||||||
25 + (14 - item->icon->icon->height) / 2,
|
|
||||||
item->icon);
|
|
||||||
}
|
|
||||||
size_t scroll_counter = model->scroll_counter;
|
|
||||||
if(scroll_counter < 1) {
|
|
||||||
scroll_counter = 0;
|
|
||||||
} else {
|
|
||||||
scroll_counter -= 1;
|
|
||||||
}
|
|
||||||
elements_scrollable_text_line_str(
|
|
||||||
canvas, 22, 36, 98, item->label, scroll_counter, false, false);
|
|
||||||
// Third line
|
|
||||||
canvas_set_font(canvas, FontSecondary);
|
|
||||||
shift_position = (2 + position + items_count - 1) % items_count;
|
|
||||||
item = MenuItemArray_get(model->items, shift_position);
|
|
||||||
if(item->icon) {
|
|
||||||
canvas_draw_icon_animation(
|
|
||||||
canvas,
|
|
||||||
4 + (14 - item->icon->icon->width) / 2,
|
|
||||||
47 + (14 - item->icon->icon->height) / 2,
|
|
||||||
item->icon);
|
|
||||||
}
|
|
||||||
canvas_draw_str(canvas, 22, 58, item->label);
|
|
||||||
// Frame and scrollbar
|
// Frame and scrollbar
|
||||||
elements_frame(canvas, 0, 21, 128 - 5, 21);
|
elements_frame(canvas, 0, 21, 128 - 5, 21);
|
||||||
elements_scrollbar(canvas, position, items_count);
|
elements_scrollbar(canvas, position, items_count);
|
||||||
@@ -117,35 +112,18 @@ static void menu_draw_callback(Canvas* canvas, void* _model) {
|
|||||||
if(item_i >= items_count) continue;
|
if(item_i >= items_count) continue;
|
||||||
x_off = (i / 2) * 43 + 1;
|
x_off = (i / 2) * 43 + 1;
|
||||||
y_off = (i % 2) * 32;
|
y_off = (i % 2) * 32;
|
||||||
size_t scroll_counter = 0;
|
bool selected = item_i == position;
|
||||||
if(item_i == position) {
|
size_t scroll_counter = menu_scroll_counter(model, selected);
|
||||||
|
if(selected) {
|
||||||
elements_slightly_rounded_box(canvas, 0 + x_off, 0 + y_off, 40, 30);
|
elements_slightly_rounded_box(canvas, 0 + x_off, 0 + y_off, 40, 30);
|
||||||
canvas_set_color(canvas, ColorWhite);
|
canvas_set_color(canvas, ColorWhite);
|
||||||
scroll_counter = model->scroll_counter;
|
|
||||||
if(scroll_counter < 1) {
|
|
||||||
scroll_counter = 0;
|
|
||||||
} else {
|
|
||||||
scroll_counter -= 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
item = MenuItemArray_get(model->items, item_i);
|
item = MenuItemArray_get(model->items, item_i);
|
||||||
if(item->icon) {
|
menu_centered_icon(canvas, item, x_off, y_off, 40, 20);
|
||||||
canvas_draw_icon_animation(
|
menu_short_name(item, name);
|
||||||
canvas,
|
|
||||||
(40 - item->icon->icon->width) / 2 + x_off,
|
|
||||||
(20 - item->icon->icon->height) / 2 + y_off,
|
|
||||||
item->icon);
|
|
||||||
}
|
|
||||||
furi_string_set(name, item->label);
|
|
||||||
if(furi_string_start_with_str(name, "[")) {
|
|
||||||
size_t trim = furi_string_search_str(name, "] ", 1);
|
|
||||||
if(trim != STRING_FAILURE) {
|
|
||||||
furi_string_right(name, trim + 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elements_scrollable_text_line_centered(
|
elements_scrollable_text_line_centered(
|
||||||
canvas, 20 + x_off, 26 + y_off, 36, name, scroll_counter, false, true);
|
canvas, 20 + x_off, 26 + y_off, 36, name, scroll_counter, false, true);
|
||||||
if(item_i == position) {
|
if(selected) {
|
||||||
canvas_set_color(canvas, ColorBlack);
|
canvas_set_color(canvas, ColorBlack);
|
||||||
} else {
|
} else {
|
||||||
elements_frame(canvas, 0 + x_off, 0 + y_off, 40, 30);
|
elements_frame(canvas, 0 + x_off, 0 + y_off, 40, 30);
|
||||||
@@ -184,26 +162,16 @@ static void menu_draw_callback(Canvas* canvas, void* _model) {
|
|||||||
canvas_set_color(canvas, ColorBlack);
|
canvas_set_color(canvas, ColorBlack);
|
||||||
|
|
||||||
canvas_set_font(canvas, FontPrimary);
|
canvas_set_font(canvas, FontPrimary);
|
||||||
canvas_draw_str_aligned(
|
size_t scroll_counter = menu_scroll_counter(model, true);
|
||||||
canvas,
|
elements_scrollable_text_line_str(
|
||||||
pos_x,
|
canvas, pos_x, pos_y - height / 2 - 8, 126, item->label, scroll_counter, false, true);
|
||||||
pos_y - height / 2 - 8,
|
|
||||||
AlignCenter,
|
|
||||||
AlignBottom,
|
|
||||||
item->label);
|
|
||||||
} else {
|
} else {
|
||||||
pos_x += (width + 6) * i;
|
pos_x += (width + 6) * i;
|
||||||
pos_y += 2;
|
pos_y += 2;
|
||||||
elements_slightly_rounded_frame(
|
elements_slightly_rounded_frame(
|
||||||
canvas, pos_x - width / 2, pos_y - height / 2, width, height);
|
canvas, pos_x - width / 2, pos_y - height / 2, width, height);
|
||||||
}
|
}
|
||||||
if(item->icon) {
|
menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14);
|
||||||
canvas_draw_icon_animation(
|
|
||||||
canvas,
|
|
||||||
pos_x - item->icon->icon->width / 2,
|
|
||||||
pos_y - item->icon->icon->height / 2,
|
|
||||||
item->icon);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
elements_scrollbar_horizontal(canvas, 0, 64, 128, position, items_count);
|
elements_scrollbar_horizontal(canvas, 0, 64, 128, position, items_count);
|
||||||
break;
|
break;
|
||||||
@@ -411,6 +379,7 @@ static void menu_process_up(Menu* menu) {
|
|||||||
menu->view,
|
menu->view,
|
||||||
MenuModel * model,
|
MenuModel * model,
|
||||||
{
|
{
|
||||||
|
model->scroll_counter = 0;
|
||||||
size_t count = MenuItemArray_size(model->items);
|
size_t count = MenuItemArray_size(model->items);
|
||||||
MenuItem* item = MenuItemArray_get(model->items, model->position);
|
MenuItem* item = MenuItemArray_get(model->items, model->position);
|
||||||
if(item && item->icon) {
|
if(item && item->icon) {
|
||||||
@@ -431,7 +400,6 @@ static void menu_process_up(Menu* menu) {
|
|||||||
} else {
|
} else {
|
||||||
model->position++;
|
model->position++;
|
||||||
}
|
}
|
||||||
model->scroll_counter = 0;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -452,6 +420,7 @@ static void menu_process_down(Menu* menu) {
|
|||||||
menu->view,
|
menu->view,
|
||||||
MenuModel * model,
|
MenuModel * model,
|
||||||
{
|
{
|
||||||
|
model->scroll_counter = 0;
|
||||||
size_t count = MenuItemArray_size(model->items);
|
size_t count = MenuItemArray_size(model->items);
|
||||||
MenuItem* item = MenuItemArray_get(model->items, model->position);
|
MenuItem* item = MenuItemArray_get(model->items, model->position);
|
||||||
if(item && item->icon) {
|
if(item && item->icon) {
|
||||||
@@ -472,7 +441,6 @@ static void menu_process_down(Menu* menu) {
|
|||||||
} else {
|
} else {
|
||||||
model->position++;
|
model->position++;
|
||||||
}
|
}
|
||||||
model->scroll_counter = 0;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -493,6 +461,7 @@ static void menu_process_left(Menu* menu) {
|
|||||||
menu->view,
|
menu->view,
|
||||||
MenuModel * model,
|
MenuModel * model,
|
||||||
{
|
{
|
||||||
|
model->scroll_counter = 0;
|
||||||
size_t count = MenuItemArray_size(model->items);
|
size_t count = MenuItemArray_size(model->items);
|
||||||
MenuItem* item = MenuItemArray_get(model->items, model->position);
|
MenuItem* item = MenuItemArray_get(model->items, model->position);
|
||||||
if(item && item->icon) {
|
if(item && item->icon) {
|
||||||
@@ -510,7 +479,6 @@ static void menu_process_left(Menu* menu) {
|
|||||||
} else {
|
} else {
|
||||||
model->position -= 2;
|
model->position -= 2;
|
||||||
}
|
}
|
||||||
model->scroll_counter = 0;
|
|
||||||
break;
|
break;
|
||||||
case MenuStyleDsi:
|
case MenuStyleDsi:
|
||||||
if(model->position > 0) {
|
if(model->position > 0) {
|
||||||
@@ -538,6 +506,7 @@ static void menu_process_right(Menu* menu) {
|
|||||||
menu->view,
|
menu->view,
|
||||||
MenuModel * model,
|
MenuModel * model,
|
||||||
{
|
{
|
||||||
|
model->scroll_counter = 0;
|
||||||
size_t count = MenuItemArray_size(model->items);
|
size_t count = MenuItemArray_size(model->items);
|
||||||
MenuItem* item = MenuItemArray_get(model->items, model->position);
|
MenuItem* item = MenuItemArray_get(model->items, model->position);
|
||||||
if(item && item->icon) {
|
if(item && item->icon) {
|
||||||
@@ -560,7 +529,6 @@ static void menu_process_right(Menu* menu) {
|
|||||||
model->position = model->position % 2;
|
model->position = model->position % 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
model->scroll_counter = 0;
|
|
||||||
break;
|
break;
|
||||||
case MenuStyleDsi:
|
case MenuStyleDsi:
|
||||||
if(model->position < count - 1) {
|
if(model->position < count - 1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user