App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Gtk2/IntradayDialog.pm view on Meta::CPAN
sub popup {
my ($class, $symbol, $parent) = @_;
if (! defined $symbol) { $symbol = ''; }
require App::Chart::Gtk2::Ex::ToplevelBits;
return App::Chart::Gtk2::Ex::ToplevelBits::popup
($class,
properties => { symbol => $symbol },
screen => $parent);
}
#------------------------------------------------------------------------------
# printing
sub print_image {
my ($self) = @_;
my $print = Gtk2::PrintOperation->new;
$print->set_n_pages (1);
if (my $settings = $self->{'print_settings'}) {
$print->set_print_settings ($settings);
}
$print->signal_connect (draw_page => \&_draw_page,
App::Chart::Glib::Ex::MoreUtils::ref_weak($self));
my $result = $print->run ('print-dialog', $self);
if ($result eq 'apply') {
$self->{'print_settings'} = $print->get_print_settings;
}
}
sub _draw_page {
my ($print, $pcontext, $pagenum, $ref_weak_self) = @_;
### _draw_page()
my $self = $$ref_weak_self || return;
my $c = $pcontext->get_cairo_context;
my $symbol = $self->{'symbol'};
my $mode = $self->{'mode'};
my $handler = App::Chart::IntradayHandler->handler_for_symbol_and_mode
($symbol, $mode);
my $modename = ($handler ? $handler->name_sans_mnemonic : '');
my $str = "$symbol - $mode";
my $dbh = App::Chart::DBI->instance;
my $sth = $dbh->prepare_cached
('SELECT image, error, fetch_timestamp FROM intraday_image WHERE symbol=? AND mode=?');
my ($blob, $error, $timestamp) = $dbh->selectrow_array
($sth, undef, $self->{'symbol'}, $self->{'mode'});
$sth->finish();
if (defined $timestamp) {
my $timet = App::Chart::Download::timestamp_to_timet($timestamp);
my $timezone = App::Chart::TZ->for_symbol ($symbol);
$str .= ' ' . POSIX::strftime ($App::Chart::option{'d_fmt'} . ' %H:%M',
$timezone->localtime($timet));
}
$str .= "\n\n"; # blank line
my $pixbuf = $self->{'image'}->_load_pixbuf;
# $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file
# ('/usr/share/emacs/23.2/etc/images/splash.png');
# $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file
# ('/usr/share/games/gav/themes/classic/background_big.png');
if (! ref $pixbuf) {
$str .= $pixbuf; # error message
}
my $pwidth = $pcontext->get_width;
### $pwidth
my $layout = $pcontext->create_pango_layout;
$layout->set_width ($pwidth * Gtk2::Pango::PANGO_SCALE);
$layout->set_text ($str);
my (undef, $str_height) = $layout->get_pixel_size;
### $str_height
$c->move_to (0, 0);
Gtk2::Pango::Cairo::show_layout ($c, $layout);
if (ref $pixbuf) {
my $pixbuf_width = $pixbuf->get_width;
my $pixbuf_height = $pixbuf->get_height;
### $pixbuf_width
### $pixbuf_height
my $pheight = $pcontext->get_height - $str_height;
$c->translate (0, $str_height);
if ($pixbuf_width > $pwidth || $pixbuf_height > $pheight) {
# shrink if too big
my $factor = min ($pwidth / $pixbuf_width,
$pheight / $pixbuf_height);
$c->scale ($factor, $factor);
}
Gtk2::Gdk::Cairo::Context::set_source_pixbuf ($c, $pixbuf, 0,0);
$c->rectangle (0,0, $pixbuf_width,$pixbuf_height);
$c->paint;
}
}
1;
__END__
=for stopwords intraday
=head1 NAME
App::Chart::Gtk2::IntradayDialog -- intraday graph dialog widget
=head1 SYNOPSIS
use App::Chart::Gtk2::IntradayDialog;
App::Chart::Gtk2::IntradayDialog->popup; # initially empty
App::Chart::Gtk2::IntradayDialog->popup ('BHP.AX'); # or given symbol
=head1 WIDGET HIERARCHY
C<App::Chart::Gtk2::IntradayDialog> is a subclass of C<Gtk2::Dialog>.
Gtk2::Widget
Gtk2::Container
Gtk2::Bin
Gtk2::Window
( run in 0.627 second using v1.01-cache-2.11-cpan-0d23b851a93 )