Source code for stoqlib.gui.widgets.splash

# -*- Mode: Python; coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4

##
## Copyright (C) 2006-2011 Async Open Source <http://www.async.com.br>
## All rights reserved
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU Lesser 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 Lesser General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
## Author(s): Stoq Team <stoq-devel@async.com.br>
##

""" Splash screen helper """

import time

import glib
import gtk
import pango
import pangocairo

from kiwi.component import get_utility
from kiwi.environ import environ
from kiwi.ui.pixbufutils import pixbuf_from_string
from stoqlib.lib.interfaces import IAppInfo
from stoqlib.lib.translation import stoqlib_gettext

WIDTH = 462
HEIGHT = 260
BORDER = 8  # This includes shadow out border from GtkFrame
_WINDOW_TIMEOUT = 100  # How often we should check if there are
                      # other visible windows

_ = stoqlib_gettext


[docs]class SplashScreen(gtk.Window): def __init__(self): gtk.Window.__init__(self) self.set_name('SplashWindow') self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_SPLASHSCREEN) self.resize(WIDTH, HEIGHT) # Ubuntu has backported the 3.0 has-resize-grip property, # disable it as it doesn't make sense for splash screens if hasattr(self.props, 'has_resize_grip'): self.props.has_resize_grip = False darea = gtk.DrawingArea() try: darea.connect("expose-event", self.expose) except TypeError: darea.connect("draw", self.draw) self.add(darea) self.show_all() pixbuf_data = environ.get_resource_string("stoq", "pixmaps", "splash.png") self._pixbuf = pixbuf_from_string(pixbuf_data) glib.timeout_add(_WINDOW_TIMEOUT, self._hide_splash_timeout) def _hide_splash_timeout(self): # Hide the splash screen as soon as there is another window # created if len(gtk.window_list_toplevels()) > 1: self.destroy() return False return True def _get_label(self): info = get_utility(IAppInfo, None) if not info: return "Stoq" version = info.get("version") if ' ' in version: ver, rev = version.split(' ') version = '%s\n<span font="8">%s</span>' % (ver, glib.markup_escape_text(rev)) return _("Version %s") % (version, ) def _draw_gi(self, cr): gtk.gdk.cairo_set_source_pixbuf(cr, self._pixbuf, 0, 0) cr.paint() cr.set_source_rgb(.8, .8, .8) layout = pangocairo.create_layout(cr) desc = pango.FontDescription('Sans 12') layout.set_font_description(desc) layout.set_alignment(pango.ALIGN_CENTER) layout.set_markup(self._get_label(), -1) pangocairo.update_layout(cr, layout) w, h = layout.get_pixel_size() cr.move_to((WIDTH - w) / 2, (HEIGHT / 2) + h) pangocairo.show_layout(cr, layout)
[docs] def draw(self, widget, cr): self._draw_gi(cr)
[docs] def expose(self, widget, event): cr = widget.window.cairo_create() if not hasattr(cr, 'set_source_pixbuf'): self._draw_gi(cr) return # Draw splash cr.set_source_pixbuf(self._pixbuf, 0, 0) cr.paint() # Draw version cr.set_source_rgb(1, 1, 1) pcr = pangocairo.CairoContext(cr) layout = pcr.create_layout() layout.set_alignment(pango.ALIGN_CENTER) layout.set_font_description(pango.FontDescription("Sans 10")) layout.set_markup(self._get_label()) pcr.update_layout(layout) w, h = layout.get_pixel_size() cr.move_to((WIDTH - w) / 1.05, (HEIGHT - h) / 1.05) pcr.show_layout(layout)
[docs] def show(self): gtk.Window.show(self) time.sleep(0.01) while gtk.events_pending(): time.sleep(0.01) gtk.main_iteration()
_splash = None
[docs]def show_splash(): global _splash _splash = SplashScreen() _splash.show()