command_prompt: Add cursor and basic cursor functionality

This commit is contained in:
Ian Jauslin 2021-10-02 18:08:57 -04:00
parent 8d483d055b
commit 7ad1a56627
2 changed files with 58 additions and 9 deletions

View File

@ -1,5 +1,6 @@
from kivy.uix.label import Label from kivy.uix.label import Label
from kivy.core.window import Window from kivy.core.window import Window
from kivy.graphics import Color,Rectangle
class Command_prompt(Label): class Command_prompt(Label):
@ -10,21 +11,73 @@ class Command_prompt(Label):
# insert mode # insert mode
self.insert=False self.insert=False
# cursor position
self.cursor=0
self.cursor_width=9
# the text, with no color information
self.raw_text=""
# init Label # init Label
super(Command_prompt,self).__init__(**kwargs) super(Command_prompt,self).__init__(**kwargs)
self.keyboard = Window.request_keyboard(None,self,"text") self.keyboard = Window.request_keyboard(None,self,"text")
self.keyboard.bind(on_textinput=self.on_textinput,on_key_down=self.on_key_down) self.keyboard.bind(on_textinput=self.on_textinput,on_key_down=self.on_key_down)
self.draw()
def draw(self):
with self.canvas.before:
# background
Color(0,0,0)
Rectangle(pos=self.pos,size=self.size)
# cursor
Color(1,1,1)
Rectangle(pos=(self.pos[0]+self.cursor*self.cursor_width,self.pos[1]),size=(self.cursor_width,self.height))
# make text under cursor black
if self.cursor<len(self.raw_text):
self.text=self.raw_text[:self.cursor]+"[color=000]"+self.raw_text[self.cursor]+"[/color]"+self.raw_text[self.cursor+1:]
else:
self.text=self.raw_text
def on_key_down(self, keyboard, keycode, text, modifiers): def on_key_down(self, keyboard, keycode, text, modifiers):
print(keycode,text,modifiers)
if self.insert: if self.insert:
if keycode[1]=="enter": if keycode[1]=="enter":
self.insert=False self.insert=False
self.text="" self.set_text("")
elif keycode[1]=="left":
self.move_cursor(-1)
elif keycode[1]=="right":
self.move_cursor(1)
def on_textinput(self,window,text): def on_textinput(self,window,text):
print(text)
if self.insert: if self.insert:
self.text+=text self.append_text_at_cursor(text)
elif text==':': elif text==':':
self.text+=text self.append_text_at_cursor(text)
self.insert=True self.insert=True
# append to text at position of cursor
def append_text_at_cursor(self,text):
if self.cursor==len(self.raw_text):
self.raw_text+=text
else:
self.raw_text=self.raw_text[:self.cursor]+text+self.raw_text[self.cursor:]
self.cursor+=len(text)
self.draw()
# set text in prompt
def set_text(self,text):
self.raw_text=text
self.cursor=len(text)
self.draw()
# move cursor n steps to right (left if negative)
def move_cursor(self,n):
if n==0 or (n>0 and self.cursor==len(self.raw_text)) or (n<0 and self.cursor==0):
return
self.cursor=max(0,min(len(self.raw_text),self.cursor+n))
self.draw()

8
jam.kv
View File

@ -16,14 +16,10 @@
<Command_prompt>: <Command_prompt>:
canvas.before:
Color:
rgb: 0,0,0
Rectangle:
pos: self.pos
size: self.size
size_hint_y: None size_hint_y: None
height: 20 height: 20
markup: True
text_size: self.size text_size: self.size
font_name: "RobotoMono-Regular" font_name: "RobotoMono-Regular"
font_size: "15px"