Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions applications/main/momentum_app/momentum_app.c
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,10 @@ MomentumApp* momentum_app_alloc() {
view_dispatcher_add_view(
app->view_dispatcher, MomentumAppViewDialogEx, dialog_ex_get_view(app->dialog_ex));

app->widget = widget_alloc();
view_dispatcher_add_view(
app->view_dispatcher, MomentumAppViewWidget, widget_get_view(app->widget));

// Settings init

app->asset_pack_index = 0;
Expand Down Expand Up @@ -441,6 +445,8 @@ void momentum_app_free(MomentumApp* app) {
popup_free(app->popup);
view_dispatcher_remove_view(app->view_dispatcher, MomentumAppViewDialogEx);
dialog_ex_free(app->dialog_ex);
view_dispatcher_remove_view(app->view_dispatcher, MomentumAppViewWidget);
widget_free(app->widget);

// View Dispatcher and Scene Manager
view_dispatcher_free(app->view_dispatcher);
Expand Down
4 changes: 3 additions & 1 deletion applications/main/momentum_app/momentum_app.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <gui/modules/number_input.h>
#include <gui/modules/popup.h>
#include <gui/modules/dialog_ex.h>
#include <gui/modules/widget.h>

#include <momentum/asset_packs.h>
#include <loader/loader_menu.h>
Expand Down Expand Up @@ -63,7 +64,7 @@ typedef struct {
NumberInput* number_input;
Popup* popup;
DialogEx* dialog_ex;

Widget* widget;
CharList_t asset_pack_names;
uint8_t asset_pack_index;
CharList_t mainmenu_app_labels;
Expand Down Expand Up @@ -107,6 +108,7 @@ typedef enum {
MomentumAppViewNumberInput,
MomentumAppViewPopup,
MomentumAppViewDialogEx,
MomentumAppViewWidget,
} MomentumAppView;

bool momentum_app_apply(MomentumApp* app);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ ADD_SCENE(momentum_app, start, Start)
ADD_SCENE(momentum_app, interface, Interface)
ADD_SCENE(momentum_app, interface_graphics, InterfaceGraphics)
ADD_SCENE(momentum_app, interface_graphics_pack, InterfaceGraphicsPack)
ADD_SCENE(momentum_app, interface_graphics_pack_warning, InterfaceGraphicsPackWarning)
ADD_SCENE(momentum_app, interface_graphics_pack_warning_info, InterfaceGraphicsPackWarningInfo)
ADD_SCENE(momentum_app, interface_mainmenu, InterfaceMainmenu)
ADD_SCENE(momentum_app, interface_mainmenu_add, InterfaceMainmenuAdd)
ADD_SCENE(momentum_app, interface_mainmenu_add_main, InterfaceMainmenuAddMain)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,29 @@

enum VarItemListIndex {
VarItemListIndexAssetPack,
VarItemListIndexPackWarning,
VarItemListIndexAnimSpeed,
VarItemListIndexCycleAnims,
VarItemListIndexUnlockAnims,
};

static bool check_asset_pack_folders(const char* pack_name) {
if(pack_name == NULL) return false;
Storage* storage = furi_record_open(RECORD_STORAGE);
FuriString* path = furi_string_alloc();
bool result = false;

furi_string_printf(path, "%s/%s/Icons", ASSET_PACKS_PATH, pack_name);
if(storage_dir_exists(storage, furi_string_get_cstr(path))) result = true;
if(!result) {
furi_string_printf(path, "%s/%s/Fonts", ASSET_PACKS_PATH, pack_name);
if(storage_dir_exists(storage, furi_string_get_cstr(path))) result = true;
}

furi_string_free(path);
return result;
}

void momentum_app_scene_interface_graphics_var_item_list_callback(void* context, uint32_t index) {
MomentumApp* app = context;
view_dispatcher_send_custom_event(app->view_dispatcher, index);
Expand All @@ -24,6 +42,12 @@ static void momentum_app_scene_interface_graphics_asset_pack_changed(VariableIte
app->asset_pack_index = index;
app->save_settings = true;
app->apply_pack = true;

// Workaround to force scene reload to rebuild the list with/without pack warning and
// return to 0 index ("Asset Pack").
scene_manager_previous_scene(app->scene_manager);
scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceGraphics);
scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneInterfaceGraphics, 0);
}

const char* const anim_speed_names[] = {
Expand Down Expand Up @@ -118,18 +142,25 @@ void momentum_app_scene_interface_graphics_on_enter(void* context) {
VariableItem* item;
uint8_t value_index;

const char* selected_asset_pack =
app->asset_pack_index == 0 ?
"Default" :
*CharList_get(app->asset_pack_names, app->asset_pack_index - 1);
item = variable_item_list_add(
var_item_list,
"Asset Pack",
CharList_size(app->asset_pack_names) + 1,
momentum_app_scene_interface_graphics_asset_pack_changed,
app);
variable_item_set_current_value_index(item, app->asset_pack_index);
variable_item_set_current_value_text(
item,
app->asset_pack_index == 0 ?
"Default" :
*CharList_get(app->asset_pack_names, app->asset_pack_index - 1));
variable_item_set_current_value_text(item, selected_asset_pack);

if(app->asset_pack_index > 0) {
if(check_asset_pack_folders(selected_asset_pack)) {
item = variable_item_list_add(var_item_list, "Size Warning", 0, NULL, app);
variable_item_set_current_value_text(item, ">");
}
}

item = variable_item_list_add(
var_item_list,
Expand Down Expand Up @@ -183,6 +214,11 @@ bool momentum_app_scene_interface_graphics_on_event(void* context, SceneManagerE
switch(event.event) {
case VarItemListIndexAssetPack:
scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceGraphicsPack);
break;
case VarItemListIndexPackWarning:
scene_manager_next_scene(
app->scene_manager, MomentumAppSceneInterfaceGraphicsPackWarning);
break;
default:
break;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include "../momentum_app.h"

void momentum_app_scene_interface_graphics_pack_warning_widget_callback(
GuiButtonType result,
InputType type,
void* context) {
MomentumApp* app = context;
if(type == InputTypeShort) {
view_dispatcher_send_custom_event(app->view_dispatcher, result);
}
}

void momentum_app_scene_interface_graphics_pack_warning_on_enter(void* context) {
MomentumApp* app = context;

widget_add_button_element(
app->widget,
GuiButtonTypeLeft,
"Back",
momentum_app_scene_interface_graphics_pack_warning_widget_callback,
app);
widget_add_button_element(
app->widget,
GuiButtonTypeRight,
"Info",
momentum_app_scene_interface_graphics_pack_warning_widget_callback,
app);
widget_add_text_box_element(
app->widget, 0, 0, 128, 22, AlignCenter, AlignCenter, "\e#Size Warning\e#", false);
widget_add_string_multiline_element(
app->widget,
64,
33,
AlignCenter,
AlignCenter,
FontSecondary,
"Your selected pack contains\n"
"Fonts & Icons, which remain\n"
"loaded and use up memory.");

view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewWidget);
}

bool momentum_app_scene_interface_graphics_pack_warning_on_event(
void* context,
SceneManagerEvent event) {
MomentumApp* app = context;

if(event.type == SceneManagerEventTypeCustom) {
if(event.event == GuiButtonTypeLeft) {
return scene_manager_previous_scene(app->scene_manager);
} else if(event.event == GuiButtonTypeRight) {
scene_manager_next_scene(
app->scene_manager, MomentumAppSceneInterfaceGraphicsPackWarningInfo);
return true;
}
}
return false;
}

void momentum_app_scene_interface_graphics_pack_warning_on_exit(void* context) {
MomentumApp* app = context;
widget_reset(app->widget);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#include "../momentum_app.h"

void momentum_app_scene_interface_graphics_pack_warning_info_widget_callback(
GuiButtonType result,
InputType type,
void* context) {
MomentumApp* app = context;
if(type == InputTypeShort) {
view_dispatcher_send_custom_event(app->view_dispatcher, result);
}
}

void momentum_app_scene_interface_graphics_pack_warning_info_on_enter(void* context) {
MomentumApp* app = context;

widget_add_button_element(
app->widget,
GuiButtonTypeLeft,
"Exit",
momentum_app_scene_interface_graphics_pack_warning_info_widget_callback,
app);

const char* dirs[] = {"Fonts", "Icons"};
const char* font_exts[] = {".u8f"};
const char* icon_exts[] = {".bm", ".bmx"};
const char** exts[] = {font_exts, icon_exts};
const size_t ext_counts[] = {COUNT_OF(font_exts), COUNT_OF(icon_exts)};
const char* selected_pack =
app->asset_pack_index == 0 ?
"Default" :
*CharList_get(app->asset_pack_names, app->asset_pack_index - 1);

Storage* storage = furi_record_open(RECORD_STORAGE);
FuriString* path = furi_string_alloc();
FuriString** paths = NULL;
size_t num_paths = 0;

for(size_t i = 0; i < COUNT_OF(dirs); i++) {
FuriString** files = NULL;
size_t num_files = 0;

furi_string_printf(path, "%s/%s/%s", ASSET_PACKS_PATH, selected_pack, dirs[i]);
if(storage_dir_exists(storage, furi_string_get_cstr(path))) {
if(storage_list_dir(
storage,
furi_string_get_cstr(path),
&files,
&num_files,
true,
exts[i],
ext_counts[i])) {
paths = realloc(paths, (num_paths + num_files) * sizeof(FuriString*));
memcpy(&paths[num_paths], files, num_files * sizeof(FuriString*));
num_paths += num_files;
free(files);
}
}
}

size_t f_count = 0;
size_t i_count = 0;
for(size_t i = 0; i < num_paths; i++) {
if(furi_string_start_with_str(paths[i], ASSET_PACKS_PATH)) {
if(furi_string_search_str(paths[i], "/Fonts/") != FURI_STRING_FAILURE) {
f_count++;
} else if(furi_string_search_str(paths[i], "/Icons/") != FURI_STRING_FAILURE) {
i_count++;
}
}
}

FuriString* title = furi_string_alloc();
if(f_count > 0 && i_count > 0) {
furi_string_printf(title, "%zu Fonts, %zu Icons", f_count, i_count);
} else if(f_count > 0) {
furi_string_printf(title, "%zu Fonts", f_count);
} else if(i_count > 0) {
furi_string_printf(title, "%zu Icons", i_count);
}

widget_add_string_element(
app->widget, 35, 57, AlignLeft, AlignCenter, FontPrimary, furi_string_get_cstr(title));
furi_string_free(title);

widget_add_file_list_element(app->widget, 0, 12, 4, paths, num_paths, 0, 52, true);

view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewWidget);
}

bool momentum_app_scene_interface_graphics_pack_warning_info_on_event(
void* context,
SceneManagerEvent event) {
MomentumApp* app = context;

if((event.type == SceneManagerEventTypeCustom && event.event == GuiButtonTypeLeft) ||
event.type == SceneManagerEventTypeBack) {
scene_manager_search_and_switch_to_previous_scene(
app->scene_manager, MomentumAppSceneInterfaceGraphics);
return true;
}
return false;
}

void momentum_app_scene_interface_graphics_pack_warning_info_on_exit(void* context) {
MomentumApp* app = context;
widget_reset(app->widget);
}
22 changes: 17 additions & 5 deletions applications/services/gui/modules/widget.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,6 @@

ARRAY_DEF(ElementArray, WidgetElement*, M_PTR_OPLIST); // NOLINT

struct Widget {
View* view;
void* context;
};

typedef struct {
ElementArray_t element;
} GuiWidgetModel;
Expand Down Expand Up @@ -119,6 +114,23 @@ static void widget_add_element(Widget* widget, WidgetElement* element) {
true);
}

WidgetElement* widget_add_file_list_element(
Widget* widget,
uint8_t x,
uint8_t y,
uint8_t lines,
FuriString** files,
size_t count,
uint8_t scrollbar_y,
uint8_t scrollbar_height,
bool show_size) {
furi_assert(widget);
WidgetElement* file_list_element = widget_element_file_list_create(
widget, x, y, lines, files, count, scrollbar_y, scrollbar_height, show_size);
widget_add_element(widget, file_list_element);
return file_list_element;
}

WidgetElement* widget_add_string_multiline_element(
Widget* widget,
uint8_t x,
Expand Down
23 changes: 23 additions & 0 deletions applications/services/gui/modules/widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,29 @@ void widget_reset(Widget* widget);
*/
View* widget_get_view(Widget* widget);

/** Add File List Element
*
* @param widget Widget instance
* @param x x coordinate
* @param y y coordinate
* @param lines Number of lines visible
* @param files Array of FuriString pointers
* @param count Number of files
* @param scrollbar_y Y coordinate of the scrollbar
* @param scrollbar_height Height of the scrollbar
* @param show_size Show file size
*/
WidgetElement* widget_add_file_list_element(
Widget* widget,
uint8_t x,
uint8_t y,
uint8_t lines,
FuriString** files,
size_t count,
uint8_t scrollbar_y,
uint8_t scrollbar_height,
bool show_size);

/** Add Multi String Element
*
* @param widget Widget instance
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#pragma once

#include "input/input.h"
#ifdef __cplusplus
extern "C" {
#endif
Expand Down
Loading