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 */ }