mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-09 23:15:46 -06:00
Don't lose current selection if redefining net/pool/iface/snapshot
This commit is contained in:
parent
707a00c950
commit
8f1ea67cad
@ -131,9 +131,9 @@ class vmmHost(vmmGObjectUI):
|
||||
"on_config_autoconnect_toggled": self.toggle_autoconnect,
|
||||
})
|
||||
|
||||
self.populate_networks(self.widget("net-list").get_model())
|
||||
populate_storage_pools(self.widget("pool-list"), self.conn)
|
||||
self.populate_interfaces(self.widget("interface-list").get_model())
|
||||
self.repopulate_networks()
|
||||
self.repopulate_storage_pools()
|
||||
self.repopulate_interfaces()
|
||||
|
||||
self.conn.connect("net-added", self.repopulate_networks)
|
||||
self.conn.connect("net-removed", self.repopulate_networks)
|
||||
@ -423,6 +423,7 @@ class vmmHost(vmmGObjectUI):
|
||||
def toggle_autoconnect(self, src):
|
||||
self.conn.set_autoconnect(src.get_active())
|
||||
|
||||
|
||||
# -------------------------
|
||||
# Virtual Network functions
|
||||
# -------------------------
|
||||
@ -482,7 +483,7 @@ class vmmHost(vmmGObjectUI):
|
||||
net.define_name(self.widget("net-name").get_text())
|
||||
self.repopulate_networks()
|
||||
except Exception, e:
|
||||
self.err.show_err(_("Error setting net autostart: %s") % str(e))
|
||||
self.err.show_err(_("Error changing network settings: %s") % str(e))
|
||||
return
|
||||
finally:
|
||||
self.disable_net_apply()
|
||||
@ -505,12 +506,13 @@ class vmmHost(vmmGObjectUI):
|
||||
self.enable_net_apply(EDIT_NET_AUTOSTART)
|
||||
|
||||
def current_network(self):
|
||||
sel = self.widget("net-list").get_selection()
|
||||
active = sel.get_selected()
|
||||
if active[1] is not None:
|
||||
curruuid = active[0].get_value(active[1], 0)
|
||||
return self.conn.get_net(curruuid)
|
||||
return None
|
||||
model, _iter = self.widget("net-list").get_selection().get_selected()
|
||||
if not _iter:
|
||||
return
|
||||
try:
|
||||
return self.conn.get_net(model[_iter][0])
|
||||
except KeyError:
|
||||
return
|
||||
|
||||
def refresh_network(self, src_ignore, uuid):
|
||||
uilist = self.widget("net-list")
|
||||
@ -677,6 +679,8 @@ class vmmHost(vmmGObjectUI):
|
||||
self.populate_networks(self.widget("net-list").get_model())
|
||||
|
||||
def populate_networks(self, model):
|
||||
curnet = self.current_network()
|
||||
|
||||
net_list = self.widget("net-list")
|
||||
model.clear()
|
||||
for uuid in self.conn.list_net_uuids():
|
||||
@ -685,10 +689,8 @@ class vmmHost(vmmGObjectUI):
|
||||
Gtk.IconSize.LARGE_TOOLBAR,
|
||||
bool(net.is_active())])
|
||||
|
||||
_iter = model.get_iter_first()
|
||||
if _iter:
|
||||
net_list.get_selection().select_iter(_iter)
|
||||
net_list.get_selection().emit("changed")
|
||||
uihelpers.set_row_selection(net_list,
|
||||
curnet and curnet.get_uuid() or None)
|
||||
|
||||
|
||||
# ------------------------------
|
||||
@ -805,12 +807,13 @@ class vmmHost(vmmGObjectUI):
|
||||
self.refresh_storage_pool(None, cp.get_uuid())
|
||||
|
||||
def current_pool(self):
|
||||
sel = self.widget("pool-list").get_selection()
|
||||
active = sel.get_selected()
|
||||
if active[1] is not None:
|
||||
curruuid = active[0].get_value(active[1], 0)
|
||||
return self.conn.get_pool(curruuid)
|
||||
return None
|
||||
model, _iter = self.widget("pool-list").get_selection().get_selected()
|
||||
if not _iter:
|
||||
return
|
||||
try:
|
||||
return self.conn.get_pool(model[_iter][0])
|
||||
except KeyError:
|
||||
return
|
||||
|
||||
def current_vol(self):
|
||||
pool = self.current_pool()
|
||||
@ -837,7 +840,7 @@ class vmmHost(vmmGObjectUI):
|
||||
pool.define_name(self.widget("pool-name-entry").get_text())
|
||||
self.repopulate_storage_pools()
|
||||
except Exception, e:
|
||||
self.err.show_err(_("Error setting pool autostart: %s") % str(e))
|
||||
self.err.show_err(_("Error changing pool settings: %s") % str(e))
|
||||
return
|
||||
self.disable_pool_apply()
|
||||
|
||||
@ -982,7 +985,7 @@ class vmmHost(vmmGObjectUI):
|
||||
|
||||
def repopulate_storage_pools(self, src_ignore=None, uuid_ignore=None):
|
||||
pool_list = self.widget("pool-list")
|
||||
populate_storage_pools(pool_list, self.conn)
|
||||
populate_storage_pools(pool_list, self.conn, self.current_pool())
|
||||
|
||||
def populate_storage_volumes(self):
|
||||
pool = self.current_pool()
|
||||
@ -1084,13 +1087,14 @@ class vmmHost(vmmGObjectUI):
|
||||
self.refresh_interface(None, cp.get_name())
|
||||
|
||||
def current_interface(self):
|
||||
sel = self.widget("interface-list").get_selection()
|
||||
active = sel.get_selected()
|
||||
if active[1] is not None:
|
||||
currname = active[0].get_value(active[1], 0)
|
||||
return self.conn.get_interface(currname)
|
||||
|
||||
return None
|
||||
model, _iter = self.widget("interface-list").get_selection(
|
||||
).get_selected()
|
||||
if not _iter:
|
||||
return
|
||||
try:
|
||||
return self.conn.get_interface(model[_iter][0])
|
||||
except KeyError:
|
||||
return
|
||||
|
||||
def interface_apply(self, src_ignore):
|
||||
interface = self.current_interface()
|
||||
@ -1252,6 +1256,8 @@ class vmmHost(vmmGObjectUI):
|
||||
self.populate_interfaces(interface_list.get_model())
|
||||
|
||||
def populate_interfaces(self, model):
|
||||
curiface = self.current_interface()
|
||||
|
||||
iface_list = self.widget("interface-list")
|
||||
model.clear()
|
||||
for name in self.conn.list_interface_names():
|
||||
@ -1260,10 +1266,8 @@ class vmmHost(vmmGObjectUI):
|
||||
Gtk.IconSize.LARGE_TOOLBAR,
|
||||
bool(iface.is_active())])
|
||||
|
||||
_iter = model.get_iter_first()
|
||||
if _iter:
|
||||
iface_list.get_selection().select_iter(_iter)
|
||||
iface_list.get_selection().emit("changed")
|
||||
uihelpers.set_row_selection(iface_list,
|
||||
curiface and curiface.get_uuid() or None)
|
||||
|
||||
def populate_interface_children(self):
|
||||
interface = self.current_interface()
|
||||
@ -1309,7 +1313,7 @@ def refresh_pool_in_list(pool_list, conn, uuid):
|
||||
return
|
||||
|
||||
|
||||
def populate_storage_pools(pool_list, conn):
|
||||
def populate_storage_pools(pool_list, conn, curpool):
|
||||
model = pool_list.get_model()
|
||||
# Prevent events while the model is modified
|
||||
pool_list.set_model(None)
|
||||
@ -1324,11 +1328,9 @@ def populate_storage_pools(pool_list, conn):
|
||||
|
||||
model.append([uuid, label, pool.is_active(), per])
|
||||
|
||||
_iter = model.get_iter_first()
|
||||
pool_list.set_model(model)
|
||||
if _iter:
|
||||
pool_list.get_selection().select_iter(_iter)
|
||||
pool_list.get_selection().emit("changed")
|
||||
uihelpers.set_row_selection(pool_list,
|
||||
curpool and curpool.get_uuid() or None)
|
||||
|
||||
|
||||
def get_pool_size_percent(conn, uuid):
|
||||
|
@ -92,8 +92,8 @@ class vmmSnapshotPage(vmmGObjectUI):
|
||||
buf = Gtk.TextBuffer()
|
||||
self.widget("snapshot-new-description").set_buffer(buf)
|
||||
|
||||
# [snap object, row label, tooltip, icon name, sortname]
|
||||
model = Gtk.ListStore(object, str, str, str, str)
|
||||
# [name, row label, tooltip, icon name, sortname]
|
||||
model = Gtk.ListStore(str, str, str, str, str)
|
||||
model.set_sort_column_id(4, Gtk.SortType.ASCENDING)
|
||||
|
||||
col = Gtk.TreeViewColumn("")
|
||||
@ -128,7 +128,14 @@ class vmmSnapshotPage(vmmGObjectUI):
|
||||
model, treepath = selection.get_selected()
|
||||
if treepath is None:
|
||||
return None
|
||||
return model[treepath][0]
|
||||
try:
|
||||
name = model[treepath][0]
|
||||
for snap in self.vm.list_snapshots():
|
||||
if name == snap.get_name():
|
||||
return snap
|
||||
except:
|
||||
pass
|
||||
return None
|
||||
|
||||
def _refresh_snapshots(self):
|
||||
self.vm.refresh_snapshots()
|
||||
@ -144,6 +151,7 @@ class vmmSnapshotPage(vmmGObjectUI):
|
||||
self.widget("snapshot-error-label").set_text(msg)
|
||||
|
||||
def _populate_snapshot_list(self):
|
||||
cursnap = self._get_selected_snapshot()
|
||||
model = self.widget("snapshot-list").get_model()
|
||||
model.clear()
|
||||
|
||||
@ -180,15 +188,14 @@ class vmmSnapshotPage(vmmGObjectUI):
|
||||
|
||||
label = "%s\n<span size='small'>%s: %s%s</span>" % (
|
||||
(name, _("State"), state, external))
|
||||
model.append([snap, label, desc, snap.run_status_icon_name(),
|
||||
model.append([name, label, desc, snap.run_status_icon_name(),
|
||||
sortname])
|
||||
|
||||
if has_internal and has_external:
|
||||
model.append([None, None, None, None, "2"])
|
||||
|
||||
if len(model):
|
||||
self.widget("snapshot-list").get_selection().select_iter(
|
||||
model.get_iter_from_string("0"))
|
||||
uihelpers.set_row_selection(self.widget("snapshot-list"),
|
||||
cursnap and cursnap.get_name() or None)
|
||||
self._initial_populate = True
|
||||
|
||||
def _set_snapshot_state(self, snap=None):
|
||||
@ -378,13 +385,12 @@ class vmmSnapshotPage(vmmGObjectUI):
|
||||
|
||||
|
||||
def _snapshot_selected(self, selection):
|
||||
model, treepath = selection.get_selected()
|
||||
if treepath is None:
|
||||
ignore = selection
|
||||
snap = self._get_selected_snapshot()
|
||||
if not snap:
|
||||
self._set_error_page(_("No snapshot selected."))
|
||||
return
|
||||
|
||||
snap = model[treepath][0]
|
||||
|
||||
try:
|
||||
self._set_snapshot_state(snap)
|
||||
except Exception, e:
|
||||
|
@ -162,8 +162,7 @@ class vmmStorageBrowser(vmmGObjectUI):
|
||||
self.remove_conn()
|
||||
self.conn = conn
|
||||
|
||||
pool_list = self.widget("pool-list")
|
||||
host.populate_storage_pools(pool_list, self.conn)
|
||||
self.repopulate_storage_pools()
|
||||
|
||||
ids = []
|
||||
ids.append(self.conn.connect("pool-added",
|
||||
@ -241,9 +240,9 @@ class vmmStorageBrowser(vmmGObjectUI):
|
||||
# update vol list
|
||||
self.pool_selected(self.widget("pool-list").get_selection())
|
||||
|
||||
def repopulate_storage_pools(self, src_ignore, uuid_ignore):
|
||||
def repopulate_storage_pools(self, src_ignore=None, uuid_ignore=None):
|
||||
pool_list = self.widget("pool-list")
|
||||
host.populate_storage_pools(pool_list, self.conn)
|
||||
host.populate_storage_pools(pool_list, self.conn, self.current_pool())
|
||||
|
||||
|
||||
# Listeners
|
||||
|
@ -1352,6 +1352,21 @@ def set_list_selection(widget, rownum):
|
||||
selection.select_path(path)
|
||||
|
||||
|
||||
def set_row_selection(listwidget, prevkey):
|
||||
model = listwidget.get_model()
|
||||
_iter = None
|
||||
if prevkey:
|
||||
for row in model:
|
||||
if row[0] == prevkey:
|
||||
_iter = row.iter
|
||||
break
|
||||
if not _iter:
|
||||
_iter = model.get_iter_first()
|
||||
if _iter:
|
||||
listwidget.get_selection().select_iter(_iter)
|
||||
listwidget.get_selection().emit("changed")
|
||||
|
||||
|
||||
def child_get_property(parent, child, propname):
|
||||
# Wrapper for child_get_property, which pygobject doesn't properly
|
||||
# introspect
|
||||
|
Loading…
Reference in New Issue
Block a user