Don't lose current selection if redefining net/pool/iface/snapshot

This commit is contained in:
Cole Robinson 2013-09-30 18:46:54 -04:00
parent 707a00c950
commit 8f1ea67cad
4 changed files with 75 additions and 53 deletions

View File

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

View File

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

View File

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

View File

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