App-DrivePlayer
view release on metacpan or search on metacpan
lib/App/DrivePlayer/GUI.pm view on Meta::CPAN
return;
}
}
sub _navigate_sidebar_to {
my ($self, $kind, $value) = @_;
my $cat_label = $kind eq 'artist' ? 'Artists'
: $kind eq 'album' ? 'Albums'
: $kind eq 'genre' ? 'Genres'
: return;
my $store = $self->sidebar_store;
my $view = $self->sidebar_view;
# Locate the category header (top-level row whose label matches).
my $cat_iter = $store->get_iter_first() or return;
my $cat_path;
while (1) {
if (($store->get($cat_iter, 0) // '') eq $cat_label) {
$cat_path = $store->get_path($cat_iter);
last;
}
last unless $store->iter_next($cat_iter);
}
return unless $cat_path;
# Match against the raw value stored in column 2, not the display label
# in column 0 (which may carry LRM markers from _display_text/_album).
my $cat_iter2 = $store->get_iter($cat_path) or return;
my $n = $store->iter_n_children($cat_iter2);
for my $i (0 .. $n - 1) {
my $child = $store->iter_nth_child($cat_iter2, $i) or next;
my $stored = $store->get($child, 2);
next unless defined $stored && $stored eq $value;
my $path = $store->get_path($child);
$view->expand_to_path($path);
$view->set_cursor($path, undef, FALSE);
$view->scroll_to_cell($path, undef, TRUE, 0.5, 0.0);
return;
}
}
sub _update_alpha_category {
my ($self, $label) = @_;
my $enabled = defined $label
&& $label =~ / \A (?: Artists | Albums | Genres ) \z /x;
$self->_alpha_category($enabled ? $label : undef);
$self->alpha_view->set_sensitive($enabled ? TRUE : FALSE)
if $self->alpha_view;
}
sub _build_tracklist {
my ($self) = @_;
my $vbox = Gtk3::Box->new('vertical', 0);
my $sw = Gtk3::ScrolledWindow->new();
$sw->set_policy('automatic', 'automatic');
$sw->set_size_request(-1, 1);
$sw->set_propagate_natural_height(FALSE);
$sw->set_kinetic_scrolling(FALSE);
$sw->set_capture_button_press(FALSE);
$sw->set_overlay_scrolling(FALSE);
$vbox->pack_start($sw, TRUE, TRUE, 0);
my $count_lbl = Gtk3::Label->new('');
$count_lbl->set_xalign(1.0);
$count_lbl->set_margin_end(6);
$count_lbl->set_margin_top(2);
$count_lbl->set_margin_bottom(2);
$self->track_count_label($count_lbl);
$vbox->pack_start($count_lbl, FALSE, FALSE, 0);
# ListStore columns: id, track#, title, artist, album, genre, year, duration_str, drive_id
my $store = Gtk3::ListStore->new(
'Glib::Int', # 0 db id
'Glib::String', # 1 track#
'Glib::String', # 2 title
'Glib::String', # 3 artist
'Glib::String', # 4 album
'Glib::String', # 5 genre
'Glib::String', # 6 year
'Glib::String', # 7 duration
'Glib::String', # 8 drive_id
);
$self->track_store($store);
my $view = Gtk3::TreeView->new($store);
$view->set_headers_visible(TRUE);
$view->set_fixed_height_mode(TRUE);
$view->get_selection()->set_mode('multiple');
$view->signal_connect('row-activated' => sub { $self->_track_activated(@_) });
$self->track_view($view);
my @cols = (
['#', 1, 40],
['Title', 2, 220],
['Artist', 3, 160],
['Album', 4, 160],
['Genre', 5, 100],
['Year', 6, 60],
['Duration', 7, 65],
);
# Map: column-index â sidebar 'kind' for cells that act as navigation
# links to the corresponding sidebar category.
my %link_kind_by_col_idx = (3 => 'artist', 4 => 'album', 5 => 'genre');
my %link_kind; # TreeViewColumn ref â kind string
for my $col_def (@cols) {
my ($title, $idx, $width) = @$col_def;
my $r = Gtk3::CellRendererText->new();
my $c = Gtk3::TreeViewColumn->new_with_attributes($title, $r, text => $idx);
$c->set_resizable(TRUE);
$c->set_sort_column_id($idx);
$c->set_sizing('fixed');
$c->set_fixed_width($width);
$view->append_column($c);
$link_kind{$c} = $link_kind_by_col_idx{$idx}
if exists $link_kind_by_col_idx{$idx};
}
# Take full control of left-click so GTK's default handler (which
# calls set_cursor and auto-scrolls the clicked row into view) doesn't
# shift the viewport between the clicks of a double-click.
( run in 1.346 second using v1.01-cache-2.11-cpan-bbb979687b5 )