quests.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. from LUIFrame import LUIFrame
  2. from LUILabel import LUILabel
  3. from LUILayouts import LUIHorizontalLayout
  4. from LUIVerticalLayout import LUIVerticalLayout
  5. from LUIObject import LUIObject
  6. from LUIButton import LUIButton
  7. class UI_WindowTitleBar(LUIObject):
  8. def __init__(self, title="No title", **kwargs):
  9. LUIObject.__init__(self, solid=True, **kwargs)
  10. LUILabel(title, parent=self, top=1, center_horizontal=True)
  11. self.closeButton = LUIButton(text="X", parent=self, margin=0, top=1, right=16)
  12. self.closeButton._label.margin = 0, 12, 0, 12
  13. self.width = self.parent.parent.parent.width
  14. def _drag(self, event):
  15. if base.mouseWatcherNode.hasMouse():
  16. self.parent.parent.parent.set_pos(self.mousePosOffset())
  17. def on_mousedown(self, event=None):
  18. self.bind('mousemove', self._drag)
  19. def on_mouseup(self, event=None):
  20. self.unbind('mousemove')
  21. def mousePosOffset(self):
  22. left, top = self.mousePos()
  23. left -= self.parent.parent.parent.width / 2
  24. top -= 20
  25. return (left, top)
  26. def mousePos(self):
  27. if base.mouseWatcherNode.hasMouse():
  28. mpos = base.mouseWatcherNode.getMouse()
  29. mousePos = (mpos.getX() * base.getAspectRatio(), mpos.getY())
  30. screenWidth = base.win.getProperties().getXSize()
  31. screenHeight = base.win.getProperties().getYSize()
  32. ratio = base.getAspectRatio()
  33. # https://stackoverflow.com/questions/929103/convert-a-number-range-to-another-range-maintaining-ratio
  34. left = (((mousePos[0] - -ratio) * (screenWidth - 0)) / (ratio - -ratio)) + 0
  35. top = (((mousePos[1] - 1) * (screenHeight - 0)) / (-1 - 1)) + 0
  36. return (left, top)
  37. return(0,0)
  38. class UI_Window(LUIFrame):
  39. def __init__(self, title="No title", **kwargs):
  40. LUIFrame.__init__(self, inner_padding=0, style=LUIFrame.FS_raised, **kwargs)
  41. self.verticalLayout = LUIVerticalLayout(parent=self)
  42. self.contentWidget = None
  43. self.titleBar = UI_WindowTitleBar(title=title, parent=self.verticalLayout.cell(), margin=0)
  44. self.titleBar.closeButton.bind("click", self.close)
  45. def setContentWidget(self, widget):
  46. if self.contentWidget:
  47. self.contentWidget.parent = None
  48. self.contentWidget = widget
  49. self.contentWidget.parent = self.verticalLayout.cell()
  50. self.width = (self.contentWidget.width
  51. + self.get_margin_right()
  52. + self.get_margin_left()
  53. + self.get_padding_right()
  54. + self.get_padding_left())
  55. self.titleBar.width = self.width
  56. def close(self, event=None):
  57. self.parent = None
  58. class UI_CollapsableGroupBox(LUIObject):
  59. def __init__(self, title="No title", orientation="vertical", **kwargs):
  60. LUIObject.__init__(self, solid=True, **kwargs)
  61. if orientation == "vertical":
  62. self._mainLayout = LUIVerticalLayout(parent=self)
  63. else:
  64. self._mainLayout = LUIHorizontalLayout(parent=self)
  65. self._collapsed = False
  66. self._widgets = []
  67. # Header
  68. self._headerLayout = LUIHorizontalLayout(parent=self._mainLayout.cell())
  69. self._collapseButton = LUILabel("^", margin=(0,5,0,0), font_size=24, parent=self._headerLayout.cell())
  70. LUILabel(title, font_size=20, parent=self._headerLayout.cell())
  71. self.bind("click", self.toggleState)
  72. def toggleState(self, event=None):
  73. self._collapsed = not self._collapsed
  74. if self._collapsed:
  75. self._collapseButton.set_text(">")
  76. for widget in self._widgets:
  77. widget.hide()
  78. self.height = 20
  79. else:
  80. self._collapseButton.set_text("^")
  81. for widget in self._widgets:
  82. widget.show()
  83. self.height = None
  84. def addWidget(self, widget):
  85. self._widgets.append(widget)
  86. widget.parent = self._mainLayout.cell()
  87. class UI_QuestLogWindow(UI_Window):
  88. def __init__(self, **kwargs):
  89. UI_Window.__init__(self, title="Quest log", **kwargs)
  90. self.setContentWidget(UI_QuestLogWidget())
  91. class UI_QuestLogEntry(LUIObject):
  92. def __init__(self, title="No title", **kwargs):
  93. LUIObject.__init__(self, solid=True, **kwargs)
  94. self.layout = LUIHorizontalLayout(parent=self)
  95. LUILabel(title, margin=(0,10,0,0), parent=self.layout.cell(), font_size=18)
  96. LUILabel("0/1 complete", parent=self.layout.cell(), font_size=14)
  97. def on_mouseover(self, event):
  98. self.color = (1,0,0,1)
  99. def on_mouseout(self, event):
  100. self.color = (1,1,1,1)
  101. class UI_QuestsListWidget(LUIFrame):
  102. def __init__(self, **kwargs):
  103. LUIFrame.__init__(self, style=LUIFrame.FS_sunken, inner_padding=0, scrollable=True, **kwargs)
  104. self.layout = LUIVerticalLayout(parent=self)
  105. groupBox = UI_CollapsableGroupBox(title="In progress", parent=self.layout.cell())
  106. for i in range(1,20):
  107. groupBox.addWidget(UI_QuestLogEntry(title=" Very magical quest {}".format(i)))
  108. groupBox2 = UI_CollapsableGroupBox(title="Completed", parent=self.layout.cell())
  109. for i in range(1,20):
  110. groupBox2.addWidget(UI_QuestLogEntry(title=" Yeah quest {}".format(i)))
  111. class UI_QuestWidget(LUIFrame):
  112. def __init__(self, **kwargs):
  113. LUIFrame.__init__(self, style=LUIFrame.FS_sunken, inner_padding=0, scrollable=True, **kwargs)
  114. self.layout = LUIVerticalLayout(parent=self)
  115. txt = """Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nibh elit, volutpat at scelerisque at, blandit eget tellus. Vestibulum viverra libero ante. Morbi pharetra justo eget cursus mattis. Curabitur vitae efficitur ligula, vel molestie tellus. Nunc tempus blandit lectus, in malesuada enim tristique non. Etiam sed magna sodales, egestas ligula quis, tristique velit. Aliquam quam ex, tristique at ex molestie, ullamcorper tristique nulla. Phasellus consequat orci ac diam congue mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque mauris nunc, ultrices ut aliquam nec, elementum at mi. Nulla nec dapibus odio. Proin nec ultricies odio, et eleifend neque. Cras sapien enim, dictum eu erat nec, molestie sodales turpis. Integer eget mauris felis. Aenean eleifend ultricies nulla, eget tempor libero lacinia vel.
  116. Cras sed dui enim. Mauris in eros efficitur, elementum enim a, venenatis mi. Quisque id odio eget sem rhoncus lacinia nec ac eros. Etiam porta mi ac lacinia tristique. Cras lectus leo, dignissim ac metus tincidunt, suscipit mattis justo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec suscipit sollicitudin sagittis. Aliquam luctus ac est non dapibus. Nullam ultricies, turpis in aliquam egestas, est mauris vehicula erat, sed tristique nisl lorem ut sem. Donec efficitur varius turpis non rutrum. Curabitur lobortis, lorem a posuere egestas, tellus neque gravida arcu, vitae mattis enim sem at enim. Nam ac dui risus.
  117. Vivamus quis gravida quam. Morbi accumsan vestibulum tellus sed luctus. Cras et justo ac lacus feugiat condimentum at vel ex. Proin scelerisque rutrum quam et iaculis. Nunc dolor nibh, ullamcorper ac ante sit amet, dignissim consectetur enim. Cras placerat leo quam, non hendrerit mi pulvinar sed. Nulla mattis euismod sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut porta arcu mauris, et porttitor eros mattis a.
  118. Duis bibendum facilisis sodales. Cras aliquam nibh ultrices pulvinar malesuada. Nullam eu mollis augue. Sed semper turpis purus. Proin sit amet felis condimentum, ornare massa vitae, blandit velit. Nulla sed convallis ante, at blandit est. Quisque dapibus porttitor cursus. Phasellus eu consequat nulla. Vestibulum dui dolor, gravida sit amet sapien quis, rutrum scelerisque tortor. Donec sed nisl nulla. Donec sed leo urna.
  119. Cras ut dapibus velit, nec hendrerit lectus. Nulla faucibus dapibus posuere. Aenean rhoncus mi sollicitudin justo congue pharetra. Proin blandit urna et urna porta pulvinar. Donec bibendum nunc diam, quis fringilla tortor efficitur in. In ante sem, condimentum nec nunc in, venenatis molestie mi. Suspendisse lectus lectus, pellentesque sit amet commodo quis, pellentesque at mi. Mauris ornare dignissim justo in convallis. Sed quis urna eget dolor dictum malesuada dictum efficitur dolor. Suspendisse erat felis, hendrerit non ornare vel, tempor sed ex. Suspendisse viverra mi eu semper ullamcorper. In viverra tellus est, cursus bibendum purus vulputate sit amet. Donec faucibus diam sit amet rhoncus varius. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris a vulputate diam. """
  120. width = (self.width
  121. - self.get_margin_left()
  122. - self.get_margin_right()
  123. - self.get_padding_left()
  124. - self.get_padding_right())
  125. LUILabel("Quest title", margin=(0,10,0,0), parent=self.layout.cell(), font_size=24)
  126. LUILabel(txt, wordwrap=True, width=width, parent=self.layout.cell(), font_size=18)
  127. class UI_QuestLogWidget(LUIFrame):
  128. def __init__(self, **kwargs):
  129. LUIFrame.__init__(self, style=LUIFrame.FS_sunken, inner_padding=0, margin=(0,0,0,0), padding=(0,0,0,0), width=800, height=550, scrollable=False, **kwargs)
  130. self.layout = LUIHorizontalLayout(parent=self)
  131. UI_QuestsListWidget(parent=self.layout.cell(), width=self.width/2, height=self.height)
  132. UI_QuestWidget(parent=self.layout.cell(), width=self.width/2, height=self.height)