Make progress bar display a little prettier. Add support for setting max-memory when creating guests

This commit is contained in:
Daniel P. Berrange 2007-02-01 14:16:44 -05:00
parent 8513aed523
commit 862ca28ea6
3 changed files with 135 additions and 49 deletions

View File

@ -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>

View File

@ -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

View File

@ -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)