Gtk2-Ex-Geo
view release on metacpan or search on metacpan
lib/Gtk2/Ex/Geo/Glue.pm.in view on Meta::CPAN
}
}
CORE::close TMP;
} else {
carp("$!: $filename (it will be created at exit)");
}
}
return (\%resources, $filename);
}
## @method register_dialogs($dialogs)
# @brief Extend the capabilities by adding new dialogs
sub register_dialogs {
my($self, $dialogs) = @_;
croak "$dialogs is not a DialogMaster" unless $dialogs->isa('Gtk2::Ex::Geo::DialogMaster');
push @{$self->{dialogs}}, $dialogs;
}
sub register_command {
my($self, %args) = @_;
if (!$args{icon_widget} and $Config::Config{'osname'} ne 'MSWin32') {
$args{icon_widget} = Gtk2::Label->new($args{label});
}
my $button;
if ($args{stock_id}) {
$button = Gtk2::ToolButton->new_from_stock($args{stock_id});
} else {
$button = Gtk2::ToolButton->new($args{icon_widget}, $args{label});
}
$button->set_icon_name($args{icon_name}) if $args{icon_name};
$button->set_label_widget($args{label_widget}) if $args{label_widget};
my $tooltips = Gtk2::Tooltips->new;
$args{tip} = $args{tip} || '';
$button->set_tooltip($tooltips, $args{tip}, '');
$tooltips->set_tip($button, $args{tip});
$tooltips->enable;
$args{pos} = -1 unless defined $args{pos};
$self->{toolbar}->insert($button, $args{pos});
$button->signal_connect('clicked', $args{sub}, $self);
$self->{buttons}{$args{tag}} = $button;
$self->{commands}{$args{tag}} = $args{sub};
$button->show_all;
}
sub unregister_command {
my($self, $tag) = @_;
$self->{toolbar}->remove($self->{buttons}{$tag}) if $self->{buttons}{$tag};
delete $self->{buttons}{$tag};
delete $self->{commands}{$tag};
}
## @method register_commands($commands)
# @brief Extend the capabilities by adding new commands
sub register_commands {
my($self, $commands) = @_;
unless (ref $commands->[0]) {
my @commands;
while (ref $commands->[$#$commands]) {
push @commands, pop @$commands;
}
my $menu = Gtk2::Menu->new;
for my $command (reverse @commands) {
my $name = $command->{label};
my $item;
#$item = Gtk2::SeparatorMenuItem->new();
$item = Gtk2::MenuItem->new_with_label($name);
$item->signal_connect(activate => $command->{sub}, $self);
$menu->append($item);
}
my %args = @$commands;
if (!$args{icon_widget} and $Config::Config{'osname'} ne 'MSWin32') {
$args{icon_widget} = Gtk2::Label->new($args{label});
}
my $button;
if ($args{stock_id}) {
$button = Gtk2::ToolButton->new_from_stock($args{stock_id});
} else {
$button = Gtk2::ToolButton->new($args{icon_widget}, $args{label});
}
$button->set_icon_name($args{icon_name}) if $args{icon_name};
$button->set_label_widget($args{label_widget}) if $args{label_widget};
my $tooltips = Gtk2::Tooltips->new;
$args{tip} = $args{tip} || '';
$button->set_tooltip($tooltips, $args{tip}, '');
$tooltips->set_tip($button, $args{tip});
$tooltips->enable;
$args{pos} = -1 unless defined $args{pos};
#$button->set_menu($menu);
$button->show_all;
$menu->show_all;
$button->signal_connect(clicked => sub {
$menu->popup(undef, undef, undef, undef, 0, 0);
});
$self->{toolbar}->insert($button, $args{pos});
} else {
for my $command (@$commands) {
$self->register_command(%$command);
}
}
}
sub run_command {
my($self, $command) = @_;
$self->{commands}{$command}->(undef, $self);
}
## @method object register_function(%params)
# @brief Extend the capabilities by adding a new function
sub register_function {
my($self, %params) = @_;
$self->{functions}{$params{name}} = \%params;
}
## @method register_class(%params)
# @brief Extend the capabilities
#
# @param params named parameters:
# - <i>class</i> [optional] the name of the layer class. If this is
# given, dialogs and commands are retrieved from the class with method
# Gtk2::Ex::Geo::Layer::registration
# - <i>dialogs</i> [optional] an object containing dialogs (a dialog master object)
# - <i>commands</i> [optional] an anonymous hash of commands for the GUI
# A command is defined in an anonymous hash with parameters:
# - <i>nr</i> a visual order of the commands
lib/Gtk2/Ex/Geo/Glue.pm.in view on Meta::CPAN
my $hide = $layer->visible() ? '_Hide' : '_Show';
my @items = @layers ?
( '_Hide' => sub {
my($layers, $self) = @{$_[1]};
for my $layer (@$layers) {
$layer->visible(0);
}
$self->update;
$self->{overlay}->render;
},
'_Show' => sub {
my($layers, $self) = @{$_[1]};
for my $layer (@$layers) {
$layer->visible(1);
}
$self->update;
$self->{overlay}->render;
},
'_Remove' => sub {
my($layers, $self) = @{$_[1]};
for my $layer (@$layers) {
$self->{model}->remove($layer->{_tree_index});
$self->{overlay}->remove_layer_by_name($layer->name);
}
$self->{overlay}->render;
}
)
:
(
'_Zoom to' => sub {
my($layer, $self) = @{$_[1]};
$self->{overlay}->zoom_to($layer);
},
'_Up' => sub {
my($layer, $self) = @{$_[1]};
$self->move_up();
},
'_Down' => sub {
my($layer, $self) = @{$_[1]};
$self->move_down();
},
$hide => sub {
my($layer, $self) = @{$_[1]};
$layer->visible(!$layer->visible());
$self->update;
$self->{overlay}->render;
},
'_Remove' => sub {
my($layer, $self) = @{$_[1]};
$self->delete_selected();
}
);
# add items from the layer classes
unless (@layers) {
push @items, ( 1 => 0 );
push @items, $layer->menu_items();
}
my $menu = Gtk2::Menu->new;
my $params = @layers ? [\@layers, $self] : [$layer, $self];
$i = 0;
for (my $i =0; $i < @items; $i+=2) {
my $item;
unless ($items[$i+1]) {
$item = Gtk2::SeparatorMenuItem->new();
} else {
$item = Gtk2::MenuItem->new($items[$i]);
$item->signal_connect(activate => $items[$i+1], $params);
}
$item->show;
$menu->append($item);
}
$menu->popup(undef, undef, undef, undef, $event->button, $event->time);
return 1;
} elsif ($column =~ /^v/) {
$layer->visible(!$layer->visible());
$self->update;
$self->{overlay}->render;
} elsif ($column =~ /^t/) {
$tree_view->columns_autosize();
}
return 0;
}
## @ignore
sub show_information {
my($overlay, $self) = @_;
my($x, $y) = $overlay->event_pixel2point;
my $layer = $self->get_selected_layer();
my $location = sprintf("(x,y) = (%.4f, %.4f)", $x, $y);
my $value = '';
if ($layer and $layer->isa('Geo::Raster')) {
my @ij = $layer->w2g($x, $y);
$location .= sprintf(", (i,j) = (%i, %i)",@ij);
$value = $layer->point($x, $y);
if (defined $value and $value ne 'nodata' and $layer->{INFO}) {
$value = $layer->{TABLE}->{DATA}->[$value]->[$layer->{INFO}-1];
}
}
$self->{statusbar}->pop(0);
$value = '' unless defined $value;
# additional info, based on mode
my($dim, $val) = $self->{overlay}->rubberband_value();
if (defined $dim) {
$dim = $dim == 1 ? 'length' : 'area';
if (defined $val) {
my $d = '';
if ($val > 1000000) {
$val /= 1000000;
$d = 'M';
} elsif ($val > 1000) {
$val /= 1000;
$d = 'k';
}
$val = sprintf(" $dim = %.2f$d", $val);
} else {
( run in 4.456 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )