diff --git a/data/ui/Export.ui b/data/ui/Export.ui index 2ad3ff2..11000f2 100644 --- a/data/ui/Export.ui +++ b/data/ui/Export.ui @@ -500,6 +500,9 @@ 1 + 0 @@ -510,10 +513,15 @@ False dialog + + cancel_btn + export_btn + True False + False gtk-cancel @@ -526,12 +534,6 @@ 1 - - - True - False - - Export @@ -566,6 +568,8 @@ True False + select-folder + True advanced_export_options diff --git a/uberwriter/export_dialog.py b/uberwriter/export_dialog.py index bda3e5c..df7b21d 100644 --- a/uberwriter/export_dialog.py +++ b/uberwriter/export_dialog.py @@ -24,7 +24,7 @@ from gettext import gettext as _ import gi gi.require_version('Gtk', '3.0') -from gi.repository import Gtk +from gi.repository import Gtk, GLib from uberwriter import helpers from uberwriter.theme import Theme @@ -147,7 +147,7 @@ class Export: } ] - def __init__(self, filename, export_format): + def __init__(self, filename, export_format, text): """Set up the export dialog""" self.export_menu = { @@ -186,41 +186,23 @@ class Export: self.dialog = self.export_menu[export_format]["dialog"]() + response = self.dialog.run() + + if response == Gtk.ResponseType.ACCEPT: + try: + self.export(export_format, text) + except (NotADirectoryError, Exception) as e: + dialog = Gtk.MessageDialog(None, + Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.CLOSE, + _("An error happened while trying to export:\n\n{err_msg}") + .format(err_msg= str(e).encode().decode("unicode-escape")) + ) + dialog.run() + dialog.destroy() - #filechooser.connect("response", self.__on_save_response) - #filechooser.run() - - - #self.stack = self.builder.get_object("export_stack") - #self.stack_switcher = self.builder.get_object("format_switcher") - - #stack_pdf_disabled = self.builder.get_object("pdf_disabled") - filename = filename or _("Untitled document.md") - - #self.filechoosers = {export_format: self.stack.get_child_by_name(export_format) - # for export_format in ["pdf", "html", "advanced"]} - #for export_format, filechooser in self.filechoosers.items(): - # filechooser.set_do_overwrite_confirmation(True) - # filechooser.set_current_folder(os.path.dirname(filename)) - # if export_format == "advanced": - # self.adv_export_name = self.builder.get_object("advanced_export_name") - # self.adv_export_name.set_text(os.path.basename(filename)[:-3]) - # else: - # filechooser.set_current_name(os.path.basename(filename)[:-2] + export_format) - - # Disable pdf if Texlive not installed - #texlive_installed = helpers.exist_executable("pdftex") - - #if not texlive_installed: - # self.filechoosers["pdf"].set_visible(False) - # stack_pdf_disabled.set_visible(True) - # stack_pdf_disabled.set_text(disabled_text()) - # stack_pdf_disabled.set_justify(Gtk.Justification.CENTER) - # self.stack.connect('notify', self.allow_export, 'visible_child_name') - - - def regular_export_dialog(self): texlive_installed = helpers.exist_executable("pdftex") @@ -235,7 +217,6 @@ class Export: dialog.props.secondary_text = _("Seems that you don't have TexLive installed.\n" + disabled_text()) - else: dialog = Gtk.FileChooserNative.new(_("Export"), None, @@ -249,19 +230,18 @@ class Export: dialog.add_filter(dialog_filter) dialog.set_do_overwrite_confirmation(True) dialog.set_current_folder(os.path.dirname(self.filename)) - dialog.set_current_name("%s.%s" % (os.path.basename(self.filename)[:-2], - self.export_menu[self.export_format]["extension"])) + dialog.set_current_name(os.path.basename(self.filename)[:-2] + + self.export_menu[self.export_format]["extension"]) return dialog def advanced_export_dialog(self): + self.builder = Gtk.Builder() self.builder.add_from_resource( "/de/wolfvollprecht/UberWriter/ui/Export.ui") - return self.builder.get_object("Export") self.builder.get_object("highlight_style").set_active(0) - self.builder.get_object("css_filechooser").set_uri( helpers.path_to_file(Theme.get_current().web_css_path)) @@ -276,8 +256,14 @@ class Export: self.format_field.add_attribute(format_renderer, "text", 1) self.format_field.set_active(0) + self.adv_export_folder = self.builder.get_object("advanced") - def export(self, text=""): + self.adv_export_name = self.builder.get_object("advanced_export_name") + self.adv_export_name.set_text(os.path.basename(self.filename)[:-3]) + + return self.builder.get_object("Export") + + def export(self, export_type, text=""): """Export the given text using the specified format. For advanced export, this includes special flags for the enabled options. @@ -285,11 +271,16 @@ class Export: text {str} -- Text to export (default: {""}) """ - export_type = self.stack.get_visible_child_name() args = [] if export_type == "advanced": filename = self.adv_export_name.get_text() - output_dir = os.path.abspath(self.filechoosers["advanced"].get_current_folder()) + + # TODO: use walrust operator + output_uri = self.adv_export_folder.get_uri() + if output_uri: + output_dir = GLib.filename_from_uri(output_uri)[0] + else: + raise NotADirectoryError(_("A folder must be selected before proceeding")) basename = os.path.basename(filename) fmt = self.formats[self.format_field.get_active()] @@ -304,7 +295,7 @@ class Export: args.extend(self.get_advanced_arguments()) else: - filename = self.filechoosers[export_type].get_filename() + filename = self.dialog.get_filename() if filename.endswith("." + export_type): filename = filename[:-len(export_type)-1] output_dir = os.path.abspath(os.path.join(filename, os.path.pardir)) diff --git a/uberwriter/main_window.py b/uberwriter/main_window.py index c5e3f14..0190155 100644 --- a/uberwriter/main_window.py +++ b/uberwriter/main_window.py @@ -547,26 +547,9 @@ class MainWindow(StyledWindow): def open_advanced_export(self, export_format): """open the export and advanced export dialog """ + text = bytes(self.text_view.get_text(), "utf-8") - self.export = Export(self.filename, export_format) - self.export.dialog.set_transient_for(self) - - response = self.export.dialog.run() - if response == 1: - try: - self.export.export(bytes(self.text_view.get_text(), "utf-8")) - except Exception as e: - dialog = Gtk.MessageDialog(self, - Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, - Gtk.MessageType.ERROR, - Gtk.ButtonsType.CLOSE, - _("An error happened while trying to export:\n\n{err_msg}") - .format(err_msg= str(e).encode().decode("unicode-escape")) - ) - dialog.run() - dialog.destroy() - - self.export.dialog.destroy() + self.export = Export(self.filename, export_format, text) def open_recent(self, _widget, data=None): """open the given recent document