]> git.armaanb.net Git - chorizo.git/blobdiff - downloads.c
draft 8
[chorizo.git] / downloads.c
index c738863dee47964cf6c0a95aad00b092ca259484..45f63fb793e5112156d160ac01e84c2ed2615e35 100644 (file)
@@ -1,6 +1,6 @@
 #include <webkit2/webkit2.h>
 
-#include "downloads.h"
+#include "chorizo.h"
 
 gboolean download_handle(WebKitDownload *, gchar *, gpointer);
 void download_click(GtkToolButton *, gpointer);
@@ -15,10 +15,6 @@ struct DownloadManager {
 
 gint downloads = 0;
 
-struct DownloadItem {
-       GtkToolButton *tb;
-       WebKitDownload *download;
-};
 gboolean
 key_downloadmanager(GtkWidget *widget, GdkEvent *event, gpointer data)
 {
@@ -84,9 +80,9 @@ download_handle(WebKitDownload *download, gchar *suggested_filename,
        GtkToolItem *tb;
 
        GtkWidget *chooser = gtk_file_chooser_dialog_new(
-               "Choose download location", GTK_WINDOW(dm.win),
-               GTK_FILE_CHOOSER_ACTION_SAVE, "Save file", GTK_RESPONSE_ACCEPT,
-               "Cancel", GTK_RESPONSE_CANCEL, NULL);
+               "Save File", GTK_WINDOW(dm.win), GTK_FILE_CHOOSER_ACTION_SAVE,
+               "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT,
+               NULL);
        gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser),
                                            (char *)data);
        gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser),
@@ -94,48 +90,44 @@ download_handle(WebKitDownload *download, gchar *suggested_filename,
        gtk_file_chooser_set_do_overwrite_confirmation(
                GTK_FILE_CHOOSER(chooser), TRUE);
        gint res = gtk_dialog_run(GTK_DIALOG(chooser));
-       switch (res) {
-       case GTK_RESPONSE_ACCEPT:
+
+       if (res != GTK_RESPONSE_ACCEPT) {
+               gtk_widget_destroy(chooser);
+       } else {
                uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(chooser));
-               webkit_download_set_destination(
-                       download,
-                       gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(chooser)));
-               break;
-       case GTK_RESPONSE_CANCEL:
-               return FALSE;
-       default:
-               return FALSE;
+               webkit_download_set_destination(download, uri);
+
+               remove(uri + 7); // Remove before overwrite
+
+               gtk_widget_destroy(chooser);
+
+               tb = gtk_tool_button_new(NULL, NULL);
+               gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(tb),
+                                             "network-receive");
+               gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb), uri);
+               gtk_toolbar_insert(GTK_TOOLBAR(dm.toolbar), tb, 0);
+               gtk_widget_show_all(dm.win);
+
+               g_signal_connect(G_OBJECT(download),
+                                "notify::estimated-progress",
+                                G_CALLBACK(changed_download_progress), tb);
+
+               downloads++;
+               g_signal_connect(G_OBJECT(download), "finished",
+                                G_CALLBACK(download_finished), tb);
+
+               g_object_ref(download);
+
+               struct DownloadItem *payload = malloc(sizeof(*payload));
+               payload->tb = (GtkToolButton *)tb;
+               payload->download = download;
+               g_signal_connect(G_OBJECT(tb), "clicked",
+                                G_CALLBACK(download_click), payload);
+               g_signal_connect(G_OBJECT(payload->download), "failed",
+                                G_CALLBACK(download_cancel), payload);
+               g_signal_connect(G_OBJECT(tb), "destroy_event",
+                                G_CALLBACK(g_free), payload);
        }
-
-       gtk_widget_destroy(chooser);
-
-       remove(uri + 7);
-       tb = gtk_tool_button_new(NULL, NULL);
-       gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(tb), "network-receive");
-       gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb), uri);
-       gtk_toolbar_insert(GTK_TOOLBAR(dm.toolbar), tb, 0);
-       gtk_widget_show_all(dm.win);
-
-       g_signal_connect(G_OBJECT(download), "notify::estimated-progress",
-                        G_CALLBACK(changed_download_progress), tb);
-
-       downloads++;
-       g_signal_connect(G_OBJECT(download), "finished",
-                        G_CALLBACK(download_finished), tb);
-
-       g_object_ref(download);
-
-       struct DownloadItem *payload = malloc(sizeof(*payload));
-       payload->tb = (GtkToolButton *)tb;
-       payload->download = download;
-       g_signal_connect(G_OBJECT(tb), "clicked", G_CALLBACK(download_click),
-                        payload);
-       g_signal_connect(G_OBJECT(tb), "failed", G_CALLBACK(download_cancel),
-                        payload);
-       g_signal_connect(G_OBJECT(tb), "destroy_event", G_CALLBACK(g_free),
-                        payload);
-
-       //Propagate-- to whom it may concern.
        return FALSE;
 }
 
@@ -148,14 +140,28 @@ download_cancel(GtkMenuItem *tb, gpointer data)
        webkit_download_cancel(payload->download);
 }
 
+const char *
+download_get_path(struct DownloadItem *payload)
+{
+       const char *path = webkit_download_get_destination(payload->download);
+       return path += 7;
+}
+
 void
-download_remove(GtkMenuItem *tb, gpointer data)
+download_hide(GtkMenuItem *tb, gpointer data)
 {
        struct DownloadItem *payload = data;
        g_object_unref(payload->download);
        gtk_widget_destroy(GTK_WIDGET(payload->tb));
 }
 
+void
+download_delete(GtkMenuItem *tb, gpointer data)
+{
+       remove(download_get_path((struct DownloadItem *)data));
+       download_hide(tb, data);
+}
+
 void
 download_copy_url(GtkMenuItem *tb, gpointer data)
 {
@@ -169,11 +175,9 @@ download_copy_url(GtkMenuItem *tb, gpointer data)
 void
 download_copy_path(GtkMenuItem *tb, gpointer data)
 {
-       struct DownloadItem *payload = data;
-       const gchar *path = webkit_download_get_destination(payload->download);
-       gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD),
-                              path + 7, strlen(path) - 7);
-       //Offset by 7 to remove "file://"
+       const char *path = download_get_path((struct DownloadItem *)data);
+       gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), path,
+                              strlen(path));
 }
 
 void
@@ -199,9 +203,16 @@ download_click(GtkToolButton *tb, gpointer data)
                gtk_widget_show(option);
                gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
        } else {
-               option = gtk_menu_item_new_with_label("Remove download");
+               option =
+                       gtk_menu_item_new_with_label("Hide download from list");
+               g_signal_connect(G_OBJECT(option), "activate",
+                                G_CALLBACK(download_hide), data);
+               gtk_widget_show(option);
+               gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
+
+               option = gtk_menu_item_new_with_label("Delete downloaded file");
                g_signal_connect(G_OBJECT(option), "activate",
-                                G_CALLBACK(download_remove), data);
+                                G_CALLBACK(download_delete), data);
                gtk_widget_show(option);
                gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
 
@@ -230,8 +241,7 @@ download_click(GtkToolButton *tb, gpointer data)
 gboolean
 downloadmanager_delete(GtkWidget *obj, gpointer data)
 {
-       if (!quit_if_nothing_active())
-               gtk_widget_hide(dm.win);
+       if (!quit_if_nothing_active()) gtk_widget_hide(dm.win);
 
        return TRUE;
 }