Lightningbeam/GUI/Win32/BaseFileDialogs.py

96 lines
3.1 KiB
Python

#--------------------------------------------------------------------
#
# PyGUI - File Dialogs - Win32
#
#--------------------------------------------------------------------
import win32con as wc, win32ui as ui, win32api as api
from GUI.Files import FileRef, DirRef
win_ofn_flags = wc.OFN_FILEMUSTEXIST | wc.OFN_PATHMUSTEXIST | wc.OFN_HIDEREADONLY \
| wc.OFN_NOCHANGEDIR | wc.OFN_OVERWRITEPROMPT
def win_filter(file_types):
filters = []
if file_types:
for ftype in file_types:
suffix = ftype.suffix
if suffix:
pattern = "*.%s" % suffix
filters.append("%s (%s)|%s" % (ftype.name, pattern, pattern))
return "|".join(filters) + "||"
def win_fix_prompt(prompt):
for s in ("as:", ":"):
if prompt.lower().endswith(s):
prompt = prompt[:-len(s)]
return prompt.strip()
def win_set_prompt(dlog, prompt):
dlog.SetOFNTitle(win_fix_prompt(prompt))
def fileref(path, file_type = None):
if file_type:
suffix = file_type.suffix
if suffix:
ext = "." + suffix
if not path.endswith(suffix):
path += ext
return FileRef(path = path)
def _request_old_file(prompt, default_dir, file_types, multiple):
flags = win_ofn_flags
if multiple:
flags |= wc.OFN_ALLOWMULTISELECT
filter = win_filter(file_types)
dlog = ui.CreateFileDialog(True, None, None, flags, filter)
win_set_prompt(dlog, prompt)
if default_dir:
dlog.SetOFNInitialDir(default_dir.path)
code = dlog.DoModal()
if code == 1: # IDOK
if multiple:
return map(fileref, dlog.GetPathNames())
else:
return fileref(dlog.GetPathName())
def _request_old_dir(prompt, default_dir):
from win32com.shell import shell as sh
import win32com.shell.shellcon as sc
win_bif_flags = sc.BIF_RETURNONLYFSDIRS # | sc.BIF_EDITBOX | wc.BIF_VALIDATE
if default_dir:
def callback(hwnd, msg, lp, data):
if msg == sc.BFFM_INITIALIZED:
api.SendMessage(hwnd, sc.BFFM_SETSELECTION, True, default_dir.path)
else:
callback = None
(idl, name, images) = sh.SHBrowseForFolder(None, None,
win_fix_prompt(prompt), win_bif_flags, callback)
if idl:
return DirRef(sh.SHGetPathFromIDList(idl))
def _request_old_dirs(prompt, default_dir):
raise NotImplementedError("Requesting multiple directories")
def _request_old(prompt, default_dir, file_types, dir, multiple):
if dir:
if multiple:
return _request_old_dirs(prompt, default_dir)
else:
return _request_old_dir(prompt, default_dir)
else:
return _request_old_file(prompt, default_dir, file_types, multiple)
def _request_new(prompt, default_dir, default_name, file_type, dir):
if file_type:
filter = win_filter([file_type])
else:
filter = "" # None
dlog = ui.CreateFileDialog(False, None, default_name, win_ofn_flags, filter)
win_set_prompt(dlog, prompt)
if default_dir:
dlog.SetOFNInitialDir(default_dir.path)
code = dlog.DoModal()
if code == 1: # IDOK
return fileref(dlog.GetPathName(), file_type)