diff --git a/src/virtManager/addhardware.py b/src/virtManager/addhardware.py index e6a5c7434..9cd6db4b6 100644 --- a/src/virtManager/addhardware.py +++ b/src/virtManager/addhardware.py @@ -884,45 +884,33 @@ class vmmAddHardware(gobject.GObject): def browse_storage_partition_address(self, src, ignore=None): textent = self.window.get_widget("storage-partition-address") - part = self._browse_file(_("Locate Storage Partition"), textent, - "/dev") - if part != None: - textent.set_text(part) + + self._browse_file(textent) 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()) - filename = self._browse_file(_("Locate or Create New Storage File"), - textent, folder=folder, - confirm_overwrite=True) - if filename != None: - textent.set_text(filename) - def _browse_file(self, dialog_name, textent, folder=None, - confirm_overwrite=False): + self._browse_file(textent, confirm_overwrite=True) + + def _browse_file(self, textent, confirm_overwrite=False): confirm_func = None if confirm_overwrite: confirm_func = self.confirm_overwrite_callback - if folder and not os.access(folder, os.R_OK): - folder = None - def set_storage_cb(src, path): if path: textent.set_text(path) conn = self.vm.get_connection() if self.storage_browser == None: - self.storage_browser = vmmStorageBrowser(self.config, conn, False) + self.storage_browser = vmmStorageBrowser(self.config, conn) self.storage_browser.set_finish_cb(set_storage_cb) - self.storage_browser.local_args = { "dialog_name": dialog_name, - "confirm_func": confirm_func, - "browse_reason": - self.config.CONFIG_DIR_IMAGE } + self.storage_browser.set_browse_reason(self.config.CONFIG_DIR_IMAGE) + self.storage_browser.set_local_arg("confirm_func", confirm_func) + self.storage_browser.show(conn) - return None def toggle_storage_size(self, ignore1=None, ignore2=None): filename = self.get_config_disk_image() diff --git a/src/virtManager/choosecd.py b/src/virtManager/choosecd.py index edfc100ed..76cde4103 100644 --- a/src/virtManager/choosecd.py +++ b/src/virtManager/choosecd.py @@ -125,7 +125,7 @@ class vmmChooseCD(gobject.GObject): pass def browse_fv_iso_location(self, ignore1=None, ignore2=None): - self._browse_file(_("Locate ISO Image")) + self._browse_file() def initialize_opt_media(self): try: @@ -139,16 +139,13 @@ class vmmChooseCD(gobject.GObject): def set_storage_path(self, src, path): self.window.get_widget("iso-path").set_text(path) - def _browse_file(self, dialog_name): + def _browse_file(self): if self.storage_browser == None: - self.storage_browser = vmmStorageBrowser(self.config, self.conn, - True) + self.storage_browser = vmmStorageBrowser(self.config, self.conn) self.storage_browser.connect("storage-browse-finish", self.set_storage_path) - self.storage_browser.local_args = { "dialog_name": dialog_name, - "browse_reason": - self.config.CONFIG_DIR_MEDIA } + + self.storage_browser.set_browse_reason(self.config.CONFIG_DIR_MEDIA) self.storage_browser.show(self.conn) - return None gobject.type_register(vmmChooseCD) diff --git a/src/virtManager/config.py b/src/virtManager/config.py index 2431aa6c7..1ddaa5a68 100644 --- a/src/virtManager/config.py +++ b/src/virtManager/config.py @@ -55,6 +55,22 @@ class vmmConfig: CONFIG_DIR_RESTORE = "restore" CONFIG_DIR_SCREENSHOT = "screenshot" + # Metadata mapping for browse types. Prob shouldn't go here, but works + # for now. + browse_reason_data = { + CONFIG_DIR_IMAGE : { + "enable_create" : True, + "storage_title" : _("Locate or create storage volume"), + "local_title" : _("Locate existing storage"), + }, + + CONFIG_DIR_MEDIA : { + "enable_create" : False, + "storage_title" : _("Locate ISO media volume"), + "local_title" : _("Locate ISO media"), + } + } + CONSOLE_SCALE_NEVER = 0 CONSOLE_SCALE_FULLSCREEN = 1 CONSOLE_SCALE_ALWAYS = 2 diff --git a/src/virtManager/create.py b/src/virtManager/create.py index 0097109e1..de7361bf7 100644 --- a/src/virtManager/create.py +++ b/src/virtManager/create.py @@ -1016,8 +1016,7 @@ class vmmCreate(gobject.GObject): nodetect_label.show() def browse_iso(self, ignore1=None, ignore2=None): - self._browse_file(_("Locate ISO Image"), - self.set_iso_storage_path, + self._browse_file(self.set_iso_storage_path, is_media=True) self.window.get_widget("install-local-box").activate() @@ -1025,8 +1024,7 @@ class vmmCreate(gobject.GObject): self.window.get_widget("config-storage-box").set_sensitive(src.get_active()) def browse_storage(self, ignore1): - self._browse_file(_("Locate existing storage"), - self.set_disk_storage_path, + self._browse_file(self.set_disk_storage_path, is_media=False) def toggle_storage_select(self, src): @@ -1672,21 +1670,17 @@ class vmmCreate(gobject.GObject): logging.exception("Error detecting distro.") self.detectedDistro = (None, 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, - is_media) - - self.storage_browser.set_finish_cb(callback) - + def _browse_file(self, callback, is_media=False): if is_media: reason = self.config.CONFIG_DIR_MEDIA else: reason = self.config.CONFIG_DIR_IMAGE - self.storage_browser.local_args = { "dialog_name": dialog_name, - "start_folder": folder, - "browse_reason": reason} + if self.storage_browser == None: + self.storage_browser = vmmStorageBrowser(self.config, self.conn) + + self.storage_browser.set_finish_cb(callback) + self.storage_browser.set_browse_reason(reason) self.storage_browser.show(self.conn) def show_help(self, ignore): diff --git a/src/virtManager/storagebrowse.py b/src/virtManager/storagebrowse.py index 33802121f..db637fc69 100644 --- a/src/virtManager/storagebrowse.py +++ b/src/virtManager/storagebrowse.py @@ -29,6 +29,7 @@ import virtinst import virtManager.host import virtManager.util as util from virtManager.createvol import vmmCreateVolume +from virtManager.config import vmmConfig from virtManager.error import vmmErrorDialog class vmmStorageBrowser(gobject.GObject): @@ -38,7 +39,7 @@ class vmmStorageBrowser(gobject.GObject): gobject.TYPE_NONE, [str]), } - def __init__(self, config, conn, is_media=False): + def __init__(self, config, conn): self.__gobject_init__() self.window = gtk.glade.XML(config.get_glade_dir() + \ "/vmm-storage-browse.glade", @@ -46,6 +47,7 @@ class vmmStorageBrowser(gobject.GObject): domain="virt-manager") self.config = config self.conn = conn + self.conn_signal_ids = [] self.finish_cb_id = None @@ -59,14 +61,9 @@ class vmmStorageBrowser(gobject.GObject): # Add Volume wizard self.addvol = None - if is_media: - reason = self.config.CONFIG_DIR_MEDIA - else: - reason = self.config.CONFIG_DIR_IMAGE - # Arguments to pass to util.browse_local for local storage - self.local_args = {"dialog_name": _("Choose local storage"), - "browse_reason": reason, } + self.browse_reason = None + self.local_args = {} self.window.signal_autoconnect({ "on_vmm_storage_browse_delete_event" : self.close, @@ -95,6 +92,12 @@ class vmmStorageBrowser(gobject.GObject): self.disconnect(self.finish_cb_id) self.finish_cb_id = self.connect("storage-browse-finish", callback) + def set_browse_reason(self, reason): + self.browse_reason = reason + + def set_local_arg(self, arg, val): + self.local_args[arg] = val + def set_initial_state(self): pool_list = self.window.get_widget("pool-list") virtManager.host.init_pool_list(pool_list, self.pool_selected) @@ -170,6 +173,18 @@ class vmmStorageBrowser(gobject.GObject): util.tooltip_wrapper(self.window.get_widget("browse-local"), tooltip) + # Set data based on browse type + self.local_args["browse_reason"] = self.browse_reason + if not vmmConfig.browse_reason_data.has_key(self.browse_reason): + return + + data = vmmConfig.browse_reason_data[self.browse_reason] + self.topwin.set_title(data["storage_title"]) + self.local_args["dialog_name"] = data["local_title"] + + allow_create = data["enable_create"] + self.window.get_widget("new-volume").set_sensitive(allow_create) + # Convenience helpers def current_pool(self): sel = self.window.get_widget("pool-list").get_selection() diff --git a/src/virtManager/util.py b/src/virtManager/util.py index e08ea0971..fbcf88ded 100644 --- a/src/virtManager/util.py +++ b/src/virtManager/util.py @@ -111,15 +111,13 @@ def browse_local(parent, dialog_name, config, conn, start_folder=None, """ + # Initial setup overwrite_confirm = False choose_button = gtk.STOCK_OPEN if dialog_type == gtk.FILE_CHOOSER_ACTION_SAVE: choose_button = gtk.STOCK_SAVE overwrite_confirm = True - if browse_reason: - start_folder = config.get_default_directory(conn, browse_reason) - fcdialog = gtk.FileChooserDialog(dialog_name, parent, dialog_type, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, @@ -127,11 +125,13 @@ def browse_local(parent, dialog_name, config, conn, start_folder=None, None) fcdialog.set_default_response(gtk.RESPONSE_ACCEPT) + # If confirm is set, warn about a file overwrite if confirm_func: overwrite_confirm = True fcdialog.connect("confirm-overwrite", confirm_func) fcdialog.set_do_overwrite_confirmation(overwrite_confirm) + # Set file match pattern (ex. *.png) if _type != None: pattern = _type name = None @@ -145,12 +145,18 @@ def browse_local(parent, dialog_name, config, conn, start_folder=None, f.set_name(name) fcdialog.set_filter(f) - if start_folder != None: - fcdialog.set_current_folder(start_folder) + # Set initial dialog folder + if browse_reason: + start_folder = config.get_default_directory(conn, browse_reason) + if start_folder != None: + if not os.access(start_folder, os.R_OK): + fcdialog.set_current_folder(start_folder) + + # Run the dialog and parse the response response = fcdialog.run() fcdialog.hide() - if(response == gtk.RESPONSE_ACCEPT): + if (response == gtk.RESPONSE_ACCEPT): filename = fcdialog.get_filename() fcdialog.destroy() ret = filename @@ -158,6 +164,7 @@ def browse_local(parent, dialog_name, config, conn, start_folder=None, fcdialog.destroy() ret = None + # Store the chosen directory in gconf if necessary if ret and browse_reason and not ret.startswith("/dev"): config.set_default_directory(os.path.dirname(ret), browse_reason)