First implementation of the alert bar #2822
Hooked it up to the activity window as well
This commit is contained in:
parent
c9b61d580e
commit
ddb400df91
3
NEWS
3
NEWS
@ -1,3 +1,6 @@
|
|||||||
|
* First implementation of the alert bar #2822 and hooked it up
|
||||||
|
to the activity window (erikos)
|
||||||
|
|
||||||
Snapshot 9c5755d85a
|
Snapshot 9c5755d85a
|
||||||
|
|
||||||
* Put toolbars into event boxes so X fills the background correctly (benzea)
|
* Put toolbars into event boxes so X fills the background correctly (benzea)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
sugardir = $(pythondir)/sugar/graphics
|
sugardir = $(pythondir)/sugar/graphics
|
||||||
sugar_PYTHON = \
|
sugar_PYTHON = \
|
||||||
__init__.py \
|
__init__.py \
|
||||||
|
alert.py \
|
||||||
animator.py \
|
animator.py \
|
||||||
combobox.py \
|
combobox.py \
|
||||||
entry.py \
|
entry.py \
|
||||||
|
150
sugar/graphics/alert.py
Normal file
150
sugar/graphics/alert.py
Normal 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()
|
||||||
|
|
||||||
|
|
@ -25,10 +25,12 @@ class Window(gtk.Window):
|
|||||||
self.connect('realize', self._window_realize_cb)
|
self.connect('realize', self._window_realize_cb)
|
||||||
|
|
||||||
self.toolbox = None
|
self.toolbox = None
|
||||||
|
self._alerts = []
|
||||||
|
self.alert_position = -1
|
||||||
self.canvas = None
|
self.canvas = None
|
||||||
|
|
||||||
self._vbox = gtk.VBox()
|
self._vbox = gtk.VBox()
|
||||||
self.add(self._vbox)
|
self.add(self._vbox)
|
||||||
self._vbox.show()
|
self._vbox.show()
|
||||||
|
|
||||||
def set_canvas(self, canvas):
|
def set_canvas(self, canvas):
|
||||||
@ -48,7 +50,21 @@ class Window(gtk.Window):
|
|||||||
self._vbox.reorder_child(toolbox, 0)
|
self._vbox.reorder_child(toolbox, 0)
|
||||||
|
|
||||||
self.toolbox = toolbox
|
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):
|
def _window_realize_cb(self, window):
|
||||||
group = gtk.Window()
|
group = gtk.Window()
|
||||||
group.realize()
|
group.realize()
|
||||||
|
Loading…
Reference in New Issue
Block a user