[gnome-boxes] wizard,installer: Track progress of media preparation



commit 6be8eb2bb72e469f2199b68eb38fba782a43e666
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Mon Dec 17 04:57:39 2012 +0200

    wizard,installer: Track progress of media preparation
    
    Make the progressbar on wizard's preparation page more useful by showing
    progress of media detection and drivers download and keeping user
    informed about current activity.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=690321

 src/media-manager.vala        |   20 ++++++++++++++++----
 src/unattended-installer.vala |   25 +++++++++++++++++++------
 src/wizard.vala               |    8 ++++++++
 3 files changed, 43 insertions(+), 10 deletions(-)
---
diff --git a/src/media-manager.vala b/src/media-manager.vala
index 81baccc..05b44b9 100644
--- a/src/media-manager.vala
+++ b/src/media-manager.vala
@@ -26,6 +26,7 @@ private class Boxes.MediaManager : Object {
     public async InstallerMedia create_installer_media_for_path
                                 (string               path,
                                  InstallerRecognized? on_installer_recognized = null,
+                                 ActivityProgress     progress = new ActivityProgress (),
                                  Cancellable?         cancellable = null) throws GLib.Error {
         var media = yield InstallerMedia.create_for_path (path, this, cancellable);
 
@@ -154,6 +155,7 @@ private class Boxes.MediaManager : Object {
     private async InstallerMedia create_installer_media_from_media
                                 (InstallerMedia       media,
                                  InstallerRecognized? on_installer_recognized = null,
+                                 ActivityProgress     progress = new ActivityProgress (),
                                  Cancellable?         cancellable = null) throws GLib.Error {
         if (media.os == null)
             return media;
@@ -161,14 +163,24 @@ private class Boxes.MediaManager : Object {
         if (on_installer_recognized != null)
             on_installer_recognized (media.os_media, media.os);
 
+        progress.progress = 0.5;
+
         var install_scripts = media.os.get_install_script_list ();
         var filter = new Filter ();
         filter.add_constraint (INSTALL_SCRIPT_PROP_PROFILE, INSTALL_SCRIPT_PROFILE_DESKTOP);
         install_scripts = (install_scripts as Osinfo.List).new_filtered (filter) as InstallScriptList;
 
-        if (install_scripts.get_length () > 0)
-            return yield new UnattendedInstaller.from_media (media, install_scripts);
-        else
-            return media;
+        InstallerMedia install_media;
+        if (install_scripts.get_length () > 0) {
+            var unattended_progress = progress.add_child_activity (0.5);
+            unattended_progress.bind_property ("info", progress, "info");
+
+            install_media = yield new UnattendedInstaller.from_media (media, install_scripts, unattended_progress);
+        } else
+            install_media = media;
+
+        progress.progress = 1.0;
+
+        return install_media;
     }
 }
diff --git a/src/unattended-installer.vala b/src/unattended-installer.vala
index e1b065f..6ed38be 100644
--- a/src/unattended-installer.vala
+++ b/src/unattended-installer.vala
@@ -98,7 +98,9 @@ private class Boxes.UnattendedInstaller: InstallerMedia {
         }
     }
 
-    public async UnattendedInstaller.from_media (InstallerMedia media, InstallScriptList scripts) throws GLib.Error {
+    public async UnattendedInstaller.from_media (InstallerMedia    media,
+                                                 InstallScriptList scripts,
+                                                 ActivityProgress  progress) throws GLib.Error {
         os = media.os;
         os_media = media.os_media;
         label = media.label;
@@ -127,7 +129,7 @@ private class Boxes.UnattendedInstaller: InstallerMedia {
 
         setup_ui ();
 
-        yield setup_pre_install_drivers ();
+        yield setup_pre_install_drivers (progress);
     }
 
     public override void prepare_to_continue_installation (string vm_name) {
@@ -603,17 +605,22 @@ private class Boxes.UnattendedInstaller: InstallerMedia {
         return null;
     }
 
-    private async void setup_pre_install_drivers (Cancellable? cancellable = null) {
+    private async void setup_pre_install_drivers (ActivityProgress progress, Cancellable? cancellable = null) {
         var drivers = get_pre_installable_drivers ();
         var scripts = get_pre_installer_scripts ();
 
         if (drivers.length () == 0 || scripts.length () == 0)
             return;
 
+        progress.info = _("Downloading device drivers...");
+        var driver_progress_scale = 1d / drivers.length () / scripts.length ();
+
         foreach (var driver in drivers) {
             foreach (var script in scripts) {
                 try {
-                    yield setup_pre_install_driver_for_script (driver, script, cancellable);
+                    var driver_progress = progress.add_child_activity (driver_progress_scale);
+                    yield setup_pre_install_driver_for_script (driver, script, driver_progress, cancellable);
+                    driver_progress.progress = 1.0; // Ensure progress reaches 100%
                 } catch (GLib.Error e) {
                     debug ("Failed to make use of drivers at '%s': %s", driver.get_location (), e.message);
                 }
@@ -623,19 +630,25 @@ private class Boxes.UnattendedInstaller: InstallerMedia {
 
     private async void setup_pre_install_driver_for_script (DeviceDriver driver,
                                                             InstallScript script,
+                                                            ActivityProgress progress,
                                                             Cancellable? cancellable) throws GLib.Error {
         var downloader = Downloader.get_instance ();
 
         var driver_files = new GLib.List<UnattendedFile> ();
         var location = driver.get_location ();
         var location_checksum = Checksum.compute_for_string (ChecksumType.MD5, location);
-        foreach (var filename in driver.get_files ()) {
+        var files = driver.get_files ();
+        var file_progress_scale = 1d / files.length ();
+
+        foreach (var filename in files) {
             var file_uri = location + "/" + filename;
             var file = File.new_for_uri (file_uri);
 
             var cached_path = get_drivers_cache (location_checksum + "-" + file.get_basename ());
 
-            file = yield downloader.download (file, cached_path);
+            var file_progress = progress.add_child_activity (file_progress_scale);
+            file = yield downloader.download (file, cached_path, file_progress);
+            file_progress.progress = 1.0; // Ensure progress reaches 100%
 
             driver_files.append (new UnattendedRawFile (this, cached_path, filename));
         }
diff --git a/src/wizard.vala b/src/wizard.vala
index 39add96..9f45b65 100644
--- a/src/wizard.vala
+++ b/src/wizard.vala
@@ -270,8 +270,16 @@ private class Boxes.Wizard: Boxes.UI {
         prep_media_label.label = _("Unknown installer media");
         prep_status_label.label = _("Analyzing..."); // Translators: Analyzing installer media
 
+        var progress = new ActivityProgress ();
+        progress.notify["progress"].connect (() => {
+            if (progress.progress - prep_progress.fraction >= 0.01) // Only entertain >= 1% change
+                prep_progress.fraction = progress.progress;
+        });
+        progress.bind_property ("info", prep_status_label, "label");
+
         media_manager.create_installer_media_for_path.begin (path,
                                                              on_installer_recognized,
+                                                             progress,
                                                              null,
                                                              on_installer_media_instantiated);
     }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]