package Gtk2::Ex::Geo::Dialogs::Labeling;
# @brief
use strict;
use warnings;
use Carp;
use Glib qw/TRUE FALSE/;
# labels dialog
sub open {
my($self, $gui) = @_;
my $dialog = $self->bootstrap_dialog
($gui, 'labels_dialog', "Labels for ".$self->name,
{
labels_dialog => [delete_event => \&cancel_labels, [$self, $gui]],
labels_font_button => [clicked => \&labels_font, [$self, $gui, 0]],
labels_color_button => [clicked => \&labels_color, [$self, $gui, 0]],
apply_labels_button => [clicked => \&apply_labels, [$self, $gui, 0]],
cancel_labels_button => [clicked => \&cancel_labels, [$self, $gui]],
ok_labels_button => [clicked => \&apply_labels, [$self, $gui, 1]],
});
# backup
my $labeling = $self->{backup}->{labeling} = $self->labeling;
# set up controllers
my $schema = $self->schema;
my $combo = $dialog->get_widget('labels_field_combobox');
my $model = $combo->get_model;
$model->clear;
my $i = 0;
my $active = 0;
$model->set ($model->append, 0, 'No Labels');
$active = $i if $labeling->{field} eq 'No Labels';
$i++;
for my $fname ($schema->field_names) {
$model->set ($model->append, 0, $fname);
$active = $i if $labeling->{field} eq $fname;
$i++;
}
$combo->set_active($active);
$combo = $dialog->get_widget('labels_placement_combobox');
$model = $combo->get_model;
$model->clear;
$i = 0;
$active = 0;
my $h = \%Gtk2::Ex::Geo::Layer::LABEL_PLACEMENT;
for my $e (sort {$h->{$a} <=> $h->{$b}} keys %$h) {
$model->set ($model->append, 0, $e);
$active = $i if $labeling->{placement} eq $e;
$i++;
}
$combo->set_active($active);
$dialog->get_widget('labels_font_label')->set_text($labeling->{font});
$dialog->get_widget('labels_color_label')->set_text("@{$labeling->{color}}");
$dialog->get_widget('labels_min_size_entry')->set_text($labeling->{min_size});
$dialog->get_widget('labels_incremental_checkbutton')->set_active($labeling->{incremental});
return $dialog->get_widget('labels_dialog');
}
##@ignore
sub apply_labels {
my($self, $gui, $close) = @{$_[1]};
my $dialog = $self->{labels_dialog};
my $labeling = {};
my $combo = $dialog->get_widget('labels_field_combobox');
my $model = $combo->get_model;
my $iter = $model->get_iter_from_string($combo->get_active());
$labeling->{field} = $model->get_value($iter);
$combo = $dialog->get_widget('labels_placement_combobox');
$model = $combo->get_model;
$iter = $model->get_iter_from_string($combo->get_active());
$labeling->{placement} = $model->get_value($iter);
$labeling->{min_size} = $dialog->get_widget('labels_min_size_entry')->get_text;
$labeling->{font} = $dialog->get_widget('labels_font_label')->get_text;
@{$labeling->{color}} = split(/ /, $dialog->get_widget('labels_color_label')->get_text);
$labeling->{min_size} = $dialog->get_widget('labels_min_size_entry')->get_text;
$labeling->{incremental} = $dialog->get_widget('labels_incremental_checkbutton')->get_active();
$self->labeling($labeling);
$self->hide_dialog('labels_dialog') if $close;
$gui->set_layer($self);
$gui->{overlay}->render;
}
##@ignore
sub cancel_labels {
my($self, $gui);
for (@_) {
next unless ref eq 'ARRAY';
($self, $gui) = @{$_};
}
$self->labeling($self->{labeling_backup});
$self->hide_dialog('labels_dialog');
$gui->set_layer($self);
$gui->{overlay}->render;
1;
}
##@ignore
sub labels_font {
my($self, $gui) = @{$_[1]};
my $font_chooser = Gtk2::FontSelectionDialog->new ("Select font for the labels");
my $font_name = $self->{labels_dialog}->get_widget('labels_font_label')->get_text;
$font_chooser->set_font_name($font_name);
if ($font_chooser->run eq 'ok') {
$font_name = $font_chooser->get_font_name;
$self->{labels_dialog}->get_widget('labels_font_label')->set_text($font_name);
}
$font_chooser->destroy;
}
##@ignore
sub labels_color {
my($self, $gui) = @{$_[1]};
my @color = split(/ /, $self->{labels_dialog}->get_widget('labels_color_label')->get_text);
my $color_chooser = Gtk2::ColorSelectionDialog->new('Choose color for the label font');
my $s = $color_chooser->colorsel;
$s->set_has_opacity_control(1);
my $c = Gtk2::Gdk::Color->new($color[0]*257,$color[1]*257,$color[2]*257);
$s->set_current_color($c);
$s->set_current_alpha($color[3]*257);
if ($color_chooser->run eq 'ok') {
$c = $s->get_current_color;
@color = (int($c->red/257),int($c->green/257),int($c->blue/257));
$color[3] = int($s->get_current_alpha()/257);
$self->{labels_dialog}->get_widget('labels_color_label')->set_text("@color");
}
$color_chooser->destroy;
}
1;