From 7f7dcd6ba89a77f09a4b1a18c6e84685b337a1bb Mon Sep 17 00:00:00 2001 From: Mathieu PATUREL Date: Thu, 14 Nov 2019 11:18:18 +1100 Subject: [PATCH] Restore the markdown_view as an original_view See the top of MarkdownLivePreview.py for terminology Doesn't work well for unsaved files, as pre_close is triggered after the confirmation dialog --- MarkdownLivePreview.py | 75 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/MarkdownLivePreview.py b/MarkdownLivePreview.py index 1e28f1c..1fac793 100644 --- a/MarkdownLivePreview.py +++ b/MarkdownLivePreview.py @@ -6,6 +6,14 @@ from .utils import * def plugin_loaded(): pass +SETTING_MDLP = "markdown_live_preview" + +# original_view: the view in the regular editor, without it's own window +# markdown_view: the markdown view, in the special window +# preview_view: the preview view, in the special window +# original_window: the regular window +# preview_window: the window with the markdown file and the preview + class MdlpInsertCommand(sublime_plugin.TextCommand): def run(self, edit, point, string): @@ -20,10 +28,12 @@ class OpenMarkdownPreviewCommand(sublime_plugin.TextCommand): a dialog) and re-insert it into a new view into a new window """ original_view = self.view + original_window_id = original_view.window().id() file_name = original_view.file_name() syntax_file = original_view.settings().get('syntax') + if file_name is None: # the file isn't saved, we need to restore the content manually @@ -39,22 +49,25 @@ class OpenMarkdownPreviewCommand(sublime_plugin.TextCommand): original_view.close() sublime.run_command('new_window') - window = sublime.active_window() + preview_window = sublime.active_window() - window.run_command('set_layout', { + preview_window.run_command('set_layout', { 'cols': [0.0, 0.5, 1.0], 'rows': [0.0, 1.0], 'cells': [[0, 0, 1, 1], [1, 0, 2, 1]] }) - window.focus_group(0) + preview_window.focus_group(0) if file_name: - new_view = window.open_file(file_name) + markdown_view = preview_window.open_file(file_name) else: - new_view = window.new_file() - new_view.run_command('mdlp_insert', {'point': 0, 'string': content}) + markdown_view = preview_window.new_file() + markdown_view.run_command('mdlp_insert', {'point': 0, 'string': content}) - new_view.set_syntax_file(syntax_file) + markdown_view.set_syntax_file(syntax_file) + markdown_view.settings().set(SETTING_MDLP, { + "original_window_id": original_window_id + }) def is_enabled(self): # FIXME: is this the best way there is to check if the current syntax is markdown? @@ -62,3 +75,51 @@ class OpenMarkdownPreviewCommand(sublime_plugin.TextCommand): # what about "md"? return 'markdown' in self.view.settings().get('syntax').lower() +class MarkdownLivePreviewListener(sublime_plugin.EventListener): + + def on_pre_close(self, markdown_view): + """ Close the view in the preview window, and store information for the on_close + listener (see doc there) + """ + print('pre close') + + if not markdown_view.settings().get(SETTING_MDLP): + return + + self.markdown_view = markdown_view + self.preview_window = markdown_view.window() + self.file_name = markdown_view.file_name() + + if self.file_name is None: + # FIXME: this is duplicated code. How should it be generalized? + total_region = sublime.Region(0, markdown_view.size()) + self.content = markdown_view.substr(total_region) + markdown_view.erase(edit, total_region) + else: + self.content = None + + def on_close(self, markdown_view): + """ Use the information saved to restore the markdown_view as an original_view + """ + infos = markdown_view.settings().get(SETTING_MDLP) + if not infos: + return + + assert markdown_view.id() == self.markdown_view.id(), \ + "pre_close view.id() != close view.id()" + + self.preview_window.run_command('close_window') + + # find the window with the right id + original_window = next(window for window in sublime.windows() \ + if window.id() == infos['original_window_id']) + print(original_window.id(), self.preview_window.id(), infos) + if self.file_name: + original_window.open_file(self.file_name) + else: + # note here that this is called original_view, because it's what semantically + # makes sense, but this original_view.id() will be different than the one + # that we closed first to reopen in the preview window + # shouldn't cause any trouble though + original_view = original_window.new_file() + original_view.run_command('mdlp_insert', {'point': 0, 'string': self.content})