App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Gtk2/AnnDrag.pm view on Meta::CPAN
}
sub draw {
my ($want, $region) = @_;
if (DEBUG >= 2) { print " draw drawn=$drawn want=$want\n"; }
if ($drawn != $want) {
$edit_elem->draw ($graph, $region);
$drawn = $want;
}
}
sub move {
my ($x, $y) = @_;
if (! $active) { return; }
if (DEBUG) { print "AnnDrag move $x, $y\n"; }
my $t = $graph->x_to_date ($x);
my $price = $graph->y_to_value ($y);
my $scale_y = $graph->scale_y_proc;
if (DEBUG) {
print " $t, $price was ",$edit_elem->t,",",$edit_elem->price," (",
$graph->scale_y ($edit_elem->price),")\n";
}
# redraw only if changed
if ($edit_elem->t != $t
|| $scale_y->($edit_elem->price) != $scale_y->($price)) {
if (DEBUG >= 2) { print " redraw\n"; }
draw (0);
$edit_elem->t ($t);
$edit_elem->price ($price);
draw (1);
} else {
if (DEBUG >= 2) { print " no pixel position change\n"; }
# but store floating point price always
$edit_elem->price ($price);
}
}
sub _do_key_snooper {
my ($widget, $event) = @_;
# ignore key releases
$event->type eq 'key-press' or return Gtk2::EVENT_PROPAGATE;
# needing an actual self Gtk2::Object
# require Gtk2::Ex::BindingBits;
# Gtk2::Ex::BindingBits::activate_event
# if (App::Chart::Gtk2::GUI::bindings_activate_event ('App__Chart__Gtk2__AnnDrag_keys',
# $event, $self)) {
# return Gtk2::EVENT_STOP; # since handled
# }
my $keyval = $event->keyval;
my $modifiers = $event->state;
$modifiers = $modifiers & Gtk2::Accelerator->get_default_mod_mask;
my $key = lc (Gtk2::Gdk->keyval_name ($keyval));
if (DEBUG) { print "keypress $key\n"; }
if ($key eq 'escape') {
abort ();
} elsif ($key eq 'a') {
toggle_alert ();
} elsif ($key eq 'space') {
swap_ends ();
} elsif ($key eq 'd') {
delete_elem ();
} elsif ($key eq 'h') {
toggle_horizontal ();
} else {
# some key not for us
return Gtk2::EVENT_PROPAGATE;
}
# any of the handled keys
return Gtk2::EVENT_STOP;
}
sub toggle_alert {
goto &_do_toggle_alert;
}
sub _do_toggle_alert {
my ($self) = @_;
if ($edit_elem->isa('App::Chart::Annotation::Line')) {
if ($edit_elem->{'id'}) {
$graph->error_bell;
return;
}
draw (0);
$edit_elem = App::Chart::Annotation::Alert->new
(symbol => $edit_elem->{'symbol'},
price => $edit_elem->{'price1'},
above => 1);
} else {
draw (0);
$edit_elem->{'above'} = ($edit_elem->{'above'} ? 0 : 1);
}
draw (1);
}
sub toggle_horizontal {
goto &_do_toggle_horizontal;
}
sub _do_toggle_horizontal {
my ($self) = @_;
draw (0);
$edit_elem->{'horizontal'} = ($edit_elem->{'horizontal'} ? 0 : 1);
draw (1);
}
sub swap_ends {
goto &_do_swap_ends;
}
sub _do_swap_ends {
( run in 1.211 second using v1.01-cache-2.11-cpan-39bf76dae61 )