root/branches/0.3/src/status_bar.py

Revision 551, 4.8 kB (checked in by nicfit, 2 years ago)

Recognize .MP3 instead of just .mp3, and pango escape fixes.

Line 
1 ################################################################################
2 #  Copyright (C) 2006  Travis Shirk <travis@pobox.com>
3 #
4 #  This program is free software; you can redistribute it and/or modify
5 #  it under the terms of the GNU General Public License as published by
6 #  the Free Software Foundation; either version 2 of the License, or
7 #  (at your option) any later version.
8 #
9 #  This program is distributed in the hope that it will be useful,
10 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 #  GNU General Public License for more details.
13 #
14 #  You should have received a copy of the GNU General Public License
15 #  along with this program; if not, write to the Free Software
16 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 #
18 #  $Id$
19 ################################################################################
20 import gobject, gtk
21 import mesk.gtk_utils
22 _ = mesk.i18n._
23
24
25 class StatusBar(object):
26     def __init__(self, xml):
27         self.xml = xml
28         self._status_hbox = self.xml.get_widget('status_bar')
29         self._status_label = self.xml.get_widget('status_bar_label1')
30
31         self._status_image = self.xml.get_widget('status_bar_img_ebox')
32         self._status_image.hide()
33         self._status_image.connect('button-release-event',
34                                    self._on_status_image_clicked)
35         self._status_image_tip = gtk.Tooltips()
36
37         self._msg_stack = StatusMsgStack()
38         self.clear()
39
40         self._status_log_window = StatusLogWindow()
41         self._status_log_window.window.connect('hide', self._on_log_window_hide)
42
43     def clear(self):
44         self._msg_stack.clear()
45         self._update_status()
46
47     def push_status_msg(self, msg):
48         self._msg_stack.push(msg)
49         self._update_status()
50
51     def __pop_status_msg(self, msg):
52         self._msg_stack.pop(msg)
53         self._update_status()
54         return False # One-time callback
55
56     def pop_status_msg(self, msg=None, delay=0):
57         if delay:
58             gobject.timeout_add(delay, self.__pop_status_msg, msg)
59         else:
60             self.__pop_status_msg(msg)
61
62     def _update_status(self):
63         # Update all status labels.
64         msg = self._msg_stack.peek()
65         if msg:
66             self._status_label.set_text(msg)
67         else:
68             self._status_label.set_text('')
69         mesk.gtk_utils.update_pending_events()
70
71     def add_log_msg(self, msg):
72         self._status_log_window.add_msg(msg)
73         self._status_image_tip.set_tip(self._status_image,
74                                        _('%d messages') %
75                                          self._status_log_window.num_msgs())
76         self._status_image.show()
77
78     def hide(self):
79         self._status_hbox.hide()
80     def show(self):
81         self._status_hbox.show()
82
83     def _on_status_image_clicked(self, widget, event):
84         self._status_log_window.show()
85
86     def _on_log_window_hide(self, widget):
87         if self._status_log_window.has_msgs():
88             self._status_image.show()
89         else:
90             self._status_image.hide()
91
92 class StatusMsgStack(object):
93     def __init__(self):
94         self.__data = []
95
96     def clear(self):
97         self.__data = []
98
99     def push(self, msg):
100         if msg:
101             self.__data.append(msg)
102
103     def peek(self):
104         if self.__data:
105             return self.__data[-1]
106         else:
107             return None
108
109     def pop(self, msg=None):
110         if not self.__data:
111             return
112
113         if not msg:
114             self.__data.pop()
115         else:
116             try:
117                 self.__data.remove(msg)
118             except ValueError:
119                 pass
120
121 class StatusLogWindow(mesk.window.Window):
122     def __init__(self):
123         mesk.window.Window.__init__(self, 'status_log_window',
124                                     'main_window.glade')
125         self.xml.get_widget('close_button').connect('clicked',
126                                                     self._on_close_clicked)
127         self.xml.get_widget('clear_button').connect('clicked',
128                                                     self._on_clear_clicked)
129         self._treeview = self.xml.get_widget('msg_treeview')
130         self._treeview.get_selection().set_mode(gtk.SELECTION_NONE)
131         self._messages = gtk.ListStore(gobject.TYPE_STRING)
132         self._treeview.set_model(self._messages)
133         col = gtk.TreeViewColumn('Messages', gtk.CellRendererText(), markup=0)
134         self._treeview.append_column(col)
135
136     def add_msg(self, msg):
137         self._messages.append([msg])
138
139     def has_msgs(self):
140         return self._messages.get_iter_first() is not None
141
142     def num_msgs(self):
143         return len(self._messages)
144
145     def _on_close_clicked(self, button):
146         self.hide()
147     def _on_clear_clicked(self, button):
148         self._messages.clear()
Note: See TracBrowser for help on using the browser.