from typing import List, Optional
import os
import subprocess
__VIDEO_PATTERNS__ = ["*.mp4", "*.avi", "*.mov", "*.mpv", "*.mkv"]
__DESIGN_PATTERNS__ = ["*.svg"]
[docs]def has_zenity():
try:
with open(os.devnull, 'w') as null:
return not subprocess.check_call(
['zenity', '--version'], stdout=null
)
except FileNotFoundError:
return False
[docs]def load_file_dialog(title: str = None, patterns: List[str] = None, patterns_str: str = '') -> Optional[str]:
if title is None:
title = 'Load...'
if patterns is None:
patterns = []
if has_zenity():
try:
if len(patterns) > 0:
p = subprocess.Popen(
[
'zenity', '--file-selection',
'--file-filter', ' '.join(patterns),
], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
else:
p = subprocess.Popen(
[
'zenity', '--file-selection',
], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
out, err = p.communicate()
if out:
return out.rstrip().decode('utf-8')
else:
return None
except subprocess.CalledProcessError:
return None
else:
try:
if len(patterns) > 0:
p = subprocess.Popen(
[
'python', 'isimple/util/tk_filedialog.py',
'--load', '--title', title,
'--filetypes', ' '.join(patterns),
'--filedesc', patterns_str,
], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
else:
p = subprocess.Popen(
[
'python', 'isimple/util/tk_filedialog.py',
'--load', '--title', title,
], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
out, err = p.communicate()
if out:
return out.rstrip().decode('utf-8')
else:
return None
except subprocess.CalledProcessError:
return None
[docs]def save_file_dialog(title: str = None, patterns: List[str] = None, patterns_str: str = '') -> Optional[str]:
if title is None:
title = 'Save as...'
if patterns is None:
patterns = []
if has_zenity():
try:
if len(patterns) > 0:
p = subprocess.Popen(
[
'zenity', '--file-selection', '--save'
f'--file-filter', ' '.join(patterns),
], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
else:
p = subprocess.Popen(
[
'zenity', '--file-selection', '--save'
], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
out, err = p.communicate()
if out:
return out.strip().decode('utf-8')
else:
return None
except subprocess.CalledProcessError:
return None
else:
try:
if len(patterns) > 0:
p = subprocess.Popen(
[
'python', 'isimple/util/tk_filedialog.py',
'--save', '--title', title,
'--filetypes', ' '.join(patterns),
'--filedesc', patterns_str,
], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
else:
p = subprocess.Popen(
[
'python', 'isimple/util/tk_filedialog.py',
'--save', '--title', title,
], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
out, err = p.communicate()
if out:
return out.rstrip().decode('utf-8')
else:
return None
except subprocess.CalledProcessError:
return None
[docs]def select_video() -> Optional[str]:
return load_file_dialog(
"Select video file...",
patterns=__VIDEO_PATTERNS__
)
[docs]def select_design() -> Optional[str]:
return load_file_dialog(
"Select design file...",
patterns=__DESIGN_PATTERNS__
)