diff --git a/src/virtManager/create.py b/src/virtManager/create.py index efecd1dc..bdb431f0 100644 --- a/src/virtManager/create.py +++ b/src/virtManager/create.py @@ -90,7 +90,7 @@ class vmmCreate(vmmGObjectUI): # 'Configure before install' window self.config_window = None - self.config_window_signal = None + self.config_window_signals = [] self.window.signal_autoconnect({ "on_vmm_newcreate_delete_event" : self.close, @@ -1205,6 +1205,15 @@ class vmmCreate(vmmGObjectUI): notebook.set_current_page(next_page) + def _get_next_pagenum(self, curpage): + next_page = curpage + 1 + + if next_page == PAGE_STORAGE and self.skip_disk_page(): + # Skip storage page for import installs + next_page += 1 + + return next_page + def forward(self, src_ignore=None): notebook = self.widget("create-pages") curpage = notebook.get_current_page() @@ -1225,10 +1234,7 @@ class vmmCreate(vmmGObjectUI): # See if we need to alter our default HV based on install method self.guest_from_install_type() - next_page = curpage + 1 - if next_page == PAGE_STORAGE and self.skip_disk_page(): - # Skip storage page for import installs - next_page += 1 + next_page = self._get_next_pagenum(curpage) self.widget("create-forward").grab_focus() notebook.set_current_page(next_page) @@ -1337,16 +1343,16 @@ class vmmCreate(vmmGObjectUI): return guest - def validate(self, pagenum): + def validate(self, pagenum, revalidate=False): try: if pagenum == PAGE_NAME: return self.validate_name_page() elif pagenum == PAGE_INSTALL: - return self.validate_install_page(revalidate=False) + return self.validate_install_page(revalidate=revalidate) elif pagenum == PAGE_MEM: return self.validate_mem_page() elif pagenum == PAGE_STORAGE: - return self.validate_storage_page(revalidate=False) + return self.validate_storage_page(revalidate=revalidate) elif pagenum == PAGE_FINISH: return self.validate_final_page() @@ -1660,12 +1666,21 @@ class vmmCreate(vmmGObjectUI): def reset_guest_type(self): self.change_caps() + def rebuild_guest(self): + pagenum = 0 + while True: + self.validate(pagenum, revalidate=False) + if pagenum >= PAGE_FINISH: + break + pagenum = self._get_next_pagenum(pagenum) + def finish(self, src_ignore): # Validate the final page page = self.widget("create-pages").get_current_page() if self.validate(page) != True: return False + self.rebuild_guest() guest = self.guest disk = len(guest.disks) and guest.disks[0] @@ -1697,14 +1712,15 @@ class vmmCreate(vmmGObjectUI): self._check_start_error(start_install) + def _undo_finish(self, ignore=None): + self.topwin.set_sensitive(True) + self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.TOP_LEFT_ARROW)) + def _check_start_error(self, cb, *args, **kwargs): try: cb(*args, **kwargs) except Exception, e: - self.topwin.set_sensitive(True) - self.topwin.window.set_cursor( - gtk.gdk.Cursor(gtk.gdk.TOP_LEFT_ARROW)) - + self._undo_finish() self.err.show_err(_("Error starting installation: ") + str(e)) def customize(self, guest): @@ -1712,7 +1728,8 @@ class vmmCreate(vmmGObjectUI): def cleanup_config_window(): if self.config_window: - self.config_window.disconnect(self.config_window_signal) + for s in self.config_window_signals: + self.config_window.disconnect(s) self.config_window.cleanup() self.config_window = None @@ -1722,14 +1739,20 @@ class vmmCreate(vmmGObjectUI): return self._check_start_error(self.start_install, guest) + def details_closed(ignore): + self._undo_finish() + self.widget("summary-customize").set_active(False) cleanup_config_window() - self.config_window = vmmDetails(virtinst_guest, - self.topwin) - self.config_window_signal = self.config_window.connect( - "details-closed", + self.config_window = vmmDetails(virtinst_guest, self.topwin) + self.config_window_signals = [] + self.config_window_signals.append(self.config_window.connect( + "customize-finished", start_install_wrapper, - guest) + guest)) + self.config_window_signals.append(self.config_window.connect( + "details-closed", + details_closed)) self.config_window.show() def start_install(self, guest): diff --git a/src/virtManager/details.py b/src/virtManager/details.py index 027dfeb5..42398e74 100644 --- a/src/virtManager/details.py +++ b/src/virtManager/details.py @@ -332,7 +332,8 @@ class vmmDetails(vmmGObjectUI): "on_control_pause_toggled": self.control_vm_pause, "on_control_fullscreen_toggled": self.control_fullscreen, - "on_details_customize_finish_clicked": self.close, + "on_details_customize_finish_clicked": self.customize_finish, + "on_details_cancel_customize_clicked": self.close, "on_details_menu_run_activate": self.control_vm_run, "on_details_menu_poweroff_activate": self.control_vm_shutdown, @@ -511,7 +512,14 @@ class vmmDetails(vmmGObjectUI): self.emit("details-opened") self.refresh_vm_state() + def customize_finish(self, src): + ignore = src + return self._close(customize_finish=True) + def close(self, ignore1=None, ignore2=None): + return self._close() + + def _close(self, customize_finish=False): fs = self.widget("details-menu-view-fullscreen") if fs.get_active(): fs.set_active(False) @@ -520,14 +528,18 @@ class vmmDetails(vmmGObjectUI): return self.topwin.hide() - if (self.console.viewer and self.console.viewer.get_widget() and - self.console.viewer.get_widget().flags() & gtk.VISIBLE): + if (self.console.viewer and + self.console.viewer.get_widget() and + self.console.viewer.get_widget().flags() & gtk.VISIBLE): try: self.console.close_viewer() except: logging.error("Failure when disconnecting from desktop server") - self.emit("details-closed") + if customize_finish: + self.emit("customize-finished") + else: + self.emit("details-closed") return 1 def is_visible(self): @@ -3267,3 +3279,4 @@ vmmDetails.signal_new(vmmDetails, "action-migrate-domain", [str, str]) vmmDetails.signal_new(vmmDetails, "action-clone-domain", [str, str]) vmmDetails.signal_new(vmmDetails, "details-closed", []) vmmDetails.signal_new(vmmDetails, "details-opened", []) +vmmDetails.signal_new(vmmDetails, "customize-finished", []) diff --git a/src/vmm-details.glade b/src/vmm-details.glade index 49349995..52718623 100644 --- a/src/vmm-details.glade +++ b/src/vmm-details.glade @@ -496,6 +496,20 @@ True + + + True + True + _Cancel + True + gtk-cancel + + + + False + True + + 1 @@ -1249,7 +1263,6 @@ True True - True @@ -3638,7 +3651,7 @@ I/O: - + True 1 Serial num_ber: @@ -3667,7 +3680,7 @@ I/O: - + True @@ -4214,7 +4227,7 @@ I/O: - + True @@ -4227,7 +4240,7 @@ I/O: - + True Virtual port True @@ -5076,7 +5089,7 @@ I/O: 0 none - + True 3 12 @@ -5155,7 +5168,7 @@ I/O: 0 none - + True 3 12 @@ -5312,7 +5325,7 @@ I/O: 0 none - + True 3 12 @@ -5458,7 +5471,7 @@ I/O: 0 none - + True 3 12 @@ -5526,7 +5539,7 @@ I/O: 0 none - + True 3 12 @@ -5664,7 +5677,7 @@ I/O: - + True fs @@ -5678,24 +5691,24 @@ I/O: True - + True 0 none - + True 3 12 - + True 3 2 8 4 - + True 0 M_ode: @@ -5744,7 +5757,7 @@ I/O: - + True <b>Smartcard Device</b> True @@ -5764,7 +5777,7 @@ I/O: - + True snd @@ -5836,7 +5849,7 @@ I/O: - + True Details