symbian-qemu-0.9.1-12/python-win32-2.6.1/Tools/pynche/DetailsViewer.py
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/python-win32-2.6.1/Tools/pynche/DetailsViewer.py	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,273 @@
+"""DetailsViewer class.
+
+This class implements a pure input window which allows you to meticulously
+edit the current color.  You have both mouse control of the color (via the
+buttons along the bottom row), and there are keyboard bindings for each of the
+increment/decrement buttons.
+
+The top three check buttons allow you to specify which of the three color
+variations are tied together when incrementing and decrementing.  Red, green,
+and blue are self evident.  By tying together red and green, you can modify
+the yellow level of the color.  By tying together red and blue, you can modify
+the magenta level of the color.  By tying together green and blue, you can
+modify the cyan level, and by tying all three together, you can modify the
+grey level.
+
+The behavior at the boundaries (0 and 255) are defined by the `At boundary'
+option menu:
+
+    Stop
+        When the increment or decrement would send any of the tied variations
+        out of bounds, the entire delta is discarded.
+
+    Wrap Around
+        When the increment or decrement would send any of the tied variations
+        out of bounds, the out of bounds variation is wrapped around to the
+        other side.  Thus if red were at 238 and 25 were added to it, red
+        would have the value 7.
+
+    Preseve Distance
+        When the increment or decrement would send any of the tied variations
+        out of bounds, all tied variations are wrapped as one, so as to
+        preserve the distance between them.  Thus if green and blue were tied,
+        and green was at 238 while blue was at 223, and an increment of 25
+        were applied, green would be at 15 and blue would be at 0.
+
+    Squash
+        When the increment or decrement would send any of the tied variations
+        out of bounds, the out of bounds variation is set to the ceiling of
+        255 or floor of 0, as appropriate.  In this way, all tied variations
+        are squashed to one edge or the other.
+
+The following key bindings can be used as accelerators.  Note that Pynche can
+fall behind if you hold the key down as a key repeat:
+
+Left arrow == -1
+Right arrow == +1
+
+Control + Left == -10
+Control + Right == 10
+
+Shift + Left == -25
+Shift + Right == +25
+"""
+
+from Tkinter import *
+
+STOP = 'Stop'
+WRAP = 'Wrap Around'
+RATIO = 'Preserve Distance'
+GRAV = 'Squash'
+
+ADDTOVIEW = 'Details Window...'
+
+
+class DetailsViewer:
+    def __init__(self, switchboard, master=None):
+        self.__sb = switchboard
+        optiondb = switchboard.optiondb()
+        self.__red, self.__green, self.__blue = switchboard.current_rgb()
+        # GUI
+        root = self.__root = Toplevel(master, class_='Pynche')
+        root.protocol('WM_DELETE_WINDOW', self.withdraw)
+        root.title('Pynche Details Window')
+        root.iconname('Pynche Details Window')
+        root.bind('<Alt-q>', self.__quit)
+        root.bind('<Alt-Q>', self.__quit)
+        root.bind('<Alt-w>', self.withdraw)
+        root.bind('<Alt-W>', self.withdraw)
+        # accelerators
+        root.bind('<KeyPress-Left>', self.__minus1)
+        root.bind('<KeyPress-Right>', self.__plus1)
+        root.bind('<Control-KeyPress-Left>', self.__minus10)
+        root.bind('<Control-KeyPress-Right>', self.__plus10)
+        root.bind('<Shift-KeyPress-Left>', self.__minus25)
+        root.bind('<Shift-KeyPress-Right>', self.__plus25)
+        #
+        # color ties
+        frame = self.__frame = Frame(root)
+        frame.pack(expand=YES, fill=X)
+        self.__l1 = Label(frame, text='Move Sliders:')
+        self.__l1.grid(row=1, column=0, sticky=E)
+        self.__rvar = IntVar()
+        self.__rvar.set(optiondb.get('RSLIDER', 4))
+        self.__radio1 = Checkbutton(frame, text='Red',
+                                    variable=self.__rvar,
+                                    command=self.__effect,
+                                    onvalue=4, offvalue=0)
+        self.__radio1.grid(row=1, column=1, sticky=W)
+        self.__gvar = IntVar()
+        self.__gvar.set(optiondb.get('GSLIDER', 2))
+        self.__radio2 = Checkbutton(frame, text='Green',
+                                    variable=self.__gvar,
+                                    command=self.__effect,
+                                    onvalue=2, offvalue=0)
+        self.__radio2.grid(row=2, column=1, sticky=W)
+        self.__bvar = IntVar()
+        self.__bvar.set(optiondb.get('BSLIDER', 1))
+        self.__radio3 = Checkbutton(frame, text='Blue',
+                                    variable=self.__bvar,
+                                    command=self.__effect,
+                                    onvalue=1, offvalue=0)
+        self.__radio3.grid(row=3, column=1, sticky=W)
+        self.__l2 = Label(frame)
+        self.__l2.grid(row=4, column=1, sticky=W)
+        self.__effect()
+        #
+        # Boundary behavior
+        self.__l3 = Label(frame, text='At boundary:')
+        self.__l3.grid(row=5, column=0, sticky=E)
+        self.__boundvar = StringVar()
+        self.__boundvar.set(optiondb.get('ATBOUND', STOP))
+        self.__omenu = OptionMenu(frame, self.__boundvar,
+                                  STOP, WRAP, RATIO, GRAV)
+        self.__omenu.grid(row=5, column=1, sticky=W)
+        self.__omenu.configure(width=17)
+        #
+        # Buttons
+        frame = self.__btnframe = Frame(frame)
+        frame.grid(row=0, column=0, columnspan=2, sticky='EW')
+        self.__down25 = Button(frame, text='-25',
+                               command=self.__minus25)
+        self.__down10 = Button(frame, text='-10',
+                               command=self.__minus10)
+        self.__down1 = Button(frame, text='-1',
+                              command=self.__minus1)
+        self.__up1 = Button(frame, text='+1',
+                            command=self.__plus1)
+        self.__up10 = Button(frame, text='+10',
+                             command=self.__plus10)
+        self.__up25 = Button(frame, text='+25',
+                             command=self.__plus25)
+        self.__down25.pack(expand=YES, fill=X, side=LEFT)
+        self.__down10.pack(expand=YES, fill=X, side=LEFT)
+        self.__down1.pack(expand=YES, fill=X, side=LEFT)
+        self.__up1.pack(expand=YES, fill=X, side=LEFT)
+        self.__up10.pack(expand=YES, fill=X, side=LEFT)
+        self.__up25.pack(expand=YES, fill=X, side=LEFT)
+
+    def __effect(self, event=None):
+        tie = self.__rvar.get() + self.__gvar.get() + self.__bvar.get()
+        if tie in (0, 1, 2, 4):
+            text = ''
+        else:
+            text = '(= %s Level)' % {3: 'Cyan',
+                                     5: 'Magenta',
+                                     6: 'Yellow',
+                                     7: 'Grey'}[tie]
+        self.__l2.configure(text=text)
+
+    def __quit(self, event=None):
+        self.__root.quit()
+
+    def withdraw(self, event=None):
+        self.__root.withdraw()
+
+    def deiconify(self, event=None):
+        self.__root.deiconify()
+
+    def __minus25(self, event=None):
+        self.__delta(-25)
+
+    def __minus10(self, event=None):
+        self.__delta(-10)
+
+    def __minus1(self, event=None):
+        self.__delta(-1)
+
+    def __plus1(self, event=None):
+        self.__delta(1)
+
+    def __plus10(self, event=None):
+        self.__delta(10)
+
+    def __plus25(self, event=None):
+        self.__delta(25)
+
+    def __delta(self, delta):
+        tie = []
+        if self.__rvar.get():
+            red = self.__red + delta
+            tie.append(red)
+        else:
+            red = self.__red
+        if self.__gvar.get():
+            green = self.__green + delta
+            tie.append(green)
+        else:
+            green = self.__green
+        if self.__bvar.get():
+            blue = self.__blue + delta
+            tie.append(blue)
+        else:
+            blue = self.__blue
+        # now apply at boundary behavior
+        atbound = self.__boundvar.get()
+        if atbound == STOP:
+            if red < 0 or green < 0 or blue < 0 or \
+               red > 255 or green > 255 or blue > 255:
+                # then
+                red, green, blue = self.__red, self.__green, self.__blue
+        elif atbound == WRAP or (atbound == RATIO and len(tie) < 2):
+            if red < 0:
+                red += 256
+            if green < 0:
+                green += 256
+            if blue < 0:
+                blue += 256
+            if red > 255:
+                red -= 256
+            if green > 255:
+                green -= 256
+            if blue > 255:
+                blue -= 256
+        elif atbound == RATIO:
+            # for when 2 or 3 colors are tied together
+            dir = 0
+            for c in tie:
+                if c < 0:
+                    dir = -1
+                elif c > 255:
+                    dir = 1
+            if dir == -1:
+                delta = max(tie)
+                if self.__rvar.get():
+                    red = red + 255 - delta
+                if self.__gvar.get():
+                    green = green + 255 - delta
+                if self.__bvar.get():
+                    blue = blue + 255 - delta
+            elif dir == 1:
+                delta = min(tie)
+                if self.__rvar.get():
+                    red = red - delta
+                if self.__gvar.get():
+                    green = green - delta
+                if self.__bvar.get():
+                    blue = blue - delta
+        elif atbound == GRAV:
+            if red < 0:
+                red = 0
+            if green < 0:
+                green = 0
+            if blue < 0:
+                blue = 0
+            if red > 255:
+                red = 255
+            if green > 255:
+                green = 255
+            if blue > 255:
+                blue = 255
+        self.__sb.update_views(red, green, blue)
+        self.__root.update_idletasks()
+
+    def update_yourself(self, red, green, blue):
+        self.__red = red
+        self.__green = green
+        self.__blue = blue
+
+    def save_options(self, optiondb):
+        optiondb['RSLIDER'] = self.__rvar.get()
+        optiondb['GSLIDER'] = self.__gvar.get()
+        optiondb['BSLIDER'] = self.__bvar.get()
+        optiondb['ATBOUND'] = self.__boundvar.get()