App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Gtk2/JobsRunningDialog.pm view on Meta::CPAN
use List::Util;
use Locale::TextDomain ('App-Chart');
use App::Chart::Database;
use Glib::Object::Subclass
'Gtk2::MessageDialog';
sub INIT_INSTANCE {
my ($self) = @_;
$self->set (message_type => 'question',
modal => 1,
title => __('Chart: Jobs Running Query'),
text => __('Job(s) still running, stop them ?'),
destroy_with_parent => 1);
$self->add_buttons ('gtk-ok' => 'ok',
'gtk-cancel' => 'close');
$self->signal_connect (response => \&_do_response);
require App::Chart::Gtk2::JobQueue;
my $model = Gtk2::TreeModelFilter->new (App::Chart::Gtk2::JobQueue->instance);
$model->set_visible_func
(sub {
my ($jobqueue, $iter) = @_;
return _job_is_queryable ($jobqueue->get($iter,0));
});
$model->get_iter_first || return;
my $vbox = $self->vbox;
my $treeview = Gtk2::TreeView->new_with_model ($model);
$treeview->set (headers_visible => 0);
$vbox->pack_start ($treeview, 0,0,0);
my $column = Gtk2::TreeViewColumn->new;
my $renderer = Gtk2::CellRendererText->new;
$renderer->set (xalign => 0,
ypad => 0);
$column->pack_start ($renderer, 1);
require App::Chart::Gtk2::DownloadDialog;
$column->set_cell_data_func
($renderer, \&App::Chart::Gtk2::DownloadDialog::_job_cell_status);
$treeview->append_column ($column);
$vbox->show_all;
}
sub _job_is_queryable {
my ($job) = @_;
return ($job->is_stoppable
&& ($job->isa('App::Chart::Gtk2::Job::Download')
# not a subclass at the moment ...
|| $job->get('name') eq __('Vacuum database')));
}
# 'response' signal handler
sub _do_response {
my ($self, $response) = @_;
if ($response eq 'ok') {
Gtk2::Ex::WidgetCursor->busy;
if (my $parent = $self->get_transient_for) {
$parent->destroy;
} else {
warn 'JobsRunningDialog: no parent to destroy';
}
$self->destroy;
} elsif ($response eq 'close') {
# as per a keyboard close, defaults to raising 'delete-event', which
# in turn defaults to a destroy
$self->signal_emit ('close');
}
}
sub popup {
my ($class, $parent) = @_;
# if "modal" is obeyed by the window manager then there won't be any other
# JobsRunningDialog's open, but it doesn't hurt to let dialog_popup search
require App::Chart::Gtk2::Ex::ToplevelBits;
return App::Chart::Gtk2::Ex::ToplevelBits::dialog_popup
(class => $class,
transient_for => $parent);
}
sub query_and_quit {
my ($class, $parent) = @_;
if (App::Chart::Gtk2::JobQueue->can('instance')
&& (List::Util::first {_job_is_queryable($_)}
App::Chart::Gtk2::JobQueue->all_jobs)) {
$class->popup ($parent);
} else {
$parent->destroy;
}
}
1;
__END__
=for stopwords ok Intraday
=head1 NAME
App::Chart::Gtk2::JobsRunningDialog -- query user about running jobs before quitting
=for test_synopsis my ($main_window)
=head1 SYNOPSIS
use App::Chart::Gtk2::JobsRunningDialog;
App::Chart::Gtk2::JobsRunningDialog->query_and_quit ($main_window);
=head1 WIDGET HIERARCHY
C<App::Chart::Gtk2::JobsRunningDialog> is a subclass of C<Gtk2::MessageDialog>.
Gtk2::Widget
Gtk2::Container
Gtk2::Bin
Gtk2::Window
( run in 0.795 second using v1.01-cache-2.11-cpan-483215c6ad5 )