summaryrefslogtreecommitdiffstats
path: root/plug-ins/pygimp/plug-ins/python-console.py
diff options
context:
space:
mode:
Diffstat (limited to 'plug-ins/pygimp/plug-ins/python-console.py')
-rwxr-xr-xplug-ins/pygimp/plug-ins/python-console.py245
1 files changed, 245 insertions, 0 deletions
diff --git a/plug-ins/pygimp/plug-ins/python-console.py b/plug-ins/pygimp/plug-ins/python-console.py
new file mode 100755
index 0000000..a8c7e4c
--- /dev/null
+++ b/plug-ins/pygimp/plug-ins/python-console.py
@@ -0,0 +1,245 @@
+#!/usr/bin/env python2
+
+# Gimp-Python - allows the writing of Gimp plugins in Python.
+# Copyright (C) 1997 James Henstridge <james@daa.com.au>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+from gimpfu import *
+
+t = gettext.translation('gimp20-python', gimp.locale_directory, fallback=True)
+_ = t.ugettext
+
+PROC_NAME = 'python-fu-console'
+
+RESPONSE_BROWSE, RESPONSE_CLEAR, RESPONSE_SAVE = range(3)
+
+def do_console():
+ import pygtk
+ pygtk.require('2.0')
+
+ import sys, gobject, gtk, gimpenums, gimpshelf, gimpui, pyconsole
+ gimpui.gimp_ui_init ()
+
+ namespace = {'__builtins__': __builtins__,
+ '__name__': '__main__', '__doc__': None,
+ 'gimp': gimp, 'pdb': gimp.pdb,
+ 'shelf': gimpshelf.shelf}
+
+ for s in gimpenums.__dict__.keys():
+ if s[0] != '_':
+ namespace[s] = getattr(gimpenums, s)
+
+ class GimpConsole(pyconsole.Console):
+ def __init__(self, quit_func=None):
+ banner = ('GIMP %s Python Console\nPython %s\n' %
+ (gimp.pdb.gimp_version(), sys.version))
+ pyconsole.Console.__init__(self,
+ locals=namespace, banner=banner,
+ quit_func=quit_func)
+ def _commit(self):
+ pyconsole.Console._commit(self)
+ gimp.displays_flush()
+
+ class ConsoleDialog(gimpui.Dialog):
+ def __init__(self):
+ gimpui.Dialog.__init__(self, title=_("Python Console"),
+ role=PROC_NAME, help_id=PROC_NAME,
+ buttons=(gtk.STOCK_SAVE, RESPONSE_SAVE,
+ gtk.STOCK_CLEAR, RESPONSE_CLEAR,
+ _("_Browse..."), RESPONSE_BROWSE,
+ gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
+
+ self.set_name (PROC_NAME)
+ self.set_alternative_button_order((gtk.RESPONSE_CLOSE,
+ RESPONSE_BROWSE,
+ RESPONSE_CLEAR,
+ RESPONSE_SAVE))
+
+ self.cons = GimpConsole(quit_func=lambda: gtk.main_quit())
+
+ self.style_set (None, None)
+
+ self.connect('response', self.response)
+ self.connect('style-set', self.style_set)
+
+ self.browse_dlg = None
+ self.save_dlg = None
+
+ vbox = gtk.VBox(False, 12)
+ vbox.set_border_width(12)
+ self.vbox.pack_start(vbox)
+
+ scrl_win = gtk.ScrolledWindow()
+ scrl_win.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
+ vbox.pack_start(scrl_win)
+
+ scrl_win.add(self.cons)
+
+ width, height = self.cons.get_default_size()
+ sb_width, sb_height = scrl_win.get_vscrollbar().size_request()
+
+ # Account for scrollbar width and border width to ensure
+ # the text view gets a width of 80 characters. We don't care
+ # so much whether the height will be exactly 40 characters.
+ self.set_default_size(width + sb_width + 2 * 12, height)
+
+ def style_set(self, old_style, user_data):
+ style = self.get_style ()
+ self.cons.stdout_tag.set_property ("foreground", style.text[gtk.STATE_NORMAL])
+ self.cons.stderr_tag.set_property ("foreground", style.text[gtk.STATE_INSENSITIVE])
+
+ def response(self, dialog, response_id):
+ if response_id == RESPONSE_BROWSE:
+ self.browse()
+ elif response_id == RESPONSE_CLEAR:
+ self.cons.banner = None
+ self.cons.clear()
+ elif response_id == RESPONSE_SAVE:
+ self.save_dialog()
+ else:
+ gtk.main_quit()
+
+ self.cons.grab_focus()
+
+ def browse_response(self, dlg, response_id):
+ if response_id != gtk.RESPONSE_APPLY:
+ dlg.hide()
+ return
+
+ proc_name = dlg.get_selected()
+
+ if not proc_name:
+ return
+
+ proc = pdb[proc_name]
+
+ cmd = ''
+
+ if len(proc.return_vals) > 0:
+ cmd = ', '.join([x[1].replace('-', '_')
+ for x in proc.return_vals]) + ' = '
+
+ cmd = cmd + 'pdb.%s' % proc.proc_name.replace('-', '_')
+
+ if len(proc.params) > 0 and proc.params[0][1] == 'run-mode':
+ params = proc.params[1:]
+ else:
+ params = proc.params
+
+ cmd = cmd + '(%s)' % ', '.join([x[1].replace('-', '_')
+ for x in params])
+
+ buffer = self.cons.buffer
+
+ lines = buffer.get_line_count()
+ iter = buffer.get_iter_at_line_offset(lines - 1, 4)
+ buffer.delete(iter, buffer.get_end_iter())
+ buffer.place_cursor(buffer.get_end_iter())
+ buffer.insert_at_cursor(cmd)
+
+ def browse(self):
+ if not self.browse_dlg:
+ dlg = gimpui.ProcBrowserDialog(_("Python Procedure Browser"),
+ role=PROC_NAME,
+ buttons=(gtk.STOCK_APPLY,
+ gtk.RESPONSE_APPLY,
+ gtk.STOCK_CLOSE,
+ gtk.RESPONSE_CLOSE))
+
+ dlg.set_default_response(gtk.RESPONSE_APPLY)
+ dlg.set_alternative_button_order((gtk.RESPONSE_CLOSE,
+ gtk.RESPONSE_APPLY))
+
+ dlg.connect('response', self.browse_response)
+ dlg.connect('row-activated',
+ lambda dlg: dlg.response(gtk.RESPONSE_APPLY))
+
+ self.browse_dlg = dlg
+
+ self.browse_dlg.present()
+
+ def save_response(self, dlg, response_id):
+ if response_id == gtk.RESPONSE_DELETE_EVENT:
+ self.save_dlg = None
+ return
+ elif response_id == gtk.RESPONSE_OK:
+ filename = dlg.get_filename()
+
+ try:
+ logfile = open(filename, 'w')
+ except IOError, e:
+ gimp.message(_("Could not open '%s' for writing: %s") %
+ (filename, e.strerror))
+ return
+
+ buffer = self.cons.buffer
+
+ start = buffer.get_start_iter()
+ end = buffer.get_end_iter()
+
+ log = buffer.get_text(start, end, False)
+
+ try:
+ logfile.write(log)
+ logfile.close()
+ except IOError, e:
+ gimp.message(_("Could not write to '%s': %s") %
+ (filename, e.strerror))
+ return
+
+ dlg.hide()
+
+ def save_dialog(self):
+ if not self.save_dlg:
+ dlg = gtk.FileChooserDialog(_("Save Python-Fu Console Output"),
+ parent=self,
+ action=gtk.FILE_CHOOSER_ACTION_SAVE,
+ buttons=(gtk.STOCK_CANCEL,
+ gtk.RESPONSE_CANCEL,
+ gtk.STOCK_SAVE,
+ gtk.RESPONSE_OK))
+
+ dlg.set_default_response(gtk.RESPONSE_OK)
+ dlg.set_alternative_button_order((gtk.RESPONSE_OK,
+ gtk.RESPONSE_CANCEL))
+
+ dlg.connect('response', self.save_response)
+
+ self.save_dlg = dlg
+
+ self.save_dlg.present()
+
+ def run(self):
+ self.show_all()
+ gtk.main()
+
+ ConsoleDialog().run()
+
+register(
+ PROC_NAME,
+ N_("Interactive GIMP Python interpreter"),
+ "Type in commands and see results",
+ "James Henstridge",
+ "James Henstridge",
+ "1997-1999",
+ N_("_Console"),
+ "",
+ [],
+ [],
+ do_console,
+ menu="<Image>/Filters/Languages/Python-Fu",
+ domain=("gimp20-python", gimp.locale_directory))
+
+main()