GUI: Icons and IconsAnimation refactoring. Switch assets to new Icon Api (#566)
* GUI: Icons and IconsAnimation refactoring. Switch assets to new Icon API. * Gui: icon and animation draw now do not accept null pointer * Format Sources * Fix no debug build * Furi: stricter checks in memmgr
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
#include <stdlib.h>
|
||||
#include "applications.h"
|
||||
|
||||
const Icon* idle_scenes[] = {&A_Wink_128x64, &A_WatchingTV_128x64};
|
||||
|
||||
static void dolphin_switch_to_app(Dolphin* dolphin, const FlipperApplication* flipper_app) {
|
||||
furi_assert(dolphin);
|
||||
furi_assert(flipper_app);
|
||||
@@ -15,11 +17,12 @@ static void dolphin_switch_to_app(Dolphin* dolphin, const FlipperApplication* fl
|
||||
}
|
||||
|
||||
// temporary main screen animation managment
|
||||
void dolphin_scene_handler_set_scene(Dolphin* dolphin, IconName icon) {
|
||||
void dolphin_scene_handler_set_scene(Dolphin* dolphin, const Icon* icon_data) {
|
||||
with_view_model(
|
||||
dolphin->idle_view_main, (DolphinViewMainModel * model) {
|
||||
model->animation = assets_icons_get(icon);
|
||||
icon_start_animation(model->animation);
|
||||
if(model->animation) icon_animation_free(model->animation);
|
||||
model->animation = icon_animation_alloc(icon_data);
|
||||
icon_animation_start(model->animation);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
@@ -27,10 +30,11 @@ void dolphin_scene_handler_set_scene(Dolphin* dolphin, IconName icon) {
|
||||
void dolphin_scene_handler_switch_scene(Dolphin* dolphin) {
|
||||
with_view_model(
|
||||
dolphin->idle_view_main, (DolphinViewMainModel * model) {
|
||||
if(icon_is_last_frame(model->animation)) {
|
||||
model->animation = assets_icons_get(idle_scenes[model->scene_num]);
|
||||
icon_start_animation(model->animation);
|
||||
model->scene_num = random() % sizeof(idle_scenes);
|
||||
if(icon_animation_is_last_frame(model->animation)) {
|
||||
if(model->animation) icon_animation_free(model->animation);
|
||||
model->animation = icon_animation_alloc(idle_scenes[model->scene_num]);
|
||||
icon_animation_start(model->animation);
|
||||
model->scene_num = random() % COUNT_OF(idle_scenes);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
@@ -183,7 +187,7 @@ static void lock_menu_callback(void* context, uint8_t index) {
|
||||
static void lock_icon_callback(Canvas* canvas, void* context) {
|
||||
furi_assert(context);
|
||||
Dolphin* dolphin = context;
|
||||
canvas_draw_icon(canvas, 0, 0, dolphin->lock_icon);
|
||||
canvas_draw_icon_animation(canvas, 0, 0, dolphin->lock_icon);
|
||||
}
|
||||
|
||||
bool dolphin_view_lockmenu_input(InputEvent* event, void* context) {
|
||||
@@ -206,7 +210,8 @@ bool dolphin_view_lockmenu_input(InputEvent* event, void* context) {
|
||||
view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleMain);
|
||||
|
||||
if(random() % 100 > 50)
|
||||
dolphin_scene_handler_set_scene(dolphin, idle_scenes[random() % sizeof(idle_scenes)]);
|
||||
dolphin_scene_handler_set_scene(
|
||||
dolphin, idle_scenes[random() % COUNT_OF(idle_scenes)]);
|
||||
}
|
||||
|
||||
view_commit_model(dolphin->view_lockmenu, true);
|
||||
@@ -331,14 +336,14 @@ Dolphin* dolphin_alloc() {
|
||||
dolphin->idle_view_dispatcher, DolphinViewHwMismatch, dolphin->view_hw_mismatch);
|
||||
|
||||
// Lock icon
|
||||
dolphin->lock_icon = assets_icons_get(I_Lock_8x8);
|
||||
dolphin->lock_icon = icon_animation_alloc(&I_Lock_8x8);
|
||||
dolphin->lock_viewport = view_port_alloc();
|
||||
view_port_set_width(dolphin->lock_viewport, icon_get_width(dolphin->lock_icon));
|
||||
view_port_set_width(dolphin->lock_viewport, icon_animation_get_width(dolphin->lock_icon));
|
||||
view_port_draw_callback_set(dolphin->lock_viewport, lock_icon_callback, dolphin);
|
||||
view_port_enabled_set(dolphin->lock_viewport, false);
|
||||
|
||||
// Main screen animation
|
||||
dolphin_scene_handler_set_scene(dolphin, idle_scenes[random() % sizeof(idle_scenes)]);
|
||||
dolphin_scene_handler_set_scene(dolphin, idle_scenes[random() % COUNT_OF(idle_scenes)]);
|
||||
|
||||
view_dispatcher_attach_to_gui(
|
||||
dolphin->idle_view_dispatcher, dolphin->gui, ViewDispatcherTypeWindow);
|
||||
@@ -352,7 +357,7 @@ void dolphin_free(Dolphin* dolphin) {
|
||||
|
||||
gui_remove_view_port(dolphin->gui, dolphin->lock_viewport);
|
||||
view_port_free(dolphin->lock_viewport);
|
||||
icon_free(dolphin->lock_icon);
|
||||
icon_animation_free(dolphin->lock_icon);
|
||||
|
||||
osTimerDelete(dolphin->timeout_timer);
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ struct Dolphin {
|
||||
View* view_hw_mismatch;
|
||||
View* view_lockmenu;
|
||||
ViewPort* lock_viewport;
|
||||
Icon* lock_icon;
|
||||
IconAnimation* lock_icon;
|
||||
|
||||
bool locked;
|
||||
uint8_t lock_count;
|
||||
@@ -59,9 +59,6 @@ struct Dolphin {
|
||||
osTimerId_t timeout_timer;
|
||||
};
|
||||
|
||||
// Temporary
|
||||
const IconName idle_scenes[] = {A_Wink_128x64, A_WatchingTV_128x64};
|
||||
|
||||
Dolphin* dolphin_alloc();
|
||||
|
||||
void dolphin_free(Dolphin* dolphin);
|
||||
|
||||
@@ -17,19 +17,19 @@ void dolphin_view_first_start_draw(Canvas* canvas, void* model) {
|
||||
uint8_t height = canvas_height(canvas);
|
||||
const char* my_name = api_hal_version_get_name_ptr();
|
||||
if(m->page == 0) {
|
||||
canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart0_70x53);
|
||||
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart0_70x53);
|
||||
elements_multiline_text_framed(canvas, 75, 20, "Hey m8,\npress > to\ncontinue");
|
||||
} else if(m->page == 1) {
|
||||
canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart1_59x53);
|
||||
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart1_59x53);
|
||||
elements_multiline_text_framed(canvas, 64, 20, "First Of All,\n... >");
|
||||
} else if(m->page == 2) {
|
||||
canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart2_59x51);
|
||||
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart2_59x51);
|
||||
elements_multiline_text_framed(canvas, 64, 20, "Thank you\nfor your\nsupport! >");
|
||||
} else if(m->page == 3) {
|
||||
canvas_draw_icon_name(canvas, width - 57, height - 48, I_DolphinFirstStart3_57x48);
|
||||
canvas_draw_icon(canvas, width - 57, height - 48, &I_DolphinFirstStart3_57x48);
|
||||
elements_multiline_text_framed(canvas, 0, 20, "Kickstarter\ncampaign\nwas INSANE! >");
|
||||
} else if(m->page == 4) {
|
||||
canvas_draw_icon_name(canvas, width - 67, height - 50, I_DolphinFirstStart4_67x53);
|
||||
canvas_draw_icon(canvas, width - 67, height - 50, &I_DolphinFirstStart4_67x53);
|
||||
elements_multiline_text_framed(canvas, 0, 17, "Now\nallow me\nto introduce\nmyself >");
|
||||
} else if(m->page == 5) {
|
||||
char buf[64];
|
||||
@@ -40,18 +40,18 @@ void dolphin_view_first_start_draw(Canvas* canvas, void* model) {
|
||||
"I am",
|
||||
my_name ? my_name : "Unknown",
|
||||
",\ncyberdolphin\nliving in your\npocket >");
|
||||
canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart5_45x53);
|
||||
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart5_45x53);
|
||||
elements_multiline_text_framed(canvas, 60, 17, buf);
|
||||
} else if(m->page == 6) {
|
||||
canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart6_58x54);
|
||||
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart6_58x54);
|
||||
elements_multiline_text_framed(
|
||||
canvas, 63, 17, "I can grow\nsmart'n'cool\nif you use me\noften >");
|
||||
} else if(m->page == 7) {
|
||||
canvas_draw_icon_name(canvas, width - 61, height - 48, I_DolphinFirstStart7_61x51);
|
||||
canvas_draw_icon(canvas, width - 61, height - 48, &I_DolphinFirstStart7_61x51);
|
||||
elements_multiline_text_framed(
|
||||
canvas, 0, 17, "As long as\nyou read, write\nand emulate >");
|
||||
} else if(m->page == 8) {
|
||||
canvas_draw_icon_name(canvas, width - 56, height - 48, I_DolphinFirstStart8_56x51);
|
||||
canvas_draw_icon(canvas, width - 56, height - 48, &I_DolphinFirstStart8_56x51);
|
||||
elements_multiline_text_framed(
|
||||
canvas, 0, 17, "You can check\nmy level and\nmood in the\nPassport menu");
|
||||
}
|
||||
@@ -61,13 +61,13 @@ void dolphin_view_idle_main_draw(Canvas* canvas, void* model) {
|
||||
canvas_clear(canvas);
|
||||
DolphinViewMainModel* m = model;
|
||||
if(m->animation) {
|
||||
canvas_draw_icon(canvas, 0, -3, m->animation);
|
||||
canvas_draw_icon_animation(canvas, 0, -3, m->animation);
|
||||
}
|
||||
|
||||
if(m->hint_timeout > 0) {
|
||||
m->hint_timeout--;
|
||||
if(m->locked) {
|
||||
canvas_draw_icon_name(canvas, 13, 5, I_LockPopup_100x49);
|
||||
canvas_draw_icon(canvas, 13, 5, &I_LockPopup_100x49);
|
||||
elements_multiline_text(canvas, 65, 20, "To unlock\npress:");
|
||||
} else {
|
||||
canvas_set_font(canvas, FontPrimary);
|
||||
@@ -80,8 +80,8 @@ void dolphin_view_lockmenu_draw(Canvas* canvas, void* model) {
|
||||
DolphinViewLockMenuModel* m = model;
|
||||
canvas_clear(canvas);
|
||||
canvas_set_color(canvas, ColorBlack);
|
||||
canvas_draw_icon_name(canvas, m->door_left_x, 0, I_DoorLeft_70x55);
|
||||
canvas_draw_icon_name(canvas, m->door_right_x, 0, I_DoorRight_70x55);
|
||||
canvas_draw_icon(canvas, m->door_left_x, 0, &I_DoorLeft_70x55);
|
||||
canvas_draw_icon(canvas, m->door_right_x, 0, &I_DoorRight_70x55);
|
||||
canvas_set_font(canvas, FontSecondary);
|
||||
|
||||
if(m->locked) {
|
||||
|
||||
@@ -45,7 +45,7 @@ typedef struct {
|
||||
} DolphinViewLockMenuModel;
|
||||
|
||||
typedef struct {
|
||||
Icon* animation;
|
||||
IconAnimation* animation;
|
||||
uint8_t scene_num;
|
||||
uint8_t hint_timeout;
|
||||
bool locked;
|
||||
|
||||
@@ -23,19 +23,19 @@ typedef struct {
|
||||
// Moods, corresponding to butthurt level. (temp, unclear about max level)
|
||||
static const char* mood_strings[MOODS_TOTAL] = {[0] = "Happy", [1] = "Ok", [2] = "Bad"};
|
||||
|
||||
static const IconName portrait_happy[BUTTHURT_MAX] = {
|
||||
I_passport_happy1_43x45,
|
||||
I_passport_happy2_43x45,
|
||||
I_passport_happy3_43x45};
|
||||
static const IconName portrait_ok[BUTTHURT_MAX] = {
|
||||
I_passport_okay1_43x45,
|
||||
I_passport_okay2_43x45,
|
||||
I_passport_okay3_43x45};
|
||||
static const IconName portrait_bad[BUTTHURT_MAX] = {
|
||||
I_passport_bad1_43x45,
|
||||
I_passport_bad2_43x45,
|
||||
I_passport_bad3_43x45};
|
||||
static const IconName* portraits[MOODS_TOTAL] = {portrait_happy, portrait_ok, portrait_bad};
|
||||
static const Icon* portrait_happy[BUTTHURT_MAX] = {
|
||||
&I_passport_happy1_43x45,
|
||||
&I_passport_happy2_43x45,
|
||||
&I_passport_happy3_43x45};
|
||||
static const Icon* portrait_ok[BUTTHURT_MAX] = {
|
||||
&I_passport_okay1_43x45,
|
||||
&I_passport_okay2_43x45,
|
||||
&I_passport_okay3_43x45};
|
||||
static const Icon* portrait_bad[BUTTHURT_MAX] = {
|
||||
&I_passport_bad1_43x45,
|
||||
&I_passport_bad2_43x45,
|
||||
&I_passport_bad3_43x45};
|
||||
static const Icon** portraits[MOODS_TOTAL] = {portrait_happy, portrait_ok, portrait_bad};
|
||||
|
||||
static void input_callback(InputEvent* input_event, void* ctx) {
|
||||
osMessageQueueId_t event_queue = ctx;
|
||||
@@ -61,8 +61,8 @@ static void render_callback(Canvas* canvas, void* ctx) {
|
||||
canvas_clear(canvas);
|
||||
|
||||
// multipass
|
||||
canvas_draw_icon_name(canvas, 0, 0, I_PassportLeft_6x47);
|
||||
canvas_draw_icon_name(canvas, 0, 47, I_PassportBottom_128x17);
|
||||
canvas_draw_icon(canvas, 0, 0, &I_PassportLeft_6x47);
|
||||
canvas_draw_icon(canvas, 0, 47, &I_PassportBottom_128x17);
|
||||
canvas_draw_line(canvas, 6, 0, 125, 0);
|
||||
canvas_draw_line(canvas, 127, 2, 127, 47);
|
||||
canvas_draw_dot(canvas, 126, 1);
|
||||
@@ -75,7 +75,7 @@ static void render_callback(Canvas* canvas, void* ctx) {
|
||||
canvas_draw_line(canvas, 53, 5, 55, 7);
|
||||
|
||||
// portrait
|
||||
canvas_draw_icon_name(canvas, 10, 9, portraits[butthurt][portrait_level]);
|
||||
canvas_draw_icon(canvas, 10, 9, portraits[butthurt][portrait_level]);
|
||||
canvas_draw_line(canvas, 59, 18, 124, 18);
|
||||
canvas_draw_line(canvas, 59, 31, 124, 31);
|
||||
canvas_draw_line(canvas, 59, 44, 124, 44);
|
||||
|
||||
@@ -7,7 +7,7 @@ const Item TV = {
|
||||
.timeout = 10,
|
||||
.x = 160,
|
||||
.y = 34,
|
||||
.icon = I_TV_20x24,
|
||||
.icon = &I_TV_20x24,
|
||||
.action_name = "Use",
|
||||
.draw = draw_tv,
|
||||
.callback = smash_tv};
|
||||
@@ -17,7 +17,7 @@ const Item Painting = {
|
||||
.timeout = 20,
|
||||
.x = 160,
|
||||
.y = 10,
|
||||
.icon = I_Home_painting_17x20,
|
||||
.icon = &I_Home_painting_17x20,
|
||||
.action_name = "Inspect",
|
||||
.draw = NULL,
|
||||
.callback = inspect_painting};
|
||||
@@ -27,7 +27,7 @@ const Item Sofa = {
|
||||
.timeout = 100,
|
||||
.x = 250,
|
||||
.y = 34,
|
||||
.icon = I_Sofa_40x13,
|
||||
.icon = &I_Sofa_40x13,
|
||||
.action_name = "Sit",
|
||||
.draw = NULL,
|
||||
.callback = sofa_sit};
|
||||
@@ -37,7 +37,7 @@ const Item PC = {
|
||||
.timeout = 100,
|
||||
.x = 400,
|
||||
.y = 10,
|
||||
.icon = I_PC_22x29,
|
||||
.icon = &I_PC_22x29,
|
||||
.action_name = "Use",
|
||||
.draw = NULL,
|
||||
.callback = pc_callback};
|
||||
@@ -111,8 +111,8 @@ void smash_tv(Canvas* canvas, void* state) {
|
||||
SceneState* s = state;
|
||||
s->player_flipped = true;
|
||||
canvas_set_bitmap_mode(canvas, true);
|
||||
canvas_draw_icon_name(
|
||||
canvas, ((TV.x - 5) - s->player_global.x) * PARALLAX(TV.layer), TV.y - 2, I_FX_Bang_32x6);
|
||||
canvas_draw_icon(
|
||||
canvas, ((TV.x - 5) - s->player_global.x) * PARALLAX(TV.layer), TV.y - 2, &I_FX_Bang_32x6);
|
||||
canvas_set_bitmap_mode(canvas, false);
|
||||
if(s->action_timeout < TV.timeout - 2) {
|
||||
elements_multiline_text_framed(canvas, 80, 24, "Bang!");
|
||||
@@ -124,8 +124,8 @@ void sofa_sit(Canvas* canvas, void* state) {
|
||||
SceneState* s = state;
|
||||
// temp fix pos
|
||||
s->player_global.x = 154;
|
||||
s->dolphin_gfx = A_FX_Sitting_40x27;
|
||||
s->dolphin_gfx_b = I_FX_SittingB_40x27;
|
||||
s->dolphin_gfx = &A_FX_Sitting_40x27;
|
||||
s->dolphin_gfx_b = &I_FX_SittingB_40x27;
|
||||
}
|
||||
|
||||
void inspect_painting(Canvas* canvas, void* state) {
|
||||
|
||||
@@ -66,7 +66,7 @@ typedef struct {
|
||||
uint16_t timeout;
|
||||
int32_t x;
|
||||
int32_t y;
|
||||
IconName icon;
|
||||
const Icon* icon;
|
||||
char action_name[16];
|
||||
void (*draw)(Canvas* canvas, void* model);
|
||||
void (*callback)(Canvas* canvas, void* model);
|
||||
@@ -79,8 +79,8 @@ typedef struct {
|
||||
Vec2 player_v;
|
||||
Vec2 screen;
|
||||
|
||||
IconName dolphin_gfx;
|
||||
IconName dolphin_gfx_b; // temp
|
||||
const Icon* dolphin_gfx;
|
||||
const Icon* dolphin_gfx_b; // temp
|
||||
|
||||
bool player_flipped;
|
||||
bool use_pending;
|
||||
|
||||
@@ -104,37 +104,37 @@ void dolphin_scene_render_dolphin(SceneState* state, Canvas* canvas) {
|
||||
furi_assert(canvas);
|
||||
|
||||
if(state->scene_zoom == SCENE_ZOOM) {
|
||||
state->dolphin_gfx = I_DolphinExcited_64x63;
|
||||
state->dolphin_gfx = &I_DolphinExcited_64x63;
|
||||
} else if(state->action == SLEEP && state->player_global.x == 154) { // 2do - sofa x pos getter
|
||||
state->dolphin_gfx = A_FX_Sitting_40x27;
|
||||
state->dolphin_gfx_b = I_FX_SittingB_40x27;
|
||||
state->dolphin_gfx = &A_FX_Sitting_40x27;
|
||||
state->dolphin_gfx_b = &I_FX_SittingB_40x27;
|
||||
} else if(state->action != INTERACT) {
|
||||
if(state->player_v.x < 0 || state->player_flipped) {
|
||||
if(state->player_anim == 0) {
|
||||
state->dolphin_gfx = I_WalkL1_32x32;
|
||||
state->dolphin_gfx_b = I_WalkLB1_32x32;
|
||||
state->dolphin_gfx = &I_WalkL1_32x32;
|
||||
state->dolphin_gfx_b = &I_WalkLB1_32x32;
|
||||
|
||||
} else {
|
||||
state->dolphin_gfx = I_WalkL2_32x32;
|
||||
state->dolphin_gfx_b = I_WalkLB2_32x32;
|
||||
state->dolphin_gfx = &I_WalkL2_32x32;
|
||||
state->dolphin_gfx_b = &I_WalkLB2_32x32;
|
||||
}
|
||||
} else if(state->player_v.x > 0 || !state->player_flipped) {
|
||||
if(state->player_anim == 0) {
|
||||
state->dolphin_gfx = I_WalkR1_32x32;
|
||||
state->dolphin_gfx_b = I_WalkRB1_32x32;
|
||||
state->dolphin_gfx = &I_WalkR1_32x32;
|
||||
state->dolphin_gfx_b = &I_WalkRB1_32x32;
|
||||
|
||||
} else {
|
||||
state->dolphin_gfx = I_WalkR2_32x32;
|
||||
state->dolphin_gfx_b = I_WalkRB2_32x32;
|
||||
state->dolphin_gfx = &I_WalkR2_32x32;
|
||||
state->dolphin_gfx_b = &I_WalkRB2_32x32;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
canvas_set_bitmap_mode(canvas, true);
|
||||
canvas_set_color(canvas, ColorWhite);
|
||||
canvas_draw_icon_name(canvas, state->player.x, state->player.y, state->dolphin_gfx_b);
|
||||
canvas_draw_icon(canvas, state->player.x, state->player.y, state->dolphin_gfx_b);
|
||||
canvas_set_color(canvas, ColorBlack);
|
||||
canvas_draw_icon_name(canvas, state->player.x, state->player.y, state->dolphin_gfx);
|
||||
canvas_draw_icon(canvas, state->player.x, state->player.y, state->dolphin_gfx);
|
||||
canvas_set_bitmap_mode(canvas, false);
|
||||
}
|
||||
|
||||
@@ -158,7 +158,7 @@ void dolphin_scene_render(SceneState* state, Canvas* canvas, uint32_t t) {
|
||||
if(current_scene[i]->draw) current_scene[i]->draw(canvas, state);
|
||||
|
||||
if(l == current_scene[i]->layer) {
|
||||
canvas_draw_icon_name(
|
||||
canvas_draw_icon(
|
||||
canvas,
|
||||
item_pos * PARALLAX(l),
|
||||
current_scene[i]->y,
|
||||
|
||||
Reference in New Issue
Block a user