Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1047875 Signed-off-by: Giuseppe Scrivano <gscrivan@xxxxxxxxxx> --- virtManager/host.py | 102 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 87 insertions(+), 15 deletions(-) diff --git a/virtManager/host.py b/virtManager/host.py index 3c53a20..38d4737 100644 --- a/virtManager/host.py +++ b/virtManager/host.py @@ -1,5 +1,5 @@ # -# Copyright (C) 2007, 2013 Red Hat, Inc. +# Copyright (C) 2007, 2013-2014 Red Hat, Inc. # Copyright (C) 2007 Daniel P. Berrange <berrange@xxxxxxxxxx> # # This program is free software; you can redistribute it and/or modify @@ -41,13 +41,20 @@ from virtManager.graphwidgets import Sparkline INTERFACE_PAGE_INFO = 0 INTERFACE_PAGE_ERROR = 1 -(EDIT_NET_NAME, +EDIT_NET_IDS = ( +EDIT_NET_NAME, EDIT_NET_AUTOSTART, EDIT_NET_QOS, +) = range(3) +EDIT_POOL_IDS = ( EDIT_POOL_NAME, EDIT_POOL_AUTOSTART, -) = range(5) +) = range(100, 102) + +EDIT_INTERFACE_IDS = ( +EDIT_INTERFACE_STARTMODE, +) = range(200, 201) class vmmHost(vmmGObjectUI): @@ -99,7 +106,7 @@ class vmmHost(vmmGObjectUI): "on_net_delete_clicked": self.delete_network, "on_net_stop_clicked": self.stop_network, "on_net_start_clicked": self.start_network, - "on_net_apply_clicked": self.net_apply, + "on_net_apply_clicked": (lambda *x: self.net_apply()), "on_net_list_changed": self.net_selected, "on_net_autostart_toggled": self.net_autostart_changed, "on_net_name_changed": (lambda *x: @@ -114,7 +121,7 @@ class vmmHost(vmmGObjectUI): "on_pool_autostart_toggled": self.pool_autostart_changed, "on_vol_delete_clicked": self.delete_vol, "on_vol_list_button_press_event": self.popup_vol_menu, - "on_pool_apply_clicked": self.pool_apply, + "on_pool_apply_clicked": (lambda *x: self.pool_apply()), "on_vol_list_changed": self.vol_selected, "on_pool_name_changed": (lambda *x: self.enable_pool_apply(x, EDIT_POOL_NAME)), @@ -124,7 +131,7 @@ class vmmHost(vmmGObjectUI): "on_interface_stop_clicked" : self.stop_interface, "on_interface_delete_clicked" : self.delete_interface, "on_interface_startmode_changed": self.interface_startmode_changed, - "on_interface_apply_clicked" : self.interface_apply, + "on_interface_apply_clicked" : (lambda *x: self.interface_apply()), "on_interface_list_changed": self.interface_selected, "on_config_autoconnect_toggled": self.toggle_autoconnect, @@ -177,6 +184,9 @@ class vmmHost(vmmGObjectUI): netListModel = Gtk.ListStore(str, str, str, int, bool) self.widget("net-list").set_model(netListModel) + sel = self.widget("net-list").get_selection() + sel.set_select_function((lambda *x: self.confirm_changes()), None) + netCol = Gtk.TreeViewColumn("Networks") netCol.set_spacing(6) net_txt = Gtk.CellRendererText() @@ -235,7 +245,7 @@ class vmmHost(vmmGObjectUI): volListModel.set_sort_column_id(1, Gtk.SortType.ASCENDING) - init_pool_list(self.widget("pool-list"), self.pool_selected) + self.init_pool_list() def init_interface_state(self): self.widget("interface-pages").set_show_tabs(False) @@ -244,6 +254,9 @@ class vmmHost(vmmGObjectUI): interfaceListModel = Gtk.ListStore(str, str, str, int, bool) self.widget("interface-list").set_model(interfaceListModel) + sel = self.widget("interface-list").get_selection() + sel.set_select_function((lambda *x: self.confirm_changes()), None) + interfaceCol = Gtk.TreeViewColumn("Interfaces") interfaceCol.set_spacing(6) interface_txt = Gtk.CellRendererText() @@ -324,6 +337,8 @@ class vmmHost(vmmGObjectUI): if not self.is_visible(): return + self.confirm_changes() + self.topwin.hide() self.emit("host-closed") @@ -377,11 +392,15 @@ class vmmHost(vmmGObjectUI): def page_changed(self, src, child, pagenum): ignore = src ignore = child + self.confirm_changes() if pagenum == 1: + self.repopulate_networks() self.conn.schedule_priority_tick(pollnet=True) elif pagenum == 2: + self.repopulate_storage_volumes() self.conn.schedule_priority_tick(pollpool=True) elif pagenum == 3: + self.repopulate_interfaces() self.conn.schedule_priority_tick(polliface=True) def refresh_resources(self, ignore=None): @@ -485,7 +504,7 @@ class vmmHost(vmmGObjectUI): except Exception, e: self.err.show_err(_("Error launching network wizard: %s") % str(e)) - def net_apply(self, src_ignore): + def net_apply(self): net = self.current_network() if net is None: return @@ -532,15 +551,29 @@ class vmmHost(vmmGObjectUI): self.disable_net_apply() def disable_net_apply(self): - self.active_edits = [] + for i in EDIT_NET_IDS: + if i in self.active_edits: + self.active_edits.remove(i) self.widget("net-apply").set_sensitive(False) + def disable_interface_apply(self): + for i in EDIT_INTERFACE_IDS: + if i in self.active_edits: + self.active_edits.remove(i) + self.widget("interface-apply").set_sensitive(False) + def enable_net_apply(self, *arglist): edittype = arglist[-1] self.widget("net-apply").set_sensitive(True) if edittype not in self.active_edits: self.active_edits.append(edittype) + def enable_interface_apply(self, *arglist): + edittype = arglist[-1] + self.widget("interface-apply").set_sensitive(True) + if edittype not in self.active_edits: + self.active_edits.append(edittype) + def net_autostart_changed(self, src_ignore): auto = self.widget("net-autostart").get_active() self.widget("net-autostart").set_label(auto and @@ -810,6 +843,9 @@ class vmmHost(vmmGObjectUI): logging.debug("Already refreshing the pool, skipping") return + if not self.confirm_changes(): + return + pool = self.current_pool() if pool is None: return @@ -899,7 +935,7 @@ class vmmHost(vmmGObjectUI): except KeyError: return None - def pool_apply(self, src_ignore): + def pool_apply(self): pool = self.current_pool() if pool is None: return @@ -911,14 +947,19 @@ class vmmHost(vmmGObjectUI): pool.set_autostart(auto) if EDIT_POOL_NAME in self.active_edits: pool.define_name(self.widget("pool-name-entry").get_text()) + self.disable_pool_apply() self.repopulate_storage_pools() except Exception, e: self.err.show_err(_("Error changing pool settings: %s") % str(e)) return + self.disable_pool_apply() def disable_pool_apply(self): - self.active_edits = [] + for i in EDIT_POOL_IDS: + if i in self.active_edits: + self.active_edits.remove(i) + self.widget("pool-apply").set_sensitive(False) def enable_pool_apply(self, *arglist): @@ -1141,11 +1182,14 @@ class vmmHost(vmmGObjectUI): except KeyError: return None - def interface_apply(self, src_ignore): + def interface_apply(self): interface = self.current_interface() if interface is None: return + if EDIT_INTERFACE_STARTMODE not in self.active_edits: + return + newmode = uiutil.get_list_selection( self.widget("interface-startmode"), 0) @@ -1159,10 +1203,10 @@ class vmmHost(vmmGObjectUI): return # XXX: This will require an interface restart - self.widget("interface-apply").set_sensitive(False) + self.disable_interface_apply() def interface_startmode_changed(self, src_ignore): - self.widget("interface-apply").set_sensitive(True) + self.enable_interface_apply(EDIT_INTERFACE_STARTMODE) def set_interface_error_page(self, msg): self.reset_interface_state() @@ -1185,7 +1229,8 @@ class vmmHost(vmmGObjectUI): self.set_interface_error_page(_("Error selecting interface: %s") % e) - self.widget("interface-apply").set_sensitive(False) + self.disable_interface_apply() + def populate_interface_state(self, connkey): interface = self.conn.get_interface(connkey) @@ -1331,6 +1376,33 @@ class vmmHost(vmmGObjectUI): row = [name, itype] model.append(row) + def confirm_changes(self): + if not self.active_edits: + return True + + if self.err.chkbox_helper( + self.config.get_confirm_unapplied, + self.config.set_confirm_unapplied, + text1=(_("There are unapplied changes. " + "Would you like to apply them now?")), + chktext=_("Don't warn me again."), + alwaysrecord=True, + default=False): + self.pool_apply() + self.net_apply() + self.interface_apply() + + self.active_edits = [] + return True + + def init_pool_list(self): + pool_list = self.widget("pool-list") + init_pool_list(pool_list, self.pool_selected) + + sel = pool_list.get_selection() + sel.set_select_function((lambda *x: self.confirm_changes()), + None) + # These functions are broken out, since they are used by storage browser # dialog. -- 1.9.3 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list