mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
Make progress bar display a little prettier. Add support for setting max-memory when creating guests
This commit is contained in:
parent
8513aed523
commit
862ca28ea6
@ -4255,14 +4255,16 @@ For all domains</property>
|
||||
|
||||
<widget class="GtkWindow" id="vmm-progress">
|
||||
<property name="visible">True</property>
|
||||
<property name="title" translatable="yes">Saving VM Image</property>
|
||||
<property name="title" translatable="yes">Operation in progress</property>
|
||||
<property name="type">GTK_WINDOW_TOPLEVEL</property>
|
||||
<property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
|
||||
<property name="modal">False</property>
|
||||
<property name="default_width">300</property>
|
||||
<property name="default_height">200</property>
|
||||
<property name="resizable">True</property>
|
||||
<property name="destroy_with_parent">False</property>
|
||||
<property name="decorated">True</property>
|
||||
<property name="skip_taskbar_hint">False</property>
|
||||
<property name="skip_taskbar_hint">True</property>
|
||||
<property name="skip_pager_hint">False</property>
|
||||
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
|
||||
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
|
||||
@ -4276,10 +4278,10 @@ For all domains</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xscale">1</property>
|
||||
<property name="yscale">1</property>
|
||||
<property name="top_padding">5</property>
|
||||
<property name="bottom_padding">5</property>
|
||||
<property name="left_padding">12</property>
|
||||
<property name="right_padding">12</property>
|
||||
<property name="top_padding">0</property>
|
||||
<property name="bottom_padding">3</property>
|
||||
<property name="left_padding">3</property>
|
||||
<property name="right_padding">3</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkVBox" id="vbox13">
|
||||
@ -4288,18 +4290,73 @@ For all domains</property>
|
||||
<property name="spacing">5</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="pbar-text">
|
||||
<widget class="GtkHBox" id="hbox50">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Please wait...</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="spacing">0</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkImage" id="image99">
|
||||
<property name="visible">True</property>
|
||||
<property name="icon_size">4</property>
|
||||
<property name="icon_name">gtk-info</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0</property>
|
||||
<property name="xpad">3</property>
|
||||
<property name="ypad">10</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="pbar-text">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Please wait a few moments...</property>
|
||||
<property name="use_underline">False</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">True</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="yalign">0</property>
|
||||
<property name="xpad">10</property>
|
||||
<property name="ypad">10</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="pbar-stage">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Processing...</property>
|
||||
<property name="use_underline">False</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="yalign">0</property>
|
||||
<property name="xpad">3</property>
|
||||
<property name="ypad">3</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
|
@ -35,54 +35,68 @@ class vmmAsyncJob(gobject.GObject):
|
||||
def run(self):
|
||||
threading.Thread.run(self)
|
||||
|
||||
def __init__(self, config, callback, args=None, title="Progress"):
|
||||
def __init__(self, config, callback, args=None, text=_("Please wait a few moments..."), title=_("Operation in progress")):
|
||||
self.__gobject_init__()
|
||||
self.config = config
|
||||
self.pbar_glade = gtk.glade.XML(self.config.get_glade_file(), "vmm-progress", domain="virt-manager")
|
||||
self.pbar_win = self.pbar_glade.get_widget("vmm-progress")
|
||||
self.pbar_text = self.pbar_glade.get_widget("pbar-text")
|
||||
self.pbar = self.pbar_glade.get_widget("pbar")
|
||||
self.pbar_win.set_title(title)
|
||||
self.pbar_win.hide()
|
||||
|
||||
self.window = gtk.glade.XML(self.config.get_glade_file(), "vmm-progress", domain="virt-manager")
|
||||
self.window.get_widget("pbar-text").set_text(text)
|
||||
|
||||
self.topwin = self.window.get_widget("vmm-progress")
|
||||
self.topwin.set_title(title)
|
||||
self.topwin.hide()
|
||||
|
||||
self.stage = self.window.get_widget("pbar-stage")
|
||||
self.pbar = self.window.get_widget("pbar")
|
||||
|
||||
args.append(self)
|
||||
self.bg_thread = vmmAsyncJob.asyncJobWorker(callback, args)
|
||||
self.is_pulsing = True
|
||||
|
||||
def run(self):
|
||||
self.timer = gobject.timeout_add (100, self.exit_if_necessary)
|
||||
self.pbar_win.present()
|
||||
self.pbar_win.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||
self.topwin.present()
|
||||
self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||
self.bg_thread.start()
|
||||
gtk.main()
|
||||
gobject.source_remove(self.timer)
|
||||
self.timer = 0
|
||||
self.pbar_win.destroy()
|
||||
self.topwin.destroy()
|
||||
|
||||
def pulse_pbar(self, text=None):
|
||||
def pulse_pbar(self, progress="", stage=None):
|
||||
self.is_pulsing = True
|
||||
if text is not None:
|
||||
self.pbar_text.set_text(text)
|
||||
self.pbar.set_text(progress)
|
||||
if stage is not None:
|
||||
self.stage.set_text(stage)
|
||||
else:
|
||||
self.stage.set_text(_("Processing..."))
|
||||
|
||||
def set_pbar_fraction(self, frac, text=None):
|
||||
def set_pbar_fraction(self, frac, progress, stage=None):
|
||||
# callback for progress meter when file size is known
|
||||
self.is_pulsing=False
|
||||
if text is not None:
|
||||
self.pbar_text.set_text(text)
|
||||
if stage is not None:
|
||||
self.stage.set_text(stage)
|
||||
else:
|
||||
self.stage.set_text(_("Processing..."))
|
||||
self.pbar.set_text(progress)
|
||||
self.pbar.set_fraction(frac)
|
||||
|
||||
def set_pbar_done(self, text=None):
|
||||
def set_pbar_done(self, progress, stage=None):
|
||||
#callback for progress meter when progress is done
|
||||
self.is_pulsing=False
|
||||
if text is not None:
|
||||
self.pbar_text.set_text(text)
|
||||
if stage is not None:
|
||||
self.stage.set_text(stage)
|
||||
else:
|
||||
self.stage.set_text(_("Completed"))
|
||||
self.pbar.set_text(progress)
|
||||
self.pbar.set_fraction(1)
|
||||
|
||||
|
||||
def exit_if_necessary(self):
|
||||
if(self.bg_thread.isAlive()):
|
||||
if self.bg_thread.isAlive():
|
||||
if(self.is_pulsing):
|
||||
self.pbar.pulse()
|
||||
return True
|
||||
else:
|
||||
gtk.main_quit()
|
||||
return False
|
||||
|
||||
|
||||
|
@ -58,34 +58,38 @@ class vmmCreateMeter(progress.BaseMeter):
|
||||
else:
|
||||
text = self.basename
|
||||
if self.size is None:
|
||||
self.asyncjob.pulse_pbar(text)
|
||||
out = " %5sB" % (0)
|
||||
self.asyncjob.pulse_pbar(out, text)
|
||||
else:
|
||||
self.asyncjob.set_pbar_fraction(0, text)
|
||||
out = "%3i%% %5sB" % (0, 0)
|
||||
self.asyncjob.set_pbar_fraction(0, out, text)
|
||||
|
||||
def _do_update(self, amount_read, now=None):
|
||||
fread = progress.format_number(amount_read)
|
||||
#self.size = None
|
||||
if self.text is not None:
|
||||
text = self.text
|
||||
else:
|
||||
text = self.basename
|
||||
fread = progress.format_number(amount_read)
|
||||
if self.size is None:
|
||||
out = '\r%-60.60s %5sB' % \
|
||||
(text, fread)
|
||||
self.asyncjob.pulse_pbar(out)
|
||||
out = " %5sB" % (fread)
|
||||
self.asyncjob.pulse_pbar(out, text)
|
||||
else:
|
||||
frac = self.re.fraction_read()
|
||||
out = '\r%-25.25s %3i%% %5sB' % \
|
||||
(text, frac*100, fread)
|
||||
self.asyncjob.set_pbar_fraction(frac, out)
|
||||
out = "%3i%% %5sB" % (frac*100, fread)
|
||||
self.asyncjob.set_pbar_fraction(frac, out, text)
|
||||
|
||||
def _do_end(self, amount_read, now=None):
|
||||
if self.text is not None:
|
||||
text = self.text
|
||||
else:
|
||||
text = self.basename
|
||||
out = '\r%-25.25s 100%%' % text
|
||||
self.asyncjob.set_pbar_done(out)
|
||||
fread = progress.format_number(amount_read)
|
||||
if self.size is None:
|
||||
out = " %5sB" % (fread)
|
||||
self.asyncjob.pulse_pbar(out, text)
|
||||
else:
|
||||
out = "%3i%% %5sB" % (100, fread)
|
||||
self.asyncjob.set_pbar_done(out, text)
|
||||
|
||||
class vmmCreate(gobject.GObject):
|
||||
__gsignals__ = {
|
||||
@ -399,7 +403,13 @@ class vmmCreate(gobject.GObject):
|
||||
|
||||
# set the memory
|
||||
try:
|
||||
guest.memory = int(self.get_config_maximum_memory())
|
||||
guest.memory = int(self.get_config_initial_memory())
|
||||
except ValueError:
|
||||
self._validation_error_box(_("Invalid memory setting"), e.args[0])
|
||||
return
|
||||
|
||||
try:
|
||||
guest.maxmemory = int(self.get_config_maximum_memory())
|
||||
except ValueError:
|
||||
self._validation_error_box(_("Invalid memory setting"), e.args[0])
|
||||
return
|
||||
@ -442,6 +452,7 @@ class vmmCreate(gobject.GObject):
|
||||
"\n Source: " + self.get_config_install_source() + \
|
||||
"\n Kickstart: " + self.get_config_kickstart_source() + \
|
||||
"\n Memory: " + str(guest.memory) + \
|
||||
"\n Max Memory: " + str(guest.maxmemory) + \
|
||||
"\n # VCPUs: " + str(guest.vcpus) + \
|
||||
"\n Filesize: " + str(filesize) + \
|
||||
"\n Disk image: " + str(self.get_config_disk_image()) +\
|
||||
@ -457,9 +468,13 @@ class vmmCreate(gobject.GObject):
|
||||
logging.debug("Non-sparse file selected")
|
||||
|
||||
progWin = vmmAsyncJob(self.config, self.do_install, [guest],
|
||||
title=_("Creating Virtual Machine"))
|
||||
title=_("Creating Virtual Machine"),
|
||||
text=_("The virtual machine is now being created. " + \
|
||||
"Allocation of disk storage and retrieval of " + \
|
||||
"the installation images may a few minutes " + \
|
||||
"to complete."))
|
||||
progWin.run()
|
||||
|
||||
|
||||
if self.install_error != None:
|
||||
logging.error("Async job failed to create VM " + str(self.install_error))
|
||||
self._validation_error_box(_("Guest Install Error"), self.install_error)
|
||||
|
Loading…
Reference in New Issue
Block a user