rutui 0.4 → 0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/rutui.rb +3 -21
- data/lib/rutui/ansi.rb +46 -0
- data/lib/rutui/axx.rb +66 -66
- data/lib/rutui/figlet.rb +126 -127
- data/lib/rutui/objects.rb +309 -250
- data/lib/rutui/pixel.rb +20 -18
- data/lib/rutui/screen.rb +125 -83
- data/lib/rutui/screenmanager.rb +73 -60
- data/lib/rutui/sprites.rb +50 -49
- data/lib/rutui/table.rb +183 -180
- data/lib/rutui/textfield.rb +122 -99
- data/lib/rutui/theme.rb +53 -52
- metadata +16 -17
- data/lib/rutui/util.rb +0 -78
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 09bb43480dcae85b5dbebb214e1980643f4d8d88
|
4
|
+
data.tar.gz: 487362e697b37a46373b331782ad477fe73117b5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a38da746bfe1b3ae94da639959d9b19b00af7b8104ce6d83958aaa5b48cf6a0f251a78a494a8c6ac6e4953faed6821a56cd4f31fd993109b0a3a7b1d8b55d122
|
7
|
+
data.tar.gz: c8bf6ac48905283217387fe3021a7f0a9dc32c80294fb4bd6e6f6ecef2c1d6af32c14364a7181014837f16042a9dcf57936db01d531fe0c505ee25d2ff695f2b
|
data/lib/rutui.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# encoding: UTF-8
|
3
2
|
#
|
4
3
|
# https://github.com/b1nary/rutui
|
@@ -6,10 +5,11 @@
|
|
6
5
|
# Author: Roman Pramberger (roman@pramberger.ch)
|
7
6
|
# License: MIT
|
8
7
|
#
|
9
|
-
require 'rutui/
|
8
|
+
require 'rutui/ansi'
|
10
9
|
require 'rutui/pixel'
|
11
10
|
require 'rutui/theme'
|
12
11
|
require 'rutui/objects'
|
12
|
+
require 'rutui/input'
|
13
13
|
require 'rutui/screen'
|
14
14
|
require 'rutui/screenmanager'
|
15
15
|
require 'rutui/figlet'
|
@@ -17,22 +17,4 @@ require 'rutui/axx'
|
|
17
17
|
require 'rutui/sprites'
|
18
18
|
require 'rutui/table'
|
19
19
|
require 'rutui/textfield'
|
20
|
-
|
21
|
-
module RuTui
|
22
|
-
Ansi = ::Ansi
|
23
|
-
Utils = ::Utils
|
24
|
-
Pixel = ::Pixel
|
25
|
-
Theme = ::Theme
|
26
|
-
BaseObject = ::BaseObject
|
27
|
-
Box = ::Box
|
28
|
-
Line = ::Line
|
29
|
-
Circle = ::Circle
|
30
|
-
Text = ::Text
|
31
|
-
Screen = ::Screen
|
32
|
-
ScreenManager = ::ScreenManager
|
33
|
-
Figlet = ::Figlet
|
34
|
-
Axx = ::Axx
|
35
|
-
Sprite = ::Sprite
|
36
|
-
Table = ::Table
|
37
|
-
Textfield = ::Textfield
|
38
|
-
end
|
20
|
+
require 'rutui/checkbox'
|
data/lib/rutui/ansi.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
module RuTui
|
2
|
+
## Ansi Class
|
3
|
+
# This Class generates ansi strings for the
|
4
|
+
# Terminal based output.
|
5
|
+
#
|
6
|
+
# Its only tested on Linux, should work atleast
|
7
|
+
# on other unix based systems (Use a proper ansi,
|
8
|
+
# shell/simulator on windows, and you'll be fine)
|
9
|
+
#
|
10
|
+
class Ansi
|
11
|
+
# Calculate color from RGB values
|
12
|
+
def self.rgb(red, green, blue); 16 + (red * 36) + (green * 6) + blue; end
|
13
|
+
# Set background color
|
14
|
+
def self.bg color; "\e[48;5;#{color}m"; end
|
15
|
+
# Set text color
|
16
|
+
def self.fg color; "\e[38;5;#{color}m"; end
|
17
|
+
# "Shortcut" to background color
|
18
|
+
def self.background color; self.bg color; end
|
19
|
+
# "Shortcut" to foreground/text color
|
20
|
+
def self.foreground color; self.fg color; end
|
21
|
+
# Set bold
|
22
|
+
def self.bold text; "\e[1m#{text}"; end
|
23
|
+
# Set thin
|
24
|
+
def self.thin text; "\e[2m#{text}"; end
|
25
|
+
# Set italic
|
26
|
+
def self.italic text; "\e[3m#{text}"; end
|
27
|
+
# Set underline
|
28
|
+
def self.underline text; "\e[4m#{text}"; end
|
29
|
+
# Set blink
|
30
|
+
def self.blink text; "\e[5m#{text}"; end
|
31
|
+
# Clear all color
|
32
|
+
def self.clear_color; "\e[0m"; end
|
33
|
+
# Clear Screen/Terminal
|
34
|
+
def self.clear; "\e[2J"; end
|
35
|
+
# set start
|
36
|
+
def self.set_start; "\e[s"; end
|
37
|
+
# goto start
|
38
|
+
def self.goto_start; "\e[u"; end
|
39
|
+
# Go home
|
40
|
+
def self.go_home; "\e[H"; end
|
41
|
+
# Goto position
|
42
|
+
def self.position x,y; "\e[#{y};#{x}f"; end
|
43
|
+
# Hide cursor
|
44
|
+
def self.hide_cursor; "\e?25l"; end
|
45
|
+
end
|
46
|
+
end
|
data/lib/rutui/axx.rb
CHANGED
@@ -1,86 +1,86 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# A
|
11
|
-
# A
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
return if @file.nil?
|
20
|
-
return if !File.exists? @file
|
1
|
+
module RuTui
|
2
|
+
## Basic Ascii Image format Axx
|
3
|
+
# First implemented: here :3
|
4
|
+
#
|
5
|
+
# Example:
|
6
|
+
# # Comments ...
|
7
|
+
# nil|A:1:0|A|A:2
|
8
|
+
#
|
9
|
+
# nil empty pixel
|
10
|
+
# A:1:0 Char is A, 1 is foreground, 0 is background
|
11
|
+
# A Char only (colors default)
|
12
|
+
# A:2 Char A, Foreground 2, Background default
|
13
|
+
#
|
14
|
+
class Axx < BaseObject
|
15
|
+
def initialize options
|
16
|
+
@file = options[:file]
|
17
|
+
@x = options[:x]
|
18
|
+
@y = options[:y]
|
21
19
|
|
22
|
-
|
20
|
+
return if @file.nil?
|
21
|
+
return if !File.exists? @file
|
23
22
|
|
24
|
-
|
25
|
-
|
23
|
+
@img = File.open(@file).read
|
24
|
+
|
25
|
+
parse
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
else
|
39
|
-
if ele[0] == "nil"
|
40
|
-
out[li][ei] = nil
|
28
|
+
def parse
|
29
|
+
out = []
|
30
|
+
@img.split("\n").each_with_index do |line,li|
|
31
|
+
if !line.match(/^#/)
|
32
|
+
out[li] = []
|
33
|
+
line.split("|").each_with_index do |elem,ei|
|
34
|
+
ele = elem.split(":")
|
35
|
+
if ele.size == 3
|
36
|
+
out[li][ei] = Pixel.new(ele[1].to_i,ele[2].to_i,ele[0])
|
37
|
+
elsif ele.size == 2
|
38
|
+
out[li][ei] = Pixel.new(ele[1].to_i,nil,ele[0])
|
41
39
|
else
|
42
|
-
|
40
|
+
if ele[0] == "nil"
|
41
|
+
out[li][ei] = nil
|
42
|
+
else
|
43
|
+
out[li][ei] = Pixel.new(nil,nil,ele[0])
|
44
|
+
end
|
43
45
|
end
|
44
46
|
end
|
45
47
|
end
|
46
48
|
end
|
47
|
-
end
|
48
49
|
|
49
|
-
|
50
|
-
|
50
|
+
out.each do |o|
|
51
|
+
out.delete(o) if o.nil?
|
52
|
+
end
|
53
|
+
@obj = out
|
54
|
+
@height = out.size
|
55
|
+
@width = out.size
|
51
56
|
end
|
52
|
-
@obj = out
|
53
|
-
@height = out.size
|
54
|
-
@width = out.size
|
55
|
-
end
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
else
|
69
|
-
if ele[0] == "nil"
|
70
|
-
out[li][ei] = nil
|
58
|
+
def self.parse data
|
59
|
+
out = []
|
60
|
+
data.split("\n").each_with_index do |line,li|
|
61
|
+
if !line.match(/^#/)
|
62
|
+
out[li] = []
|
63
|
+
line.split("|").each_with_index do |elem,ei|
|
64
|
+
ele = elem.split(":")
|
65
|
+
if ele.size == 3
|
66
|
+
out[li][ei] = Pixel.new(ele[1].to_i,ele[2].to_i,ele[0])
|
67
|
+
elsif ele.size == 2
|
68
|
+
out[li][ei] = Pixel.new(ele[1].to_i,nil,ele[0])
|
71
69
|
else
|
72
|
-
|
70
|
+
if ele[0] == "nil"
|
71
|
+
out[li][ei] = nil
|
72
|
+
else
|
73
|
+
out[li][ei] = Pixel.new(nil,nil,ele[0])
|
74
|
+
end
|
73
75
|
end
|
74
76
|
end
|
75
77
|
end
|
76
78
|
end
|
77
|
-
end
|
78
79
|
|
79
|
-
|
80
|
-
|
80
|
+
out.each do |o|
|
81
|
+
out.delete(o) if o.nil? or o == []
|
82
|
+
end
|
83
|
+
return out
|
81
84
|
end
|
82
|
-
return out
|
83
85
|
end
|
84
|
-
|
85
86
|
end
|
86
|
-
|
data/lib/rutui/figlet.rb
CHANGED
@@ -1,158 +1,157 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
|
3
|
-
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# :
|
8
|
-
# :
|
9
|
-
# :
|
10
|
-
# :
|
11
|
-
# :
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
# Figlet.
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
# Create Figlet text object
|
55
|
-
# Recall it any time when attributes have changed
|
56
|
-
def create
|
57
|
-
obj = []
|
58
|
-
@@fonts[@font]['n'].size.times do
|
59
|
-
obj << []
|
2
|
+
module RuTui
|
3
|
+
## Figlet Class
|
4
|
+
# parse Figlet Font files
|
5
|
+
#
|
6
|
+
# Attributes (All accessable):
|
7
|
+
# :x MUST
|
8
|
+
# :y MUST
|
9
|
+
# :text Your text
|
10
|
+
# :font Use a loaded font file
|
11
|
+
# :rainbow true|any
|
12
|
+
# :colors Array of example pixels used for colors
|
13
|
+
#
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
# Figlet.add :test, "path/to/font.flf"
|
17
|
+
# Figlet.new({ :text => "Meh", :font => :test, :rainbow => true })
|
18
|
+
#
|
19
|
+
# Config content (just to remember what the figlet slug means)
|
20
|
+
# 0 - name
|
21
|
+
# 1 - height of a character
|
22
|
+
# 2 - height of a character, not including descenders
|
23
|
+
# 3 - max line length (excluding comment lines) + a fudge factor
|
24
|
+
# 4 - default smushmode for this font (like "-m 0" on command line)
|
25
|
+
# 5 - number of comment lines
|
26
|
+
# 6 - rtol
|
27
|
+
#
|
28
|
+
class Figlet < BaseObject
|
29
|
+
attr_accessor :text, :rainbow, :font, :colors
|
30
|
+
# Figlet font: '!" #$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz[|]~ÄÖÜäöüß'
|
31
|
+
@@chars = '!!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz[|]~ÄÖÜäöüß'.split("")
|
32
|
+
@@rainbow = nil
|
33
|
+
@@fonts = {}
|
34
|
+
|
35
|
+
# Initialize (see above)
|
36
|
+
def initialize options
|
37
|
+
@x = options[:x]
|
38
|
+
@y = options[:y]
|
39
|
+
|
40
|
+
@@rainbow = Theme.get(:rainbow) if @@rainbow.nil?
|
41
|
+
|
42
|
+
return if @x.nil? or @y.nil?
|
43
|
+
|
44
|
+
@font = options[:font]
|
45
|
+
@text = options[:text]
|
46
|
+
@rainbow = options[:rainbow]
|
47
|
+
@space = options[:space]
|
48
|
+
@space = 0 if @space.nil?
|
49
|
+
@colors = options[:colors]
|
50
|
+
@colors = [Pixel.new(Theme.get(:textcolor), -1, Theme.get(:background).symbol)] if @colors.nil?
|
51
|
+
|
52
|
+
create
|
60
53
|
end
|
61
|
-
current = 0
|
62
|
-
|
63
|
-
count = 0
|
64
|
-
@text.each_byte do |c|
|
65
|
-
if @@chars.include? c.chr
|
66
|
-
@@fonts[@font][c.chr].each_with_index do |fr,ri|
|
67
|
-
fr.each do |fc|
|
68
|
-
if @rainbow
|
69
|
-
obj[ri] << Pixel.new(@@rainbow[current], @colors[0].bg,fc)
|
70
|
-
else
|
71
|
-
obj[ri] << Pixel.new(@colors[current].fg,@colors[current].bg,fc)
|
72
|
-
end
|
73
54
|
|
74
|
-
|
75
|
-
|
76
|
-
|
55
|
+
# Create Figlet text object
|
56
|
+
# Recall it any time when attributes have changed
|
57
|
+
def create
|
58
|
+
obj = []
|
59
|
+
@@fonts[@font]['n'].size.times do
|
60
|
+
obj << []
|
61
|
+
end
|
62
|
+
current = 0
|
63
|
+
|
64
|
+
count = 0
|
65
|
+
@text.each_byte do |c|
|
66
|
+
if @@chars.include? c.chr
|
67
|
+
@@fonts[@font][c.chr].each_with_index do |fr,ri|
|
68
|
+
fr.each do |fc|
|
69
|
+
if @rainbow
|
70
|
+
obj[ri] << Pixel.new(@@rainbow[current], @colors[0].bg,fc)
|
71
|
+
else
|
72
|
+
obj[ri] << Pixel.new(@colors[current].fg,@colors[current].bg,fc)
|
73
|
+
end
|
74
|
+
|
75
|
+
if @rainbow != true
|
76
|
+
current += 1 if @colors.size > 1
|
77
|
+
current = 0 if current > @colors.size
|
78
|
+
end
|
77
79
|
end
|
78
80
|
end
|
79
|
-
end
|
80
81
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
82
|
+
if @rainbow
|
83
|
+
current += 1
|
84
|
+
current = 0 if current >= @@rainbow.size
|
85
|
+
end
|
85
86
|
|
86
|
-
|
87
|
+
if count < @text.size-1
|
88
|
+
@@fonts[@font]['n'].size.times do |ri|
|
89
|
+
@space.times do
|
90
|
+
if @rainbow
|
91
|
+
obj[ri] << Pixel.new(@@rainbow[current], @colors[0].bg,Theme.get(:background).symbol)
|
92
|
+
else
|
93
|
+
obj[ri] << Pixel.new(@colors[current].fg,@colors[current].bg,Theme.get(:background).symbol)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
# SPace
|
99
|
+
else
|
87
100
|
@@fonts[@font]['n'].size.times do |ri|
|
88
|
-
|
101
|
+
3.times do
|
89
102
|
if @rainbow
|
90
|
-
obj[ri] << Pixel.new(@@rainbow[current], @colors[0].bg,Theme.get(:background).symbol)
|
103
|
+
obj[ri] << Pixel.new(@@rainbow[current], @colors[0].bg, Theme.get(:background).symbol)
|
91
104
|
else
|
92
|
-
obj[ri] << Pixel.new(@colors[current].fg,@colors[current].bg,Theme.get(:background).symbol)
|
105
|
+
obj[ri] << Pixel.new(@colors[current].fg,@colors[current].bg, Theme.get(:background).symbol)
|
93
106
|
end
|
94
107
|
end
|
95
108
|
end
|
96
109
|
end
|
97
|
-
|
98
|
-
else
|
99
|
-
@@fonts[@font]['n'].size.times do |ri|
|
100
|
-
3.times do
|
101
|
-
if @rainbow
|
102
|
-
obj[ri] << Pixel.new(@@rainbow[current], @colors[0].bg, Theme.get(:background).symbol)
|
103
|
-
else
|
104
|
-
obj[ri] << Pixel.new(@colors[current].fg,@colors[current].bg, Theme.get(:background).symbol)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
110
|
+
count += 1
|
108
111
|
end
|
109
|
-
|
112
|
+
@obj = obj
|
110
113
|
end
|
111
|
-
@obj = obj
|
112
|
-
end
|
113
114
|
|
114
|
-
|
115
|
-
|
116
|
-
|
115
|
+
# Static methods to add/load new Fonts
|
116
|
+
def self.add name, file
|
117
|
+
if File.exists?(file)
|
117
118
|
|
118
|
-
|
119
|
-
|
119
|
+
data = File.new(file, "r").read.split("\n")
|
120
|
+
config = data[0].split(" ")
|
120
121
|
|
121
|
-
|
122
|
-
|
122
|
+
# Remove Comments (Size is in info line)
|
123
|
+
config[5].to_i.times do
|
124
|
+
data.delete_at(0)
|
125
|
+
end
|
123
126
|
data.delete_at(0)
|
124
|
-
end
|
125
127
|
|
126
|
-
|
127
|
-
|
128
|
+
# Remove empty line if exist
|
129
|
+
data.delete_at(0) if data[0].strip() == ""
|
128
130
|
|
129
|
-
|
130
|
-
|
131
|
+
height = config[1].to_i
|
132
|
+
rest = height - config[2].to_i
|
131
133
|
|
132
|
-
|
133
|
-
|
134
|
-
@@chars.each do |i|
|
135
|
-
out = []
|
134
|
+
@@fonts[name] = {}
|
136
135
|
|
137
|
-
|
136
|
+
@@chars.each do |i|
|
137
|
+
out = []
|
138
138
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
end
|
139
|
+
config[2].to_i.times do |x|
|
140
|
+
xdata = data[0].gsub("$"," ").gsub("@","").gsub("\r","").split("")
|
141
|
+
out << xdata if xdata.size > 0
|
142
|
+
data.delete_at(0)
|
143
|
+
end
|
145
144
|
|
146
|
-
|
147
|
-
|
148
|
-
|
145
|
+
rest.times do
|
146
|
+
data.delete_at(0)
|
147
|
+
end
|
149
148
|
|
150
|
-
|
149
|
+
@@fonts[name][i] = out
|
150
|
+
end
|
151
|
+
return true
|
152
|
+
else
|
153
|
+
return false
|
151
154
|
end
|
152
|
-
return true
|
153
|
-
else
|
154
|
-
return false
|
155
155
|
end
|
156
156
|
end
|
157
157
|
end
|
158
|
-
|