Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make it works with Gedit 3.16.3 #10

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
189 changes: 99 additions & 90 deletions plugins/markdown-preview/markdown-preview/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

from gi.repository import Gdk, Gtk, Gedit, GObject, WebKit

###########
# IMPORTS #
###########
from gi.repository import Gio, Gdk, Gtk, Gedit, GObject, WebKit, GLib
import codecs
import os
import sys
Expand All @@ -27,6 +31,12 @@
from configparser import SafeConfigParser
import webbrowser


##################
# INITIALIZATION #
##################

# Internationalization
try:
appName = "markdown-preview"
fileDir = os.path.dirname(__file__)
Expand All @@ -39,15 +49,15 @@
# Can be used to add default HTML code (e.g. default header section with CSS).
htmlTemplate = "%s"

# Configuration.

# Default configuration.
markdownExternalBrowser = "0"
markdownPanel = "bottom"
markdownShortcut = "<Control><Alt>m"
markdownVersion = "extra"
markdownVisibility = "1"
markdownVisibilityShortcut = "<Control><Alt>v"

# Load confguration from file
try:
import xdg.BaseDirectory
except ImportError:
Expand Down Expand Up @@ -84,95 +94,124 @@
with open(confFile, "w") as confFile:
parser.write(confFile)

class MarkdownPreviewPlugin(GObject.Object, Gedit.WindowActivatable):
__gtype_name__ = "MarkdownPreviewPlugin"
#################################
# MarkdownPreviewAppActivatable #
#################################

class MarkdownPreviewAppActivatable(GObject.Object, Gedit.AppActivatable):
app = GObject.property(type=Gedit.App)

def __init__(self):
GObject.Object.__init__(self)

def do_activate(self):
markdownPrevItem = Gio.MenuItem.new(_("Update Markdown Preview"), "win.MarkdownPreview")
toggleTabItem = Gio.MenuItem.new(_("Toggle Markdown Preview visibility"), "win.ToggleTab")

self.menu_ext = self.extend_menu("tools-section")

self.menu_ext.prepend_menu_item(markdownPrevItem)
self.menu_ext.prepend_menu_item(toggleTabItem)

self.app.add_accelerator(markdownShortcut, "win.MarkdownPreview", None);
self.app.add_accelerator(markdownVisibilityShortcut, "win.ToggleTab", None);

def do_deactivate(self):
self.menu_ext = None

####################################
# MarkdownPreviewWindowActivatable #
####################################

class MarkdownPreviewWindowActivatable(GObject.Object, Gedit.WindowActivatable):
window = GObject.property(type=Gedit.Window)
markdownPrevAction = None
toogleTabAction = None
currentUri = ""
overLinkUrl = ""

def __init__(self):
GObject.Object.__init__(self)

def do_activate(self):
self.markdownPrevAction = Gio.SimpleAction.new("MarkdownPreview",None)
self.toggleTabAction = Gio.SimpleAction.new_stateful("ToggleTab",None, GLib.Variant.new_boolean(markdownVisibility != 0))

self.markdownPrevAction.connect('activate', lambda x, y: self.updatePreview(y, False))
self.toggleTabAction.connect('change-state', self.toggleTab)

self.window.add_action(self.markdownPrevAction)
self.window.add_action(self.toggleTabAction)

self.scrolledWindow = Gtk.ScrolledWindow()
self.scrolledWindow.set_property("hscrollbar-policy", Gtk.PolicyType.AUTOMATIC)
self.scrolledWindow.set_property("vscrollbar-policy", Gtk.PolicyType.AUTOMATIC)
self.scrolledWindow.set_property("shadow-type", Gtk.ShadowType.IN)

self.htmlView = WebKit.WebView()
self.htmlView.connect("hovering-over-link", self.onHoveringOverLinkCb)
self.htmlView.connect("navigation-policy-decision-requested",
self.onNavigationPolicyDecisionRequestedCb)
self.htmlView.connect("populate-popup", self.onPopulatePopupCb)

self.htmlView.load_string((htmlTemplate % ("", )), "text/html", "utf-8", "file:///")

self.scrolledWindow.add(self.htmlView)
self.scrolledWindow.show_all()

if markdownVisibility == "1":
self.addMarkdownPreviewTab()

self.addMenuItems()


def do_deactivate(self):
# Remove menu items.
manager = self.window.get_ui_manager()
manager.remove_ui(self.uiId)
manager.remove_action_group(self.actionGroup1)
manager.remove_action_group(self.actionGroup2)
self.window.remove_action("MarkdownPreview")
self.window.remove_action("ToggleTab")
self.markdownPrevAction = None
self.toggleTabAction = None

# Remove Markdown Preview from the panel.
self.removeMarkdownPreviewTab()

def do_update_state(self):
self.actionGroup1.set_sensitive(self.window.get_active_document() != None)
if self.markdownPrevAction is not None:
self.markdownPrevAction.set_enabled(self.window.get_active_document() is not None)
if self.toggleTabAction is not None:
self.toggleTabAction.set_enabled(self.window.get_active_document() is not None)

def addMarkdownPreviewTab(self):
if markdownPanel == "side":
panel = self.window.get_side_panel()
stack = self.window.get_side_panel()
else:
panel = self.window.get_bottom_panel()

image = Gtk.Image()
image.set_from_icon_name("gnome-mime-text-html", Gtk.IconSize.MENU)
stack = self.window.get_bottom_panel()

stack.connect("hide",self.onStackClose);
stack.add_titled(self.scrolledWindow, "MarkdownPreview", _("Markdown Preview"))
stack.show()
stack.set_visible_child(self.scrolledWindow)

def removeMarkdownPreviewTab(self):
if markdownPanel == "side":
stack = self.window.get_side_panel()
else:
stack = self.window.get_bottom_panel()

panel.add_item(self.scrolledWindow, "MarkdownPreview", _("Markdown Preview"), image)
panel.show()
panel.activate_item(self.scrolledWindow)

def addMenuItems(self):
manager = self.window.get_ui_manager()

self.actionGroup1 = Gtk.ActionGroup("UpdateMarkdownPreview")
action = ("MarkdownPreview",
None,
_("Update Markdown Preview"),
markdownShortcut,
_("Preview in HTML of the current document or the selection"),
lambda x, y: self.updatePreview(y, False))
self.actionGroup1.add_actions([action], self.window)
manager.insert_action_group(self.actionGroup1, -1)

self.actionGroup2 = Gtk.ActionGroup("ToggleTab")
action = ("ToggleTab",
None,
_("Toggle Markdown Preview visibility"),
markdownVisibilityShortcut,
_("Display or hide the Markdown Preview panel tab"),
lambda x, y: self.toggleTab())
self.actionGroup2.add_actions([action], self.window)
manager.insert_action_group(self.actionGroup2, -1)

self.uiId = manager.new_merge_id()

manager.add_ui(self.uiId, "/MenuBar/ToolsMenu/ToolsOps_4",
"MarkdownPreview", "MarkdownPreview",
Gtk.UIManagerItemType.MENUITEM, True)

manager.add_ui(self.uiId, "/MenuBar/ToolsMenu/ToolsOps_4",
"ToggleTab", "ToggleTab",
Gtk.UIManagerItemType.MENUITEM, False)
stack.remove(self.scrolledWindow)

def onStackClose(self, nothing):
if self.toggleTabAction is not None:
self.toggleTabAction.set_state(GLib.Variant.new_boolean(False))

def toggleTab(self, action, state):
action.set_state(state)

if markdownPanel == "side":
stack = self.window.get_side_panel()
else:
stack = self.window.get_bottom_panel()

if not state:
stack.hide()
else:
stack.show()

def copyCurrentUrl(self):
self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
self.clipboard.set_text(self.currentUri, -1)
Expand Down Expand Up @@ -341,25 +380,6 @@ def onPopulatePopupCb(self, view, menu):

menu.show_all()

def removeMarkdownPreviewTab(self):
if markdownPanel == "side":
panel = self.window.get_side_panel()
else:
panel = self.window.get_bottom_panel()

panel.remove_item(self.scrolledWindow)

def toggleTab(self):
if markdownPanel == "side":
panel = self.window.get_side_panel()
else:
panel = self.window.get_bottom_panel()

if panel.activate_item(self.scrolledWindow):
self.removeMarkdownPreviewTab()
else:
self.addMarkdownPreviewTab()

def updatePreview(self, window, clear):
view = self.window.get_active_view()

Expand Down Expand Up @@ -391,17 +411,6 @@ def updatePreview(self, window, clear):
htmlDoc.load_string(html, "text/html", "utf-8", "file:///")

self.scrolledWindow.set_placement(placement)

if markdownPanel == "side":
panel = self.window.get_side_panel()
else:
panel = self.window.get_bottom_panel()

panel.show()

if not panel.activate_item(self.scrolledWindow):
self.addMarkdownPreviewTab()
panel.activate_item(self.scrolledWindow)

def urlTooltipVisible(self):
if hasattr(self, "urlTooltip") and self.urlTooltip.get_property("visible"):
Expand Down