mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
asyncjob: Simplify registering a cancel callback
This commit is contained in:
parent
04f0113c2d
commit
e2435b6d02
@ -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)
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user