Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/view/ClipboardBubble.py
blob: 62b16a9d8382ea7328fb1d8837fdc6fd5556b51a (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# Copyright (C) 2007, One Laptop Per Child
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA


#TODO: has to be merged with all the existing bubbles in a generic progress bar widget

import math

import gobject
import gtk
import hippo

from sugar.graphics import units

class ClipboardBubble(hippo.CanvasBox, hippo.CanvasItem):
    __gtype_name__ = 'ClipboardBubble'

    __gproperties__ = {
        'fill-color': (object, None, None,
                      gobject.PARAM_READWRITE),
        'stroke-color': (object, None, None,
                      gobject.PARAM_READWRITE),
        'progress-color': (object, None, None,
                      gobject.PARAM_READWRITE),
        'percent'   : (object, None, None,
                      gobject.PARAM_READWRITE),
    }

    def __init__(self, **kwargs):
        self._stroke_color = 0xFFFFFFFF
        self._fill_color = 0xFFFFFFFF
        self._progress_color = 0x000000FF
        self._percent = 0
        self._radius = units.points_to_pixels(3)

        hippo.CanvasBox.__init__(self, **kwargs)

    def do_set_property(self, pspec, value):
        if pspec.name == 'fill-color':
            self._fill_color = value
            self.emit_paint_needed(0, 0, -1, -1)
        elif pspec.name == 'stroke-color':
            self._stroke_color = value
            self.emit_paint_needed(0, 0, -1, -1)
        elif pspec.name == 'progress-color':
            self._progress_color = value
            self.emit_paint_needed(0, 0, -1, -1)
        elif pspec.name == 'percent':
            self._percent = value
            self.emit_paint_needed(0, 0, -1, -1)

    def do_get_property(self, pspec):
        if pspec.name == 'fill-color':
            return self._fill_color
        elif pspec.name == 'stroke-color':
            return self._stroke_color
        elif pspec.name == 'progress-color':
            return self._progress_color
        elif pspec.name == 'percent':
            return self._percent

    def _int_to_rgb(self, int_color):
        red = (int_color >> 24) & 0x000000FF
        green = (int_color >> 16) & 0x000000FF
        blue = (int_color >> 8) & 0x000000FF
        alpha = int_color & 0x000000FF
        return (red / 255.0, green / 255.0, blue / 255.0)

    def do_paint_below_children(self, cr, damaged_box):
        [width, height] = self.get_allocation()

        line_width = 3.0
        x = line_width
        y = line_width
        width -= line_width * 2
        height -= line_width * 2

        cr.move_to(x + self._radius, y);
        cr.arc(x + width - self._radius, y + self._radius,
               self._radius, math.pi * 1.5, math.pi * 2);
        cr.arc(x + width - self._radius, x + height - self._radius,
               self._radius, 0, math.pi * 0.5);
        cr.arc(x + self._radius, y + height - self._radius,
               self._radius, math.pi * 0.5, math.pi);
        cr.arc(x + self._radius, y + self._radius, self._radius,
               math.pi, math.pi * 1.5);

        color = self._int_to_rgb(self._fill_color)
        cr.set_source_rgb(*color)
        cr.fill_preserve();

        color = self._int_to_rgb(self._stroke_color)
        cr.set_source_rgb(*color)
        cr.set_line_width(line_width)
        cr.stroke();

        if self._percent > 0:
            self._paint_progress_bar(cr, x, y, width, height, line_width)

    def _paint_progress_bar(self, cr, x, y, width, height, line_width):
        prog_x = x + line_width
        prog_y = y + line_width
        prog_width = (width - (line_width * 2)) * (self._percent / 100.0)
        prog_height = (height - (line_width * 2))

        x = prog_x
        y = prog_y
        width = prog_width
        height = prog_height

        cr.move_to(x + self._radius, y);
        cr.arc(x + width - self._radius, y + self._radius,
               self._radius, math.pi * 1.5, math.pi * 2);
        cr.arc(x + width - self._radius, x + height - self._radius,
               self._radius, 0, math.pi * 0.5);
        cr.arc(x + self._radius, y + height - self._radius,
               self._radius, math.pi * 0.5, math.pi);
        cr.arc(x + self._radius, y + self._radius, self._radius,
               math.pi, math.pi * 1.5);

        color = self._int_to_rgb(self._progress_color)
        cr.set_source_rgb(*color)
        cr.fill_preserve();