python-2.5.2/win32/Tools/pynche/Main.py
changeset 0 ae805ac0140d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python-2.5.2/win32/Tools/pynche/Main.py	Fri Apr 03 17:19:34 2009 +0100
@@ -0,0 +1,229 @@
+"""Pynche -- The PYthon Natural Color and Hue Editor.
+
+Contact: %(AUTHNAME)s
+Email:   %(AUTHEMAIL)s
+Version: %(__version__)s
+
+Pynche is based largely on a similar color editor I wrote years ago for the
+SunView window system.  That editor was called ICE: the Interactive Color
+Editor.  I'd always wanted to port the editor to X but didn't feel like
+hacking X and C code to do it.  Fast forward many years, to where Python +
+Tkinter provides such a nice programming environment, with enough power, that
+I finally buckled down and implemented it.  I changed the name because these
+days, too many other systems have the acronym `ICE'.
+
+This program currently requires Python 2.2 with Tkinter.
+
+Usage: %(PROGRAM)s [-d file] [-i file] [-X] [-v] [-h] [initialcolor]
+
+Where:
+    --database file
+    -d file
+        Alternate location of a color database file
+
+    --initfile file
+    -i file
+        Alternate location of the initialization file.  This file contains a
+        persistent database of the current Pynche options and color.  This
+        means that Pynche restores its option settings and current color when
+        it restarts, using this file (unless the -X option is used).  The
+        default is ~/.pynche
+
+    --ignore
+    -X
+        Ignore the initialization file when starting up.  Pynche will still
+        write the current option settings to this file when it quits.
+
+    --version
+    -v
+        print the version number and exit
+
+    --help
+    -h
+        print this message
+
+    initialcolor
+        initial color, as a color name or #RRGGBB format
+"""
+
+__version__ = '1.4.1'
+
+import sys
+import os
+import getopt
+import ColorDB
+
+from PyncheWidget import PyncheWidget
+from Switchboard import Switchboard
+from StripViewer import StripViewer
+from ChipViewer import ChipViewer
+from TypeinViewer import TypeinViewer
+
+
+
+PROGRAM = sys.argv[0]
+AUTHNAME = 'Barry Warsaw'
+AUTHEMAIL = 'barry@python.org'
+
+# Default locations of rgb.txt or other textual color database
+RGB_TXT = [
+    # Solaris OpenWindows
+    '/usr/openwin/lib/rgb.txt',
+    # Linux
+    '/usr/lib/X11/rgb.txt',
+    # The X11R6.4 rgb.txt file
+    os.path.join(sys.path[0], 'X/rgb.txt'),
+    # add more here
+    ]
+
+
+
+# Do this because PyncheWidget.py wants to get at the interpolated docstring
+# too, for its Help menu.
+def docstring():
+    return __doc__ % globals()
+
+
+def usage(code, msg=''):
+    print docstring()
+    if msg:
+        print msg
+    sys.exit(code)
+
+
+
+def initial_color(s, colordb):
+    # function called on every color
+    def scan_color(s, colordb=colordb):
+        try:
+            r, g, b = colordb.find_byname(s)
+        except ColorDB.BadColor:
+            try:
+                r, g, b = ColorDB.rrggbb_to_triplet(s)
+            except ColorDB.BadColor:
+                return None, None, None
+        return r, g, b
+    #
+    # First try the passed in color
+    r, g, b = scan_color(s)
+    if r is None:
+        # try the same color with '#' prepended, since some shells require
+        # this to be escaped, which is a pain
+        r, g, b = scan_color('#' + s)
+    if r is None:
+        print 'Bad initial color, using gray50:', s
+        r, g, b = scan_color('gray50')
+    if r is None:
+        usage(1, 'Cannot find an initial color to use')
+        # does not return
+    return r, g, b
+
+
+
+def build(master=None, initialcolor=None, initfile=None, ignore=None,
+          dbfile=None):
+    # create all output widgets
+    s = Switchboard(not ignore and initfile)
+    # defer to the command line chosen color database, falling back to the one
+    # in the .pynche file.
+    if dbfile is None:
+        dbfile = s.optiondb().get('DBFILE')
+    # find a parseable color database
+    colordb = None
+    files = RGB_TXT[:]
+    if dbfile is None:
+        dbfile = files.pop()
+    while colordb is None:
+        try:
+            colordb = ColorDB.get_colordb(dbfile)
+        except (KeyError, IOError):
+            pass
+        if colordb is None:
+            if not files:
+                break
+            dbfile = files.pop(0)
+    if not colordb:
+        usage(1, 'No color database file found, see the -d option.')
+    s.set_colordb(colordb)
+
+    # create the application window decorations
+    app = PyncheWidget(__version__, s, master=master)
+    w = app.window()
+
+    # these built-in viewers live inside the main Pynche window
+    s.add_view(StripViewer(s, w))
+    s.add_view(ChipViewer(s, w))
+    s.add_view(TypeinViewer(s, w))
+
+    # get the initial color as components and set the color on all views.  if
+    # there was no initial color given on the command line, use the one that's
+    # stored in the option database
+    if initialcolor is None:
+        optiondb = s.optiondb()
+        red = optiondb.get('RED')
+        green = optiondb.get('GREEN')
+        blue = optiondb.get('BLUE')
+        # but if there wasn't any stored in the database, use grey50
+        if red is None or blue is None or green is None:
+            red, green, blue = initial_color('grey50', colordb)
+    else:
+        red, green, blue = initial_color(initialcolor, colordb)
+    s.update_views(red, green, blue)
+    return app, s
+
+
+def run(app, s):
+    try:
+        app.start()
+    except KeyboardInterrupt:
+        pass
+
+
+
+def main():
+    try:
+        opts, args = getopt.getopt(
+            sys.argv[1:],
+            'hd:i:Xv',
+            ['database=', 'initfile=', 'ignore', 'help', 'version'])
+    except getopt.error, msg:
+        usage(1, msg)
+
+    if len(args) == 0:
+        initialcolor = None
+    elif len(args) == 1:
+        initialcolor = args[0]
+    else:
+        usage(1)
+
+    ignore = False
+    dbfile = None
+    initfile = os.path.expanduser('~/.pynche')
+    for opt, arg in opts:
+        if opt in ('-h', '--help'):
+            usage(0)
+        elif opt in ('-v', '--version'):
+            print """\
+Pynche -- The PYthon Natural Color and Hue Editor.
+Contact: %(AUTHNAME)s
+Email:   %(AUTHEMAIL)s
+Version: %(__version__)s""" % globals()
+            sys.exit(0)
+        elif opt in ('-d', '--database'):
+            dbfile = arg
+        elif opt in ('-X', '--ignore'):
+            ignore = True
+        elif opt in ('-i', '--initfile'):
+            initfile = arg
+
+    app, sb = build(initialcolor=initialcolor,
+                    initfile=initfile,
+                    ignore=ignore,
+                    dbfile=dbfile)
+    run(app, sb)
+    sb.save_views()
+
+
+
+if __name__ == '__main__':
+    main()