#include <gtk/gtk.h>
#include <sys/types.h>
#include "ghasher.h"
enum {
COLUMN_FILENAME = 0,
COLUMN_HASH,
NUM_COLUMNS
};
static void list_show_filename (GtkTreeViewColumn *tree_column,GtkCellRenderer *cell,GtkTreeModel *model,GtkTreeIter *iter, gpointer data);
void pathbutton_toggled(GtkToggleToolButton *button, struct GHApp *app)
{
listview_show_full_path(app->listview,gtk_toggle_tool_button_get_active(button),COLUMN_FILENAME);
/*gtk_tree_view_columns_autosize(GTK_TREE_VIEW(app->listview));*/
}
GtkWidget *create_list_view(GtkWidget *treeview)
{
GtkListStore *store;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
/* gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);*/
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),GTK_TREE_MODEL(store));
g_object_unref(store);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Filename", renderer, "text", COLUMN_FILENAME, NULL);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_column_set_sort_column_id(column, COLUMN_FILENAME);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Hash", renderer, "text", COLUMN_HASH, NULL);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_column_set_sort_column_id(column, COLUMN_HASH);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
listview_show_full_path(treeview,FALSE,COLUMN_FILENAME);
gtk_widget_show(treeview);
return treeview;
}
void listview_show_full_path(GtkWidget *treeview,gboolean fullpath,int col)
{
GtkTreeViewColumn *column;
GList *renderers,*tmp;
GtkTreeCellDataFunc func;
func = fullpath ? NULL : list_show_filename;
column = gtk_tree_view_get_column(GTK_TREE_VIEW(treeview),col);
renderers = gtk_tree_view_column_get_cell_renderers(column);
tmp = renderers;
while(tmp){
GtkCellRenderer *renderer;
renderer = tmp->data;
gtk_tree_view_column_set_cell_data_func (column, renderer,func, NULL, NULL);
tmp = tmp->next;
}
g_list_free(renderers);
}
void verifybutton_clicked(GtkButton *button, struct GHApp *app)
{
GtkWidget *file_selector;
gint ret;
static gchar *lastdir = NULL;
file_selector = gtk_file_chooser_dialog_new("Select a file to digest. ", GTK_WINDOW(app->window),
GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OPEN,GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,NULL);
gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(file_selector), TRUE);
if (lastdir != NULL)
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_selector), lastdir);
ret = gtk_dialog_run(GTK_DIALOG(file_selector));
if (ret == GTK_RESPONSE_OK) {
gchar *filename;
GtkListStore *store;
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_selector));
store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app->listview)));
g_free(lastdir);
lastdir = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(file_selector));
gtk_widget_destroy(file_selector);
verify_sumfile(app->window,store,COLUMN_HASH,COLUMN_FILENAME,filename);
g_free(filename);
return;
}
gtk_widget_destroy(file_selector);
}
GString *listview_get_data(struct GHApp *app)
{
GtkTreeIter iter;
GtkListStore *store;
GString *str;
gboolean fullpath;
store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app->listview)));
if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter)) {
return NULL;
}
fullpath = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(app->pathbutton));
str = g_string_new("");
do {
gchar *h = NULL,*f = NULL;
gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, COLUMN_FILENAME, &f, -1);
if (f == NULL) {
continue;
}
gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, COLUMN_HASH, &h, -1);
if (h == NULL) {
g_free(f);
continue;
}
if(!fullpath){
gchar *base = g_path_get_basename(f);
g_free(f);
f = base;
}
g_string_append_printf(str,"%s %s\n",h,f);
g_free(f);
g_free(h);
} while (gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter));
return str;
}
void fill_list_view(GtkTreeView *view, const GPtrArray *files)
{
guint i;
GtkListStore *store;
store = GTK_LIST_STORE(gtk_tree_view_get_model(view));
gtk_list_store_clear(store);
for (i = 0; i < files->len; i++) {
GtkTreeIter iter;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, COLUMN_FILENAME, g_ptr_array_index(files, i), -1);
}
}
static void list_show_filename (GtkTreeViewColumn *tree_column,GtkCellRenderer *cell,GtkTreeModel *model,GtkTreeIter *iter, gpointer data)
{
gchar *name = NULL;
gtk_tree_model_get (model, iter,COLUMN_FILENAME, &name,-1);
if(name != NULL){
gchar *base = g_path_get_basename(name);
g_object_set (cell,"text", base,NULL);
g_free(base);
g_free(name);
}
}
void set_hashfield(GtkTreeView *view, const gchar *hash, const gchar *filename)
{
GtkTreeIter iter;
GtkListStore *store;
store = GTK_LIST_STORE(gtk_tree_view_get_model(view));
if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
return;
do {
gchar *f = NULL;
gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, COLUMN_FILENAME, &f, -1);
if (f == NULL)
continue;
if (g_ascii_strcasecmp(f, filename) == 0) {
gtk_list_store_set(store, &iter, COLUMN_HASH, hash, -1);
g_free(f);
break;
}
g_free(f);
} while (gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter));
}
syntax highlighted by Code2HTML, v. 0.9.1