1 # Copyright (C) 2008 Dag Odenhall <dag.odenhall@gmail.com>
2 # Licensed under the Academic Free License version 3.0
4 require 'amazing/helpers/pango_markup'
9 # Raised by widgets, and is then rescued and logged
10 class WidgetError < Exception
13 # Parent class for widget construction, example:
15 # class Clock < Widget
16 # description "Displays date and time"
17 # dependency "some/library", "how to get the library (url, gem name...)"
18 # option :time_format, "Time format as described in DATE(1)", "%R"
19 # field :time, "Formatted time"
23 # @time = Time.now.strftime(@time_format)
24 # raise WidgetError, "An error occured!" if some_error?
28 include Helpers::PangoMarkup
31 def initialize(opts={})
32 self.class.dependencies.each do |name, description|
36 raise WidgetError, "Missing dependency #{name.inspect}#{if description then " [#{description}]" end}"
39 self.class.options.each do |key, value|
40 instance_variable_set "@#{key}".to_sym, value[:default]
42 opts.each do |key, value|
43 instance_variable_set "@#{key}".to_sym, value
45 self.class.fields.each do |key, value|
46 instance_variable_set "@#{key}".to_sym, value[:default]
48 self.class.init.each do |block|
51 @default = case self.class.default
53 instance_eval(&self.class.default)
55 instance_eval(self.class.default)
59 def self.description(description=nil)
61 @description = description
67 def self.dependency(name, description=nil)
69 @dependencies[name] = description
76 def self.option(name, description=nil, default=nil)
78 @options[name] = {:description => description, :default => default}
85 def self.field(name, description=nil, default=nil)
87 @fields[name] = {:description => description, :default => default}
94 def self.default(format=nil, &block) # :yields:
104 def self.init(&block) # :yields:
113 def formatize(format=nil)
116 instance_eval(&format)
118 instance_eval(format)
120 case self.class.default
122 instance_eval(&self.class.default)
124 instance_eval(self.class.default)
126 end.to_s).result(binding())