topherfangio-lcdproc-ruby 0.1.1
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.
- data/.document +5 -0
- data/.gitignore +6 -0
- data/LICENSE +20 -0
- data/README.rdoc +9 -0
- data/Rakefile +70 -0
- data/TODO +18 -0
- data/VERSION +1 -0
- data/devices/crystalfontz/packet.rb +108 -0
- data/devices/devices.rb +41 -0
- data/examples/basic.rb +39 -0
- data/examples/clock.rb +78 -0
- data/examples/lights.rb +67 -0
- data/lcdproc.rb +43 -0
- data/lib/console.rb +39 -0
- data/lib/core_extensions/array.rb +37 -0
- data/lib/core_extensions/string.rb +37 -0
- data/lib/includes/lcdproc.rb +27 -0
- data/lib/lcdproc-ruby.rb +0 -0
- data/lib/lcdproc/client.rb +458 -0
- data/lib/lcdproc/command.rb +54 -0
- data/lib/lcdproc/errors.rb +41 -0
- data/lib/lcdproc/key_event.rb +59 -0
- data/lib/lcdproc/menu.rb +188 -0
- data/lib/lcdproc/menu_event.rb +49 -0
- data/lib/lcdproc/menu_item.rb +108 -0
- data/lib/lcdproc/menu_items/action.rb +72 -0
- data/lib/lcdproc/menu_items/alpha.rb +85 -0
- data/lib/lcdproc/menu_items/checkbox.rb +76 -0
- data/lib/lcdproc/menu_items/ip.rb +75 -0
- data/lib/lcdproc/menu_items/numeric.rb +75 -0
- data/lib/lcdproc/menu_items/ring.rb +75 -0
- data/lib/lcdproc/menu_items/slider.rb +83 -0
- data/lib/lcdproc/menu_items/submenu.rb +77 -0
- data/lib/lcdproc/response.rb +65 -0
- data/lib/lcdproc/screen.rb +283 -0
- data/lib/lcdproc/widget.rb +142 -0
- data/lib/lcdproc/widgets/graph.rb +185 -0
- data/lib/lcdproc/widgets/hbar.rb +101 -0
- data/lib/lcdproc/widgets/icon.rb +94 -0
- data/lib/lcdproc/widgets/num.rb +92 -0
- data/lib/lcdproc/widgets/scroller.rb +110 -0
- data/lib/lcdproc/widgets/string.rb +94 -0
- data/lib/lcdproc/widgets/title.rb +90 -0
- data/lib/lcdproc/widgets/vbar.rb +111 -0
- data/script/console.rb +28 -0
- data/script/telnet.rb +90 -0
- data/tasks/test/basic.rake +82 -0
- data/tasks/test/keys.rake +66 -0
- data/tasks/test/menus.rake +74 -0
- metadata +104 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
#-------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2008 Topher Fangio
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person
|
5
|
+
# obtaining a copy of this software and associated documentation
|
6
|
+
# files (the "Software"), to deal in the Software without
|
7
|
+
# restriction, including without limitation the rights to use,
|
8
|
+
# copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the
|
10
|
+
# Software is furnished to do so, subject to the following
|
11
|
+
# conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
18
|
+
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
20
|
+
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
21
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
22
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
23
|
+
# OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
#-------------------------------------------------------------------------------
|
25
|
+
|
26
|
+
|
27
|
+
module LCDProc
|
28
|
+
|
29
|
+
# This class exists for the sole purpose of expansion. I cannot currently think of any reason why we would
|
30
|
+
# need more than a simple string to be sent to the server, however, in the future, it may make more sense to
|
31
|
+
# send the command and some arguments.
|
32
|
+
class Command
|
33
|
+
attr_reader :message
|
34
|
+
|
35
|
+
# Creates a new Command object.
|
36
|
+
#
|
37
|
+
# * <tt>message</tt> - The message/command to be sent to the server.
|
38
|
+
#
|
39
|
+
# Example:
|
40
|
+
#
|
41
|
+
# hello = Command.new( "hello" )
|
42
|
+
# client.send( hello )
|
43
|
+
#
|
44
|
+
# or
|
45
|
+
#
|
46
|
+
# client.send( Command.new( "info" ) )
|
47
|
+
#
|
48
|
+
def initialize( message )
|
49
|
+
@message = message
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#-------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2008 Topher Fangio
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person
|
5
|
+
# obtaining a copy of this software and associated documentation
|
6
|
+
# files (the "Software"), to deal in the Software without
|
7
|
+
# restriction, including without limitation the rights to use,
|
8
|
+
# copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the
|
10
|
+
# Software is furnished to do so, subject to the following
|
11
|
+
# conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
18
|
+
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
20
|
+
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
21
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
22
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
23
|
+
# OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
#-------------------------------------------------------------------------------
|
25
|
+
|
26
|
+
|
27
|
+
module LCDProc
|
28
|
+
|
29
|
+
module Errors
|
30
|
+
|
31
|
+
# Raised when an invalid command has been issued
|
32
|
+
class InvalidCommand < RuntimeError
|
33
|
+
end
|
34
|
+
|
35
|
+
# Raised when a command is formatted incorrectly
|
36
|
+
class IncorrectlyFormattedCommand < RuntimeError
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#-------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2008 Topher Fangio
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person
|
5
|
+
# obtaining a copy of this software and associated documentation
|
6
|
+
# files (the "Software"), to deal in the Software without
|
7
|
+
# restriction, including without limitation the rights to use,
|
8
|
+
# copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the
|
10
|
+
# Software is furnished to do so, subject to the following
|
11
|
+
# conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
18
|
+
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
20
|
+
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
21
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
22
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
23
|
+
# OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
#-------------------------------------------------------------------------------
|
25
|
+
|
26
|
+
|
27
|
+
module LCDProc
|
28
|
+
|
29
|
+
class KeyEvent
|
30
|
+
attr_reader :key, :block
|
31
|
+
|
32
|
+
# Creates a new KeyEvent object. Note that this does not register it with a client, it only gives you a
|
33
|
+
# clean object to pass around.
|
34
|
+
#
|
35
|
+
# * <tt>key</tt> - The key identifier. Valid values are "Escape", "Enter", "Up", "Down", "Left", or "Right".
|
36
|
+
# * <tt>&block</tt> - The block that you would like to associate with this key.
|
37
|
+
#
|
38
|
+
# Example:
|
39
|
+
#
|
40
|
+
# ke = KeyEvent.new( 'Enter' ) { puts 'Enter was pressed!' }
|
41
|
+
def self.new( key, &block )
|
42
|
+
|
43
|
+
if block.nil?
|
44
|
+
return nil
|
45
|
+
else
|
46
|
+
super( key, &block )
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def initialize( key, &block )
|
53
|
+
@key = key
|
54
|
+
@block = block
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
data/lib/lcdproc/menu.rb
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
#-------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2008 Topher Fangio
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person
|
5
|
+
# obtaining a copy of this software and associated documentation
|
6
|
+
# files (the "Software"), to deal in the Software without
|
7
|
+
# restriction, including without limitation the rights to use,
|
8
|
+
# copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the
|
10
|
+
# Software is furnished to do so, subject to the following
|
11
|
+
# conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
18
|
+
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
20
|
+
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
21
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
22
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
23
|
+
# OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
#-------------------------------------------------------------------------------
|
25
|
+
|
26
|
+
|
27
|
+
module LCDProc
|
28
|
+
|
29
|
+
class MenuItemStore
|
30
|
+
attr_accessor :menu_item, :menu_event, :added_to_screen
|
31
|
+
|
32
|
+
def initialize( menu_item, menu_event, added_to_screen )
|
33
|
+
@menu_item = menu_item
|
34
|
+
@menu_event = menu_event
|
35
|
+
@added_to_screen = added_to_screen
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
class Menu
|
41
|
+
attr_reader :client, :id, :items
|
42
|
+
attr_accessor :parent
|
43
|
+
|
44
|
+
@@menu_count = 0
|
45
|
+
|
46
|
+
# Create a new Menu object optionally attached to a client. Note that if you would like to create
|
47
|
+
# a sub menu which can be attached to a menu, you should use LCDProc::MenuItems::Submenu.
|
48
|
+
#
|
49
|
+
# Note that when a client is created, this function is called and and it becomes the default client's menu
|
50
|
+
#
|
51
|
+
# * <tt>client</tt> - The client to which you wish this menu to be attached. Defaults to nil
|
52
|
+
def initialize( client = nil )
|
53
|
+
@id = "".quotify
|
54
|
+
@parent = nil
|
55
|
+
@client = client
|
56
|
+
@stored_items = []
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# Adds the specified menu item to this menu. Returns the menu item that was added.
|
61
|
+
#
|
62
|
+
# * <tt>menu_item</tt> - The menu item that you wish to add
|
63
|
+
# * <tt>&block</tt> - You may optionally pass a block to this menthod to register a menu event with the client
|
64
|
+
#
|
65
|
+
# Example:
|
66
|
+
#
|
67
|
+
# c = Client.new
|
68
|
+
# a = c.menu.add_item( MenuItem.new( :action, :id => 'AnAction' ) ) { |response| puts "AnAction was pressed!!!" }
|
69
|
+
#
|
70
|
+
# # a now contains the action menu item
|
71
|
+
def add_item( menu_item, &block )
|
72
|
+
|
73
|
+
# This slight hack allows for sub menus to correctly know to whom they belong
|
74
|
+
if menu_item.respond_to? :parent=
|
75
|
+
menu_item.send( :parent=, self )
|
76
|
+
end
|
77
|
+
|
78
|
+
@stored_items << MenuItemStore.new( menu_item, MenuEvent.new( menu_item, &block ), false )
|
79
|
+
|
80
|
+
update
|
81
|
+
|
82
|
+
return menu_item
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
# Attaches this menu to a particular client. Note that this will detach this menu from any existing clients.
|
87
|
+
#
|
88
|
+
# * <tt>client</tt> - The client to which you wish to be attached. Defaults to nil.
|
89
|
+
# * <tt>should_update</tt> - Whether or not we should go ahead and display all of our items on the screen. Defaults to true.
|
90
|
+
#
|
91
|
+
# Example:
|
92
|
+
#
|
93
|
+
# c1 = Client.new
|
94
|
+
# c2 = Client.new
|
95
|
+
# c2.detach
|
96
|
+
#
|
97
|
+
# c1.menu.attach_to( c2 )
|
98
|
+
def attach_to( client = nil, should_update = true )
|
99
|
+
|
100
|
+
self.detach
|
101
|
+
|
102
|
+
@client = client
|
103
|
+
|
104
|
+
if should_update
|
105
|
+
self.update
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
# Detaches this menu from the current client. Note that if this fails, it still detaches the client, so
|
111
|
+
# you might have extraneous menu items lying around (but you shouldn't so long as you don't bypass the
|
112
|
+
# add_item method somehow...)
|
113
|
+
def detach
|
114
|
+
errors = []
|
115
|
+
|
116
|
+
@stored_items.select{ |si| si.added_to_screen == true }.each do |visible_stored_item|
|
117
|
+
menu_item = visible_stored_item.menu_item
|
118
|
+
|
119
|
+
response = client.send_command( Command.new( "menu_del_item #{@id} #{menu_item.id.quotify}" ) )
|
120
|
+
|
121
|
+
if not response.successful?
|
122
|
+
errors << true
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Make sure that we don't still think that any are visible on the screen
|
127
|
+
@stored_items.each { |si| si.added_to_screen = false }
|
128
|
+
|
129
|
+
@client = nil
|
130
|
+
|
131
|
+
return errors.length == 0
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
# Adds any existing, but not currently added, menu items to the screen (including sub menus and their items).
|
136
|
+
# This may be called to ensure that all items are displayed in the menu and is called whenever a menu item
|
137
|
+
# is added to a menu. This technically allows you to create a menu object that is not attached to a
|
138
|
+
# client, later attach it to a client and then call the update method to display the menu and it's items
|
139
|
+
# on screen.
|
140
|
+
#
|
141
|
+
# Example
|
142
|
+
#
|
143
|
+
# c = Client.new
|
144
|
+
# c.menu.update
|
145
|
+
def update
|
146
|
+
|
147
|
+
if @client
|
148
|
+
client = @client
|
149
|
+
else
|
150
|
+
parent_menu = @parent
|
151
|
+
|
152
|
+
while not parent_menu.nil? and parent_menu.client.nil?
|
153
|
+
parent_menu = parent_menu.parent
|
154
|
+
end
|
155
|
+
|
156
|
+
client = parent_menu.client unless parent_menu.nil? or parent_menu.client.nil?
|
157
|
+
end
|
158
|
+
|
159
|
+
if client
|
160
|
+
|
161
|
+
@stored_items.select{ |mis| mis.added_to_screen == false }.each do |stored_item|
|
162
|
+
menu_item = stored_item.menu_item
|
163
|
+
|
164
|
+
response = client.send_command( Command.new( "menu_add_item #{@id} #{menu_item.id.quotify} #{menu_item.lcdproc_type} #{menu_item.lcdproc_options_as_string}" ) )
|
165
|
+
|
166
|
+
if not response.successful?
|
167
|
+
return nil
|
168
|
+
else
|
169
|
+
stored_item.added_to_screen = true
|
170
|
+
end
|
171
|
+
|
172
|
+
if not stored_item.menu_event.nil?
|
173
|
+
client.register_menu_event( stored_item.menu_event )
|
174
|
+
end
|
175
|
+
|
176
|
+
if menu_item.respond_to? :update
|
177
|
+
menu_item.send( :update )
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#-------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2008 Topher Fangio
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person
|
5
|
+
# obtaining a copy of this software and associated documentation
|
6
|
+
# files (the "Software"), to deal in the Software without
|
7
|
+
# restriction, including without limitation the rights to use,
|
8
|
+
# copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the
|
10
|
+
# Software is furnished to do so, subject to the following
|
11
|
+
# conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
18
|
+
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
20
|
+
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
21
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
22
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
23
|
+
# OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
#-------------------------------------------------------------------------------
|
25
|
+
|
26
|
+
|
27
|
+
module LCDProc
|
28
|
+
|
29
|
+
class MenuEvent
|
30
|
+
attr_reader :menu_item, :block
|
31
|
+
|
32
|
+
# Creates a new MenuEvent attached to the specified menu_item. If no block is passed, this function
|
33
|
+
# returns nil.
|
34
|
+
def self.new( menu_item, &block )
|
35
|
+
if block.nil?
|
36
|
+
return nil
|
37
|
+
else
|
38
|
+
super( menu_item, &block )
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def initialize( menu_item, &block )
|
43
|
+
@menu_item = menu_item
|
44
|
+
@block = block
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
#-------------------------------------------------------------------------------
|
2
|
+
# Copyright (c) 2008 Topher Fangio
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person
|
5
|
+
# obtaining a copy of this software and associated documentation
|
6
|
+
# files (the "Software"), to deal in the Software without
|
7
|
+
# restriction, including without limitation the rights to use,
|
8
|
+
# copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the
|
10
|
+
# Software is furnished to do so, subject to the following
|
11
|
+
# conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
18
|
+
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
20
|
+
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
21
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
22
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
23
|
+
# OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
#-------------------------------------------------------------------------------
|
25
|
+
|
26
|
+
|
27
|
+
module LCDProc
|
28
|
+
|
29
|
+
# MenuItem is a factory for creating new menu items and registering them with the client so that when the
|
30
|
+
# menu item's event is processed, it can call the associated block.
|
31
|
+
module MenuItem
|
32
|
+
attr_reader :id, :is_hidden, :lcdproc_type, :lcdproc_event_type, :next, :parent_menu, :previous, :text
|
33
|
+
attr_accessor :lcdproc_options
|
34
|
+
@supported_types = {}
|
35
|
+
|
36
|
+
def MenuItem.new( type = :string, options = {}, lcdproc_options = {} )
|
37
|
+
if @supported_types.include? type
|
38
|
+
menu_item = @supported_types[ type ].new( options, lcdproc_options )
|
39
|
+
|
40
|
+
return menu_item
|
41
|
+
else
|
42
|
+
return nil
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
# Allows a particular type of menu item to inform the MenuItem module (which is a MenuItem factory) that it is
|
48
|
+
# able to support a particular type of menu item.
|
49
|
+
def MenuItem.add_support( type, menu_item_class )
|
50
|
+
@supported_types[type] = menu_item_class
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
# Returns an array of symbols listing the supported types of menu items.
|
55
|
+
def MenuItem.supported_types
|
56
|
+
@supported_types.keys
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# Set's whether or not the menu item is hidden.
|
61
|
+
#
|
62
|
+
# * <tt>value</tt> - True or false
|
63
|
+
#
|
64
|
+
# Example:
|
65
|
+
#
|
66
|
+
# m = MenuItem.new( :action )
|
67
|
+
# m.is_hidden = true
|
68
|
+
#
|
69
|
+
def is_hidden= value
|
70
|
+
# If we have a client, go ahead and send the command; otherwise, just set the value.
|
71
|
+
if @parent_menu and @parent_menu.client
|
72
|
+
response = @parent_menu.client.send_command( Command.new( "menu_set_item \"#{@parent_menu}\" \"#{@id}\" -is_hidden #{value}" ) )
|
73
|
+
|
74
|
+
if response.successful?
|
75
|
+
@is_hidden = value
|
76
|
+
else
|
77
|
+
return nil
|
78
|
+
end
|
79
|
+
else
|
80
|
+
@is_hidden = value
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# Returns a string representation of the lcdproc_options that can be sent directly to LCDd.
|
86
|
+
def lcdproc_options_as_string
|
87
|
+
options_as_lcdproc = []
|
88
|
+
@lcdproc_options.each{ |key,value| options_as_lcdproc << "-#{key} #{value}" }
|
89
|
+
options_as_lcdproc.join(" ")
|
90
|
+
end
|
91
|
+
|
92
|
+
def text= value
|
93
|
+
# If we have a client, go ahead and send the command; otherwise, just set the value.
|
94
|
+
if @parent_menu and @parent_menu.client
|
95
|
+
response = @parent_menu.client.send_command( Command.new( "menu_set_item \"#{@parent_menu}\" \"#{@id}\" -text #{value}" ) )
|
96
|
+
|
97
|
+
if response.successful?
|
98
|
+
@text = value
|
99
|
+
else
|
100
|
+
return nil
|
101
|
+
end
|
102
|
+
else
|
103
|
+
@text = value
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|