summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorHelder Martins <heldermartins89@gmail.com>2013-07-10 18:29:10 +0100
committerHelder Martins <heldermartins89@gmail.com>2013-07-15 21:34:14 +0100
commit0c87c491460125f6fd0bcf74b135cec7ae04c00e (patch)
tree29b72fc383ba2b2c8929bec4d1a1a94a3dead6de /src
parent4cf61ccedbd031eb7500f9cd02ea3f7cc6631b52 (diff)
Implemented clear functionality for DCC download manager. Created clear button in DCC downloaded manager interface.
Diffstat (limited to 'src')
-rw-r--r--src/common/dcc.c9
-rw-r--r--src/common/dcc.h1
-rw-r--r--src/fe-gtk/dccgui.c81
3 files changed, 90 insertions, 1 deletions
diff --git a/src/common/dcc.c b/src/common/dcc.c
index c0527510..57c0d477 100644
--- a/src/common/dcc.c
+++ b/src/common/dcc.c
@@ -227,6 +227,15 @@ is_dcc (struct DCC *dcc)
 	return FALSE;
 }
 
+gboolean
+is_dcc_fcompleted (struct DCC *dcc)
+{
+	if (dcc != NULL)
+		return (dcc->dccstat == STAT_FAILED || dcc->dccstat == STAT_DONE || dcc->dccstat == STAT_ABORTED);
+
+	return FALSE;
+}
+
 /* this is called from hexchat.c:hexchat_misc_checks() every 1 second. */
 
 void
diff --git a/src/common/dcc.h b/src/common/dcc.h
index e3163c8a..6f3b152f 100644
--- a/src/common/dcc.h
+++ b/src/common/dcc.h
@@ -117,6 +117,7 @@ struct dccstat_info
 extern struct dccstat_info dccstat[];
 
 gboolean is_dcc (struct DCC *dcc);
+gboolean is_dcc_fcompleted (struct DCC *dcc);
 void dcc_abort (session *sess, struct DCC *dcc);
 void dcc_get (struct DCC *dcc);
 int dcc_resume (struct DCC *dcc);
diff --git a/src/fe-gtk/dccgui.c b/src/fe-gtk/dccgui.c
index 24d3bcbf..e5d1e9cb 100644
--- a/src/fe-gtk/dccgui.c
+++ b/src/fe-gtk/dccgui.c
@@ -78,6 +78,7 @@ struct dccwindow
 	GtkWidget *accept_button;
 	GtkWidget *resume_button;
 	GtkWidget *open_button;
+	GtkWidget *clear_button; /* clears aborted and completed requests */	
 
 	GtkWidget *file_label;
 	GtkWidget *address_label;
@@ -380,6 +381,43 @@ dcc_append (struct DCC *dcc, GtkListStore *store, gboolean prepend)
 		dcc_prepare_row_send (dcc, store, &iter, FALSE);
 }
 
+/* Retrives aborted, sent and received tasks of current view */
+static GSList *
+dcc_get_completed (void)
+{
+	struct DCC *dcc;
+	GtkTreeIter iter;
+	GtkTreeModel *model;	
+	GSList *completed = NULL;
+
+	model = GTK_TREE_MODEL (dccfwin.store);
+	if (gtk_tree_model_get_iter_first (model, &iter))
+	{
+		do
+		{
+			gtk_tree_model_get (model, &iter, COL_DCC, &dcc, -1);
+			if (is_dcc_fcompleted (dcc))
+				completed = g_slist_prepend (completed, dcc);
+				
+		} while (gtk_tree_model_iter_next (model, &iter));
+	}
+
+	return completed;
+}
+
+static gboolean
+exists_completed_tasks (void)
+{
+	gboolean exist;
+	GSList *comp_list;
+	
+	comp_list = dcc_get_completed (); 
+	exist = comp_list != NULL;
+	
+	g_slist_free (comp_list);	
+	return exist;
+}
+
 static void
 dcc_fill_window (int flags)
 {
@@ -426,6 +464,10 @@ dcc_fill_window (int flags)
 		gtk_tree_model_get_iter_first (GTK_TREE_MODEL (dccfwin.store), &iter);
 		gtk_tree_selection_select_iter (dccfwin.sel, &iter);
 	}
+	else	
+	{
+		gtk_widget_set_sensitive (dccfwin.clear_button, exists_completed_tasks ());
+	}
 }
 
 /* return list of selected DCCs */
@@ -461,6 +503,14 @@ dcc_get_selected (void)
 }
 
 static void
+sensitize_clear_button (void)
+{
+	gboolean show = (exists_completed_tasks () && !dcc_get_selected ());
+	gtk_widget_set_sensitive (dccfwin.clear_button, show);
+}
+
+
+static void
 resume_clicked (GtkWidget * wid, gpointer none)
 {
 	struct DCC *dcc;
@@ -511,6 +561,9 @@ abort_clicked (GtkWidget * wid, gpointer none)
 		dcc_abort (dcc->serv->front_session, dcc);
 	}
 	g_slist_free (start);
+	
+	/* putting it here avoids redudant calls when user presses clear button*/
+	sensitize_clear_button ();
 }
 
 static void
@@ -529,6 +582,27 @@ accept_clicked (GtkWidget * wid, gpointer none)
 	g_slist_free (start);
 }
 
+
+static void
+clear_completed (GtkWidget * wid, gpointer none)
+{
+	struct DCC *dcc;
+	GSList *completed = 0;
+	
+	/* dcc_abort may change dcc_list structure, so we need to gather the targets
+	first. This way, we assume nothing about the order of items in the list (after dcc_abort)*/
+	completed = dcc_get_completed ();
+	for (; completed; completed = completed->next)
+	{
+		dcc = completed->data;
+		dcc_abort (dcc->serv->front_session, dcc);
+	}
+
+	/* The data was freed by dcc_close */
+	g_slist_free (completed);
+	sensitize_clear_button ();
+}
+
 static void
 browse_folder (char *dir)
 {
@@ -590,7 +664,9 @@ dcc_row_cb (GtkTreeSelection *sel, gpointer user_data)
 		dcc_details_populate (NULL);
 		return;
 	}
-
+	
+	/* there is at least a selection, disable button... similar to banlist semantics*/
+	gtk_widget_set_sensitive (dccfwin.clear_button, FALSE);
 	gtk_widget_set_sensitive (dccfwin.abort_button, TRUE);
 
 	if (list->next)	/* multi selection */
@@ -812,6 +888,7 @@ fe_dcc_open_recv_win (int passive)
 	dccfwin.abort_button = gtkutil_button (bbox, GTK_STOCK_CANCEL, 0, abort_clicked, 0, _("Abort"));
 	dccfwin.accept_button = gtkutil_button (bbox, GTK_STOCK_APPLY, 0, accept_clicked, 0, _("Accept"));
 	dccfwin.resume_button = gtkutil_button (bbox, GTK_STOCK_REFRESH, 0, resume_clicked, 0, _("Resume"));
+	dccfwin.clear_button = gtkutil_button (bbox, GTK_STOCK_CLEAR, 0, clear_completed, 0, _("Clear"));
 	dccfwin.open_button = gtkutil_button (bbox, 0, 0, browse_dcc_folder, 0, _("Open Folder..."));
 	gtk_widget_set_sensitive (dccfwin.accept_button, FALSE);
 	gtk_widget_set_sensitive (dccfwin.resume_button, FALSE);
@@ -1055,6 +1132,8 @@ fe_dcc_update (struct DCC *dcc)
 	default:
 		dcc_update_chat (dcc);
 	}
+
+	sensitize_clear_button ();
 }
 
 void