Gtk2-Ex-Geo
view release on metacpan or search on metacpan
lib/Gtk2/Ex/Geo/Dialogs/Colors.pm view on Meta::CPAN
package Gtk2::Ex::Geo::Dialogs::Colors;
# @brief
use strict;
use warnings;
use Carp;
use Graphics::ColorUtils qw /:all/;
use Glib qw/TRUE FALSE/;
use Gtk2::Ex::Geo::Dialogs qw /:all/;
use Gtk2::Ex::Geo::Layer;
use vars qw/$MAX_INT $MAX_REAL $COLOR_CELL_SIZE/;
$MAX_INT = 999999;
$MAX_REAL = 999999999.99;
$COLOR_CELL_SIZE = 20;
# open colors dialog
sub open {
my($self, $gui) = @_;
my($dialog, $boot) = $self->bootstrap_dialog
($gui, 'colors_dialog', "Colors for ".$self->name,
{
colors_dialog => [delete_event => \&cancel_colors, [$self, $gui]],
color_scale_button => [clicked => \&fill_color_scale_fields, [$self, $gui]],
color_legend_button => [clicked => \&make_color_legend, [$self, $gui]],
copy_colors_button => [clicked => \©_colors, [$self, $gui]],
open_colors_button => [clicked => \&open_colors_file, [$self, $gui]],
save_colors_button => [clicked => \&save_colors_file, [$self, $gui]],
edit_color_button => [clicked => \&edit_color, [$self, $gui]],
delete_color_button => [clicked => \&delete_color, [$self, $gui]],
add_color_button => [clicked => \&add_color, [$self, $gui]],
min_hue_button => [clicked => \&set_hue_range, [$self, $gui, 'min']],
max_hue_button => [clicked => \&set_hue_range, [$self, $gui, 'max']],
grayscale_color_button => [clicked => \&set_grayscale_color, [$self, $gui]],
grayscale_adjust_combobox => [changed => \&grayscale_color_changed, $self],
grayscale_invert_checkbutton => [toggled => \&grayscale_color_changed, $self],
border_color_button => [clicked => \&border_color_dialog, [$self]],
colors_apply_button => [clicked => \&apply_colors, [$self, $gui, 0]],
colors_cancel_button => [clicked => \&cancel_colors, [$self, $gui]],
colors_ok_button => [clicked => \&apply_colors, [$self, $gui, 1]],
palette_type_combobox => [changed => \&palette_type_changed, [$self, $gui]],
color_field_combobox => [changed => \&color_field_changed, [$self, $gui]],
scale_min_entry => [changed => \&color_scale_changed, [$self, $gui]],
scale_max_entry => [changed => \&color_scale_changed, [$self, $gui]],
hue_range_combobox => [changed => \&hue_changed, $self],
},
[qw /palette_type_combobox color_field_combobox
hue_range_combobox grayscale_adjust_combobox/]
);
if ($boot) {
my $combo = $dialog->get_widget('palette_type_combobox');
my $model = $combo->get_model;
$model->clear;
for my $type ($self->supported_palette_types()) {
$model->set($model->append, 0, $type);
}
$combo = $dialog->get_widget('hue_range_combobox');
$model = $combo->get_model;
$model->clear;
for my $type ('up to', 'down to') {
$model->set($model->append, 0, $type);
}
$combo = $dialog->get_widget('grayscale_adjust_combobox');
$model = $combo->get_model;
$model->clear;
my $hash = \%Gtk2::Ex::Geo::Layer::GRAYSCALE_SUBTYPE;
for my $type (sort {$hash->{$a} <=> $hash->{$b}} keys %$hash) {
$model->set($model->append, 0, $type);
}
}
# back up data
lib/Gtk2/Ex/Geo/Dialogs/Colors.pm view on Meta::CPAN
$dialog->get_widget('grayscale_invert_checkbutton')->set_active($invert_scale ? TRUE : FALSE);
$dialog->get_widget('border_color_checkbutton')->set_active(@border_color > 0);
$dialog->get_widget('border_color_label')->set_text("@border_color");
fill_colors_treeview($self);
return $dialog->get_widget('colors_dialog');
}
# set ups
##@ignore
sub fill_color_field_combo {
my($self) = @_;
my $palette_type = $self->palette_type;
my $combo = $self->{colors_dialog}->get_widget('color_field_combobox');
my $model = $combo->get_model;
$model->clear;
my $i = 0;
my $active;
my $color_field = $self->color_field();
my @fields = $self->schema()->fields;
for my $field (@fields) {
next unless $field->{Type};
next if $palette_type eq 'Single color';
next if ($palette_type eq 'Grayscale' or
$palette_type eq 'Rainbow' or
$palette_type eq 'Color bins')
and not($field->{Type} eq 'Integer' or
$field->{Type} eq 'Real');
next if ($palette_type eq 'Color table' and
!($field->{Type} eq 'Integer' or
$field->{Type} eq 'String'));
$model->set($model->append, 0, $field->{Name});
$active = $i if $field->{Name} eq $self->color_field();
$i++;
}
if (@fields and !defined($active)) {
$active = 0;
$self->color_field($fields[0]->{Name});
}
$combo->set_active($active) if defined $active;
}
# callbacks for edits
##@ignore
sub palette_type_changed {
my($self, $gui) = @{$_[1]};
my $dialog = $self->{colors_dialog};
my $palette = get_value_from_combo($self->{colors_dialog}, 'palette_type_combobox');
return unless $palette;
$self->palette_type($palette);
fill_color_field_combo($self);
my $tv = $dialog->get_widget('colors_treeview');
for my $w (qw/color_field_label color_field_combobox
scale_label2 scale_min_entry scale_label3 scale_max_entry color_scale_button
color_legend_button
rainbow_label
min_hue_label min_hue_button max_hue_label max_hue_button hue_range_combobox
grayscale_label4 grayscale_color_label grayscale_color_button grayscale_adjust_combobox
grayscale_label5 grayscale_invert_checkbutton
border_color_checkbutton border_color_label border_color_button
edit_label edit_color_button delete_color_button add_color_button
manage_label copy_colors_button open_colors_button save_colors_button/) {
$dialog->get_widget($w)->set_sensitive(0);
}
$tv->set_sensitive(0);
return unless create_colors_treeview($self);
if ($palette ne 'Single color') {
for my $w (qw/color_field_label color_field_combobox/) {
$dialog->get_widget($w)->set_sensitive(1);
}
}
if ($palette eq 'Grayscale') {
for my $w (qw/grayscale_label4 grayscale_color_label grayscale_color_button
grayscale_adjust_combobox grayscale_label5 grayscale_invert_checkbutton/) {
$dialog->get_widget($w)->set_sensitive(1);
}
} elsif ($palette eq 'Rainbow') {
for my $w (qw/rainbow_label
min_hue_label min_hue_button max_hue_label max_hue_button
hue_range_combobox/) {
$dialog->get_widget($w)->set_sensitive(1);
}
}
if ($palette eq 'Single color') {
for my $w (qw/edit_label edit_color_button/) {
$dialog->get_widget($w)->set_sensitive(1);
}
$tv->set_sensitive(1);
} elsif ($palette eq 'Grayscale' or $palette eq 'Rainbow' or $palette =~ 'channel') {
for my $w (qw/scale_label2 scale_min_entry scale_label3 scale_max_entry color_scale_button
color_legend_button/) {
$dialog->get_widget($w)->set_sensitive(1);
}
$tv->set_sensitive(1);
} elsif ($palette eq 'Color table') {
for my $w (qw/manage_label copy_colors_button open_colors_button save_colors_button
edit_label edit_color_button delete_color_button add_color_button/) {
$dialog->get_widget($w)->set_sensitive(1);
}
$tv->set_sensitive(1);
} elsif ($palette eq 'Color bins') {
for my $w (qw/manage_label copy_colors_button open_colors_button save_colors_button
edit_label edit_color_button delete_color_button add_color_button/) {
$dialog->get_widget($w)->set_sensitive(1);
}
$tv->set_sensitive(1);
}
if ($self->has_features_with_borders) {
for my $w (qw/border_color_checkbutton border_color_label border_color_button/) {
$dialog->get_widget($w)->set_sensitive(1);
}
}
}
##@ignore
sub color_field_changed {
my($self, $gui) = @{$_[1]};
my $field = get_value_from_combo($self->{colors_dialog}, 'color_field_combobox');
return unless $field; # model is cleared
$self->color_field($field);
my $palette = $self->palette_type;
if (($palette eq 'Color bins' or $palette eq 'Color table') and
$self->{current_coloring_type} ne current_coloring_type($self)) {
create_colors_treeview($self);
}
}
## @ignore
sub color_scale_changed {
my($self, $gui) = @{$_[1]};
my $d = $self->{colors_dialog};
my $min = get_number_from_entry($d->get_widget('scale_min_entry'));
my $max = get_number_from_entry($d->get_widget('scale_max_entry'));
$self->color_scale($min, $max);
}
## @ignore
sub hue_changed {
my(undef, $self) = @_;
my $d = $self->{colors_dialog};
my $min = get_number_from_entry($d->get_widget('min_hue_label'));
my $max = get_number_from_entry($d->get_widget('max_hue_label'));
my $dir = $d->get_widget('hue_range_combobox')->get_active == 0 ? 1 : -1; # up is 1, down is -1
$self->hue_range($min, $max, $dir);
create_colors_treeview($self);
}
## @ignore
sub grayscale_color_changed {
my(undef, $self) = @_;
lib/Gtk2/Ex/Geo/Dialogs/Colors.pm view on Meta::CPAN
my @color = split(/ /, $dialog->get_widget('grayscale_color_label')->get_text());
$color[1] /= 100;
$color[2] /= 100;
@color = hsv2rgb(@color);
my $color_chooser = Gtk2::ColorSelectionDialog->new('Choose base color for grayscale');
my $s = $color_chooser->colorsel;
$s->set_has_opacity_control(0);
my $c = Gtk2::Gdk::Color->new($color[0]*257,$color[1]*257,$color[2]*257);
$s->set_current_color($c);
if ($color_chooser->run eq 'ok') {
$c = $s->get_current_color;
@color = rgb2hsv($c->red/257, $c->green/257, $c->blue/257);
$color[1] *= 100;
$color[2] *= 100;
for (@color) {
$_ = int($_+0.5);
}
$dialog->get_widget('grayscale_color_label')->set_text("@color");
}
$color_chooser->destroy;
grayscale_color_changed(undef, $self);
}
##@ignore
sub border_color_dialog {
my($self) = @{$_[1]};
my $dialog = $self->{colors_dialog};
my @color = split(/ /, $dialog->get_widget('border_color_label')->get_text);
my $color_chooser = Gtk2::ColorSelectionDialog->new('Choose color for the border lines in '.$self->name);
my $s = $color_chooser->colorsel;
$s->set_has_opacity_control(0);
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+0.5),int($c->green/257+0.5),int($c->blue/257+0.5));
#$color[3] = int($s->get_current_alpha()/257);
$dialog->get_widget('border_color_label')->set_text("@color");
}
$color_chooser->destroy;
}
##@ignore
sub fill_color_scale_fields {
my($self, $gui) = @{$_[1]};
my @range;
my $field = $self->color_field;
eval {
@range = $self->value_range($field);
};
if ($@) {
$gui->message("$@");
return;
}
$self->{colors_dialog}->get_widget('scale_min_entry')->set_text($range[0]) if defined $range[0];
$self->{colors_dialog}->get_widget('scale_max_entry')->set_text($range[1]) if defined $range[1];
}
##@ignore
sub make_color_legend {
my($self, $gui) = @{$_[1]};
put_scale_in_treeview($self);
}
# color treeview subs
##@ignore
sub cell_in_colors_treeview_changed {
my($cell, $path, $new_value, $data) = @_;
my($self, $column) = @$data;
my $palette_type = $self->palette_type;
my @color;
if ($palette_type eq 'Single color') {
@color = $self->color();
} else {
@color = $self->color($path);
}
$color[$column] = $new_value;
if ($palette_type eq 'Single color') {
$self->color(@color);
} else {
$self->color($path, @color);
}
fill_colors_treeview($self);
}
##@ignore
sub create_colors_treeview {
my($self) = @_;
my $palette_type = $self->palette_type;
my $treeview = $self->{colors_dialog}->get_widget('colors_treeview');
if ($palette_type eq 'Grayscale' or $palette_type eq 'Rainbow') {
put_scale_in_treeview($self);
return 1;
}
my $model = $treeview->get_model;
$model->clear if $model;
my $type = $self->{current_coloring_type} = current_coloring_type($self);
if ($palette_type eq 'Single color') {
$model = Gtk2::TreeStore->new(
qw/Gtk2::Gdk::Pixbuf Glib::Int Glib::Int Glib::Int Glib::Int/);
} elsif ($palette_type eq 'Color table') {
return unless $type;
$model = Gtk2::TreeStore->new(
"Glib::$type","Gtk2::Gdk::Pixbuf","Glib::Int","Glib::Int","Glib::Int","Glib::Int");
} elsif ($palette_type eq 'Color bins') {
return unless $type;
$model = Gtk2::TreeStore->new(
"Glib::$type","Gtk2::Gdk::Pixbuf","Glib::Int","Glib::Int","Glib::Int","Glib::Int");
}
$treeview->set_model($model);
for my $col ($treeview->get_columns) {
$treeview->remove_column($col);
}
my $i = 0;
my $cell;
( run in 1.491 second using v1.01-cache-2.11-cpan-39bf76dae61 )