First implementation of the alert bar #2822

Hooked it up to the activity window as well
This commit is contained in:
Simon Schampijer 2007-10-11 20:04:04 +02:00
parent c9b61d580e
commit ddb400df91
4 changed files with 173 additions and 3 deletions

3
NEWS
View File

@ -1,3 +1,6 @@
* First implementation of the alert bar #2822 and hooked it up
to the activity window (erikos)
Snapshot 9c5755d85a
* Put toolbars into event boxes so X fills the background correctly (benzea)

View File

@ -1,6 +1,7 @@
sugardir = $(pythondir)/sugar/graphics
sugar_PYTHON = \
__init__.py \
alert.py \
animator.py \
combobox.py \
entry.py \

150
sugar/graphics/alert.py Normal file
View File

@ -0,0 +1,150 @@
from gettext import gettext as _
import gtk
import gobject
from sugar.graphics import style
from sugar.graphics.icon import Icon
class Alert(gtk.EventBox, gobject.GObject):
"""UI interface for Alerts
Alerts are used inside the activity window instead of being a
separate popup window. They do not hide canvas content. You can
use add_alert(widget, position) and remove_alert(widget) inside
your activity to add and remove the alert.
Properties:
'title': the title of the alert,
'message': the message of the alert,
'icon': the icon that appears at the far left
See __gproperties__
"""
__gtype_name__ = 'SugarAlert'
__gsignals__ = {
'response': (gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE, ([int]))
}
__gproperties__ = {
'title' : (str, None, None, None,
gobject.PARAM_READWRITE),
'msg' : (str, None, None, None,
gobject.PARAM_READWRITE),
'icon' : (object, None, None,
gobject.PARAM_WRITABLE)
}
def __init__(self, **kwargs):
gobject.GObject.__init__(self)
self.set_visible_window(True)
self._hbox = gtk.HBox()
self.add(self._hbox)
self._title = None
self._msg = None
self._icon = None
self._timeout = 0
self._buttons = {}
self._msg_box = gtk.VBox()
self._title_label = gtk.Label()
size = style.zoom(style.GRID_CELL_SIZE * 0.5)
self._title_label.set_alignment(0, 0.5)
self._title_label.set_padding(style.DEFAULT_SPACING, 0)
self._msg_box.pack_start(self._title_label, False)
self._title_label.show()
self._msg_label = gtk.Label()
self._msg_label.set_alignment(0, 0.5)
self._msg_label.set_padding(style.DEFAULT_SPACING, 0)
self._msg_box.pack_start(self._msg_label, False)
self._msg_label.show()
self._hbox.pack_start(self._msg_box)
self._buttons_box = gtk.HButtonBox()
self._buttons_box.set_layout(gtk.BUTTONBOX_SPREAD)
self._hbox.pack_start(self._buttons_box)
self._buttons_box.show()
self._msg_box.show()
self._hbox.show()
self.show()
def do_set_property(self, pspec, value):
if pspec.name == 'title':
if self._title != value:
self._title = value
self._title_label.set_markup("<b>" + self._title + "</b>")
elif pspec.name == 'msg':
if self._msg != value:
self._msg = value
self._msg_label.set_markup(self._msg)
elif pspec.name == 'icon':
if self._icon != value:
self._icon = value
self._hbox.pack_start(self._icon)
self._hbox.reorder_child(self._icon, 0)
def do_get_property(self, pspec):
if pspec.name == 'title':
return self._title
elif pspec.name == 'msg':
return self._msg
def add_button(self, response_id, label, icon, position=-1):
"""Add a button to the alert
response_id: will be emitted with the response signal
label: that will occure right to the buttom
icon: this can be a SugarIcon or a gtk.Image
position: the position of the button in the box (optional)
"""
button = gtk.Button()
self._buttons[response_id] = button
button.set_image(icon)
button.set_label(label)
self._buttons_box.pack_start(button)
button.show()
button.connect('clicked', self.__button_clicked_cb, response_id)
if position != -1:
self._buttons_box.reorder_child(button, position)
return button
def remove_button(self, response_id):
"""Remove a button from the alert by the given button id"""
self._buttons_box.remove(self._buttons[id])
def _response(self, id):
"""Emitting response when we have a result
A result can be that a user has clicked a button or
a timeout has occured, the id identifies the button
that has been clicked and -1 for a timeout
"""
self.emit('response', id)
def __button_clicked_cb(self, button, response_id):
self._response(response_id)
class ConfirmationAlert(Alert):
"""This is a ready-made two button (Cancel,Ok) alert"""
def __init__(self, **kwargs):
Alert.__init__(self, **kwargs)
icon = Icon(icon_name='dialog-cancel')
cancel_button = self.add_button(0, _('Cancel'), icon)
icon.show()
icon = Icon(icon_name='dialog-ok')
ok_button = self.add_button(1, _('Ok'), icon)
icon.show()

View File

@ -25,6 +25,8 @@ class Window(gtk.Window):
self.connect('realize', self._window_realize_cb)
self.toolbox = None
self._alerts = []
self.alert_position = -1
self.canvas = None
self._vbox = gtk.VBox()
@ -49,6 +51,20 @@ class Window(gtk.Window):
self.toolbox = toolbox
def add_alert(self, alert):
self._alerts.append(alert)
if len(self._alerts) == 1:
self._vbox.pack_start(alert, False)
self._vbox.reorder_child(alert, self.alert_position)
def remove_alert(self, alert):
if alert in self._alerts:
self._alerts.remove(alert)
self._vbox.remove(alert)
if len(self._alerts) >= 1:
self._vbox.pack_start(self._alerts[0], False)
self._vbox.reorder_child(self._alerts[0], self.alert_position)
def _window_realize_cb(self, window):
group = gtk.Window()
group.realize()