Michal Novotny wrote: > Hi, > I've modified my patch to match those requirements and hopefully they're > already met now so please review this patch. In addition to saving those > 5 directories (for image/media/save/restore and screenshot files) I > found a bug that prevented showing existing PNG files in folders when > saving screenshots and that has been fixed too (simple fix by changing > "*.png" mask to "png" only because of asterisk and dot appended by > util.browse_local() function itself). > Besides the change to browse_local() I mentioned in the other mail, just a few nit picks inline. > # HG changeset patch > # User Michal Novotny <minovotn@xxxxxxxxxx> > # Date 1245665443 -7200 > # Node ID 51fc9462316334d9360908c5cb713ccfc74de81b > # Parent a996e00b3bb6a99fdf9505c053bc1f6bee532d3b > Make virt-manager remember last used paths > > This patch makes virt-manager remember last used paths for disk images, saved > snapshots, restored snapshots, media paths and also screenshot paths not to > bother users with changing paths from the default location per HV technology. > Useful when installing multiple domains and having all the media/image files > in non-default locations. > > diff -r a996e00b3bb6 -r 51fc94623163 src/virt-manager.schemas.in > --- a/src/virt-manager.schemas.in Thu Jun 18 10:54:21 2009 -0400 > +++ b/src/virt-manager.schemas.in Mon Jun 22 12:10:43 2009 +0200 > @@ -272,5 +272,70 @@ > <long>Whether to install a sound device for remote VMs or not</long> > </locale> > </schema> > + > + <schema> > + <key>/schemas/apps/::PACKAGE::/paths/default-image-path</key> > + <applyto>/apps/::PACKAGE::/paths/default-image-path</applyto> > + <owner>::PACKAGE::</owner> > + <type>string</type> > + <default></default> > + > + <locale name="C"> > + <short>Default image path</short> > + <long>Default path for choosing VM images</long> > + </locale> > + </schema> > + > + <schema> > + <key>/schemas/apps/::PACKAGE::/paths/default-media-path</key> > + <applyto>/apps/::PACKAGE::/paths/default-media-path</applyto> > + <owner>::PACKAGE::</owner> > + <type>string</type> > + <default></default> > + > + <locale name="C"> > + <short>Default media path</short> > + <long>Default path for choosing media</long> > + </locale> > + </schema> > + > + <schema> > + <key>/schemas/apps/::PACKAGE::/paths/default-save-path</key> > + <applyto>/apps/::PACKAGE::/paths/default-save-path</applyto> > + <owner>::PACKAGE::</owner> > + <type>string</type> > + <default></default> > + > + <locale name="C"> > + <short>Default save domain path</short> > + <long>Default path for saving VM snaphots</long> > + </locale> > + </schema> > + > + <schema> > + <key>/schemas/apps/::PACKAGE::/paths/default-restore-path</key> > + <applyto>/apps/::PACKAGE::/paths/default-restore-path</applyto> > + <owner>::PACKAGE::</owner> > + <type>string</type> > + <default></default> > + > + <locale name="C"> > + <short>Default restore path</short> > + <long>Default path for stored VM snapshots</long> > + </locale> > + </schema> > + > + <schema> > + <key>/schemas/apps/::PACKAGE::/paths/default-screenshot-path</key> > + <applyto>/apps/::PACKAGE::/paths/default-screenshot-path</applyto> > + <owner>::PACKAGE::</owner> > + <type>string</type> > + <default></default> > + > + <locale name="C"> > + <short>Default screenshot path</short> > + <long>Default path for saving screenshots from VMs</long> > + </locale> > + </schema> > </schemalist> > </gconfschemafile> > diff -r a996e00b3bb6 -r 51fc94623163 src/virtManager/addhardware.py > --- a/src/virtManager/addhardware.py Thu Jun 18 10:54:21 2009 -0400 > +++ b/src/virtManager/addhardware.py Mon Jun 22 12:10:43 2009 +0200 > @@ -678,7 +678,8 @@ > > def browse_storage_file_address(self, src, ignore=None): > textent = self.window.get_widget("storage-file-address") > - folder = self.config.get_default_image_dir(self.vm.get_connection()) > + folder = self.config.get_default_directory(self.vm.get_connection(), > + self.config.CONFIG_DIR_IMAGE) > filename = self._browse_file(_("Locate or Create New Storage File"), > textent, folder=folder, > confirm_overwrite=True) > diff -r a996e00b3bb6 -r 51fc94623163 src/virtManager/choosecd.py > --- a/src/virtManager/choosecd.py Thu Jun 18 10:54:21 2009 -0400 > +++ b/src/virtManager/choosecd.py Mon Jun 22 12:10:43 2009 +0200 > @@ -20,6 +20,7 @@ > import gtk.glade > import gobject > import logging > +import os.path > > import virtinst > > @@ -133,7 +134,9 @@ > pass > > def browse_fv_iso_location(self, ignore1=None, ignore2=None): > - self._browse_file(_("Locate ISO Image")) > + folder = self.config.get_default_directory(self.conn, > + self.config.CONFIG_DIR_MEDIA) > + self._browse_file(_("Locate ISO Image"), folder=folder) > > def populate_opt_media(self): > try: > @@ -146,14 +149,17 @@ > > def set_storage_path(self, src, path): > self.window.get_widget("iso-path").set_text(path) > + folder = os.path.dirname(path) > + self.config.set_default_directory(folder, self.config.CONFIG_DIR_MEDIA) > > - def _browse_file(self, dialog_name): > + def _browse_file(self, dialog_name, folder): > if self.storage_browser == None: > - self.storage_browser = vmmStorageBrowser(self.config, self.conn) > - #self.topwin) > + self.storage_browser = vmmStorageBrowser(self.config, self.conn, > + True) > self.storage_browser.connect("storage-browse-finish", > self.set_storage_path) > - self.storage_browser.local_args = { "dialog_name": dialog_name } > + self.storage_browser.local_args = { "dialog_name" : dialog_name, > + "start_folder": folder } > self.storage_browser.show(self.conn) > return None > > diff -r a996e00b3bb6 -r 51fc94623163 src/virtManager/config.py > --- a/src/virtManager/config.py Thu Jun 18 10:54:21 2009 -0400 > +++ b/src/virtManager/config.py Mon Jun 22 12:10:43 2009 +0200 > @@ -45,6 +45,13 @@ > > class vmmConfig: > > + # GConf directory names for saving last used paths > + CONFIG_DIR_IMAGE = "image" > + CONFIG_DIR_MEDIA = "media" > + CONFIG_DIR_SAVE = "save" > + CONFIG_DIR_RESTORE = "restore" > + CONFIG_DIR_SCREENSHOT = "screenshot" > + > CONSOLE_SCALE_NEVER = 0 > CONSOLE_SCALE_FULLSCREEN = 1 > CONSOLE_SCALE_ALWAYS = 2 > @@ -261,6 +268,36 @@ > self.conf.set_bool(self.conf_dir + "/vmlist-fields/network_traffic", state) > > > + def get_default_directory(self, conn, _type): > + if len(_type) == 0: If somehow a non string/list value was passed in here (say, None), this would backtrace. You can do something like config_dirs = [CONFIG_DIR_IMAGE, CONFIG_DIR_MEDIA, ...] ... if _type not in self.config_dirs: logging.error(blah) > + logging.error("Unknown type for get_default_directory") > + return > + > + try: > + path = self.conf.get_value(self.conf_dir + "/paths/default-%s-path" > + % _type) > + except: > + path = None > + > + if not path or len(path) == 0: The check for len(path) == 0 is redundant here: 'not path' will match the zero length string. > + if (_type == vmmConfig.CONFIG_DIR_IMAGE or > + _type == vmmConfig.CONFIG_DIR_MEDIA): > + path = self.get_default_image_dir(conn) > + if (_type == vmmConfig.CONFIG_DIR_SAVE or > + _type == vmmConfig.CONFIG_DIR_RESTORE): > + path = self.get_default_save_dir(conn) > + > + logging.debug("get_default_directory(%s): returning %s" % (_type, path)) > + return path > + > + def set_default_directory(self, folder, _type): > + if len(_type) == 0: > + logging.error("Unknown type for set_default_directory") > + return > + > + logging.debug("set_default_directory(%s): saving %s" % (_type, folder)) > + self.conf.set_value(self.conf_dir + "/paths/default-%s-path" % _type, > + folder) > > def on_vmlist_domain_id_visible_changed(self, callback): > self.conf.notify_add(self.conf_dir + "/vmlist-fields/domain_id", callback) > diff -r a996e00b3bb6 -r 51fc94623163 src/virtManager/create.py > --- a/src/virtManager/create.py Thu Jun 18 10:54:21 2009 -0400 > +++ b/src/virtManager/create.py Mon Jun 22 12:10:43 2009 +0200 > @@ -995,16 +995,22 @@ > nodetect_label.show() > > def browse_iso(self, ignore1=None, ignore2=None): > + folder = self.config.get_default_directory(self.conn, > + self.config.CONFIG_DIR_MEDIA) > self._browse_file(_("Locate ISO Image"), > - self.set_iso_storage_path) > + self.set_iso_storage_path, > + folder, True) > self.window.get_widget("install-local-box").activate() > > def toggle_enable_storage(self, src): > self.window.get_widget("config-storage-box").set_sensitive(src.get_active()) > > def browse_storage(self, ignore1): > + folder = self.config.get_default_directory(self.conn, > + self.config.CONFIG_DIR_IMAGE) > self._browse_file(_("Locate existing storage"), > - self.set_disk_storage_path) > + self.set_disk_storage_path, > + folder, False) > > def toggle_storage_select(self, src): > act = src.get_active() > @@ -1014,9 +1020,13 @@ > self.window.get_widget("config-macaddr").set_sensitive(src.get_active()) > > def set_iso_storage_path(self, ignore, path): > + folder = os.path.dirname(path) > + self.config.set_default_directory(folder, self.config.CONFIG_DIR_MEDIA) > self.window.get_widget("install-local-box").child.set_text(path) > > def set_disk_storage_path(self, ignore, path): > + folder = os.path.dirname( path ) > + self.config.set_default_directory(folder, self.config.CONFIG_DIR_IMAGE) > self.window.get_widget("config-storage-entry").set_text(path) > > # Navigation methods > @@ -1648,9 +1658,10 @@ > logging.exception("Error detecting distro.") > self.detectedDistro = (None, None) > > - def _browse_file(self, dialog_name, callback, folder=None): > + def _browse_file(self, dialog_name, callback, folder=None, is_media=False): > if self.storage_browser == None: > - self.storage_browser = vmmStorageBrowser(self.config, self.conn) > + self.storage_browser = vmmStorageBrowser(self.config, self.conn, > + is_media) > self.storage_browser.connect("storage-browse-finish", > callback) > self.storage_browser.local_args = { "dialog_name": dialog_name, > diff -r a996e00b3bb6 -r 51fc94623163 src/virtManager/details.py > --- a/src/virtManager/details.py Thu Jun 18 10:54:21 2009 -0400 > +++ b/src/virtManager/details.py Mon Jun 22 12:10:43 2009 +0200 > @@ -31,6 +31,7 @@ > import os > import socket > import cairo > +import os.path > > from virtManager.error import vmmErrorDialog > from virtManager.addhardware import vmmAddHardware > @@ -1408,13 +1409,22 @@ > def control_vm_screenshot(self, src): > # If someone feels kind they could extend this code to allow > # user to choose what image format they'd like to save in.... > + # Also _type was changed to "png" from "*.png" to show existing files The change is correct, but no need to comment it in the code. > path = util.browse_local(self.window.get_widget("vmm-details"), > _("Save Virtual Machine Screenshot"), > - _type = ("*.png", "PNG files"), > + self.config.get_default_directory( > + self.vm.get_connection(), > + self.config.CONFIG_DIR_SCREENSHOT), > + _type = ("png", "PNG files"), > dialog_type = gtk.FILE_CHOOSER_ACTION_SAVE) > if not path: > return > > + # Save default screenshot directory > + folder = os.path.dirname(path) > + self.config.set_default_directory(folder, > + self.config.CONFIG_DIR_SCREENSHOT) > + > filename = path > if not(filename.endswith(".png")): > filename += ".png" > diff -r a996e00b3bb6 -r 51fc94623163 src/virtManager/engine.py > --- a/src/virtManager/engine.py Thu Jun 18 10:54:21 2009 -0400 > +++ b/src/virtManager/engine.py Mon Jun 22 12:10:43 2009 +0200 > @@ -24,6 +24,7 @@ > import logging > import gnome > import traceback > +import os.path > > from virtManager.about import vmmAbout > from virtManager.connect import vmmConnect > @@ -406,12 +407,17 @@ > > path = util.browse_local(src.window.get_widget("vmm-details"), > _("Save Virtual Machine"), > - self.config.get_default_save_dir(con), > + self.config.get_default_directory(con, > + self.config.CONFIG_DIR_SAVE), > dialog_type=gtk.FILE_CHOOSER_ACTION_SAVE) > > if not path: > return > > + # Save default directory for saving VMs > + folder = os.path.dirname(path) > + self.config.set_default_directory(folder, self.config.CONFIG_DIR_SAVE) > + > progWin = vmmAsyncJob(self.config, self._save_callback, [vm, path], > _("Saving Virtual Machine")) > progWin.run() > diff -r a996e00b3bb6 -r 51fc94623163 src/virtManager/manager.py > --- a/src/virtManager/manager.py Thu Jun 18 10:54:21 2009 -0400 > +++ b/src/virtManager/manager.py Mon Jun 22 12:10:43 2009 +0200 > @@ -23,6 +23,7 @@ > import gtk.glade > import logging > import traceback > +import os.path > > import sparkline > import libvirt > @@ -397,11 +398,16 @@ > > path = util.browse_local(self.window.get_widget("vmm-manager"), > _("Restore Virtual Machine"), > - self.config.get_default_save_dir(conn)) > + self.config.get_default_directory(conn, > + self.config.CONFIG_DIR_RESTORE)) > > if not path: > return > > + # Save last restore path > + folder = os.path.dirname(path) > + self.config.set_default_directory(folder, self.config.CONFIG_DIR_RESTORE) > + > if not conn.is_valid_saved_image(path): > self.err.val_err(_("The file '%s' does not appear to be a " > "valid saved machine image") % path) > diff -r a996e00b3bb6 -r 51fc94623163 src/virtManager/storagebrowse.py > --- a/src/virtManager/storagebrowse.py Thu Jun 18 10:54:21 2009 -0400 > +++ b/src/virtManager/storagebrowse.py Mon Jun 22 12:10:43 2009 +0200 > @@ -23,6 +23,7 @@ > > import traceback > import logging > +import os.path > > import virtinst > > @@ -38,7 +39,7 @@ > gobject.TYPE_NONE, [str]), > } > > - def __init__(self, config, conn): > + def __init__(self, config, conn, is_media=False): > self.__gobject_init__() > self.window = gtk.glade.XML(config.get_glade_dir() + \ > "/vmm-storage-browse.glade", > @@ -46,6 +47,7 @@ > domain="virt-manager") > self.config = config > self.conn = conn > + self.is_media = is_media > self.conn_signal_ids = [] > > self.topwin = self.window.get_widget("vmm-storage-browse") > @@ -240,6 +242,13 @@ > self._do_finish() > > def _do_finish(self, path=None): > + if (not self.is_media and path is not None and > + not path.startswith("/dev")): > + # Save new default image directory > + folder = os.path.dirname(path) > + self.config.set_default_directory(folder, > + self.config.CONFIG_DIR_IMAGE) > + > if not path: > path = self.current_vol().get_path() > self.emit("storage-browse-finish", path) If we move all the gconf getting/setting into browse_local, the above changes to the storage browser aren't necessary: the storage browser will just need to be sure to specify 'conn', 'config', and 'browse_reason' when launching the local browser. Thanks, Cole _______________________________________________ et-mgmt-tools mailing list et-mgmt-tools@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/et-mgmt-tools