summaryrefslogtreecommitdiff
path: root/plugins/python/scripting/panel.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/python/scripting/panel.py')
-rw-r--r--plugins/python/scripting/panel.py140
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)