diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-12-06 19:52:37 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-12-06 19:52:37 (GMT) |
commit | 9a76c53c8e8808c46aaa61914f625e29a7b6cc58 (patch) | |
tree | cb18e546b7cd352b1fdf563d9d452dccc45a4b34 /plugins/python/scripting/panel.py | |
parent | aa7cbdda718efd7ec41f0ce580847a0d0c31cfd3 (diff) |
Added a panel to display recently used Python scripts.
Diffstat (limited to 'plugins/python/scripting/panel.py')
-rw-r--r-- | plugins/python/scripting/panel.py | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/plugins/python/scripting/panel.py b/plugins/python/scripting/panel.py new file mode 100644 index 0000000..75b50e3 --- /dev/null +++ b/plugins/python/scripting/panel.py @@ -0,0 +1,140 @@ + +import os +from gi.repository import Gdk, GdkPixbuf, GLib, GObject +from pychrysalide.gtkext import BuiltNamedWidget +from pychrysalide.gui import core +from pychrysalide.gui import PanelItem + +from .manager import get_recent_python_script_manager, forget_python_script + + +class ScriptPanel(PanelItem): + + _key = 'pyscripting' + + _path = 'MEN' + _key_bindings = '<Shift>F5' + + + def __init__(self): + """Initialize the GUI panel.""" + + directory = os.path.dirname(os.path.realpath(__file__)) + filename = os.path.join(directory, 'panel.ui') + + widget = BuiltNamedWidget('Python scripts', 'Recently run Python scripts', filename) + + super(ScriptPanel, self).__init__(widget) + + if not('run-requested' in GObject.signal_list_names(ScriptPanel)): + + GObject.signal_new('run-requested', ScriptPanel, GObject.SignalFlags.RUN_FIRST, + GObject.TYPE_NONE, (GObject.TYPE_STRING, )) + + GObject.signal_new('ask-for-new-script', ScriptPanel, GObject.SignalFlags.RUN_FIRST, + GObject.TYPE_NONE, ()) + + self._last_selected = None + + builder = self.named_widget.builder + + icon_renderer = builder.get_object('icon_renderer') + icon_renderer.props.xpad = 8 + + builder.connect_signals(self) + + manager = get_recent_python_script_manager() + + if manager: + + manager.connect("changed", self._on_recent_list_changed) + + self._on_recent_list_changed(manager) + + + def _on_row_activated(self, treeview, path, column): + """React on a row activation.""" + + store = self.named_widget.builder.get_object('store') + + siter = store.get_iter(path) + + self.emit('run-requested', store[siter][3]) + + + def _on_selection_changed(self, selection): + """React on tree selection change.""" + + model, treeiter = selection.get_selected() + + if treeiter: + self._last_selected = model[treeiter][3] + else: + self._last_selected = None + + + def on_key_press_event(self, widget, event): + """React on a key press inside the tree view.""" + + if event.keyval == Gdk.KEY_Delete: + + selection = self.named_widget.builder.get_object('selection') + + model, treeiter = selection.get_selected() + + if treeiter: + + forget_python_script(model[treeiter][3]) + + elif event.keyval == Gdk.KEY_Insert: + + self.emit('ask-for-new-script') + + + def _add_entry(self, filename): + """Add an entry for a new recent Python script.""" + + directory = os.path.dirname(os.path.realpath(__file__)) + icon_filename = os.path.join(directory, 'python-script-icon-16x16.png') + + icon = GdkPixbuf.Pixbuf.new_from_file(icon_filename) + name = os.path.basename(filename) + path = os.path.dirname(filename) + + store = self.named_widget.builder.get_object('store') + + store.append([ icon, name, path, filename ]) + + + def _on_recent_list_changed(self, manager): + """React on resources manager content change.""" + + saved = self._last_selected + + # Register the new item + + builder = self.named_widget.builder + + store = builder.get_object('store') + store.clear() + + for item in manager.get_items(): + + filename = GLib.filename_from_uri(item.get_uri())[0] + + self._add_entry(filename) + + # Restore previous selection + + selection = builder.get_object('selection') + + siter = store.iter_children() + + while siter: + + if store[siter][3] == saved: + + selection.select_iter(siter) + break + + siter = store.iter_next(siter) |