Ticket #378: pieces_test.py

File pieces_test.py, 6.1 KB (added by s0undt3ch, 13 years ago)

Small test which muliplies the data available by 100, like show on the previsous screenshot attachment

Line 
1# -*- coding: utf-8 -*-
2"""
3    pieces_test
4    ~~~~~~~
5
6
7    :copyright: © 2011 UfSoft.org - :email:`Pedro Algarvio (pedro@algarvio.me)`
8    :license: BSD, see LICENSE for more details.
9"""
10import pygtk
11pygtk.require('2.0')
12import gtk
13
14class PiecesBar(gtk.DrawingArea):
15    # Draw in response to an expose-event
16    __gsignals__ = { "expose-event": "override" }
17
18    def __init__(self):
19        gtk.DrawingArea.__init__(self)
20        self.width = 0
21        self.height = 0
22        self.pieces = []
23        self.colors = {}
24
25        self.connect('size-allocate', self.on_size_allocate)
26        self.connect('realize', self.on_realize)
27
28        self.show()
29
30    def on_realize(self, widget):
31        map = widget.get_colormap()
32        done_color = map.alloc_color("#4883b5", True, True)
33        down_color = map.alloc_color("#fff600", True, True)
34        wait_color = map.alloc_color("#3dff58", True, True)
35        miss_color = map.alloc_color("#ff0000", True, True)
36        outline_color = map.alloc_color("#888888")
37
38        self.colors = {
39            0: (miss_color.red/65535.0, miss_color.green/65535.0, miss_color.blue/65535.0),
40            1: (wait_color.red/65535.0, wait_color.green/65535.0, wait_color.blue/65535.0),
41            2: (down_color.red/65535.0, down_color.green/65535.0, down_color.blue/65535.0),
42            3: (done_color.red/65535.0, done_color.green/65535.0, done_color.blue/65535.0),
43        }
44        self.gc_outline = widget.window.new_gc(foreground=outline_color)
45
46    def on_size_allocate(self, widget, size):
47        self.width = size.width
48        self.height = size.height
49
50    # Handle the expose-event by drawing
51    def do_expose_event(self, event=None):
52
53        num_pieces = len(self.pieces)
54
55        if num_pieces < 1:
56            self.clear()
57            return None
58
59        # Create the cairo context
60        cr = self.window.cairo_create()
61        # Restrict Cairo to the exposed area; avoid extra work
62        if event:
63            cr.rectangle(event.area.x, event.area.y,
64                         event.area.width, event.area.height)
65            cr.clip()
66
67        # Fill the background
68        cr.set_source_rgb(136, 136, 136)
69        cr.rectangle(0, 0, self.width-1, self.height-1)
70        cr.fill()
71
72        width = self.width - 2
73        pieces = self.collapse_pieces()
74
75        start_pos = 1
76
77        for state, wpercent in pieces:
78            pwidth = width*wpercent
79            cr.set_source_rgb(*self.colors[state])
80            cr.rectangle(start_pos, 1, pwidth, self.height-2)
81            cr.fill()
82            start_pos += pwidth
83
84    def collapse_pieces(self):
85        num_pieces = len(self.pieces)*1.0
86        opieces = self.pieces[:]
87        npieces = []
88        v = None
89        n = None
90        while True:
91            if not opieces:
92                break
93            if v is None:
94                v = opieces.pop(0)
95                n = 1
96            else:
97                vv = opieces.pop(0)
98                if v == vv:
99                    n += 1
100                else:
101                    npieces.append((v, n/num_pieces))
102                    v = vv
103                    n = 1
104        return npieces
105
106    def draw_piece(self, piece, start_x, start_y, width, height):
107        self.window.draw_rectangle(
108            self.colors[piece], True, start_x, start_y, width, height
109        )
110
111    def clear(self):
112        self.pieces = [0]
113        self.update()
114
115    def get_text(self):
116        return ""
117
118    def set_text(self, text):
119        pass
120
121pieces = PiecesBar()
122pieces.pieces = [3, 2, 1, 1, 1, 0, 0, 2, 0, 1, 0, 2, 2, 2, 1, 2, 2, 0, 0, 0, 2,
123                 1, 1, 1, 2, 0, 0, 2, 2, 1, 0, 2, 1, 0, 1, 1, 0, 3, 3, 3, 3, 3,
124                 3, 3, 0, 3, 3, 0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 1]*100
125
126window = gtk.Window(gtk.WINDOW_TOPLEVEL)
127window.set_default_size(500, 200)
128def destroy(widget, data=None):
129    gtk.main_quit()
130window.connect("destroy", destroy)
131vbox = gtk.VBox()
132vbox.add(pieces)
133
134hbox1 = gtk.HBox()
135hbox1.pack_start(gtk.Label("Missing:"), False, False)
136missing_color = gtk.ColorButton(window.get_colormap().alloc_color("#ff0000", True, True))
137def on_missing_collor_changed(button):
138    color = button.get_color()
139    r, g, b = color.red, color.green, color.blue
140    pieces.colors[0] = r/65535.0, g/65535.0, b/65535.0
141    print 'Miss color RGB', pieces.colors[0]
142    pieces.do_expose_event()
143missing_color.connect("color-set", on_missing_collor_changed)
144hbox1.pack_start(missing_color, False, False)
145vbox.pack_start(hbox1, False, False)
146
147hbox2 = gtk.HBox()
148hbox2.pack_start(gtk.Label("Waiting:"), False, False)
149waiting_color = gtk.ColorButton(window.get_colormap().alloc_color("#3dff58", True, True))
150def on_waiting_collor_changed(button):
151    color = button.get_color()
152    r, g, b = color.red, color.green, color.blue
153    pieces.colors[1] = r/65535.0, g/65535.0, b/65535.0
154    print 'Wait color RGB', pieces.colors[1]
155    pieces.do_expose_event()
156waiting_color.connect("color-set", on_waiting_collor_changed)
157hbox2.pack_start(waiting_color, False, False)
158vbox.pack_start(hbox2, False, False)
159
160hbox3 = gtk.HBox()
161hbox3.pack_start(gtk.Label("Downloading:"), False, False)
162down_color = gtk.ColorButton(window.get_colormap().alloc_color("#fff600", True, True))
163def on_down_collor_changed(button):
164    color = button.get_color()
165    r, g, b = color.red, color.green, color.blue
166    pieces.colors[2] = r/65535.0, g/65535.0, b/65535.0
167    print 'Down color RGB', pieces.colors[2]
168    pieces.do_expose_event()
169down_color.connect("color-set", on_down_collor_changed)
170hbox3.pack_start(down_color, False, False)
171vbox.pack_start(hbox3, False, False)
172
173hbox4 = gtk.HBox()
174hbox4.pack_start(gtk.Label("Completed:"), False, False)
175done_color = gtk.ColorButton(window.get_colormap().alloc_color("#4883b5", True, True))
176def on_done_collor_changed(button):
177    color = button.get_color()
178    r, g, b = color.red, color.green, color.blue
179    pieces.colors[3] = r/65535.0, g/65535.0, b/65535.0
180    print 'Done color RGB', pieces.colors[3]
181    pieces.do_expose_event()
182done_color.connect("color-set", on_done_collor_changed)
183hbox4.pack_start(done_color, False, False)
184vbox.pack_start(hbox4, False, False)
185
186window.add(vbox)
187window.show_all()
188gtk.main()
189