eb3f29156bb4dab50c3273923a83614dd18f8efa
[mussorgsky] / src / fancy_button.py
1 import gtk
2 import gobject
3
4 BUTTON_HILIGHT_FILE_NAME = "/etc/hildon/theme/mediaplayer/Button.png"
5
6 fancy_button_highlight_pb = None
7
8 class FancyButton (gtk.EventBox):
9
10     __gsignals__ = {
11         'clicked': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ())
12     }
13
14     def __init__ (self, image, text):
15         gtk.EventBox.__init__ (self)
16
17         self.pressed = False
18
19         vbox = gtk.VBox ()
20         self.image = image
21         self.label = gtk.Label (text)
22
23         align = gtk.Alignment (xalign=0.5, yalign=0.5)
24         align.add (self.image)
25
26         vbox.pack_start (align, expand=False, fill=False)
27         vbox.pack_start (self.label, expand=False, fill=False)
28
29         self.add (vbox)
30         self.set_visible_window (False)
31         self.set_above_child (True)
32
33         self.connect ("button-press-event", self.custom_button_press_event)
34         self.connect ("button-release-event", self.custom_button_release_event)
35         self.connect ("enter-notify-event", self.custom_enter_notify_event)
36         self.connect ("leave-notify-event", self.custom_leave_notify_event)
37         self.image.connect ("expose-event", self.image_expose_event)
38         
39         
40     def custom_button_press_event (self, p, q):
41         self.image.set_state (gtk.STATE_ACTIVE)
42         self.pressed = True
43         print "OK"
44
45     def custom_button_release_event (self, p, q):
46
47         if (self.pressed and self.image.state  == gtk.STATE_ACTIVE):
48             self.emit ("clicked")
49
50         self.image.set_state (gtk.STATE_NORMAL)
51         self.pressed = False
52
53     def custom_enter_notify_event (self, p, q):
54         if (self.pressed):
55             self.image.set_state (gtk.STATE_ACTIVE)
56
57     def custom_leave_notify_event (self, p, q):
58         self.image.set_state (gtk.STATE_NORMAL)
59
60     def image_expose_event (self, widget, event):
61         global fancy_button_highlight_pb
62         
63         if (widget.state == gtk.STATE_ACTIVE):
64             if (fancy_button_highlight_pb):
65                 print "Painting highlight image"
66                 widget.window.draw_pixbuf (None,
67                                            fancy_button_highlight_pb,
68                                            0, 0,
69                                            widget.allocation.x,
70                                            widget.allocation.y)
71             else:
72                 gtk.Style.paint_flat_box (widget.style,
73                                           event.window,
74                                           gtk.STATE_ACTIVE,
75                                           gtk.SHADOW_NONE,
76                                           event.area,
77                                           widget,
78                                           "eventbox",
79                                           event.area.x,
80                                           event.area.y,
81                                           event.area.width,
82                                           event.area.height)
83
84
85 def settings_changed (obj, spec):
86     global fancy_button_highlight_pb
87     try:
88         fancy_button_highlight_pb = gtk.gdk.pixbuf_new_from_file (BUTTON_HILIGHT_FILE_NAME)
89     except Exception, e:
90         print str(e)
91         fancy_button_highlight_pb = None
92
93 if __name__ == "__main__":
94
95     w = gtk.Window ()
96
97     settings = gtk.settings_get_default ()
98     settings.connect ("notify", settings_changed)
99     settings_changed (None, None)
100
101
102     frame = gtk.Frame ()
103     frame.add (FancyButton ())
104
105     align = gtk.Alignment (xalign=0.5, yalign=0.5)
106     align.add (frame)
107     
108     
109     w.add (align)
110     w.show_all ()
111     w.connect ("delete-event", gtk.main_quit)
112     gtk.main ()
113
114