2 from functools
import reduce
3 from PyQt5
import QtCore, QtWidgets, QtGui
4 from PyQt5.QtCore
import Qt
6 from ..exporters.base
import exporters
7 from ..importers.base
import importers
8 from ..parsers.baseporter
import IoProgressReporter, ExtraOption
15 self.
locklock = threading.Lock()
20 IoProgressReporter.instance = cls()
25 dialog = QtWidgets.QProgressDialog(parent)
26 dialog.setCancelButton(
None)
27 dialog.setWindowModality(Qt.ApplicationModal)
33 id = threading.current_thread().ident
38 tid = threading.current_thread().ident
40 dialog = self.
dialogsdialogs[id]
42 dialog.setWindowTitle(title)
48 dialog.setValue(value)
49 dialog.setMaximum(total)
50 dialog.setLabelText(title)
56 dialog.setLabelText(message)
60 id = threading.current_thread().ident
69 self.
file_filterfile_filter =
"%s (%s)" % (porter.name,
" ".join(
"*.%s" % e
for e
in porter.extensions))
73 def _build_dialog(self):
74 self.
_dialog_dialog = QtWidgets.QDialog()
75 self.
_dialog_dialog.setWindowTitle(
"Export to %s" % self.
porterporter.name)
76 layout = QtWidgets.QFormLayout()
77 self.
_dialog_dialog.setLayout(layout)
79 for go
in self.
porterporter.generic_options:
82 for option
in self.
porterporter.extra_options:
85 button_box = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
86 button_box.accepted.connect(self.
_dialog_dialog.accept)
87 button_box.rejected.connect(self.
_dialog_dialog.reject)
88 layout.addRow(button_box)
90 def _add_option(self, layout, option: ExtraOption):
91 if option.dest
in self.
widgetswidgets:
93 label = QtWidgets.QLabel(option.name.replace(
"_",
" ").title())
95 default = option.kwargs.get(
"default",
None)
96 option_type = option.kwargs.get(
"type", str)
98 if option.kwargs.get(
"action") ==
"store_true":
99 widget = QtWidgets.QCheckBox()
100 widget.setChecked(
False)
101 getter = widget.isChecked
102 elif option.kwargs.get(
"action") ==
"store_false":
103 widget = QtWidgets.QCheckBox()
104 labtext = label.text()
105 if labtext.startswith(
"No "):
106 label.setText(labtext[3:])
107 widget.setChecked(
True)
108 getter = widget.isChecked
109 elif "choices" in option.kwargs:
110 widget = QtWidgets.QComboBox()
111 for choice
in option.kwargs[
"choices"]:
112 widget.addItem(
str(choice))
114 widget.setCurrentText(
str(default))
115 getter =
lambda: option_type(widget.currentText())
116 elif option_type
is int:
117 widget = QtWidgets.QSpinBox()
118 widget.setMinimum(-1000)
119 widget.setMaximum(1000)
120 if default
is not None:
121 widget.setValue(
int(default))
122 getter = widget.value
124 widget = QtWidgets.QLineEdit()
125 if default
is not None:
126 widget.setText(
str(default))
129 help = option.kwargs.get(
"help",
"")
130 widget.setWhatsThis(help)
131 widget.setToolTip(help)
133 widget.setObjectName(option.dest)
134 self.
widgetswidgets[option.dest] = getter
135 layout.addRow(label, widget)
139 return self.
porterporter.generic_options
or self.
porterporter.extra_options
150 for name, getter
in self.
widgetswidgets.items()
155 self.
dialogdialog.setParent(parent)
156 self.
dialogdialog.setWindowFlags(Qt.Dialog)
157 if self.
dialogdialog.exec_() != QtWidgets.QDialog.DialogCode.Accepted:
162 def _generic_option(self, layout, go):
166 class GuiExporter(GuiBasePorter):
167 def _generic_option(self, layout, go):
169 self._add_option(layout, ExtraOption(
"pretty", action=
"store_true", help=
"Pretty print"))
171 self._add_option(layout, ExtraOption(
"frame", type=int, help=
"Frame to extract"))
185 def __init__(self, parent, exporter, animation, file_name, options):
187 self.
idid = IoProgressReporter.instance.gen_id(parent)
194 IoProgressReporter.instance.setup(
"Export to %s" % self.
exporterexporter.name, self.
idid)
198 IoProgressReporter.instance.report_message(
"Error on export")
199 IoProgressReporter.instance.cleanup()
202 gui_exporters = list(map(GuiExporter, exporters))
203 gui_importers = list(map(GuiImporter, importers))
207 extensions = reduce(
lambda a, b: a | b, (set(gi.importer.extensions)
for gi
in gui_importers))
208 all_files =
"All Supported Files (%s)" %
" ".join(
"*.%s" % ex
for ex
in extensions)
209 filters = all_files +
";;" +
";;".join(ge.file_filter
for ge
in gui_importers)
210 file_name, filter = QtWidgets.QFileDialog.getOpenFileName(
211 parent, title, dirname, filters
214 if filter == all_files:
217 return file_name, importer
219 for importer
in gui_importers:
220 if importer.file_filter == filter:
221 return file_name, importer
227 extensions = reduce(
lambda a, b: a | b, (set(gi.exporter.extensions)
for gi
in gui_exporters))
228 all_files =
"All Supported Files (%s)" %
" ".join(
"*.%s" % ex
for ex
in extensions)
229 filters = all_files +
";;" +
";;".join(ge.file_filter
for ge
in gui_exporters)
230 file_name, filter = QtWidgets.QFileDialog.getSaveFileName(
231 parent, title, dirname, filters
235 if filter == all_files:
238 return file_name, exporter
240 for exporter
in gui_exporters:
241 if exporter.file_filter == filter:
242 return file_name, exporter
248 thread =
ExportThread(parent, exporter, animation, file_name, options)
254 importer = importers.get_from_filename(filename)
255 for gip
in gui_importers:
256 if gip.importer
is importer:
262 exporter = exporters.get_from_filename(filename)
263 for gip
in gui_exporters:
264 if gip.exporter
is exporter:
def __init__(self, parent, exporter, animation, file_name, options)
def _generic_option(self, layout, go)
def _add_option(self, layout, ExtraOption option)
def prompt_options(self, parent)
def __init__(self, porter)
def get_thread_dialog(self)
def setup(self, title, id)
def report_message(self, message)
def report_progress(self, title, value, total)
def gui_importer_from_filename(filename)
def get_save_filename(parent, title, dirname)
def start_export(parent, exporter, animation, file_name, options)
def get_open_filename(parent, title, dirname)
def gui_exporter_from_filename(filename)