Method: Sh::Browse#initialize

Defined in:
lib/sh_browse.rb

#initialize(view) ⇒ Browse

Returns a new instance of Browse.



5
6
7
8
9
10
11
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/sh_browse.rb', line 5

def initialize view
	Sh::Log.warning 'Instance of Browse already created!' if @@instance
	@@instance = self
  @tree = TreeView.new
  @tree.selection.mode = Gtk::SELECTION_MULTIPLE

  ren_artist = CellRendererText.new
  col_artist = TreeViewColumn.new('Songs', ren_artist)
  col_artist.set_cell_data_func(ren_artist) do |tvc, cell, model, iter|
    cell.text = ''
    data = iter[0]
    if data.is_a? Sh::Song
      if data.title
        cell.text = "%.2d\t%s" % [data.track_num, data.title]
      else
        cell.text = File.basename(data.path)
      end
    else
      cell.text = data.to_s
    end
  end
  @tree.append_column col_artist

  @model = TreeStore.new(Object, Array)
  @model.set_default_sort_func do |a, b|
    oa, ob = a[0], b[0]
    oa.to_s <=> ob.to_s
  end
  @model.set_sort_column_id(TreeSortable::DEFAULT_SORT_COLUMN_ID,
    Gtk::SORT_ASCENDING)
  @tree.model = @model

  GLib::Timeout.add(1000) do
    fill_model
    false
  end

  @tree.signal_connect('button-press-event') do |widget, event|
    # Right-click
    if event.button == 3
      path = @tree.get_path_at_pos(event.x, event.y).first
      data = @model.get_iter(path)[0]
      selection = @tree.selection
      selected_rows = selection.selected_rows
      clicked_in_selection = false
      selected_rows.each do |sel|
        clicked_in_selection = sel.indices == path.indices
        break if clicked_in_selection
      end

      unless clicked_in_selection
        # Change the selection
        selection.unselect_all
        selection.select_path(path)
        selected_rows = selection.selected_rows
      end

      #puts selected_rows

      if data.is_a? Sh::Song
        song = data
        menu = Menu.new
        
        Actions.get(:song).each do |action|
       	pbtn = nil
       	if action[:stock_image]
       		pbtn = ImageMenuItem.new(action.name)
       		pbtn.image = Image.new(action[:stock_image], IconSize::MENU)
       	else
         	pbtn = MenuItem.new(action.name)
         end
       	menu.append pbtn
			if action.tags.include? :playlist
				pmnu = Gtk::Menu.new
				Sh::Playlists.load_playlists.each do |playlist|
        	pbtn_playlist = Gtk::MenuItem.new playlist.name
        	pbtn_playlist.signal_connect('activate') do |widget|
        		action.execute song, playlist
        	end
        	pmnu.append pbtn_playlist
        end
        pbtn.submenu = pmnu
			else
       	pbtn.signal_connect('activate') do |widget|
       		action.execute song
       	end
       end
        end
        
        menu.show_all
        menu.popup(nil, nil, event.button, event.time)
      end
    end
  end
  @tree.signal_connect('row_activated') do |widget, path, col|
    iter = @tree.model.get_iter(path)
    parent = iter.parent
    if iter[0].is_a? Song
      view.stop
      queue = []
      while iter.parent == parent
        queue << iter[0]
        iter.next!
      end
      prev = []
      iter = parent.first_child
      until iter.path.indices == path.indices
        prev << iter[0]
        iter.next!
      end
      queue.insert 0, *prev
      view.queue = queue
      view.queue_pos = prev.size
      view.play
    elsif not iter[1].empty?
      view.stop
      view.queue = iter[1].dup
      view.play
    end
  end

  @scroll = ScrolledWindow.new(nil, nil)
  @scroll.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC)
  @scroll.add @tree
end