commit 528bde4c8d5259f25d76a6ee289bbe04cfdfa42b
Author: phantomjinx <p.g.richard...@phantomjinx.co.uk>
Date:   Mon Jan 24 23:04:27 2011 +0000

    Adding / Removing files and progress
    
    * file.c
    * playlist_display_actions.c
     * Improve the ability to save files as addition goes along rather than
       trying to do a great save at the end. With a large number of files at
       least only the last 9 would be lost with a hang/crash rather than all
       of them.
    
    * file_itunesdb.c
     * Remove the progress dialog for saving and replace with existing anjuta
       progress framework.
    
    * gtkpod_app_iface.*
    * anjuta-app.c
     * Framework functions for accessing anjuta progress bar.

 libgtkpod/file.c                                   |   18 ++--
 libgtkpod/file_itunesdb.c                          |  122 +++----------------
 libgtkpod/gtkpod_app_iface.c                       |   10 ++
 libgtkpod/gtkpod_app_iface.h                       |    4 +
 .../playlist_display/playlist_display_actions.c    |    7 +
 src/anjuta-app.c                                   |   16 +++
 6 files changed, 67 insertions(+), 110 deletions(-)
---
diff --git a/libgtkpod/file.c b/libgtkpod/file.c
index 663ab58..c54b84c 100644
--- a/libgtkpod/file.c
+++ b/libgtkpod/file.c
@@ -300,6 +300,7 @@ gboolean add_directory_by_name(iTunesDB *itdb, gchar *name, 
Playlist *plitem, gb
         block_widgets();
         if (dir != NULL) {
             G_CONST_RETURN gchar *next;
+            gint count = 0;
             do {
                 next = g_dir_read_name(dir);
                 if (next != NULL) {
@@ -308,8 +309,16 @@ gboolean add_directory_by_name(iTunesDB *itdb, gchar 
*name, Playlist *plitem, gb
                         result &= add_directory_by_name(itdb, nextfull, 
plitem, descend, addtrackfunc, data);
                     g_free(nextfull);
                 }
+                count++;
+                if (count == 10) { /* update and save every ten tracks added */
+                    gp_save_itdb(itdb);
+                    gtkpod_tracks_statusbar_update();
+                    count = 0;
+                }
             }
             while (next != NULL);
+
+            gp_save_itdb(itdb);
             g_dir_close(dir);
         }
         release_widgets();
@@ -1409,8 +1418,6 @@ void update_track_from_file(iTunesDB *itdb, Track *track) 
{
  "add_track_to_playlist () -- used for dropping tracks at a specific
  position in the track view */
 gboolean add_track_by_filename(iTunesDB *itdb, gchar *fname, Playlist *plitem, 
gboolean descend, AddTrackFunc addtrackfunc, gpointer data) {
-    static gint count = 0; /* do a gtkpod_tracks_statusbar_update() every
-     10 tracks */
     Track *oldtrack;
     gchar str[PATH_MAX];
     gchar *basename;
@@ -1569,17 +1576,12 @@ gboolean add_track_by_filename(iTunesDB *itdb, gchar 
*fname, Playlist *plitem, g
 
             /* indicate that non-transferred files exist */
             data_changed(itdb);
-            ++count;
-            if (count >= 10) /* update every ten tracks added */
-            {
-                gtkpod_tracks_statusbar_update();
-                count = 0;
-            }
         }
         else { /* !track */
             result = FALSE;
         }
     }
+
     while (widgets_blocked && gtk_events_pending())
         gtk_main_iteration();
     return result;
diff --git a/libgtkpod/file_itunesdb.c b/libgtkpod/file_itunesdb.c
index d640e0e..56e0d6e 100644
--- a/libgtkpod/file_itunesdb.c
+++ b/libgtkpod/file_itunesdb.c
@@ -88,10 +88,7 @@ typedef struct {
     gboolean finished; /* background thread has finished */
     Track *track; /* Current track                  */
     const gchar *filename; /* Filename to copy/remove        */
-    /* Widgets for progress dialog */
-    GtkWidget *dialog;
-    GtkWidget *textlabel;
-    GtkProgressBar *progressbar;
+    gdouble current_progress; /* Record of current progress */
 } TransferData;
 
 /* Used to keep the "extended information" until the iTunesDB is loaded */
@@ -1147,6 +1144,7 @@ TransferData *transfer_data_new(void) {
     transfer_data = g_new0 (TransferData, 1);
     transfer_data->mutex = g_mutex_new ();
     transfer_data->finished_cond = g_cond_new ();
+    transfer_data->current_progress = 0;
     return transfer_data;
 }
 
@@ -1172,24 +1170,6 @@ static gpointer th_remove(gpointer userdata) {
     return GINT_TO_POINTER(result);
 }
 
-/* This function is called when the user presses the abort button
- * during transfer_tracks() or delete_tracks() */
-static void file_dialog_abort(TransferData *transfer_data) {
-    g_return_if_fail (transfer_data);
-
-    g_mutex_lock (transfer_data->mutex);
-
-    transfer_data->abort = TRUE;
-
-    g_mutex_unlock (transfer_data->mutex);
-}
-
-/* This function is called when the user closes the window */
-static gboolean file_dialog_delete(TransferData *transfer_data) {
-    file_dialog_abort(transfer_data);
-    return TRUE; /* don't close the window -- let our own code take care of 
this */
-}
-
 /* check if iPod directory stucture is present */
 static gboolean ipod_dirs_present(const gchar *mountpoint) {
     gchar *file;
@@ -1216,49 +1196,9 @@ static gboolean ipod_dirs_present(const gchar 
*mountpoint) {
     return result;
 }
 
-static GtkWidget *create_transfer_information_dialog(TransferData *td) {
-    GladeXML *dialog_xml;
-    GtkWidget *dialog, *widget;
-
-    dialog_xml = gtkpod_xml_new(gtkpod_get_glade_xml(), 
"file_transfer_information_dialog");
-    glade_xml_signal_autoconnect(dialog_xml);
-
-    dialog = gtkpod_xml_get_widget(dialog_xml, 
"file_transfer_information_dialog");
-    g_return_val_if_fail (dialog, NULL);
-
-    /* the window itself */
-    td->dialog = dialog;
-
-    /* text label */
-    td->textlabel = gtkpod_xml_get_widget(dialog_xml, "textlabel");
-
-    /* progress bar */
-    td->progressbar = GTK_PROGRESS_BAR (
-            gtkpod_xml_get_widget (dialog_xml, "progressbar"));
-
-    /* Indicate that user wants to abort */
-    widget = gtkpod_xml_get_widget(dialog_xml, "abortbutton");
-    g_signal_connect_swapped (GTK_OBJECT (widget), "clicked",
-            G_CALLBACK (file_dialog_abort),
-            td);
-
-    /* User tried to close the window */
-    g_signal_connect_swapped (GTK_OBJECT (dialog), "delete-event",
-            G_CALLBACK (file_dialog_delete),
-            td);
-
-    /* Set the dialog parent */
-    gtk_window_set_transient_for(GTK_WINDOW (dialog), GTK_WINDOW (gtkpod_app));
-
-    return dialog;
-}
-
-static void set_progressbar(GtkProgressBar *progressbar, time_t start, gint n, 
gint count, gint init_count) {
+static gdouble set_progress(time_t start, gint n, gint count, gint init_count, 
gdouble old_fraction) {
     gchar *progtext;
-    const gchar *progtext_old;
-    gdouble fraction, fraction_old;
-
-    g_return_if_fail (progressbar);
+    gdouble fraction;
 
     if (n == 0) {
         fraction = 1;
@@ -1278,23 +1218,21 @@ static void set_progressbar(GtkProgressBar 
*progressbar, time_t start, gint n, g
         hrs = fullsecs / 3600;
         mins = (fullsecs % 3600) / 60;
         secs = ((fullsecs % 60) / 5) * 5;
-        /* don't bounce up too quickly (>10% change only) */
-        /* left = ((mins < left) || (100*mins >= 110*left)) ? mins : left;*/
         progtext
                 = g_strdup_printf(_("%d%% (%d/%d  %d:%02d:%02d left)"), (gint) 
(fraction * 100), count, n, (gint) hrs, (gint) mins, (gint) secs);
     }
 
-    progtext_old = gtk_progress_bar_get_text(progressbar);
-    if (!progtext_old || (strcmp(progtext_old, progtext) != 0)) { /* only 
update progressbar text if it has changed */
-        gtk_progress_bar_set_text(progressbar, progtext);
-    }
 
-    fraction_old = gtk_progress_bar_get_fraction(progressbar);
-    if (fraction_old != fraction) { /* only update progressbar fraction if it 
has changed */
-        gtk_progress_bar_set_fraction(progressbar, fraction);
-    }
+    gdouble ticks = fraction - old_fraction;
+    gtkpod_statusbar_increment_progress_ticks(ticks * 100, progtext);
 
     g_free(progtext);
+
+    if (fraction == 1) {
+        gtkpod_statusbar_reset_progress(100);
+    }
+
+    return fraction;
 }
 
 /* Removes all tracks that were marked for deletion from the iPod or
@@ -1326,7 +1264,7 @@ static gboolean delete_files(iTunesDB *itdb, TransferData 
*td) {
      interference with slow access harddisks */
     file_transfer_activate(itdb, FALSE);
 
-    gtk_label_set_text(GTK_LABEL (td->textlabel), _("Status: Deleting File"));
+    gtkpod_statusbar_message(_("Status: Deleting File"));
 
     n = g_list_length(eitdb->pending_deletion);
     count = 0; /* number of tracks removed */
@@ -1360,7 +1298,7 @@ static gboolean delete_files(iTunesDB *itdb, TransferData 
*td) {
             do {
                 GTimeVal gtime;
 
-                set_progressbar(td->progressbar, start, n, count, 0);
+                td->current_progress = set_progress(start, n, count, 0, 
td->current_progress);
 
                 g_mutex_unlock (td->mutex);
 
@@ -1395,7 +1333,7 @@ static gboolean delete_files(iTunesDB *itdb, TransferData 
*td) {
         eitdb->pending_deletion = g_list_delete_link(eitdb->pending_deletion, 
eitdb->pending_deletion);
     }
 
-    set_progressbar(td->progressbar, start, n, count, 0);
+    td->current_progress = set_progress(start, n, count, 0, 
td->current_progress);
 
     while (widgets_blocked && gtk_events_pending())
         gtk_main_iteration();
@@ -1437,8 +1375,6 @@ static void transfer_tracks_show_failed(iTunesDB *itdb, 
TransferData *td) {
 
     g_return_if_fail (itdb && td);
 
-    gtk_widget_hide(td->dialog);
-
     string_transfer = g_string_sized_new(1000);
     string_convert = g_string_sized_new(1000);
     string = g_string_sized_new(1000);
@@ -1536,14 +1472,10 @@ static gboolean transfer_tracks(iTunesDB *itdb, 
TransferData *td) {
 
     do {
         gchar *buf;
-        const gchar *buf_old;
 
         status
                 = file_transfer_get_status(itdb, &to_convert_num, 
&converting_num, &to_transfer_num, &transferred_num, &failed_num);
 
-        set_progressbar(td->progressbar, start, to_convert_num + 
to_transfer_num + failed_num + transferred_num, transferred_num
-                + failed_num, transferred_init);
-
         if (to_transfer_num > 0) {
             buf = g_strdup_printf(_("Status: Copying track"));
         }
@@ -1556,15 +1488,9 @@ static gboolean transfer_tracks(iTunesDB *itdb, 
TransferData *td) {
             }
         }
 
-        /*     buf = g_strdup_printf (_("Status: %d. To convert: %d. To 
transfer: %d\n"
-         "Transferred: %d. Failed: %d"),
-         status, to_convert_num, to_transfer_num,
-         transferred_num, failed_num);*/
-        buf_old = gtk_label_get_text(GTK_LABEL(td->textlabel));
-        if (!buf_old || (strcmp(buf_old, buf) != 0)) { /* only set label if it 
has changed */
-            gtk_label_set_text(GTK_LABEL(td->textlabel), buf);
-        }
-        g_free(buf);
+        gtkpod_statusbar_message(buf);
+        td->current_progress = set_progress(start, to_convert_num + 
to_transfer_num + failed_num + transferred_num, transferred_num
+                        + failed_num, transferred_init, td->current_progress);
 
         if ((to_convert_num != 0) && (converting_num == 0)) { /* Force the 
conversion to continue. Not sure if this scenario
          * is likely to happen, but better be safe then sorry */
@@ -1589,8 +1515,6 @@ static gboolean transfer_tracks(iTunesDB *itdb, 
TransferData *td) {
         gchar *buf;
         GtkWidget *dialog;
 
-        gtk_widget_hide(td->dialog);
-
         buf
                 = g_strdup_printf(ngettext (
                         "One track could not be transferred because your iPod 
is full. Either delete some tracks or otherwise create space on the iPod before 
ejecting the iPod again.",
@@ -1622,7 +1546,6 @@ static gboolean gp_write_itdb(iTunesDB *itdb) {
     gchar *cfgdir;
     gboolean success = TRUE;
     ExtraiTunesDBData *eitdb;
-    GtkWidget *dialog;
     Playlist *mpl;
     TransferData *transferdata;
     GList *it;
@@ -1680,8 +1603,7 @@ static gboolean gp_write_itdb(iTunesDB *itdb) {
     block_widgets();
 
     transferdata = transfer_data_new();
-    dialog = create_transfer_information_dialog(transferdata);
-    gtk_widget_show(dialog);
+    gtkpod_statusbar_reset_progress(100);
 
     if ((itdb->usertype & GP_ITDB_TYPE_IPOD) && !get_offline(itdb)) {
         const gchar *mountpoint = itdb_get_mountpoint(itdb);
@@ -1712,10 +1634,7 @@ static gboolean gp_write_itdb(iTunesDB *itdb) {
     }
 
     if (success) {
-        gchar *buf;
-        buf = g_strdup_printf(_("Now writing database '%s'. Please wait..."), 
mpl->name);
-        gtk_label_set_text(GTK_LABEL (transferdata->textlabel), buf);
-        g_free(buf);
+        gtkpod_statusbar_message(_("Now writing database '%s'. Please 
wait..."), mpl->name);
 
         while (widgets_blocked && gtk_events_pending())
             gtk_main_iteration();
@@ -1871,7 +1790,6 @@ static gboolean gp_write_itdb(iTunesDB *itdb) {
 
     g_free(cfgdir);
 
-    gtk_widget_destroy(dialog);
     transfer_data_free(transferdata);
 
     release_widgets();
diff --git a/libgtkpod/gtkpod_app_iface.c b/libgtkpod/gtkpod_app_iface.c
index e5e66db..c97dde6 100644
--- a/libgtkpod/gtkpod_app_iface.c
+++ b/libgtkpod/gtkpod_app_iface.c
@@ -184,6 +184,16 @@ gint gtkpod_cleanup_quit() {
     return FALSE; // dont quit!
 }
 
+void gtkpod_statusbar_reset_progress(gint total) {
+    g_return_if_fail (GTKPOD_IS_APP(gtkpod_app));
+    GTKPOD_APP_GET_INTERFACE 
(gtkpod_app)->statusbar_reset_progress(gtkpod_app, total);
+}
+
+void gtkpod_statusbar_increment_progress_ticks(gint ticks, gchar* text) {
+    g_return_if_fail (GTKPOD_IS_APP(gtkpod_app));
+    GTKPOD_APP_GET_INTERFACE 
(gtkpod_app)->statusbar_increment_progress_ticks(gtkpod_app, ticks, text);
+}
+
 void gtkpod_statusbar_message(gchar* message, ...) {
     g_return_if_fail (GTKPOD_IS_APP(gtkpod_app));
     gchar* msg;
diff --git a/libgtkpod/gtkpod_app_iface.h b/libgtkpod/gtkpod_app_iface.h
index ab6ddaa..64b5e98 100644
--- a/libgtkpod/gtkpod_app_iface.h
+++ b/libgtkpod/gtkpod_app_iface.h
@@ -142,6 +142,8 @@ struct _GtkPodAppInterface {
     GHashTable *filetypes;
 
     void (*itdb_updated)(GtkPodApp *obj, iTunesDB *oldItdb, iTunesDB *newItbd);
+    void (*statusbar_reset_progress)(GtkPodApp *obj, gint total);
+    void (*statusbar_increment_progress_ticks)(GtkPodApp *obj, gint ticks, 
gchar* text);
     void (*statusbar_message)(GtkPodApp *obj, gchar* message, ...);
     void (*gtkpod_warning)(GtkPodApp *obj, gchar *message, ...);
     void (*gtkpod_warning_hig)(GtkPodApp *obj, GtkMessageType icon, const 
gchar *primary_text, const gchar *secondary_text);
@@ -166,6 +168,8 @@ gchar* gtkpod_get_glade_xml();
 gboolean ok_to_close_gtkpod();
 gint gtkpod_cleanup_quit();
 
+void gtkpod_statusbar_reset_progress(gint total);
+void gtkpod_statusbar_increment_progress_ticks(gint ticks, gchar* text);
 void gtkpod_statusbar_message(gchar* message, ...);
 void gtkpod_statusbar_busy_push();
 void gtkpod_statusbar_busy_pop();
diff --git a/plugins/playlist_display/playlist_display_actions.c 
b/plugins/playlist_display/playlist_display_actions.c
index df44af7..5387c41 100644
--- a/plugins/playlist_display/playlist_display_actions.c
+++ b/plugins/playlist_display/playlist_display_actions.c
@@ -232,6 +232,7 @@ static void create_add_playlists_dialog(iTunesDB *itdb) {
 }
 
 static void fileselection_add_files(GSList* names, Playlist *playlist) {
+    gint count = 0;
     GSList* gsl; /* Current node in list */
     gboolean result = TRUE; /* Result of file adding */
 
@@ -245,6 +246,12 @@ static void fileselection_add_files(GSList* names, 
Playlist *playlist) {
     for (gsl = names; gsl; gsl = gsl->next) {
         result
                 &= add_track_by_filename(playlist->itdb, gsl->data, playlist, 
prefs_get_int("add_recursively"), NULL, NULL);
+        count++;
+        if (count == 10) { /* update and save every ten tracks added */
+            gp_save_itdb(playlist->itdb);
+            gtkpod_tracks_statusbar_update();
+            count = 0;
+        }
     }
 
     /* clear log of non-updated tracks */
diff --git a/src/anjuta-app.c b/src/anjuta-app.c
index 4819af8..9aeb155 100644
--- a/src/anjuta-app.c
+++ b/src/anjuta-app.c
@@ -973,6 +973,20 @@ static void anjuta_shell_iface_init(AnjutaShellIface 
*iface) {
  * --       GtkPodAppInterface implementations                  --
  * -------------------------------------------------------------------------
  */
+
+static void anjuta_gtkpod_statusbar_reset_progress(GtkPodApp *obj, gint total) 
{
+    g_return_if_fail(ANJUTA_IS_APP(gtkpod_app));
+    AnjutaStatus *status = anjuta_shell_get_status(ANJUTA_SHELL(gtkpod_app), 
NULL);
+    anjuta_status_progress_reset (status);
+    anjuta_status_progress_add_ticks (status, total);
+}
+
+static void anjuta_gtkpod_statusbar_increment_progress_ticks(GtkPodApp *obj, 
gint ticks, gchar* text) {
+    g_return_if_fail(ANJUTA_IS_APP(gtkpod_app));
+    AnjutaStatus *status = anjuta_shell_get_status(ANJUTA_SHELL(gtkpod_app), 
NULL);
+    anjuta_status_progress_increment_ticks(status, ticks, text);
+}
+
 static void anjuta_gtkpod_app_statusbar_message(GtkPodApp *gtkpod_app, gchar* 
message, ...) {
     g_return_if_fail(ANJUTA_IS_APP(gtkpod_app));
 
@@ -1439,6 +1453,8 @@ static GtkResponseType 
anjuta_gtkpod_app_confirmation(GtkPodApp *obj, gint id, g
 }
 
 static void gtkpod_app_iface_init(GtkPodAppInterface *iface) {
+    iface->statusbar_reset_progress = anjuta_gtkpod_statusbar_reset_progress;
+    iface->statusbar_increment_progress_ticks = 
anjuta_gtkpod_statusbar_increment_progress_ticks;
     iface->statusbar_message = anjuta_gtkpod_app_statusbar_message;
     iface->statusbar_busy_push = anjuta_gtkpod_app_statusbar_busy_push;
     iface->statusbar_busy_pop = anjuta_gtkpod_app_statusbar_busy_pop;

------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires 
February 28th, so secure your free ArcSight Logger TODAY! 
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to