1 # Copyright 2008 Dag Odenhall <dag.odenhall@gmail.com>
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
28 if @options[:scaffold]
30 screen, statusbar = nil, nil
32 File.readlines(@options[:scaffold]).each do |line|
35 when /^\s*screen .*(\d+)/
39 when /^\s*statusbar[" ]*([^"\n ]+)/
41 list[screen][statusbar] = []
43 when /^\s*(graph|iconbox|progressbar|textbox)[" ]*([^"\n ]+)/
44 list[screen][statusbar] << [$1, $2]
46 when /^\s*data[" ]*([^"\n ]+)/
47 list[screen][statusbar][-1] << $1
52 list.each do |screen, statusbars|
53 statusbars.each do |statusbar, widgets|
56 puts "#{'# ' if screen == 0} set :screen => %s" % screen
57 puts "#{'# ' if statusbar == "mystatusbar"} set :statusbar => %s" % statusbar.inspect
60 widgets.each do |widget|
61 type, name, datas = widget[0], widget[1], widget[2..-1]
62 noop = !Amazing::Widgets.constants.include?(name.camel_case)
64 puts " widget(%s) {" % name.inspect
65 puts " set :module => :noop" if noop
66 puts "# set :module => %s" % name.to_sym.inspect unless noop
67 puts ' set :property => "image"' if type == "iconbox"
68 puts '# set :property => "text"' if type == "textbox"
69 puts " set :property => \"data %s\"" % datas[0] if datas.size == 1
70 puts " set :interval => 1"
72 Amazing::Widgets.const_get(name.camel_case).options.each do |option, data|
73 puts "# set %s => %s" % [option.inspect, data[:default].inspect]
79 puts " property(\"data %s\") {" % data
82 puts unless data == datas.last
87 puts unless name == widgets.last[1]
107 if @options[:listwidgets]
108 if @options[:listwidgets] == true
109 longest_widget_name = Widgets.constants.inject {|a,b| a.length > b.length ? a : b }.length
111 Widgets.constants.sort.each do |widget|
112 widget_class = Widgets.const_get(widget)
113 puts "%-#{longest_widget_name}s : %s" % [widget, widget_class.description]
117 widget_class = Widgets.const_get(@options[:listwidgets].camel_case)
120 puts "#{@options[:listwidgets].camel_case} - #{widget_class.description}"
123 dependencies = widget_class.dependencies
124 unless dependencies.empty?
125 longest_dependency_name = dependencies.keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
126 longest_dependency_name = 10 if longest_dependency_name < 10
127 longest_description = dependencies.values.inject {|a,b| a.length > b.length ? a : b }.length
128 longest_description = 11 if longest_description < 11
130 puts " %-#{longest_dependency_name}s | DESCRIPTION" % "DEPENDENCY"
131 puts "-" * (longest_dependency_name + longest_description + 5)
133 dependencies.keys.sort.each do |dependency|
134 puts " %-#{longest_dependency_name}s | #{dependencies[dependency]}" % dependency
140 options = widget_class.options
142 unless options.empty?
143 longest_option_name = options.keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
144 longest_option_name = 6 if longest_option_name < 6
145 longest_description = options.values.inject {|a,b| a[:description].length > b[:description].length ? a : b }[:description].length
146 longest_description = 11 if longest_description < 11
147 longest_default = options.values.inject {|a,b| a[:default].inspect.length > b[:default].inspect.length ? a : b }[:default].inspect.length
148 longest_default = 7 if longest_default < 7
150 puts " %-#{longest_option_name}s | %-#{longest_description}s | DEFAULT" % ["OPTION", "DESCRIPTION"]
151 puts "-" * (longest_option_name + longest_description + longest_default + 8)
153 options.keys.sort_by {|option| option.to_s }.each do |option|
154 puts " %-#{longest_option_name}s | %-#{longest_description}s | %s" % [option, options[option][:description], options[option][:default].inspect]
160 fields = widget_class.fields
163 longest_field_name = fields.keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
164 longest_field_name = 5 if longest_field_name < 5
165 longest_description = fields.values.inject {|a,b| a[:description].length > b[:description].length ? a : b }[:description].length
166 longest_description = 11 if longest_description < 11
167 longest_default = fields.values.inject {|a,b| a[:default].inspect.length > b[:default].inspect.length ? a : b }[:default].inspect.length
168 longest_default = 7 if longest_default < 7
170 puts " %-#{longest_field_name + 1}s | %-#{longest_description}s | DEFAULT" % ["FIELD", "DESCRIPTION"]
171 puts "-" * (longest_field_name + longest_description + longest_default + 9)
173 fields.keys.sort_by {|field| field.to_s }.each do |field|
174 puts " @%-#{longest_field_name}s | %-#{longest_description}s | %s" % [field, fields[field][:description], fields[field][:default].inspect]
187 widget = Widgets.const_get(@options[:test].camel_case)
188 settings = eval("{#{ARGV[0]}}")
189 instance = widget.new(settings)
190 longest_field_name = widget.fields.merge({:default => nil}).keys.inject {|a,b| a.to_s.length > b.to_s.length ? a : b }.to_s.length
192 puts "@%-#{longest_field_name}s = %s" % [:default, instance.instance_variable_get(:@default).inspect]
194 widget.fields.keys.sort_by {|field| field.to_s }.each do |field|
195 puts "@%-#{longest_field_name}s = %s" % [field, instance.instance_variable_get("@#{field}".to_sym).inspect]
202 def cmd_explicit_updates
203 if @options[:update] != []
204 @config[:awesome].each do |awesome|
205 awesome[:widgets].each do |widget|
206 locator = "%s/%s/%s" % [widget[:identifier], awesome[:statusbar], awesome[:screen]]
207 next unless @options[:update] == :all || @options[:update].include?(locator)
209 @threads << Thread.new(awesome, widget) do |awesome, widget|
210 update_widget(awesome[:screen], awesome[:statusbar], widget)
215 @threads.each {|t| t.join }
221 @config[:awesome].each do |awesome|
222 awesome[:widgets].each do |widget|
224 @threads << Thread.new(awesome, widget) do |awesome, widget|
228 Thread.new { update_widget(awesome[:screen], awesome[:statusbar], widget, iteration) }
231 sleep widget[:interval]