⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 view_file_icon.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 4 页
字号:
				{				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 + -