App-DrivePlayer
view release on metacpan or search on metacpan
lib/App/DrivePlayer/GUI.pm view on Meta::CPAN
$fp_frame->add($fp_grid);
$vbox->pack_start($fp_frame, FALSE, FALSE, 0);
# fpcalc status row
my $fp_lbl = Gtk3::Label->new('fpcalc:');
$fp_lbl->set_xalign(1.0);
$fp_grid->attach($fp_lbl, 0, 0, 1, 1);
my $fp_status = Gtk3::Label->new();
$fp_status->set_xalign(0.0);
my $install_btn = Gtk3::Button->new_with_label('Installâ¦');
$install_btn->set_tooltip_text(
'Installs libchromaprint-tools via apt (requires administrator password)'
);
my $fp_hbox = Gtk3::Box->new('horizontal', 8);
$fp_hbox->pack_start($fp_status, FALSE, FALSE, 0);
$fp_hbox->pack_start($install_btn, FALSE, FALSE, 0);
$fp_grid->attach($fp_hbox, 1, 0, 1, 1);
# Helper: refresh the fpcalc status label
my $refresh_fp_status = sub {
if (App::DrivePlayer::MetadataFetcher::fpcalc_available()) {
$fp_status->set_markup('<span foreground="#2d862d"><b>Installed</b></span>');
$install_btn->hide();
}
else {
$fp_status->set_markup(
'<span foreground="#cc0000">Not installed</span>'
. ' <span size="small" foreground="#666666">'
. '(needed for fingerprint-based lookup)</span>'
);
$install_btn->show();
}
};
$refresh_fp_status->();
$install_btn->signal_connect(clicked => sub {
$install_btn->set_sensitive(FALSE);
$fp_status->set_markup('<span foreground="#666666">Installingâ¦</span>');
Gtk3::main_iteration_do(FALSE) while Gtk3::events_pending();
my $pid = fork();
if (!defined $pid) {
$fp_status->set_markup('<span foreground="#cc0000">Fork failed</span>');
$install_btn->set_sensitive(TRUE);
return;
}
if ($pid == 0) {
exec('pkexec', 'apt-get', 'install', '-y', 'libchromaprint-tools')
or POSIX::_exit(1);
}
# Poll every 500 ms until the child exits
Glib::Timeout->add(500, sub {
my $res = waitpid($pid, WNOHANG());
if ($res == $pid) {
$refresh_fp_status->();
$install_btn->set_sensitive(TRUE);
return FALSE; # remove timer
}
return TRUE; # keep polling
});
});
# AcoustID API key
my $aid_lbl = Gtk3::Label->new('AcoustID API Key:');
$aid_lbl->set_xalign(1.0);
$fp_grid->attach($aid_lbl, 0, 1, 1, 1);
my $aid_entry = Gtk3::Entry->new();
$aid_entry->set_hexpand(TRUE);
$aid_entry->set_text($self->config->acoustid_key());
$aid_entry->set_placeholder_text('Get a free key at acoustid.org');
$aid_entry->set_tooltip_text(
'Free AcoustID API key â used with fpcalc to look up missing tags '
. 'by acoustic fingerprint.'
);
$aid_lbl->set_tooltip_text($aid_entry->get_tooltip_text());
$fp_grid->attach($aid_entry, 1, 1, 1, 1);
$fp_lbl->set_tooltip_text(
'fpcalc (from chromaprint) generates audio fingerprints for '
. 'acoustic-ID lookup. Install it via apt if missing.'
);
my $aid_note = Gtk3::Label->new();
$aid_note->set_markup(
'<span size="small" foreground="#555555">'
. 'Register a free application at '
. '<a href="https://acoustid.org/new-application">acoustid.org</a> '
. 'to obtain a key. '
. '<a href="https://acoustid.org/">More info</a>.'
. '</span>'
);
$aid_note->set_xalign(0.0);
$aid_note->set_line_wrap(TRUE);
$aid_note->set_max_width_chars(60);
$fp_grid->attach($aid_note, 1, 2, 1, 1);
# ---- Config file path (informational) ----
my $info_grid = Gtk3::Grid->new();
$info_grid->set_row_spacing(4);
$info_grid->set_column_spacing(8);
$info_grid->set_border_width(8);
$vbox->pack_start($info_grid, FALSE, FALSE, 0);
my $cfg_key = Gtk3::Label->new('Config file:');
$cfg_key->set_xalign(1.0);
$info_grid->attach($cfg_key, 0, 0, 1, 1);
my $cfg_lbl = Gtk3::Label->new($self->config->config_file());
$cfg_lbl->set_xalign(0.0);
$cfg_lbl->set_selectable(TRUE);
$info_grid->attach($cfg_lbl, 1, 0, 1, 1);
$dlg->show_all();
# Re-apply visibility after show_all (show_all overrides hide())
$refresh_fp_status->();
my $response = $dlg->run();
( run in 1.093 second using v1.01-cache-2.11-cpan-817d5f8af8b )