/***************************************************************************************** * ... * * ****************************************************************************************/ void fm_dir_tree_model_expand_row (FmDirTreeModel *dir_tree_model, GtkTreeIter *it, GtkTreePath *tree_path) { //TREEVIEW_DEBUG ("TREEVIEW_DEBUG: fm_dir_tree_model_expand_row\n"); GList *item_list = (GList*) it->user_data; FmDirTreeItem *dir_tree_item = (FmDirTreeItem*) item_list->data; g_return_if_fail (dir_tree_item != NULL); if (dir_tree_item->n_expand == 0) { // Dynamically load content of the folder... FmFolder *folder = fm_dir_tree_item_set_folder (item_list); // If the folder is already loaded, call "loaded" handler ourselves... if (fm_folder_get_is_loaded (folder)) { FmDirTreeItem *dir_tree_item = (FmDirTreeItem*) item_list->data; GSList *files = fm_list_peek_head_link (folder->files); fm_dir_tree_item_load_folder (folder, files, item_list, FALSE); fm_dir_tree_item_on_folder_loaded (dir_tree_item); } else { //TREEVIEW_DEBUG ("NOT loaded !!!\n"); } } dir_tree_item->n_expand++; }
gboolean fm_folder_view_chdir(FmFolderView* fv, FmPath* path) { FmFolderModel* model; FmFolder* folder; if(fv->folder) { g_signal_handlers_disconnect_by_func(fv->folder, on_folder_loaded, fv); g_signal_handlers_disconnect_by_func(fv->folder, on_folder_unmounted, fv); g_signal_handlers_disconnect_by_func(fv->folder, on_folder_err, fv); g_object_unref(fv->folder); fv->folder = NULL; if(fv->model) { model = FM_FOLDER_MODEL(fv->model); g_signal_handlers_disconnect_by_func(model, on_sort_col_changed, fv); if(model->dir) g_signal_handlers_disconnect_by_func(model->dir, on_folder_err, fv); g_object_unref(model); fv->model = NULL; } } /* FIXME: the signal handler should be able to cancel the loading. */ g_signal_emit(fv, signals[DIRECTORY_CHANGED], 0, path); if(fv->cwd) fm_path_unref(fv->cwd); fv->cwd = fm_path_ref(path); fv->folder = folder = fm_folder_get(path); if(folder) { /* connect error handler */ g_signal_connect(folder, "loaded", on_folder_loaded, fv); g_signal_connect(folder, "unmount", on_folder_unmounted, fv); g_signal_connect(folder, "error", on_folder_err, fv); if(fm_folder_get_is_loaded(folder)) on_folder_loaded(folder, fv); else { switch(fv->mode) { case FM_FV_LIST_VIEW: cancel_pending_row_activated(fv); gtk_tree_view_set_model(GTK_TREE_VIEW(fv->view), NULL); break; case FM_FV_ICON_VIEW: case FM_FV_COMPACT_VIEW: case FM_FV_THUMBNAIL_VIEW: exo_icon_view_set_model(EXO_ICON_VIEW(fv->view), NULL); break; } fv->model = NULL; } } return TRUE; }
void fm_folder_model_set_folder(FmFolderModel* model, FmFolder* dir) { GSequenceIter *it; if( model->dir == dir ) return; model->iter_age++; if( model->dir ) { g_signal_handlers_disconnect_by_func(model->dir, _fm_folder_model_files_added, model); g_signal_handlers_disconnect_by_func(model->dir, _fm_folder_model_files_removed, model); g_signal_handlers_disconnect_by_func(model->dir, _fm_folder_model_files_changed, model); g_signal_handlers_disconnect_by_func(model->dir, on_folder_loaded, model); g_sequence_free(model->items); g_sequence_free(model->hidden); g_object_unref(model->dir); } model->dir = dir; model->items = g_sequence_new((GDestroyNotify)fm_folder_item_free); model->hidden = g_sequence_new((GDestroyNotify)fm_folder_item_free); if( !dir ) return; model->dir = (FmFolder*)g_object_ref(model->dir); g_signal_connect(model->dir, "files-added", G_CALLBACK(_fm_folder_model_files_added), model); g_signal_connect(model->dir, "files-removed", G_CALLBACK(_fm_folder_model_files_removed), model); g_signal_connect(model->dir, "files-changed", G_CALLBACK(_fm_folder_model_files_changed), model); g_signal_connect(model->dir, "loaded", G_CALLBACK(on_folder_loaded), model); if( !fm_list_is_empty(dir->files) ) { GList *l; for( l = fm_list_peek_head_link(dir->files); l; l = l->next ) _fm_folder_model_add_file(model, (FmFileInfo*)l->data); } if( fm_folder_get_is_loaded(model->dir) ) /* if it's already loaded */ on_folder_loaded(model->dir, model); /* emit 'loaded' signal */ }
gboolean fm_folder_view_get_is_loaded(FmFolderView* fv) { return fv->folder && fm_folder_get_is_loaded(fv->folder); }
gboolean fm_folder_model_get_is_loaded(FmFolderModel* model) { return model->dir && fm_folder_get_is_loaded(model->dir); }