From a1a0af52c36dd76178bebea01d8cea001f27368f Mon Sep 17 00:00:00 2001 From: eshifri Date: Sat, 5 Jun 2021 16:36:47 -0700 Subject: [PATCH 1/3] Fole copy/rename implemented --- radio/src/gui/colorlcd/radio_sdmanager.cpp | 80 ++++++++++++++++++++-- radio/src/opentx.h | 8 +++ 2 files changed, 83 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/colorlcd/radio_sdmanager.cpp b/radio/src/gui/colorlcd/radio_sdmanager.cpp index 3e9227cb0..bfa53d200 100644 --- a/radio/src/gui/colorlcd/radio_sdmanager.cpp +++ b/radio/src/gui/colorlcd/radio_sdmanager.cpp @@ -26,11 +26,71 @@ #include "io/bootloader_flash.h" #include "standalone_lua.h" +class FileNameEditWindow : public Page { + public: + FileNameEditWindow(const std::string iName) : + Page(ICON_RADIO_SD_MANAGER), + name(std::move(iName)) + { + buildBody(&body); + buildHeader(&header); + }; + + protected: + const std::string name; + + void buildHeader(Window * window) + { + new StaticText(window, {70, 4, 180, 30}, STR_RENAME_FILE, MENU_BGCOLOR); + } + + void buildBody(Window * window) + { + GridLayout grid(window); + grid.spacer(8); + uint8_t nameLength; + uint8_t extLength; + char* ext = (char *)getFileExtension(name.data(), 0, 0, &nameLength, &extLength); + + reusableBuffer.sdManager.ext[0] = 0; + if(ext) + strncpy(reusableBuffer.sdManager.ext, ext, extLength); + + nameLength -= extLength; + if (nameLength > SD_SCREEN_FILE_LENGTH) nameLength = SD_SCREEN_FILE_LENGTH; + + strncpy(reusableBuffer.sdManager.originalName, name.c_str(), nameLength); + reusableBuffer.sdManager.originalName[nameLength] = 0; + + auto newFileName = new TextEdit(window, grid.getSlot(), reusableBuffer.sdManager.originalName, SD_SCREEN_FILE_LENGTH, LcdFlags(0)); + { + char* newValue = newFileName->getData(); + size_t totalSize = strlen(newValue);//sizeof(reusableBuffer.sdManager.changedName); + strncpy(reusableBuffer.sdManager.changedName, newValue, totalSize); + reusableBuffer.sdManager.changedName[totalSize] = 0; + if (extLength) { + strncpy(reusableBuffer.sdManager.changedName + totalSize, reusableBuffer.sdManager.ext, extLength);//totalSisze-strlen(newValue)); + } + reusableBuffer.sdManager.changedName[totalSize + extLength] = 0; + f_rename((const TCHAR*)name.c_str(), reusableBuffer.sdManager.changedName); + } + } +}; + + RadioSdManagerPage::RadioSdManagerPage() : PageTab(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, ICON_RADIO_SD_MANAGER) { } +void RadioSdManagerPage::rebuild(FormWindow * window) +{ + coord_t scrollPosition = window->getScrollPositionY(); + window->clear(); + build(window); + window->setScrollPositionY(scrollPosition); +} + // TODO elsewhere extern bool compare_nocase(const std::string &first, const std::string &second); @@ -38,7 +98,7 @@ extern bool compare_nocase(const std::string &first, const std::string &second); char * getFullPath(const std::string &filename) { static char full_path[FF_MAX_LFN + 1]; // TODO optimize that! - f_getcwd(full_path, FF_MAX_LFN); + f_getcwd((TCHAR*)full_path, FF_MAX_LFN); strcat(full_path, "/"); strcat(full_path, filename.c_str()); return full_path; @@ -271,15 +331,25 @@ void RadioSdManagerPage::build(FormWindow * window) strncpy(clipboard.data.sd.filename, name.c_str(), CLIPBOARD_PATH_LEN - 1); }); if (clipboard.type == CLIPBOARD_TYPE_SD_FILE) { - menu->addLine(STR_PASTE, [=]() { - // TODO + menu->addLine(STR_PASTE, [=]() { + TCHAR lfn[FF_MAX_LFN+1]; + f_getcwd(lfn, FF_MAX_LFN); + + if (strcmp(clipboard.data.sd.directory, lfn)) { // prevent copying to the same directory + POPUP_WARNING(sdCopyFile(clipboard.data.sd.filename, clipboard.data.sd.directory, clipboard.data.sd.filename, lfn)); + clipboard.type = CLIPBOARD_TYPE_NONE; + } + rebuild(window); }); } menu->addLine(STR_RENAME_FILE, [=]() { - // TODO + auto few = new FileNameEditWindow(name); + few->setCloseHandler([=]() { + rebuild(window); + }); }); menu->addLine(STR_DELETE_FILE, [=]() { - f_unlink(getFullPath(name)); + f_unlink((const TCHAR*)getFullPath(name)); // coord_t scrollPosition = window->getScrollPositionY(); window->clear(); build(window); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 75057c6c8..800cd3207 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -37,6 +37,12 @@ #include "usbd_conf.h" #endif +#if defined(LIBOPENUI) + #include "libopenui.h" +#else + #include "libopenui/src/libopenui_file.h" +#endif + #if defined(SIMU) #define SWITCH_SIMU(a, b) (a) #else @@ -1081,6 +1087,8 @@ union ReusableBuffer uint16_t offset; uint16_t count; char originalName[SD_SCREEN_FILE_LENGTH+1]; + char changedName[SD_SCREEN_FILE_LENGTH+1]; + char ext[LEN_FILE_EXTENSION_MAX+1]; OtaUpdateInformation otaUpdateInformation; char otaReceiverVersion[sizeof(TR_CURRENT_VERSION) + 12]; } sdManager; From 2c5bd47647d55959869e066b76ae69dd7f625325 Mon Sep 17 00:00:00 2001 From: eshifri Date: Wed, 9 Jun 2021 18:45:34 -0700 Subject: [PATCH 2/3] formatting applied --- radio/src/gui/colorlcd/radio_sdmanager.cpp | 98 +++++++++++----------- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/radio/src/gui/colorlcd/radio_sdmanager.cpp b/radio/src/gui/colorlcd/radio_sdmanager.cpp index 4f5f11f13..290ae73aa 100644 --- a/radio/src/gui/colorlcd/radio_sdmanager.cpp +++ b/radio/src/gui/colorlcd/radio_sdmanager.cpp @@ -26,64 +26,66 @@ #include "io/bootloader_flash.h" #include "standalone_lua.h" -class FileNameEditWindow : public Page { +class FileNameEditWindow : public Page +{ public: - FileNameEditWindow(const std::string iName) : - Page(ICON_RADIO_SD_MANAGER), - name(std::move(iName)) - { - buildBody(&body); - buildHeader(&header); - }; + FileNameEditWindow(const std::string iName) : + Page(ICON_RADIO_SD_MANAGER), name(std::move(iName)) + { + buildBody(&body); + buildHeader(&header); + }; #if defined(DEBUG_WINDOWS) - std::string getName() const override - { - return "FileNameEditWindow"; - } + std::string getName() const override { return "FileNameEditWindow"; } #endif protected: - const std::string name; + const std::string name; - void buildHeader(Window * window) + void buildHeader(Window *window) + { + new StaticText(window, {70, 4, 180, 30}, STR_RENAME_FILE, MENU_BGCOLOR); + } + + void buildBody(Window *window) + { + GridLayout grid(window); + grid.spacer(8); + uint8_t nameLength; + uint8_t extLength; + char *ext = + (char *)getFileExtension(name.data(), 0, 0, &nameLength, &extLength); + + reusableBuffer.sdManager.ext[0] = 0; + if (ext) strncpy(reusableBuffer.sdManager.ext, ext, extLength); + + nameLength -= extLength; + if (nameLength > SD_SCREEN_FILE_LENGTH) nameLength = SD_SCREEN_FILE_LENGTH; + + strncpy(reusableBuffer.sdManager.originalName, name.c_str(), nameLength); + reusableBuffer.sdManager.originalName[nameLength] = 0; + + auto newFileName = new TextEdit(window, grid.getSlot(), + reusableBuffer.sdManager.originalName, + SD_SCREEN_FILE_LENGTH, LcdFlags(0)); { - new StaticText(window, {70, 4, 180, 30}, STR_RENAME_FILE, MENU_BGCOLOR); + char *newValue = newFileName->getData(); + size_t totalSize = + strlen(newValue); // sizeof(reusableBuffer.sdManager.changedName); + strncpy(reusableBuffer.sdManager.changedName, newValue, totalSize); + reusableBuffer.sdManager.changedName[totalSize] = 0; + if (extLength) { + strncpy(reusableBuffer.sdManager.changedName + totalSize, + reusableBuffer.sdManager.ext, + extLength); // totalSisze-strlen(newValue)); + } + reusableBuffer.sdManager.changedName[totalSize + extLength] = 0; + f_rename((const TCHAR *)name.c_str(), + reusableBuffer.sdManager.changedName); } - - void buildBody(Window * window) - { - GridLayout grid(window); - grid.spacer(8); - uint8_t nameLength; - uint8_t extLength; - char* ext = (char *)getFileExtension(name.data(), 0, 0, &nameLength, &extLength); - - reusableBuffer.sdManager.ext[0] = 0; - if(ext) - strncpy(reusableBuffer.sdManager.ext, ext, extLength); - - nameLength -= extLength; - if (nameLength > SD_SCREEN_FILE_LENGTH) nameLength = SD_SCREEN_FILE_LENGTH; - - strncpy(reusableBuffer.sdManager.originalName, name.c_str(), nameLength); - reusableBuffer.sdManager.originalName[nameLength] = 0; - - auto newFileName = new TextEdit(window, grid.getSlot(), reusableBuffer.sdManager.originalName, SD_SCREEN_FILE_LENGTH, LcdFlags(0)); - { - char* newValue = newFileName->getData(); - size_t totalSize = strlen(newValue);//sizeof(reusableBuffer.sdManager.changedName); - strncpy(reusableBuffer.sdManager.changedName, newValue, totalSize); - reusableBuffer.sdManager.changedName[totalSize] = 0; - if (extLength) { - strncpy(reusableBuffer.sdManager.changedName + totalSize, reusableBuffer.sdManager.ext, extLength);//totalSisze-strlen(newValue)); - } - reusableBuffer.sdManager.changedName[totalSize + extLength] = 0; - f_rename((const TCHAR*)name.c_str(), reusableBuffer.sdManager.changedName); - } - } + } }; - RadioSdManagerPage::RadioSdManagerPage() : PageTab(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, ICON_RADIO_SD_MANAGER) { From 07a3ff5c3a011cc075bc1310dd49c307d271b261 Mon Sep 17 00:00:00 2001 From: eshifri Date: Sat, 12 Jun 2021 10:22:42 -0700 Subject: [PATCH 3/3] fixed rename and copy --- radio/src/gui/colorlcd/radio_sdmanager.cpp | 80 ++++++++++++---------- radio/src/opentx.h | 2 - 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/radio/src/gui/colorlcd/radio_sdmanager.cpp b/radio/src/gui/colorlcd/radio_sdmanager.cpp index 290ae73aa..5079e5269 100644 --- a/radio/src/gui/colorlcd/radio_sdmanager.cpp +++ b/radio/src/gui/colorlcd/radio_sdmanager.cpp @@ -25,6 +25,7 @@ #include "io/multi_firmware_update.h" #include "io/bootloader_flash.h" #include "standalone_lua.h" +#include "sdcard.h" class FileNameEditWindow : public Page { @@ -53,37 +54,39 @@ class FileNameEditWindow : public Page grid.spacer(8); uint8_t nameLength; uint8_t extLength; - char *ext = - (char *)getFileExtension(name.data(), 0, 0, &nameLength, &extLength); + char extension[LEN_FILE_EXTENSION_MAX + 1]; + memset(extension, 0, sizeof(extension)); + const char *ext = + getFileExtension(name.data(), 0, 0, &nameLength, &extLength); - reusableBuffer.sdManager.ext[0] = 0; - if (ext) strncpy(reusableBuffer.sdManager.ext, ext, extLength); + if (extLength > LEN_FILE_EXTENSION_MAX) extLength = LEN_FILE_EXTENSION_MAX; + if (ext) strncpy(extension, ext, extLength); + const uint8_t maxNameLength = SD_SCREEN_FILE_LENGTH - extLength; nameLength -= extLength; - if (nameLength > SD_SCREEN_FILE_LENGTH) nameLength = SD_SCREEN_FILE_LENGTH; + if (nameLength > maxNameLength) nameLength = maxNameLength; + memset(reusableBuffer.sdManager.originalName, 0, SD_SCREEN_FILE_LENGTH); strncpy(reusableBuffer.sdManager.originalName, name.c_str(), nameLength); - reusableBuffer.sdManager.originalName[nameLength] = 0; + reusableBuffer.sdManager.originalName[nameLength] = '\0'; - auto newFileName = new TextEdit(window, grid.getSlot(), - reusableBuffer.sdManager.originalName, - SD_SCREEN_FILE_LENGTH, LcdFlags(0)); - { - char *newValue = newFileName->getData(); - size_t totalSize = - strlen(newValue); // sizeof(reusableBuffer.sdManager.changedName); - strncpy(reusableBuffer.sdManager.changedName, newValue, totalSize); - reusableBuffer.sdManager.changedName[totalSize] = 0; + auto newFileName = new TextEdit( + window, grid.getSlot(), reusableBuffer.sdManager.originalName, + SD_SCREEN_FILE_LENGTH - extLength, LcdFlags(0)); + newFileName->setChangeHandler([=]() { + char *newValue = reusableBuffer.sdManager.originalName; + size_t totalSize = strlen(newValue); + char changedName[SD_SCREEN_FILE_LENGTH + 1]; + memset(changedName, 0, sizeof(changedName)); + strncpy(changedName, newValue, totalSize); + changedName[totalSize] = '\0'; if (extLength) { - strncpy(reusableBuffer.sdManager.changedName + totalSize, - reusableBuffer.sdManager.ext, - extLength); // totalSisze-strlen(newValue)); + strncpy(changedName + totalSize, extension, extLength); } - reusableBuffer.sdManager.changedName[totalSize + extLength] = 0; - f_rename((const TCHAR *)name.c_str(), - reusableBuffer.sdManager.changedName); - } - } + changedName[totalSize + extLength] = '\0'; + f_rename((const TCHAR *)name.c_str(), (const TCHAR *)changedName); + }); + }; }; RadioSdManagerPage::RadioSdManagerPage() : @@ -334,27 +337,32 @@ void RadioSdManagerPage::build(FormWindow * window) } if (!READ_ONLY()) { menu->addLine(STR_COPY_FILE, [=]() { - clipboard.type = CLIPBOARD_TYPE_SD_FILE; - f_getcwd(clipboard.data.sd.directory, CLIPBOARD_PATH_LEN); - strncpy(clipboard.data.sd.filename, name.c_str(), CLIPBOARD_PATH_LEN - 1); + clipboard.type = CLIPBOARD_TYPE_SD_FILE; + f_getcwd(clipboard.data.sd.directory, CLIPBOARD_PATH_LEN); + strncpy(clipboard.data.sd.filename, name.c_str(), + CLIPBOARD_PATH_LEN - 1); }); if (clipboard.type == CLIPBOARD_TYPE_SD_FILE) { - menu->addLine(STR_PASTE, [=]() { - TCHAR lfn[FF_MAX_LFN+1]; - f_getcwd(lfn, FF_MAX_LFN); - - if (strcmp(clipboard.data.sd.directory, lfn)) { // prevent copying to the same directory - POPUP_WARNING(sdCopyFile(clipboard.data.sd.filename, clipboard.data.sd.directory, clipboard.data.sd.filename, lfn)); - clipboard.type = CLIPBOARD_TYPE_NONE; - } - rebuild(window); + menu->addLine(STR_PASTE, [=]() { + static char lfn[FF_MAX_LFN + 1]; // TODO optimize that! + f_getcwd((TCHAR *)lfn, FF_MAX_LFN); + // prevent copying to the same directory + if (strcmp(clipboard.data.sd.directory, lfn)) { + sdCopyFile(clipboard.data.sd.filename, + clipboard.data.sd.directory, + clipboard.data.sd.filename, lfn); + clipboard.type = CLIPBOARD_TYPE_NONE; + } + rebuild(window); }); } menu->addLine(STR_RENAME_FILE, [=]() { auto few = new FileNameEditWindow(name); - few->setCloseHandler([=]() { + few->setCloseHandler([=]() { + //window->clear(); rebuild(window); }); + // rebuild(window); }); }); menu->addLine(STR_DELETE_FILE, [=]() { f_unlink((const TCHAR*)getFullPath(name)); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 800cd3207..c95b181a2 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1087,8 +1087,6 @@ union ReusableBuffer uint16_t offset; uint16_t count; char originalName[SD_SCREEN_FILE_LENGTH+1]; - char changedName[SD_SCREEN_FILE_LENGTH+1]; - char ext[LEN_FILE_EXTENSION_MAX+1]; OtaUpdateInformation otaUpdateInformation; char otaReceiverVersion[sizeof(TR_CURRENT_VERSION) + 12]; } sdManager;