You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
3.7 KiB
Python

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.properties import NumericProperty, ReferenceListProperty
from kivy.event import EventDispatcher
from kivy.uix.button import Button
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
from kivy.uix.effectwidget import PushMatrix,PopMatrix
from kivy.graphics import Rotate
class SparseGridLayout(FloatLayout):
rows = NumericProperty(1)
columns = NumericProperty(1)
shape = ReferenceListProperty(rows, columns)
layout_built = False
def do_layout(self, *args):
shape_hint = (1. / self.columns, 1. / self.rows)
if self.layout_built is False:
for childLayout in self.children:
for child in childLayout.children:
child.size_hint = (shape_hint[0] * child.hor_span, shape_hint[1] * child.vert_span)#TODO integrate span here
if not hasattr(child, 'row'):
child.row = 0
if not hasattr(child, 'column'):
child.column = 0
#evtl hier clickdispatch einbauen
#TODO: testen warum bei Rotate hitbox nicht mitrotiert wird
child.pos_hint = {'x': shape_hint[0] * child.row +(shape_hint[0]*0.5),
'y': shape_hint[1] * child.column + (shape_hint[1]*0.5)}
#child.canvas.before.add(PushMatrix())
#child.canvas.before.add(Rotate(angle = 45,origin = [child.get_center_x(), child.get_center_y()] ))#
#child.canvas.after.add(PopMatrix())
self.layout_built = True
super(SparseGridLayout, self).do_layout(*args)
class GridEntry(EventDispatcher):
row = NumericProperty(0)
column = NumericProperty(0)
vert_span = NumericProperty(1)
hor_span = NumericProperty(1)
def check_click():
#TODO in click dispatching reinlesen
#scheinbar wird click von sparsegrid nicht an kinder weitergegeben
pass
class GridImage(ButtonBehavior,Image,GridEntry):
id = None
def __init__(self,id=None,**kwargs):
self.id = id
super(GridImage,self).__init__(**kwargs)
def on_release(self):
print("pos_pressed: {}".format(self.id))
return super().on_release()
class ExampleApp(App):
def build(self):
rlayout1 = RelativeLayout()
rlayout2 = RelativeLayout()
rlayout3 = RelativeLayout()
rlayout4 = RelativeLayout()
buttons = []
gi1 = GridImage(id=1,row=1, column=2,vert_span=2,source='Assets/Formations/Formation_Card_1_90.png')
gi1.size = gi1.texture_size
rlayout1.add_widget(gi1)
buttons.append(rlayout1)
gi2 = GridImage(id=2,row=2, column=1,vert_span=2,source='Assets/Formations/Formation_Card_2_90.png')
gi2.size = gi2.texture_size
rlayout2.add_widget(gi2)
buttons.append(rlayout2)
gi3 =GridImage(id=3,row=1, column=0,source='Assets/Formations/Formation_Card_3.png')
gi3.size = gi3.texture_size
rlayout3.add_widget(gi3)
buttons.append(rlayout3)
gi4 = GridImage(id=4,row=0, column=1,source='Assets/Formations/Formation_Card_4.png')
gi4.size = gi4.texture_size
rlayout4.add_widget(gi4)
buttons.append(rlayout4)
layout = SparseGridLayout(rows=3, columns=3)
for button in buttons:
layout.add_widget(button)
#layout.add_widget(layout)
return layout
if __name__ == "__main__":
ExampleApp().run()