194 lines
5.5 KiB
Python
194 lines
5.5 KiB
Python
|
'''
|
||
|
Example usage of the effectwidget.
|
||
|
|
||
|
Currently highly experimental.
|
||
|
'''
|
||
|
|
||
|
from kivy.app import App
|
||
|
from kivy.uix.effectwidget import EffectWidget
|
||
|
from kivy.uix.spinner import Spinner
|
||
|
from kivy.uix.boxlayout import BoxLayout
|
||
|
from kivy.lang import Builder
|
||
|
from kivy.properties import ObjectProperty
|
||
|
|
||
|
from kivy.uix.effectwidget import (MonochromeEffect,
|
||
|
InvertEffect,
|
||
|
ChannelMixEffect,
|
||
|
ScanlinesEffect,
|
||
|
FXAAEffect,
|
||
|
PixelateEffect,
|
||
|
HorizontalBlurEffect,
|
||
|
VerticalBlurEffect)
|
||
|
|
||
|
|
||
|
class ComparisonWidget(EffectWidget):
|
||
|
pass
|
||
|
|
||
|
|
||
|
class EffectSpinner(Spinner):
|
||
|
pass
|
||
|
|
||
|
|
||
|
class SpinnerRow(BoxLayout):
|
||
|
effectwidget = ObjectProperty()
|
||
|
|
||
|
def update_effectwidget(self, *args):
|
||
|
effects = []
|
||
|
for child in self.children[::-1]:
|
||
|
text = child.text
|
||
|
if text == 'none':
|
||
|
pass
|
||
|
if text == 'fxaa':
|
||
|
effects.append(FXAAEffect())
|
||
|
if text == 'monochrome':
|
||
|
effects.append(MonochromeEffect())
|
||
|
if text == 'invert':
|
||
|
effects.append(InvertEffect())
|
||
|
if text == 'mix':
|
||
|
effects.append(ChannelMixEffect())
|
||
|
if text == 'blur_h':
|
||
|
effects.append(HorizontalBlurEffect())
|
||
|
if text == 'blur_v':
|
||
|
effects.append(VerticalBlurEffect())
|
||
|
if text == 'postprocessing':
|
||
|
effects.append(ScanlinesEffect())
|
||
|
if text == 'pixelate':
|
||
|
effects.append(PixelateEffect())
|
||
|
|
||
|
if self.effectwidget:
|
||
|
self.effectwidget.effects = effects
|
||
|
|
||
|
|
||
|
example = Builder.load_string('''
|
||
|
#:import Vector kivy.vector.Vector
|
||
|
BoxLayout:
|
||
|
orientation: 'vertical'
|
||
|
FloatLayout:
|
||
|
ComparisonWidget:
|
||
|
pos_hint: {'x': 0, 'y': 0}
|
||
|
size_hint: 0.5, 1
|
||
|
id: effect1
|
||
|
ComparisonWidget:
|
||
|
pos_hint: {'x': pos_slider.value, 'y': 0}
|
||
|
size_hint: 0.5, 1
|
||
|
id: effect2
|
||
|
background_color: (rs.value, gs.value, bs.value, als.value)
|
||
|
SpinnerRow:
|
||
|
effectwidget: effect1
|
||
|
text: 'left effects'
|
||
|
SpinnerRow:
|
||
|
effectwidget: effect2
|
||
|
text: 'right effects'
|
||
|
BoxLayout:
|
||
|
size_hint_y: None
|
||
|
height: sp(40)
|
||
|
Label:
|
||
|
text: 'control overlap:'
|
||
|
Slider:
|
||
|
min: 0
|
||
|
max: 0.5
|
||
|
value: 0.5
|
||
|
id: pos_slider
|
||
|
BoxLayout:
|
||
|
size_hint_y: None
|
||
|
height: sp(40)
|
||
|
Label:
|
||
|
text: 'right bg r,g,b,a'
|
||
|
Slider:
|
||
|
min: 0
|
||
|
max: 1
|
||
|
value: 0
|
||
|
id: rs
|
||
|
Slider:
|
||
|
min: 0
|
||
|
max: 1
|
||
|
value: 0
|
||
|
id: gs
|
||
|
Slider:
|
||
|
min: 0
|
||
|
max: 1
|
||
|
value: 0
|
||
|
id: bs
|
||
|
Slider:
|
||
|
min: 0
|
||
|
max: 1
|
||
|
value: 0
|
||
|
id: als
|
||
|
|
||
|
|
||
|
<ComparisonWidget>:
|
||
|
Widget:
|
||
|
canvas:
|
||
|
Color:
|
||
|
rgba: 1, 0, 0, 1
|
||
|
Ellipse:
|
||
|
pos: Vector(self.pos) + 0.5*Vector(self.size)
|
||
|
size: 0.4*Vector(self.size)
|
||
|
Color:
|
||
|
rgba: 0, 1, 0.3, 1
|
||
|
Ellipse:
|
||
|
pos: Vector(self.pos) + 0.1*Vector(self.size)
|
||
|
size: 0.6*Vector(self.size)
|
||
|
Color:
|
||
|
rgba: 0.5, 0.3, 0.8, 1
|
||
|
Ellipse:
|
||
|
pos: Vector(self.pos) + Vector([0, 0.6])*Vector(self.size)
|
||
|
size: 0.4*Vector(self.size)
|
||
|
Color:
|
||
|
rgba: 1, 0.8, 0.1, 1
|
||
|
Ellipse:
|
||
|
pos: Vector(self.pos) + Vector([0.5, 0])*Vector(self.size)
|
||
|
size: 0.4*Vector(self.size)
|
||
|
Color:
|
||
|
rgba: 0, 0, 0.8, 1
|
||
|
Line:
|
||
|
points:
|
||
|
[self.x, self.y,
|
||
|
self.x + self.width, self.y + 0.3*self.height,
|
||
|
self.x + 0.2*self.width, self.y + 0.1*self.height,
|
||
|
self.x + 0.85*self.width, self.y + 0.72*self.height,
|
||
|
self.x + 0.31*self.width, self.y + 0.6*self.height,
|
||
|
self.x, self.top]
|
||
|
width: 1
|
||
|
Color:
|
||
|
rgba: 0, 0.9, 0.1, 1
|
||
|
Line:
|
||
|
points:
|
||
|
[self.x + self.width, self.y + self.height,
|
||
|
self.x + 0.35*self.width, self.y + 0.6*self.height,
|
||
|
self.x + 0.7*self.width, self.y + 0.15*self.height,
|
||
|
self.x + 0.2*self.width, self.y + 0.22*self.height,
|
||
|
self.x + 0.3*self.width, self.y + 0.92*self.height]
|
||
|
width: 2
|
||
|
|
||
|
<SpinnerRow>:
|
||
|
orientation: 'horizontal'
|
||
|
size_hint_y: None
|
||
|
height: dp(40)
|
||
|
text: ''
|
||
|
Label:
|
||
|
text: root.text
|
||
|
EffectSpinner:
|
||
|
on_text: root.update_effectwidget()
|
||
|
EffectSpinner:
|
||
|
on_text: root.update_effectwidget()
|
||
|
EffectSpinner:
|
||
|
on_text: root.update_effectwidget()
|
||
|
|
||
|
<EffectSpinner>:
|
||
|
text: 'none'
|
||
|
values:
|
||
|
['none', 'fxaa', 'monochrome',
|
||
|
'invert', 'mix',
|
||
|
'blur_h', 'blur_v',
|
||
|
'postprocessing', 'pixelate',]
|
||
|
''')
|
||
|
|
||
|
|
||
|
class EffectApp(App):
|
||
|
def build(self):
|
||
|
return example
|
||
|
|
||
|
|
||
|
EffectApp().run()
|