mirror of https://github.com/kivy/kivy.git
89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
__all__ = ('FboFloatLayout', )
|
|
|
|
|
|
from kivy.graphics import Color, Rectangle, Canvas, ClearBuffers, ClearColor
|
|
from kivy.graphics.fbo import Fbo
|
|
from kivy.uix.floatlayout import FloatLayout
|
|
from kivy.properties import ObjectProperty, NumericProperty
|
|
|
|
class FboFloatLayout(FloatLayout):
|
|
|
|
texture = ObjectProperty(None, allownone=True)
|
|
|
|
alpha = NumericProperty(1)
|
|
|
|
def __init__(self, **kwargs):
|
|
self.canvas = Canvas()
|
|
with self.canvas:
|
|
self.fbo = Fbo(size=self.size)
|
|
self.fbo_color = Color(1, 1, 1, 1)
|
|
self.fbo_rect = Rectangle()
|
|
|
|
with self.fbo:
|
|
ClearColor(0,0,0,0)
|
|
ClearBuffers()
|
|
|
|
# wait that all the instructions are in the canvas to set texture
|
|
self.texture = self.fbo.texture
|
|
super(FboFloatLayout, self).__init__(**kwargs)
|
|
|
|
def add_widget(self, *largs):
|
|
# trick to attach graphics instructino to fbo instead of canvas
|
|
canvas = self.canvas
|
|
self.canvas = self.fbo
|
|
ret = super(FboFloatLayout, self).add_widget(*largs)
|
|
self.canvas = canvas
|
|
return ret
|
|
|
|
def remove_widget(self, *largs):
|
|
canvas = self.canvas
|
|
self.canvas = self.fbo
|
|
super(FboFloatLayout, self).remove_widget(*largs)
|
|
self.canvas = canvas
|
|
|
|
def on_size(self, instance, value):
|
|
self.fbo.size = value
|
|
self.texture = self.fbo.texture
|
|
self.fbo_rect.size = value
|
|
|
|
def on_pos(self, instance, value):
|
|
self.fbo_rect.pos = value
|
|
|
|
def on_texture(self, instance, value):
|
|
self.fbo_rect.texture = value
|
|
|
|
def on_alpha(self, instance, value):
|
|
self.fbo_color.rgba = (1, 1, 1, value)
|
|
|
|
|
|
|
|
from kivy.app import App
|
|
from kivy.core.window import Window
|
|
from kivy.animation import Animation
|
|
from kivy.factory import Factory as F
|
|
|
|
class ScreenLayerApp(App):
|
|
def build(self):
|
|
|
|
f = FboFloatLayout()
|
|
b = F.Button(text="FBO", size_hint=(None, None))
|
|
f.add_widget(b)
|
|
|
|
def anim_btn(*args):
|
|
Animation(x=f.width-b.width).start(b)
|
|
b.bind(on_press=anim_btn)
|
|
|
|
#before this or calback instruction was only way...
|
|
#so no way to avoid going into python instead of stayingin c
|
|
#def clear_fb(*args):
|
|
# f.fbo.bind()
|
|
# f.fbo.clear_buffer()
|
|
# f.fbo.release()
|
|
#Window.bind(on_draw=clear_fb)
|
|
|
|
return f
|
|
|
|
|
|
if __name__ == "__main__":
|
|
ScreenLayerApp().run()
|