kivyblocks/kivyblocks/orientationlayout.py

134 lines
4.7 KiB
Python
Raw Normal View History

2020-08-25 09:10:40 +08:00
from kivy.factory import Factory
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
2020-08-25 10:17:49 +08:00
from kivy.clock import Clock
2020-08-25 09:10:40 +08:00
from kivyblocks.swipebehavior import SwipeBehavior
from kivyblocks.ready import WidgetReady
2020-08-25 10:17:49 +08:00
class OrientationLayout(WidgetReady, SwipeBehavior, FloatLayout):
2020-08-25 09:10:40 +08:00
"""
TwinStyleLayout layout two widget verical when parital orientation
and second widget hide when it is in landscape
"""
2020-08-25 10:17:49 +08:00
def __init__(self, main_widget=None, second_widget=None, **kw):
2020-08-25 09:10:40 +08:00
self.main_widget = main_widget
self.second_widget = second_widget
self.widget_main = main_widget
self.widget_second = second_widget
self.second_flg = False
FloatLayout.__init__(self, **kw)
SwipeBehavior.__init__(self)
WidgetReady.__init__(self)
2020-08-25 10:17:49 +08:00
Clock.schedule_once(self.build_children,0)
2020-08-25 10:28:37 +08:00
self.bind(on_swipe_left=self.toggle_second)
self.bind(on_swipe_right=self.toggle_second)
2020-08-25 10:17:49 +08:00
def build_children(self, *args):
if isinstance(self.main_widget, dict):
blocks = Factory.Blocks()
blocks.bind(on_built=self.main_widget_built)
blocks.bind(on_failed=self.widget_build_failed)
blocks.widgetBuild(self.main_widget, ancestor=self)
if isinstance(self.second_widget, dict):
blocks = Factory.Blocks()
blocks.bind(on_built=self.second_widget_built)
blocks.bind(on_failed=self.widget_build_failed)
blocks.widgetBuild(self.second_widget, ancestor=self)
2020-08-25 09:10:40 +08:00
def isLandscape(self):
return self.width > self.height
def toggle_second(self,*args):
2020-08-25 10:17:49 +08:00
print('toggle_second() called ..')
2020-08-25 09:10:40 +08:00
if self.isLandscape():
2020-08-25 10:28:37 +08:00
if self.second_flg:
print('remove second widget ..')
2020-08-25 09:10:40 +08:00
self.remove_widget(self.widget_second)
2020-08-25 10:28:37 +08:00
self.second_flg = False
2020-08-25 09:10:40 +08:00
else:
2020-08-25 10:28:37 +08:00
print('add second widget ..')
2020-08-25 09:10:40 +08:00
self.add_widget(self.widget_second)
2020-08-25 10:28:37 +08:00
self.second_flg = True
2020-08-25 09:10:40 +08:00
self.on_size(self.size)
2020-08-25 10:28:37 +08:00
2020-08-25 09:10:40 +08:00
def on_ready(self,*args):
2020-09-08 10:09:19 +08:00
Clock.schedule_once(self.two_widget_layout,0)
2020-08-25 09:10:40 +08:00
def on_size(self,*args):
2020-09-08 10:09:19 +08:00
Clock.schedule_once(self.two_widget_layout,0)
2020-08-25 09:10:40 +08:00
def on_pos(self,*args):
2020-09-08 10:09:19 +08:00
Clock.schedule_once(self.two_widget_layout,0)
2020-08-25 09:10:40 +08:00
def two_widget_layout(self, *args):
if not isinstance(self.widget_main, Widget) or not isinstance(self.widget_second, Widget):
# Clock.schedule_once(self.two_widget_layout,0)
return
if self.isLandscape():
self.horizontal_layout()
else:
self.vertical_layout()
def horizontal_layout(self):
2020-08-26 08:00:29 +08:00
self.widget_main.size_hint_x = 1
self.widget_main.size_hint_y = 1
2020-08-25 09:10:40 +08:00
self.widget_main.size = self.size
self.widget_main.pos = self.pos
self.widget_second.height = self.height
2020-08-26 08:00:29 +08:00
self.widget_second.size_hint_x = None
self.widget_second.size_hint_y = 1
2020-08-25 09:10:40 +08:00
self.widget_second.width = self.width * self.height / self.width
self.widget_second.pos = (0,0)
self.widget_second.opacity = 0.6
2020-08-25 10:17:49 +08:00
if not self.widget_main in self.children:
self.add_widget(self.widget_main)
2020-08-25 09:10:40 +08:00
if self.widget_second in self.children:
self.remove_widget(self.widget_second)
2020-08-25 10:17:49 +08:00
print('main_widget:width=%.02f,height=%.02f,pos=(%.02f,%.02f)' % (self.widget_main.width,self.widget_main.height,*self.widget_main.pos))
print('second_widget:width=%.02f,height=%.02f,pos=(%.02f,%.02f)' % (self.widget_second.width,self.widget_second.height,*self.widget_second.pos))
2020-08-25 10:28:37 +08:00
if self.second_flg:
self.add_widget(self.widget_second)
2020-08-25 09:10:40 +08:00
2020-08-25 11:47:20 +08:00
2020-08-25 09:10:40 +08:00
def vertical_layout(self):
2020-08-26 08:00:29 +08:00
self.widget_main.size_hint_x = 1
self.widget_main.size_hint_y = None
2020-08-25 09:10:40 +08:00
self.widget_main.width = self.width
self.widget_main.height = self.width / 16 * 10
self.widget_main.pos = (0, self.height - self.widget_main.height)
self.widget_second.width = self.width
2020-08-26 08:00:29 +08:00
self.widget_second.size_hint_x = 1
self.widget_second.size_hint_y = None
2020-08-25 09:10:40 +08:00
self.widget_second.height = self.height - self.widget_main.height
self.widget_second.pos = (0,0)
self.widget_second.opacity = 1
2020-08-25 10:17:49 +08:00
if not self.widget_main in self.children:
self.add_widget(self.widget_main)
if not self.widget_second in self.children:
self.add_widget(self.widget_second)
print('main_widget:width=%.02f,height=%.02f,pos=(%.02f,%.02f)' % (self.widget_main.width,self.widget_main.height,*self.widget_main.pos))
print('second_widget:width=%.02f,height=%.02f,pos=(%.02f,%.02f)' % (self.widget_second.width,self.widget_second.height,*self.widget_second.pos))
2020-08-25 09:10:40 +08:00
def main_widget_built(self,o,w):
2020-08-25 10:17:49 +08:00
print('main_widget_built() called ...')
2020-08-25 09:10:40 +08:00
self.widget_main = w
2020-08-25 17:13:12 +08:00
self.add_widget(self.widget_main)
2020-08-25 09:10:40 +08:00
if isinstance(self.widget_main, Widget) and isinstance(self.widget_second, Widget):
2020-08-25 17:13:12 +08:00
print('ready() called ..')
2020-08-25 10:17:49 +08:00
self.reready()
2020-08-25 09:10:40 +08:00
2020-08-25 10:17:49 +08:00
def second_widget_built(self,o,w):
print('second_widget_built() called ...')
2020-08-25 09:10:40 +08:00
self.widget_second = w
if isinstance(self.widget_main, Widget) and isinstance(self.widget_second, Widget):
2020-08-25 10:17:49 +08:00
print('ready() called ..')
self.reready()
2020-08-25 09:10:40 +08:00
def widget_build_failed(self, o, e):
pass