textarea.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. from libs.roundrects import aa_round_rect
  4. ## local UI import
  5. from UI.page import Page,PageStack,PageSelector
  6. from UI.label import Label
  7. from UI.fonts import fonts
  8. from UI.skin_manager import MySkinManager
  9. class Textarea:
  10. _PosX =0
  11. _PosY = 0
  12. _Width = 0
  13. _Height = 0
  14. _BackgroundColor = MySkinManager.GiveColor('TitleBg')
  15. _CanvasHWND = None
  16. _MyWords = []
  17. _BlitWords = []
  18. _FontObj = None
  19. _LineNumber = 0
  20. _TextLimit = 63
  21. _TextFull = False
  22. _TextIndex = 0
  23. _BlitIndex = 0
  24. def __init__(self):
  25. pass
  26. def Init(self):
  27. self._FontObj = fonts["veramono24"]
  28. #pygame.font.Font(fonts_path["veramono"],24)
  29. def SubTextIndex(self):
  30. self._TextIndex-=1
  31. if self._TextIndex < 0:
  32. self._TextIndex = 0
  33. def AddTextIndex(self):
  34. self._TextIndex +=1
  35. if self._TextIndex > len(self._MyWords):
  36. self._TextIndex = len(self._MyWords)
  37. def ResetMyWords(self):
  38. self._MyWords = []
  39. self._TextIndex = 0
  40. def RemoveFromLastText(self):
  41. if len(self._MyWords) > 0:
  42. self.SubTextIndex()
  43. del self._MyWords[self._TextIndex]
  44. return self._MyWords
  45. def AppendText(self,alphabet):
  46. self.AppendAndBlitText(alphabet)
  47. def AppendAndBlitText(self,alphabet):
  48. if self._TextFull != True:
  49. self._MyWords.insert(self._TextIndex,alphabet)
  50. self.BlitText()
  51. self.AddTextIndex()
  52. else:
  53. print("is Full %s" % "".join(self._MyWords))
  54. def BuildBlitText(self):
  55. blit_rows = [[]]
  56. w = 0
  57. xmargin = 5
  58. endmargin = 15
  59. x = self._PosX+xmargin
  60. linenumber = 0
  61. cursor_row = 0
  62. for i, v in enumerate(self._MyWords):
  63. t = self._FontObj.render(v, True, (8, 135, 174))
  64. t_width = t.get_width()
  65. w += t_width
  66. del(t)
  67. blit_rows[linenumber].append(v)
  68. if i == self._TextIndex - 1:
  69. cursor_row = linenumber
  70. if w + t_width >= self._Width-endmargin:
  71. x = self._PosX+xmargin
  72. w = 0
  73. linenumber += 1
  74. blit_rows.append([])
  75. # only paint 2 rows
  76. if len(blit_rows) == 1:
  77. self._BlitWords = blit_rows[0]
  78. self._BlitIndex = self._TextIndex
  79. elif len(blit_rows) == 2 or cursor_row < 2:
  80. self._BlitWords = blit_rows[0] + blit_rows[1]
  81. self._BlitIndex = self._TextIndex
  82. else:
  83. self._BlitWords = blit_rows[cursor_row - 1] + blit_rows[cursor_row]
  84. self._BlitIndex = self._TextIndex
  85. for i,v in enumerate(blit_rows):
  86. if i == cursor_row - 1:
  87. break
  88. self._BlitIndex -= len(v)
  89. def BlitText(self):
  90. """
  91. blit every single word into surface and calc the width ,check multi line
  92. """
  93. # build up blitwords
  94. self.BuildBlitText()
  95. w = 0
  96. xmargin = 5
  97. endmargin = 15
  98. x = self._PosX+xmargin
  99. y = self._PosY
  100. linenumber = 0
  101. self._TextFull = len(self._MyWords) > self._TextLimit
  102. for i, v in enumerate(self._BlitWords):
  103. t = self._FontObj.render(v,True,(8,135,174))
  104. w += t.get_width()
  105. if w >= self._Width-endmargin and linenumber == 0:
  106. linenumber +=1
  107. x = self._PosX+xmargin
  108. y = self._PosY + t.get_height() * linenumber
  109. w = 0
  110. self._CanvasHWND.blit(t, (x,y))
  111. x += t.get_width()
  112. def Cursor(self):
  113. w = 0
  114. xmargin = 5
  115. endmargin = 15
  116. x = self._PosX+xmargin
  117. y = self._PosY
  118. linenumber = 0
  119. for i,v in enumerate(self._BlitWords[:self._BlitIndex]):
  120. t = self._FontObj.render(v,True,(8,135,174))
  121. w += t.get_width()
  122. if w >= self._Width-endmargin and linenumber == 0:
  123. x = self._PosX+xmargin
  124. y = self._PosY+ t.get_height()
  125. w = 0
  126. linenumber +=1
  127. if w >= self._Width-endmargin*3 and linenumber > 0:
  128. x += t.get_width()
  129. break
  130. x += t.get_width()
  131. self._CanvasHWND.blit(self._FontObj.render("_",True,(0,0,0)),(x+1,y-2))
  132. def Draw(self):
  133. #aa_round_rect(self._CanvasHWND, (4,24.5+6,312,60),self._BackgroundColor,4,0,self._BackgroundColor)
  134. aa_round_rect(self._CanvasHWND,
  135. (self._PosX,self._PosY,self._Width,self._Height),self._BackgroundColor,4,0,self._BackgroundColor)
  136. self.BlitText()
  137. self.Cursor()