gboolean fm_folder_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) { FmFolderModel* model; GSequenceIter* items_it; g_return_val_if_fail(parent == NULL || parent->user_data != NULL, FALSE); /* this is a list, nodes have no children */ if( parent ) return FALSE; /* parent == NULL is a special case; we need to return the first top-level row */ g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), FALSE); model = FM_FOLDER_MODEL(tree_model); /* No rows => no first row */ // if ( model->dir->n_items == 0 ) // return FALSE; /* Set iter to first item in list */ g_sequence_get_begin_iter(model->items); iter->stamp = model->stamp; iter->user_data = items_it; return TRUE; }
gboolean fm_folder_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n) { GSequenceIter* items_it; FmFolderModel* model; g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), FALSE); model = FM_FOLDER_MODEL(tree_model); /* a list has only top-level rows */ if( parent ) return FALSE; /* special case: if parent == NULL, set iter to n-th top-level row */ if( n >= g_sequence_get_length(model->items) || n < 0 ) return FALSE; items_it = g_sequence_get_iter_at_pos(model->items, n); g_assert( items_it != g_sequence_get_end_iter(model->items) ); iter->stamp = model->stamp; iter->user_data = items_it; return TRUE; }
gboolean fm_folder_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter) { GSequenceIter* item_it, *next_item_it; FmFolderModel* model; g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), FALSE); if( iter == NULL || iter->user_data == NULL ) return FALSE; model = FM_FOLDER_MODEL(tree_model); item_it = (GSequenceIter *)iter->user_data; /* Is this the last iter in the list? */ next_item_it = g_sequence_iter_next(item_it); if( g_sequence_iter_is_end(next_item_it) ) return FALSE; iter->stamp = model->stamp; iter->user_data = next_item_it; return TRUE; }
gboolean fm_folder_model_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path) { FmFolderModel* model; gint *indices, n, depth; GSequenceIter* items_it; g_assert( FM_IS_FOLDER_MODEL(tree_model) ); g_assert(path!=NULL); model = FM_FOLDER_MODEL(tree_model); indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); /* we do not allow children */ g_assert(depth == 1); /* depth 1 = top level; a list only has top level nodes and no children */ n = indices[0]; /* the n-th top level row */ if( n >= g_sequence_get_length(model->items) || n < 0 ) return FALSE; items_it = g_sequence_get_iter_at_pos(model->items, n); g_assert( items_it != g_sequence_get_end_iter(model->items) ); /* We simply store a pointer in the iter */ iter->stamp = model->stamp; iter->user_data = items_it; return TRUE; }
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_view_set_show_hidden(FmFolderView* fv, gboolean show) { if(show != fv->show_hidden ) { fv->show_hidden = show; if(G_LIKELY(fv->model)) fm_folder_model_set_show_hidden(FM_FOLDER_MODEL(fv->model), show); } }
void on_prop(GtkAction* action, FmMainWin* win) { FmFolderView* fv = FM_FOLDER_VIEW(win->folder_view); /* FIXME: should prevent directly accessing data members */ FmFileInfo* fi = FM_FOLDER_MODEL(fv->model)->dir->dir_fi; FmFileInfoList* files = fm_file_info_list_new(); fm_list_push_tail(files, fi); fm_show_file_properties(files); fm_list_unref(files); }
gint fm_folder_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter) { FmFolderModel* model; g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), -1); g_return_val_if_fail(iter == NULL || iter->user_data != NULL, FALSE); model = FM_FOLDER_MODEL(tree_model); /* special case: if iter == NULL, return number of top-level rows */ if( !iter ) return g_sequence_get_length(model->items); return 0; /* otherwise, this is easy again for a list */ }
static void set_icon_size(FmFolderView* fv, guint icon_size) { FmCellRendererPixbuf* render = (FmCellRendererPixbuf*)fv->renderer_pixbuf; fm_cell_renderer_pixbuf_set_fixed_size(render, icon_size, icon_size); if(!fv->model) return; fm_folder_model_set_icon_size(FM_FOLDER_MODEL(fv->model), icon_size); if( fv->mode != FM_FV_LIST_VIEW ) /* this is an ExoIconView */ { /* FIXME: reset ExoIconView item sizes */ } }
GtkTreePath *fm_folder_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter) { GtkTreePath* path; GSequenceIter* items_it; FmFolderModel* model = FM_FOLDER_MODEL(tree_model); g_return_val_if_fail(model, NULL); g_return_val_if_fail(iter->stamp == model->stamp, NULL); g_return_val_if_fail(iter != NULL, NULL); g_return_val_if_fail(iter->user_data != NULL, NULL); items_it = (GSequenceIter*)iter->user_data; path = gtk_tree_path_new(); gtk_tree_path_append_index( path, g_sequence_iter_get_position(items_it) ); return path; }
FmFolderModel* fm_folder_view_get_model(FmFolderView* fv) { return FM_FOLDER_MODEL(fv->model); }
FmFileInfo* fm_folder_view_get_cwd_info(FmFolderView* fv) { return FM_FOLDER_MODEL(fv->model)->dir->dir_fi; }
void fm_folder_model_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value) { GSequenceIter* item_it; FmFolderModel* model = FM_FOLDER_MODEL(tree_model); g_return_if_fail(iter != NULL); g_return_if_fail( column < G_N_ELEMENTS(column_types) ); g_value_init(value, column_types[column]); item_it = (GSequenceIter*)iter->user_data; g_return_if_fail(item_it != NULL); FmFolderItem* item = (FmFolderItem*)g_sequence_get(item_it); FmFileInfo* info = item->inf; switch( column ) { case COL_FILE_GICON: g_value_set_object(value, info->icon->gicon); break; case COL_FILE_ICON: { if( G_UNLIKELY(!item->icon) ) { if( !info->icon ) return; item->icon = fm_icon_get_pixbuf(info->icon, model->icon_size); } /* if we want to show a thumbnail */ /* if we're on local filesystem or thumbnailing for remote files is allowed */ if(fm_config->show_thumbnail && (fm_path_is_local(item->inf->path) || !fm_config->thumbnail_local)) { if(!item->is_thumbnail && !item->thumbnail_failed && !item->thumbnail_loading) { if(fm_file_info_can_thumbnail(item->inf)) { if(item->inf->size > 0 && (fm_config->thumbnail_max == 0 || item->inf->size <= (fm_config->thumbnail_max << 10))) { GdkPixbuf * pix = fm_thumbnail_try_read_from_cache(item->inf, model->icon_size); if (pix) { if (item->icon) g_object_unref(item->icon); item->icon = pix; item->is_thumbnail = TRUE; } else { FmThumbnailRequest* req = fm_thumbnail_request2(item->inf, model->icon_size, on_thumbnail_loaded, model, item->iter_age, item); model->thumbnail_requests = g_list_prepend(model->thumbnail_requests, req); item->thumbnail_loading = TRUE; } } } else { item->thumbnail_failed = TRUE; } } } g_value_set_object(value, item->icon); break; } case COL_FILE_NAME: g_value_set_string(value, info->disp_name); break; case COL_FILE_NAME_HINT_SIZE: case COL_FILE_NAME_HINT_MTIME: case COL_FILE_NAME_HINT_DESC: { //g_value_set_string(value, info->disp_name); if (!item->hinted_disp_name || item->hint_column != column) { item->hint_column != column; if (item->hinted_disp_name) g_free(item->hinted_disp_name); gchar * s = NULL; if (fm_file_info_is_symlink(info)) s = fm_file_info_get_target(info); if (!s) { switch (column) { case COL_FILE_NAME_HINT_SIZE: s = fm_file_info_get_disp_size(info); break; case COL_FILE_NAME_HINT_MTIME: s = fm_file_info_get_disp_mtime(info); break; case COL_FILE_NAME_HINT_DESC: s = fm_file_info_get_desc(info); break; } } if (!s) s = fm_file_info_get_desc(info); if (!s) s = ""; item->hinted_disp_name = g_markup_printf_escaped("%s<span size='small'>\n<i>%s</i></span>", info->disp_name, s); } g_value_set_string(value, item->hinted_disp_name); break; } case COL_FILE_SIZE: g_value_set_string( value, fm_file_info_get_disp_size(info) ); break; case COL_FILE_DESC: g_value_set_string( value, fm_file_info_get_desc(info) ); break; case COL_FILE_PERM: // g_value_set_string( value, fm_file_info_get_disp_perm(info) ); break; case COL_FILE_OWNER: // g_value_set_string( value, fm_file_info_get_disp_owner(info) ); break; case COL_FILE_MTIME: g_value_set_string( value, fm_file_info_get_disp_mtime(info) ); break; case COL_FILE_INFO: g_value_set_pointer(value, info); break; } }