diff options
Diffstat (limited to 'mvc/widgets/gtk/drawing.py')
-rw-r--r-- | mvc/widgets/gtk/drawing.py | 268 |
1 files changed, 0 insertions, 268 deletions
diff --git a/mvc/widgets/gtk/drawing.py b/mvc/widgets/gtk/drawing.py deleted file mode 100644 index 5888851..0000000 --- a/mvc/widgets/gtk/drawing.py +++ /dev/null @@ -1,268 +0,0 @@ -# @Base: Miro - an RSS based video player application -# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 -# Participatory Culture Foundation -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU 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 General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -# In addition, as a special exception, the copyright holders give -# permission to link the code of portions of this program with the OpenSSL -# library. -# -# You must obey the GNU General Public License in all respects for all of -# the code used other than OpenSSL. If you modify file(s) with this -# exception, you may extend this exception to your version of the file(s), -# but you are not obligated to do so. If you do not wish to do so, delete -# this exception statement from your version. If you delete this exception -# statement from all source files in the program, then also delete it here. - -""".drawing -- Contains classes used to draw on -widgets. -""" - -import cairo -import gobject -import gtk - -import wrappermap -from .base import Widget, Bin -from .layoutmanager import LayoutManager - -def css_to_color(css_string): - parts = (css_string[1:3], css_string[3:5], css_string[5:7]) - return tuple((int(value, 16) / 255.0) for value in parts) - -class ImageSurface: - def __init__(self, image): - format = cairo.FORMAT_RGB24 - if image.pixbuf.get_has_alpha(): - format = cairo.FORMAT_ARGB32 - self.image = cairo.ImageSurface( - format, int(image.width), int(image.height)) - context = cairo.Context(self.image) - gdkcontext = gtk.gdk.CairoContext(context) - gdkcontext.set_source_pixbuf(image.pixbuf, 0, 0) - gdkcontext.paint() - self.pattern = cairo.SurfacePattern(self.image) - self.pattern.set_extend(cairo.EXTEND_REPEAT) - self.width = image.width - self.height = image.height - - def get_size(self): - return self.width, self.height - - def _align_pattern(self, x, y): - """Line up our image pattern so that it's top-left corner is x, y.""" - m = cairo.Matrix() - m.translate(-x, -y) - self.pattern.set_matrix(m) - - def draw(self, context, x, y, width, height, fraction=1.0): - self._align_pattern(x, y) - cairo_context = context.context - cairo_context.save() - cairo_context.set_source(self.pattern) - cairo_context.new_path() - cairo_context.rectangle(x, y, width, height) - if fraction >= 1.0: - cairo_context.fill() - else: - cairo_context.clip() - cairo_context.paint_with_alpha(fraction) - cairo_context.restore() - - def draw_rect(self, context, dest_x, dest_y, source_x, source_y, - width, height, fraction=1.0): - - self._align_pattern(dest_x-source_x, dest_y-source_y) - cairo_context = context.context - cairo_context.save() - cairo_context.set_source(self.pattern) - cairo_context.new_path() - cairo_context.rectangle(dest_x, dest_y, width, height) - if fraction >= 1.0: - cairo_context.fill() - else: - cairo_context.clip() - cairo_context.paint_with_alpha(fraction) - cairo_context.restore() - -class DrawingStyle(object): - def __init__(self, widget, use_base_color=False, state=None): - if state is None: - state = widget._widget.state - self.use_custom_style = widget.use_custom_style - self.style = widget._widget.style - self.text_color = widget.convert_gtk_color(self.style.text[state]) - if use_base_color: - self.bg_color = widget.convert_gtk_color(self.style.base[state]) - else: - self.bg_color = widget.convert_gtk_color(self.style.bg[state]) - -class DrawingContext(object): - """DrawingContext. This basically just wraps a Cairo context and adds a - couple convenience methods. - """ - - def __init__(self, window, drawing_area, expose_area): - self.window = window - self.context = window.cairo_create() - self.context.rectangle(expose_area.x, expose_area.y, - expose_area.width, expose_area.height) - self.context.clip() - self.width = drawing_area.width - self.height = drawing_area.height - self.context.translate(drawing_area.x, drawing_area.y) - - def __getattr__(self, name): - return getattr(self.context, name) - - def set_color(self, (red, green, blue), alpha=1.0): - self.context.set_source_rgba(red, green, blue, alpha) - - def set_shadow(self, color, opacity, offset, blur_radius): - pass - - def gradient_fill(self, gradient): - old_source = self.context.get_source() - self.context.set_source(gradient.pattern) - self.context.fill() - self.context.set_source(old_source) - - def gradient_fill_preserve(self, gradient): - old_source = self.context.get_source() - self.context.set_source(gradient.pattern) - self.context.fill_preserve() - self.context.set_source(old_source) - -class Gradient(object): - def __init__(self, x1, y1, x2, y2): - self.pattern = cairo.LinearGradient(x1, y1, x2, y2) - - def set_start_color(self, (red, green, blue)): - self.pattern.add_color_stop_rgb(0, red, green, blue) - - def set_end_color(self, (red, green, blue)): - self.pattern.add_color_stop_rgb(1, red, green, blue) - -class CustomDrawingMixin(object): - def do_expose_event(self, event): - wrapper = wrappermap.wrapper(self) - if self.flags() & gtk.NO_WINDOW: - drawing_area = self.allocation - else: - drawing_area = gtk.gdk.Rectangle(0, 0, - self.allocation.width, self.allocation.height) - context = DrawingContext(event.window, drawing_area, event.area) - context.style = DrawingStyle(wrapper) - if self.flags() & gtk.CAN_FOCUS: - focus_space = (self.style_get_property('focus-padding') + - self.style_get_property('focus-line-width')) - if not wrapper.squish_width: - context.width -= focus_space * 2 - translate_x = focus_space - else: - translate_x = 0 - if not wrapper.squish_height: - context.height -= focus_space * 2 - translate_y = focus_space - else: - translate_y = 0 - context.translate(translate_x, translate_y) - wrapper.layout_manager.update_cairo_context(context.context) - self.draw(wrapper, context) - - def draw(self, wrapper, context): - wrapper.layout_manager.reset() - wrapper.draw(context, wrapper.layout_manager) - - def do_size_request(self, requesition): - wrapper = wrappermap.wrapper(self) - width, height = wrapper.size_request(wrapper.layout_manager) - requesition.width = width - requesition.height = height - if self.flags() & gtk.CAN_FOCUS: - focus_space = (self.style_get_property('focus-padding') + - self.style_get_property('focus-line-width')) - if not wrapper.squish_width: - requesition.width += focus_space * 2 - if not wrapper.squish_height: - requesition.height += focus_space * 2 - -class MiroDrawingArea(CustomDrawingMixin, gtk.Widget): - def __init__(self): - gtk.Widget.__init__(self) - CustomDrawingMixin.__init__(self) - self.set_flags(gtk.NO_WINDOW) - -class BackgroundWidget(CustomDrawingMixin, gtk.Bin): - def do_size_request(self, requesition): - CustomDrawingMixin.do_size_request(self, requesition) - if self.get_child(): - child_width, child_height = self.get_child().size_request() - requesition.width = max(child_width, requesition.width) - requesition.height = max(child_height, requesition.height) - - def do_expose_event(self, event): - CustomDrawingMixin.do_expose_event(self, event) - if self.get_child(): - self.propagate_expose(self.get_child(), event) - - def do_size_allocate(self, allocation): - gtk.Bin.do_size_allocate(self, allocation) - if self.get_child(): - self.get_child().size_allocate(allocation) - -gobject.type_register(MiroDrawingArea) -gobject.type_register(BackgroundWidget) - -class Drawable: - def __init__(self): - self.squish_width = self.squish_height = False - - def set_squish_width(self, setting): - self.squish_width = setting - - def set_squish_height(self, setting): - self.squish_height = setting - - def set_widget(self, drawing_widget): - if self.is_opaque() and 0: - box = gtk.EventBox() - box.add(drawing_widget) - Widget.set_widget(self, box) - else: - Widget.set_widget(self, drawing_widget) - self.layout_manager = LayoutManager(self._widget) - - def size_request(self, layout_manager): - return 0, 0 - - def draw(self, context, layout_manager): - pass - - def is_opaque(self): - return False - -class DrawingArea(Drawable, Widget): - def __init__(self): - Widget.__init__(self) - Drawable.__init__(self) - self.set_widget(MiroDrawingArea()) - -class Background(Drawable, Bin): - def __init__(self): - Bin.__init__(self) - Drawable.__init__(self) - self.set_widget(BackgroundWidget()) |