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 )