about summary refs log tree commit diff stats
path: root/code
diff options
context:
space:
mode:
Diffstat (limited to 'code')
-rw-r--r--code/cli.rb168
1 files changed, 168 insertions, 0 deletions
diff --git a/code/cli.rb b/code/cli.rb
new file mode 100644
index 00000000..3736f60c
--- /dev/null
+++ b/code/cli.rb
@@ -0,0 +1,168 @@
+require 'ncurses'
+
+module Interface
+	def self.keytable(key)
+		case key
+		when 12
+			'<redraw>'
+		when ?\n
+			'<cr>'
+		when ?\b, Ncurses::KEY_BACKSPACE, 127
+			'<bs>'
+		when Ncurses::KEY_RIGHT
+			'<right>'
+		when Ncurses::KEY_LEFT
+			'<left>'
+		when Ncurses::KEY_UP
+			'<up>'
+		when Ncurses::KEY_DOWN
+			'<down>'
+		when ?\e
+			'<esc>'
+# keep spaces as they are, makes more sense
+#		when ?\s
+#			'<space>'
+		when Ncurses::KEY_BTAB
+			'<s-tab>'
+		when 9
+			'<tab>'
+		when 1..26 # CTRL + ...
+			"<c-#{(key+96).chr}>"
+		when 32..127
+			key.chr
+		else
+			log(key)
+			''
+		end
+	end
+
+	def self.included(this)
+		@@window = Ncurses.initscr
+		starti
+	end
+
+	# (Re)Start the Interface
+	def starti
+		@@running = true
+		@@screen = Ncurses.stdscr
+		@@screen.keypad(true)
+		Ncurses.start_color
+		Ncurses.use_default_colors
+
+		Ncurses.noecho
+		Ncurses.curs_set 0
+		Ncurses.halfdelay(200)
+		@@colortable = []
+	end
+
+	# Close the Interface
+	def closei
+		@@running = false
+		Ncurses.echo
+		Ncurses.nocbreak
+		Ncurses.curs_set 1
+		Ncurses.endwin
+	end
+
+	def running?() @@running end
+
+	def cleari
+		Ncurses.mvaddstr(0, 0, ' ' * (lines * cols))
+	end
+
+	def geti
+		Interface::keytable(Ncurses.getch)
+	end
+
+	def set_title(x)
+		print "\e]2;#{x}\007"
+	end
+
+	def lines
+		Ncurses.LINES
+	end
+
+	def cols
+		Ncurses.COLS
+	end
+
+	def movi(y=0, x=0)
+		y < 0 and y += lines
+		Ncurses.move(y, x)
+	end
+
+	def puti *args
+		case args.size
+		when 1
+			Ncurses.addstr(args[0].to_s)
+		when 2
+			if (y = args[0]) < 0 then y += Ncurses.LINES end
+			Ncurses.mvaddstr(y, 0, args[1].to_s)
+		when 3
+			if (y = args[0]) < 0 then y += Ncurses.LINES end
+			Ncurses.mvaddstr(y, args[1], args[2].to_s)
+		end
+	end
+
+	def color(fg = -1, bg = -1)
+		if OPTIONS['color']
+			Ncurses.color_set(get_color(fg,bg), nil)
+		end
+	end
+
+	def color_at y, x=0, len=-1, fg=-1, bg=-1, attributes=0
+		if OPTIONS['color']
+			if y < 0 then y += Ncurses.LINES end
+			Ncurses.mvchgat(y, x, len, attributes, get_color(fg, bg), nil)
+		end
+	end
+
+	def color_bold_at y, x=0, len=-1, fg=-1, bg=-1
+		color_at(y, x, len, fg, bg, attributes = Ncurses::A_BOLD)
+	end
+
+	def color_reverse_bold_at y, x=0, len=-1, fg=-1, bg=-1
+		if OPTIONS['color']
+			color_at(y, x, len, fg, bg, Ncurses::A_REVERSE | Ncurses::A_BOLD)
+		else
+			Ncurses.mvchgat(y, x, len, Ncurses::A_REVERSE | Ncurses::A_BOLD, 0, nil)
+		end
+	end
+	alias color_bold_reverse_at color_reverse_bold_at
+
+	def color_reverse_at y, x=0, len=-1, fg=-1, bg=-1
+		if OPTIONS['color']
+			color_at(y, x, len, fg, bg, Ncurses::A_REVERSE)
+		else
+			Ncurses.mvchgat(y, x, len, Ncurses::A_REVERSE, 0, nil)
+		end
+	end
+
+	def get_color(fg, bg)
+		n = bg+2 + 9*(fg+2)
+		color = @@colortable[n]
+		unless color
+			# create a new pair
+			size = @@colortable.reject{|x| x.nil? }.size + 1
+			Ncurses::init_pair(size, fg, bg)
+			color = @@colortable[n] = size
+		end
+		return color
+	end
+
+	def bold(b = true)
+		if b
+			Ncurses.attron(Ncurses::A_BOLD) 
+		else
+			Ncurses.attroff(Ncurses::A_BOLD) 
+		end
+	end
+
+	def reverse(b = true)
+		if b
+			Ncurses.attron(Ncurses::A_REVERSE) 
+		else
+			Ncurses.attroff(Ncurses::A_REVERSE) 
+		end
+	end
+end