LUITabbedFrame.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from LUIFrame import LUIFrame
  2. from LUILabel import LUILabel
  3. from LUIObject import LUIObject
  4. from LUIVerticalLayout import LUIVerticalLayout
  5. from LUIHorizontalLayout import LUIHorizontalLayout
  6. class LUITabbedFrame(LUIFrame):
  7. def __init__(self, **kwargs):
  8. super(LUITabbedFrame, self).__init__(**kwargs)
  9. # The main window layout
  10. bar_spacing = kwargs.get('bar_spacing', 3)
  11. self.root_layout = LUIVerticalLayout(parent = self,
  12. spacing = bar_spacing)
  13. self.root_layout.height = "100%"
  14. self.root_layout.width = "100%"
  15. self.root_layout.margin = 0
  16. # The header bar
  17. header_spacing = kwargs.get('header_spacing', 3)
  18. self.header_bar = LUIHorizontalLayout(parent = self.root_layout.cell("?"),
  19. spacing = header_spacing)
  20. self.root_layout.add(self.header_bar, "?")
  21. self.header_to_frame = {}
  22. self.current_frame = None
  23. # The main window contents
  24. self.main_frame = LUIObject()
  25. self.main_frame.height = "100%"
  26. self.main_frame.width = "100%"
  27. self.main_frame.margin = 0
  28. # self.main_frame.padding = 0
  29. self.root_layout.add(self.main_frame, "*")
  30. self.bind("expose", self.on_expose)
  31. self.bind("unexpose", self.on_unexpose)
  32. def add(self, header, frame):
  33. # header
  34. if isinstance(header, str):
  35. header = LUILabel(text = header)
  36. self.header_bar.add(header, "?")
  37. self.header_to_frame[header] = frame
  38. header.solid = True
  39. header.bind("click", self._change_to_tab)
  40. # Frame
  41. frame.parent = self.main_frame
  42. frame.width = "100%"
  43. frame.height = "100%"
  44. # Put frame in front
  45. if self.current_frame is None:
  46. self.current_frame = frame
  47. self.current_frame.show()
  48. else:
  49. frame.hide()
  50. return header
  51. def _find_header_index(self, header):
  52. for idx, child in enumerate(self.header_bar.children):
  53. if any([grandchild == header for grandchild in child.children]):
  54. break
  55. else:
  56. raise ValueError("Given object is not a header bar item.")
  57. return idx
  58. def remove(self, header):
  59. idx = self._find_header_index(header)
  60. self.header_bar.remove_cell(idx)
  61. frame = self.header_to_frame[header]
  62. frame.parent = None
  63. del self.header_to_frame[header]
  64. if self.current_frame == frame:
  65. self.current_frame = None
  66. def _change_to_tab(self, lui_event):
  67. header = lui_event.sender
  68. if self.current_frame is not None:
  69. self.current_frame.trigger_event("unexpose")
  70. self.current_frame.hide()
  71. self.current_frame = self.header_to_frame[header]
  72. self.current_frame.show()
  73. self.current_frame.trigger_event("expose")
  74. def on_expose(self, event):
  75. self.current_frame.trigger_event("expose")
  76. def on_unexpose(self, event):
  77. self.current_frame.trigger_event("unexpose")