Implement a simple demo with Ncurses
This commit is contained in:
parent
70c503eeec
commit
0c412c10e4
4 changed files with 187 additions and 121 deletions
|
@ -1,13 +1,34 @@
|
||||||
|
|
||||||
|
require "clim"
|
||||||
|
|
||||||
|
require "./tui"
|
||||||
|
|
||||||
module Noozoid
|
module Noozoid
|
||||||
class Cli < Thor
|
class Cli < Clim
|
||||||
|
main do
|
||||||
|
desc "Happy Send - Mass send short text messages via your smartphone + kdeconnect"
|
||||||
|
|
||||||
desc 'gui', 'Start ncurses GUI'
|
usage "happy-send [options] [arguments] ..."
|
||||||
def gui
|
|
||||||
Gui.start
|
option "-v", "--verbose",
|
||||||
|
type: Bool,
|
||||||
|
default: false,
|
||||||
|
desc: "Enable debug messages"
|
||||||
|
|
||||||
|
option "-c FILE", "--csv=FILE",
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
desc: "Use given CSV (mandatory fields: number,message)"
|
||||||
|
|
||||||
|
run do |opts, args|
|
||||||
|
Log.setup(:warn)
|
||||||
|
Log.setup(:debug) if opts.verbose
|
||||||
|
|
||||||
|
app = Noozoid::Tui.new
|
||||||
|
app.run
|
||||||
|
# app = HappyApp.new(csv: opts.csv, send: opts.send, wait: opts.wait)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
default_task :gui
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Noozoid
|
|
||||||
# Gui
|
|
||||||
module Gui
|
|
||||||
# app
|
|
||||||
class App
|
|
||||||
def initialize
|
|
||||||
@tree = Noozoid::Models::Node.new('untitled')
|
|
||||||
end
|
|
||||||
|
|
||||||
def run
|
|
||||||
Curses.noecho
|
|
||||||
Curses.nonl
|
|
||||||
Curses.stdscr.keypad(true)
|
|
||||||
# Curses.raw
|
|
||||||
# Curses.stdscr.nodelay = 1
|
|
||||||
Curses.curs_set(0)
|
|
||||||
# Curses.start_color
|
|
||||||
Curses.init_screen
|
|
||||||
Curses.refresh
|
|
||||||
|
|
||||||
# attach models to views
|
|
||||||
@main_window = MainView.new(self)
|
|
||||||
@main_window.draw
|
|
||||||
@main_window.wait
|
|
||||||
|
|
||||||
rescue StandardError => e
|
|
||||||
Curses.close_screen
|
|
||||||
warn e.message unless e.nil?
|
|
||||||
warn e.backtrace unless e.nil?
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.start
|
|
||||||
app = App.new
|
|
||||||
app.run
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
88
src/lib/tui.cr
Normal file
88
src/lib/tui.cr
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
|
||||||
|
require "ncurses"
|
||||||
|
|
||||||
|
module Noozoid
|
||||||
|
class Tui
|
||||||
|
def initialize
|
||||||
|
#@tree = Noozoid::Models::Node.new('untitled')
|
||||||
|
end
|
||||||
|
|
||||||
|
def run
|
||||||
|
# initialize
|
||||||
|
NCurses.init
|
||||||
|
NCurses.cbreak
|
||||||
|
NCurses.noecho
|
||||||
|
NCurses.keypad(true)
|
||||||
|
NCurses.start_color
|
||||||
|
|
||||||
|
# define background color
|
||||||
|
pair = NCurses::ColorPair.new(1).init(NCurses::Color::RED, NCurses::Color::BLACK)
|
||||||
|
NCurses.bkgd(pair)
|
||||||
|
NCurses.curs_set(0)
|
||||||
|
|
||||||
|
NCurses.erase
|
||||||
|
|
||||||
|
# move the cursor & write
|
||||||
|
NCurses.move(x:0, y: 1)
|
||||||
|
NCurses.addstr(NCurses.longname)
|
||||||
|
|
||||||
|
|
||||||
|
NCurses.move(x:0, y: 2)
|
||||||
|
NCurses.addstr(NCurses.curses_version)
|
||||||
|
|
||||||
|
|
||||||
|
# attach models to views
|
||||||
|
#@main_window = MainView.new(self)
|
||||||
|
#@main_window.draw
|
||||||
|
#@main_window.wait
|
||||||
|
|
||||||
|
NCurses.notimeout(true)
|
||||||
|
|
||||||
|
x = NCurses.maxx / 2
|
||||||
|
y = NCurses.maxy / 2
|
||||||
|
|
||||||
|
loop do
|
||||||
|
NCurses.erase
|
||||||
|
NCurses.move(x: x, y: y)
|
||||||
|
NCurses.addstr("o")
|
||||||
|
NCurses.refresh
|
||||||
|
|
||||||
|
key = NCurses.getch
|
||||||
|
|
||||||
|
case key
|
||||||
|
when 'q', NCurses::KeyCode::ESC
|
||||||
|
break
|
||||||
|
|
||||||
|
when NCurses::KeyCode::LEFT
|
||||||
|
x -= 1
|
||||||
|
x = 0 if x < 0
|
||||||
|
|
||||||
|
when NCurses::KeyCode::RIGHT
|
||||||
|
x += 1
|
||||||
|
x = NCurses.maxx - 1 if x >= NCurses.maxx
|
||||||
|
|
||||||
|
when NCurses::KeyCode::UP
|
||||||
|
y -= 1
|
||||||
|
y = 0 if y < 0
|
||||||
|
|
||||||
|
when NCurses::KeyCode::DOWN
|
||||||
|
y += 1
|
||||||
|
y = NCurses.maxy - 2 if y >= NCurses.maxy - 1
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
NCurses.endwin
|
||||||
|
|
||||||
|
#rescue StandardError => e
|
||||||
|
#Curses.close_screen
|
||||||
|
#warn e.message unless e.nil?
|
||||||
|
#warn e.backtrace unless e.nil?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.start
|
||||||
|
app = App.new
|
||||||
|
app.run
|
||||||
|
end
|
||||||
|
end
|
147
src/main.cr
147
src/main.cr
|
@ -1,81 +1,78 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# Usage:
|
|
||||||
# - Start new mindmap:
|
|
||||||
# `ruby ttymindmap.rb`
|
|
||||||
# - Open Freemind format MM mindmap:
|
|
||||||
# `ruby ttymindmap.rb <PATH-TO-MM-FILE>`
|
|
||||||
#
|
|
||||||
# Press `h` key when running for help.
|
|
||||||
|
|
||||||
require 'noozoid'
|
require "log"
|
||||||
|
require "./lib/cli"
|
||||||
|
|
||||||
|
LOG = ::Log.for("noozoid")
|
||||||
|
#LOG = Logger.new(STDOUT, level: Logger::WARN)
|
||||||
|
|
||||||
Noozoid::Cli.start(ARGV)
|
Noozoid::Cli.start(ARGV)
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
def print_help
|
# def print_help
|
||||||
puts '= Commands ='
|
# puts '= Commands ='
|
||||||
puts ''
|
# puts ''
|
||||||
puts '- Navigation -'
|
# puts '- Navigation -'
|
||||||
puts "#{KEYS[:nav_parent]}: go to parent node"
|
# puts "#{KEYS[:nav_parent]}: go to parent node"
|
||||||
puts "#{KEYS[:nav_child]}: go to children node"
|
# puts "#{KEYS[:nav_child]}: go to children node"
|
||||||
puts "#{KEYS[:nav_previous]}: previous sibling"
|
# puts "#{KEYS[:nav_previous]}: previous sibling"
|
||||||
puts "#{KEYS[:nav_next]}: next sibling"
|
# puts "#{KEYS[:nav_next]}: next sibling"
|
||||||
puts ''
|
# puts ''
|
||||||
puts "- Action -"
|
# puts "- Action -"
|
||||||
puts "#{KEYS[:node_create]}: create child node"
|
# puts "#{KEYS[:node_create]}: create child node"
|
||||||
puts "#{KEYS[:node_delete]}: remove node"
|
# puts "#{KEYS[:node_delete]}: remove node"
|
||||||
puts "#{KEYS[:node_toggle]}: toggle"
|
# puts "#{KEYS[:node_toggle]}: toggle"
|
||||||
puts ''
|
# puts ''
|
||||||
puts "- Misc -"
|
# puts "- Misc -"
|
||||||
puts "#{KEYS[:main_help]}: show this help"
|
# puts "#{KEYS[:main_help]}: show this help"
|
||||||
puts "#{KEYS[:main_quit]}: exit program"
|
# puts "#{KEYS[:main_quit]}: exit program"
|
||||||
puts '[press a key to continue]'
|
# puts '[press a key to continue]'
|
||||||
read_command
|
# read_command
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
def read_command
|
# def read_command
|
||||||
system("stty raw -echo") #=> Raw mode, no echo
|
# system("stty raw -echo") #=> Raw mode, no echo
|
||||||
char = STDIN.getc
|
# char = STDIN.getc
|
||||||
system("stty -raw echo") #=> Reset terminal mode
|
# system("stty -raw echo") #=> Reset terminal mode
|
||||||
char
|
# char
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
if ARGV.empty?
|
# if ARGV.empty?
|
||||||
print 'Mindmap name: '
|
# print 'Mindmap name: '
|
||||||
current = root = Node.new(STDIN.gets.chomp)
|
# current = root = Node.new(STDIN.gets.chomp)
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
loop do
|
# loop do
|
||||||
print `clear`
|
# print `clear`
|
||||||
PrettyPrint.tree(root, current)
|
# PrettyPrint.tree(root, current)
|
||||||
|
#
|
||||||
cmd = read_command
|
# cmd = read_command
|
||||||
|
#
|
||||||
if cmd == KEYS[:node_create]
|
# if cmd == KEYS[:node_create]
|
||||||
print 'Title: '
|
# print 'Title: '
|
||||||
current[] = Node.new(STDIN.gets.chomp)
|
# current[] = Node.new(STDIN.gets.chomp)
|
||||||
elsif cmd == KEYS[:node_delete]
|
# elsif cmd == KEYS[:node_delete]
|
||||||
current.remove
|
# current.remove
|
||||||
current = current.parent unless current.parent.nil?
|
# current = current.parent unless current.parent.nil?
|
||||||
elsif cmd == KEYS[:node_toggle]
|
# elsif cmd == KEYS[:node_toggle]
|
||||||
current.toggle!
|
# current.toggle!
|
||||||
elsif cmd == KEYS[:nav_child]
|
# elsif cmd == KEYS[:nav_child]
|
||||||
current = current[0] if current.children?
|
# current = current[0] if current.children?
|
||||||
elsif cmd == KEYS[:nav_parent]
|
# elsif cmd == KEYS[:nav_parent]
|
||||||
current = current.parent unless current.parent.nil?
|
# current = current.parent unless current.parent.nil?
|
||||||
elsif cmd == KEYS[:nav_previous]
|
# elsif cmd == KEYS[:nav_previous]
|
||||||
sibling = current >> -1
|
# sibling = current >> -1
|
||||||
current = sibling unless sibling.nil?
|
# current = sibling unless sibling.nil?
|
||||||
elsif cmd == KEYS[:nav_next]
|
# elsif cmd == KEYS[:nav_next]
|
||||||
sibling = current >> 1
|
# sibling = current >> 1
|
||||||
current = sibling unless sibling.nil?
|
# current = sibling unless sibling.nil?
|
||||||
elsif cmd == KEYS[:nav_root]
|
# elsif cmd == KEYS[:nav_root]
|
||||||
current = root
|
# current = root
|
||||||
elsif cmd == KEYS[:main_help]
|
# elsif cmd == KEYS[:main_help]
|
||||||
print_help
|
# print_help
|
||||||
elsif cmd == KEYS[:main_quit]
|
# elsif cmd == KEYS[:main_quit]
|
||||||
puts 'Good Bye!'
|
# puts 'Good Bye!'
|
||||||
break
|
# break
|
||||||
end
|
# end
|
||||||
end
|
# end
|
||||||
|
#
|
||||||
|
|
Loading…
Add table
Reference in a new issue