123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- import pygame, sys
- import pygame.freetype
- ###CONSTS
- # Set to true or add 'showevent' in argv to see IME and KEYDOWN events
- PRINT_EVENT = False
- # frames per second, the general speed of the program
- FPS = 50
- # size of window
- WINDOWWIDTH, WINDOWHEIGHT = 640, 480
- BGCOLOR = (0, 0, 0)
- # position of chatlist and chatbox
- CHATLIST_POS = pygame.Rect(0, 20, WINDOWWIDTH, 400)
- CHATBOX_POS = pygame.Rect(0, 440, WINDOWWIDTH, 40)
- CHATLIST_MAXSIZE = 20
- TEXTCOLOR = (0,255,0)
- #Add fontname for each language, otherwise some text can't be correctly displayed.
- FONTNAMES = ["notosanscjktcregular", "notosansmonocjktcregular" ,
- "notosansregular,",
- "microsoftjhengheimicrosoftjhengheiuilight",
- "microsoftyaheimicrosoftyaheiuilight",
- "msgothicmsuigothicmspgothic",
- "msmincho",
- "Arial"]
- #Version check
- if (pygame.get_sdl_version() < (2,0,0)):
- raise Exception("This example requires SDL2.")
- #Initalize
- pygame.init()
- Screen = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))
- pygame.display.set_caption("TextInput example")
- FPSClock = pygame.time.Clock()
- #Freetype
- #"The font name can be a comma separated list of font names to search for."
- FONTNAMES = ",".join(str(x) for x in FONTNAMES)
- Font = pygame.freetype.SysFont(FONTNAMES, 24)
- FontSmall = pygame.freetype.SysFont(FONTNAMES, 16)
- print("Using font: " + Font.name)
- #Main loop process
- def main():
- global BGCOLOR, PRINT_EVENT, CHATBOX_POS, CHATLIST_POS, CHATLIST_MAXSIZE
- global FPSClock , Font, Screen
-
- """
- https://wiki.libsdl.org/SDL_HINT_IME_INTERNAL_EDITING
- https://wiki.libsdl.org/Tutorials/TextInput
- Candidate list not showing due to SDL2 problem ;w;
- """
- pygame.key.start_text_input()
- input_rect = pygame.Rect(80,80,320,40)
- pygame.key.set_text_input_rect(input_rect)
- _IMEEditing = False
- _IMEText = ""
- _IMETextPos = 0
- _IMEEditingText = ""
- _IMEEditingPos = 0
- ChatList = []
-
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- return
-
- elif event.type == pygame.KEYDOWN:
- if (PRINT_EVENT):
- print(event)
- if _IMEEditing:
- if (len(_IMEEditingText) == 0):
- _IMEEditing = False
- continue
-
- if event.key == pygame.K_BACKSPACE:
- if (len(_IMEText) > 0 and _IMETextPos > 0):
- _IMEText = _IMEText[0:_IMETextPos-1] + _IMEText[_IMETextPos:]
- _IMETextPos = max(0,_IMETextPos-1)
-
- elif event.key == pygame.K_DELETE:
- _IMEText = _IMEText[0:_IMETextPos] + _IMEText[_IMETextPos+1:]
- elif event.key == pygame.K_LEFT:
- _IMETextPos = max(0,_IMETextPos-1)
- elif event.key == pygame.K_RIGHT:
- _IMETextPos = min(len(_IMEText),_IMETextPos+1)
-
- elif event.key in [pygame.K_RETURN, pygame.K_KP_ENTER] and len(event.unicode) == 0:
- #Block if we have no text to append
- if len(_IMEText) == 0:
- continue
- #Append chat list
- ChatList.append(_IMEText)
- if (len(ChatList) > CHATLIST_MAXSIZE):
- ChatList.pop(0)
- _IMEText = ""
- _IMETextPos = 0
-
- elif event.type == pygame.TEXTEDITING:
- if (PRINT_EVENT):
- print(event)
- _IMEEditing = True
- _IMEEditingText = event.text
- _IMEEditingPos = event.start
- elif event.type == pygame.TEXTINPUT:
- if (PRINT_EVENT):
- print(event)
- _IMEEditing = False
- _IMEEditingText = ""
- _IMEText = _IMEText[0:_IMETextPos] + event.text + _IMEText[_IMETextPos:]
- _IMETextPos += len(event.text)
-
- #Screen updates
- Screen.fill(BGCOLOR)
-
- #Chat List updates
- chat_height = CHATLIST_POS.height / CHATLIST_MAXSIZE
- for i in range(len(ChatList)):
- FontSmall.render_to(Screen, (CHATLIST_POS.x, CHATLIST_POS.y + i*chat_height), ChatList[i], TEXTCOLOR)
-
- #Chat box updates
- start_pos = CHATBOX_POS.copy()
- ime_textL = ">" + _IMEText[0:_IMETextPos]
- ime_textM = _IMEEditingText[0:_IMEEditingPos] + "|" + _IMEEditingText[_IMEEditingPos:]
- ime_textR = _IMEText[_IMETextPos:]
-
- rect_textL = Font.render_to(Screen, start_pos, ime_textL, TEXTCOLOR)
- start_pos.x += rect_textL.width
-
- #Editing texts should be underlined
- rect_textM = Font.render_to(Screen, start_pos, ime_textM, TEXTCOLOR, None, pygame.freetype.STYLE_UNDERLINE)
- start_pos.x += rect_textM.width
- rect_textr = Font.render_to(Screen, start_pos, ime_textR, TEXTCOLOR)
-
- pygame.display.update()
-
- FPSClock.tick(FPS)
-
- if __name__ == '__main__':
- if 'showevent' in sys.argv:
- PRINT_EVENT = True
-
- main()
|