~ubuntu-branches/ubuntu/lucid/system-config-printer/lucid-proposed

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
#!/usr/bin/env python

## Copyright (C) 2009 Tim Waugh <twaugh@redhat.com>
## Copyright (C) 2009 Red Hat, Inc.

## 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., 675 Mass Ave, Cambridge, MA 02139, USA.

import gtk
import cairo

class GtkInkLevel (gtk.DrawingArea):
    def __init__ (self, color, level=0):
        gtk.DrawingArea.__init__ (self)
        self.connect ('expose-event', self.expose_event)
        self._level = level
        try:
            self._color = gtk.gdk.color_parse (color)
        except (ValueError, TypeError):
            self._color = gtk.gdk.color_parse ('#cccccc')

        self.set_size_request (30, 45)

    def set_level (self, level):
        self._level = level
        self.queue_resize ()

    def get_level (self):
        return self._level

    def expose_event (self, widget, event):
        ctx = self.window.cairo_create ()
        ctx.rectangle (event.area.x, event.area.y,
                       event.area.width,
                       event.area.height)
        ctx.clip ()

        (w, h) = self.window.get_size ()
        ratio = 1.0 * h / w
        if ratio < 1.5:
            w = h * 2.0 / 3.0
        else:
            h = w * 3.0 / 2.0
        thickness = 1
        ctx.translate (thickness, thickness)
        ctx.scale (w - 2 * thickness, h - 2 * thickness)
        thickness = max (ctx.device_to_user_distance (thickness, thickness))
        ctx.set_line_width (thickness)
        self.draw (ctx)

    def draw (self, ctx):
        r = self._color.red / 65535.0
        g = self._color.green / 65535.0
        b = self._color.blue / 65535.0
        fill_point = self._level / 100.0

        ctx.move_to (0.5, 0.0)
        ctx.curve_to (0.5, 0.33, 1.0, 0.5, 1.0, 0.67)
        ctx.curve_to (1.0, 0.85, 0.85, 1.0, 0.5, 1.0)
        ctx.curve_to (0.15, 1.0, 0.0, 0.85, 0.0, 0.67)
        ctx.curve_to (0.0, 0.5, 0.1, 0.2, 0.5, 0.0)
        ctx.close_path ()
        ctx.set_source_rgb (r, g, b)
        ctx.stroke_preserve ()
        if fill_point > 0.0:
            grad_width = 0.10
            grad_start = fill_point - (grad_width / 2)
            if grad_start < 0:
                grad_start = 0

            pat = cairo.LinearGradient (0, 1, 0, 0)
            pat.add_color_stop_rgba (0, r, g, b, 1)
            pat.add_color_stop_rgba ((self._level - 5) / 100.0, r, g, b, 1)
            pat.add_color_stop_rgba ((self._level + 5)/ 100.0, 1, 1, 1, 1)
            pat.add_color_stop_rgba (1.0, 1, 1, 1, 1)
            ctx.set_source (pat)
            ctx.fill ()
        else:
            ctx.set_source_rgb (1, 1, 1)
            ctx.fill ()

if __name__ == '__main__':
    # Try it out.
    import gobject
    import time
    def adjust_level (level):
        l = level.get_level ()
        l += 1
        if l > 100:
            l = 0
        level.set_level (l)
        return True

    w = gtk.Window ()
    w.set_border_width (12)
    vbox = gtk.VBox (spacing=6)
    w.add (vbox)
    hbox = gtk.HBox (spacing=6)
    vbox.pack_start (hbox, False, False, 0)
    klevel = GtkInkLevel ("black", level=100)
    clevel = GtkInkLevel ("cyan", level=60)
    mlevel = GtkInkLevel ("magenta", level=30)
    ylevel = GtkInkLevel ("yellow", level=100)
    hbox.pack_start (klevel)
    hbox.pack_start (clevel)
    hbox.pack_start (mlevel)
    hbox.pack_start (ylevel)
    gobject.timeout_add (10, adjust_level, klevel)
    gobject.timeout_add (10, adjust_level, clevel)
    gobject.timeout_add (10, adjust_level, mlevel)
    gobject.timeout_add (10, adjust_level, ylevel)
    w.show_all ()
    w.connect ('delete_event', gtk.main_quit)
    gtk.main ()