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

📄 utilops.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
		box_append_safe_delete_status(gd);		generic_dialog_add_button(gd, GTK_STOCK_DELETE, NULL, file_util_delete_multiple_ok_cb, TRUE);		gtk_widget_show(gd->dialog);		}}/* * delete single file */static void file_util_delete_ok_cb(GenericDialog *gd, gpointer data){	gchar *path = data;	if (!file_util_unlink(path))		{		gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), path);		file_util_warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_ERROR, NULL);		g_free(text);		}	else		{		file_maint_removed(path, NULL);		}	g_free(path);}static void file_util_delete_cancel_cb(GenericDialog *gd, gpointer data){	gchar *path = data;	g_free(path);}static void file_util_delete_single(const gchar *path, GtkWidget *parent){	gchar *buf = g_strdup(path);	if (!confirm_delete)		{		file_util_delete_ok_cb(NULL, buf);		}	else		{		GenericDialog *gd;		GtkWidget *table;		gchar *base;		gd = file_util_gen_dlg(_("Delete file - GQview"), "GQview", "dlg_confirm",					parent, TRUE,					file_util_delete_cancel_cb, buf);		generic_dialog_add_message(gd, NULL, _("Delete file?"), NULL);		table = pref_table_new(gd->vbox, 2, 2, FALSE, FALSE);		pref_table_label(table, 0, 0, _("File name:"), 1.0);		pref_table_label(table, 1, 0, filename_from_path(path), 0.0);		pref_table_label(table, 0, 1, _("Location:"), 1.0);		base = remove_level_from_path(path);		pref_table_label(table, 1, 1, base, 0.0);		g_free(base);		generic_dialog_add_image(gd, path, NULL, NULL, NULL, FALSE);		box_append_safe_delete_status(gd);		generic_dialog_add_button(gd, GTK_STOCK_DELETE, NULL, file_util_delete_ok_cb, TRUE);		gtk_widget_show(gd->dialog);		}}void file_util_delete(const gchar *source_path, GList *source_list, GtkWidget *parent){	if (!source_path && !source_list) return;	if (source_path)		{		file_util_delete_single(source_path, parent);		}	else if (!source_list->next)		{		file_util_delete_single(source_list->data, parent);		path_list_free(source_list);		}	else		{		file_util_delete_multiple(source_list, parent);		}}/* *-------------------------------------------------------------------------- * Rename routines *-------------------------------------------------------------------------- *//* * rename multiple files */enum {	RENAME_COLUMN_PATH = 0,	RENAME_COLUMN_NAME,	RENAME_COLUMN_PREVIEW,	RENAME_COLUMN_COUNT};typedef struct _RenameDataMult RenameDataMult;struct _RenameDataMult{	FileDialog *fd;	gint rename_auto;	GtkWidget *listview;	GtkWidget *button_auto;	GtkWidget *rename_box;	GtkWidget *rename_label;	GtkWidget *rename_entry;	GtkWidget *auto_box;	GtkWidget *auto_entry_front;	GtkWidget *auto_spin_start;	GtkWidget *auto_spin_pad;	GtkWidget *auto_entry_end;	ImageWindow *imd;	gint update_idle_id;};static void file_util_rename_multiple(RenameDataMult *rd);static void file_util_rename_multiple_ok_cb(GenericDialog *gd, gpointer data){	RenameDataMult *rd = data;	GtkWidget *dialog;	dialog = GENERIC_DIALOG(rd->fd)->dialog;	if (!GTK_WIDGET_VISIBLE(dialog)) gtk_widget_show(dialog);	rd->fd->type = TRUE;	file_util_rename_multiple(rd);}static void file_util_rename_multiple_cancel_cb(GenericDialog *gd, gpointer data){	RenameDataMult *rd = data;	GtkWidget *dialog;	dialog = GENERIC_DIALOG(rd->fd)->dialog;	if (!GTK_WIDGET_VISIBLE(dialog)) gtk_widget_show(dialog);}static gint file_util_rename_multiple_find_row(RenameDataMult *rd, const gchar *path, GtkTreeIter *iter){	GtkTreeModel *store;	gint valid;	gint row = 0;	store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview));	valid = gtk_tree_model_get_iter_first(store, iter);	while (valid)		{		gchar *path_n;		gint ret;		gtk_tree_model_get(GTK_TREE_MODEL(store), iter, RENAME_COLUMN_PATH, &path_n, -1);		ret = (strcmp(path_n, path) == 0);		g_free(path_n);		if (ret) return row;		valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), iter);		row++;		}	return -1;}static void file_util_rename_multiple(RenameDataMult *rd){	FileDialog *fd;	fd = rd->fd;	if (isfile(fd->dest_path) && !fd->type)		{		GenericDialog *gd;		gd = file_util_gen_dlg(_("Overwrite file"), "GQview", "dlg_confirm",					NULL, TRUE,					file_util_rename_multiple_cancel_cb, rd);		generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION,					   _("Overwrite file?"),					   _("Replace existing file by renaming new file."));		pref_spacer(gd->vbox, 0);		generic_dialog_add_button(gd, GTK_STOCK_OK, _("_Overwrite"), file_util_rename_multiple_ok_cb, TRUE);		generic_dialog_add_image(gd, fd->dest_path, _("Existing file"), fd->source_path, _("New file"), TRUE);		gtk_widget_hide(GENERIC_DIALOG(fd)->dialog);		gtk_widget_show(gd->dialog);		return;		}	else		{		if (!rename_file(fd->source_path, fd->dest_path))			{			gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\n to:\n%s"),						      filename_from_path(fd->source_path),						      filename_from_path(fd->dest_path));			file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, NULL);			g_free(text);			}		else			{			GtkTreeModel *store;			GtkTreeIter iter;			GtkTreeIter next;			gint row;			file_maint_renamed(fd->source_path, fd->dest_path);			store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview));			row = file_util_rename_multiple_find_row(rd, rd->fd->source_path, &iter);			if (row >= 0 &&			    (gtk_tree_model_iter_nth_child(store, &next, NULL, row + 1) ||			    (row > 0 && gtk_tree_model_iter_nth_child(store, &next, NULL, row - 1)) ) )				{				GtkTreeSelection *selection;				selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview));				gtk_tree_selection_select_iter(selection, &next);				gtk_list_store_remove(GTK_LIST_STORE(store), &iter);				}			else				{				if (debug) printf("closed by #%d\n", row);				file_dialog_close(rd->fd);				}			}		}}static void file_util_rename_multiple_auto(RenameDataMult *rd){	const gchar *front;	const gchar *end;	gint start_n;	gint padding;	gint n;	GtkTreeModel *store;	GtkTreeIter iter;	gint valid;	gint success;	history_combo_append_history(rd->auto_entry_front, NULL);	history_combo_append_history(rd->auto_entry_end, NULL);	front = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_front));	end = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_end));	start_n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_start));	padding = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_pad));	store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview));	/* first check for name conflicts */	success = TRUE;	n = start_n;	valid = gtk_tree_model_get_iter_first(store, &iter);	while (valid && success)		{		gchar *dest;		gchar *base;		gchar *path;		gtk_tree_model_get(store, &iter, RENAME_COLUMN_PATH, &path, -1);		base = remove_level_from_path(path);		dest = g_strdup_printf("%s/%s%0*d%s", base, front, padding, n, end);		if (isname(dest)) success = FALSE;		g_free(dest);		g_free(base);		g_free(path);		n++;		valid = gtk_tree_model_iter_next(store, &iter);		}	if (!success)		{		file_util_warning_dialog(_("Auto rename"),			       _("Can not auto rename with the selected\nnumber set, one or more files exist that\nmatch the resulting name list.\n"),			       GTK_STOCK_DIALOG_WARNING, NULL);		return;		}	/* select the first iter, so that on fail the correct info is given to user */	if (gtk_tree_model_get_iter_first(store, &iter))		{		GtkTreeSelection *selection;		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview));		gtk_tree_selection_select_iter(selection, &iter);		}	/* now do it for real */	success = TRUE;	n = start_n;	while (success && gtk_tree_model_get_iter_first(store, &iter))		{		gchar *dest;		gchar *base;		gchar *path;		gtk_tree_model_get(store, &iter, RENAME_COLUMN_PATH, &path, -1);		base = remove_level_from_path(path);		dest = g_strdup_printf("%s/%s%0*d%s", base, front, padding, n, end);		if (!rename_file(path, dest))			{			success = FALSE;			}		else			{			file_maint_renamed(path, dest);			}		g_free(dest);		g_free(base);		g_free(path);		if (success)			{			gtk_list_store_remove(GTK_LIST_STORE(store), &iter);			if (gtk_tree_model_get_iter_first(store, &iter))				{				GtkTreeSelection *selection;				selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview));				gtk_tree_selection_select_iter(selection, &iter);				}			}		n++;		}	if (!success)		{		gchar *buf;		n--;		gtk_spin_button_set_value(GTK_SPIN_BUTTON(rd->auto_spin_start), (gdouble)n);		buf = g_strdup_printf(_("Failed to rename\n%s\nThe number was %d."), filename_from_path(rd->fd->source_path), n);		file_util_warning_dialog(_("Auto rename"), buf, GTK_STOCK_DIALOG_ERROR, NULL);		g_free(buf);		return;		}	file_dialog_close(rd->fd);}static void file_util_rename_multiple_cb(FileDialog *fd, gpointer data){	RenameDataMult *rd = data;	gchar *base;	const gchar *name;	if (rd->rename_auto)		{		file_util_rename_multiple_auto(rd);		return;		}	name = gtk_entry_get_text(GTK_ENTRY(rd->rename_entry));	base = remove_level_from_path(fd->source_path);	g_free(fd->dest_path);	fd->dest_path = concat_dir_and_file(base, name);	g_free(base);	if (strlen(name) == 0 || strcmp(fd->source_path, fd->dest_path) == 0)		{		return;		}	fd->type = FALSE;	file_util_rename_multiple(rd);}static void file_util_rename_multiple_close_cb(FileDialog *fd, gpointer data){	RenameDataMult *rd = data;	file_dialog_close(rd->fd);}static gboolean file_util_rename_multiple_select_cb(GtkTreeSelection *selection, GtkTreeModel *store, GtkTreePath *tpath,						    gboolean path_currently_selected, gpointer data){	RenameDataMult *rd = data;	GtkTreeIter iter;	const gchar *name;	gchar *path = NULL;	if (path_currently_selected ||	    !gtk_tree_model_get_iter(store, &iter, tpath)) return TRUE;	gtk_tree_model_get(store, &iter, RENAME_COLUMN_PATH, &path, -1);	g_free(rd->fd->source_path);	rd->fd->source_path = path;	name = filename_from_path(rd->fd->source_path);	gtk_label_set_text(GTK_LABEL(rd->rename_label), name);	gtk_entry_set_text(GTK_ENTRY(rd->rename_entry), name);	image_change_path(rd->imd, rd->fd->source_path, 0.0);	if (GTK_WIDGET_VISIBLE(rd->rename_box))		{		gtk_widget_grab_focus(rd->rename_entry);		gtk_editable_select_region(GTK_EDITABLE(rd->rename_entry), 0, filename_base_length(name));		}	return TRUE;}static void file_util_rename_multiple_preview_update(RenameDataMult *rd){	GtkTreeModel *store;	GtkTreeIter iter;	const gchar *front;	const gchar *end;	gint valid;	gint start_n;	gint padding;	gint n;	front = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_front));	end = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_end));	start_n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_start));	padding = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_pad));	store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview));	n = start_n;	valid = gtk_tree_model_get_iter_first(store, &iter);	while (valid)		{		gchar *dest;		dest = g_strdup_printf("%s%0*d%s", front, padding, n, end);		gtk_list_store_set(GTK_LIST_STORE(store), &iter, RENAME_COLUMN_PREVIEW, dest, -1);		g_free(dest);		n++;		valid = gtk_tree_model_iter_next(store, &iter);		}}static gboolean file_util_rename_multiple_idle_cb(gpointer data){	RenameDataMult *rd = data;	file_util_rename_multiple_preview_update(rd);	rd->update_idle_id = -1;	return FALSE;}static void file_util_rename_multiple_preview_order_cb(GtkTreeModel *treemodel, GtkTreePath *tpath,						       GtkTreeIter *iter, gpointer data){	RenameDataMult *rd = data;	if (rd->rename_auto && rd->update_idle_id == -1)		{		rd->update_idle_id = g_idle_add(file_util_rename_multiple_idle_cb, rd);		}}static void file_util_rename_multiple_preview_entry_cb(GtkWidget *entry, gpointer data){	RenameDataMult *rd = data;	file_util_rename_multiple_preview_update(rd);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -