Class: Ampv::Playlist
- Inherits:
-
Gtk::Window
- Object
- Gtk::Window
- Ampv::Playlist
- Defined in:
- lib/ampv/playlist.rb
Constant Summary collapse
- WATCHED_PIXBUF =
Gtk::Invisible.new.render_icon(Gtk::Stock::OK, Gtk::IconSize::MENU)
- PLAYING_PIXBUF =
Gtk::Invisible.new.render_icon(Gtk::Stock::MEDIA_PLAY, Gtk::IconSize::MENU)
Instance Method Summary collapse
- #add_file(file, length = nil, watched = false) ⇒ Object
- #clear(quiet = false) ⇒ Object
- #count ⇒ Object
- #get_entries ⇒ Object
- #get_files ⇒ Object
- #get_next ⇒ Object
- #get_prev ⇒ Object
- #include?(file) ⇒ Boolean
-
#initialize ⇒ Playlist
constructor
A new instance of Playlist.
- #on_playing_watched ⇒ Object
- #playing_stopped ⇒ Object
- #set_selected(file) ⇒ Object
- #update_length(length) ⇒ Object
- #update_title(title) ⇒ Object
Constructor Details
#initialize ⇒ Playlist
Returns a new instance of Playlist.
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/ampv/playlist.rb', line 12 def initialize = { [ Gtk::Stock::OPEN, "Add to Playlist" ] => lambda { signal_emit("open_file_chooser") }, [ Gtk::Stock::GO_UP, "Move Up" ] => lambda { move_selected_up }, [ Gtk::Stock::GO_DOWN, "Move Down" ] => lambda { move_selected_down }, [ Gtk::Stock::REMOVE, "Remove Selected" ] => lambda { remove_selected }, [ Gtk::Stock::CLEAR, "Clear Playlist" ] => lambda { clear } } super set_title("Playlist - #{PACKAGE}") set_default_size(Config["playlist_width"], Config["playlist_height"]) (true) move(Config["playlist_x"], Config["playlist_y"]) signal_connect("show") { move(@pos[0], @pos[1]) unless @pos.nil? } signal_connect("hide") { @pos = window.root_origin } signal_connect("delete_event") { hide_on_delete } signal_connect("key_press_event") { |_w, e| hide_on_delete if e.keyval == Gdk::Keyval::GDK_Escape } @titles = Hash.new vbox = Gtk::VBox.new(false, 10) sw = Gtk::ScrolledWindow.new @model = Gtk::ListStore.new(String, String, Gdk::Pixbuf) @treeview = Gtk::TreeView.new(@model) hbox = Gtk::HBox.new(true, 5) @menu = Gtk::Menu.new vbox.border_width = 10 sw.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC) @treeview.set_enable_search(false) @treeview.set_rubber_banding(true) @treeview.set_reorderable(true) @treeview.set_tooltip_column(0) @treeview.selection.set_mode(Gtk::SELECTION_MULTIPLE) @treeview.signal_connect("row_activated") { |w, p, c| signal_emit("play_entry", @model.get_iter(p)[0]) } @treeview.signal_connect("key_press_event") { |w, e| remove_selected if e.keyval == Gdk::Keyval::GDK_Delete } @treeview.signal_connect("button_press_event") { |w, e| if e.event_type == Gdk::Event::BUTTON_PRESS and e. == 3 path = @treeview.get_path(e.x, e.y)[0] @treeview.set_cursor(path, nil, false) if path @menu.popup(nil, nil, e., e.time) end } ["Name", "Length"].each_with_index { |x, i| renderer = Gtk::CellRendererText.new column = Gtk::TreeViewColumn.new(x, renderer, :text => i) if x == "Name" renderer.ellipsize = Pango::ELLIPSIZE_MIDDLE column. = true column.set_cell_data_func(renderer) { |t, c, m, j| if @titles[j[0]] c.text = @titles[j[0]] else c.text = File.basename(j[0]) end } end @treeview.append_column(column) } @treeview.append_column(Gtk::TreeViewColumn.new("", Gtk::CellRendererPixbuf.new, :pixbuf => 2)) .each { |k, v| = Gtk::Button.new item = Gtk::ImageMenuItem.new(k[1]) .image = Gtk::Image.new(k[0], Gtk::IconSize::BUTTON) .height_request = 36 .set_tooltip_text(k[1]) .signal_connect("clicked") { v.call } item.image = Gtk::Image.new(k[0], Gtk::IconSize::MENU) item.signal_connect("activate") { v.call } hbox.pack_start() @menu.append(item) } sw.add(@treeview) vbox.pack_start(sw) vbox.pack_start(hbox, false) add(vbox) @menu.show_all show_all if Config["playlist_visible"] end |
Instance Method Details
#add_file(file, length = nil, watched = false) ⇒ Object
116 117 118 119 120 121 122 123 |
# File 'lib/ampv/playlist.rb', line 116 def add_file(file, length = nil, watched = false) unless include?(file) iter = @model.append iter[0] = file iter[1] = length if length iter[2] = WATCHED_PIXBUF if watched end end |
#clear(quiet = false) ⇒ Object
168 169 170 171 172 173 |
# File 'lib/ampv/playlist.rb', line 168 def clear(quiet = false) @titles.clear @model.clear signal_emit("playing_removed") unless quiet or @playing_iter.nil? @playing_iter = nil end |
#count ⇒ Object
110 111 112 113 114 |
# File 'lib/ampv/playlist.rb', line 110 def count i = 0 @model.each { i += 1 } i end |
#get_entries ⇒ Object
150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/ampv/playlist.rb', line 150 def get_entries entries = [ ] @model.each { |m, p, iter| entries << { "file" => iter[0], "length" => iter[1] ? iter[1] : "", "watched" => iter[2] == WATCHED_PIXBUF || (iter == @playing_iter && @current_is_watched) } } entries end |
#get_files ⇒ Object
162 163 164 165 166 |
# File 'lib/ampv/playlist.rb', line 162 def get_files files = [ ] @model.each { |m, p, iter| files << iter[0] } files end |
#get_next ⇒ Object
135 136 137 138 139 140 |
# File 'lib/ampv/playlist.rb', line 135 def get_next @model.each { |m, p, iter| return iter.next! ? iter[0] : nil if iter == @playing_iter } nil end |
#get_prev ⇒ Object
142 143 144 145 146 147 148 |
# File 'lib/ampv/playlist.rb', line 142 def get_prev prev = nil @model.each { |m, p, iter| return prev if iter == @playing_iter prev = iter[0] } end |
#include?(file) ⇒ Boolean
130 131 132 133 |
# File 'lib/ampv/playlist.rb', line 130 def include?(file) @model.each { |m, p, iter| return true if iter[0] == file } false end |
#on_playing_watched ⇒ Object
125 126 127 128 |
# File 'lib/ampv/playlist.rb', line 125 def @playing_iter[2] = WATCHED_PIXBUF @current_is_watched = true end |
#playing_stopped ⇒ Object
194 195 196 |
# File 'lib/ampv/playlist.rb', line 194 def @playing_iter[2] = nil if @playing_iter and @playing_iter[2] == PLAYING_PIXBUF end |
#set_selected(file) ⇒ Object
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/ampv/playlist.rb', line 175 def set_selected(file) @playing = file i = 0 @model.each { |m, p, iter| if iter[0] == @playing # reset icon for previous playing entry if @playing_iter @playing_iter[2] = @current_is_watched ? WATCHED_PIXBUF : nil end @treeview.set_cursor(Gtk::TreePath.new(i), nil, false) @playing_iter = iter @current_is_watched = @playing_iter[2] == WATCHED_PIXBUF @playing_iter[2] = PLAYING_PIXBUF break end i += 1 } end |
#update_length(length) ⇒ Object
198 199 200 201 |
# File 'lib/ampv/playlist.rb', line 198 def update_length(length) return if length == 0 @playing_iter[1] = Time.at(length).utc.strftime("%H:%M:%S") if @playing_iter end |
#update_title(title) ⇒ Object
203 204 205 206 |
# File 'lib/ampv/playlist.rb', line 203 def update_title(title) return unless title @titles[@playing_iter[0]] = title end |