diff --git a/applications/main/archive/helpers/archive_menu.h b/applications/main/archive/helpers/archive_menu.h index 4a85b851d..683c6e6fc 100644 --- a/applications/main/archive/helpers/archive_menu.h +++ b/applications/main/archive/helpers/archive_menu.h @@ -43,8 +43,8 @@ ARRAY_DEF( #pragma GCC diagnostic ignored "-Wunused-function" // Using in applications/archive/views/archive_browser_view.c static void - archive_menu_add_item(ArchiveContextMenuItem_t* obj, FuriString* text, uint32_t event) { + archive_menu_add_item(ArchiveContextMenuItem_t* obj, const char* text, uint32_t event) { obj->text = furi_string_alloc_set(text); obj->event = event; } -#pragma GCC diagnostic pop \ No newline at end of file +#pragma GCC diagnostic pop diff --git a/applications/main/archive/scenes/archive_scene_browser.c b/applications/main/archive/scenes/archive_scene_browser.c index 0854c2d3f..458d5a442 100644 --- a/applications/main/archive/scenes/archive_scene_browser.c +++ b/applications/main/archive/scenes/archive_scene_browser.c @@ -114,9 +114,7 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { consumed = true; break; case ArchiveBrowserEventManageMenuOpen: - if(!favorites) { - archive_show_file_menu(browser, true, true); - } + archive_show_file_menu(browser, true, true); consumed = true; break; case ArchiveBrowserEventFileMenuClose: @@ -133,7 +131,7 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { archive_show_file_menu(browser, false, false); consumed = true; break; - case ArchiveBrowserEventFileMenuPin: { + case ArchiveBrowserEventFileMenuFavorite: { const char* name = archive_get_name(browser); if(favorites) { archive_favorites_delete("%s", name); @@ -162,38 +160,6 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(archive->scene_manager, ArchiveAppSceneShow); consumed = true; break; - case ArchiveBrowserEventFileMenuCut: - archive_show_file_menu(browser, false, false); - if(!favorites) { - with_view_model( - browser->view, - ArchiveBrowserViewModel * model, - { - if(model->clipboard == NULL) { - model->clipboard = strdup(furi_string_get_cstr(selected->path)); - model->clipboard_copy = false; - } - }, - false); - } - consumed = true; - break; - case ArchiveBrowserEventFileMenuCopy: - archive_show_file_menu(browser, false, false); - if(!favorites) { - with_view_model( - browser->view, - ArchiveBrowserViewModel * model, - { - if(model->clipboard == NULL) { - model->clipboard = strdup(furi_string_get_cstr(selected->path)); - model->clipboard_copy = true; - } - }, - false); - } - consumed = true; - break; case ArchiveBrowserEventFileMenuPaste: archive_show_file_menu(browser, false, false); if(!favorites) { @@ -249,6 +215,38 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { } consumed = true; break; + case ArchiveBrowserEventFileMenuCut: + archive_show_file_menu(browser, false, false); + if(!favorites) { + with_view_model( + browser->view, + ArchiveBrowserViewModel * model, + { + if(model->clipboard == NULL) { + model->clipboard = strdup(furi_string_get_cstr(selected->path)); + model->clipboard_copy = false; + } + }, + false); + } + consumed = true; + break; + case ArchiveBrowserEventFileMenuCopy: + archive_show_file_menu(browser, false, false); + if(!favorites) { + with_view_model( + browser->view, + ArchiveBrowserViewModel * model, + { + if(model->clipboard == NULL) { + model->clipboard = strdup(furi_string_get_cstr(selected->path)); + model->clipboard_copy = true; + } + }, + false); + } + consumed = true; + break; case ArchiveBrowserEventFileMenuNewDir: archive_show_file_menu(browser, false, false); if(!favorites) { @@ -273,11 +271,9 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { break; case ArchiveBrowserEventFileMenuDelete: archive_show_file_menu(browser, false, false); - if(!favorites) { - scene_manager_set_scene_state( - archive->scene_manager, ArchiveAppSceneBrowser, SCENE_STATE_NEED_REFRESH); - scene_manager_next_scene(archive->scene_manager, ArchiveAppSceneDelete); - } + scene_manager_set_scene_state( + archive->scene_manager, ArchiveAppSceneBrowser, SCENE_STATE_NEED_REFRESH); + scene_manager_next_scene(archive->scene_manager, ArchiveAppSceneDelete); consumed = true; break; case ArchiveBrowserEventEnterDir: diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index bd17f1925..af60e89b0 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -57,126 +57,92 @@ static void render_item_menu(Canvas* canvas, ArchiveBrowserViewModel* model) { NULL; bool favorites = model->tab_idx == ArchiveTabFavorites; - if(model->menu_manage && !favorites) { - FuriString* item_cut = furi_string_alloc_set("Cut"); - FuriString* item_copy = furi_string_alloc_set("Copy"); - FuriString* item_paste = furi_string_alloc_set("Paste"); - FuriString* item_new_dir = furi_string_alloc_set("New Dir"); - FuriString* item_rename = furi_string_alloc_set("Rename"); - FuriString* item_delete = furi_string_alloc_set("Delete"); - if(!model->is_app_tab) { + if(model->menu_manage) { + if(!model->is_app_tab && !favorites) { if(model->clipboard != NULL) { archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_paste, + "Paste", ArchiveBrowserEventFileMenuPaste); } else if(selected) { archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_cut, + "Cut", ArchiveBrowserEventFileMenuCut); archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_copy, + "Copy", ArchiveBrowserEventFileMenuCopy); } archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_new_dir, + "New Dir", ArchiveBrowserEventFileMenuNewDir); } if(selected) { - if(!selected->is_app) { + if(favorites) { archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_rename, + "Move", + ArchiveBrowserEventFileMenuRename); + } else if(!selected->is_app) { + archive_menu_add_item( + menu_array_push_raw(model->context_menu), + "Rename", ArchiveBrowserEventFileMenuRename); } archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_delete, + "Delete", ArchiveBrowserEventFileMenuDelete); } - furi_string_free(item_cut); - furi_string_free(item_copy); - furi_string_free(item_paste); - furi_string_free(item_new_dir); - furi_string_free(item_rename); - furi_string_free(item_delete); - } else if(!model->menu_manage && selected) { - FuriString* item_run = furi_string_alloc_set("Run In App"); - FuriString* item_pin = furi_string_alloc_set("Pin"); - FuriString* item_info = furi_string_alloc_set("Info"); - FuriString* item_show = furi_string_alloc_set("Show"); - FuriString* item_move = furi_string_alloc_set("Move"); - if(selected->fav || favorites) { - furi_string_set(item_pin, "Unpin"); - } - + } else if(selected) { if(archive_is_known_app(selected->type)) { if(selected->type != ArchiveFileTypeFolder) { archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_run, + "Run In App", ArchiveBrowserEventFileMenuRun); } archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_pin, - ArchiveBrowserEventFileMenuPin); + (selected->fav || favorites) ? "Unfavorite" : "Favorite", + ArchiveBrowserEventFileMenuFavorite); } if(!selected->is_app) { archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_info, + "Info", ArchiveBrowserEventFileMenuInfo); if(selected->type != ArchiveFileTypeFolder) { archive_menu_add_item( menu_array_push_raw(model->context_menu), - item_show, + "Show", ArchiveBrowserEventFileMenuShow); } } - if(favorites) { - archive_menu_add_item( - menu_array_push_raw(model->context_menu), - item_move, - ArchiveBrowserEventFileMenuRename); - } - - furi_string_free(item_run); - furi_string_free(item_pin); - furi_string_free(item_info); - furi_string_free(item_show); - furi_string_free(item_move); } - } /*else { - FURI_LOG_D(TAG, "menu_array_size already set: %d", menu_array_size(model->context_menu)); - }*/ + } size_t size_menu = menu_array_size(model->context_menu); const uint8_t menu_height = 48; const uint8_t line_height = 10; + const uint8_t calc_height = menu_height - ((MENU_ITEMS - size_menu - 1) * line_height); + const uint8_t off = (MENU_ITEMS - size_menu) * (line_height / 2); canvas_set_color(canvas, ColorWhite); - uint8_t calc_height = menu_height - ((MENU_ITEMS - size_menu - 1) * line_height); - canvas_draw_box(canvas, 71, 1, 57, calc_height + 4); + canvas_draw_box(canvas, 72, off + 2, 56, calc_height + 4); canvas_set_color(canvas, ColorBlack); - elements_slightly_rounded_frame(canvas, 70, 2, 58, calc_height + 4); + elements_slightly_rounded_frame(canvas, 71, off + 2, 57, calc_height + 4); - /*FURI_LOG_D( - TAG, - "size_menu: %d, calc_height: %d, menu_idx: %d", - size_menu, - calc_height, - model->menu_idx);*/ - canvas_draw_str(canvas, 74, 11, model->menu_manage ? "Manage:" : "Actions:"); + canvas_draw_str(canvas, 74, off + 11, model->menu_manage ? "Manage:" : "Actions:"); for(size_t i = 0; i < size_menu; i++) { ArchiveContextMenuItem_t* current = menu_array_get(model->context_menu, i); canvas_draw_str( - canvas, 82, 11 + (i + 1) * line_height, furi_string_get_cstr(current->text)); + canvas, 82, off + 11 + (i + 1) * line_height, furi_string_get_cstr(current->text)); } - canvas_draw_icon(canvas, 74, 4 + (model->menu_idx + 1) * line_height, &I_ButtonRight_4x7); + canvas_draw_icon( + canvas, 74, off + 4 + (model->menu_idx + 1) * line_height, &I_ButtonRight_4x7); } static void archive_draw_frame(Canvas* canvas, uint16_t idx, bool scrollbar, bool moving) { diff --git a/applications/main/archive/views/archive_browser_view.h b/applications/main/archive/views/archive_browser_view.h index 383da4769..885df4d09 100644 --- a/applications/main/archive/views/archive_browser_view.h +++ b/applications/main/archive/views/archive_browser_view.h @@ -40,15 +40,15 @@ typedef enum { ArchiveBrowserEventFileMenuOpen, ArchiveBrowserEventManageMenuOpen, ArchiveBrowserEventFileMenuRun, - ArchiveBrowserEventFileMenuPin, + ArchiveBrowserEventFileMenuFavorite, + ArchiveBrowserEventFileMenuInfo, + ArchiveBrowserEventFileMenuShow, + ArchiveBrowserEventFileMenuPaste, ArchiveBrowserEventFileMenuCut, ArchiveBrowserEventFileMenuCopy, - ArchiveBrowserEventFileMenuPaste, ArchiveBrowserEventFileMenuNewDir, ArchiveBrowserEventFileMenuRename, ArchiveBrowserEventFileMenuDelete, - ArchiveBrowserEventFileMenuInfo, - ArchiveBrowserEventFileMenuShow, ArchiveBrowserEventFileMenuClose, ArchiveBrowserEventEnterDir,