bugfix
This commit is contained in:
parent
51315fdaee
commit
5b7377260f
191
kivyblocks/pagepanel.py
Normal file
191
kivyblocks/pagepanel.py
Normal file
@ -0,0 +1,191 @@
|
||||
|
||||
from kivy.core.window import Window
|
||||
from kivy.uix.widget import Widget
|
||||
from kivy.app import App
|
||||
from kivy.factory import Factory
|
||||
from .baseWidget import VBox, HBox
|
||||
from .toggleitems import PressableBox
|
||||
from .utils import *
|
||||
|
||||
class MenuContainer(VBox):
|
||||
def __init__(self, **kw):
|
||||
VBox.__init__(self, **kw)
|
||||
self.bind(on_touch_down=self.check_press)
|
||||
|
||||
def open(self):
|
||||
if self in Window.children:
|
||||
Window.remove_widget(self)
|
||||
Window.add_widget(self)
|
||||
|
||||
def dismiss(self, *args):
|
||||
self.clear_widgets()
|
||||
Window.remove_widget(self)
|
||||
|
||||
def check_press(self, o, touch):
|
||||
if touch.is_mouse_scrolling:
|
||||
return False
|
||||
if not self.collide_point(touch.x, touch.y):
|
||||
self.dismiss()
|
||||
return True
|
||||
return False
|
||||
|
||||
class PagePanel(VBox):
|
||||
def __init__(self, bar_size=3, bar_at='top', enable_on_close=False,
|
||||
left_menu=False, **kw):
|
||||
print('PagePanel().__init__():', bar_size, bar_at, left_menu)
|
||||
self.bar_size = bar_size
|
||||
self.bar_at = bar_at
|
||||
|
||||
self.enable_on_close = enable_on_close
|
||||
if self.enable_on_close:
|
||||
app = App.get_running_app()
|
||||
app.bind(on_close=self.on_close_handle)
|
||||
|
||||
if not left_menu:
|
||||
self.left_menu = None
|
||||
elif isinstance(left_menu, Widget):
|
||||
self.left_menu = left_menu
|
||||
else:
|
||||
print('left_menu=', left_menu, type(left_menu))
|
||||
self.left_menu = Factory.Blocks().widgetBuild(left_menu)
|
||||
self.sub_widgets = []
|
||||
VBox.__init__(self, **kw)
|
||||
self.bar = HBox(size_hint_y=None,
|
||||
spacing=15,
|
||||
height=CSize(bar_size))
|
||||
bcsize = bar_size * 0.85
|
||||
self.content = VBox()
|
||||
self.bar_back = VBox(size_hint=(None,None),size=CSize(bcsize,bcsize))
|
||||
self.bar_back_w = Factory.Blocks().widgetBuild({
|
||||
"widgettype":"PressableBox",
|
||||
"options":{
|
||||
"size":CSize(bcsize,bcsize),
|
||||
"size_hint":[None, None]
|
||||
},
|
||||
"subwidgets":[
|
||||
{
|
||||
"widgettype":"AsyncImage",
|
||||
"options":{
|
||||
"source":blockImage('backword.png')
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
self.bar_back_w.bind(on_press=self.pop)
|
||||
self.bar.add_widget(self.bar_back)
|
||||
if self.left_menu:
|
||||
self.bar_left_menu = Factory.Blocks().widgetBuild({
|
||||
"widgettype":"PressableBox",
|
||||
"options":{
|
||||
"size_hint":(None,None),
|
||||
"size":CSize(bcsize,bcsize)
|
||||
},
|
||||
"subwidgets":[
|
||||
{
|
||||
"widgettype":"AsyncImage",
|
||||
"options":{
|
||||
"source":blockImage('menu.png')
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
self.bar.add_widget(self.bar_left_menu)
|
||||
self.bar_left_menu.bind(on_press=self.show_left_menu)
|
||||
self.bar_title = HBox()
|
||||
self.bar.add_widget(self.bar_title)
|
||||
self.bar_right_menu = VBox(size_hint=(None,None),size=CSize(bcsize,bcsize))
|
||||
self.bar_right_menu_w = Factory.Blocks().widgetBuild({
|
||||
"widgettype":"PressableBox",
|
||||
"options":{
|
||||
"size_hint":(None,None),
|
||||
"size":CSize(bcsize,bcsize)
|
||||
},
|
||||
"subwidgets":[
|
||||
{
|
||||
"widgettype":"AsyncImage",
|
||||
"options":{
|
||||
"source":blockImage('right_menu.png')
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
self.bar.add_widget(self.bar_right_menu)
|
||||
self.bar_right_menu_w.bind(on_press=self.show_right_menu)
|
||||
|
||||
if bar_at == 'top':
|
||||
super().add_widget(self.bar)
|
||||
super().add_widget(self.content)
|
||||
else:
|
||||
super().add_widget(self.content)
|
||||
super().add_widget(self.bar)
|
||||
self.menu_container = MenuContainer()
|
||||
|
||||
def on_close_handle(self, o, *args):
|
||||
print('app.on_close fired, ...')
|
||||
if not self.enable_on_close:
|
||||
return True
|
||||
self.pop(None)
|
||||
if len(self.sub_widgets) > 1:
|
||||
return False
|
||||
return True
|
||||
|
||||
def pop(self, o, *args):
|
||||
self.bar_back.clear_widgets()
|
||||
self.content.clear_widgets()
|
||||
self.bar_title.clear_widgets()
|
||||
self.bar_right_menu.clear_widgets()
|
||||
if len(self.sub_widgets) < 1:
|
||||
return
|
||||
diss_w = self.sub_widgets[-1]
|
||||
self.sub_widgets = self.sub_widgets[:-1]
|
||||
self.show_currentpage()
|
||||
|
||||
def show_currentpage(self):
|
||||
w = self.sub_widgets[-1]
|
||||
if len(self.sub_widgets) > 1:
|
||||
self.bar_back.add_widget(self.bar_back_w)
|
||||
self.content.add_widget(w)
|
||||
if hasattr(w, 'title_widget'):
|
||||
self.bar_title.add_widget(w.title_widget)
|
||||
if hasattr(w, 'menu_widget'):
|
||||
self.bar_right_menu.add_widget(self.bar_right_menu_w)
|
||||
|
||||
def clear_widgets(self):
|
||||
self.bar_back.clear_widgets()
|
||||
self.content.clear_widgets()
|
||||
self.bar_title.clear_widgets()
|
||||
self.bar_right_menu.clear_widgets()
|
||||
|
||||
def add_widget(self, w,*args):
|
||||
if len(self.sub_widgets) > 0:
|
||||
pass
|
||||
self.sub_widgets.append(w)
|
||||
self.show_currentpage()
|
||||
|
||||
def show_left_menu(self, o):
|
||||
print('left_menu fired')
|
||||
if len(self.sub_widgets) < 1:
|
||||
return
|
||||
mc = MenuContainer()
|
||||
mc.add_widget(self.left_menu)
|
||||
mc.size_hint_x = 0.4
|
||||
mc.size_hint_y = 1
|
||||
mc.x = self.x
|
||||
mc.y = self.y
|
||||
mc.open()
|
||||
|
||||
def show_right_menu(self, o):
|
||||
print('right fired')
|
||||
if len(self.sub_widgets) < 1:
|
||||
return
|
||||
w = self.sub_widgets[-1]
|
||||
if not hasattr(w, 'menu_widget'):
|
||||
return True
|
||||
mc = MenuContainer()
|
||||
mc.add_widget(w.menu_widget)
|
||||
mc.size_hint_x = 0.4
|
||||
mc.size_hint_y = 1
|
||||
mc.x = self.x + self.width * 0.6
|
||||
mc.y = self.y
|
||||
mc.open()
|
||||
|
Loading…
Reference in New Issue
Block a user