91 lines
2.7 KiB
Python
91 lines
2.7 KiB
Python
import cairo
|
|
import math
|
|
from .structures import Size, Position, Rectangle
|
|
from ..events.events import WindowEventSource
|
|
|
|
class Surface(object):
|
|
def __init__(self, size=None):
|
|
self.size = Size.from_value(size)
|
|
self.csurface = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.size.width, self.size.height)
|
|
self.root_window = Window('root', Position(0,0), self.size)
|
|
self.windows = [self.root_window]
|
|
|
|
def draw(self):
|
|
for window in self.windows:
|
|
window.draw(self.csurface)
|
|
|
|
surface = None
|
|
def init(size):
|
|
surface = Surface(size)
|
|
|
|
class WindowSurface(object):
|
|
def __init__(self):
|
|
super(WindowSurface, self).__init__()
|
|
#self.mouse_pos
|
|
|
|
def draw(self, surface):
|
|
Width = self.size.width
|
|
Height = self.size.height
|
|
x,y, radius = (Width/2,Height/2, Width/2-Width/10)
|
|
ctx = cairo.Context(surface)
|
|
ctx.set_operator(cairo.OPERATOR_CLEAR)
|
|
ctx.rectangle(0.0, 0.0, Width, Height)
|
|
ctx.fill()
|
|
|
|
ctx.set_operator(cairo.OPERATOR_OVER)
|
|
ctx.set_line_width(Width/10)
|
|
ctx.arc(x, y, radius, 0, 2.0 * math.pi)
|
|
ctx.set_source_rgba(0.8, 0.8, 0.8)
|
|
ctx.fill_preserve()
|
|
ctx.set_source_rgba(1, 1, 1)
|
|
ctx.stroke()
|
|
|
|
|
|
class Window(WindowEventSource, WindowSurface):
|
|
def __init__(self, name, position=None, size=None):
|
|
super(Window, self).__init__()
|
|
self.name = name
|
|
self.rectangle = Rectangle(position, size)
|
|
self.children = []
|
|
self.parent = None
|
|
self.mouse_pos = Position()
|
|
|
|
|
|
def add_child(self, child_window):
|
|
if child_window not in self.children:
|
|
child_window.parent = self
|
|
self.children.append(child_window)
|
|
|
|
def remove_child(self, child_window):
|
|
try:
|
|
self.children.remove(child_window)
|
|
child_window.parent = None
|
|
except ValueError:
|
|
pass
|
|
|
|
@property
|
|
def position(self):
|
|
return self.rectangle.position
|
|
|
|
@position.setter
|
|
def position(self, position):
|
|
diff = position - self.rectangle.position
|
|
if diff.x != 0 or diff.y != 0:
|
|
self.dispatch('move', self, position)
|
|
for child in self.children:
|
|
child.position = child.position + diff
|
|
self.recangle.position = position
|
|
|
|
@property
|
|
def size(self):
|
|
return self.rectangle.size
|
|
|
|
@size.setter
|
|
def size(self, size):
|
|
diff = size - self.rectangle.size
|
|
if diff.height != 0 or diff.width != 0:
|
|
self.dispatch('resize', self, size)
|
|
for child in self.children:
|
|
child.size = child.size + diff
|
|
self.rectangle.size = size
|
|
|