FvwmPiazza

 view release on metacpan or  search on metacpan

lib/FvwmPiazza/Layouts/Columns.pm  view on Meta::CPAN

    return $self;
} # init


=head2 apply_layout

Apply the requested tiling layout.

=cut
sub apply_layout {
    my $self = shift;
    my %args = (
		area=>undef,
		options=>[],
		left_offset=>0,
		right_offset=>0,
		top_offset=>0,
		bottom_offset=>0,
		vp_width=>0,
		vp_heigt=>0,
		max_win=>2,
		tiler=>undef,
		@_
	       );
    my $err = $self->check_args(%args);
    if ($err)
    {
        return $self->error($err);
    }
    my $area = $args{area};
    my @options = @{$args{options}};

    my $working_width = $args{vp_width} -
	($args{left_offset} + $args{right_offset});
    my $working_height = $args{vp_height} -
	($args{top_offset} + $args{bottom_offset});

    my $num_cols = $args{max_win};
    my $num_win = $area->num_windows();

    if ($num_win == 0)
    {
	return $self->error("there are zero windows");
    }
    if ($num_win < $num_cols)
    {
	$area->redistribute_windows(n_groups=>$num_win);
	$num_cols = $num_win;
    }
    elsif ($area->num_groups() != $num_cols)
    {
	$area->redistribute_windows(n_groups=>$num_cols);
    }
    
    # Calculate the column widths
    # Don't apply the passed-in ratios if we have fewer columns
    # than the layout requires
    my @ratios = ();
    if ($num_cols == $args{max_win} and defined $options[0])
    {
        local @ARGV = @options;
        my $ratio_arg;
        my $parser = new Getopt::Long::Parser();
        if ($ARGV[0] =~ /^\d[\d:]*$/)
        {
            $ratio_arg = $options[0];
        }
        elsif (!$parser->getoptions("ratios=s" => \$ratio_arg))
        {
            $args{tiler}->debug("Columns: failed to parse options: " . join(':', @options));
            $ratio_arg = $num_cols;
        }
        @ratios = $self->calculate_ratios(num_sets=>$num_cols,
	    ratios=>$ratio_arg);
        @options = @ARGV;
    }
    else
    {
	@ratios = $self->calculate_ratios(num_sets=>$num_cols);
    }

    # Arrange the windows
    my $ypos = $args{top_offset};
    my $xpos = $args{left_offset};
    for (my $col_nr=0; $col_nr < $num_cols; $col_nr++)
    {
	my $col_width = int($working_width * $ratios[$col_nr]);
	my $group = $area->group($col_nr);
	$group->arrange_group(module=>$args{tiler},
	    x=>$xpos,
	    y=>$ypos,
	    width=>$col_width,
	    height=>$working_height);
	$xpos += $col_width;
    }

} # apply_layout

=head1 REQUIRES

    Class::Base

=head1 BUGS

Please report any bugs or feature requests to the author.

=head1 AUTHOR

    Kathryn Andersen (RUBYKAT)
    perlkat AT katspace dot org
    http://www.katspace.com/tools/fvwm_tiler/

=head1 COPYRIGHT AND LICENCE

Copyright (c) 2009 by Kathryn Andersen

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=cut



( run in 1.136 second using v1.01-cache-2.11-cpan-b301d465b3d )