88 lines
3.1 KiB
Python
88 lines
3.1 KiB
Python
from LUIFrame import LUIFrame
|
|
from LUILabel import LUILabel
|
|
from LUIObject import LUIObject
|
|
from LUIVerticalLayout import LUIVerticalLayout
|
|
from LUIHorizontalLayout import LUIHorizontalLayout
|
|
|
|
class LUITabbedFrame(LUIFrame):
|
|
def __init__(self, **kwargs):
|
|
super(LUITabbedFrame, self).__init__(**kwargs)
|
|
|
|
# The main window layout
|
|
bar_spacing = kwargs.get('bar_spacing', 3)
|
|
self.root_layout = LUIVerticalLayout(parent = self,
|
|
spacing = bar_spacing)
|
|
self.root_layout.height = "100%"
|
|
self.root_layout.width = "100%"
|
|
self.root_layout.margin = 0
|
|
|
|
# The header bar
|
|
header_spacing = kwargs.get('header_spacing', 3)
|
|
self.header_bar = LUIHorizontalLayout(parent = self.root_layout.cell("?"),
|
|
spacing = header_spacing)
|
|
self.root_layout.add(self.header_bar, "?")
|
|
self.header_to_frame = {}
|
|
self.current_frame = None
|
|
|
|
# The main window contents
|
|
self.main_frame = LUIObject()
|
|
self.main_frame.height = "100%"
|
|
self.main_frame.width = "100%"
|
|
self.main_frame.margin = 0
|
|
# self.main_frame.padding = 0
|
|
self.root_layout.add(self.main_frame, "*")
|
|
self.bind("expose", self.on_expose)
|
|
self.bind("unexpose", self.on_unexpose)
|
|
|
|
def add(self, header, frame):
|
|
# header
|
|
if isinstance(header, str):
|
|
header = LUILabel(text = header)
|
|
self.header_bar.add(header, "?")
|
|
self.header_to_frame[header] = frame
|
|
header.solid = True
|
|
header.bind("click", self._change_to_tab)
|
|
# Frame
|
|
frame.parent = self.main_frame
|
|
frame.width = "100%"
|
|
frame.height = "100%"
|
|
# Put frame in front
|
|
if self.current_frame is None:
|
|
self.current_frame = frame
|
|
self.current_frame.show()
|
|
else:
|
|
frame.hide()
|
|
return header
|
|
|
|
def _find_header_index(self, header):
|
|
for idx, child in enumerate(self.header_bar.children):
|
|
if any([grandchild == header for grandchild in child.children]):
|
|
break
|
|
else:
|
|
raise ValueError("Given object is not a header bar item.")
|
|
return idx
|
|
|
|
def remove(self, header):
|
|
idx = self._find_header_index(header)
|
|
self.header_bar.remove_cell(idx)
|
|
frame = self.header_to_frame[header]
|
|
frame.parent = None
|
|
del self.header_to_frame[header]
|
|
if self.current_frame == frame:
|
|
self.current_frame = None
|
|
|
|
def _change_to_tab(self, lui_event):
|
|
header = lui_event.sender
|
|
if self.current_frame is not None:
|
|
self.current_frame.trigger_event("unexpose")
|
|
self.current_frame.hide()
|
|
self.current_frame = self.header_to_frame[header]
|
|
self.current_frame.show()
|
|
self.current_frame.trigger_event("expose")
|
|
|
|
def on_expose(self, event):
|
|
self.current_frame.trigger_event("expose")
|
|
|
|
def on_unexpose(self, event):
|
|
self.current_frame.trigger_event("unexpose")
|