mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-16 06:18:47 +02:00
More updates.
This commit is contained in:
@@ -14,7 +14,18 @@ sub new_from_hash
|
||||
$class = 'Remind::PDF::Entry::UNKNOWN';
|
||||
}
|
||||
}
|
||||
return bless($hash, $class);
|
||||
bless($hash, $class);
|
||||
$hash->adjust();
|
||||
return $hash;
|
||||
}
|
||||
|
||||
# Base class: Set the color to black
|
||||
sub adjust
|
||||
{
|
||||
my ($self) = @_;
|
||||
$self->{r} = 0;
|
||||
$self->{g} = 0;
|
||||
$self->{b} = 0;
|
||||
}
|
||||
|
||||
package Remind::PDF::Entry::html;
|
||||
@@ -27,8 +38,26 @@ package Remind::PDF::Entry::moon;
|
||||
use base 'Remind::PDF::Entry';
|
||||
package Remind::PDF::Entry::shade;
|
||||
use base 'Remind::PDF::Entry';
|
||||
sub adjust
|
||||
{
|
||||
my ($self) = @_;
|
||||
if ($self->{body} =~ /^(\d+)\s+(\d+)\s+(\d+)/) {
|
||||
$self->{r} = $1;
|
||||
$self->{g} = $2;
|
||||
$self->{b} = $3;
|
||||
}
|
||||
}
|
||||
|
||||
package Remind::PDF::Entry::color;
|
||||
use base 'Remind::PDF::Entry';
|
||||
|
||||
# Strip the RGB prefix from body
|
||||
sub adjust
|
||||
{
|
||||
my ($self) = @_;
|
||||
$self->{body} =~ s/^\d+\s+\d+\s+\d+\s+//;
|
||||
}
|
||||
|
||||
package Remind::PDF::Entry::postscript;
|
||||
use base 'Remind::PDF::Entry';
|
||||
package Remind::PDF::Entry::psfile;
|
||||
|
||||
@@ -155,22 +155,19 @@ sub render
|
||||
{
|
||||
my ($self, $cr, $settings) = @_;
|
||||
|
||||
$self->{horiz_lines} = [];
|
||||
$cr->set_line_cap('square');
|
||||
my $so_far = $self->draw_title($cr, $settings);
|
||||
|
||||
# Top line
|
||||
$cr->move_to($settings->{margin_left}, $so_far);
|
||||
$cr->line_to($settings->{width} - $settings->{margin_right}, $so_far);
|
||||
$cr->stroke();
|
||||
push(@{$self->{horiz_lines}}, $so_far);
|
||||
|
||||
my $top_line = $so_far;
|
||||
|
||||
$so_far = $self->draw_daynames($cr, $settings, $so_far);
|
||||
|
||||
# Line under the days
|
||||
$cr->move_to($settings->{margin_left}, $so_far);
|
||||
$cr->line_to($settings->{width} - $settings->{margin_right}, $so_far);
|
||||
$cr->stroke();
|
||||
push(@{$self->{horiz_lines}}, $so_far);
|
||||
|
||||
# First column
|
||||
my $first_col = $self->{firstwkday};
|
||||
@@ -209,9 +206,7 @@ sub render
|
||||
print STDERR "Drawing row $row $start_day $start_col\n";
|
||||
$so_far = $self->draw_row($cr, $settings, $so_far, $row, $start_day, $start_col);
|
||||
$start_day += 7 - $start_col;
|
||||
$cr->move_to($settings->{margin_left}, $so_far);
|
||||
$cr->line_to($settings->{width} - $settings->{margin_right}, $so_far);
|
||||
$cr->stroke();
|
||||
push(@{$self->{horiz_lines}}, $so_far);
|
||||
}
|
||||
|
||||
# The vertical lines
|
||||
@@ -221,6 +216,13 @@ sub render
|
||||
$cr->line_to($settings->{margin_left} + $i * $cell, $so_far);
|
||||
$cr->stroke();
|
||||
}
|
||||
|
||||
# And the horizontal lines
|
||||
foreach my $y (@{$self->{horiz_lines}}) {
|
||||
$cr->move_to($settings->{margin_left}, $y);
|
||||
$cr->line_to($settings->{width} - $settings->{margin_right}, $y);
|
||||
$cr->stroke();
|
||||
}
|
||||
}
|
||||
|
||||
sub draw_row
|
||||
@@ -230,20 +232,61 @@ sub draw_row
|
||||
my $col = $start_col;
|
||||
my $day = $start_day;
|
||||
my $height = 0;
|
||||
|
||||
# Preview them to figure out the row height...
|
||||
while ($col < 7) {
|
||||
my $h = $self->draw_day($cr, $settings, $so_far, $day, $col);
|
||||
my $h = $self->draw_day($cr, $settings, $so_far, $day, $col, 0);
|
||||
$height = $h if ($h > $height);
|
||||
$day++;
|
||||
$col++;
|
||||
last if ($day > $self->{daysinmonth});
|
||||
}
|
||||
|
||||
# Now draw for real
|
||||
$col = $start_col;
|
||||
$day = $start_day;
|
||||
while ($col < 7) {
|
||||
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
|
||||
$day++;
|
||||
$col++;
|
||||
last if ($day > $self->{daysinmonth});
|
||||
}
|
||||
|
||||
return $so_far + $height + $settings->{border_size};
|
||||
}
|
||||
|
||||
sub col_box_coordinates
|
||||
{
|
||||
my ($self, $so_far, $col, $height, $settings) = @_;
|
||||
my $cell = ($settings->{width} - $settings->{margin_left} - $settings->{margin_right}) / 7;
|
||||
|
||||
return (
|
||||
$settings->{margin_left} + $cell * $col,
|
||||
$so_far,
|
||||
$settings->{margin_left} + $cell * ($col + 1),
|
||||
$so_far + $height + $settings->{border_size},
|
||||
);
|
||||
}
|
||||
|
||||
sub draw_day
|
||||
{
|
||||
my ($self, $cr, $settings, $so_far, $day, $col) = @_;
|
||||
my ($self, $cr, $settings, $so_far, $day, $col, $height) = @_;
|
||||
|
||||
my ($x1, $y1, $x2, $y2) = $self->col_box_coordinates($so_far, $col, $height, $settings);
|
||||
|
||||
# Do shading if we're in "for real" mode
|
||||
if ($height) {
|
||||
my $shade = $self->find_last_special('shade', $self->{entries}->[$day]);
|
||||
if ($shade) {
|
||||
$cr->save;
|
||||
$cr->set_source_rgb($shade->{r} / 255,
|
||||
$shade->{g} / 255,
|
||||
$shade->{b} / 255);
|
||||
$cr->rectangle($x1, $y1, $x2 - $x1, $y2 - $y1);
|
||||
$cr->fill();
|
||||
$cr->restore;
|
||||
}
|
||||
}
|
||||
# Draw the day number
|
||||
my $layout = Pango::Cairo::create_layout($cr);
|
||||
$layout->set_text($day);
|
||||
@@ -252,28 +295,34 @@ sub draw_day
|
||||
$layout->set_font_description($desc);
|
||||
my ($wid, $h) = $layout->get_pixel_size();
|
||||
|
||||
my $cell = ($settings->{width} - $settings->{margin_left} - $settings->{margin_right}) / 7;
|
||||
$cr->save;
|
||||
if ($settings->{numbers_on_left}) {
|
||||
$cr->move_to($settings->{margin_left} + ($col * $cell) + $settings->{border_size}, $so_far + $settings->{border_size});
|
||||
} else {
|
||||
$cr->move_to($settings->{margin_left} + ($col * $cell) + $cell - $settings->{border_size} - $wid, $so_far + $settings->{border_size});
|
||||
}
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
|
||||
my $layout = Pango::Cairo::create_layout($cr);
|
||||
$layout->set_width(($cell - 2 * $settings->{border_size}) * 1024);
|
||||
# Don't actually draw if we're just previewing to get the cell height
|
||||
if ($height) {
|
||||
$cr->save;
|
||||
if ($settings->{numbers_on_left}) {
|
||||
$cr->move_to($x1 + $settings->{border_size}, $so_far + $settings->{border_size});
|
||||
} else {
|
||||
$cr->move_to($x2 - $settings->{border_size} - $wid, $so_far + $settings->{border_size});
|
||||
}
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
}
|
||||
|
||||
$layout = Pango::Cairo::create_layout($cr);
|
||||
$layout->set_width(($x2 - $x1 - 2 * $settings->{border_size}) * 1024);
|
||||
$layout->set_wrap('word');
|
||||
$layout->set_text("Bobby snorkle flump chump twinkle");
|
||||
my $desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . $settings->{entry_size});
|
||||
$desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . $settings->{entry_size});
|
||||
|
||||
$layout->set_font_description($desc);
|
||||
my ($wid2, $h2) = $layout->get_pixel_size();
|
||||
$cr->save;
|
||||
$cr->move_to($settings->{margin_left} + ($col * $cell) + $settings->{border_size}, $so_far + 2* $settings->{border_size} + $h);
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
|
||||
if ($height) {
|
||||
$cr->save;
|
||||
$cr->move_to($x1 + $settings->{border_size}, $so_far + 2* $settings->{border_size} + $h);
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
}
|
||||
|
||||
return $h + $h2 + 2 * $settings->{border_size};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user