[shotwell] Extract ProgressDialog
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [shotwell] Extract ProgressDialog
- Date: Wed, 20 Dec 2017 21:50:15 +0000 (UTC)
commit a450daec832468b92068e428ed545183db9d1093
Author: Jens Georg <mail jensge org>
Date: Wed Dec 20 12:47:38 2017 +0100
Extract ProgressDialog
src/Dialogs.vala | 172 -------------------------------------
src/dialogs/ProgressDialog.vala | 178 +++++++++++++++++++++++++++++++++++++++
src/meson.build | 1 +
3 files changed, 179 insertions(+), 172 deletions(-)
---
diff --git a/src/Dialogs.vala b/src/Dialogs.vala
index 56a200a..2ca2678 100644
--- a/src/Dialogs.vala
+++ b/src/Dialogs.vala
@@ -784,178 +784,6 @@ public bool remove_offline_dialog(Gtk.Window owner, int count) {
return result == Gtk.ResponseType.OK;
}
-public class ProgressDialog : Gtk.Window {
- private Gtk.ProgressBar progress_bar = new Gtk.ProgressBar();
- private Gtk.Button cancel_button = null;
- private Cancellable cancellable;
- private uint64 last_count = uint64.MAX;
- private int update_every = 1;
- private int minimum_on_screen_time_msec = 500;
- private ulong time_started;
-#if UNITY_SUPPORT
- UnityProgressBar uniprobar = UnityProgressBar.get_instance();
-#endif
-
- public ProgressDialog(Gtk.Window? owner, string text, Cancellable? cancellable = null) {
- this.cancellable = cancellable;
-
- set_title(text);
- set_resizable(false);
- if (owner != null)
- set_transient_for(owner);
- set_modal(true);
- set_type_hint(Gdk.WindowTypeHint.DIALOG);
-
- progress_bar.set_size_request(300, -1);
- progress_bar.set_show_text(true);
-
- Gtk.Box vbox_bar = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
- vbox_bar.pack_start(progress_bar, true, false, 0);
-
- if (cancellable != null) {
- cancel_button = new Gtk.Button.with_mnemonic(Resources.CANCEL_LABEL);
- cancel_button.clicked.connect(on_cancel);
- delete_event.connect(on_window_closed);
- }
-
- Gtk.Box hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
- hbox.pack_start(vbox_bar, true, false, 0);
- if (cancel_button != null)
- hbox.pack_end(cancel_button, false, false, 0);
-
- Gtk.Label primary_text_label = new Gtk.Label("");
- primary_text_label.set_markup("<span weight=\"bold\">%s</span>".printf(text));
- primary_text_label.xalign = 0.0f;
- primary_text_label.yalign = 0.5f;
-
- Gtk.Box vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 12);
- vbox.pack_start(primary_text_label, false, false, 0);
- vbox.pack_start(hbox, true, false, 0);
- vbox.halign = Gtk.Align.CENTER;
- vbox.valign = Gtk.Align.CENTER;
- vbox.hexpand = true;
- vbox.vexpand = true;
- vbox.margin_start = 12;
- vbox.margin_end = 12;
- vbox.margin_top = 12;
- vbox.margin_bottom = 12;
-
- add(vbox);
-
- time_started = now_ms();
- }
-
- public override void realize() {
- base.realize();
-
- // if unable to cancel the progress bar, remove the close button
- if (cancellable == null)
- get_window().set_functions(Gdk.WMFunction.MOVE);
- }
-
- public void update_display_every(int update_every) {
- assert(update_every >= 1);
-
- this.update_every = update_every;
- }
-
- public void set_minimum_on_screen_time_msec(int minimum_on_screen_time_msec) {
- this.minimum_on_screen_time_msec = minimum_on_screen_time_msec;
- }
-
- public void set_fraction(int current, int total) {
- set_percentage((double) current / (double) total);
- }
-
- public void set_percentage(double pct) {
- pct = pct.clamp(0.0, 1.0);
-
- maybe_show_all(pct);
-
- progress_bar.set_fraction(pct);
- progress_bar.set_text(_("%d%%").printf((int) (pct * 100.0)));
-
-#if UNITY_SUPPORT
- //UnityProgressBar: set progress
- uniprobar.set_progress(pct);
-#endif
- }
-
- public void set_status(string text) {
- progress_bar.set_text(text);
-
-#if UNITY_SUPPORT
- //UnityProgressBar: try to draw progress bar
- uniprobar.set_visible(true);
-#endif
- show_all();
- }
-
- // This can be used as a ProgressMonitor delegate.
- public bool monitor(uint64 count, uint64 total, bool do_event_loop = true) {
- if ((last_count == uint64.MAX) || (count - last_count) >= update_every) {
- set_percentage((double) count / (double) total);
- last_count = count;
- }
-
- bool keep_going = (cancellable != null) ? !cancellable.is_cancelled() : true;
-
- // TODO: get rid of this. non-trivial, as some progress-monitor operations are blocking
- // and need to allow the event loop to spin
- //
- // Important: Since it's possible the progress dialog might be destroyed inside this call,
- // avoid referring to "this" afterwards at all costs (in case all refs have been dropped)
-
- if (do_event_loop)
- spin_event_loop();
-
- return keep_going;
- }
-
- public new void close() {
-#if UNITY_SUPPORT
- //UnityProgressBar: reset
- uniprobar.reset();
-#endif
- hide();
- destroy();
- }
-
- private bool on_window_closed() {
- on_cancel();
- return false; // return false so that the system handler will remove the window from
- // the screen
- }
-
- private void on_cancel() {
- if (cancellable != null)
- cancellable.cancel();
-
- cancel_button.sensitive = false;
- }
-
- private void maybe_show_all(double pct) {
- // Appear only after a while because some jobs may take only a
- // fraction of second to complete so there's no point in showing progress.
- if (!this.visible && now_ms() - time_started > minimum_on_screen_time_msec) {
- // calculate percents completed in one ms
- double pps = pct * 100.0 / minimum_on_screen_time_msec;
- // calculate [very rough] estimate of time to complete in ms
- double ttc = 100.0 / pps;
- // If there is still more work to do for at least MINIMUM_ON_SCREEN_TIME_MSEC,
- // finally display the dialog.
- if (ttc > minimum_on_screen_time_msec) {
-#if UNITY_SUPPORT
- //UnityProgressBar: try to draw progress bar
- uniprobar.set_visible(true);
-#endif
- show_all();
- spin_event_loop();
- }
- }
- }
-}
-
public const int MAX_OBJECTS_DISPLAYED = 3;
public void multiple_object_error_dialog(Gee.ArrayList<DataObject> objects, string message,
string title) {
diff --git a/src/dialogs/ProgressDialog.vala b/src/dialogs/ProgressDialog.vala
new file mode 100644
index 0000000..9368764
--- /dev/null
+++ b/src/dialogs/ProgressDialog.vala
@@ -0,0 +1,178 @@
+/* Copyright 2016 Software Freedom Conservancy Inc.
+ * Copyright 2017 Jens Georg <mail jensge org>
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class ProgressDialog : Gtk.Window {
+ private Gtk.ProgressBar progress_bar = new Gtk.ProgressBar();
+ private Gtk.Button cancel_button = null;
+ private Cancellable cancellable;
+ private uint64 last_count = uint64.MAX;
+ private int update_every = 1;
+ private int minimum_on_screen_time_msec = 500;
+ private ulong time_started;
+#if UNITY_SUPPORT
+ UnityProgressBar uniprobar = UnityProgressBar.get_instance();
+#endif
+
+ public ProgressDialog(Gtk.Window? owner, string text, Cancellable? cancellable = null) {
+ this.cancellable = cancellable;
+
+ set_title(text);
+ set_resizable(false);
+ if (owner != null)
+ set_transient_for(owner);
+ set_modal(true);
+ set_type_hint(Gdk.WindowTypeHint.DIALOG);
+
+ progress_bar.set_size_request(300, -1);
+ progress_bar.set_show_text(true);
+
+ Gtk.Box vbox_bar = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ vbox_bar.pack_start(progress_bar, true, false, 0);
+
+ if (cancellable != null) {
+ cancel_button = new Gtk.Button.with_mnemonic(Resources.CANCEL_LABEL);
+ cancel_button.clicked.connect(on_cancel);
+ delete_event.connect(on_window_closed);
+ }
+
+ Gtk.Box hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ hbox.pack_start(vbox_bar, true, false, 0);
+ if (cancel_button != null)
+ hbox.pack_end(cancel_button, false, false, 0);
+
+ Gtk.Label primary_text_label = new Gtk.Label("");
+ primary_text_label.set_markup("<span weight=\"bold\">%s</span>".printf(text));
+ primary_text_label.xalign = 0.0f;
+ primary_text_label.yalign = 0.5f;
+
+ Gtk.Box vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 12);
+ vbox.pack_start(primary_text_label, false, false, 0);
+ vbox.pack_start(hbox, true, false, 0);
+ vbox.halign = Gtk.Align.CENTER;
+ vbox.valign = Gtk.Align.CENTER;
+ vbox.hexpand = true;
+ vbox.vexpand = true;
+ vbox.margin_start = 12;
+ vbox.margin_end = 12;
+ vbox.margin_top = 12;
+ vbox.margin_bottom = 12;
+
+ add(vbox);
+
+ time_started = now_ms();
+ }
+
+ public override void realize() {
+ base.realize();
+
+ // if unable to cancel the progress bar, remove the close button
+ if (cancellable == null)
+ get_window().set_functions(Gdk.WMFunction.MOVE);
+ }
+
+ public void update_display_every(int update_every) {
+ assert(update_every >= 1);
+
+ this.update_every = update_every;
+ }
+
+ public void set_minimum_on_screen_time_msec(int minimum_on_screen_time_msec) {
+ this.minimum_on_screen_time_msec = minimum_on_screen_time_msec;
+ }
+
+ public void set_fraction(int current, int total) {
+ set_percentage((double) current / (double) total);
+ }
+
+ public void set_percentage(double pct) {
+ pct = pct.clamp(0.0, 1.0);
+
+ maybe_show_all(pct);
+
+ progress_bar.set_fraction(pct);
+ progress_bar.set_text(_("%d%%").printf((int) (pct * 100.0)));
+
+#if UNITY_SUPPORT
+ //UnityProgressBar: set progress
+ uniprobar.set_progress(pct);
+#endif
+ }
+
+ public void set_status(string text) {
+ progress_bar.set_text(text);
+
+#if UNITY_SUPPORT
+ //UnityProgressBar: try to draw progress bar
+ uniprobar.set_visible(true);
+#endif
+ show_all();
+ }
+
+ // This can be used as a ProgressMonitor delegate.
+ public bool monitor(uint64 count, uint64 total, bool do_event_loop = true) {
+ if ((last_count == uint64.MAX) || (count - last_count) >= update_every) {
+ set_percentage((double) count / (double) total);
+ last_count = count;
+ }
+
+ bool keep_going = (cancellable != null) ? !cancellable.is_cancelled() : true;
+
+ // TODO: get rid of this. non-trivial, as some progress-monitor operations are blocking
+ // and need to allow the event loop to spin
+ //
+ // Important: Since it's possible the progress dialog might be destroyed inside this call,
+ // avoid referring to "this" afterwards at all costs (in case all refs have been dropped)
+
+ if (do_event_loop)
+ spin_event_loop();
+
+ return keep_going;
+ }
+
+ public new void close() {
+#if UNITY_SUPPORT
+ //UnityProgressBar: reset
+ uniprobar.reset();
+#endif
+ hide();
+ destroy();
+ }
+
+ private bool on_window_closed() {
+ on_cancel();
+ return false; // return false so that the system handler will remove the window from
+ // the screen
+ }
+
+ private void on_cancel() {
+ if (cancellable != null)
+ cancellable.cancel();
+
+ cancel_button.sensitive = false;
+ }
+
+ private void maybe_show_all(double pct) {
+ // Appear only after a while because some jobs may take only a
+ // fraction of second to complete so there's no point in showing progress.
+ if (!this.visible && now_ms() - time_started > minimum_on_screen_time_msec) {
+ // calculate percents completed in one ms
+ double pps = pct * 100.0 / minimum_on_screen_time_msec;
+ // calculate [very rough] estimate of time to complete in ms
+ double ttc = 100.0 / pps;
+ // If there is still more work to do for at least MINIMUM_ON_SCREEN_TIME_MSEC,
+ // finally display the dialog.
+ if (ttc > minimum_on_screen_time_msec) {
+#if UNITY_SUPPORT
+ //UnityProgressBar: try to draw progress bar
+ uniprobar.set_visible(true);
+#endif
+ show_all();
+ spin_event_loop();
+ }
+ }
+ }
+}
diff --git a/src/meson.build b/src/meson.build
index b9087fc..ba260e7 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -197,6 +197,7 @@ executable('shotwell',
'dialogs/ExportDialog.vala',
'dialogs/MultiTextEntryDialog.vala',
'dialogs/Preferences.vala',
+ 'dialogs/ProgressDialog.vala',
'dialogs/SetBackgroundSlideshow.vala',
'dialogs/SetBackground.vala',
'dialogs/TextEntry.vala',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]