96 lines
3.1 KiB
Python
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)
|