Implemented clear functionality for DCC download manager. Created clear button in DCC downloaded manager interface.

This commit is contained in:
Helder Martins 2013-07-10 18:29:10 +01:00
parent 4cf61ccedb
commit 0c87c49146
3 changed files with 90 additions and 1 deletions

View File

@ -227,6 +227,15 @@ is_dcc (struct DCC *dcc)
return FALSE; 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. */ /* this is called from hexchat.c:hexchat_misc_checks() every 1 second. */
void void

View File

@ -117,6 +117,7 @@ struct dccstat_info
extern struct dccstat_info dccstat[]; extern struct dccstat_info dccstat[];
gboolean is_dcc (struct DCC *dcc); gboolean is_dcc (struct DCC *dcc);
gboolean is_dcc_fcompleted (struct DCC *dcc);
void dcc_abort (session *sess, struct DCC *dcc); void dcc_abort (session *sess, struct DCC *dcc);
void dcc_get (struct DCC *dcc); void dcc_get (struct DCC *dcc);
int dcc_resume (struct DCC *dcc); int dcc_resume (struct DCC *dcc);

View File

@ -78,6 +78,7 @@ struct dccwindow
GtkWidget *accept_button; GtkWidget *accept_button;
GtkWidget *resume_button; GtkWidget *resume_button;
GtkWidget *open_button; GtkWidget *open_button;
GtkWidget *clear_button; /* clears aborted and completed requests */
GtkWidget *file_label; GtkWidget *file_label;
GtkWidget *address_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); 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 static void
dcc_fill_window (int flags) 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_model_get_iter_first (GTK_TREE_MODEL (dccfwin.store), &iter);
gtk_tree_selection_select_iter (dccfwin.sel, &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 */ /* return list of selected DCCs */
@ -460,6 +502,14 @@ dcc_get_selected (void)
dccfwin.sel, COL_DCC); dccfwin.sel, COL_DCC);
} }
static void
sensitize_clear_button (void)
{
gboolean show = (exists_completed_tasks () && !dcc_get_selected ());
gtk_widget_set_sensitive (dccfwin.clear_button, show);
}
static void static void
resume_clicked (GtkWidget * wid, gpointer none) resume_clicked (GtkWidget * wid, gpointer none)
{ {
@ -511,6 +561,9 @@ abort_clicked (GtkWidget * wid, gpointer none)
dcc_abort (dcc->serv->front_session, dcc); dcc_abort (dcc->serv->front_session, dcc);
} }
g_slist_free (start); g_slist_free (start);
/* putting it here avoids redudant calls when user presses clear button*/
sensitize_clear_button ();
} }
static void static void
@ -529,6 +582,27 @@ accept_clicked (GtkWidget * wid, gpointer none)
g_slist_free (start); 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 static void
browse_folder (char *dir) browse_folder (char *dir)
{ {
@ -591,6 +665,8 @@ dcc_row_cb (GtkTreeSelection *sel, gpointer user_data)
return; 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); gtk_widget_set_sensitive (dccfwin.abort_button, TRUE);
if (list->next) /* multi selection */ 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.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.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.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...")); 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.accept_button, FALSE);
gtk_widget_set_sensitive (dccfwin.resume_button, FALSE); gtk_widget_set_sensitive (dccfwin.resume_button, FALSE);
@ -1055,6 +1132,8 @@ fe_dcc_update (struct DCC *dcc)
default: default:
dcc_update_chat (dcc); dcc_update_chat (dcc);
} }
sensitize_clear_button ();
} }
void void