From 574e9ca2bc2d2893767b14e0732cbffd07d4979a Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Thu, 17 Nov 2011 21:32:51 +0100 Subject: autofoo & finishing touches on VIEW torrent. Interaction next time --- src/main.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 143 insertions(+), 12 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index b51f1db..78c98da 100644 --- a/src/main.c +++ b/src/main.c @@ -1,10 +1,12 @@ #include "common.h" #include +#include #include #include #include #include +#include #include "customcellrendererstate.h" #include "customcellrendererprogress.h" @@ -226,13 +228,20 @@ static void status(master_t* master, const char* format, ...); static void noop_destroy(gpointer value); static void torrent_destroy(gpointer value); +static void liststore_sort_column_changed(GtkTreeSortable* sortable, + gpointer user_data); +static gint liststore_default_compare_func(GtkTreeModel* model, + GtkTreeIter* a, + GtkTreeIter* b, + gpointer user_data); + int main(int argc, char** argv) { const gchar* gladefile; GtkBuilder* builder; GError* error = NULL; guint ret; - GtkWidget* listview, * pwddlg; + GtkWidget* pwddlg; GtkCellRenderer* cell; GtkTreeViewColumn* column; GThread* worker; @@ -294,10 +303,15 @@ int main(int argc, char** argv) gtk_widget_set_sensitive(master.disconnectmenuitem, FALSE); pwddlg = GTK_WIDGET(gtk_builder_get_object(builder, "pwddlg")); + gtk_dialog_set_default_response(GTK_DIALOG(pwddlg), GTK_RESPONSE_OK); - listview = GTK_WIDGET(gtk_builder_get_object(builder, "treeview")); master.liststore = GTK_LIST_STORE(gtk_builder_get_object(builder, "liststore")); + g_signal_connect(master.liststore, "sort-column-changed", + G_CALLBACK(liststore_sort_column_changed), &master); + gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(master.liststore), + liststore_default_compare_func, + &master, NULL); cell = custom_cell_renderer_state_new(); column = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "statecolumn")); @@ -335,9 +349,30 @@ int main(int argc, char** argv) G_KEY_FILE_KEEP_TRANSLATIONS, NULL); + { + gint column = + g_key_file_get_integer(master.config, "view", "sort_column", NULL); + gboolean desc = + g_key_file_get_boolean(master.config, "view", "sort_desc", NULL); + if (column > 0) + { + gtk_tree_sortable_set_sort_column_id( + GTK_TREE_SORTABLE(master.liststore), column, + desc ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING); + } + else + { + gtk_tree_sortable_set_sort_column_id( + GTK_TREE_SORTABLE(master.liststore), + GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); + } + } + gtk_widget_show_all(master.top); master.connectdlg = GTK_WIDGET(gtk_builder_get_object(builder, "connectdlg")); + gtk_dialog_set_default_response(GTK_DIALOG(master.connectdlg), + GTK_RESPONSE_OK); master.connectdlg_url = GTK_WIDGET(gtk_builder_get_object(builder, "connectdlg_url")); master.connectdlg_user = GTK_WIDGET(gtk_builder_get_object(builder, "connectdlg_user")); master.connectdlg_pwd = GTK_WIDGET(gtk_builder_get_object(builder, "connectdlg_pwd")); @@ -646,7 +681,7 @@ void do_connect(GtkMenuItem* menuitem, gpointer data) pass = NULL; } - gtk_widget_set_sensitive(master->connectmenuitem, FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(menuitem), FALSE); status(master, "Connecting to %s...", url); g_key_file_set_string(master->config, "connect", "url", url); if (user != NULL) @@ -677,7 +712,7 @@ void do_disconnect(GtkMenuItem* menuitem, gpointer data) g_source_remove(master->sync_timeout); master->sync_timeout = 0; } - gtk_widget_set_sensitive(master->disconnectmenuitem, FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(menuitem), FALSE); status(master, "Disconnecting..."); g_hash_table_remove_all(master->torrents); g_async_queue_push(master->queue, msg_disconnect()); @@ -718,7 +753,7 @@ void torrent_update(torrent_t* torrent, torrent_data_t* data) COLUMN_LEFT, data->left, COLUMN_PROGRESSSORT, data->downloaded < 100.0f ? data->downloaded : - data->seeded + 1000.0f, + 1000.0f + data->seeded, -1); } @@ -1008,14 +1043,14 @@ gpointer worker_main(gpointer _data) break; } done = (guint64)tmpi64; - if (torrent_data.size > 0) + if (done >= torrent_data.size) + { + torrent_data.downloaded = 100.0f; + } + else if (torrent_data.size > 0) { torrent_data.downloaded = ((gfloat)done * 100.0f) / (gfloat)torrent_data.size; - if (torrent_data.downloaded > 100.0f) - { - torrent_data.downloaded = 100.0f; - } } else { @@ -1380,7 +1415,7 @@ void hashlist_free(hashlist_t* hlist) g_free(hlist->mark); } -gboolean hashlist_resize(hashlist_t* hlist, gsize* a, gsize* r) +gboolean hashlist_resize(hashlist_t* hlist, G_GNUC_UNUSED gsize* a, gsize* r) { gsize ns = hlist->size * 2; gchar** tmp1; @@ -1530,7 +1565,7 @@ gboolean hashlist_sync(hashlist_t* hlist, xmlrpc_env * const env, return TRUE; } -void noop_destroy(gpointer key) +void noop_destroy(G_GNUC_UNUSED gpointer key) { } @@ -1614,3 +1649,99 @@ gboolean get_bool_xmlrpc(xmlrpc_env* env, xmlrpc_value* value) } } } + +void liststore_sort_column_changed(GtkTreeSortable* sortable, + gpointer user_data) +{ + master_t* master = user_data; + gint column; + GtkSortType order; + if (gtk_tree_sortable_get_sort_column_id(sortable, &column, &order)) + { + g_key_file_set_integer(master->config, "view", "sort_column", + column + 1); + g_key_file_set_boolean(master->config, "view", "sort_desc", + order == GTK_SORT_DESCENDING); + } + else + { + if (!g_key_file_remove_key(master->config, + "view", "sort_column", NULL) && + !g_key_file_remove_key(master->config, "view", "sort_desc", NULL)) + { + return; + } + } + save_config(master); +} + +#ifndef G_VALUE_INIT +# define G_VALUE_INIT { 0 } +#endif + +gint liststore_default_compare_func(GtkTreeModel* model, + GtkTreeIter* a, + GtkTreeIter* b, + G_GNUC_UNUSED gpointer user_data) +{ + GValue value = G_VALUE_INIT; + gfloat af, bf; + gint ai, bi; + const gchar* as, * bs; + gtk_tree_model_get_value(model, a, COLUMN_DOWN, &value); + af = g_value_get_float(&value); + g_value_unset(&value); + gtk_tree_model_get_value(model, b, COLUMN_DOWN, &value); + bf = g_value_get_float(&value); + g_value_unset(&value); + if (fabs(af - bf) > 1e-4) + { + return af > bf ? -1 : 1; + } + + gtk_tree_model_get_value(model, a, COLUMN_UP, &value); + af = g_value_get_float(&value); + g_value_unset(&value); + gtk_tree_model_get_value(model, b, COLUMN_UP, &value); + bf = g_value_get_float(&value); + g_value_unset(&value); + if (fabs(af - bf) > 1e-4) + { + return af > bf ? -1 : 1; + } + + gtk_tree_model_get_value(model, a, COLUMN_STATE, &value); + ai = g_value_get_int(&value); + g_value_unset(&value); + gtk_tree_model_get_value(model, b, COLUMN_STATE, &value); + bi = g_value_get_int(&value); + g_value_unset(&value); + if (ai != bi) + { + return ai > bi ? -1 : 1; + } + + gtk_tree_model_get_value(model, a, COLUMN_PROGRESSSORT, &value); + af = g_value_get_float(&value); + g_value_unset(&value); + gtk_tree_model_get_value(model, b, COLUMN_PROGRESSSORT, &value); + bf = g_value_get_float(&value); + g_value_unset(&value); + if (fabs(af - bf) > 1e-3) + { + return af < bf ? -1 : 1; + } + + gtk_tree_model_get_value(model, a, COLUMN_TITLE, &value); + as = g_value_get_string(&value); + { + GValue value2 = G_VALUE_INIT; + gint ret; + gtk_tree_model_get_value(model, b, COLUMN_TITLE, &value2); + bs = g_value_get_string(&value2); + ret = strcmp(as, bs); + g_value_unset(&value); + g_value_unset(&value2); + return ret; + } +} -- cgit v1.2.3-70-g09d2