📄 view_file_icon.c
字号:
{ vfi->click_fd = new_fd; vficon_select_none(vfi); vficon_select(vfi, new_fd); vficon_send_layout_select(vfi, new_fd); } } } if (stop_signal) { g_signal_stop_emission_by_name(GTK_OBJECT(widget), "key_press_event"); tip_unschedule(vfi); } return stop_signal;}/* *------------------------------------------------------------------- * mouse *------------------------------------------------------------------- */static gint vficon_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data){ ViewFileIcon *vfi = data; FileData *fd; fd = vficon_find_data_by_coord(vfi, (gint)bevent->x, (gint)bevent->y, NULL); tip_update(vfi, fd); return FALSE;}static gint vficon_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data){ ViewFileIcon *vfi = data; GtkTreeIter iter; FileData *fd; tip_unschedule(vfi); fd = vficon_find_data_by_coord(vfi, (gint)bevent->x, (gint)bevent->y, &iter); vfi->click_fd = fd; vficon_selection_add(vfi, vfi->click_fd, SELECTION_PRELIGHT, &iter); switch (bevent->button) { case 1: if (!GTK_WIDGET_HAS_FOCUS(vfi->listview)) { gtk_widget_grab_focus(vfi->listview); }#if 0 if (bevent->type == GDK_2BUTTON_PRESS && vfi->layout) { vficon_selection_remove(vfi, vfi->click_fd, SELECTION_PRELIGHT, &iter); layout_image_full_screen_start(vfi->layout); }#endif break; case 3: vfi->popup = vficon_pop_menu(vfi, (fd != NULL)); gtk_menu_popup(GTK_MENU(vfi->popup), NULL, NULL, NULL, NULL, bevent->button, bevent->time); break; default: break; } return TRUE;}static gint vficon_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data){ ViewFileIcon *vfi = data; GtkTreeIter iter; FileData *fd = NULL; gint was_selected = FALSE; tip_schedule(vfi); if ((gint)bevent->x != 0 || (gint) bevent->y != 0) { fd = vficon_find_data_by_coord(vfi, (gint)bevent->x, (gint)bevent->y, &iter); } if (vfi->click_fd) { vficon_selection_remove(vfi, vfi->click_fd, SELECTION_PRELIGHT, NULL); } if (fd) was_selected = (ICON_DATA(fd)->selected & SELECTION_SELECTED); if (bevent->button == 1 && fd && vfi->click_fd == fd) { vficon_set_focus(vfi, fd); if (bevent->state & GDK_CONTROL_MASK) { gint select; select = !(ICON_DATA(fd)->selected & SELECTION_SELECTED); if ((bevent->state & GDK_SHIFT_MASK) && vfi->prev_selection) { vficon_select_region_util(vfi, vfi->prev_selection, fd, select); } else { vficon_select_util(vfi, fd, select); } } else { vficon_select_none(vfi); if ((bevent->state & GDK_SHIFT_MASK) && vfi->prev_selection) { vficon_select_region_util(vfi, vfi->prev_selection, fd, TRUE); } else { vficon_select_util(vfi, fd, TRUE); was_selected = FALSE; } } } else if (bevent->button == 2 && fd && vfi->click_fd == fd) { vficon_select_util(vfi, fd, !(ICON_DATA(fd)->selected & SELECTION_SELECTED)); } if (fd && !was_selected && (ICON_DATA(fd)->selected & SELECTION_SELECTED)) { vficon_send_layout_select(vfi, fd); } return TRUE;}static gint vficon_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data){ ViewFileIcon *vfi = data; tip_unschedule(vfi); return FALSE;}/* *------------------------------------------------------------------- * population *------------------------------------------------------------------- */static gboolean vficon_destroy_node_cb(GtkTreeModel *store, GtkTreePath *tpath, GtkTreeIter *iter, gpointer data){ GList *list; gtk_tree_model_get(store, iter, FILE_COLUMN_POINTER, &list, -1); g_list_free(list); return FALSE;}static void vficon_clear_store(ViewFileIcon *vfi){ GtkTreeModel *store; store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview)); gtk_tree_model_foreach(store, vficon_destroy_node_cb, NULL); gtk_list_store_clear(GTK_LIST_STORE(store));}static void vficon_set_thumb(ViewFileIcon *vfi, FileData *fd, GdkPixbuf *pb){ GtkTreeModel *store; GtkTreeIter iter; GList *list; if (!vficon_find_iter(vfi, fd, &iter, NULL)) return; store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview)); if (pb) g_object_ref(pb); if (fd->pixbuf) g_object_unref(fd->pixbuf); fd->pixbuf = pb; gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1); gtk_list_store_set(GTK_LIST_STORE(store), &iter, FILE_COLUMN_POINTER, list, -1);}static GList *vficon_add_row(ViewFileIcon *vfi, GtkTreeIter *iter){ GtkListStore *store; GList *list = NULL; gint i; for (i = 0; i < vfi->columns; i++) list = g_list_prepend(list, NULL); store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview))); gtk_list_store_append(store, iter); gtk_list_store_set(store, iter, FILE_COLUMN_POINTER, list, -1); return list;}static void vficon_populate(ViewFileIcon *vfi, gint resize, gint keep_position){ GtkTreeModel *store; GtkTreePath *tpath; gint row; GList *work; FileData *visible_fd = NULL; vficon_verify_selections(vfi); store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview)); if (keep_position && GTK_WIDGET_REALIZED(vfi->listview) && gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vfi->listview), 0, 0, &tpath, NULL, NULL, NULL)) { GtkTreeIter iter; GList *list; gtk_tree_model_get_iter(store, &iter, tpath); gtk_tree_path_free(tpath); gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1); if (list) visible_fd = list->data; } vficon_clear_store(vfi); if (resize) { gint i; gint thumb_width; thumb_width = vficon_get_icon_width(vfi); for (i = 0; i < VFICON_MAX_COLUMNS; i++) { GtkTreeViewColumn *column; GtkCellRenderer *cell; GList *list; column = gtk_tree_view_get_column(GTK_TREE_VIEW(vfi->listview), i); gtk_tree_view_column_set_visible(column, (i < vfi->columns)); gtk_tree_view_column_set_fixed_width(column, thumb_width + (THUMB_BORDER_PADDING * 6)); list = gtk_tree_view_column_get_cell_renderers(column); cell = (list) ? list->data : NULL; g_list_free(list); if (cell && GQV_IS_CELL_RENDERER_ICON(cell)) { g_object_set(G_OBJECT(cell), "fixed_width", thumb_width, "fixed_height", thumb_max_height, "show_text", vfi->show_text, NULL); } } if (GTK_WIDGET_REALIZED(vfi->listview)) gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vfi->listview)); } row = -1; work = vfi->list; while (work) { GList *list; GtkTreeIter iter; row++; list = vficon_add_row(vfi, &iter); while (work && list) { list->data = work->data; list = list->next; work = work->next; } } if (visible_fd && gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vfi->listview), 0, 0, &tpath, NULL, NULL, NULL)) { GtkTreeIter iter; GList *list; gtk_tree_model_get_iter(store, &iter, tpath); gtk_tree_path_free(tpath); gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1); if (g_list_find(list, visible_fd) == NULL && vficon_find_iter(vfi, visible_fd, &iter, NULL)) { tree_view_row_make_visible(GTK_TREE_VIEW(vfi->listview), &iter, FALSE); } } vfi->rows = row + 1; vficon_send_update(vfi); vficon_thumb_update(vfi);}static void vficon_populate_at_new_size(ViewFileIcon *vfi, gint w, gint h, gint force){ gint new_cols; gint thumb_width; thumb_width = vficon_get_icon_width(vfi); new_cols = w / (thumb_width + (THUMB_BORDER_PADDING * 6)); if (new_cols < 1) new_cols = 1; if (!force && new_cols == vfi->columns) return; vfi->columns = new_cols; vficon_populate(vfi, TRUE, TRUE); if (debug) printf("col tab pop cols=%d rows=%d\n", vfi->columns, vfi->rows);}static void vficon_sync(ViewFileIcon *vfi){ GtkTreeModel *store; GtkTreeIter iter; GList *work; gint r, c; if (vfi->rows == 0) return; store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview)); r = -1; c = 0; work = vfi->list; while (work) { GList *list; r++; c = 0; if (gtk_tree_model_iter_nth_child(store, &iter, NULL, r)) { gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1); gtk_list_store_set(GTK_LIST_STORE(store), &iter, FILE_COLUMN_POINTER, list, -1); } else { list = vficon_add_row(vfi, &iter); } while (list) { FileData *fd; if (work) { fd = work->data; work = work->next; c++; } else { fd = NULL; } if (list) { list->data = fd; list = list->next; } } } r++; while (gtk_tree_model_iter_nth_child(store, &iter, NULL, r)) { GList *list; gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1); gtk_list_store_remove(GTK_LIST_STORE(store), &iter); g_list_free(list); } vfi->rows = r; vficon_update_focus(vfi);}static gint vficon_sync_idle_cb(gpointer data){ ViewFileIcon *vfi = data; if (vfi->sync_idle_id == -1) return FALSE; vfi->sync_idle_id = -1; vficon_sync(vfi); return FALSE;}static void vficon_sync_idle(ViewFileIcon *vfi){ if (vfi->sync_idle_id == -1) { /* high priority, the view needs to be resynced before a redraw * may contain invalid pointers at this time */ vfi->sync_idle_id = g_idle_add_full(G_PRIORITY_HIGH, vficon_sync_idle_cb, vfi, NULL); }}static void vficon_sized_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data){ ViewFileIcon *vfi = data; vficon_populate_at_new_size(vfi, allocation->width, allocation->height, FALSE);}/* *----------------------------------------------------------------------------- * misc *----------------------------------------------------------------------------- */void vficon_sort_set(ViewFileIcon *vfi, SortType type, gint ascend){ if (vfi->sort_method == type && vfi->sort_ascend == ascend) return; vfi->sort_method = type; vfi->sort_ascend = ascend; if (!vfi->list) return; vfi->list = filelist_sort(vfi->list, vfi->sort_method, vfi->sort_ascend); vficon_sync(vfi);}/* *----------------------------------------------------------------------------- * thumb updates *----------------------------------------------------------------------------- */static gint vficon_thumb_next(ViewFileIcon *vfi);static void vficon_thumb_status(ViewFileIcon *vfi, gdouble val, const gchar *text){ if (vfi->func_thumb_status) { vfi->func_thumb_status(vfi, val, text, vfi->data_thumb_status); }}static void vficon_thumb_cleanup(ViewFileIcon *vfi){ vficon_thumb_status(vfi, 0.0, NULL); g_list_free(vfi->thumbs_list); vfi->thumbs_list = NULL; vfi->thumbs_count = 0; vfi->thumbs_running = FALSE; thumb_loader_free(vfi->thumbs_loader); vfi->thumbs_loader = NULL; vfi->thumbs_fd = NULL;}static void vficon_thumb_stop(ViewFileIcon *vfi){ if (vfi->thumbs_running) vficon_thumb_cleanup(vfi);}static void vficon_thumb_do(ViewFileIcon *vfi, ThumbLoader *tl, FileData *fd){ GdkPixbuf *pixbuf; if (!fd) return; pixbuf = thumb_loader_get_pixbuf(tl, TRUE); vficon_set_thumb(vfi, fd, pixbuf); g_object_unref(pixbuf); vficon_thumb_status(vfi, (gdouble)(vfi->thumbs_count) / g_list_length(vfi->list), _("Loading thumbs..."));}static void vficon_thumb_error_cb(ThumbLoader *tl, gpointer data){ ViewFileIcon *vfi = data; if (vfi->thumbs_fd && vfi->thumbs_loader == tl) { vficon_thumb_do(vfi, tl, vfi->thumbs_fd); } while (vficon_thumb_next(vfi));}static void vficon_thumb_done_cb(ThumbLoader *tl, gpointer data){ ViewFileIcon *vfi = data; if (vfi->thumbs_fd && vfi->thumbs_loader == tl) { vficon_thumb_do(vfi, tl, vfi->thumbs_fd); } while (vficon_thumb_next(vfi));}static gint vficon_thumb_next(ViewFileIcon *vfi){ GtkTreePath *tpath; FileData *fd = NULL; if (!GTK_WIDGET_REALIZED(vfi->listview)) { vficon_thumb_status(vfi, 0.0, NULL); return FALSE; } if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vfi->listview), 0, 0, &tpath, NULL, NULL, NULL)) { GtkTreeModel *store; GtkTreeIter iter; gint valid = TRUE; store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview)); gtk_tree_model_get_iter(store, &iter, tpath); gtk_tree_path_free(tpath); while (!fd && valid && tree_view_row_get_visibility(GTK_TREE_VIEW(vfi->listview), &iter, FALSE) == 0) { GList *list; gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1); while (!fd && list) { FileData *tfd = list->data; if (tfd && !tfd->pixbuf) fd = tfd; list = list->next; } valid = gtk_tree_model_iter_next(store, &iter); } } /* then find first undone */ if (!fd) { GList *work = vfi->list; while (work && !fd) { FileData *fd_p = work->data; work = work->next; if (!fd_p->pixbuf) fd = fd_p; } } if (!fd) { /* done */ vficon_thumb_cleanup(vfi); return FALSE; } vfi->thumbs_count++; vfi->thumbs_fd = fd; thumb_loader_free(vfi->thumbs_loader); vfi->thumbs_loader = thumb_loader_new(thumb_max_width, thumb_max_height); thumb_loader_set_callbacks(vfi->thumbs_loader, vficon_thumb_done_cb, vficon_thumb_error_cb, NULL, vfi); if (!thumb_loader_start(vfi->thumbs_loader, fd->path)) { /* set icon to unknown, continue */ if (debug) printf("thumb loader start failed %s\n", vfi->thumbs_loader->path); vficon_thumb_do(vfi, vfi->thumbs_loader, fd); return TRUE; } return FALSE;}static void vficon_thumb_update(ViewFileIcon *vfi){ vficon_thumb_stop(vfi); vficon_thumb_status(vfi, 0.0, _("Loading thumbs...")); vfi->thumbs_running = TRUE; while (vficon_thumb_next(vfi));}/* *----------------------------------------------------------------------------- * row stuff *----------------------------------------------------------------------------- */FileData *vficon_index_get_data(ViewFileIcon *vfi, gint row){ return FILE_DATA(g_list_nth_data(vfi->list, row));}gchar *vficon_index_get_path(ViewFileIcon *vfi, gint row){ FileData *fd; fd = g_list_nth_data(vfi->list, row); return (fd ? fd->path : NULL);}gint vficon_index_by_path(ViewFileIcon *vfi, const gchar *path){ gint p = 0; GList *work; if (!path) return -1; work = vfi->list;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -