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 )