Class: Ampv::Playlist

Inherits:
Gtk::Window
  • Object
show all
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

Constructor Details

#initializePlaylist

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
  buttons = {
    [ 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"])
  set_skip_taskbar_hint(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.button == 3
      path = @treeview.get_path(e.x, e.y)[0]
      @treeview.set_cursor(path, nil, false) if path
      @menu.popup(nil, nil, e.button, 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.expand = 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))

  buttons.each { |k, v|
    button = Gtk::Button.new
    item   = Gtk::ImageMenuItem.new(k[1])

    button.image = Gtk::Image.new(k[0], Gtk::IconSize::BUTTON)
    button.height_request = 36
    button.set_tooltip_text(k[1])
    button.signal_connect("clicked") { v.call }

    item.image = Gtk::Image.new(k[0], Gtk::IconSize::MENU)
    item.signal_connect("activate") { v.call }

    hbox.pack_start(button)
    @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

#countObject



105
106
107
108
109
# File 'lib/ampv/playlist.rb', line 105

def count
  i = 0
  @model.each { i += 1 }
  i
end

#get_entriesObject



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_filesObject



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_nextObject



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_prevObject



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

Returns:

  • (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_watchedObject



120
121
122
123
# File 'lib/ampv/playlist.rb', line 120

def on_playing_watched
  @playing_iter[2] = WATCHED_PIXBUF
  @current_is_watched = true
end

#playing_stoppedObject



188
189
190
# File 'lib/ampv/playlist.rb', line 188

def playing_stopped
  @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