gnome-wallpaper-slideshow 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +8 -0
- data/lib/gnome-wallpaper-slideshow.rb +173 -0
- data/lib/gnome-wallpaper-slideshow/wallpaper.rb +15 -0
- data/test/test-gnome-wallpaper-slideshow.rb +58 -0
- metadata +67 -0
data/Rakefile
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
# Represents an XML file defining a wallpaper slideshow in GNOME
|
5
|
+
#
|
6
|
+
# @author Andrew Johnson
|
7
|
+
class GnomeWallpaperSlideshow
|
8
|
+
# Create a new GnomeWallpaperSlideshow
|
9
|
+
def initialize(&block)
|
10
|
+
instance_eval(&block) if block_given?
|
11
|
+
end
|
12
|
+
|
13
|
+
# Creates a new wallpaper slideshow
|
14
|
+
# @param [String] filename The path to the new file to create.
|
15
|
+
# Defaults to slideshow.xml in the current working directory.
|
16
|
+
# If the file already exists it will be overwritten
|
17
|
+
def create_new_slideshow(filename = "slideshow.xml")
|
18
|
+
@path = Pathname.new filename
|
19
|
+
end
|
20
|
+
|
21
|
+
# Loads an existing wallpaper slideshow
|
22
|
+
# @param [String] filename The path to the slideshow file
|
23
|
+
def load_slideshow(filename)
|
24
|
+
@path = Pathname.new filename
|
25
|
+
load_slideshow_xml
|
26
|
+
|
27
|
+
# Load the content from the XML doc
|
28
|
+
load_start_time
|
29
|
+
load_wallpapers
|
30
|
+
end
|
31
|
+
|
32
|
+
# Gets or sets the start time of the slideshow
|
33
|
+
# @param [Time] time The start time for the slideshow
|
34
|
+
# @return The current start time if one is not given
|
35
|
+
def start_time(time = nil)
|
36
|
+
return @start_time unless time
|
37
|
+
|
38
|
+
@start_time = time
|
39
|
+
end
|
40
|
+
|
41
|
+
# Gets or sets the path of the slideshow XML file
|
42
|
+
# @param [String] filename The path to the new location of the XML file
|
43
|
+
# @return The current path if one is not given
|
44
|
+
def path(filename = nil)
|
45
|
+
return @path unless filename
|
46
|
+
|
47
|
+
@path = Pathname.new filename
|
48
|
+
end
|
49
|
+
|
50
|
+
# Gets the list of wallpapers in this slideshow
|
51
|
+
# @return The list of wallpapers in the slideshow, or the empty list if none exist
|
52
|
+
def wallpapers
|
53
|
+
return @wallpapers = @wallpapers || []
|
54
|
+
end
|
55
|
+
|
56
|
+
# Adds a new wallpaper to the slideshow
|
57
|
+
# @param [GnomeWallpaperSlideshow::Wallpaper] wallpaper The wallpaper to add
|
58
|
+
def add_wallpaper(wallpaper)
|
59
|
+
wallpapers << wallpaper
|
60
|
+
end
|
61
|
+
|
62
|
+
# Removes a wallpaper from the slideshow
|
63
|
+
# @param [String] filename The filename of the wallpaper to remove
|
64
|
+
def remove_wallpaper(filename)
|
65
|
+
wallpapers.delete_if do |wallpaper|
|
66
|
+
wallpaper.filename == filename
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Generates and saves the slideshow XML to the current @path
|
71
|
+
def save_xml
|
72
|
+
return "" if start_time.nil? or wallpapers.none?
|
73
|
+
|
74
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
75
|
+
xml.background {
|
76
|
+
# The start time comes first
|
77
|
+
xml.starttime {
|
78
|
+
xml.year start_time.year
|
79
|
+
xml.month start_time.month
|
80
|
+
xml.day start_time.day
|
81
|
+
xml.hour start_time.hour
|
82
|
+
xml.minute start_time.min
|
83
|
+
xml.second start_time.sec
|
84
|
+
}
|
85
|
+
# Transitions are in pairs of wallpapers
|
86
|
+
wallpapers.each_cons(2) do |transition|
|
87
|
+
# The static tag defines a wallpaper and how long it is displayed
|
88
|
+
xml.static {
|
89
|
+
xml.duration transition.first.duration
|
90
|
+
xml.file transition.first.filename
|
91
|
+
}
|
92
|
+
# The transition tag defines how long the transition between this and the next takes
|
93
|
+
xml.transition {
|
94
|
+
xml.duration transition.first.transition_time
|
95
|
+
xml.from transition.first.filename
|
96
|
+
xml.to transition.last.filename
|
97
|
+
}
|
98
|
+
end
|
99
|
+
# Now insert the last wallpaper and the transition back to the beginning
|
100
|
+
xml.static {
|
101
|
+
xml.duration wallpapers.last.duration
|
102
|
+
xml.file wallpapers.last.filename
|
103
|
+
}
|
104
|
+
xml.transition {
|
105
|
+
xml.duration wallpapers.last.transition_time
|
106
|
+
xml.from wallpapers.last.filename
|
107
|
+
xml.to wallpapers.first.filename
|
108
|
+
}
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
write_xml builder.to_xml
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
# Writes an XML string to a file
|
118
|
+
# @param [String] xml_string The XML to write out
|
119
|
+
def write_xml(xml_string)
|
120
|
+
File.open(self.path, "w") do |slideshow_file|
|
121
|
+
slideshow_file.write xml_string
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# Loads a wallpaper slideshow XML file
|
126
|
+
def load_slideshow_xml
|
127
|
+
File.open(self.path, "r") do |slideshow_file|
|
128
|
+
# We want strict parsing to ensure we are given a valid XML file
|
129
|
+
@xml_doc = Nokogiri::XML(slideshow_file) do |config|
|
130
|
+
config.strict
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# Loads the start time from the XML file
|
136
|
+
def load_start_time
|
137
|
+
year = starttime_xpath_query "year"
|
138
|
+
month = starttime_xpath_query "month"
|
139
|
+
day = starttime_xpath_query "day"
|
140
|
+
hour = starttime_xpath_query "hour"
|
141
|
+
minute = starttime_xpath_query "minute"
|
142
|
+
second = starttime_xpath_query "second"
|
143
|
+
|
144
|
+
start_time Time.local year, month, day, hour, minute, second
|
145
|
+
end
|
146
|
+
|
147
|
+
# Load the wallpapers and transitions from the XML file
|
148
|
+
def load_wallpapers
|
149
|
+
files = wallpaper_xpath_query "//static/file"
|
150
|
+
durations = wallpaper_xpath_query "//static/duration"
|
151
|
+
transitions = wallpaper_xpath_query "//transition/duration"
|
152
|
+
|
153
|
+
@wallpapers = files.zip(durations,transitions).map do |file, duration, transition|
|
154
|
+
GnomeWallpaperSlideshow::Wallpaper.new file, duration, transition
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# Performs an XPath query for wallpapers
|
159
|
+
# @param [String] query The XPath query to perform
|
160
|
+
def wallpaper_xpath_query(query)
|
161
|
+
@xml_doc.xpath(query).children.map do |child|
|
162
|
+
child.content
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# Performs an XPath query for an element of the starttime
|
167
|
+
# @param [String] field The starttime field to extract
|
168
|
+
def starttime_xpath_query(field)
|
169
|
+
@xml_doc.at_xpath("//starttime/#{field}").children.first.content
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
require 'gnome-wallpaper-slideshow/wallpaper'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Represents a wallpaper entry in a slideshow
|
2
|
+
class GnomeWallpaperSlideshow::Wallpaper
|
3
|
+
attr_accessor :filename, :duration, :transition_time
|
4
|
+
|
5
|
+
# Create a new wallpaper
|
6
|
+
# @param [String] filename The path to the image file
|
7
|
+
# @param [Float] duration The length of time this wallpaper will be displayed in seconds
|
8
|
+
# @param [Float] transition_time The amount of time spent transitioning
|
9
|
+
# to the next wallpaper in seconds
|
10
|
+
def initialize(filename, duration = 1795.0, transition_time = 5.0)
|
11
|
+
@filename = filename
|
12
|
+
@duration = duration
|
13
|
+
@transition_time = transition_time
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'gnome-wallpaper-slideshow'
|
3
|
+
|
4
|
+
class GnomeWallpaperSlideshowTest < Test::Unit::TestCase
|
5
|
+
def test_create_new_slideshow
|
6
|
+
slideshow = GnomeWallpaperSlideshow.new do
|
7
|
+
create_new_slideshow "xml_slideshow.xml"
|
8
|
+
end
|
9
|
+
|
10
|
+
path = Pathname.new "xml_slideshow.xml"
|
11
|
+
assert_equal path, slideshow.path
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_create_new_slideshow_default_arg
|
15
|
+
slideshow = GnomeWallpaperSlideshow.new do
|
16
|
+
create_new_slideshow
|
17
|
+
end
|
18
|
+
|
19
|
+
path = Pathname.new "slideshow.xml"
|
20
|
+
assert_equal path, slideshow.path
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_start_time
|
24
|
+
slideshow = GnomeWallpaperSlideshow.new
|
25
|
+
|
26
|
+
time = Time.local 2009,8,4,0,0,0
|
27
|
+
|
28
|
+
assert_equal time, slideshow.start_time(time) # Test setting the time
|
29
|
+
assert_equal time, slideshow.start_time # Test getting the time
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_path
|
33
|
+
slideshow = GnomeWallpaperSlideshow.new
|
34
|
+
|
35
|
+
path = Pathname.new "xml_slideshow.xml"
|
36
|
+
assert_equal path, slideshow.path(path) # Test setting the path
|
37
|
+
assert_equal path, slideshow.path # Test getting the path
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_wallpapers
|
41
|
+
slideshow = GnomeWallpaperSlideshow.new
|
42
|
+
wallpaper_one = GnomeWallpaperSlideshow::Wallpaper.new "test.jpg", 100, 5
|
43
|
+
wallpaper_two = GnomeWallpaperSlideshow::Wallpaper.new "other.jpg", 500, 3
|
44
|
+
|
45
|
+
assert_equal [], slideshow.wallpapers # Test handling of no wallpapers
|
46
|
+
|
47
|
+
# Test adding wallpapers
|
48
|
+
slideshow.add_wallpaper wallpaper_one
|
49
|
+
slideshow.add_wallpaper wallpaper_two
|
50
|
+
|
51
|
+
assert_equal [wallpaper_one, wallpaper_two], slideshow.wallpapers
|
52
|
+
|
53
|
+
# Test removing wallpapers
|
54
|
+
slideshow.remove_wallpaper wallpaper_one.filename
|
55
|
+
|
56
|
+
assert_equal [wallpaper_two], slideshow.wallpapers
|
57
|
+
end
|
58
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gnome-wallpaper-slideshow
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrew Johnson
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-13 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nokogiri
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.5.6
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.5.6
|
30
|
+
description: A gem for creating and interacting with the XML files that define wallpaper
|
31
|
+
slideshows in GNOME
|
32
|
+
email: andrew@andrewjamesjohnson.com
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- lib/gnome-wallpaper-slideshow.rb
|
38
|
+
- lib/gnome-wallpaper-slideshow/wallpaper.rb
|
39
|
+
- Rakefile
|
40
|
+
- test/test-gnome-wallpaper-slideshow.rb
|
41
|
+
homepage: https://github.com/ajsquared/gnome-wallpaper-slideshow
|
42
|
+
licenses: []
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
requirements: []
|
60
|
+
rubyforge_project:
|
61
|
+
rubygems_version: 1.8.23
|
62
|
+
signing_key:
|
63
|
+
specification_version: 3
|
64
|
+
summary: Gnome Wallpaper Slideshow
|
65
|
+
test_files:
|
66
|
+
- test/test-gnome-wallpaper-slideshow.rb
|
67
|
+
has_rdoc:
|