vedeu 0.4.59 → 0.4.60
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +0 -2
- data/LICENSE.txt +4 -1
- data/README.md +12 -6
- data/Rakefile +0 -1
- data/docs/api.md +13 -13
- data/docs/dsl.md +10 -1
- data/docs/events.md +0 -1
- data/docs/getting_started.md +175 -17
- data/lib/vedeu/all.rb +5 -0
- data/lib/vedeu/api.rb +19 -0
- data/lib/vedeu/bindings/drb.rb +4 -0
- data/lib/vedeu/bindings/menus.rb +14 -10
- data/lib/vedeu/bootstrap.rb +44 -17
- data/lib/vedeu/colours/escape_sequences.rb +125 -0
- data/lib/vedeu/distributed/server.rb +43 -35
- data/lib/vedeu/dsl/view.rb +110 -7
- data/lib/vedeu/exceptions.rb +6 -0
- data/lib/vedeu/models/menus.rb +1 -0
- data/lib/vedeu/null/menu.rb +38 -0
- data/lib/vedeu/output/esc.rb +1 -96
- data/lib/vedeu/plugins.rb +82 -0
- data/lib/vedeu/plugins/plugin.rb +53 -0
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/api_test.rb +4 -0
- data/test/lib/vedeu/colours/escape_sequences_test.rb +100 -0
- data/test/lib/vedeu/null/menu_test.rb +47 -0
- data/test/lib/vedeu/output/esc_test.rb +0 -87
- data/test/lib/vedeu/plugins/plugin_test.rb +32 -0
- data/test/lib/vedeu/plugins_test.rb +47 -0
- metadata +14 -4
- data/docs/applications.md +0 -167
- data/docs/views.md +0 -158
data/lib/vedeu/bindings/drb.rb
CHANGED
@@ -69,6 +69,7 @@ module Vedeu
|
|
69
69
|
#
|
70
70
|
# @example
|
71
71
|
# Vedeu.trigger(:_drb_restart_)
|
72
|
+
# Vedeu.drb_restart
|
72
73
|
#
|
73
74
|
# @return [void]
|
74
75
|
def drb_restart!
|
@@ -79,6 +80,7 @@ module Vedeu
|
|
79
80
|
#
|
80
81
|
# @example
|
81
82
|
# Vedeu.trigger(:_drb_start_)
|
83
|
+
# Vedeu.drb_start
|
82
84
|
#
|
83
85
|
# @return [void]
|
84
86
|
def drb_start!
|
@@ -89,6 +91,7 @@ module Vedeu
|
|
89
91
|
#
|
90
92
|
# @example
|
91
93
|
# Vedeu.trigger(:_drb_status_)
|
94
|
+
# Vedeu.drb_status
|
92
95
|
#
|
93
96
|
# @return [void]
|
94
97
|
def drb_status!
|
@@ -99,6 +102,7 @@ module Vedeu
|
|
99
102
|
#
|
100
103
|
# @example
|
101
104
|
# Vedeu.trigger(:_drb_stop_)
|
105
|
+
# Vedeu.drb_stop
|
102
106
|
#
|
103
107
|
# @return [void]
|
104
108
|
def drb_stop!
|
data/lib/vedeu/bindings/menus.rb
CHANGED
@@ -35,7 +35,9 @@ module Vedeu
|
|
35
35
|
#
|
36
36
|
# @return [void]
|
37
37
|
def menu_bottom!
|
38
|
-
Vedeu.bind(:_menu_bottom_)
|
38
|
+
Vedeu.bind(:_menu_bottom_) do |name|
|
39
|
+
Vedeu.menus.by_name(name).bottom_item
|
40
|
+
end
|
39
41
|
end
|
40
42
|
|
41
43
|
# Returns the current menu item.
|
@@ -46,7 +48,7 @@ module Vedeu
|
|
46
48
|
# @return [void]
|
47
49
|
def menu_current!
|
48
50
|
Vedeu.bind(:_menu_current_) do |name|
|
49
|
-
Vedeu.menus.
|
51
|
+
Vedeu.menus.by_name(name).current_item
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
@@ -58,7 +60,7 @@ module Vedeu
|
|
58
60
|
# @return [void]
|
59
61
|
def menu_deselect!
|
60
62
|
Vedeu.bind(:_menu_deselect_) do |name|
|
61
|
-
Vedeu.menus.
|
63
|
+
Vedeu.menus.by_name(name).deselect_item
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
@@ -70,7 +72,7 @@ module Vedeu
|
|
70
72
|
#
|
71
73
|
# @return [void]
|
72
74
|
def menu_items!
|
73
|
-
Vedeu.bind(:_menu_items_) { |name| Vedeu.menus.
|
75
|
+
Vedeu.bind(:_menu_items_) { |name| Vedeu.menus.by_name(name).items }
|
74
76
|
end
|
75
77
|
|
76
78
|
# Makes the next menu item the current menu item, until it reaches the
|
@@ -81,7 +83,7 @@ module Vedeu
|
|
81
83
|
#
|
82
84
|
# @return [void]
|
83
85
|
def menu_next!
|
84
|
-
Vedeu.bind(:_menu_next_) { |name| Vedeu.menus.
|
86
|
+
Vedeu.bind(:_menu_next_) { |name| Vedeu.menus.by_name(name).next_item }
|
85
87
|
end
|
86
88
|
|
87
89
|
# Makes the previous menu item the current menu item, until it reaches the
|
@@ -92,7 +94,7 @@ module Vedeu
|
|
92
94
|
#
|
93
95
|
# @return [void]
|
94
96
|
def menu_prev!
|
95
|
-
Vedeu.bind(:_menu_prev_) { |name| Vedeu.menus.
|
97
|
+
Vedeu.bind(:_menu_prev_) { |name| Vedeu.menus.by_name(name).prev_item }
|
96
98
|
end
|
97
99
|
|
98
100
|
# Returns the selected menu item.
|
@@ -103,7 +105,7 @@ module Vedeu
|
|
103
105
|
# @return [void]
|
104
106
|
def menu_selected!
|
105
107
|
Vedeu.bind(:_menu_selected_) do |name|
|
106
|
-
Vedeu.menus.
|
108
|
+
Vedeu.menus.by_name(name).selected_item
|
107
109
|
end
|
108
110
|
end
|
109
111
|
|
@@ -114,7 +116,9 @@ module Vedeu
|
|
114
116
|
#
|
115
117
|
# @return [void]
|
116
118
|
def menu_select!
|
117
|
-
Vedeu.bind(:_menu_select_)
|
119
|
+
Vedeu.bind(:_menu_select_) do |name|
|
120
|
+
Vedeu.menus.by_name(name).select_item
|
121
|
+
end
|
118
122
|
end
|
119
123
|
|
120
124
|
# Makes the first menu item the current menu item.
|
@@ -124,7 +128,7 @@ module Vedeu
|
|
124
128
|
#
|
125
129
|
# @return [void]
|
126
130
|
def menu_top!
|
127
|
-
Vedeu.bind(:_menu_top_) { |name| Vedeu.menus.
|
131
|
+
Vedeu.bind(:_menu_top_) { |name| Vedeu.menus.by_name(name).top_item }
|
128
132
|
end
|
129
133
|
|
130
134
|
# Returns a subset of the menu items; starting at the current item to the
|
@@ -135,7 +139,7 @@ module Vedeu
|
|
135
139
|
#
|
136
140
|
# @return [void]
|
137
141
|
def menu_view!
|
138
|
-
Vedeu.bind(:_menu_view_) { |name| Vedeu.menus.
|
142
|
+
Vedeu.bind(:_menu_view_) { |name| Vedeu.menus.by_name(name).view }
|
139
143
|
end
|
140
144
|
|
141
145
|
end # Menus
|
data/lib/vedeu/bootstrap.rb
CHANGED
@@ -29,26 +29,13 @@ module Vedeu
|
|
29
29
|
#
|
30
30
|
# @return [void]
|
31
31
|
def start
|
32
|
-
|
33
|
-
Vedeu.configure { log('/tmp/vedeu_bootstrap.log') }
|
34
|
-
end
|
32
|
+
configure_log!
|
35
33
|
|
36
|
-
|
37
|
-
Dir[File.join(Vedeu::Configuration.base_path, 'config/**/*')].each do |f|
|
38
|
-
next if f =~ %r{config/configuration\.rb}
|
39
|
-
load f
|
40
|
-
end
|
34
|
+
client_configuration!
|
41
35
|
|
42
|
-
|
43
|
-
'app/views/templates/**/*',
|
44
|
-
'app/views/interfaces/**/*',
|
45
|
-
'app/controllers/**/*',
|
46
|
-
'app/helpers/**/*',
|
47
|
-
'app/views/**/*',
|
48
|
-
'app/models/keymaps/**/*',
|
49
|
-
].each { |path| load(File.join(Vedeu::Configuration.base_path, path)) }
|
36
|
+
client_application!
|
50
37
|
|
51
|
-
|
38
|
+
client_initialize!
|
52
39
|
|
53
40
|
Vedeu::Launcher.execute!(argv)
|
54
41
|
end
|
@@ -65,6 +52,39 @@ module Vedeu
|
|
65
52
|
|
66
53
|
private
|
67
54
|
|
55
|
+
# @return [String]
|
56
|
+
def base_path
|
57
|
+
Vedeu::Configuration.base_path
|
58
|
+
end
|
59
|
+
|
60
|
+
# @note
|
61
|
+
# config/configuration.rb is already loaded so don't load it twice
|
62
|
+
# @return [void]
|
63
|
+
def client_configuration!
|
64
|
+
Dir[File.join(base_path, 'config/**/*')].each do |path|
|
65
|
+
next if path =~ %r{config/configuration\.rb}
|
66
|
+
|
67
|
+
load(path)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# @return [void]
|
72
|
+
def client_application!
|
73
|
+
[
|
74
|
+
'app/views/templates/**/*',
|
75
|
+
'app/views/interfaces/**/*',
|
76
|
+
'app/controllers/**/*',
|
77
|
+
'app/helpers/**/*',
|
78
|
+
'app/views/**/*',
|
79
|
+
'app/models/keymaps/**/*',
|
80
|
+
].each { |path| load(File.join(base_path, path)) }
|
81
|
+
end
|
82
|
+
|
83
|
+
# @return [void]
|
84
|
+
def client_initialize!
|
85
|
+
entry_point || eval(Vedeu::Configuration.root)
|
86
|
+
end
|
87
|
+
|
68
88
|
# Load each of the loadable files.
|
69
89
|
#
|
70
90
|
# @param path [String]
|
@@ -86,6 +106,13 @@ module Vedeu
|
|
86
106
|
end
|
87
107
|
end
|
88
108
|
|
109
|
+
# @return [void]
|
110
|
+
def configure_log!
|
111
|
+
Vedeu.configure do
|
112
|
+
log('/tmp/vedeu_bootstrap.log')
|
113
|
+
end unless Vedeu::Configuration.log?
|
114
|
+
end
|
115
|
+
|
89
116
|
end # Bootstrap
|
90
117
|
|
91
118
|
end # Vedeu
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# Provides escape sequence strings for terminal colours and some actions.
|
4
|
+
#
|
5
|
+
module EscapeSequences
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
# @return [Hash<Symbol => String>]
|
10
|
+
def actions
|
11
|
+
{
|
12
|
+
hide_cursor: "\e[?25l",
|
13
|
+
show_cursor: "\e[?25h",
|
14
|
+
cursor_position: "\e[6n",
|
15
|
+
bg_reset: "\e[49m",
|
16
|
+
blink: "\e[5m",
|
17
|
+
blink_off: "\e[25m",
|
18
|
+
bold: "\e[1m",
|
19
|
+
bold_off: "\e[22m",
|
20
|
+
border_on: "\e(0",
|
21
|
+
border_off: "\e(B",
|
22
|
+
dim: "\e[2m",
|
23
|
+
fg_reset: "\e[39m",
|
24
|
+
negative: "\e[7m",
|
25
|
+
positive: "\e[27m",
|
26
|
+
reset: "\e[0m",
|
27
|
+
underline: "\e[4m",
|
28
|
+
underline_off: "\e[24m",
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
# Produces the background named colour escape sequence hash from the
|
33
|
+
# foreground escape sequence hash.
|
34
|
+
#
|
35
|
+
# @return [Hash<Symbol => Fixnum>]
|
36
|
+
def background_codes
|
37
|
+
hash = {}
|
38
|
+
Vedeu::EscapeSequences.foreground_codes.inject(hash) do |h, (k, v)|
|
39
|
+
h.merge!(k => v + 10)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Produces the foreground named colour escape sequence hash. The background
|
44
|
+
# escape sequences are also generated from this by adding 10 to the values.
|
45
|
+
# This hash gives rise to methods you can call directly on `Esc` to produce
|
46
|
+
# the desired colours:
|
47
|
+
#
|
48
|
+
# @example
|
49
|
+
# Esc.red # => "\e[31m"
|
50
|
+
#
|
51
|
+
# Esc.red { 'some text' } # => "\e[31msome text\e[39m"
|
52
|
+
#
|
53
|
+
# Esc.on_blue # => "\e[44m"
|
54
|
+
#
|
55
|
+
# Esc.on_blue { 'some text' } # => "\e[44msome text\e[49m"
|
56
|
+
#
|
57
|
+
# # Valid names:
|
58
|
+
# :black, :red, :green, :yellow, :blue, :magenta, :cyan, :light_grey,
|
59
|
+
# :default, :dark_grey, :light_red, :light_green, :light_yellow,
|
60
|
+
# :light_blue, :light_magenta, :light_cyan, :white
|
61
|
+
#
|
62
|
+
# @return [Hash<Symbol => Fixnum>]
|
63
|
+
def foreground_codes
|
64
|
+
{
|
65
|
+
black: 30,
|
66
|
+
red: 31,
|
67
|
+
green: 32,
|
68
|
+
yellow: 33,
|
69
|
+
blue: 34,
|
70
|
+
magenta: 35,
|
71
|
+
cyan: 36,
|
72
|
+
light_grey: 37,
|
73
|
+
default: 39,
|
74
|
+
dark_grey: 90,
|
75
|
+
light_red: 91,
|
76
|
+
light_green: 92,
|
77
|
+
light_yellow: 93,
|
78
|
+
light_blue: 94,
|
79
|
+
light_magenta: 95,
|
80
|
+
light_cyan: 96,
|
81
|
+
white: 97,
|
82
|
+
}
|
83
|
+
end
|
84
|
+
alias_method :codes, :foreground_codes
|
85
|
+
|
86
|
+
# @return [void]
|
87
|
+
def setup!
|
88
|
+
define_actions!
|
89
|
+
define_backgrounds!
|
90
|
+
define_foregrounds!
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
# @return [void]
|
96
|
+
def define_actions!
|
97
|
+
actions.each { |key, code| define_method(key) { code } }
|
98
|
+
end
|
99
|
+
|
100
|
+
# @return [void]
|
101
|
+
def define_backgrounds!
|
102
|
+
background_codes.each do |key, code|
|
103
|
+
define_method('on_' + key.to_s) do |&blk|
|
104
|
+
"\e[#{code}m" + (blk ? blk.call + "\e[49m" : '')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Dynamically creates methods for each terminal named colour. When a block
|
110
|
+
# is given, then the colour is reset to 'default' once the block is called.
|
111
|
+
#
|
112
|
+
# @return [void]
|
113
|
+
def define_foregrounds!
|
114
|
+
foreground_codes.each do |key, code|
|
115
|
+
define_method(key) do |&blk|
|
116
|
+
"\e[#{code}m" + (blk ? blk.call + "\e[39m" : '')
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
end # EscapeSequences
|
122
|
+
|
123
|
+
end # Vedeu
|
124
|
+
|
125
|
+
Vedeu::EscapeSequences.setup!
|
@@ -11,47 +11,55 @@ module Vedeu
|
|
11
11
|
|
12
12
|
include Singleton
|
13
13
|
|
14
|
-
|
15
|
-
# @see #input
|
16
|
-
def self.input(data, type = :key)
|
17
|
-
instance.input(data, type)
|
18
|
-
end
|
14
|
+
class << self
|
19
15
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
16
|
+
# @param (see #input)
|
17
|
+
# @see #input
|
18
|
+
def input(data, type = :key)
|
19
|
+
instance.input(data, type)
|
20
|
+
end
|
25
21
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
# @return [void]
|
23
|
+
# @see #output
|
24
|
+
def output
|
25
|
+
instance.output
|
26
|
+
end
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
28
|
+
# @return [void]
|
29
|
+
# @see #restart
|
30
|
+
def restart
|
31
|
+
instance.restart
|
32
|
+
end
|
33
|
+
alias_method :drb_restart, :restart
|
37
34
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
35
|
+
# @return [void]
|
36
|
+
# @see #shutdown
|
37
|
+
def shutdown
|
38
|
+
instance.shutdown
|
39
|
+
end
|
43
40
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
41
|
+
# @return [void]
|
42
|
+
# @see #start
|
43
|
+
def start
|
44
|
+
instance.start
|
45
|
+
end
|
46
|
+
alias_method :drb_start, :start
|
49
47
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
48
|
+
# @return [Symbol]
|
49
|
+
# @see #status
|
50
|
+
def status
|
51
|
+
instance.status
|
52
|
+
end
|
53
|
+
alias_method :drb_status, :status
|
54
|
+
|
55
|
+
# @return [void]
|
56
|
+
# @see #stop
|
57
|
+
def stop
|
58
|
+
instance.stop
|
59
|
+
end
|
60
|
+
alias_method :drb_stop, :stop
|
61
|
+
|
62
|
+
end # Eigenclass
|
55
63
|
|
56
64
|
# @param data [String|Symbol]
|
57
65
|
# @param type [Symbol] Either :keypress or :command.
|
data/lib/vedeu/dsl/view.rb
CHANGED
@@ -2,7 +2,80 @@ module Vedeu
|
|
2
2
|
|
3
3
|
module DSL
|
4
4
|
|
5
|
-
#
|
5
|
+
# There are two ways to construct views with Vedeu. You would like to draw
|
6
|
+
# the view to the screen immediately (immediate render) or you want to save
|
7
|
+
# a view to be drawn when you trigger a refresh event later (deferred view).
|
8
|
+
#
|
9
|
+
# Both of these approaches require that you have defined an interface (or
|
10
|
+
# 'visible area') first. You can find out how to define an interface with
|
11
|
+
# Vedeu here. The examples in 'Immediate Render' and 'Deferred View' use
|
12
|
+
# these interface definitions: (Note: if you use these examples, ensure your
|
13
|
+
# terminal is at least 70 characters in width and 5 lines in height.)
|
14
|
+
#
|
15
|
+
# Vedeu.interface 'main' do
|
16
|
+
# geometry do
|
17
|
+
# centred!
|
18
|
+
# height 4
|
19
|
+
# width 50
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# Vedeu.interface 'title' do
|
24
|
+
# geometry do
|
25
|
+
# height 1
|
26
|
+
# width 50
|
27
|
+
# x use('main').left
|
28
|
+
# y use('main').north
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# Both of these approaches use a concept of Buffers in Vedeu. There are
|
33
|
+
# three buffers for any defined interface. These are imaginatively called:
|
34
|
+
# 'back', 'front' and 'previous'.
|
35
|
+
#
|
36
|
+
# The 'back' buffer is the content for an interface which will be shown next
|
37
|
+
# time a refresh event is fired globally or for that interface. So, 'back'
|
38
|
+
# becomes 'front'.
|
39
|
+
#
|
40
|
+
# The 'front' buffer is the content for an interface which is currently
|
41
|
+
# showing. When a refresh event is fired, again, globally or for that
|
42
|
+
# interface specifically, the content of this 'front' buffer is first copied
|
43
|
+
# to the 'previous' buffer, and then the current 'back' buffer overwrites
|
44
|
+
# this 'front' buffer.
|
45
|
+
#
|
46
|
+
# The 'previous' buffer contains what was shown on the 'front' before the
|
47
|
+
# current 'front'.
|
48
|
+
#
|
49
|
+
# You can only write to either the 'front' (you want the content to be drawn
|
50
|
+
# immediately (immediate render)) or the 'back' (you would like the content
|
51
|
+
# to be drawn on the next refresh (deferred view)).
|
52
|
+
#
|
53
|
+
# The basic view DSL methods look like this:
|
54
|
+
#
|
55
|
+
# renders/views
|
56
|
+
# |- view
|
57
|
+
# |- lines
|
58
|
+
# | |- line
|
59
|
+
# | |- streams
|
60
|
+
# | | |- stream
|
61
|
+
# | | |- char
|
62
|
+
# | |
|
63
|
+
# | |- stream
|
64
|
+
# | |- char
|
65
|
+
# |
|
66
|
+
# |- line
|
67
|
+
# |- streams
|
68
|
+
# | |- stream
|
69
|
+
# | |- char
|
70
|
+
# |
|
71
|
+
# |- stream
|
72
|
+
# |- char
|
73
|
+
#
|
74
|
+
# renders/views
|
75
|
+
# |- view
|
76
|
+
# |- lines/line
|
77
|
+
# |- streams/stream
|
78
|
+
# |- char
|
6
79
|
#
|
7
80
|
class View
|
8
81
|
|
@@ -41,9 +114,24 @@ module Vedeu
|
|
41
114
|
# the views, though can be later triggered if needed.
|
42
115
|
#
|
43
116
|
# Vedeu.renders do
|
44
|
-
# view '
|
45
|
-
#
|
117
|
+
# view 'some_interface' do
|
118
|
+
# line do
|
119
|
+
# stream do
|
120
|
+
# left 'Title goes here', width: 35
|
121
|
+
# end
|
122
|
+
# stream do
|
123
|
+
# right Time.now.strftime('%H:%m'), width: 7
|
124
|
+
# end
|
125
|
+
# end
|
46
126
|
# end
|
127
|
+
# view 'other_interface' do
|
128
|
+
# lines do
|
129
|
+
# line 'This is content for the main interface.'
|
130
|
+
# line ''
|
131
|
+
# line 'Pretty easy eh?'
|
132
|
+
# end
|
133
|
+
# end
|
134
|
+
# # ... some code
|
47
135
|
# end
|
48
136
|
#
|
49
137
|
# # or...
|
@@ -67,6 +155,10 @@ module Vedeu
|
|
67
155
|
|
68
156
|
# Define a view (content) for an interface.
|
69
157
|
#
|
158
|
+
# As you can see by comparing the examples above to these below, the
|
159
|
+
# immediate render simply wraps what is already here in the deferred
|
160
|
+
# view.
|
161
|
+
#
|
70
162
|
# The views declared within this block are stored in their respective
|
71
163
|
# interface back buffers until a refresh event occurs. When the refresh
|
72
164
|
# event is triggered, the back buffers are swapped into the front
|
@@ -74,11 +166,22 @@ module Vedeu
|
|
74
166
|
# {Vedeu::Terminal.output}.
|
75
167
|
#
|
76
168
|
# Vedeu.views do
|
77
|
-
# view '
|
78
|
-
#
|
169
|
+
# view 'some_interface' do
|
170
|
+
# line do
|
171
|
+
# stream do
|
172
|
+
# left 'Title goes here', width: 35
|
173
|
+
# end
|
174
|
+
# stream do
|
175
|
+
# right Time.now.strftime('%H:%m'), width: 7
|
176
|
+
# end
|
177
|
+
# end
|
79
178
|
# end
|
80
|
-
# view '
|
81
|
-
#
|
179
|
+
# view 'other_interface' do
|
180
|
+
# lines do
|
181
|
+
# line 'This is content for the main interface.'
|
182
|
+
# line ''
|
183
|
+
# line 'Pretty easy eh?'
|
184
|
+
# end
|
82
185
|
# end
|
83
186
|
# # ... some code
|
84
187
|
# end
|