diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-08-16 21:15:32 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-08-16 21:15:32 (GMT) |
commit | 7b90c29f1fd7f685d883ef6c0be75c46ec495a34 (patch) | |
tree | c3153997dcf19f9cdb03cd36714f1b2da13033d1 /plugins/python/scripting | |
parent | f67cbb09ba8421b70a9a65d4192d164279be71b8 (diff) |
Extended the File menu to run external Python scripts on demand.
Diffstat (limited to 'plugins/python/scripting')
-rw-r--r-- | plugins/python/scripting/Makefile.am | 8 | ||||
-rw-r--r-- | plugins/python/scripting/__init__.py | 2 | ||||
-rw-r--r-- | plugins/python/scripting/core.py | 101 |
3 files changed, 111 insertions, 0 deletions
diff --git a/plugins/python/scripting/Makefile.am b/plugins/python/scripting/Makefile.am new file mode 100644 index 0000000..5d38d6e --- /dev/null +++ b/plugins/python/scripting/Makefile.am @@ -0,0 +1,8 @@ + +scriptingdir = $(pluginsdatadir)/python/scripting + +scripting_DATA = \ + __init__.py \ + core.py + +EXTRA_DIST = $(scripting_DATA) diff --git a/plugins/python/scripting/__init__.py b/plugins/python/scripting/__init__.py new file mode 100644 index 0000000..82accc0 --- /dev/null +++ b/plugins/python/scripting/__init__.py @@ -0,0 +1,2 @@ + +from scripting.core import ScriptingEngine as AutoLoad diff --git a/plugins/python/scripting/core.py b/plugins/python/scripting/core.py new file mode 100644 index 0000000..7aff551 --- /dev/null +++ b/plugins/python/scripting/core.py @@ -0,0 +1,101 @@ + +from gi.repository import Gtk + +from pychrysalide import PluginModule +from pychrysalide import core +from pychrysalide.gui import core as gcore +from pychrysalide.gtkext import EasyGtk + + +class ScriptingEngine(PluginModule): + """Extend the GUI to run external Python scripts.""" + + _name = 'ScriptingEngine' + _desc = 'Run external Python scripts on demand' + _version = '0.1' + _url = 'https://www.chrysalide.re/' + + _actions = ( ) + + + def __init__(self): + """Initialize the plugin for Chrysalide.""" + + super(ScriptingEngine, self).__init__() + + # Insert the new menu item into 'File' submenu + + bar = gcore.find_editor_item_by_key('menubar') + + builder = gcore.get_editor_builder() + + file_menu = builder.get_object('file').get_submenu() + sep_item = builder.get_object('file_sep_1') + save_item = builder.get_object('file_save_project') + + index = EasyGtk.find_contained_child_index(file_menu, save_item) + + if index == -1: + raise RuntimeError('file menu not found') + + prev = EasyGtk.get_nth_contained_child(file_menu, index - 1) + + if sep_item == prev: + + sep = Gtk.SeparatorMenuItem() + sep.show() + + file_menu.insert(sep, index) + + item = Gtk.MenuItem(label='Run Python script...') + item.connect("activate", self._on_file_run_script_activate) + item.show() + + file_menu.insert(item, index) + + + def _on_file_run_script_activate(self, widget): + """Look for a new script to run.""" + + dialog = Gtk.FileChooserDialog(title='Please choose a Python script to execute', + transient_for=gcore.get_editor_window(), + action=Gtk.FileChooserAction.OPEN) + + dialog.add_buttons(Gtk.STOCK_CANCEL, + Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, + Gtk.ResponseType.OK) + + ffilter = Gtk.FileFilter() + ffilter.set_name('Python files') + ffilter.add_mime_type('text/x-python') + dialog.add_filter(ffilter) + + response = dialog.run() + + if response == Gtk.ResponseType.OK: + filename = dialog.get_filename() + else: + filename = None + + dialog.destroy() + + if filename: + self._run_script_file(filename) + + + def _run_script_file(self, filename): + """Run a given script file.""" + + core.log_message(core.LogMessageType.INFO, 'Execute the script file \'%s\'' % filename) + + try: + with open(filename, 'r') as fd: + content = fd.read() + + code = compile(content, '<string>', 'exec') + + eval(code) + + except Exception as e: + core.log_message(core.LogMessageType.EXT_ERROR, 'Error while running the script: %s' % str(e)) |