package Gtk2::Ex::Geo::Dialogs::Symbols;
# @brief
use strict;
use warnings;
use Carp;
use Glib qw/TRUE FALSE/;
## @method open_symbols_dialog($gui)
# @brief Open the symbols dialog for this layer.
sub open {
my($self, $gui) = @_;
my $dialog = $self->bootstrap_dialog
($gui, 'symbols_dialog', "Symbols for ".$self->name,
{
symbols_dialog => [delete_event => \&cancel_symbols, [$self, $gui]],
symbols_scale_button => [clicked => \&fill_symbol_scale_fields, [$self, $gui]],
symbols_field_combobox => [changed=>\&symbol_field_changed, [$self, $gui]],
symbols_type_combobox => [changed=>\&symbol_field_changed, [$self, $gui]],
symbols_apply_button => [clicked => \&apply_symbols, [$self, $gui, 0]],
symbols_cancel_button => [clicked => \&cancel_symbols, [$self, $gui]],
symbols_ok_button => [clicked => \&apply_symbols, [$self, $gui, 1]],
});
my $symbol_type_combo = $dialog->get_widget('symbols_type_combobox');
my $field_combo = $dialog->get_widget('symbols_field_combobox');
my $scale_min = $dialog->get_widget('symbols_scale_min_entry');
my $scale_max = $dialog->get_widget('symbols_scale_max_entry');
my $size_spin = $dialog->get_widget('symbols_size_spinbutton');
# back up data
my $symbol_type = $self->symbol_type();
my $size = $self->symbol_size();
my $field = $self->symbol_field();
my @scale = $self->symbol_scale();
$self->{backup}->{symbol_type} = $symbol_type;
$self->{backup}->{symbol_size} = $size;
$self->{backup}->{symbol_field} = $field;
$self->{backup}->{symbol_scale} = \@scale;
# set up the controllers
fill_symbol_type_combo($self, $symbol_type);
fill_symbol_field_combo($self, $field);
$scale_min->set_text($scale[0]);
$scale_max->set_text($scale[1]);
$size_spin->set_value($size);
return $self->{symbols_dialog}->get_widget('symbols_dialog');
}
##@ignore
sub apply_symbols {
my($self, $gui, $close) = @{$_[1]};
my $dialog = $self->{symbols_dialog};
my $symbol_type = get_selected_symbol_type($self);
$self->symbol_type($symbol_type);
my $field_combo = $dialog->get_widget('symbols_field_combobox');
my $field = $self->{index2symbol_field}{$field_combo->get_active()};
$self->symbol_field($field) if defined $field;
my $scale_min = $dialog->get_widget('symbols_scale_min_entry');
my $scale_max = $dialog->get_widget('symbols_scale_max_entry');
$self->symbol_scale($scale_min->get_text(), $scale_max->get_text());
my $size_spin = $dialog->get_widget('symbols_size_spinbutton');
my $size = $size_spin->get_value();
$self->symbol_size($size);
$self->hide_dialog('symbols_dialog') if $close;
$gui->set_layer($self);
$gui->{overlay}->render;
}
##@ignore
sub cancel_symbols {
my($self, $gui);
for (@_) {
next unless ref CORE::eq 'ARRAY';
($self, $gui) = @{$_};
}
$self->symbol_type($self->{backup}->{symbol_type});
$self->symbol_field($self->{backup}->{symbol_field}) if $self->{backup}->{symbol_field};
$self->symbol_scale(@{$self->{backup}->{symbol_scale}});
$self->symbol_size($self->{backup}->{symbol_size});
$self->hide_dialog('symbols_dialog');
$gui->set_layer($self);
$gui->{overlay}->render;
1;
}
##@ignore
sub fill_symbol_type_combo {
my($self, $symbol_type) = @_;
$symbol_type = '' unless defined $symbol_type;
my $combo = $self->{symbols_dialog}->get_widget('symbols_type_combobox');
my $model = $combo->get_model;
$model->clear;
my @symbol_types = $self->supported_symbol_types();
my $i = 0;
my $active = 0;
for (@symbol_types) {
$model->set ($model->append, 0, $_);
$self->{index2symbol_type}{$i} = $_;
$self->{symbol_type2index}{$_} = $i;
$active = $i if $_ eq $symbol_type;
$i++;
}
$combo->set_active($active);
}
##@ignore
sub get_selected_symbol_type {
my $self = shift;
my $combo = $self->{symbols_dialog}->get_widget('symbols_type_combobox');
($self->{index2symbol_type}{$combo->get_active()} or '');
}
##@ignore
sub fill_symbol_field_combo {
my($self, $symbol_field) = @_;
my $combo = $self->{symbols_dialog}->get_widget('symbols_field_combobox');
my $model = $combo->get_model;
$model->clear;
delete $self->{index2symbol_field};
my $active = 0;
my $i = 0;
my $name = 'Fixed size';
$model->set($model->append, 0, $name);
$active = $i if $name eq $self->symbol_field();
$self->{index2symbol_field}{$i} = $name;
$i++;
for my $field ($self->schema()->fields) {
next unless $field->{Type};
next unless $field->{Type} eq 'Integer' or $field->{Type} eq 'Real';
$model->set($model->append, 0, $field->{Name});
$active = $i if $field->{Name} eq $symbol_field;
$self->{index2symbol_field}{$i} = $field->{Name};
$i++;
}
$combo->set_active($active);
}
##@ignore
sub get_selected_symbol_field {
my $self = shift;
my $combo = $self->{symbols_dialog}->get_widget('symbols_field_combobox');
($self->{index2symbol_field}{$combo->get_active()} or '');
}
##@ignore
sub fill_symbol_scale_fields {
my($self, $gui) = @{$_[1]};
my @range;
my $field = get_selected_symbol_field($self);
return if $field eq 'Fixed size';
my @r = $gui->{overlay}->get_viewport_of_selection;
@r = $gui->{overlay}->get_viewport unless @r;
eval {
@range = $self->value_range(field_name => $field, filter_rect => \@r);
};
if ($@) {
$gui->message("$@");
return;
}
$self->{symbols_dialog}->get_widget('symbols_scale_min_entry')->set_text($range[0]);
$self->{symbols_dialog}->get_widget('symbols_scale_max_entry')->set_text($range[1]);
}
##@ignore
sub symbol_field_changed {
my($self, $gui) = @{$_[1]};
my $type = get_selected_symbol_type($self);
my $field = get_selected_symbol_field($self);
my $dialog = $self->{symbols_dialog};
if ($type eq 'No symbol') {
$dialog->get_widget('symbols_size_spinbutton')->set_sensitive(0);
$dialog->get_widget('symbols_field_combobox')->set_sensitive(0);
} else {
$dialog->get_widget('symbols_size_spinbutton')->set_sensitive(1);
$dialog->get_widget('symbols_field_combobox')->set_sensitive(1);
}
if (!$field or $field eq 'Fixed size') {
$dialog->get_widget('symbols_scale_min_entry')->set_sensitive(0);
$dialog->get_widget('symbols_scale_max_entry')->set_sensitive(0);
$dialog->get_widget('symbols_size_label')->set_text('Size: ');
} else {
$dialog->get_widget('symbols_scale_min_entry')->set_sensitive(1);
$dialog->get_widget('symbols_scale_max_entry')->set_sensitive(1);
$dialog->get_widget('symbols_size_label')->set_text('Maximum size: ');
}
}
1;