I did most of the initial work without any SCM. I am so bad.
[monoslider.git] / lib / album.rb
blob4cf3707f52d77440db65844153ff753dc02e6bf1
1 module MonoSlideshow
2   module Album
3     def self.included(base)
4          base.extend ClassMethods
5        end
6       
7     module ClassMethods
8       def slideshow_album(*args)
9         @@mono_album_options = {}
10         @@mono_slide_options = {}
11         define_method(:mono_album_options) { @@mono_album_options }
12         define_method(:mono_slide_options) { @@mono_slide_options }
13         case args
14         when [Symbol, Symbol]
15           @@mono_album_options[:from] = args[0]
16           @@mono_slide_options[:src] = args[1]
17         when [Hash]
18           options = args[0]
19           @@mono_slide_options = options.delete(:slides)
20           @@mono_album_options = options
21         else
22           raise ArgumentError
23         end
24         
25         define_method(:mono_album_slides) {self.send(mono_album_options[:from])}
26         
27         define_method(:mono_album_title) do
28           self.send(mono_album_options[:title]) if mono_album_options[:title]
29         end
30         
31         define_method(:mono_album_description) do
32           self.send(mono_album_options[:description]) if mono_album_options[:description]
33         end
34         
35         define_method(:mono_slide_src) { |slide| slide.send mono_slide_options[:src] }
36         
37         define_method(:mono_slide_title) do |slide|
38           slide.send mono_slide_options[:title] if mono_slide_options[:title]
39         end
40         
41         define_method(:mono_slide_description) do |slide|
42           slide.send mono_slide_options[:description] if mono_slide_options[:description]
43         end
45         define_method(:mono_album_thumbnail) { mono_slide_src(mono_album_slides.first) }
46         
47         include InstanceMethods
48         
49     #     default_options = { :from         => :images,
50     #                         :title        => :title,
51     #                         :description  => :description,
52     #                         :slide        => {  :title => :title, 
53     #                                             :src => :public_filename, 
54     #                                             :description => :description }}
55     #                         
56     #     options = default_options.merge(options)
57     #     @@mono_slide_association = options[:from]
58     #     @@mono_slide_src_method = options[:slide][:src]
59     #     @@mono_slide_description_method = options[:slide][:description]
60     #     @@mono_album_title = options[:title]
61     #     @@mono_album_description = options[:description]
62     #   
63     #     define_method(:mono_slide_src_method) { @@mono_slide_src_method }
64     #     define_method(:mono_slide_description_method) { @@mono_slide_description_method }
65     #     define_method(:mono_album_title) { self.send(@@mono_album_title) }  
66     #     define_method(:mono_album_description) { self.send(@@mono_album_description) }
67     # 
68       end
69     end
70       
71     module InstanceMethods
73       def slideshow_album_xml(xml=nil)
74         xml ||= Builder::XmlMarkup.new(:indent => 4)
75         album_hash = {:title => mono_album_title, 
76                       :description => mono_album_description, 
77                       :thumbnail => mono_album_thumbnail}.reject { |k,v| v.blank? }
78         xml.album(album_hash) do
79           mono_album_slides.each do |image|
80             image_hash = {:src => mono_slide_src(image), 
81                           :title => mono_slide_title(image), 
82                           :description => mono_slide_description(image)}.reject { |k,v| v.blank? }
83             xml.img(image_hash)
84           end
85         end
86       end    
87     end
88     
89   end
90 end