reterm 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +131 -0
- data/designer/main.rb +10 -0
- data/designer/src/ComponentParams.rb +120 -0
- data/designer/src/ComponentsList.rb +90 -0
- data/designer/src/CreatedList.rb +156 -0
- data/designer/src/Designer.rb +114 -0
- data/designer/src/ToggleArea.rb +67 -0
- data/designer/src/common.rb +1 -0
- data/designer/src/component_factory.rb +30 -0
- data/designer/src/component_map.rb +116 -0
- data/designer/src/glade/ComponentParams.glade +96 -0
- data/designer/src/glade/Designer.glade +184 -0
- data/designer/src/images/add.png +0 -0
- data/designer/src/images/asciitext.png +0 -0
- data/designer/src/images/blank.png +0 -0
- data/designer/src/images/blank_sm.png +0 -0
- data/designer/src/images/button.png +0 -0
- data/designer/src/images/dial.png +0 -0
- data/designer/src/images/entry.png +0 -0
- data/designer/src/images/hslider.png +0 -0
- data/designer/src/images/label.png +0 -0
- data/designer/src/images/matrix.png +0 -0
- data/designer/src/images/orig/Check.png +0 -0
- data/designer/src/images/orig/ascii_text.png +0 -0
- data/designer/src/images/orig/button.png +0 -0
- data/designer/src/images/orig/dial.png +0 -0
- data/designer/src/images/orig/entry.png +0 -0
- data/designer/src/images/orig/hslider.png +0 -0
- data/designer/src/images/orig/label.png +0 -0
- data/designer/src/images/orig/matrix.png +0 -0
- data/designer/src/images/orig/radio.png +0 -0
- data/designer/src/images/orig/rocker.png +0 -0
- data/designer/src/images/orig/slist.png +0 -0
- data/designer/src/images/orig/vslider.png +0 -0
- data/designer/src/images/radio.png +0 -0
- data/designer/src/images/remove.png +0 -0
- data/designer/src/images/rocker.png +0 -0
- data/designer/src/images/slist.png +0 -0
- data/designer/src/images/vslider.png +0 -0
- data/lib/reterm.rb +22 -0
- data/lib/reterm/color_pair.rb +66 -0
- data/lib/reterm/component.rb +40 -0
- data/lib/reterm/components.rb +32 -0
- data/lib/reterm/components/ascii_text.rb +46 -0
- data/lib/reterm/components/button.rb +31 -0
- data/lib/reterm/components/dial.rb +95 -0
- data/lib/reterm/components/dialog.rb +34 -0
- data/lib/reterm/components/entry.rb +38 -0
- data/lib/reterm/components/hslider.rb +32 -0
- data/lib/reterm/components/image.rb +55 -0
- data/lib/reterm/components/label.rb +20 -0
- data/lib/reterm/components/matrix.rb +43 -0
- data/lib/reterm/components/radio.rb +33 -0
- data/lib/reterm/components/rocker.rb +71 -0
- data/lib/reterm/components/slist.rb +32 -0
- data/lib/reterm/components/template.rb +23 -0
- data/lib/reterm/components/vslider.rb +61 -0
- data/lib/reterm/init.rb +95 -0
- data/lib/reterm/layout.rb +63 -0
- data/lib/reterm/layouts.rb +16 -0
- data/lib/reterm/layouts/horizontal.rb +19 -0
- data/lib/reterm/layouts/vertical.rb +19 -0
- data/lib/reterm/loader.rb +126 -0
- data/lib/reterm/menu.rb +81 -0
- data/lib/reterm/mixins/cdk_component.rb +45 -0
- data/lib/reterm/mixins/component_input.rb +37 -0
- data/lib/reterm/mixins/event_dispatcher.rb +20 -0
- data/lib/reterm/mixins/nav_input.rb +126 -0
- data/lib/reterm/panel.rb +37 -0
- data/lib/reterm/resize.rb +27 -0
- data/lib/reterm/terminal.rb +33 -0
- data/lib/reterm/version.rb +3 -0
- data/lib/reterm/window.rb +260 -0
- metadata +155 -0
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/reterm.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# The Ruby Enhanced Terminal interactive framework
|
2
|
+
# facilitating dynmaic/feature rich terminal applications.
|
3
|
+
module RETerm
|
4
|
+
end # end module RETerm
|
5
|
+
|
6
|
+
require 'reterm/init'
|
7
|
+
require 'reterm/color_pair'
|
8
|
+
|
9
|
+
require 'reterm/mixins/event_dispatcher'
|
10
|
+
require 'reterm/mixins/component_input'
|
11
|
+
require 'reterm/mixins/nav_input'
|
12
|
+
require 'reterm/mixins/cdk_component'
|
13
|
+
|
14
|
+
require 'reterm/terminal'
|
15
|
+
require 'reterm/window'
|
16
|
+
require 'reterm/panel'
|
17
|
+
require 'reterm/menu'
|
18
|
+
|
19
|
+
require 'reterm/components'
|
20
|
+
require 'reterm/layouts'
|
21
|
+
|
22
|
+
require 'reterm/loader'
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module RETerm
|
4
|
+
# Defines a pair of colors used for foreground / background
|
5
|
+
# rendering associated with id and tag list.
|
6
|
+
class ColorPair
|
7
|
+
attr_accessor :id
|
8
|
+
attr_accessor :tags
|
9
|
+
|
10
|
+
attr_accessor :fg
|
11
|
+
attr_accessor :bg
|
12
|
+
|
13
|
+
# Redefined system RGB color. Color name should be specified
|
14
|
+
# as well as new RGB components
|
15
|
+
#
|
16
|
+
# @param [String, Symbol] color name of color to change,
|
17
|
+
# ex "red", "blue", etc
|
18
|
+
# @param [Integer] r value to assign to red component
|
19
|
+
# @param [Integer] g value to assign to green component
|
20
|
+
# @param [Integer] b value to assign to blue component
|
21
|
+
def self.change(color, r, g, b)
|
22
|
+
Ncurses::init_color Ncurses.const_get("COLOR_#{color.to_s.upcase}"), r, g, b
|
23
|
+
end
|
24
|
+
|
25
|
+
# Instantiate a new ColorPair, specifying foreground and background
|
26
|
+
# colors as well as any tags.
|
27
|
+
#
|
28
|
+
# A unique id for this color pair will be autogenerated
|
29
|
+
#
|
30
|
+
# @param [String, Symbol] fg forground color name
|
31
|
+
# @param [String, Symbol] bg background color name
|
32
|
+
# @param [Array<String, Symbol>] tags array of tags to assign
|
33
|
+
# to color pair
|
34
|
+
def initialize(fg, bg, *tags)
|
35
|
+
@@id ||= 0
|
36
|
+
@@id += 1
|
37
|
+
@id = @@id
|
38
|
+
|
39
|
+
@tags = Set.new(tags)
|
40
|
+
|
41
|
+
# FIXME need to verify input is in valid domain
|
42
|
+
# before conveRETermng it to symbol w/ "intern"
|
43
|
+
fg = fg.to_s.downcase.intern
|
44
|
+
bg = bg.to_s.downcase.intern
|
45
|
+
|
46
|
+
Ncurses.init_pair(@id,
|
47
|
+
Ncurses.const_get("COLOR_#{fg.to_s.upcase}"),
|
48
|
+
Ncurses.const_get("COLOR_#{bg.to_s.upcase}"))
|
49
|
+
end
|
50
|
+
|
51
|
+
# Create and store a new Color Pair in a static
|
52
|
+
# registry
|
53
|
+
def self.register(fg, bg, *tags)
|
54
|
+
@@registry ||= []
|
55
|
+
@@registry << new(fg, bg, *tags)
|
56
|
+
@@registry.last
|
57
|
+
end
|
58
|
+
|
59
|
+
# Return first Color Pair found with the given tag
|
60
|
+
# or nil for no matches
|
61
|
+
def self.for(tag)
|
62
|
+
@@registry ||= []
|
63
|
+
@@registry.find { |cp| cp.tags.include?(tag) }
|
64
|
+
end
|
65
|
+
end # class ColorPair
|
66
|
+
end # module RETerm
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module RETerm
|
2
|
+
# A Component is a generic widget container associated with a window.
|
3
|
+
# Subclasses each implement a specific UI artifact.
|
4
|
+
class Component
|
5
|
+
attr_accessor :window
|
6
|
+
|
7
|
+
# This method is invoked to cleanup the component on shutdown.
|
8
|
+
# It should be be overriden by subclasses that needs to clean
|
9
|
+
# resources before being deallocated
|
10
|
+
def finalize!
|
11
|
+
end
|
12
|
+
|
13
|
+
# Return a boolean indicating if a {ColorPair} has been
|
14
|
+
# assign to component
|
15
|
+
def colored?
|
16
|
+
!!@colors
|
17
|
+
end
|
18
|
+
|
19
|
+
# Assign the specified {ColorPair} to the component
|
20
|
+
def colors=(c)
|
21
|
+
@colors = c
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns a boolean indicating if the user should be
|
25
|
+
# able to focus on and activate the component. By default
|
26
|
+
# this is false, but interactive components should override
|
27
|
+
# and return true.
|
28
|
+
def activatable?
|
29
|
+
false
|
30
|
+
end
|
31
|
+
|
32
|
+
# Actual activation mechanism, invoked by the navigation
|
33
|
+
# logic when the user has selected an activatable? component.
|
34
|
+
# Should be overriden by interactive subcomponents to
|
35
|
+
# process user inpute specific to that component
|
36
|
+
def activate!
|
37
|
+
raise RuntimeError, "should not be activated"
|
38
|
+
end
|
39
|
+
end # class Component
|
40
|
+
end # module RETerm
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module RETerm
|
2
|
+
# Encapsulates all the Components which have been
|
3
|
+
# currently implemented
|
4
|
+
module Components
|
5
|
+
def self.all
|
6
|
+
@a ||= Components.constants
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.names
|
10
|
+
@n ||= all.collect { |c| c.to_s }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'reterm/component'
|
16
|
+
|
17
|
+
# custom
|
18
|
+
require 'reterm/components/dial'
|
19
|
+
require 'reterm/components/rocker'
|
20
|
+
require 'reterm/components/vslider'
|
21
|
+
require 'reterm/components/label'
|
22
|
+
require 'reterm/components/ascii_text'
|
23
|
+
require 'reterm/components/image'
|
24
|
+
|
25
|
+
# cdk
|
26
|
+
require 'reterm/components/hslider'
|
27
|
+
require 'reterm/components/button'
|
28
|
+
require 'reterm/components/dialog'
|
29
|
+
require 'reterm/components/radio'
|
30
|
+
require 'reterm/components/slist'
|
31
|
+
require 'reterm/components/entry'
|
32
|
+
require 'reterm/components/matrix'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module RETerm
|
2
|
+
module Components
|
3
|
+
# Renders specified text via ascii graphics.
|
4
|
+
#
|
5
|
+
# This Component depends on the 'artii' gem.
|
6
|
+
class AsciiText < Component
|
7
|
+
|
8
|
+
# Initialize the AsciiText component
|
9
|
+
#
|
10
|
+
# @param [Hash] args ascii text params
|
11
|
+
# @option args [String] :text actual text to render,
|
12
|
+
# default empty string
|
13
|
+
# @option args [String] :font font to use
|
14
|
+
def initialize(args={})
|
15
|
+
@text = args[:text] || ""
|
16
|
+
@font = args[:font]
|
17
|
+
end
|
18
|
+
|
19
|
+
def draw!
|
20
|
+
refresh_win
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def atext
|
26
|
+
@atext ||= begin
|
27
|
+
require 'artii'
|
28
|
+
art = @font.nil? ? Artii::Base.new :
|
29
|
+
Artii::Base.new(:font => @font)
|
30
|
+
art.asciify @text
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def refresh_win
|
35
|
+
y = 1
|
36
|
+
atext.split("\n").each { |t|
|
37
|
+
window.mvaddstr(y, 1, t)
|
38
|
+
y += 1
|
39
|
+
}
|
40
|
+
|
41
|
+
window.refresh
|
42
|
+
update_reterm
|
43
|
+
end
|
44
|
+
end # class AsciiText
|
45
|
+
end # module Components
|
46
|
+
end # module RETerm
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RETerm
|
2
|
+
module Components
|
3
|
+
# CDK Button Component
|
4
|
+
class Button < Component
|
5
|
+
include CDKComponent
|
6
|
+
|
7
|
+
# Initialize the Button component
|
8
|
+
#
|
9
|
+
# @param [Hash] args button params
|
10
|
+
# @option args [String] :title title of button
|
11
|
+
def initialize(args={})
|
12
|
+
@title = args[:title] || ""
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def callback
|
18
|
+
proc { |b|
|
19
|
+
puts "Clicked"
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def _component
|
24
|
+
CDK::BUTTON.new(window.cdk_scr, # cdk screen
|
25
|
+
2, 1, @title, # x, y, title
|
26
|
+
callback, # click callback
|
27
|
+
false, false) # box, shadow
|
28
|
+
end
|
29
|
+
end # Button
|
30
|
+
end # module Components
|
31
|
+
end # module RETerm
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module RETerm
|
2
|
+
module Components
|
3
|
+
class Dial < Component
|
4
|
+
include ComponentInput
|
5
|
+
|
6
|
+
attr_accessor :initial_value, :increment, :range, :labels
|
7
|
+
|
8
|
+
attr_accessor :value
|
9
|
+
|
10
|
+
# Enapsulating window should be at least 4x4 for decent effect,
|
11
|
+
# at least 7x7 provides best resolution
|
12
|
+
#
|
13
|
+
# @param [Hash] args dial params
|
14
|
+
#
|
15
|
+
# @example activating a dial
|
16
|
+
# win = Window.new
|
17
|
+
# dial = Dial.new
|
18
|
+
# win.component = dial
|
19
|
+
#
|
20
|
+
# val = dial.activate!
|
21
|
+
#
|
22
|
+
def initialize(args={})
|
23
|
+
@initial_value = 0
|
24
|
+
@increment = 0.01
|
25
|
+
@range = [0, 1]
|
26
|
+
@labels = true
|
27
|
+
@value = initial_value
|
28
|
+
end
|
29
|
+
|
30
|
+
def draw!
|
31
|
+
refresh_win
|
32
|
+
end
|
33
|
+
|
34
|
+
def activatable?
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
def activate!
|
39
|
+
refresh_win
|
40
|
+
handle_input
|
41
|
+
@value
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def on_inc
|
47
|
+
@value += increment
|
48
|
+
@value = 1 if @value > 1
|
49
|
+
refresh_win
|
50
|
+
end
|
51
|
+
|
52
|
+
def on_dec
|
53
|
+
@value -= increment
|
54
|
+
@value = 0 if @value < 0
|
55
|
+
refresh_win
|
56
|
+
end
|
57
|
+
|
58
|
+
def refresh_win
|
59
|
+
if @labels
|
60
|
+
window.mvaddstr(1, 1, '-')
|
61
|
+
window.mvaddstr(1, window.cols-2, '+')
|
62
|
+
end
|
63
|
+
|
64
|
+
rad = Math.sqrt((window.rows/2)**2 + (window.cols/2)**2)
|
65
|
+
padding = rad/2 + 1
|
66
|
+
|
67
|
+
rows = window.rows - padding
|
68
|
+
cols = window.cols - padding
|
69
|
+
rad = Math.sqrt((rows/2)**2 + (cols/2)**2)
|
70
|
+
|
71
|
+
a = 0
|
72
|
+
while a < @value
|
73
|
+
ar = a * (2 * Math::PI)
|
74
|
+
x = rad * Math.cos(3*Math::PI/2 - ar) + cols/2 + padding/2
|
75
|
+
y = rad * Math.sin(3*Math::PI/2 - ar) + rows/2 + padding/2
|
76
|
+
a += increment
|
77
|
+
|
78
|
+
window.mvaddstr(y, x, '*')
|
79
|
+
end
|
80
|
+
|
81
|
+
while a < 1
|
82
|
+
ar = a * (2 * Math::PI)
|
83
|
+
x = rad * Math.cos(3*Math::PI/2 - ar) + cols/2 + padding/2
|
84
|
+
y = rad * Math.sin(3*Math::PI/2 - ar) + rows/2 + padding/2
|
85
|
+
a += increment
|
86
|
+
|
87
|
+
window.mvaddstr(y, x, ' ')
|
88
|
+
end
|
89
|
+
|
90
|
+
window.refresh
|
91
|
+
update_reterm
|
92
|
+
end
|
93
|
+
end # class Dial
|
94
|
+
end # module Components
|
95
|
+
end # module RETerm
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module RETerm
|
2
|
+
module Components
|
3
|
+
# CDK Dialog Component
|
4
|
+
class Dialog < Component
|
5
|
+
include CDKComponent
|
6
|
+
|
7
|
+
# Initialize the Dialog component
|
8
|
+
#
|
9
|
+
# @param [Hash] args dialog params
|
10
|
+
# @option args [String, Array<String>] :message string
|
11
|
+
# message(s) to assign to dialog
|
12
|
+
# @option args [String, Array<String>] :buttons string
|
13
|
+
# buttons to assign to dialog
|
14
|
+
#
|
15
|
+
def initialize(args={})
|
16
|
+
@message = [args[:message]].flatten.compact
|
17
|
+
@buttons = [args[:buttons]].flatten.compact
|
18
|
+
|
19
|
+
@buttons = ["</B/24>OK", "</B16>Cancel"] if @buttons.empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def _component
|
25
|
+
CDK::DIALOG.new(window.cdk_scr,
|
26
|
+
CDK::CENTER, CDK::CENTER,
|
27
|
+
@message, @message.size,
|
28
|
+
@buttons, @buttons.size,
|
29
|
+
Ncurses.COLOR_PAIR(2) | Ncurses::A_REVERSE, # highlight
|
30
|
+
true, true, false) # seperate, box, shadow
|
31
|
+
end
|
32
|
+
end # Dialog
|
33
|
+
end # module Components
|
34
|
+
end # module RETerm
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module RETerm
|
2
|
+
module Components
|
3
|
+
# CDK Entry Component
|
4
|
+
class Entry < Component
|
5
|
+
include CDKComponent
|
6
|
+
|
7
|
+
# Initialize the Entry component
|
8
|
+
#
|
9
|
+
# @param [Hash] args entry params
|
10
|
+
# @option args [String] :title title to assign
|
11
|
+
# to entry
|
12
|
+
# @option args [String] :label label to assign
|
13
|
+
# to entry
|
14
|
+
# @option args [Integer] :min min entry length
|
15
|
+
# @option args [Integer] :max max entry length
|
16
|
+
def initialize(args={})
|
17
|
+
@title = args[:title] || ""
|
18
|
+
@label = args[:label] || ""
|
19
|
+
@min_len = args[:min] || 0
|
20
|
+
@max_len = args[:max] || 100
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def _component
|
26
|
+
CDK::ENTRY.new(window.cdk_scr, # cdkscreen,
|
27
|
+
CDK::CENTER, CDK::CENTER, # xpos, ypos
|
28
|
+
@title, @label, # title, label
|
29
|
+
Ncurses::A_NORMAL, # field attribute (eg typed chars)
|
30
|
+
'.', # filler char
|
31
|
+
:MIXED, # display type
|
32
|
+
window.cols-@label.size-5, # field width
|
33
|
+
0, 256, # min/max len
|
34
|
+
false, false) # box, shadow
|
35
|
+
end
|
36
|
+
end # Radio
|
37
|
+
end # module Components
|
38
|
+
end # module RETerm
|