《付録》exTetrimino3.py

# -*- coding: utf-8 -*-
#===============================================================================
#    Copyright (C) 2000-2008, 小泉ひよ子とタマゴ倶楽部
#
# Change History: Games
#    1988/05, Smalltalk
#    2004/09, Java
#    2005/02, C#
#    2005/03, Jython
# History: WPF examples
#    2008/01/25, IronPython 1.1.1 (download)
#    2008/08/22, IronPython 1.1.2 (download)
#    2008/03/16, ver.2.0, WPF
#    2008/00/00, ver.2.1, IronPython 1.1.2 
#===============================================================================
from _ant import *
from System.Windows import *
from System.Windows.Controls import *
from System.Windows.Input import *

from Tetrimino3 import *
## --------------------
class TestCase:
    types = "COpbYZLIJS"

    def __iter__(self):
        m = self.items()
        for e in self.types:
            yield e, m[e]

    def items(self):
        return dict((e, eval("Tetrimino%s(4, 4)"%e.upper()))
            for e in self.types)

## --------------------               
class ExWindow(Window):
    def __init__(self, Content=None, **args):
        self.InitializeComponent(Content)
        self.init()

    def InitializeComponent(self, Content):
        self.Content = LoadXaml(Content)

    def _Controls(self, target):
        controls = xaml_controls(self)
        for e in target:
            setattr(self, e, controls[e])

    def init(self):
        target = "tabControl", "button",
        self._Controls(target)

        self.items = {}
        for e, mino in TestCase():
            tray = Tray()
            mino.tray = tray

            self.items[e] = mino
            item = TabItem(Header=e)
            self.tabControl.Items.Add(item)            
            panel = Canvas()
            item.Content = panel
            self.addTray(panel, tray)
            self.addMino(panel, mino)
            
        self.tabControl.SelectionChanged += self.selectionChanged
        self.button.Click += self.click
        self.KeyDown += self.keyDown

    def addTray(self, panel, tray):
        for k, tile in tray.leftEdges.items():
            panel.Children.Add(tile.shape)
        for k, tile in tray.rightEdges.items():
            panel.Children.Add(tile.shape)
        for k, tile in tray.tiles.items():
            panel.Children.Add(tile.shape)

    ## --------------------               
    def addMino(self, panel, mino):
        for e in mino.shape:
            panel.Children.Add(e)

    def selectionChanged(self, sender, e):
        self.mino = self.items[sender.SelectedItem.Header]
        self.button.Content = self.state()

    def click(self, sender, e):
        self.mino.rotateClockwise()
        sender.Content = self.state()

    def keyDown(self, sender, e):
        KeyValues(e.Key).switch({
            Key.Right: self.mino.shiftRight,
            Key.Left : self.mino.shiftLeft,
            Key.Up   : self.mino.counterClockwise,
            Key.Down : self.mino.rotateClockwise ,
            })
        self.button.Content = self.state()
        
    def state(self):
        return "Type-%s: rotation = %d"%(
            self.mino.__class__.__name__[-1], self.mino.phase)

class KeyValues:
    def __init__(self, value):
        self.value = value

    def switch(self, cases):
        for key, f in cases.items():
            if key == self.value:
                f()

## --------------------               
if __name__ == "__main__":
    import sys
    xaml = sys.argv[1]
    win = ExWindow(
        Title=__file__,
        Width=234, Height=230,
        Content=xaml,
        )
    Application().Run(win)

## --------------------