Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/libccc/0.0.4/python/demo/fifteen_grid.py
blob: e459e33c1207b6ee5b419ccd81bb1bb58f44734a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

try:
    import cccanvas
except:
    import sys
    sys.path.insert(0,"./../.libs/")
    import cccanvas

import fifteen_item

import random
import gtk
import pango

TILE_SIZE = 50.0

class FifteenGrid(cccanvas.Rectangle):
    def __init__(self, font_desc):
        global TITLE_SIZE 
        cccanvas.Rectangle.__init__(self)
        self.elements = []
        self.font_description = font_desc

        color = cccanvas.color_new_rgb(0,0,0)
        brush = cccanvas.BrushColor(color)

        self.set_brush_border (brush)

        self.set_position (0.0, 0.0, 4*TILE_SIZE, 4*TILE_SIZE)
        
        self.set_grid_aligned(True)

        for i in range(15):
            self.elements.append(fifteen_item.FifteenItem(i+1))

            self.elements[i].set_grid_aligned(True)
            self.elements[i].set_brush_border (brush)
            self.append(self.elements[i])
            
            self.elements[i].move(i, TILE_SIZE)

            self.elements[i].connect("button-press-event", self.fg_element_clicked)
            self.elements[i].set_font(self.font_description)
            

        self.elements.append(None)

    def fg_position (self, item):
        for i in range(16):
            if self.elements[i] == item:
                return i
            
        return False

    def fg_element_clicked(self, item, view, event):
        can_move = False
        direction = None

        move_value = { gtk.DIR_UP    : -4,
                       gtk.DIR_RIGHT :  1,
                       gtk.DIR_DOWN  :  4,
                       gtk.DIR_LEFT  : -1 }

        i = self.fg_position(item)

        if ( i%4 and not self.elements[i-1]):
            can_move = True
            direction = gtk.DIR_LEFT;
        elif ((i%4 < 3) and  not self.elements[i+1]):
            can_move = True
            direction = gtk.DIR_RIGHT
        elif ((i/4 > 0) and not self.elements[i-4]):
            can_move = True
            direction = gtk.DIR_UP
        elif ((i/4 < 3) and not self.elements[i+4]):
            can_move = True
            direction = gtk.DIR_DOWN

        if (can_move):
            new_i = i + move_value[direction]
            
            self.elements[new_i] = item
            self.elements[i] = None

            item.move(new_i, TILE_SIZE)
            

        return (not can_move)
    
    def scramble(self):
        global TILE_SIZE
        elements = {};
        
        for i in range(16, 0, -1):
            picked = random.randint(0,i-1)
            elements[i-1] = self.elements[picked]
            self.elements[picked] = self.elements[i-1]

        for i in range(16):
            self.elements[i] = elements[i]
            if (elements[i]):
                elements[i].move(i, TILE_SIZE)