20
20
from gimpfu import *
22
def plug_in_python_fu_console():
22
t = gettext.translation('gimp20-python', gimp.locale_directory, fallback=True)
25
PROC_NAME = 'python-fu-console'
27
RESPONSE_BROWSE, RESPONSE_CLEAR, RESPONSE_SAVE = range(3)
24
31
pygtk.require('2.0')
26
import gtk, gimpenums, gimpshelf
28
gtk.rc_parse(gimp.gtkrc())
33
import sys, gobject, gtk, gimpenums, gimpshelf, gimpui, pyconsole
30
35
namespace = {'__builtins__': __builtins__,
31
36
'__name__': '__main__', '__doc__': None,
32
37
'gimp': gimp, 'pdb': gimp.pdb,
33
38
'shelf': gimpshelf.shelf}
35
40
for s in gimpenums.__dict__.keys():
37
42
namespace[s] = getattr(gimpenums, s)
43
win.connect("destroy", bye)
44
win.set_title("Gimp-Python Console")
47
cons = gtkcons.Console(namespace=namespace, quit_cb=bye)
49
def browse(button, cons):
50
import gimpprocbrowser
44
class Console(gimpui.Dialog):
46
gimpui.Dialog.__init__(self, title=_("Python Console"),
47
role=PROC_NAME, help_id=PROC_NAME,
48
buttons=(gtk.STOCK_SAVE, RESPONSE_SAVE,
49
gtk.STOCK_CLEAR, RESPONSE_CLEAR,
50
_("_Browse..."), RESPONSE_BROWSE,
51
gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
53
self.set_alternative_button_order((gtk.RESPONSE_CLOSE,
58
banner = ('Gimp %s Python Console\nPython %s\n' %
59
(gimp.pdb.gimp_version(), sys.version))
61
self.cons = pyconsole.Console(locals=namespace, banner=banner,
62
quit_func=lambda: gtk.main_quit())
64
self.connect('response', self.response)
66
self.browse_dlg = None
69
vbox = gtk.VBox(False, 12)
70
vbox.set_border_width(12)
71
self.vbox.pack_start(vbox)
73
scrl_win = gtk.ScrolledWindow()
74
scrl_win.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
75
vbox.pack_start(scrl_win)
77
scrl_win.add(self.cons)
79
self.set_default_size(500, 500)
81
def response(self, dialog, response_id):
82
if response_id == RESPONSE_BROWSE:
84
elif response_id == RESPONSE_CLEAR:
85
self.cons.banner = None
87
elif response_id == RESPONSE_SAVE:
92
self.cons.grab_focus()
94
def browse_response(self, dlg, response_id):
95
if response_id != gtk.RESPONSE_APPLY:
99
proc_name = dlg.get_selected()
104
proc = pdb[proc_name]
55
108
if len(proc.return_vals) > 0:
56
cmd = ', '.join([x[1] for x in proc.return_vals]) + ' = '
58
if '-' in proc.proc_name:
59
cmd = cmd + "pdb['%s']" % proc.proc_name
61
cmd = cmd + "pdb.%s" % proc.proc_name
63
if len(proc.params) > 0 and proc.params[0][1] == 'run_mode':
109
cmd = ', '.join([x[1].replace('-', '_')
110
for x in proc.return_vals]) + ' = '
112
cmd = cmd + 'pdb.%s' % proc.proc_name.replace('-', '_')
114
if len(proc.params) > 0 and proc.params[0][1] == 'run-mode':
64
115
params = proc.params[1:]
66
117
params = proc.params
68
cmd = cmd + "(%s)" % ', '.join([x[1] for x in params])
70
cons.line.set_text(cmd)
72
dlg = gimpprocbrowser.dialog_new(on_apply)
74
button = gtk.Button("Browse")
75
button.connect("clicked", browse, cons)
77
cons.inputbox.pack_end(button, expand=FALSE)
83
win.set_default_size(475, 300)
88
# flush the displays every half second
93
gtk.timeout_add(500, timeout)
119
cmd = cmd + '(%s)' % ', '.join([x[1].replace('-', '_')
122
buffer = self.cons.buffer
124
lines = buffer.get_line_count()
125
iter = buffer.get_iter_at_line_offset(lines - 1, 4)
126
buffer.delete(iter, buffer.get_end_iter())
127
buffer.place_cursor(buffer.get_end_iter())
128
buffer.insert_at_cursor(cmd)
131
if not self.browse_dlg:
132
dlg = gimpui.ProcBrowserDialog(_("Python Procedure Browser"),
134
buttons=(gtk.STOCK_APPLY,
139
dlg.set_default_response(gtk.RESPONSE_APPLY)
140
dlg.set_alternative_button_order((gtk.RESPONSE_CLOSE,
143
dlg.connect('response', self.browse_response)
144
dlg.connect('row-activated',
145
lambda dlg: dlg.response(gtk.RESPONSE_APPLY))
147
self.browse_dlg = dlg
149
self.browse_dlg.present()
151
def save_response(self, dlg, response_id):
152
if response_id == gtk.RESPONSE_DELETE_EVENT:
155
elif response_id == gtk.RESPONSE_OK:
156
filename = dlg.get_filename()
159
logfile = open(filename, 'w')
161
gimp.message(_("Could not open '%s' for writing: %s") %
162
(filename, e.strerror))
165
buffer = self.cons.buffer
167
start = buffer.get_start_iter()
168
end = buffer.get_end_iter()
170
log = buffer.get_text(start, end, False)
176
gimp.message(_("Could not write to '%s': %s") %
177
(filename, e.strerror))
182
def save_dialog(self):
183
if not self.save_dlg:
184
dlg = gtk.FileChooserDialog(_("Save Python-Fu Console Output"),
186
action=gtk.FILE_CHOOSER_ACTION_SAVE,
187
buttons=(gtk.STOCK_CANCEL,
192
dlg.set_default_response(gtk.RESPONSE_OK)
193
dlg.set_alternative_button_order((gtk.RESPONSE_OK,
194
gtk.RESPONSE_CANCEL))
196
dlg.connect('response', self.save_response)
200
self.save_dlg.present()
205
# flush the displays every half second
207
gimp.displays_flush()
210
gobject.timeout_add(500, timeout)
98
"Python interactive interpreter with gimp extensions",
218
N_("Interactive Gimp-Python interpreter"),
99
219
"Type in commands and see results",
100
220
"James Henstridge",
101
221
"James Henstridge",
103
"<Toolbox>/Xtns/Python-Fu/_Console",
107
plug_in_python_fu_console)
228
menu="<Toolbox>/Xtns/Languages/Python-Fu",
229
domain=("gimp20-python", gimp.locale_directory))