Clean up FileChooser usage a bit

* Move browse_reason handling entirely into storagebrowser.py
* Open code some of the browse_local logic at the few callers

Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson
2022-12-13 15:09:35 -05:00
parent 67832d3097
commit cbc5b89707
10 changed files with 115 additions and 139 deletions

View File

@@ -1590,8 +1590,8 @@ class vmmAddHardware(vmmGObjectUI):
textent.set_text(path)
reason = (isdir and
self.config.CONFIG_DIR_FS or
self.config.CONFIG_DIR_IMAGE)
vmmStorageBrowser.REASON_FS or
vmmStorageBrowser.REASON_IMAGE)
if self._storagebrowser is None:
self._storagebrowser = vmmStorageBrowser(self.conn)

View File

@@ -133,51 +133,6 @@ class _SettingsWrapper(object):
class vmmConfig(object):
# key names for saving last used paths
CONFIG_DIR_IMAGE = "image"
CONFIG_DIR_ISO_MEDIA = "isomedia"
CONFIG_DIR_FLOPPY_MEDIA = "floppymedia"
CONFIG_DIR_SCREENSHOT = "screenshot"
CONFIG_DIR_FS = "fs"
# 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"),
"dialog_type": Gtk.FileChooserAction.SAVE,
"choose_button": Gtk.STOCK_OPEN,
"gsettings_key": "image",
},
CONFIG_DIR_SCREENSHOT: {
"gsettings_key": "screenshot",
},
CONFIG_DIR_ISO_MEDIA: {
"enable_create": False,
"storage_title": _("Locate ISO media volume"),
"local_title": _("Locate ISO media"),
"gsettings_key": "media",
},
CONFIG_DIR_FLOPPY_MEDIA: {
"enable_create": False,
"storage_title": _("Locate floppy media volume"),
"local_title": _("Locate floppy media"),
"gsettings_key": "media",
},
CONFIG_DIR_FS: {
"enable_create": False,
"storage_title": _("Locate directory volume"),
"local_title": _("Locate directory volume"),
"dialog_type": Gtk.FileChooserAction.SELECT_FOLDER,
},
}
CONSOLE_SCALE_NEVER = 0
CONSOLE_SCALE_FULLSCREEN = 1
CONSOLE_SCALE_ALWAYS = 2
@@ -627,23 +582,15 @@ class vmmConfig(object):
# Default directory location dealings
def get_default_directory(self, conn, _type):
ignore = conn
browsedata = self.browse_reason_data.get(_type, {})
key = browsedata.get("gsettings_key", None)
path = None
if key:
path = self.conf.get("/paths/%s-default" % key)
log.debug("directory for type=%s returning=%s", _type, path)
def get_default_directory(self, gsettings_key):
path = self.conf.get("/paths/%s-default" % gsettings_key)
log.debug("directory for gsettings_key=%s returning=%s",
gsettings_key, path)
return path
def set_default_directory(self, folder, _type):
browsedata = self.browse_reason_data.get(_type, {})
key = browsedata.get("gsettings_key", None)
if not key:
def set_default_directory(self, gsettings_key, folder):
if not folder or folder.startswith("/dev"):
return # pragma: no cover
log.debug("saving directory for type=%s to %s", key, folder)
self.conf.set("/paths/%s-default" % key, folder)
log.debug("saving directory for gsettings_key=%s to %s",
gsettings_key, folder)
self.conf.set("/paths/%s-default" % gsettings_key, folder)

View File

@@ -381,9 +381,8 @@ class vmmCreatePool(vmmGObjectUI):
self._show_options_by_pool()
def _browse_source_cb(self, src):
source = self.err.browse_local(self.conn,
source = self.err.browse_local(
_("Choose source path"),
dialog_type=Gtk.FileChooserAction.OPEN,
start_folder="/dev")
if source:
self.widget("pool-source-path").get_child().set_text(source)
@@ -394,7 +393,7 @@ class vmmCreatePool(vmmGObjectUI):
if current:
startfolder = os.path.dirname(current)
target = self.err.browse_local(self.conn,
target = self.err.browse_local(
_("Choose target directory"),
dialog_type=Gtk.FileChooserAction.SELECT_FOLDER,
start_folder=startfolder)

View File

@@ -1280,11 +1280,11 @@ class vmmCreateVM(vmmGObjectUI):
def _browse_file(self, cbwidget, cb=None, is_media=False, is_dir=False):
if is_media:
reason = self.config.CONFIG_DIR_ISO_MEDIA
reason = vmmStorageBrowser.REASON_ISO_MEDIA
elif is_dir:
reason = self.config.CONFIG_DIR_FS
reason = vmmStorageBrowser.REASON_FS
else:
reason = self.config.CONFIG_DIR_IMAGE
reason = vmmStorageBrowser.REASON_IMAGE
if cb:
callback = cb

View File

@@ -208,7 +208,7 @@ class vmmCreateVolume(vmmGObjectUI):
self._storage_browser.set_finish_cb(cb)
self._storage_browser.topwin.set_modal(self.topwin.get_modal())
self._storage_browser.set_browse_reason(
self.config.CONFIG_DIR_IMAGE)
vmmStorageBrowser.REASON_IMAGE)
self._storage_browser.show(self.topwin)

View File

@@ -1089,7 +1089,7 @@ class vmmDetails(vmmGObjectUI):
def _browse_file(self, callback, reason=None):
if not reason:
reason = self.config.CONFIG_DIR_IMAGE
reason = vmmStorageBrowser.REASON_IMAGE
if self.storage_browser is None:
self.storage_browser = vmmStorageBrowser(self.conn)
@@ -1235,9 +1235,9 @@ class vmmDetails(vmmGObjectUI):
def _disk_source_browse_clicked_cb(self, src):
disk = self._get_hw_row()[HW_LIST_COL_DEVICE]
if disk.is_floppy():
reason = self.config.CONFIG_DIR_FLOPPY_MEDIA
reason = vmmStorageBrowser.REASON_FLOPPY_MEDIA
else:
reason = self.config.CONFIG_DIR_ISO_MEDIA
reason = vmmStorageBrowser.REASON_ISO_MEDIA
def cb(ignore, path):
self._mediacombo.set_path(path)

View File

@@ -268,8 +268,8 @@ class vmmFSDetails(vmmGObjectUI):
textent.set_text(path)
reason = (isdir and
self.config.CONFIG_DIR_FS or
self.config.CONFIG_DIR_IMAGE)
vmmStorageBrowser.REASON_FS or
vmmStorageBrowser.REASON_IMAGE)
if self._storage_browser is None:
self._storage_browser = vmmStorageBrowser(self.conn)

View File

@@ -3,6 +3,7 @@
# This work is licensed under the GNU GPLv2 or later.
# See the COPYING file in the top-level directory.
import os
import sys
import textwrap
import traceback
@@ -231,49 +232,38 @@ class vmmErrorDialog(vmmGObject):
return response
def browse_local(self, conn, dialog_name, start_folder=None,
def browse_local(self, dialog_name, start_folder=None,
_type=None, dialog_type=None,
browse_reason=None,
choose_button=None, default_name=None):
choose_button=None, default_name=None,
confirm_overwrite=False):
"""
Helper function for launching a filechooser
@dialog_name: String to use in the title bar of the filechooser.
@conn: vmmConnection used by calling class
@start_folder: Folder the filechooser is viewing at startup
@_type: File extension to filter by (e.g. "iso", "png")
@dialog_type: Maps to FileChooserDialog 'action'
@browse_reason: The vmmConfig.CONFIG_DIR* reason we are browsing.
If set, this will override the 'folder' parameter with the gsettings
value, and store the user chosen path.
"""
import os
# Initial setup
overwrite_confirm = False
dialog_type = dialog_type or Gtk.FileChooserAction.OPEN
if dialog_type == Gtk.FileChooserAction.SAVE:
if choose_button is None:
choose_button = Gtk.STOCK_SAVE
overwrite_confirm = True
if dialog_type is None:
dialog_type = Gtk.FileChooserAction.OPEN
if choose_button is None:
choose_button = Gtk.STOCK_OPEN
buttons = (Gtk.STOCK_CANCEL,
Gtk.ResponseType.CANCEL,
choose_button,
Gtk.ResponseType.ACCEPT)
fcdialog = Gtk.FileChooserDialog(title=dialog_name,
parent=self.get_parent(),
action=dialog_type,
buttons=(Gtk.STOCK_CANCEL,
Gtk.ResponseType.CANCEL,
choose_button,
Gtk.ResponseType.ACCEPT))
buttons=buttons)
fcdialog.set_default_response(Gtk.ResponseType.ACCEPT)
if default_name:
fcdialog.set_current_name(default_name)
fcdialog.set_do_overwrite_confirmation(overwrite_confirm)
fcdialog.set_do_overwrite_confirmation(confirm_overwrite)
# Set file match pattern (ex. *.png)
if _type is not None:
@@ -289,11 +279,6 @@ class vmmErrorDialog(vmmGObject):
f.set_name(name)
fcdialog.set_filter(f)
# Set initial dialog folder
if browse_reason:
start_folder = self.config.get_default_directory(
conn, browse_reason)
if start_folder is not None:
if os.access(start_folder, os.R_OK):
fcdialog.set_current_folder(start_folder)
@@ -304,10 +289,6 @@ class vmmErrorDialog(vmmGObject):
ret = fcdialog.get_filename()
fcdialog.destroy()
# Store the chosen directory in gsettings if necessary
if ret and browse_reason and not ret.startswith("/dev"):
self.config.set_default_directory(
os.path.dirname(ret), browse_reason)
return ret

View File

@@ -4,6 +4,10 @@
# This work is licensed under the GNU GPLv2 or later.
# See the COPYING file in the top-level directory.
import os
from gi.repository import Gtk
from virtinst import log
from .lib import uiutil
@@ -11,15 +15,53 @@ from .baseclass import vmmGObjectUI
from .hoststorage import vmmHostStorage
class _BrowseReasonMetadata:
def __init__(self, browse_reason):
self.enable_create = False
self.storage_title = None
self.local_title = None
self.gsettings_key = None
self.dialog_type = None
if browse_reason == vmmStorageBrowser.REASON_IMAGE:
self.enable_create = True
self.local_title = _("Locate existing storage")
self.storage_title = _("Locate or create storage volume")
self.dialog_type = Gtk.FileChooserAction.SAVE
self.gsettings_key = "image"
if browse_reason == vmmStorageBrowser.REASON_ISO_MEDIA:
self.local_title = _("Locate ISO media")
self.storage_title = _("Locate ISO media volume")
self.gsettings_key = "media"
if browse_reason == vmmStorageBrowser.REASON_FLOPPY_MEDIA:
self.local_title = _("Locate floppy media")
self.storage_title = _("Locate floppy media volume")
self.gsettings_key = "media"
if browse_reason == vmmStorageBrowser.REASON_FS:
self.local_title = _("Locate directory volume")
self.storage_title = _("Locate directory volume")
self.dialog_type = Gtk.FileChooserAction.SELECT_FOLDER
if browse_reason is None:
self.enable_create = True
self.storage_title = _("Choose Storage Volume")
class vmmStorageBrowser(vmmGObjectUI):
REASON_IMAGE = "image"
REASON_ISO_MEDIA = "isomedia"
REASON_FLOPPY_MEDIA = "floppymedia"
REASON_FS = "fs"
def __init__(self, conn):
vmmGObjectUI.__init__(self, "storagebrowse.ui", "vmm-storage-browse")
self.conn = conn
self._first_run = False
self._finish_cb = None
# Passed to browse_local
self._browse_reason = None
self.storagelist = vmmHostStorage(self.conn, self.builder, self.topwin,
@@ -103,15 +145,10 @@ class vmmStorageBrowser(vmmGObjectUI):
def set_browse_reason(self, reason):
self._browse_reason = reason
data = self.config.browse_reason_data.get(self._browse_reason, {})
allow_create = True
title = _("Choose Storage Volume")
if data:
allow_create = data["enable_create"]
title = data["storage_title"]
data = _BrowseReasonMetadata(self._browse_reason)
self.topwin.set_title(title)
self.storagelist.widget("vol-add").set_sensitive(allow_create)
self.topwin.set_title(data.storage_title)
self.storagelist.widget("vol-add").set_sensitive(data.enable_create)
#############
@@ -128,7 +165,7 @@ class vmmStorageBrowser(vmmGObjectUI):
self._finish(volume.get_target_path())
def _vol_sensitive_cb(self, fmt):
if ((self._browse_reason == self.config.CONFIG_DIR_FS) and
if ((self._browse_reason == vmmStorageBrowser.REASON_FS) and
fmt != 'dir'):
return False
return True
@@ -139,22 +176,27 @@ class vmmStorageBrowser(vmmGObjectUI):
####################
def _browse_local(self):
dialog_type = None
dialog_name = None
choose_button = None
data = _BrowseReasonMetadata(self._browse_reason)
gsettings_key = data.gsettings_key
data = self.config.browse_reason_data.get(self._browse_reason)
if data:
dialog_name = data["local_title"] or None
dialog_type = data.get("dialog_type")
choose_button = data.get("choose_button")
if gsettings_key:
start_folder = self.config.get_default_directory(gsettings_key)
filename = self.err.browse_local(self.conn,
dialog_type=dialog_type, browse_reason=self._browse_reason,
dialog_name=dialog_name, choose_button=choose_button)
if filename:
log.debug("Browse local chose path=%s", filename)
self._finish(filename)
filename = self.err.browse_local(
dialog_type=data.dialog_type,
dialog_name=data.local_title,
start_folder=start_folder)
if not filename:
return
log.debug("Browse local chose path=%s", filename)
if gsettings_key:
self.config.set_default_directory(
gsettings_key, os.path.dirname(filename))
self._finish(filename)
def _finish(self, path):
if self._finish_cb:

View File

@@ -548,24 +548,31 @@ class vmmVMWindow(vmmGObjectUI):
ret = ret.buffer # pragma: no cover
import datetime
import os
now = str(datetime.datetime.now()).split(".")[0].replace(" ", "_")
default = "Screenshot_%s_%s.png" % (self.vm.get_name(), now)
path = self.err.browse_local(
self.vm.conn, _("Save Virtual Machine Screenshot"),
start_folder = self.config.get_default_directory("screenshot")
filename = self.err.browse_local(
_("Save Virtual Machine Screenshot"),
_type=("png", _("PNG files")),
dialog_type=Gtk.FileChooserAction.SAVE,
browse_reason=self.config.CONFIG_DIR_SCREENSHOT,
default_name=default)
if not path: # pragma: no cover
choose_button=Gtk.STOCK_SAVE,
start_folder=start_folder,
default_name=default,
confirm_overwrite=True)
if not filename: # pragma: no cover
log.debug("No screenshot path given, skipping save.")
return
filename = path
if not filename.endswith(".png"):
filename += ".png" # pragma: no cover
open(filename, "wb").write(ret)
self.config.set_default_directory(
"screenshot", os.path.dirname(filename))
########################
# Details page refresh #