fixes #6, addresses #7

* GUI without gimpfu completed
 * interactive functionality is working
 * updated ChangeLog
This commit is contained in:
Jan Dittberner 2008-01-05 20:45:57 +00:00
parent 7c11b1b14d
commit 1e5b131e7d
2 changed files with 215 additions and 108 deletions

View file

@ -1,3 +1,8 @@
2008-01-05 Jan Dittberner <jan@dittberner.info>
* btn4ws.py: switch to non gimpfu gimpplugin, GtkAssistant GUI,
get interactive functionallity completed
2007-12-04 Jan Dittberner <jan@dittberner.info> 2007-12-04 Jan Dittberner <jan@dittberner.info>
* btn4ws.py: add the functionality available in btn4ws.pl 0.6 * btn4ws.py: add the functionality available in btn4ws.pl 0.6

318
btn4ws.py
View file

@ -27,7 +27,7 @@
Gimp script to generate button images for websites. This script is a Gimp script to generate button images for websites. This script is a
port of the older gimp-perl version to python. port of the older gimp-perl version to python.
(c) 2007 Jan Dittberner <jan@dittberner.info> (c) 2007, 2008 Jan Dittberner <jan@dittberner.info>
""" """
import os, urllib, logging, sys import os, urllib, logging, sys
import gimp, gimpplugin, gimpui, gimpcolor import gimp, gimpplugin, gimpui, gimpcolor
@ -44,13 +44,6 @@ logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s', format='%(asctime)s %(levelname)s %(message)s',
stream=sys.stderr) stream=sys.stderr)
def parsefont(font):
"""
Parses a font into its fontname and size parts.
"""
parts = font.split(" ")
return (" ".join(parts[:-1]), parts[-1])
class text_to_name_mapper: class text_to_name_mapper:
""" """
Text string to name mapper class. This class provides mappings for several target Text string to name mapper class. This class provides mappings for several target
@ -69,7 +62,7 @@ class text_to_name_mapper:
if 'itemid' not in self.mapping[text]: if 'itemid' not in self.mapping[text]:
self.mapping[text]['itemid'] = "id%03d" % (self.idnum) self.mapping[text]['itemid'] = "id%03d" % (self.idnum)
self.idnum += 1 self.idnum += 1
logging.debug("self.mapping=" + str(self.mapping)) #logging.debug("self.mapping=" + str(self.mapping))
return self.mapping[text]['itemid'] return self.mapping[text]['itemid']
def asjavascriptid(self, text): def asjavascriptid(self, text):
@ -79,7 +72,7 @@ class text_to_name_mapper:
if 'jsid' not in self.mapping[text]: if 'jsid' not in self.mapping[text]:
self.mapping[text]['jsid'] = "img%03d" % (self.idnum) self.mapping[text]['jsid'] = "img%03d" % (self.idnum)
self.idnum += 1 self.idnum += 1
logging.debug("self.mapping=" + str(self.mapping)) #logging.debug("self.mapping=" + str(self.mapping))
return self.mapping[text]['jsid'] return self.mapping[text]['jsid']
def aslinktarget(self, text): def aslinktarget(self, text):
@ -88,7 +81,7 @@ class text_to_name_mapper:
""" """
if 'link' not in self.mapping[text]: if 'link' not in self.mapping[text]:
self.mapping[text]['link'] = urllib.quote(text) self.mapping[text]['link'] = urllib.quote(text)
logging.debug("self.mapping=" + str(self.mapping)) #logging.debug("self.mapping=" + str(self.mapping))
return "%s.html" % (self.mapping[text]['link']) return "%s.html" % (self.mapping[text]['link'])
def asfilename(self, text, extension = 'png', prefix= '', dirname = None): def asfilename(self, text, extension = 'png', prefix= '', dirname = None):
@ -98,7 +91,7 @@ class text_to_name_mapper:
if 'file' not in self.mapping[text]: if 'file' not in self.mapping[text]:
self.mapping[text]['file'] = text.encode('ascii', 'ignore') self.mapping[text]['file'] = text.encode('ascii', 'ignore')
fname = "%s%s.%s" % (prefix, self.mapping[text]['file'], extension) fname = "%s%s.%s" % (prefix, self.mapping[text]['file'], extension)
logging.debug("self.mapping=" + str(self.mapping)) #logging.debug("self.mapping=" + str(self.mapping))
if dirname: if dirname:
return os.path.join(dirname, fname) return os.path.join(dirname, fname)
return fname return fname
@ -175,10 +168,9 @@ class Btn4wsDialog(gtk.Assistant):
logging.debug("delete_event") logging.debug("delete_event")
return False return False
def __init__(self, **kwargs): def __init__(self, args):
self.data = kwargs self.data = args
self.pages = {} self.pages = {}
logging.debug("kwargs: " + str(kwargs))
gtk.Assistant.__init__(self) gtk.Assistant.__init__(self)
self._addIntroPage() self._addIntroPage()
@ -223,6 +215,8 @@ class Btn4wsDialog(gtk.Assistant):
table.attach(label, 0, 1, 0, 1) table.attach(label, 0, 1, 0, 1)
button = gtk.FileChooserButton("Choose file") button = gtk.FileChooserButton("Choose file")
button.set_action(gtk.FILE_CHOOSER_ACTION_OPEN) button.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
if self.data["filename"]:
button.set_filename(self.data["filename"])
button.connect("selection-changed", self._cb_file_selected) button.connect("selection-changed", self._cb_file_selected)
button.show() button.show()
table.attach(button, 1, 2, 0, 1) table.attach(button, 1, 2, 0, 1)
@ -232,6 +226,10 @@ class Btn4wsDialog(gtk.Assistant):
table.attach(label, 0, 1, 1, 2) table.attach(label, 0, 1, 1, 2)
button = gtk.FileChooserButton("Choose directory") button = gtk.FileChooserButton("Choose directory")
button.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) button.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
if self.data["outdir"]:
button.set_filename(self.data["outdir"])
else:
self.data["outdir"] = button.get_filename()
button.connect("selection-changed", self._cb_dir_selected) button.connect("selection-changed", self._cb_dir_selected)
button.show() button.show()
table.attach(button, 1, 2, 1, 2) table.attach(button, 1, 2, 1, 2)
@ -264,6 +262,8 @@ class Btn4wsDialog(gtk.Assistant):
fontsel.set_show_size(True) fontsel.set_show_size(True)
if self.data["font"]: if self.data["font"]:
fontsel.set_font_name(self.data["font"]) fontsel.set_font_name(self.data["font"])
else:
self.data["font"] = fontsel.get_font_name()
fontsel.show() fontsel.show()
fontsel.connect("font-set", self._cb_set_font) fontsel.connect("font-set", self._cb_set_font)
table.attach(fontsel, 1, 2, 0, 1) table.attach(fontsel, 1, 2, 0, 1)
@ -275,6 +275,8 @@ class Btn4wsDialog(gtk.Assistant):
colorsel = gimpui.ColorSelector() colorsel = gimpui.ColorSelector()
if self.data["strcolor"]: if self.data["strcolor"]:
colorsel.set_color(self.data["strcolor"]) colorsel.set_color(self.data["strcolor"])
else:
self.data["strcolor"] = colorsel.get_color()
colorsel.show() colorsel.show()
colorsel.connect("color-changed", self._cb_set_color, "strcolor", colorsel.connect("color-changed", self._cb_set_color, "strcolor",
"basicsettings") "basicsettings")
@ -298,7 +300,9 @@ class Btn4wsDialog(gtk.Assistant):
patternsel.connect("pattern-set", self._cb_set_pattern) patternsel.connect("pattern-set", self._cb_set_pattern)
colorsel = gimpui.ColorSelector() colorsel = gimpui.ColorSelector()
if self.data["buttoncolor"]: if self.data["buttoncolor"]:
colorsel.set_pattern(self.data["buttoncolor"]) colorsel.set_color(self.data["buttoncolor"])
else:
self.data["buttoncolor"] = colorsel.get_color()
colorsel.connect("color-changed", self._cb_set_color, "buttoncolor", colorsel.connect("color-changed", self._cb_set_color, "buttoncolor",
"basicsettings") "basicsettings")
bgtoggle.connect("toggled", self._cb_bgtoggle_toggle, label, bgtoggle.connect("toggled", self._cb_bgtoggle_toggle, label,
@ -377,8 +381,10 @@ class Btn4wsDialog(gtk.Assistant):
label = gtk.Label("Background color") label = gtk.Label("Background color")
label.show() label.show()
colorsel = gimpui.ColorSelector() colorsel = gimpui.ColorSelector()
if self.data["buttoncolor"]: if self.data["bgcolor"]:
colorsel.set_pattern(self.data["bgcolor"]) colorsel.set_color(self.data["bgcolor"])
else:
self.data["bgcolor"] = colorsel.get_color()
colorsel.connect("color-changed", self._cb_set_color, "bgcolor", colorsel.connect("color-changed", self._cb_set_color, "bgcolor",
"layout") "layout")
colorsel.show() colorsel.show()
@ -397,7 +403,7 @@ class Btn4wsDialog(gtk.Assistant):
"Select the effect settings") "Select the effect settings")
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT) self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
table = gtk.Table(rows=6, columns=2, homogeneous=False) table = gtk.Table(rows=7, columns=2, homogeneous=False)
table.show() table.show()
#nova #nova
@ -411,7 +417,9 @@ class Btn4wsDialog(gtk.Assistant):
label.show() label.show()
novacolor = gimpui.ColorSelector() novacolor = gimpui.ColorSelector()
if self.data["novacolor"]: if self.data["novacolor"]:
novacolor.set_pattern(self.data["novacolor"]) novacolor.set_color(self.data["novacolor"])
else:
self.data["novacolor"] = novacolor.get_color()
novacolor.connect("color-changed", self._cb_set_color, "novacolor", novacolor.connect("color-changed", self._cb_set_color, "novacolor",
"effects") "effects")
novacolor.set_sensitive(self.data["nova"]) novacolor.set_sensitive(self.data["nova"])
@ -420,6 +428,8 @@ class Btn4wsDialog(gtk.Assistant):
table.attach(novacolor, 1, 2, 1, 2) table.attach(novacolor, 1, 2, 1, 2)
#novaradius #novaradius
label = gtk.Label("Nova radius")
label.show()
novaradius = IntEntry(max = 2) novaradius = IntEntry(max = 2)
if self.data["novaradius"] is not None: if self.data["novaradius"] is not None:
novaradius.set_text(str(self.data["novaradius"])) novaradius.set_text(str(self.data["novaradius"]))
@ -427,9 +437,12 @@ class Btn4wsDialog(gtk.Assistant):
"effects") "effects")
novaradius.set_sensitive(self.data["nova"]) novaradius.set_sensitive(self.data["nova"])
novaradius.show() novaradius.show()
table.attach(label, 0, 1, 2, 3)
table.attach(novaradius, 1, 2, 2, 3) table.attach(novaradius, 1, 2, 2, 3)
#novasparkles #novasparkles
label = gtk.Label("Nova sparkles")
label.show()
novasparkles = IntEntry(max = 2) novasparkles = IntEntry(max = 2)
if self.data["novasparkles"] is not None: if self.data["novasparkles"] is not None:
novasparkles.set_text(str(self.data["novasparkles"])) novasparkles.set_text(str(self.data["novasparkles"]))
@ -437,6 +450,7 @@ class Btn4wsDialog(gtk.Assistant):
"effects") "effects")
novasparkles.set_sensitive(self.data["nova"]) novasparkles.set_sensitive(self.data["nova"])
novasparkles.show() novasparkles.show()
table.attach(label, 0, 1, 3, 4)
table.attach(novasparkles, 1, 2, 3, 4) table.attach(novasparkles, 1, 2, 3, 4)
novatoggle.connect("toggled", self._cb_nova_toggle, novacolor, novatoggle.connect("toggled", self._cb_nova_toggle, novacolor,
novaradius, novasparkles) novaradius, novasparkles)
@ -452,14 +466,28 @@ class Btn4wsDialog(gtk.Assistant):
label.show() label.show()
glowcolor = gimpui.ColorSelector() glowcolor = gimpui.ColorSelector()
if self.data["glowcolor"]: if self.data["glowcolor"]:
glowcolor.set_pattern(self.data["glowcolor"]) glowcolor.set_color(self.data["glowcolor"])
else:
self.data["glowcolor"] = glowcolor.get_color()
glowcolor.connect("color-changed", self._cb_set_color, "glowcolor", glowcolor.connect("color-changed", self._cb_set_color, "glowcolor",
"effects") "effects")
glowcolor.set_sensitive(self.data["glow"]) glowcolor.set_sensitive(self.data["glow"])
glowcolor.show() glowcolor.show()
table.attach(label, 0, 1, 5, 6) table.attach(label, 0, 1, 5, 6)
table.attach(glowcolor, 1, 2, 5, 6) table.attach(glowcolor, 1, 2, 5, 6)
glowtoggle.connect("toggled", self._cb_glow_toggle, glowcolor)
#glowsize
label = gtk.Label("Glow size")
label.show()
glowsize = IntEntry(max = 2)
glowsize.connect("changed", self._cb_set_intvalue, "glowsize",
"effects")
glowsize.set_sensitive(self.data["glow"])
glowsize.show()
table.attach(label, 0, 1, 6, 7)
table.attach(glowsize, 1, 2, 6, 7)
glowtoggle.connect("toggled", self._cb_glow_toggle, glowcolor,
glowsize)
page.pack_end(table) page.pack_end(table)
@ -538,13 +566,15 @@ class Btn4wsDialog(gtk.Assistant):
self.data["novacolor"] is not None and \ self.data["novacolor"] is not None and \
self.data["novaradius"] is not None and \ self.data["novaradius"] is not None and \
self.data["novasparkles"] is not None)) and \ self.data["novasparkles"] is not None)) and \
(self.data["glow"] == False or \ (self.data["glow"] == False or ( \
self.data["glowcolor"] is not None) self.data["glowcolor"] is not None and \
self.data["glowsize"] is not None))
elif pagename == "output": elif pagename == "output":
criteriamatched = self.data["makejscript"] is not None and \ criteriamatched = self.data["makejscript"] is not None and \
self.data["makeinactive"] is not None and \ self.data["makeinactive"] is not None and \
self.data["makeactive"] is not None and \ self.data["makeactive"] is not None and \
self.data["makepressed"] is not None self.data["makepressed"] is not None and \
self.data["writexcf"] is not None
if criteriamatched: if criteriamatched:
self.set_page_complete(self.pages[pagename], True) self.set_page_complete(self.pages[pagename], True)
else: else:
@ -610,31 +640,40 @@ class Btn4wsDialog(gtk.Assistant):
sparksfield.set_sensitive(False) sparksfield.set_sensitive(False)
self.checkcompletion("effects") self.checkcompletion("effects")
def _cb_glow_toggle(self, w, colorfield): def _cb_glow_toggle(self, w, colorfield, sizefield):
if w.get_active(): if w.get_active():
self.data["glow"] = True self.data["glow"] = True
colorfield.set_sensitive(True) colorfield.set_sensitive(True)
sizefield.set_sensitive(True)
else: else:
self.data["glow"] = False self.data["glow"] = False
colorfield.set_sensitive(False) colorfield.set_sensitive(False)
sizefield.set_sensitive(False)
self.checkcompletion("effects") self.checkcompletion("effects")
class btn4wsplugin(gimpplugin.plugin): class btn4wsplugin(gimpplugin.plugin):
"""This is the btn4ws gimp plugin.""" """This is the btn4ws gimp plugin."""
def gimp2html_color(color): def gimp2html_color(self, color):
""" """
Converts a color tuple to a hex encoded color for CSS. Converts a color tuple to a hex encoded color for CSS.
""" """
return "#%02x%02x%02x" % (color[0], color[1], color[2]) return "#%02x%02x%02x" % (color[0], color[1], color[2])
def toprocess(item): def parsefont(self, font):
"""
Parses a font into its fontname and size parts.
"""
parts = font.split(" ")
return (" ".join(parts[:-1]), parts[-1])
def toprocess(self, item):
""" """
Decides whether the plugin is able to process the item or not. Decides whether the plugin is able to process the item or not.
""" """
item = item.strip() item = item.strip()
return len(item) > 0 and not item.startswith('#') return len(item) > 0 and not item.startswith('#')
def getmaxextents(strings, fontsize, fontname): def getmaxextents(self, strings, fontsize, fontname):
""" """
Gets the maximum width and height of texts in strings array Gets the maximum width and height of texts in strings array
with the given font. with the given font.
@ -648,7 +687,7 @@ class btn4wsplugin(gimpplugin.plugin):
maxy = max(maxy, extents[1]) maxy = max(maxy, extents[1])
return (maxx, maxy) return (maxx, maxy)
def writejs(dirname, strings): def writejs(self, dirname, strings, width, height, t2nm):
buf = [ buf = [
"//", "//",
"// JavaScript generated by btn4ws version %s" % (btn4ws_version), "// JavaScript generated by btn4ws version %s" % (btn4ws_version),
@ -677,16 +716,16 @@ class btn4wsplugin(gimpplugin.plugin):
jsfile.write("\n".join(buf)) jsfile.write("\n".join(buf))
jsfile.close() jsfile.close()
def writecss(dirname): def writecss(self, dirname, bgcolor):
buf = [ buf = [
"html, body { background-color:%s; }" % (gimp2html_color(bgcolor)), "html, body { background-color:%s; }" % (self.gimp2html_color(bgcolor)),
"a img { border-width: 0; }" "a img { border-width: 0; }"
] ]
cssfile = open(os.path.join(dirname, 'format.css'), 'w') cssfile = open(os.path.join(dirname, 'format.css'), 'w')
cssfile.write("\n".join(buf)) cssfile.write("\n".join(buf))
cssfile.close() cssfile.close()
def writehtml(dirname, strings): def writehtml(self, dirname, strings, width, height, t2nm):
buf = [ buf = [
'<?xml version="1.0" encoding="UTF-8"?>', '<?xml version="1.0" encoding="UTF-8"?>',
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"',
@ -724,32 +763,84 @@ class btn4wsplugin(gimpplugin.plugin):
'</html>', '</html>',
'' ''
]) ])
htmlfile = open(os.path.join(outdir, 'example.html'), 'w') htmlfile = open(os.path.join(dirname, 'example.html'), 'w')
htmlfile.write("\n".join(buf)) htmlfile.write("\n".join(buf))
htmlfile.close() htmlfile.close()
def saveaspng(fname, image): def saveaspng(self, fname, image, transparency):
imgcopy = dupimage(image) imgcopy = pdb['gimp_image_duplicate'](image)
if transparency: if transparency:
imgcopy.merge_visible_layers(CLIP_TO_BOTTOM_LAYER) imgcopy.merge_visible_layers(CLIP_TO_BOTTOM_LAYER)
else: else:
imgcopy.flatten() imgcopy.flatten()
pngsave(imgcopy, imgcopy.active_layer, fname, fname, False, 9, pdb['file_png_save'](imgcopy, imgcopy.active_layer, fname, fname,
False, False, False, False, True) False, 9, False, False, False, False, True)
gimp.delete(imgcopy) gimp.delete(imgcopy)
def _cb_destroy(self, widget, data = None):
logging.debug("destroy")
gtk.main_quit()
def _cb_apply(self, widget):
self.data = widget.data
logging.debug(str(self.data))
def __init__(self): def __init__(self):
self.data = {} self.data = {}
self.inputdata = {}
def btn4ws(self, runmode, filename = None, outdir = None, font = None, def checkdata(self, data):
logging.debug("checkdata " + str(data))
valid = True
if data["filename"] is None:
logging.error("filename is None")
valid = False
else:
try:
if not os.path.isfile(data["filename"]):
logging.error("%s is not a file.", data["filename"])
valid = False
except OSError, e:
logging.error(e)
valid = False
if data["outdir"] is None:
logging.error("outdir is None")
else:
try:
if not os.path.isdir(data["outdir"]):
logging.error("%s is not a directory.", data["outdir"])
valid = False
except OSError, e:
logging.error(e)
valid = False
# simple None checks
for key in ("font", "strcolor", "roundradius", "bevelwidth",
"padding", "makejscript", "makeinactive", "makeactive",
"makepressed", "writexcf"):
if data[key] is None:
logging.error("%s is None" % (key))
valid = False
if data["usepattern"]:
if data["pattern"] is None:
logging.error("usepattern is True and pattern is None")
valid = False
elif data["buttoncolor"] is None:
logging.error("usepattern is False and buttoncolor is None")
valid = False
if not data["transparency"] and data["bgcolor"] is None:
logging.error("transparency is not enabled and bgcolor is None")
valid = False
if data["nova"]:
if data["novacolor"] is None:
logging.error("nova is enabled and novacolor is None")
valid = False
if data["novaradius"] is None:
logging.error("nova is enabled and novaradius is None")
valid = False
if data["novasparkles"] is None:
logging.error("nova is enabled and novasparkles is None")
valid = False
if data["glow"]:
if data["glowcolor"] is None:
logging.error("glow is enabled and glowcolor is None")
valid = False
if data["glowsize"] is None:
logging.error("glow is enabled and glowsize is None")
return valid
def makebuttons(self, filename = None, outdir = None, font = None,
strcolor = None, transparency = False, bgcolor = None, strcolor = None, transparency = False, bgcolor = None,
glow = False, glowcolor = None, usepattern = False, glow = False, glowcolor = None, usepattern = False,
pattern = None, buttoncolor = None, roundradius = None, pattern = None, buttoncolor = None, roundradius = None,
@ -757,41 +848,6 @@ class btn4wsplugin(gimpplugin.plugin):
nova = False, novasparkles = None, novaradius = None, nova = False, novasparkles = None, novaradius = None,
novacolor = None, writexcf = False, makeinactive = True, novacolor = None, writexcf = False, makeinactive = True,
makeactive = True, makepressed = True, makejscript = True): makeactive = True, makepressed = True, makejscript = True):
"""
This function controls the creation of the buttons and is
registered as gimp plugin.
"""
if runmode == RUN_INTERACTIVE:
logging.debug("runmode interactive")
dialog = Btn4wsDialog(filename = filename, outdir = outdir,
font = font, strcolor = strcolor,
transparency = transparency,
bgcolor = bgcolor, glow = glow,
glowcolor = glowcolor,
usepattern = usepattern, pattern = pattern,
buttoncolor = buttoncolor,
roundradius = roundradius, padding = padding,
glowsize = glowsize, bevelwidth = bevelwidth,
nova = nova, novasparkles = novasparkles,
novaradius = novaradius,
novacolor = novacolor,
writexcf = writexcf,
makeinactive = makeinactive,
makeactive = makeactive,
makepressed = makepressed,
makejscript = makejscript)
dialog.connect("close", self._cb_destroy)
dialog.connect("cancel", self._cb_destroy)
dialog.connect("destroy", self._cb_destroy)
dialog.connect("apply", self._cb_apply)
gtk.main()
elif runmode == RUN_NONINTERACTIVE:
logging.debug("runmode noninteractive")
elif runmode == RUN_WITH_LASTVALS:
logging.debug("runmode with lastvals")
if shelf.has_key("btn4ws"):
initialvalues = shelf["btn4ws"]
return
# import used gimp pdb functions # import used gimp pdb functions
createtext = pdb['gimp_text_fontname'] createtext = pdb['gimp_text_fontname']
selectionlayeralpha = pdb['gimp_selection_layer_alpha'] selectionlayeralpha = pdb['gimp_selection_layer_alpha']
@ -802,36 +858,21 @@ class btn4wsplugin(gimpplugin.plugin):
rectselect = pdb['gimp_rect_select'] rectselect = pdb['gimp_rect_select']
ellipseselect = pdb['gimp_ellipse_select'] ellipseselect = pdb['gimp_ellipse_select']
selectionshrink = pdb['gimp_selection_shrink'] selectionshrink = pdb['gimp_selection_shrink']
selectionnone = pdb['gimp_selection_none'] selectionnone = pdb['gimp_selection_none']
fill = pdb['gimp_edit_fill'] fill = pdb['gimp_edit_fill']
bumpmap = pdb['plug_in_bump_map'] bumpmap = pdb['plug_in_bump_map']
novaplugin = pdb['plug_in_nova'] novaplugin = pdb['plug_in_nova']
xcfsave = pdb['gimp_xcf_save'] xcfsave = pdb['gimp_xcf_save']
pngsave = pdb['file_png_save']
dupimage = pdb['gimp_image_duplicate']
try:
if not os.path.isfile(filename):
logging.error("%s is not a file.", filename)
return
if not outdir:
outdir = os.path.dirname(filename)
if not os.path.isdir(outdir):
logging.error("%s is not a directory.", outdir)
return
except OSError, e:
logging.error(e)
return
gimp.progress_init() gimp.progress_init()
stringfile = open(filename) stringfile = open(filename)
strings = [line.strip() strings = [line.strip()
for line in stringfile.readlines() for line in stringfile.readlines()
if toprocess(line)] if self.toprocess(line)]
stringfile.close() stringfile.close()
t2nm = text_to_name_mapper(strings) t2nm = text_to_name_mapper(strings)
(fontname, fontsize) = parsefont(font) (fontname, fontsize) = self.parsefont(font)
(maxx, maxy) = getmaxextents(strings, fontsize, fontname) (maxx, maxy) = self.getmaxextents(strings, fontsize, fontname)
logging.debug("fontname: %s, fontsize: %d, maxx: %d, maxy: %d", logging.debug("fontname: %s, fontsize: %d, maxx: %d, maxy: %d",
fontname, int(fontsize), maxx, maxy) fontname, int(fontsize), maxx, maxy)
width = maxx + (padding*4) width = maxx + (padding*4)
@ -962,29 +1003,90 @@ class btn4wsplugin(gimpplugin.plugin):
btnlayer1.visible = False btnlayer1.visible = False
btnlayer2.visible = True btnlayer2.visible = True
if nova: novalayer.visible = True if nova: novalayer.visible = True
saveaspng(t2nm.asfilename(text, 'png', 'p_', outdir), image) self.saveaspng(t2nm.asfilename(text, 'png', 'p_', outdir),
image, transparency)
if makeactive: if makeactive:
btnlayer0.visible = False btnlayer0.visible = False
btnlayer1.visible = True btnlayer1.visible = True
btnlayer2.visible = False btnlayer2.visible = False
if nova: novalayer.visible = True if nova: novalayer.visible = True
saveaspng(t2nm.asfilename(text, 'png', 'a_', outdir), image) self.saveaspng(t2nm.asfilename(text, 'png', 'a_', outdir),
image, transparency)
if makeinactive: if makeinactive:
btnlayer0.visible = True btnlayer0.visible = True
btnlayer1.visible = False btnlayer1.visible = False
btnlayer2.visible = False btnlayer2.visible = False
if nova: novalayer.visible = False if nova: novalayer.visible = False
saveaspng(t2nm.asfilename(text, 'png', 'i_', outdir), image) self.saveaspng(t2nm.asfilename(text, 'png', 'i_', outdir),
image, transparency)
image.enable_undo() image.enable_undo()
#gimp.Display(image) #gimp.Display(image)
gimp.progress_update((strings.index(text)+1)/len(strings)) gimp.progress_update((strings.index(text)+1)/len(strings))
gimp.delete(image) gimp.delete(image)
if makejscript: if makejscript:
writejs(outdir, strings) self.writejs(outdir, strings, width, height, t2nm)
writecss(outdir) self.writecss(outdir, bgcolor)
writehtml(outdir, strings) self.writehtml(outdir, strings, width, height, t2nm)
#gimp.displays_flush() #gimp.displays_flush()
def _cb_destroy(self, widget, data = None):
logging.debug("destroy")
gtk.main_quit()
def _cb_apply(self, widget):
self.data = widget.data
logging.debug(str(self.data))
if self.checkdata(self.data):
self.makebuttons(**self.data)
else:
logging.error("checking data failed")
def btn4ws(self, runmode, filename = None, outdir = None, font = None,
strcolor = None, transparency = False, bgcolor = None,
glow = False, glowcolor = None, usepattern = False,
pattern = None, buttoncolor = None, roundradius = None,
padding = None, glowsize = None, bevelwidth = None,
nova = False, novasparkles = None, novaradius = None,
novacolor = None, writexcf = False, makeinactive = True,
makeactive = True, makepressed = True, makejscript = True):
"""
This function controls the creation of the buttons and is
registered as gimp plugin.
"""
self.inputdata = {
"filename" : filename, "outdir" : outdir, "font" : font,
"strcolor" : strcolor, "transparency" : transparency,
"bgcolor" : bgcolor, "glow" : glow, "glowcolor" : glowcolor,
"usepattern" : usepattern, "pattern" : pattern,
"buttoncolor" : buttoncolor, "roundradius" : roundradius,
"padding" : padding, "glowsize" : glowsize,
"bevelwidth" : bevelwidth, "nova" : nova,
"novasparkles" : novasparkles, "novaradius" : novaradius,
"novacolor" : novacolor, "writexcf" : writexcf,
"makeinactive" : makeinactive, "makeactive" : makeactive,
"makepressed" : makepressed, "makejscript" : makejscript
}
if runmode == RUN_WITH_LAST_VALS:
logging.debug("runmode with last vals")
if shelf.has_key("btn4ws"):
self.inputdata = shelf["btn4ws"]
if runmode in (RUN_INTERACTIVE, RUN_WITH_LAST_VALS):
dialog = Btn4wsDialog(self.inputdata)
dialog.connect("close", self._cb_destroy)
dialog.connect("cancel", self._cb_destroy)
dialog.connect("destroy", self._cb_destroy)
dialog.connect("apply", self._cb_apply)
gtk.main()
elif runmode == RUN_NONINTERACTIVE:
logging.debug("runmode noninteractive")
if self.checkdata(self.inputdata):
self.makebuttons(**self.inputdata)
else:
logging.error("checking data failed")
else:
logging.error("unknown runmode %d" % runmode)
return
def start(self): def start(self):
gimp.main(self.init, self.quit, self.query, self._run) gimp.main(self.init, self.quit, self.query, self._run)