Gtk2-Ex-Geo

 view release on metacpan or  search on metacpan

lib/Gtk2/Ex/Geo/Dialogs/Colors.pm  view on Meta::CPAN

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) = @_;
    my $d = $self->{colors_dialog};

    my @color = split(/ /, $self->{colors_dialog}->get_widget('grayscale_color_label')->get_text);
    if (@color > 2) {
	$color[1] /= 100;
	$color[2] /= 100;
	@color = hsv2rgb(@color);
	$self->grayscale_color(@color, 255);
    }
    $self->invert_scale($d->get_widget('grayscale_invert_checkbutton')->get_active());
    $self->grayscale_subtype(get_value_from_combo($d, 'grayscale_adjust_combobox'));

    create_colors_treeview($self);
}

# button callbacks

##@ignore
sub apply_colors {
    my($self, $gui, $close) = @{$_[1]};
    my @color = split(/ /, $self->{colors_dialog}->get_widget('border_color_label')->get_text);
    my $has_border = $self->{colors_dialog}->get_widget('border_color_checkbutton')->get_active();
    @color = () unless $has_border;
    $self->border_color(@color);
    $self->hide_dialog('colors_dialog') if $close;
    $gui->{overlay}->render;
}

##@ignore
sub cancel_colors {
    my($self, $gui);
    for (@_) {
	next unless ref eq 'ARRAY';
	($self, $gui) = @{$_};
    }
    $self->palette_type($self->{backup}->{palette_type});
    $self->single_color(@{$self->{backup}->{single_color}});
    $self->color_field($self->{backup}->{field}) if $self->{backup}->{field};
    $self->color_table($self->{backup}->{table});
    $self->color_bins($self->{backup}->{bins});
    $self->color_scale(@{$self->{backup}->{scale}});

    $self->hue_range(@{$self->{backup}->{hue_range}});

    $self->grayscale_subtype($self->{backup}->{grayscale_subtype});
    $self->invert_scale($self->{backup}->{invert_scale});
    $self->grayscale_color(@{$self->{backup}->{grayscale_color}});

    $self->border_color(@{$self->{backup}->{border_color}});

    $self->hide_dialog('colors_dialog');
    $gui->{overlay}->render;
    1;
}

##@ignore
sub copy_colors {
    my($self, $gui) = @{$_[1]};
    my $table = copy_colors_dialog($self, $gui);
    if ($table) {
	my $palette_type = $self->palette_type;
	if ($palette_type eq 'Color table') {
	    $self->color_table($table);
	} elsif ($palette_type eq 'Color bins') {
	    $self->color_bins($table);
	}
	fill_colors_treeview($self);
    }
}

##@ignore
sub open_colors_file {
    my($self, $gui) = @{$_[1]};
    my $palette_type = $self->palette_type;
    my $filename = file_chooser("Select a $palette_type file", 'open');
    if ($filename) {
	if ($palette_type eq 'Color table') {
	    eval {
		$self->color_table($filename);
	    }
	} elsif ($palette_type eq 'Color bins') {
	    eval {
		$self->color_bins($filename);
	    }
	}
	if ($@) {
	    $gui->message("$@");
	} else {
	    fill_colors_treeview($self);
	}
    }
}

##@ignore
sub save_colors_file {
    my($self, $gui) = @{$_[1]};
    my $palette_type = $self->palette_type;
    my $filename = file_chooser("Save $palette_type file as", 'save');
    if ($filename) {
	if ($palette_type eq 'Color table') {
	    eval {
		$self->save_color_table($filename); 
	    }
	} elsif ($palette_type eq 'Color bins') {
	    eval {
		$self->save_color_bins($filename);
	    }
	}
	if ($@) {
	    $gui->message("$@");
	}
    }

lib/Gtk2/Ex/Geo/Dialogs/Colors.pm  view on Meta::CPAN

		$v = 1 - $v if $invert_scale;
	    } elsif ($grayscale_subtype eq 'Hue') {
		$h = int(($x - $min)/($max - $min)*360 + 0.5);
		$h = 360 - $h if $invert_scale;
	    } elsif ($grayscale_subtype eq 'Saturation') {
		$s = ($x - $min)/($max - $min);
		$s = 1 - $s if $invert_scale;
	    } elsif ($grayscale_subtype eq 'Value') {
		$v = ($x - $min)/($max - $min);
		$v = 1 - $v if $invert_scale;
	    } elsif ($grayscale_subtype eq 'Opacity') {
		$alpha = int(($x - $min)/($max - $min)*255 + 0.5);
		$alpha = 255 - $alpha if $invert_scale;
	    }
	} else {
	    $h = int($hue_min + ($x - $min)/($max-$min) * ($hue_max-$hue_min) + 0.5);
	    $h -= 360 if $h > 360;
	    $h += 360 if $h < 0;
	    $s = 1;
	    $v = 1;
	}
	
	my $pb = Gtk2::Gdk::Pixbuf->new('rgb', 1, 8, $COLOR_CELL_SIZE, $COLOR_CELL_SIZE);
	my @color = hsv2rgb($h, $s, $v);
	$pb->fill($alpha << 32 | $color[0] << 24 | $color[1] << 16 | $color[2] << 8);

	my $j = 0;
	push @set, ($j++, $pb);
	push @set, ($j++, $x);
	$model->set(@set);
	$x -= $delta;
	$x = $min if $x < $min;
    }
}

##@ignore
sub copy_colors_dialog {
    my($self, $gui) = @_;

    my $palette_type = $self->palette_type;
    my $dialog = $gui->get_dialog('colors_from_dialog');
    $dialog->get_widget('colors_from_dialog')->set_title("Get $palette_type from");
    my $treeview = $dialog->get_widget('colors_from_treeview');

    my $model = Gtk2::TreeStore->new(qw/Glib::String/);
    $treeview->set_model($model);

    for my $col ($treeview->get_columns) {
	$treeview->remove_column($col);
    }

    my $i = 0;
    for my $column ('Layer') {
	my $cell = Gtk2::CellRendererText->new;
	my $col = Gtk2::TreeViewColumn->new_with_attributes($column, $cell, text => $i++);
	$treeview->append_column($col);
    }

    $model->clear;
    my @names;
    for my $layer (@{$gui->{overlay}->{layers}}) {
	next if $layer->name() eq $self->name();
	push @names, $layer->name();
	$model->set ($model->append(undef), 0, $layer->name());
    }

    #$dialog->move(@{$self->{colors_from_position}}) if $self->{colors_from_position};
    $dialog->get_widget('colors_from_dialog')->show_all;
    $dialog->get_widget('colors_from_dialog')->present;

    my $response = $dialog->get_widget('colors_from_dialog')->run;

    my $table;

    if ($response eq 'ok') {

	my @sel = $treeview->get_selection->get_selected_rows;
	if (@sel) {
	    my $i = $sel[0]->to_string if @sel;
	    my $from_layer = $gui->{overlay}->get_layer_by_name($names[$i]);

	    if ($palette_type eq 'Color table') {
		$table = $from_layer->color_table();
	    } elsif ($palette_type eq 'Color bins') {
		$table = $from_layer->color_bins();
	    }
	}
	
    }

    $dialog->get_widget('colors_from_dialog')->destroy;

    return $table;
}

1;



( run in 2.385 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )