| ... | ... |
@@ -133,6 +133,7 @@ class DotWidget(Gtk.DrawingArea): |
| 133 | 133 |
# By default DOT language is UTF-8, but it accepts other encodings |
| 134 | 134 |
assert isinstance(dotcode, bytes) |
| 135 | 135 |
xdotcode = self.run_filter(dotcode) |
| 136 |
+ |
|
| 136 | 137 |
if xdotcode is None: |
| 137 | 138 |
return False |
| 138 | 139 |
try: |
| ... | ... |
@@ -155,6 +156,7 @@ class DotWidget(Gtk.DrawingArea): |
| 155 | 156 |
|
| 156 | 157 |
def set_xdotcode(self, xdotcode, center=True): |
| 157 | 158 |
assert isinstance(xdotcode, bytes) |
| 159 |
+ |
|
| 158 | 160 |
if self.graphviz_version is None: |
| 159 | 161 |
stdout = subprocess.check_output([self.filter, '-V'], stderr=subprocess.STDOUT) |
| 160 | 162 |
stdout = stdout.rstrip() |
| ... | ... |
@@ -537,6 +539,7 @@ class DotWindow(Gtk.Window): |
| 537 | 539 |
<ui> |
| 538 | 540 |
<toolbar name="ToolBar"> |
| 539 | 541 |
<toolitem action="Open"/> |
| 542 |
+ <toolitem action="Export"/> |
|
| 540 | 543 |
<toolitem action="Reload"/> |
| 541 | 544 |
<toolitem action="Print"/> |
| 542 | 545 |
<separator/> |
| ... | ... |
@@ -590,6 +593,7 @@ class DotWindow(Gtk.Window): |
| 590 | 593 |
# Create actions |
| 591 | 594 |
actiongroup.add_actions(( |
| 592 | 595 |
('Open', Gtk.STOCK_OPEN, None, None, None, self.on_open),
|
| 596 |
+ ('Export', Gtk.STOCK_SAVE_AS, None, None, "Save graph as picture.", self.on_export),
|
|
| 593 | 597 |
('Reload', Gtk.STOCK_REFRESH, None, None, None, self.on_reload),
|
| 594 | 598 |
('Print', Gtk.STOCK_PRINT, None, None,
|
| 595 | 599 |
"Prints the currently visible part of the graph", self.dotwidget.on_print), |
| ... | ... |
@@ -749,6 +753,55 @@ class DotWindow(Gtk.Window): |
| 749 | 753 |
self.open_file(filename) |
| 750 | 754 |
else: |
| 751 | 755 |
chooser.destroy() |
| 756 |
+ |
|
| 757 |
+ def export_file(self, filename, format_): |
|
| 758 |
+ if not filename.endswith("." + format_):
|
|
| 759 |
+ filename += '.' + format_ |
|
| 760 |
+ cmd = [ |
|
| 761 |
+ self.dotwidget.filter, # program name, usually "dot" |
|
| 762 |
+ '-T' + format_, |
|
| 763 |
+ '-o', filename, |
|
| 764 |
+ self.dotwidget.openfilename, |
|
| 765 |
+ ] |
|
| 766 |
+ subprocess.check_call(cmd) |
|
| 767 |
+ |
|
| 768 |
+ def on_export(self, action): |
|
| 769 |
+ output_formats = {
|
|
| 770 |
+ "PNG image": "png", |
|
| 771 |
+ "SVG image": "svg", |
|
| 772 |
+ "PDF image": "pdf", |
|
| 773 |
+ "GIF image": "gif", |
|
| 774 |
+ "PDF image": "pdf", |
|
| 775 |
+ } |
|
| 776 |
+ buttons = ( |
|
| 777 |
+ Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, |
|
| 778 |
+ Gtk.STOCK_SAVE, Gtk.ResponseType.OK) |
|
| 779 |
+ chooser = Gtk.FileChooserDialog( |
|
| 780 |
+ parent=self, |
|
| 781 |
+ title="Export to other file format.", |
|
| 782 |
+ action=Gtk.FileChooserAction.SAVE, |
|
| 783 |
+ buttons=buttons) |
|
| 784 |
+ chooser.set_default_response(Gtk.ResponseType.OK) |
|
| 785 |
+ chooser.set_current_folder(self.last_open_dir) |
|
| 786 |
+ |
|
| 787 |
+ openfilename = os.path.basename(self.dotwidget.openfilename) |
|
| 788 |
+ openfileroot = os.path.splitext(openfilename)[0] |
|
| 789 |
+ chooser.set_current_name(openfileroot) |
|
| 790 |
+ |
|
| 791 |
+ for name, ext in output_formats.items(): |
|
| 792 |
+ filter_ = Gtk.FileFilter() |
|
| 793 |
+ filter_.set_name(name) |
|
| 794 |
+ filter_.add_pattern('*.' + ext)
|
|
| 795 |
+ chooser.add_filter(filter_) |
|
| 796 |
+ |
|
| 797 |
+ if chooser.run() == Gtk.ResponseType.OK: |
|
| 798 |
+ filename = chooser.get_filename() |
|
| 799 |
+ format_ = output_formats[chooser.get_filter().get_name()] |
|
| 800 |
+ chooser.destroy() |
|
| 801 |
+ self.export_file(filename, format_) |
|
| 802 |
+ else: |
|
| 803 |
+ chooser.destroy() |
|
| 804 |
+ |
|
| 752 | 805 |
|
| 753 | 806 |
def on_reload(self, action): |
| 754 | 807 |
self.dotwidget.reload() |