addresses #6, fixes #11

* gimpfu is not used anymore
 * most parts of the input GUI are complete
This commit is contained in:
Jan Dittberner 2008-01-04 21:40:50 +00:00
parent 64f9dd7033
commit 8954b60857
2 changed files with 453 additions and 136 deletions

489
btn4ws.py
View file

@ -30,7 +30,7 @@ port of the older gimp-perl version to python.
(c) 2007 Jan Dittberner <jan@dittberner.info> (c) 2007 Jan Dittberner <jan@dittberner.info>
""" """
import os, urllib, logging, sys import os, urllib, logging, sys
import gimp, gimpplugin import gimp, gimpplugin, gimpui, gimpcolor
import pygtk import pygtk
pygtk.require('2.0') pygtk.require('2.0')
import gtk import gtk
@ -44,6 +44,13 @@ 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
@ -149,40 +156,426 @@ class text_to_name_mapper:
return os.path.join(dirname, fname) return os.path.join(dirname, fname)
return fname return fname
class Btn4wsDialog: class IntEntry(gtk.Entry):
"""Input field for integer numbers."""
def __init__(self, max = 0):
gtk.Entry.__init__(self, max)
self.set_property("truncate-multiline", True)
self.connect("insert-text", self._cb_int_field_insert)
def _cb_int_field_insert(self, w, new_text, new_text_length, position):
"""Allow integer input only."""
if not new_text.isdigit():
w.stop_emission("insert-text")
class Btn4wsDialog(gtk.Assistant):
"""This class is the input dialog field for btn4ws""" """This class is the input dialog field for btn4ws"""
def delete_event(self, widget, event, data = None): def _cb_delete_event(self, widget, event, data = None):
logging.debug("delete_event")
return False return False
def destroy(self, widget, data = None): def __init__(self, **kwargs):
gtk.main_quit() self.data = kwargs
self.pages = {}
logging.debug("kwargs: " + str(kwargs))
gtk.Assistant.__init__(self)
def __init__(self, filename, outdir, font, self._addIntroPage()
strcolor, transparency, bgcolor, #self._addPathSelectionPage()
glow, glowcolor, #self._addBasicSettingsPage()
usepattern, pattern, self._addLayoutPage()
buttoncolor, roundradius, self._addEffectsPage()
padding, glowsize, bevelwidth, self._addLastPage()
nova, novasparkles, novaradius, self.show()
novacolor, writexcf, makeinactive, self.connect("delete_event", self._cb_delete_event)
makeactive, makepressed, makejscript):
self.window = gtk.Assistant()
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
self.window.show()
def main(self): for pagename in self.pages.iterkeys():
gtk.main() self.checkcompletion(pagename)
def _addIntroPage(self):
label = gtk.Label("""Buttons for website allows you to produce a series of buttons for use on a website. On the next pages you may choose several options to change the content and the look of the buttons.""")
label.set_line_wrap(True)
label.show()
self.append_page(label)
self.set_page_title(label, "Introduction")
self.set_page_complete(label, True)
def _addPathSelectionPage(self):
page = gtk.VBox(False, 5)
self.pages["pathselection"] = page
page.set_border_width(5)
page.show()
self.append_page(page)
self.set_page_title(page,
"Select the input file and output directory")
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
label = gtk.Label("Please choose the file containing your button labels and the directory where the generated files should be put.")
label.set_line_wrap(True)
label.show()
page.pack_start(label, True, True, 0)
table = gtk.Table(rows=2, columns=2, homogeneous=False)
table.show()
label = gtk.Label("Button label file")
label.show()
table.attach(label, 0, 1, 0, 1)
button = gtk.FileChooserButton("Choose file")
button.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
button.connect("selection-changed", self._cb_file_selected)
button.show()
table.attach(button, 1, 2, 0, 1)
label = gtk.Label("Output directory")
label.show()
table.attach(label, 0, 1, 1, 2)
button = gtk.FileChooserButton("Choose directory")
button.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
button.connect("selection-changed", self._cb_dir_selected)
button.show()
table.attach(button, 1, 2, 1, 2)
page.pack_end(table)
def _addBasicSettingsPage(self):
page = gtk.VBox(False, 5)
self.pages["basicsettings"] = page
page.set_border_width(5)
page.show()
self.append_page(page)
self.set_page_title(page,
"Select the basic button settings")
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
label = gtk.Label("Please choose the basic layout settings of your buttons.")
label.set_line_wrap(True)
label.show()
page.pack_start(label, True, True, 0)
table = gtk.Table(rows=4, columns=2, homogeneous=False)
table.show()
# font
label = gtk.Label("Button text font")
label.show()
table.attach(label, 0, 1, 0, 1)
fontsel = gtk.FontButton()
fontsel.set_show_size(True)
if self.data["font"]:
fontsel.set_font_name(self.data["font"])
fontsel.show()
fontsel.connect("font-set", self._cb_set_font)
table.attach(fontsel, 1, 2, 0, 1)
# strcolor
label = gtk.Label("Button text color")
label.show()
table.attach(label, 0, 1, 1, 2)
colorsel = gimpui.ColorSelector()
if self.data["strcolor"]:
colorsel.set_color(self.data["strcolor"])
colorsel.show()
colorsel.connect("color-changed", self._cb_set_color, "strcolor",
"basicsettings")
table.attach(colorsel, 1, 2, 1, 2)
# background toggle
bgtoggle = gtk.CheckButton("Use a pattern for button")
bgtoggle.set_active(self.data["usepattern"])
bgtoggle.show()
table.attach(bgtoggle, 1, 2, 2, 3)
# background color / pattern
if self.data["usepattern"]:
label = gtk.Label("Button pattern")
else:
label = gtk.Label("Button color")
label.show()
patternsel = gimpui.PatternSelectButton()
if self.data["pattern"]:
patternsel.set_pattern(self.data["pattern"])
patternsel.connect("pattern-set", self._cb_set_pattern)
colorsel = gimpui.ColorSelector()
if self.data["buttoncolor"]:
colorsel.set_pattern(self.data["buttoncolor"])
colorsel.connect("color-changed", self._cb_set_color, "buttoncolor",
"basicsettings")
bgtoggle.connect("toggled", self._cb_bgtoggle_toggle, label,
"Button pattern", patternsel,
"Button color", colorsel)
if self.data["usepattern"]:
patternsel.show()
else:
colorsel.show()
table.attach(label, 0, 1, 3, 4)
table.attach(patternsel, 1, 2, 3, 4)
table.attach(colorsel, 1, 2, 3, 4)
page.pack_end(table)
def _addLayoutPage(self):
page = gtk.VBox(False, 5)
self.pages["layout"] = page
page.set_border_width(5)
page.show()
self.append_page(page)
self.set_page_title(page,
"Select the layout settings")
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
label = gtk.Label("Select the layout options for your buttons")
label.set_line_wrap(True)
label.show()
page.pack_start(label, True, True, 0)
table = gtk.Table(rows=4, columns=2, homogeneous=False)
table.show()
#roundradius
label = gtk.Label("Round radius")
label.show()
entry = IntEntry(max = 2)
if self.data["roundradius"]:
entry.set_text(str(self.data["roundradius"]))
entry.connect("changed", self._cb_set_intvalue, "roundradius",
"layout")
entry.show()
table.attach(label, 0, 1, 0, 1)
table.attach(entry, 1, 2, 0, 1)
#bevelwidth
label = gtk.Label("Bevel width")
label.show()
entry = IntEntry(max = 2)
entry.connect("changed", self._cb_set_intvalue, "bevelwidth",
"layout")
entry.show()
table.attach(label, 0, 1, 1, 2)
table.attach(entry, 1, 2, 1, 2)
#transparency
transp = gtk.CheckButton("Transparent button background")
transp.set_active(self.data["transparency"])
transp.show()
transp.connect("toggled", self._cb_toggle_simple, "transparency",
"layout")
table.attach(transp, 1, 2, 2, 3)
#bgcolor
label = gtk.Label("Background color")
label.show()
colorsel = gimpui.ColorSelector()
if self.data["buttoncolor"]:
colorsel.set_pattern(self.data["bgcolor"])
colorsel.connect("color-changed", self._cb_set_color, "bgcolor",
"layout")
colorsel.show()
table.attach(label, 0, 1, 3, 4)
table.attach(colorsel, 1, 2, 3, 4)
page.pack_end(table)
def _addEffectsPage(self):
page = gtk.VBox(False, 5)
self.pages["effects"] = page
page.set_border_width(5)
page.show()
self.append_page(page)
self.set_page_title(page,
"Select the effect settings")
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
table = gtk.Table(rows=6, columns=2, homogeneous=False)
table.show()
#nova
novatoggle = gtk.CheckButton("Enable nova effect")
novatoggle.set_active(self.data["nova"])
novatoggle.show()
table.attach(novatoggle, 1, 2, 0, 1)
#novacolor
label = gtk.Label("Nova color")
label.show()
novacolor = gimpui.ColorSelector()
if self.data["novacolor"]:
novacolor.set_pattern(self.data["novacolor"])
novacolor.connect("color-changed", self._cb_set_color, "novacolor",
"effects")
novacolor.set_sensitive(self.data["nova"])
novacolor.show()
table.attach(label, 0, 1, 1, 2)
table.attach(novacolor, 1, 2, 1, 2)
#novaradius
novaradius = IntEntry(max = 2)
if self.data["novaradius"] is not None:
novaradius.set_text(str(self.data["novaradius"]))
novaradius.connect("changed", self._cb_set_intvalue, "novaradius",
"effects")
novaradius.set_sensitive(self.data["nova"])
novaradius.show()
table.attach(novaradius, 1, 2, 2, 3)
#novasparkles
novasparkles = IntEntry(max = 2)
if self.data["novasparkles"] is not None:
novasparkles.set_text(str(self.data["novasparkles"]))
novasparkles.connect("changed", self._cb_set_intvalue, "novasparkles",
"effects")
novasparkles.set_sensitive(self.data["nova"])
novasparkles.show()
table.attach(novasparkles, 1, 2, 3, 4)
novatoggle.connect("toggled", self._cb_nova_toggle, novacolor,
novaradius, novasparkles)
#glow
#glowcolor
page.pack_end(table)
def _addLastPage(self):
page = gtk.VBox(False, 5)
self.pages["output"] = page
page.set_border_width(5)
page.show()
self.append_page(page)
self.set_page_title(page,
"Output formats")
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONFIRM)
label = gtk.Label("Choose the output data.")
label.show()
page.pack_start(label)
#makejscript
toggle = gtk.CheckButton("Make HTML, CSS and JavaScript")
toggle.set_active(self.data["makejscript"])
toggle.connect("toggled", self._cb_toggle_simple, "makejscript",
"output")
toggle.show()
page.pack_start(toggle)
#makeinactive
toggle = gtk.CheckButton("Make inactive buttons")
toggle.set_active(self.data["makeinactive"])
toggle.connect("toggled", self._cb_toggle_simple, "makeinactive",
"output")
toggle.show()
page.pack_start(toggle)
#makeactive
toggle = gtk.CheckButton("Make active buttons")
toggle.set_active(self.data["makeactive"])
toggle.connect("toggled", self._cb_toggle_simple, "makeactive",
"output")
toggle.show()
page.pack_start(toggle)
#makepressed
toggle = gtk.CheckButton("Make pressed buttons")
toggle.set_active(self.data["makepressed"])
toggle.connect("toggled", self._cb_toggle_simple, "makepressed",
"output")
toggle.show()
page.pack_start(toggle)
#writexcf
toggle = gtk.CheckButton("Write the XCF file")
toggle.set_active(self.data["writexcf"])
toggle.connect("toggled", self._cb_toggle_simple, "writexcf",
"output")
toggle.show()
page.pack_start(toggle)
def checkcompletion(self, pagename):
logging.debug(str(self.data))
criteriamatched = False
if pagename == "pathselection":
criteriamatched = self.data["filename"] and self.data["outdir"]
elif pagename == "basicsettings":
criteriamatched = self.data["font"] and self.data["strcolor"] \
and ((self.data["usepattern"] and self.data["pattern"]) or \
(not self.data["usepattern"] and \
self.data["buttoncolor"]))
elif pagename == "layout":
criteriamatched = self.data["roundradius"] is not None and \
self.data["bevelwidth"] is not None and \
(self.data["transparency"] or self.data["bgcolor"] is not None)
elif pagename == "output":
criteriamatched = self.data["makejscript"] is not None and \
self.data["makeinactive"] is not None and \
self.data["makeactive"] is not None and \
self.data["makepressed"] is not None
if criteriamatched:
self.set_page_complete(self.pages[pagename], True)
else:
self.set_page_complete(self.pages[pagename], False)
def _cb_set_intvalue(self, w, fieldname, pagename):
try:
self.data[fieldname] = int (w.get_text())
except ValueError:
pass
self.checkcompletion(pagename)
def _cb_toggle_simple(self, w, datafield, pagename):
self.data[datafield] = w.get_active()
self.checkcompletion(pagename)
def _cb_file_selected(self, w, filesel):
self.data["filename"] = w.get_filename()
self.checkcompletion("pathselection")
def _cb_dir_selected(self, w, dirsel):
self.data["outdir"] = w.get_filename()
self.checkcompletion("pathselection")
def _cb_set_font(self, w):
self.data["font"] = w.get_font_name()
self.checkcompletion("basicsettings")
def _cb_set_color(self, w, fieldname, pagename):
self.data[fieldname] = w.get_color()
self.checkcompletion(pagename)
def _cb_set_pattern(self, w, patternname, width, height, bpp, mask_data,
finished):
if finished:
self.data["pattern"] = patternname
self.checkcompletion("basicsettings")
def _cb_bgtoggle_toggle(self, w, label, patterntext, patternsel,
colortext, colorsel):
if w.get_active():
self.data["usepattern"] = True
colorsel.hide()
patternsel.show()
label.set_text(patterntext)
else:
self.data["usepattern"] = False
patternsel.hide()
colorsel.show()
label.set_text(colortext)
self.checkcompletion("basicsettings")
def _cb_nova_toggle(self, w, colorfield, radiusfield, sparksfield):
if w.get_active():
self.data["nova"] = True
colorfield.set_sensitive(True)
radiusfield.set_sensitive(True)
sparksfield.set_sensitive(True)
else:
self.data["nova"] = False
colorfield.set_sensitive(False)
radiusfield.set_sensitive(False)
sparksfield.set_sensitive(False)
self.checkcompletion("effects")
class btn4wsplugin(gimpplugin.plugin): class btn4wsplugin(gimpplugin.plugin):
"""This is the btn4ws gimp plugin.""" """This is the btn4ws gimp plugin."""
def parsefont(font):
"""
Parses a font into its fontname and size parts.
"""
parts = font.split(" ")
return (" ".join(parts[:-1]), parts[-1])
def gimp2html_color(color): def gimp2html_color(color):
""" """
Converts a color tuple to a hex encoded color for CSS. Converts a color tuple to a hex encoded color for CSS.
@ -300,8 +693,18 @@ class btn4wsplugin(gimpplugin.plugin):
False, False, False, False, True) 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
def __init__(self):
self.data = {}
def btn4ws(self, runmode, filename = None, outdir = None, font = None, def btn4ws(self, runmode, filename = None, outdir = None, font = None,
strcolor = None, transparency = None, 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,
padding = None, glowsize = None, bevelwidth = None, padding = None, glowsize = None, bevelwidth = None,
@ -314,14 +717,28 @@ class btn4wsplugin(gimpplugin.plugin):
""" """
if runmode == RUN_INTERACTIVE: if runmode == RUN_INTERACTIVE:
logging.debug("runmode interactive") logging.debug("runmode interactive")
dialog = Btn4wsDialog(filename, outdir, font, strcolor, dialog = Btn4wsDialog(filename = filename, outdir = outdir,
transparency, bgcolor, glow, glowcolor, font = font, strcolor = strcolor,
usepattern, pattern, buttoncolor, transparency = transparency,
roundradius, padding, glowsize, bevelwidth, bgcolor = bgcolor, glow = glow,
nova, novasparkles, novaradius, novacolor, glowcolor = glowcolor,
writexcf, makeinactive, makeactive, usepattern = usepattern, pattern = pattern,
makepressed, makejscript) buttoncolor = buttoncolor,
dialog.main() 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: elif runmode == RUN_NONINTERACTIVE:
logging.debug("runmode noninteractive") logging.debug("runmode noninteractive")
elif runmode == RUN_WITH_LASTVALS: elif runmode == RUN_WITH_LASTVALS:

View file

@ -1,100 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygtk
pygtk.require('2.0')
import gtk
class AssistantTest:
def delete_event(self, widget, event, data = None):
return False
def destroy(self, widget, data = None):
gtk.main_quit()
def __init__(self):
self.data = {
"filename" : None,
"outputdir" : None}
self.ass = gtk.Assistant()
self.ass.connect("delete_event", self.delete_event)
self.ass.connect("close", self.destroy)
self.ass.connect("cancel", self.destroy)
# Construct page 0
label = gtk.Label("""Buttons for website allows you to produce a series of buttons for use on a website. On the next pages you may choose several options to change the content and the look of the buttons.""")
label.set_line_wrap(True)
label.show()
self.ass.append_page(label)
self.ass.set_page_title(label, "Introduction to buttons for website")
self.ass.set_page_type(label, gtk.ASSISTANT_PAGE_INTRO)
self.ass.set_page_complete(label, True)
# Construct page 1
self.page1 = gtk.VBox(False, 5)
self.page1.set_border_width(5)
self.page1.show()
self.ass.append_page(self.page1)
self.ass.set_page_title(self.page1,
"Select the input file and output directory")
self.ass.set_page_type(self.page1, gtk.ASSISTANT_PAGE_CONTENT)
label = gtk.Label("Please choose the file containing your button labels and the directory where the generated files should be put.")
label.set_line_wrap(True)
label.show()
self.page1.pack_start(label, True, True, 0)
table = gtk.Table(rows=2, columns=2, homogeneous=False)
table.show()
label = gtk.Label("Button label file")
label.show()
table.attach(label, 0, 1, 0, 1)
button = gtk.FileChooserButton("Choose file")
button.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
button.connect("selection-changed", self.cb_file_selected, button)
button.show()
table.attach(button, 1, 2, 0, 1)
label = gtk.Label("Output directory")
label.show()
table.attach(label, 0, 1, 1, 2)
button = gtk.FileChooserButton("Choose directory")
button.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
button.connect("selection-changed", self.cb_dir_selected, button)
button.show()
table.attach(button, 1, 2, 1, 2)
self.page1.pack_end(table)
# Construct page 2
label = gtk.Label('Thanks for using btn4ws')
label.set_line_wrap(True)
label.show()
self.ass.append_page(label)
self.ass.set_page_title(label, 'Page 1: The end')
self.ass.set_page_type(label, gtk.ASSISTANT_PAGE_SUMMARY)
self.ass.show()
def checkpage1completion(self):
print str(self.data)
if self.data["filename"] and self.data["outputdir"]:
self.ass.set_page_complete(self.page1, True)
else:
self.ass.set_page_complete(self.page1, False)
def cb_file_selected(self, w, filesel):
self.data["filename"] = filesel.get_filename()
self.checkpage1completion()
def cb_dir_selected(self, w, dirsel):
self.data["outputdir"] = dirsel.get_filename()
self.checkpage1completion()
def main(self):
gtk.main()
if __name__ == "__main__":
assi = AssistantTest()
assi.main()