make new export dialogs actually work

ui
Manuel Genoves 2020-03-11 02:54:56 +01:00
parent ef04a90fd7
commit 7a8d3a8459
3 changed files with 47 additions and 69 deletions

View File

@ -500,6 +500,9 @@
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<style>
<class name="linked"/>
</style>
</object> </object>
<packing> <packing>
<property name="left_attach">0</property> <property name="left_attach">0</property>
@ -510,10 +513,15 @@
<object class="GtkDialog" id="Export"> <object class="GtkDialog" id="Export">
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="type_hint">dialog</property> <property name="type_hint">dialog</property>
<action-widgets>
<action-widget response="cancel">cancel_btn</action-widget>
<action-widget response="accept" default="true">export_btn</action-widget>
</action-widgets>
<child type="titlebar"> <child type="titlebar">
<object class="GtkHeaderBar" id="Export_hb"> <object class="GtkHeaderBar" id="Export_hb">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="has_subtitle">False</property>
<child> <child>
<object class="GtkButton" id="cancel_btn"> <object class="GtkButton" id="cancel_btn">
<property name="label">gtk-cancel</property> <property name="label">gtk-cancel</property>
@ -526,12 +534,6 @@
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child type="title">
<object class="GtkStackSwitcher" id="format_switcher">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child> <child>
<object class="GtkButton" id="export_btn"> <object class="GtkButton" id="export_btn">
<property name="label" translatable="yes">Export</property> <property name="label" translatable="yes">Export</property>
@ -566,6 +568,8 @@
<object class="GtkFileChooserWidget" id="advanced"> <object class="GtkFileChooserWidget" id="advanced">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="action">select-folder</property>
<property name="do_overwrite_confirmation">True</property>
<property name="extra_widget">advanced_export_options</property> <property name="extra_widget">advanced_export_options</property>
</object> </object>
<packing> <packing>

View File

@ -24,7 +24,7 @@ from gettext import gettext as _
import gi import gi
gi.require_version('Gtk', '3.0') gi.require_version('Gtk', '3.0')
from gi.repository import Gtk from gi.repository import Gtk, GLib
from uberwriter import helpers from uberwriter import helpers
from uberwriter.theme import Theme 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""" """Set up the export dialog"""
self.export_menu = { self.export_menu = {
@ -186,41 +186,23 @@ class Export:
self.dialog = self.export_menu[export_format]["dialog"]() 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): def regular_export_dialog(self):
texlive_installed = helpers.exist_executable("pdftex") 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" + dialog.props.secondary_text = _("Seems that you don't have TexLive installed.\n" +
disabled_text()) disabled_text())
else: else:
dialog = Gtk.FileChooserNative.new(_("Export"), dialog = Gtk.FileChooserNative.new(_("Export"),
None, None,
@ -249,19 +230,18 @@ class Export:
dialog.add_filter(dialog_filter) dialog.add_filter(dialog_filter)
dialog.set_do_overwrite_confirmation(True) dialog.set_do_overwrite_confirmation(True)
dialog.set_current_folder(os.path.dirname(self.filename)) dialog.set_current_folder(os.path.dirname(self.filename))
dialog.set_current_name("%s.%s" % (os.path.basename(self.filename)[:-2], dialog.set_current_name(os.path.basename(self.filename)[:-2] +
self.export_menu[self.export_format]["extension"])) self.export_menu[self.export_format]["extension"])
return dialog return dialog
def advanced_export_dialog(self): def advanced_export_dialog(self):
self.builder = Gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_resource( self.builder.add_from_resource(
"/de/wolfvollprecht/UberWriter/ui/Export.ui") "/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("highlight_style").set_active(0)
self.builder.get_object("css_filechooser").set_uri( self.builder.get_object("css_filechooser").set_uri(
helpers.path_to_file(Theme.get_current().web_css_path)) 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.add_attribute(format_renderer, "text", 1)
self.format_field.set_active(0) 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. """Export the given text using the specified format.
For advanced export, this includes special flags for the enabled options. For advanced export, this includes special flags for the enabled options.
@ -285,11 +271,16 @@ class Export:
text {str} -- Text to export (default: {""}) text {str} -- Text to export (default: {""})
""" """
export_type = self.stack.get_visible_child_name()
args = [] args = []
if export_type == "advanced": if export_type == "advanced":
filename = self.adv_export_name.get_text() 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) basename = os.path.basename(filename)
fmt = self.formats[self.format_field.get_active()] fmt = self.formats[self.format_field.get_active()]
@ -304,7 +295,7 @@ class Export:
args.extend(self.get_advanced_arguments()) args.extend(self.get_advanced_arguments())
else: else:
filename = self.filechoosers[export_type].get_filename() filename = self.dialog.get_filename()
if filename.endswith("." + export_type): if filename.endswith("." + export_type):
filename = filename[:-len(export_type)-1] filename = filename[:-len(export_type)-1]
output_dir = os.path.abspath(os.path.join(filename, os.path.pardir)) output_dir = os.path.abspath(os.path.join(filename, os.path.pardir))

View File

@ -547,26 +547,9 @@ class MainWindow(StyledWindow):
def open_advanced_export(self, export_format): def open_advanced_export(self, export_format):
"""open the export and advanced export dialog """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 = Export(self.filename, export_format, text)
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()
def open_recent(self, _widget, data=None): def open_recent(self, _widget, data=None):
"""open the given recent document """open the given recent document