Вертикальный текст на Gnome2::Canvas (Perl/Gtk2)

Рисуя на Gnome2::Canvas, я хочу нарисовать оси X и Y с горизонтальной меткой и вертикальной меткой.

Gnome2:: Canvas:: Текстовые объекты допускают разметку Pango. Такой тег Pango должен работать, но не работает.

<span gravity="west">...</span>

Есть ли способ преодолеть нежелание Gtk рисовать повернутый текст?

#!/usr/bin/perl
package vertical;

use strict;
use diagnostics;
use warnings;

use Gtk2 '-init';
use Gnome2::Canvas;

my $window = Gtk2::Window->new('toplevel');
$window->set_title('Hello world');
$window->set_position('center');
$window->set_default_size(500, 500);
$window->signal_connect('delete-event' => sub {

    Gtk2->main_quit();
    exit;
});

my $canvasFrame = Gtk2::Frame->new(undef);
$window->add($canvasFrame);
$canvasFrame->set_border_width(3);

my $canvasScroller = Gtk2::ScrolledWindow->new();
$canvasFrame->add($canvasScroller);
$canvasScroller->set_border_width(3);
$canvasScroller->set_policy('always','always');

my $canvas = Gnome2::Canvas->new();
$canvasScroller->add($canvas);
$canvas->set_scroll_region(0, 0, 400, 400);
$canvas->set_center_scroll_region(1);

# White background
my $canvasObj = Gnome2::Canvas::Item->new (
    $canvas->root(),
    'Gnome2::Canvas::Rect',
    x1 => 0,
    y1 => 0,
    x2 => 400,
    y2 => 400,
    fill_color => '#FFFFFF',
    outline_color => '#FFFFFF',
);
$canvasObj->lower_to_bottom();

# Black text
my $canvasObj2 = Gnome2::Canvas::Item->new(
    $canvas->root(),
    'Gnome2::Canvas::Text',
    x => 100,
    y => 300,
    fill_color => '#000000',
    font => 'Sans',
    size => 20000,
    anchor => 'GTK_ANCHOR_W',
    markup => "this is <span gravity=\"east\">not vertical</span>",
);
$canvasObj2->raise_to_top();

$window->show_all();

Gtk2->main();

1 ответ

Я думаю, что использование gravity Атрибут в разметке Pango не поддерживается, по крайней мере, я не смог заставить его работать.

Однако вместо использования Gnome2::Canvas, вы можете попробовать использовать rotate() функция в Cairo::Context, Вот пример использования Gtk3:

use strict;
use warnings;
use Gtk3 '-init';
use Glib qw/TRUE FALSE/;
use Cairo;
use Pango;

use constant PI     => 3.1415927;

my $window = Gtk3::Window->new('toplevel');
$window->set_title("Cairo Basics");
$window->set_position("mouse");
$window->set_default_size(600, 400);
$window->set_border_width(5);
$window->signal_connect (delete_event => sub { Gtk3->main_quit });

my $frame = Gtk3::Frame->new("Cairo Drawings");
$window->add($frame);
my $drawable = Gtk3::DrawingArea->new;
$drawable->signal_connect( draw => sub { cairo_draw($drawable, @_ ) });
$frame->add($drawable);
$window->show_all;
Gtk3->main;

sub cairo_draw {
    my ( $drawable, $widget, $context, $ref_status ) = @_;

    my $pango_layout = $drawable->create_pango_layout("");
    $pango_layout->set_markup(
        "<span foreground = '#FF4444'"
        ." size = '20000' face='sans' style='normal' weight='bold'>"
        . "This is vertical</span>"
    );
    my $pango_context = $pango_layout->get_context();
    $context->move_to(200, 100);
    $context->rotate(PI*(90/180));
    Pango::Cairo::show_layout( $context, $pango_layout );    
    return FALSE;
}

Кроме того, вы можете вообще пропустить разметку Pango и использовать только Cairo:

sub cairo_draw {
    my ( $drawable, $widget, $context, $ref_status ) = @_;

    $context->set_source_rgba(1, 0.4, 0.4, 1);
    $context->select_font_face( "Sans", "normal", "bold" );
    $context->set_font_size( 35 );
    $context->move_to(220, 50);
    $context->rotate(PI*(90/180));
    $context->show_text( "This is vertical");
    return FALSE;
}
Другие вопросы по тегам