111 lines
2.7 KiB
Python
Executable file
111 lines
2.7 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
|
|
import curses,time,json,sys
|
|
|
|
dataPath = '/home/lickthecheese/nboard/nboard.json'
|
|
|
|
allowedChars = " `~1234567890-=!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\"zxcvbnm,./ZXCVBNM<>?"
|
|
data = {}
|
|
|
|
def main(stdscr):
|
|
stdscr.erase()
|
|
stdscr.refresh()
|
|
k='NOU'
|
|
height, width = stdscr.getmaxyx()
|
|
vx = vy = tx = ty = nl = 0
|
|
|
|
cx = width // 2
|
|
cy = height // 2
|
|
|
|
stdscr.move(cy,cx)
|
|
while True:
|
|
cx = width // 2
|
|
cy = height // 2
|
|
|
|
stdscr.clear()
|
|
|
|
height, width = stdscr.getmaxyx()
|
|
|
|
|
|
# detect where to move cursor
|
|
if k == 'KEY_UP':
|
|
vy += -1
|
|
nl = vx
|
|
if k == 'KEY_DOWN':
|
|
vy += 1
|
|
nl = vx
|
|
if k == 'KEY_LEFT':
|
|
vx += -1
|
|
nl = vx
|
|
if k == 'KEY_RIGHT':
|
|
vx += 1
|
|
nl = vx
|
|
if k == '\n':
|
|
vx = nl
|
|
vy += 1
|
|
if k == 'KEY_BACKSPACE':
|
|
vx += -1
|
|
|
|
# make sure the cursor is on the screen
|
|
# this is not nessesary for the view as it is infinite
|
|
cx = max(0, cx)
|
|
cx = min(width-1, cx)
|
|
|
|
cy = max(0, cy)
|
|
cy = min(height-2, cy)
|
|
|
|
# calculate true position
|
|
tx = cx + (vx) - width // 2
|
|
ty = cy + (vy) - (height-1) // 2
|
|
|
|
# get json data
|
|
with open(dataPath, 'r') as openfile:
|
|
data = json.load(openfile)
|
|
|
|
# if valid key pressed, write it
|
|
if k in allowedChars:
|
|
data[str((ty,tx))] = k
|
|
vx = vx+1
|
|
with open(dataPath, 'w') as outfile:
|
|
json.dump(data, outfile)
|
|
tx = cx + (vx) - width // 2
|
|
|
|
# draw the screen
|
|
stdscr.move(0, 0)
|
|
for y in range(height-1):
|
|
for x in range(width):
|
|
stdscr.move(y,x)
|
|
stdscr.addstr(data.get(str((ty - cy + y,tx - cx + x)), ' '))
|
|
|
|
|
|
# display some info
|
|
stdscr.addstr(height-1, 0, 'x: {}, y: {}, arrow keys to move'.format(tx, 0-ty)[:width-1])
|
|
|
|
|
|
# move the cursor where its actually supposed to be
|
|
stdscr.move(cy,cx)
|
|
|
|
#print(str(k)) # debug keycodes
|
|
|
|
k = stdscr.getkey()
|
|
time.sleep(0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) > 1 and (sys.argv[1] == '--help' or sys.argv[1] == 'help'):
|
|
print("""
|
|
nboard is like yourworldoftext.com, except its in a terminal.
|
|
|
|
use the arrow keys to move arount
|
|
once you are in the place you want, you can start typing!
|
|
|
|
please report any bugs to ~xfnw on IRC or on the tildegit page,
|
|
https://tildegit.org/xfnw/nboard
|
|
""")
|
|
else:
|
|
try:
|
|
curses.wrapper(main)
|
|
except KeyboardInterrupt:
|
|
print('bye!')
|
|
|