[FL-2491] File browser GUI module (#1237)
* File browser module and test app * nfc: Add support for saved files in subdirectories * nfc: Use helper function to get shadow path when loading data * File browser dialog integration pt.1 * File browser dialog integration pt.2 * Gui,Dialogs: drop file select * Correct use of dynamic string_t(string_ptr) Co-authored-by: Yukai Li <yukaili.geek@gmail.com> Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
|
||||
struct iButtonKey {
|
||||
uint8_t data[IBUTTON_KEY_DATA_SIZE];
|
||||
char name[IBUTTON_KEY_NAME_SIZE];
|
||||
iButtonKeyType type;
|
||||
};
|
||||
|
||||
@@ -42,14 +41,6 @@ uint8_t ibutton_key_get_data_size(iButtonKey* key) {
|
||||
return ibutton_key_get_size_by_type(key->type);
|
||||
}
|
||||
|
||||
void ibutton_key_set_name(iButtonKey* key, const char* name) {
|
||||
strlcpy(key->name, name, IBUTTON_KEY_NAME_SIZE);
|
||||
}
|
||||
|
||||
const char* ibutton_key_get_name_p(iButtonKey* key) {
|
||||
return key->name;
|
||||
}
|
||||
|
||||
void ibutton_key_set_type(iButtonKey* key, iButtonKeyType key_type) {
|
||||
key->type = key_type;
|
||||
}
|
||||
|
@@ -68,20 +68,6 @@ const uint8_t* ibutton_key_get_data_p(iButtonKey* key);
|
||||
*/
|
||||
uint8_t ibutton_key_get_data_size(iButtonKey* key);
|
||||
|
||||
/**
|
||||
* Set key name
|
||||
* @param key
|
||||
* @param name
|
||||
*/
|
||||
void ibutton_key_set_name(iButtonKey* key, const char* name);
|
||||
|
||||
/**
|
||||
* Get pointer to key name
|
||||
* @param key
|
||||
* @return const char*
|
||||
*/
|
||||
const char* ibutton_key_get_name_p(iButtonKey* key);
|
||||
|
||||
/**
|
||||
* Set key type
|
||||
* @param key
|
||||
|
@@ -19,6 +19,20 @@ void path_extract_filename_no_ext(const char* path, string_t filename) {
|
||||
string_mid(filename, start_position, end_position - start_position);
|
||||
}
|
||||
|
||||
void path_extract_filename(string_t path, string_t name, bool trim_ext) {
|
||||
size_t filename_start = string_search_rchar(path, '/');
|
||||
if(filename_start > 0) {
|
||||
filename_start++;
|
||||
string_set_n(name, path, filename_start, string_size(path) - filename_start);
|
||||
}
|
||||
if(trim_ext) {
|
||||
size_t dot = string_search_rchar(name, '.');
|
||||
if(dot > 0) {
|
||||
string_left(name, dot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline void path_cleanup(string_t path) {
|
||||
string_strim(path);
|
||||
while(string_end_with_str_p(path, "/")) {
|
||||
|
@@ -14,6 +14,15 @@ extern "C" {
|
||||
*/
|
||||
void path_extract_filename_no_ext(const char* path, string_t filename);
|
||||
|
||||
/**
|
||||
* @brief Extract filename string from path.
|
||||
*
|
||||
* @param path path string
|
||||
* @param filename output filename string. Must be initialized before.
|
||||
* @param trim_ext true - get filename without extension
|
||||
*/
|
||||
void path_extract_filename(string_t path, string_t filename, bool trim_ext);
|
||||
|
||||
/**
|
||||
* @brief Extract last path component
|
||||
*
|
||||
|
Reference in New Issue
Block a user