static Ret ftk_file_browser_on_item_clicked(void* ctx, void* list) { FtkWidget* win = (FtkWidget*)ctx; FtkListItemInfo* info = NULL; int i = ftk_list_view_get_selected((FtkWidget*)list); PrivInfo* priv = (PrivInfo*)ftk_widget_user_data(win); FtkListModel* model = ftk_list_view_get_model((FtkWidget*)list); return_val_if_fail(priv != NULL, RET_FAIL); ftk_list_model_get_data(model, i, (void**)&info); if(info != NULL && info->text != NULL) { char* p = NULL; char path[FTK_MAX_PATH+1] = {0}; char* file_name = info->text; if(strcmp(file_name, _("..")) == 0) { ftk_strcpy(path, priv->path); if((p = strrchr(path, FTK_PATH_DELIM)) != NULL) { if(p == path) { p[1] = '\0'; } else { *p = '\0'; } } ftk_file_browser_set_path(win, path); ftk_file_browser_load(win); } else if(info->value) /*enter selected folder*/ { ftk_strs_cat(path, FTK_MAX_PATH, priv->path, "/", file_name, NULL); ftk_file_browser_set_path(win, path); ftk_file_browser_load(win); } else if(priv->type == FTK_FILE_BROWER_SINGLE_CHOOSER) { if(priv->on_choosed != NULL) { ftk_strs_cat(path, FTK_MAX_PATH, priv->path, "/", file_name, NULL); priv->on_choosed(priv->on_choosed_ctx, 0, path); ftk_widget_unref(win); } } else if(priv->type == FTK_FILE_BROWER_MULTI_CHOOSER) { info->state = !info->state; } } return RET_OK; }
static void test_ftk_strs_cat() { char path[FTK_MAX_PATH] = {0}; assert(strcmp(ftk_strs_cat(path, FTK_MAX_PATH, NULL), "") == 0); assert(strcmp(ftk_strs_cat(path, FTK_MAX_PATH, "/", NULL), "/") == 0); assert(strcmp(ftk_strs_cat(path, FTK_MAX_PATH, "/", "a", NULL), "/a") == 0); assert(strcmp(ftk_strs_cat(path, FTK_MAX_PATH, "/", NULL, "/", "b", NULL), "/") == 0); assert(strcmp(ftk_strs_cat(path, FTK_MAX_PATH, "/", "a", "/", "b", NULL), "/a/b") == 0); return; }
static Ret ftk_init_font(void) { FtkFont* font = NULL; #if defined(USE_FREETYPE) && defined(ANDROID) && defined(ANDROID_NDK) font = ftk_font_freetype_create(FTK_FONT, 0, 0, FTK_FONT_SIZE); #else char filename[FTK_MAX_PATH + 1] = {0}; ftk_strs_cat(filename, FTK_MAX_PATH, ftk_config_get_data_dir(ftk_default_config()), "/data/", FTK_FONT, NULL); ftk_normalize_path(filename); #ifdef USE_FREETYPE font = ftk_font_freetype_create(filename, 0, 0, FTK_FONT_SIZE); #else font = ftk_font_default_create(filename, 0, 0, 0); #endif #endif if(font != NULL) { ftk_set_font(font); } else { ftk_deinit(); ftk_loge("load font failed.\n"); exit(0); } return RET_OK; }
FtkAnimationTrigger* ftk_animation_trigger_default_create(const char* theme, const char* name) { FtkAnimationTrigger* thiz = FTK_NEW_PRIV(FtkAnimationTrigger); if(thiz != NULL) { char filename[FTK_MAX_PATH + 1] = {0}; ftk_strs_cat(filename, FTK_MAX_PATH, ftk_config_get_data_dir(ftk_default_config()), "/theme/", theme, "/", name, NULL); ftk_normalize_path(filename); thiz->on_event = ftk_animation_trigger_default_on_event; thiz->destroy = ftk_animation_trigger_default_destroy; if(ftk_animation_trigger_parse_file(thiz, filename) == RET_OK) { //ftk_animation_trigger_default_dump(thiz); ftk_logd("%s: them=%s\n", __func__, theme); } else { FTK_FREE(thiz); } } return thiz; }
static Ret ftk_file_browser_on_create_folder(void* ctx, void* obj) { int ret = 0; const char* name = NULL; FtkWidget* win = (FtkWidget*)ctx; FtkWidget* dialog = NULL; PrivInfo* priv = (PrivInfo*)ftk_widget_user_data(win); dialog = ftk_file_browser_input_dialog(win, _("Please input folder name:")); ret = ftk_dialog_run(dialog); if(ret == ID_OK) { name = ftk_entry_get_text(ftk_widget_lookup(dialog, ID_ENTRY)); if(name != NULL) { char folder_name[FTK_MAX_PATH+1] = {0}; ftk_strs_cat(folder_name, FTK_MAX_PATH, priv->path, "/", name, NULL); if(ftk_fs_create_dir(folder_name) == RET_OK) { ftk_file_browser_load(win); } else { ftk_tips(_("Create folder failed.")); } ftk_logd("%s: create %s\n", __func__, folder_name); } } ftk_widget_unref(dialog); ftk_logd("%s: ret=%d\n", __func__, ret); return RET_OK; }
static Ret ftk_file_browser_on_rename(void* ctx, void* obj) { int i = 0; int ret = 0; const char* name = NULL; FtkWidget* win = (FtkWidget*)ctx; FtkWidget* dialog = NULL; FtkListItemInfo* info = NULL; PrivInfo* priv = (PrivInfo*)ftk_widget_user_data(win); i = ftk_list_view_get_selected(priv->list_view); ftk_list_model_get_data(priv->model, i, (void**)&info); return_val_if_fail(info != NULL, RET_FAIL); if(strcmp(info->text, _("..")) == 0) { return RET_FAIL; } dialog = ftk_file_browser_input_dialog(win, _("Please input new name:")); ret = ftk_dialog_run(dialog); if(ret == ID_OK) { name = ftk_entry_get_text(ftk_widget_lookup(dialog, ID_ENTRY)); if(name != NULL) { char new_name[FTK_MAX_PATH+1] = {0}; char old_name[FTK_MAX_PATH+1] = {0}; ftk_strs_cat(old_name, FTK_MAX_PATH, priv->path, "/", info->text, NULL); ftk_strs_cat(new_name, FTK_MAX_PATH, priv->path, "/", name, NULL); if(ftk_fs_move(old_name, new_name) == RET_OK) { ftk_file_browser_load(win); } else { ftk_tips(_("Rename failed.")); } ftk_logd("%s: %s --> %s\n", __func__, old_name, new_name); } } ftk_widget_unref(dialog); ftk_logd("%s: ret=%d\n", __func__, ret); return RET_OK; }
static Ret ftk_file_browser_on_remove(void* ctx, void* obj) { int i = 0; int ret = 0; const char* buttons[3]; FtkWidget* win = (FtkWidget*)ctx; FtkListItemInfo* info = NULL; PrivInfo* priv = (PrivInfo*)ftk_widget_user_data(win); char message[FTK_MAX_PATH + 30] = {0}; buttons[0] = _("Yes"); buttons[1] = _("No"); buttons[2] = NULL; i = ftk_list_view_get_selected(priv->list_view); ftk_list_model_get_data(priv->model, i, (void**)&info); return_val_if_fail(info != NULL, RET_FAIL); if(strcmp(info->text, _("..")) == 0) { return RET_FAIL; } ftk_strs_cat(message, sizeof(message), _("Are you sure to remove:\n "), info->text, NULL); if((ret = ftk_question(_("Remove"), message, buttons)) == 1) { char path[FTK_MAX_PATH+1] = {0}; ftk_strs_cat(path, FTK_MAX_PATH, priv->path, "/", info->text, NULL); if(ftk_fs_delete(path) == RET_OK) { ftk_list_model_remove(priv->model, i); } else { ftk_strs_cat(message, sizeof(message), _("Remove failed:\n"), info->text, NULL); ftk_tips(message); } } return RET_OK; }
static Ret ftk_init_theme(const char* theme) { char filename[FTK_MAX_PATH + 1] = {0}; ftk_set_theme(ftk_theme_create(theme == NULL)); if(theme != NULL) { #if !defined(ANDROID) && !defined(ANDROID_NDK) ftk_strs_cat(filename, FTK_MAX_PATH, ftk_config_get_data_dir(ftk_default_config()), "/theme/", theme, "/theme.xml", NULL); #else ftk_strs_cat(filename, FTK_MAX_PATH, ftk_config_get_data_dir(ftk_default_config()), "/theme/", theme, "/theme.wav", NULL); #endif ftk_normalize_path(filename); ftk_theme_parse_file(ftk_default_theme(), filename); } return RET_OK; }
Ret ftk_config_load(FtkConfig* thiz, const char* progname) { char path[FTK_MAX_PATH+1] = {0}; char cwd[FTK_MAX_PATH+1] = {0}; char filename[FTK_MAX_PATH+1] = {0}; const char* base = progname + strlen(progname); while(base > progname) { if(*base == '/' || *base == '\\') { break; } base--; } if(base > progname) { ftk_strncpy(path, progname, base-progname); } if(ftk_path_is_abs(progname)) { ftk_strs_cat(filename, sizeof(filename), path, "/ftk.cnf", NULL); } else { ftk_getcwd(cwd, sizeof(cwd)); ftk_strs_cat(filename, sizeof(filename), cwd, "/", path, "/ftk.cnf", NULL); } ftk_normalize_path(filename); if(!ftk_mmap_exist(filename)) { return RET_FAIL; } return ftk_config_load_file(thiz, filename); }
static Ret ftk_file_browser_on_ok(void* ctx, void* obj) { int i = 0; FtkWidget* win = (FtkWidget*)ctx; FtkListItemInfo* info = NULL; char path[FTK_MAX_PATH+1] = {0}; PrivInfo* priv = (PrivInfo*)ftk_widget_user_data(win); return_val_if_fail(priv != NULL && priv->on_choosed != NULL, RET_FAIL); if(priv->type == FTK_FILE_BROWER_SINGLE_CHOOSER) { i = ftk_list_view_get_selected(priv->list_view); ftk_list_model_get_data(priv->model, i, (void**)&info); if(info != NULL) { ftk_strs_cat(path, FTK_MAX_PATH, priv->path, "/", info->text, NULL); priv->on_choosed(priv->on_choosed_ctx, 0, path); } } else { int index = 0; int n = ftk_list_model_get_total(priv->model); for(i = 0; i < n; i++) { ftk_list_model_get_data(priv->model, i, (void**)&info); if(info != NULL && info->state) { ftk_strs_cat(path, FTK_MAX_PATH, priv->path, "/", info->text, NULL); priv->on_choosed(priv->on_choosed_ctx, index++, path); } } priv->on_choosed(priv->on_choosed_ctx, -1, NULL); } ftk_widget_unref((FtkWidget*)ctx); return RET_OK; }
static FtkBitmap* ftk_file_browser_load_mime_icon(const char* file_name) { char* p = NULL; char icon_name[FTK_MAX_PATH+1] = {0}; char mime_type[FTK_MIME_TYPE_LEN + 1] = {0}; ftk_strcpy(mime_type, ftk_file_get_mime_type(file_name)); p = strrchr(mime_type, '/'); return_val_if_fail(p != NULL, NULL); *p = '\0'; ftk_strs_cat(icon_name, FTK_MAX_PATH, "mime_", mime_type, FTK_STOCK_IMG_SUFFIX, NULL); return ftk_theme_load_image(ftk_default_theme(), icon_name); }
Ret ftk_file_browser_load(FtkWidget* thiz) { FtkFileInfo info = {0}; FtkFsHandle handle = NULL; FtkListItemInfo item = {0}; const char* mime_type = NULL; char path[FTK_MAX_PATH+1] = {0}; PrivInfo* priv = ftk_widget_user_data(thiz); return_val_if_fail(priv != NULL && priv->path != NULL, RET_FAIL); handle = ftk_dir_open(priv->path); if(handle == NULL) { ftk_logd("%s: open %s\n", __func__, priv->path); } return_val_if_fail(handle != NULL, RET_FAIL); ftk_list_model_reset(priv->model); ftk_list_model_disable_notify(priv->model); if(!ftk_fs_is_root(priv->path)) { item.value = 1; item.text = _(".."); item.type = FTK_LIST_ITEM_NORMAL; item.left_icon = ftk_theme_load_image(ftk_default_theme(), "up"FTK_STOCK_IMG_SUFFIX); ftk_list_model_add(priv->model, &item); } /*directory go first.*/ while(ftk_dir_read(handle, &info) == RET_OK) { if(info.name[0] == '.') continue; if(info.is_dir) { item.value = 1; item.text = info.name; item.type = ftk_file_browser_get_display_style(priv, 1); item.left_icon = ftk_theme_load_image(ftk_default_theme(), "folder"FTK_STOCK_IMG_SUFFIX); ftk_list_model_add(priv->model, &item); } } ftk_dir_close(handle); if(priv->filter_mime_type == NULL || strcmp(priv->filter_mime_type, FTK_MIME_DIR) != 0) { handle = ftk_dir_open(priv->path); while(ftk_dir_read(handle, &info) == RET_OK) { if(info.name[0] == '.') continue; if(info.is_dir) continue; if(priv->filter_mime_type != NULL) { ftk_strs_cat(path, FTK_MAX_PATH, priv->path, "/", info.name, NULL); mime_type = ftk_file_get_mime_type(path); if(strstr(priv->filter_mime_type, mime_type) != NULL) { continue; } } item.value = 0; item.type = ftk_file_browser_get_display_style(priv, 0); item.text = info.name; item.left_icon = ftk_file_browser_load_mime_icon(info.name); ftk_list_model_add(priv->model, &item); } ftk_dir_close(handle); } ftk_window_set_focus(thiz, priv->list_view); ftk_list_view_set_cursor(priv->list_view, 0); ftk_list_model_enable_notify(priv->model); ftk_list_model_notify(priv->model); ftk_widget_show_all(thiz, 1); return RET_OK; }