package Geo::Vector::Layer::Dialogs::Rasterize; # @brief use strict; use warnings; use Carp; use Glib qw/TRUE FALSE/; use Gtk2::Ex::Geo::Dialogs qw/:all/; ## @method open_rasterize_dialog($gui) # @brief present a rasterize dialog for the user sub open { my($self, $gui) = @_; # bootstrap: my($dialog, $boot) = $self->bootstrap_dialog ($gui, 'rasterize_dialog', "Rasterize ".$self->name, { rasterize_dialog => [delete_event => \&cancel_rasterize, [$self, $gui]], rasterize_dialog => [delete_event => \&cancel_rasterize, [$self, $gui]], rasterize_cancel_button => [clicked => \&cancel_rasterize, [$self, $gui]], rasterize_ok_button => [clicked => \&apply_rasterize, [$self, $gui, 1]], }, [ 'rasterize_value_field_combobox', 'rasterize_like_combobox', ]); if ($boot) { Geo::Vector::Layer::Dialogs::fill_render_as_combobox( $dialog->get_widget('rasterize_render_as_combobox') ); my $combobox = $dialog->get_widget('rasterize_value_field_combobox'); my $model = $combobox->get_model(); $model->set ($model->append, 0, 'Draw with value 1'); if ($self->{OGR}->{Layer}) { my $schema = $self->{OGR}->{Layer}->GetLayerDefn(); for my $i (0..$schema->GetFieldCount-1) { my $column = $schema->GetFieldDefn($i); my $type = $column->GetFieldTypeName($column->GetType); if ($type eq 'Integer' or $type eq 'Real') { $model->set($model->append, 0, $column->GetName); } } } $combobox->set_active(0); $combobox = $dialog->get_widget('rasterize_like_combobox'); $model = $combobox->get_model(); $model->set($model->append, 0, "Use current view"); for my $layer (@{$gui->{overlay}->{layers}}) { next unless $layer->isa('Geo::Raster'); $model->set($model->append, 0, $layer->name); } $combobox->set_active(0); } $dialog->get_widget('rasterize_name_entry')->set_text('r'); $dialog->get_widget('rasterize_like_combobox')->set_active(0); my $a = $self->render_as; $a = defined $a ? $Geo::Vector::RENDER_AS{$a} : 0; $dialog->get_widget('rasterize_render_as_combobox')->set_active($a); $dialog->get_widget('rasterize_value_field_combobox')->set_active(0); $dialog->get_widget('rasterize_nodata_value_entry')->set_text(-9999); } ##@ignore sub apply_rasterize { my($self, $gui, $close) = @{$_[1]}; my $dialog = $self->{rasterize_dialog}; my %ret = (name => $dialog->get_widget('rasterize_name_entry')->get_text()); my $model = get_value_from_combo($dialog, 'rasterize_like_combobox'); if ($model eq "Use current view") { # need M (height), N (width), world ($ret{M}, $ret{N}) = $gui->{overlay}->size; $ret{world} = [$gui->{overlay}->get_viewport]; } else { $ret{like} = $gui->{overlay}->get_layer_by_name($model); } $ret{render_as} = get_value_from_combo($dialog, 'rasterize_render_as_combobox'); $ret{feature} = $dialog->get_widget('rasterize_fid_entry')->get_text; $ret{feature} = -1 unless $ret{feature} =~ /^\d+$/; my $field = get_value_from_combo($dialog, 'rasterize_value_field_combobox'); if ($field ne 'Draw with value 1') { $ret{value_field} = $field; } $ret{nodata_value} = $dialog->get_widget('rasterize_nodata_value_entry')->get_text(); my $g = $self->rasterize(%ret); if ($g) { $gui->add_layer($g, $ret{name}, 1); $gui->{overlay}->render; } $self->hide_dialog('rasterize_dialog') if $close; $gui->set_layer($self); $gui->{overlay}->render; } ##@ignore sub cancel_rasterize { my($self, $gui); for (@_) { next unless ref CORE::eq 'ARRAY'; ($self, $gui) = @{$_}; } $self->hide_dialog('rasterize_dialog'); $gui->set_layer($self); 1; } 1;