gswax 0.0.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/bin/gswax +4 -0
- data/lib/gswax.rb +306 -0
- data/lib/gswax/Wax.rb +273 -0
- data/lib/gswax/browser.rb +224 -0
- data/lib/gswax/images/arm.png +0 -0
- data/lib/gswax/images/default.png +0 -0
- data/lib/gswax/images/defaultHOVER.png +0 -0
- data/lib/gswax/images/dugout.png +0 -0
- data/lib/gswax/images/dugoutHOVER.png +0 -0
- data/lib/gswax/images/info.png +0 -0
- data/lib/gswax/images/infoHOVER.png +0 -0
- data/lib/gswax/images/next.png +0 -0
- data/lib/gswax/images/nextHOVER.png +0 -0
- data/lib/gswax/images/no_cover.png +0 -0
- data/lib/gswax/images/pause.png +0 -0
- data/lib/gswax/images/pauseHOVER.png +0 -0
- data/lib/gswax/images/play.png +0 -0
- data/lib/gswax/images/playHOVER.png +0 -0
- data/lib/gswax/images/playlist.png +0 -0
- data/lib/gswax/images/playlistHOVER.png +0 -0
- data/lib/gswax/images/prev.png +0 -0
- data/lib/gswax/images/prevHOVER.png +0 -0
- data/lib/gswax/images/settings.png +0 -0
- data/lib/gswax/images/settingsHOVER.png +0 -0
- data/lib/gswax/images/shuffle.png +0 -0
- data/lib/gswax/images/shuffleHOVER.png +0 -0
- data/lib/gswax/images/stanton.png +0 -0
- data/lib/gswax/images/stanton1.png +0 -0
- data/lib/gswax/images/vol.png +0 -0
- data/lib/gswax/images/volslider.png +0 -0
- data/lib/gswax/playlist.rb +182 -0
- data/lib/gswax/playlists/default +0 -0
- data/lib/gswax/scrollbox.rb +100 -0
- data/lib/gswax/settings/settings.yml +16 -0
- data/lib/gswax/settings_manager.rb +284 -0
- data/lib/gswax/shared.rb +206 -0
- data/lib/gswax/turntable.rb +251 -0
- data/lib/gswax/version.rb +3 -0
- metadata +107 -0
File without changes
|
@@ -0,0 +1,100 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
this file is part of: gsWax v. 0.12.01
|
4
|
+
|
5
|
+
You should have received a copy of the GNU General Public License
|
6
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
7
|
+
=end
|
8
|
+
|
9
|
+
|
10
|
+
class ScrollBox
|
11
|
+
attr_accessor :main
|
12
|
+
|
13
|
+
def initialize(txt)
|
14
|
+
@txt = txt
|
15
|
+
@scroll_text = txt + " "
|
16
|
+
bgc = Settings.bg_color
|
17
|
+
@bg_color = Gdk::Color.new(bgc[0], bgc[1], bgc[2])
|
18
|
+
|
19
|
+
@main = Gtk::EventBox.new()
|
20
|
+
@main.set_size_request(727 * Settings.scale, 75 * Settings.scale)
|
21
|
+
@main.signal_connect("enter_notify_event"){hover_toggle}###
|
22
|
+
@main.signal_connect("leave_notify_event"){@left = true}###
|
23
|
+
@main.modify_bg(Gtk::STATE_NORMAL, @bg_color)
|
24
|
+
frame = Gtk::HBox.new(false, 0)
|
25
|
+
@text_label = Gtk::Label.new
|
26
|
+
@text_label.justify=(Gtk::JUSTIFY_CENTER)
|
27
|
+
@text_label.ellipsize = Pango::Layout::ELLIPSIZE_END
|
28
|
+
frame.pack_start(@text_label, true, true, 10)
|
29
|
+
@main.add(frame)
|
30
|
+
show_text(@txt)
|
31
|
+
end
|
32
|
+
|
33
|
+
def show_text(txt)
|
34
|
+
if @text_label
|
35
|
+
txc = Settings.text_color
|
36
|
+
txt_color = Gdk::Color.new(txc[0], txc[1], txc[2])
|
37
|
+
@text_label.set_markup(
|
38
|
+
%Q[<span font_desc="#{Settings.font_desc}"foreground="#{txt_color}">#{CGI.escape_html(txt)}</span>]
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def set_text(txt)
|
44
|
+
stop_scroll if @scrolling
|
45
|
+
@scroll_text = txt + " "
|
46
|
+
@text_label.text = @scroll_text
|
47
|
+
@text_label.justify=(Gtk::JUSTIFY_CENTER)
|
48
|
+
show_text(@scroll_text)
|
49
|
+
end
|
50
|
+
|
51
|
+
def hover_toggle
|
52
|
+
@left = false
|
53
|
+
timer = GLib::Timer.new
|
54
|
+
GLib::Timeout.add(100){
|
55
|
+
if timer.elapsed[0].round(1) > 0.3
|
56
|
+
unless @left
|
57
|
+
if @scrolling
|
58
|
+
stop_scroll
|
59
|
+
else
|
60
|
+
start_scroll
|
61
|
+
end
|
62
|
+
timer.stop
|
63
|
+
end
|
64
|
+
false
|
65
|
+
else
|
66
|
+
true
|
67
|
+
end
|
68
|
+
}
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
def start_scroll
|
73
|
+
@scrolling = true
|
74
|
+
@text_label.justify=(Gtk::JUSTIFY_LEFT)
|
75
|
+
@timer = GLib::Timeout.add(100){
|
76
|
+
if @scrolling
|
77
|
+
first = @scroll_text.slice!(0)
|
78
|
+
@scroll_text << first
|
79
|
+
show_text(@scroll_text)
|
80
|
+
else
|
81
|
+
false
|
82
|
+
end
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
def stop_scroll
|
87
|
+
@scrolling = false; @timer = nil
|
88
|
+
end
|
89
|
+
|
90
|
+
def set_text(txt)
|
91
|
+
stop_scroll if @scrolling
|
92
|
+
@scroll_text = txt + " "
|
93
|
+
show_text(@scroll_text)
|
94
|
+
end
|
95
|
+
|
96
|
+
def resize
|
97
|
+
@main.set_size_request(727.0 * Settings.scale, 75.0 * Settings.scale)
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
@@ -0,0 +1,284 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
this file is part of: gsWax v. 0.12.01
|
4
|
+
|
5
|
+
You should have received a copy of the GNU General Public License
|
6
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
7
|
+
=end
|
8
|
+
|
9
|
+
|
10
|
+
class SettingsCell < Gtk::Frame
|
11
|
+
attr_accessor :label
|
12
|
+
|
13
|
+
def set(label_text, label_pos, width, height)
|
14
|
+
@label = Gtk::Label.new(label_text)
|
15
|
+
self.label_widget = @label
|
16
|
+
self.set_width_request(width) if width
|
17
|
+
self.set_height_request(height) if height
|
18
|
+
self.label_xalign = label_pos if label_pos
|
19
|
+
end
|
20
|
+
|
21
|
+
def hover
|
22
|
+
@label.state = Gtk::StateType::SELECTED
|
23
|
+
end
|
24
|
+
|
25
|
+
def leave
|
26
|
+
@label.state = Gtk::StateType::NORMAL
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
class SettingsManager
|
33
|
+
include Observable
|
34
|
+
|
35
|
+
def initialize
|
36
|
+
Settings.read
|
37
|
+
bga = Settings.bg_color
|
38
|
+
@bg_color = Gdk::Color.new(bga[0], bga[1], bga[2])
|
39
|
+
tca = Settings.text_color
|
40
|
+
@text_color = Gdk::Color.new(tca[0], tca[1], tca[2])
|
41
|
+
@font_desc = Pango::FontDescription.new(Settings.font_desc)
|
42
|
+
init_ui
|
43
|
+
end
|
44
|
+
|
45
|
+
def init_ui
|
46
|
+
@win = Gtk::Window.new
|
47
|
+
@win.title = "gsWax Settings"
|
48
|
+
@win.icon = Gdk::Pixbuf.new File.join(DIR, '../static/gshoes-icon.png')
|
49
|
+
@win.set_size_request(400, 400)
|
50
|
+
@win.signal_connect("destroy"){
|
51
|
+
changed; notify_observers("SETTINGS_CLOSED")
|
52
|
+
}
|
53
|
+
nb = Gtk::Notebook.new
|
54
|
+
page1 = Gtk::VBox.new(false, 2)
|
55
|
+
|
56
|
+
mdir_frame = SettingsCell.new
|
57
|
+
mdir_frame.set("music library directory:", 0.95, nil, 50)
|
58
|
+
mdir_btn = Gtk::EventBox.new()
|
59
|
+
@mdir_text = Gtk::Label.new(Settings.music_dir)
|
60
|
+
@mdir_text.set_alignment(0.05, 0.3)
|
61
|
+
@mdir_text.set_wrap(true)
|
62
|
+
@mdir_text.justify = Gtk::JUSTIFY_LEFT
|
63
|
+
mdir_btn.add(@mdir_text)
|
64
|
+
mdir_btn.signal_connect("button_press_event"){music_dir_select}
|
65
|
+
mdir_btn.signal_connect("enter_notify_event"){mdir_frame.hover}
|
66
|
+
mdir_btn.signal_connect("leave_notify_event"){mdir_frame.leave}
|
67
|
+
mdir_frame.add(mdir_btn)
|
68
|
+
|
69
|
+
hbox1 = Gtk::HBox.new(false, 5)
|
70
|
+
hbox1.set_height_request(50)
|
71
|
+
scale_frame = SettingsCell.new
|
72
|
+
scale_frame.set("scale: [0.35 - 1.0]", 0.05, 193, nil)
|
73
|
+
scale_btn = Gtk::EventBox.new()
|
74
|
+
@scale_text = Gtk::Entry.new
|
75
|
+
@scale_text.text = Settings.scale.to_s
|
76
|
+
@scale_text.xalign = 0.95
|
77
|
+
@scale_text.signal_connect("enter_notify_event"){scale_frame.hover}
|
78
|
+
@scale_text.signal_connect("leave_notify_event"){scale_frame.leave}
|
79
|
+
scale_btn.add(@scale_text)
|
80
|
+
scale_frame.add(scale_btn)
|
81
|
+
|
82
|
+
bg_frame = SettingsCell.new
|
83
|
+
bg_frame.set("background color:", 0.95, nil, nil)
|
84
|
+
@bg_btn = Gtk::EventBox.new()
|
85
|
+
@bg_btn.modify_bg(Gtk::STATE_NORMAL, @bg_color)
|
86
|
+
@bg_btn.signal_connect("button_press_event"){bg_color_select}
|
87
|
+
@bg_btn.signal_connect("enter_notify_event"){bg_frame.hover}
|
88
|
+
@bg_btn.signal_connect("leave_notify_event"){bg_frame.leave}
|
89
|
+
bg_frame.add(@bg_btn)
|
90
|
+
hbox1.pack_start(scale_frame, false, false, 0)
|
91
|
+
hbox1.pack_start(bg_frame, true, true, 2)
|
92
|
+
|
93
|
+
hbox2 = Gtk::HBox.new(false, 5)
|
94
|
+
hbox2.set_height_request(50)
|
95
|
+
font_frame = SettingsCell.new
|
96
|
+
font_frame.set("text font:", 0.05, 193, nil)
|
97
|
+
font_btn = Gtk::EventBox.new()
|
98
|
+
@font_text = Gtk::Label.new(@font_desc)
|
99
|
+
@font_text.modify_font(@font_desc)
|
100
|
+
@font_text.xalign = 0.95
|
101
|
+
@font_text.justify = Gtk::JUSTIFY_RIGHT
|
102
|
+
font_btn.add(@font_text)
|
103
|
+
font_btn.signal_connect("button_press_event"){font_select}
|
104
|
+
font_btn.signal_connect("enter_notify_event"){font_frame.hover}
|
105
|
+
font_btn.signal_connect("leave_notify_event"){font_frame.leave}
|
106
|
+
font_frame.add(font_btn)
|
107
|
+
|
108
|
+
txtclr_frame = SettingsCell.new
|
109
|
+
txtclr_frame.set("text color:", 0.95, nil, nil)
|
110
|
+
@txtclr_btn = Gtk::EventBox.new()
|
111
|
+
@txtclr_btn.modify_bg(Gtk::STATE_NORMAL, @text_color)
|
112
|
+
@txtclr_btn.modify_fg(Gtk::STATE_SELECTED, @text_color)
|
113
|
+
@txtclr_btn.signal_connect("button_press_event"){text_color_select}
|
114
|
+
@txtclr_btn.signal_connect("enter_notify_event"){txtclr_frame.hover}
|
115
|
+
@txtclr_btn.signal_connect("leave_notify_event"){txtclr_frame.leave}
|
116
|
+
txtclr_frame.add(@txtclr_btn)
|
117
|
+
hbox2.pack_start(font_frame, false, false, 0)
|
118
|
+
hbox2.pack_start(txtclr_frame, true, true, 2)
|
119
|
+
|
120
|
+
format_frame = SettingsCell.new
|
121
|
+
format_frame.set("title format:", 0.05, nil, nil)
|
122
|
+
format_box = Gtk::EventBox.new
|
123
|
+
vbox = Gtk::VBox.new(false, 5)
|
124
|
+
|
125
|
+
valign = Gtk::Alignment.new(0.05, 0.15, 0, 0)
|
126
|
+
@format_text = Gtk::TextView.new
|
127
|
+
@format_text.set_size_request(390, 200)
|
128
|
+
@format_text.wrap_mode = Gtk::TextTag::WRAP_WORD
|
129
|
+
@format_text.justification = Gtk::JUSTIFY_LEFT
|
130
|
+
@format_text.editable = true
|
131
|
+
@format_text.cursor_visible = true
|
132
|
+
@format_text.pixels_above_lines = 5
|
133
|
+
@format_text.pixels_below_lines = 5
|
134
|
+
@format_text.pixels_inside_wrap = 5
|
135
|
+
@format_text.left_margin = 10
|
136
|
+
@format_text.right_margin = 10
|
137
|
+
@format_text.buffer.text = Settings.title_format
|
138
|
+
valign.add(@format_text)
|
139
|
+
|
140
|
+
halign = Gtk::Alignment.new(0.01, 0, 1, 0)
|
141
|
+
add_field = Gtk::ComboBox.new
|
142
|
+
fields = ["add field", "#track-number#", "#title#", "#album#",
|
143
|
+
"#artist#", "#album-artist#", "#genre#", "#comments#"
|
144
|
+
]
|
145
|
+
fields.each{|field| add_field.append_text(field)}
|
146
|
+
add_field.active = 0
|
147
|
+
add_field.signal_connect("changed"){
|
148
|
+
@format_text.buffer.insert(
|
149
|
+
@format_text.buffer.end_iter, add_field.active_iter[0]
|
150
|
+
)
|
151
|
+
}
|
152
|
+
halign.add(add_field)
|
153
|
+
|
154
|
+
vbox.pack_start(valign, true, true, 2)
|
155
|
+
vbox.pack_start(halign, false, false, 2)
|
156
|
+
format_box.add(vbox)
|
157
|
+
format_box.signal_connect("enter_notify_event"){format_frame.hover}
|
158
|
+
format_box.signal_connect("leave_notify_event"){format_frame.leave}
|
159
|
+
format_frame.add(format_box)
|
160
|
+
|
161
|
+
btn_box = Gtk::HBox.new(false, 2)
|
162
|
+
save_btn = Gtk::Button.new(" save settings ")
|
163
|
+
save_btn.signal_connect("clicked"){save_settings}
|
164
|
+
close_btn = Gtk::Button.new(" close ")
|
165
|
+
close_btn.signal_connect("clicked"){@win.destroy}
|
166
|
+
|
167
|
+
btn_box.pack_end(close_btn, false, false, 2)
|
168
|
+
btn_box.pack_end(save_btn, false, false, 2)
|
169
|
+
|
170
|
+
page1.pack_start(mdir_frame, false, false, 10)
|
171
|
+
page1.pack_start(hbox1, false, false, 2)
|
172
|
+
page1.pack_start(hbox2, false, false, 2)
|
173
|
+
page1.pack_start(format_frame, true, true, 12)
|
174
|
+
page1.pack_start(btn_box, false, false, 0)
|
175
|
+
|
176
|
+
page2 = Gtk::VBox.new(false, 2)
|
177
|
+
about_frame = Gtk::Frame.new()
|
178
|
+
about = "gsWax version 0.12.1\nhttps://github.com/lljk/shoeWax/tree/onGreenShoes"
|
179
|
+
about_text = Gtk::Label.new(about)
|
180
|
+
about_text.set_alignment(0.05, 0.5)
|
181
|
+
about_text.set_wrap(true)
|
182
|
+
about_text.justify = Gtk::JUSTIFY_CENTER
|
183
|
+
about_frame.add(about_text)
|
184
|
+
page2.pack_start(about_frame, true, true, 2)
|
185
|
+
|
186
|
+
label1 = Gtk::Label.new(" general ")
|
187
|
+
label2 = Gtk::Label.new(" about ")
|
188
|
+
|
189
|
+
nb.append_page(page1, label1)
|
190
|
+
nb.append_page(page2, label2)
|
191
|
+
@win.add(nb)
|
192
|
+
@win.show_all
|
193
|
+
end #init_ui
|
194
|
+
|
195
|
+
def music_dir_select
|
196
|
+
if Settings.music_dir
|
197
|
+
open_dir = Settings.music_dir if File.exists?(Settings.music_dir)
|
198
|
+
else
|
199
|
+
open_dir = Settings.brains_dir
|
200
|
+
end
|
201
|
+
dialog = Gtk::FileChooserDialog.new(
|
202
|
+
nil,nil,
|
203
|
+
Gtk::FileChooser::ACTION_SELECT_FOLDER,
|
204
|
+
nil,
|
205
|
+
["Cancel", Gtk::Dialog::RESPONSE_CANCEL],
|
206
|
+
["Select", Gtk::Dialog::RESPONSE_ACCEPT]
|
207
|
+
)
|
208
|
+
dialog.current_folder = (open_dir)
|
209
|
+
dialog.signal_connect("delete_event"){dialog.destroy}
|
210
|
+
if dialog.run == Gtk::Dialog::RESPONSE_ACCEPT
|
211
|
+
Settings.music_dir = dialog.filename
|
212
|
+
@mdir_text.text = Settings.music_dir
|
213
|
+
dialog.destroy
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
def bg_color_select
|
218
|
+
d = Gtk::ColorSelectionDialog.new
|
219
|
+
sel = d.colorsel
|
220
|
+
sel.set_previous_color(@bg_color)
|
221
|
+
sel.set_current_color(@bg_color)
|
222
|
+
sel.set_has_palette(true)
|
223
|
+
response = d.run
|
224
|
+
|
225
|
+
if response == Gtk::Dialog::RESPONSE_OK
|
226
|
+
bgR = sel.current_color.red
|
227
|
+
bgG = sel.current_color.green
|
228
|
+
bgB = sel.current_color.blue
|
229
|
+
Settings.bg_color = [bgR, bgG, bgB]
|
230
|
+
@bg_color = Gdk::Color.new(bgR, bgG, bgB)
|
231
|
+
@bg_btn.modify_bg(Gtk::STATE_NORMAL, @bg_color)
|
232
|
+
end
|
233
|
+
d.destroy
|
234
|
+
end
|
235
|
+
|
236
|
+
def text_color_select
|
237
|
+
d = Gtk::ColorSelectionDialog.new
|
238
|
+
sel = d.colorsel
|
239
|
+
sel.set_previous_color(@text_color)
|
240
|
+
sel.set_current_color(@text_color)
|
241
|
+
sel.set_has_palette(true)
|
242
|
+
response = d.run
|
243
|
+
|
244
|
+
if response == Gtk::Dialog::RESPONSE_OK
|
245
|
+
tR = sel.current_color.red
|
246
|
+
tG = sel.current_color.green
|
247
|
+
tB = sel.current_color.blue
|
248
|
+
Settings.text_color = [tR, tG, tB]
|
249
|
+
@text_color = Gdk::Color.new(tR, tG, tB)
|
250
|
+
@txtclr_btn.modify_bg(Gtk::STATE_NORMAL, @text_color)
|
251
|
+
end
|
252
|
+
d.destroy
|
253
|
+
end
|
254
|
+
|
255
|
+
def font_select
|
256
|
+
d = Gtk::FontSelectionDialog.new
|
257
|
+
d.set_font_name(Settings.font_desc)
|
258
|
+
response = d.run
|
259
|
+
|
260
|
+
if response == Gtk::Dialog::RESPONSE_OK
|
261
|
+
font = d.font_name
|
262
|
+
Settings.font_desc = font
|
263
|
+
@font_desc = Pango::FontDescription.new(font)
|
264
|
+
@font_text.text = font
|
265
|
+
@font_text.modify_font(@font_desc)
|
266
|
+
end
|
267
|
+
d.destroy
|
268
|
+
end
|
269
|
+
|
270
|
+
def save_settings
|
271
|
+
scale = @scale_text.text.to_f
|
272
|
+
scale = 0.35 if scale < 0.35; scale = 1.0 if scale > 1.0
|
273
|
+
Settings.scale = scale
|
274
|
+
Settings.title_format = @format_text.buffer.text
|
275
|
+
Settings.save
|
276
|
+
changed; notify_observers("UPDATE_SETTINGS")
|
277
|
+
@win.destroy
|
278
|
+
end
|
279
|
+
|
280
|
+
def close_window
|
281
|
+
@win.destroy
|
282
|
+
end
|
283
|
+
|
284
|
+
end #class SettingsManager
|
data/lib/gswax/shared.rb
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
this file is part of: gsWax v. 0.12.01
|
4
|
+
|
5
|
+
You should have received a copy of the GNU General Public License
|
6
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
7
|
+
=end
|
8
|
+
|
9
|
+
|
10
|
+
require 'yaml'
|
11
|
+
|
12
|
+
module Settings
|
13
|
+
|
14
|
+
def self.read
|
15
|
+
@brains_dir = File.join(File.dirname(File.expand_path(__FILE__)))
|
16
|
+
@settings_file = File.join(@brains_dir, "settings", "settings.yml")
|
17
|
+
if File.exists?(@settings_file)
|
18
|
+
@settings = begin
|
19
|
+
YAML.load(File.open(@settings_file))
|
20
|
+
rescue ArgumentError => e
|
21
|
+
puts "Unable to parse YAML: #{e.message}"
|
22
|
+
end
|
23
|
+
else
|
24
|
+
@settings = [
|
25
|
+
nil,
|
26
|
+
false,
|
27
|
+
nil,
|
28
|
+
"#title# - #artist# - #album#",
|
29
|
+
0.65,
|
30
|
+
"Impact 13",
|
31
|
+
[65000, 65000, 65000],
|
32
|
+
[0, 0, 0],
|
33
|
+
nil,
|
34
|
+
0.5,
|
35
|
+
[]
|
36
|
+
]
|
37
|
+
self.save
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.save
|
42
|
+
#unless File.exists?(@settings_file)
|
43
|
+
# Dir.mkdir(File.join(@brains_dir, "settings"), 0777)
|
44
|
+
# File.new(@settings_file, "w")
|
45
|
+
#end
|
46
|
+
File.open(@settings_file, "w"){|file|
|
47
|
+
file.write(@settings.to_yaml)
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.brains_dir
|
52
|
+
@brains_dir
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.settings
|
56
|
+
@settings
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.playlist_file
|
60
|
+
@settings[0]
|
61
|
+
end
|
62
|
+
def self.playlist_file= (file)
|
63
|
+
@settings[0] = file
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.shuffle
|
67
|
+
@settings[1]
|
68
|
+
end
|
69
|
+
def self.shuffle= (tof)
|
70
|
+
@settings[1] = tof
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.at_bat
|
74
|
+
@settings[2]
|
75
|
+
end
|
76
|
+
def self.at_bat= (atbat)
|
77
|
+
@settings[2] = atbat
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.title_format
|
81
|
+
@settings[3]
|
82
|
+
end
|
83
|
+
def self.title_format= (format)
|
84
|
+
@settings[3] = format
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.scale
|
88
|
+
@settings[4]
|
89
|
+
end
|
90
|
+
def self.scale= (int)
|
91
|
+
@settings[4] = int
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.font_desc
|
95
|
+
@settings[5]
|
96
|
+
end
|
97
|
+
def self.font_desc= (desc)
|
98
|
+
@settings[5] = desc
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.text_color
|
102
|
+
@settings[6]
|
103
|
+
end
|
104
|
+
def self.text_color= (rgb_array)
|
105
|
+
@settings[6] = rgb_array
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.bg_color
|
109
|
+
@settings[7]
|
110
|
+
end
|
111
|
+
def self.bg_color= (rgb_array)
|
112
|
+
@settings[7] = rgb_array
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.music_dir
|
116
|
+
@settings[8]
|
117
|
+
end
|
118
|
+
def self.music_dir= (dir)
|
119
|
+
@settings[8] = dir
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.volume
|
123
|
+
@settings[9]
|
124
|
+
end
|
125
|
+
def self.volume= (vol)
|
126
|
+
@settings[9] = vol
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.line_up
|
130
|
+
@settings[10]
|
131
|
+
end
|
132
|
+
def self.line_up= (line_up)
|
133
|
+
@settings[10] = line_up
|
134
|
+
end
|
135
|
+
|
136
|
+
end #Settings
|
137
|
+
|
138
|
+
|
139
|
+
class ImageButton < Gtk::EventBox
|
140
|
+
attr_accessor :image, :cold_pix, :hot_pix
|
141
|
+
|
142
|
+
def initialize
|
143
|
+
super
|
144
|
+
self.set_visible_window(false)
|
145
|
+
self.signal_connect("enter_notify_event"){enter_event}
|
146
|
+
self.signal_connect("leave_notify_event"){leave_event}
|
147
|
+
self.signal_connect("button_press_event"){yield if block_given?}
|
148
|
+
end
|
149
|
+
|
150
|
+
def set_images(img_file, hov_file, width, height= width)
|
151
|
+
self.remove(@image) if @image
|
152
|
+
@cold_pix = Gdk::Pixbuf.new(img_file, width, height)
|
153
|
+
@hot_pix = Gdk::Pixbuf.new(hov_file, width, height)
|
154
|
+
@image = Gtk::Image.new(@cold_pix)
|
155
|
+
self.add(@image)
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
def enter_event
|
160
|
+
@image.pixbuf = @hot_pix if @image
|
161
|
+
end
|
162
|
+
|
163
|
+
def leave_event
|
164
|
+
@image.pixbuf = @cold_pix if @image
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
class ListView
|
171
|
+
include Observable
|
172
|
+
attr_accessor :store, :list, :list_selection
|
173
|
+
|
174
|
+
def initialize
|
175
|
+
@store = Gtk::ListStore.new(String, String)
|
176
|
+
@list = Gtk::TreeView.new(@store)
|
177
|
+
@list.enable_search=(true)
|
178
|
+
@list.headers_visible=(false)
|
179
|
+
renderer = Gtk::CellRendererText.new
|
180
|
+
column = Gtk::TreeViewColumn.new("", renderer, :text => 0)
|
181
|
+
@list.append_column(column)
|
182
|
+
@list_selection = @list.selection
|
183
|
+
@list_selection.mode=(Gtk::SELECTION_MULTIPLE)
|
184
|
+
@list.signal_connect("row-activated"){|view, path, column|
|
185
|
+
emit_signal("row-activated", view, path, column)
|
186
|
+
}
|
187
|
+
@list_selection.signal_connect("changed"){|view, path, column|
|
188
|
+
emit_signal("changed", view, path, column)
|
189
|
+
}
|
190
|
+
end
|
191
|
+
|
192
|
+
def add_to_list(entry, position = "append")
|
193
|
+
if position == "append"
|
194
|
+
iter = @store.append
|
195
|
+
else
|
196
|
+
iter = @store.prepend
|
197
|
+
end
|
198
|
+
@store.set_value(iter, 0, File.basename(entry))
|
199
|
+
@store.set_value(iter, 1, entry)
|
200
|
+
end
|
201
|
+
|
202
|
+
def emit_signal(*args)
|
203
|
+
changed; notify_observers(*args)
|
204
|
+
end
|
205
|
+
|
206
|
+
end #ListView
|