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
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 |
# 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 } 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| c.text = File.basename(m.get_value(j, 0)) unless m.get_value(j, 0).nil? } 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
111 112 113 114 115 116 117 118 |
# File 'lib/ampv/playlist.rb', line 111 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
163 164 165 166 167 |
# File 'lib/ampv/playlist.rb', line 163 def clear(quiet = false) @model.clear signal_emit("playing_removed") unless quiet or @playing_iter.nil? @playing_iter = nil end |
#count ⇒ Object
105 106 107 108 109 |
# File 'lib/ampv/playlist.rb', line 105 def count i = 0 @model.each { i += 1 } i end |
#get_entries ⇒ Object
145 146 147 148 149 150 151 152 153 154 155 |
# File 'lib/ampv/playlist.rb', line 145 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
157 158 159 160 161 |
# File 'lib/ampv/playlist.rb', line 157 def get_files files = [ ] @model.each { |m, p, iter| files << iter[0] } files end |
#get_next ⇒ Object
130 131 132 133 134 135 |
# File 'lib/ampv/playlist.rb', line 130 def get_next @model.each { |m, p, iter| return iter.next! ? iter[0] : nil if iter == @playing_iter } nil end |
#get_prev ⇒ Object
137 138 139 140 141 142 143 |
# File 'lib/ampv/playlist.rb', line 137 def get_prev prev = nil @model.each { |m, p, iter| return prev if iter == @playing_iter prev = iter[0] } end |
#include?(file) ⇒ Boolean
125 126 127 128 |
# File 'lib/ampv/playlist.rb', line 125 def include?(file) @model.each { |m, p, iter| return true if iter[0] == file } false end |
#on_playing_watched ⇒ Object
120 121 122 123 |
# File 'lib/ampv/playlist.rb', line 120 def @playing_iter[2] = WATCHED_PIXBUF @current_is_watched = true end |
#playing_stopped ⇒ Object
188 189 190 |
# File 'lib/ampv/playlist.rb', line 188 def @playing_iter[2] = nil if @playing_iter and @playing_iter[2] == PLAYING_PIXBUF end |
#set_selected(file) ⇒ Object
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/ampv/playlist.rb', line 169 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
192 193 194 195 |
# File 'lib/ampv/playlist.rb', line 192 def update_length(length) return if length == 0 @playing_iter[1] = Time.at(length).utc.strftime("%H:%M:%S") if @playing_iter end |