summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCole Robinson <crobinso@redhat.com>2013-06-13 17:05:33 -0400
committerCole Robinson <crobinso@redhat.com>2013-06-13 17:05:33 -0400
commite2435b6d02ec2fe571d13849ea3de2fa08f473f6 (patch)
tree84feed78250fcc0bc81b84f6eaaa23aecbf29047
parent04f0113c2d793f4ea647722ff0c3b3da7f6f4505 (diff)
downloadvirt-manager-e2435b6d02ec2fe571d13849ea3de2fa08f473f6.tar.gz
asyncjob: Simplify registering a cancel callback
-rw-r--r--virtManager/asyncjob.py34
-rw-r--r--virtManager/engine.py10
-rw-r--r--virtManager/migrate.py11
3 files changed, 22 insertions, 33 deletions
diff --git a/virtManager/asyncjob.py b/virtManager/asyncjob.py
index ce700cbd..4d87302c 100644
--- a/virtManager/asyncjob.py
+++ b/virtManager/asyncjob.py
@@ -162,22 +162,22 @@ class vmmAsyncJob(vmmGObjectUI):
def __init__(self, callback, args, title, text, parent,
- async=True, show_progress=True,
- cancel_back=None, cancel_args=None):
+ async=True, show_progress=True, cancel_cb=None):
"""
@async: If False, run synchronously without a separate thread
@show_progress: If False, don't actually show a progress dialog
- @cancel_back: If operation supports cancelling, call this function
- when cancel button is clicked
- @cancel_args: Arguments for optional cancel_back
+ @cancel_cb: Cancel callback if operation supports it.
+ (cb, arg1, arg2, ...)
"""
vmmGObjectUI.__init__(self, "vmm-progress.ui", "vmm-progress")
self.topwin.set_transient_for(parent)
self.async = bool(async)
self.show_progress = bool(show_progress)
- self.cancel_job = cancel_back
- self.cancel_args = [self] + (cancel_args or [])
+
+ cancel_cb = cancel_cb or (None, [])
+ self.cancel_cb = cancel_cb[0]
+ self.cancel_args = [self] + list(cancel_cb[1:])
self.job_canceled = False
self._error_info = None
@@ -200,10 +200,7 @@ class vmmAsyncJob(vmmGObjectUI):
# UI state
self.topwin.set_title(title)
self.widget("pbar-text").set_text(text)
- if self.cancel_job:
- self.widget("cancel-async-job").show()
- else:
- self.widget("cancel-async-job").hide()
+ self.widget("cancel-async-job").set_visible(bool(self.cancel_cb))
#############
@@ -229,11 +226,11 @@ class vmmAsyncJob(vmmGObjectUI):
return self._meter
def can_cancel(self):
- return bool(self.cancel_job)
+ return bool(self.cancel_cb)
def _cleanup(self):
self.bg_thread = None
- self.cancel_job = None
+ self.cancel_cb = None
self.cancel_args = None
self._meter = None
@@ -265,8 +262,9 @@ class vmmAsyncJob(vmmGObjectUI):
if self.show_progress:
self.topwin.present()
- if not self.cancel_job and self.show_progress:
- self.topwin.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH))
+ if not self.cancel_cb and self.show_progress:
+ self.topwin.get_window().set_cursor(
+ Gdk.Cursor.new(Gdk.CursorType.WATCH))
if self.async:
self.bg_thread.start()
@@ -289,7 +287,7 @@ class vmmAsyncJob(vmmGObjectUI):
def delete(self, ignore1=None, ignore2=None):
thread_active = (self.bg_thread.isAlive() or not self.async)
- if not self.cancel_job or not thread_active:
+ if not self.cancel_cb or not thread_active:
return
res = self.err.warn_chkbox(
@@ -306,10 +304,10 @@ class vmmAsyncJob(vmmGObjectUI):
def cancel(self, ignore1=None, ignore2=None):
- if not self.cancel_job:
+ if not self.cancel_cb:
return
- self.cancel_job(*self.cancel_args)
+ self.cancel_cb(*self.cancel_args)
if self.job_canceled:
self.hide_warning()
self.set_stage_text(_("Cancelling job..."), canceling=True)
diff --git a/virtManager/engine.py b/virtManager/engine.py
index e7b0a8e2..2a9a1764 100644
--- a/virtManager/engine.py
+++ b/virtManager/engine.py
@@ -776,19 +776,15 @@ class vmmEngine(vmmGObject):
if not path:
return
- _cancel_back = None
- _cancel_args = []
+ _cancel_cb = None
if vm.getjobinfo_supported:
- _cancel_back = self._save_cancel
- _cancel_args = [vm]
+ _cancel_cb = (self._save_cancel, vm)
progWin = vmmAsyncJob(self._save_callback,
[vm, path],
_("Saving Virtual Machine"),
_("Saving virtual machine memory to disk "),
- src.topwin,
- cancel_back=_cancel_back,
- cancel_args=_cancel_args)
+ src.topwin, cancel_cb=_cancel_cb)
error, details = progWin.run()
if error is not None:
diff --git a/virtManager/migrate.py b/virtManager/migrate.py
index 243cee80..a48e98ab 100644
--- a/virtManager/migrate.py
+++ b/virtManager/migrate.py
@@ -470,12 +470,9 @@ class vmmMigrateDialog(vmmGObjectUI):
self.topwin.set_sensitive(False)
self.topwin.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH))
+ cancel_cb = None
if self.vm.getjobinfo_supported:
- _cancel_back = self.cancel_migration
- _cancel_args = [self.vm]
- else:
- _cancel_back = None
- _cancel_args = [None]
+ cancel_cb = (self.cancel_migration, self.vm)
progWin = vmmAsyncJob(self._async_migrate,
[self.vm, destconn, uri, rate, live, secure,
@@ -484,9 +481,7 @@ class vmmMigrateDialog(vmmGObjectUI):
(_("Migrating VM '%s' from %s to %s. "
"This may take a while.") %
(self.vm.get_name(), srchost, dsthost)),
- self.topwin,
- cancel_back=_cancel_back,
- cancel_args=_cancel_args)
+ self.topwin, cancel_cb=cancel_cb)
error, details = progWin.run()
self.topwin.set_sensitive(True)