I was working on a code to make textblocks in Blitz3D, and now im stumped. I need help moving the cursor and selecting text. Also, How do you convert an ASCII to a scancode. Thanks in advance!
Graphics 800,600,32,2
Global pointer = CreateImage(12,20)
SetBuffer ImageBuffer(pointer)
;fill
Color 255,255,255
For mainarrow = 0 To 10
Line 0,mainarrow,mainarrow,mainarrow
Next
For bottom = 0 To 5
Line 0,(15-bottom),bottom,(15-bottom)
Next
For stick = 0 To 1
Line 5+stick,11,8+stick,18
Next
;outline
Color 1,1,1
Line 0,0,0,15
Line 1,0,11,10
Line 11,10,7,10
Line 7,11,10,18
Line 0,15,4,11
Line 4,11,7,18
Line 8,19,9,19
SetBuffer BackBuffer()
ClsColor 235,233,237
Type textfield
Field x,y
Field x2,y2
Field selected
Field drawborder
Field strng$
End Type
textfield.textfield = New textfield
textfield\x = 10
textfield\y = 20
textfield\x2 = 200
textfield\y2 = 500
textfield\drawborder = True
textfield\strng$ = "This is a text box. You can enter words in here. It's quiet simple actually... Isn't this much better that input"
textfield.textfield = New textfield
textfield\x = 210
textfield\y = 20
textfield\x2 = 400
textfield\y2 = 500
textfield\drawborder = True
textfield\strng$ = "This is another box, but it doesn't work..."
Global keyboardcursor,cursorx,cursory
Global blink,blinkdelay = MilliSecs()
Global keypress,keyhold,lastpress = 2
Global lastlength,last2legth
While Not KeyDown(1)
Color 0,0,0
Text 0,0,"Text box example..."
UpdateWindowsElements()
Delay 6
Flip
Cls
Wend
Dim lettersperline(100)
Function UpdateWindowsElements()
lastpress = keypress
keypress = GetKey()
If lastpress = keypress And KeyDown(lastpress) ;the if statement is supposed to enable repeated keystrokes on hold but it doesn't work
DebugLog "It works!"
Else
keyhold = 0
EndIf
For textfield.textfield = Each textfield
If textfield\drawborder = True
Color 255,255,255
Rect textfield\x,textfield\y,textfield\x2-textfield\x,textfield\y2-textfield\y,1
Color 167,166,170
Rect textfield\x,textfield\y,textfield\x2-textfield\x,textfield\y2-textfield\y,0
Color 1,1,1
;Detect the enter key
brokenline$ = textfield\strng$
letters = 0
last2legth = 0
lastlength = 0
lines = 0
For enterkey = 1 To Len(textfield\strng$)
letters = letters + 1
If Asc(Mid$(textfield\strng$,enterkey)) = 13 Or letters*FontWidth() > textfield\x2-textfield\x-FontWidth()
If Asc(Mid$(textfield\strng$,enterkey)) = 13
fragementline$ = Left$(brokenline$,(letters-1))
Else
fragementline$ = Left$(brokenline$,letters)
EndIf
brokenline$ = Right$(brokenline$,Len(brokenline$)-letters)
Text textfield\x+1,textfield\y+1+(FontHeight()*lines),fragementline$
last2legth = lastlength
lastlength = letters
letters = 0
lines = lines + 1
EndIf
Next
Text textfield\x+1,textfield\y+1+(FontHeight()*lines),brokenline$
EndIf
If MouseDown(1)
If MouseX() >= textfield\x And MouseY() >= textfield\y And MouseX() <= textfield\x2 And MouseY() <= textfield\y2
textfield\selected = True
cursorx = textfield\x+1
cursory = textfield\y+1
Else
textfield\selected = False
EndIf
EndIf
If textfield\selected = True
If keypress > 0
If cursorx > textfield\x2-textfield\x ;auto wrap (right side)
cursorx = textfield\x+1
cursory = textfield\y+1+((lines)*FontHeight())
EndIf
If cursorx < textfield\x+1 ;auto wrap (left side)
cursorx = textfield\x2-textfield\x
cursory = textfield\y+1+((lines)*FontHeight())
EndIf
Select keypress
Case 8 ;backspace
If Len(textfield\strng$) > 0
If Asc(Right$(textfield\strng$,1)) = 13
cursory = cursory - FontHeight()
textfield\strng$ = Left$(textfield\strng$,Len(textfield\strng$)-1)
cursorx = textfield\x+1+(FontWidth()*last2legth)
Else
cursorx = cursorx - FontWidth()
textfield\strng$ = Left$(textfield\strng$,Len(textfield\strng$)-1)
EndIf
If cursorx < textfield\x ;auto wrap (left side)
cursorx = (textfield\x2-(textfield\x+1));-(FontWidth()*1)
cursory = textfield\y+1+((lines-1)*FontHeight())
EndIf
EndIf
Case 13 ;enter
textfield\strng$ = textfield\strng$ + Chr$(keypress)
cursorx = textfield\x+3
cursory = cursory + FontHeight()
Case 31 ;left arrow key
cursorx = cursorx - FontWidth()
Case 30 ;right arrow key
cursorx = cursorx + FontWidth()
Case 28 ;up arrow key
cursory = cursory - FontHeight()
Case 29 ;down arrow key
cursory = cursory + FontHeight()
Default
textfield\strng$ = textfield\strng$ + Chr$(keypress)
cursorx = cursorx + FontWidth()
End Select
blink = 0
blinkdelay = MilliSecs()
EndIf
If blink = 0 Then Color 0,0,0 Line cursorx,cursory,cursorx,cursory+FontHeight()
If MilliSecs() - blinkdelay >= 500
blinkdelay = MilliSecs()
Select blink
Case 0
blink = 1
Case 1
blink = 0
End Select
EndIf
EndIf
Next
DrawImage pointer,MouseX(),MouseY()
End Function
|