diff options
Diffstat (limited to 'PerlTQt/examples/drawdemo/drawdemo.pl')
-rw-r--r-- | PerlTQt/examples/drawdemo/drawdemo.pl | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/PerlTQt/examples/drawdemo/drawdemo.pl b/PerlTQt/examples/drawdemo/drawdemo.pl new file mode 100644 index 0000000..f119a94 --- /dev/null +++ b/PerlTQt/examples/drawdemo/drawdemo.pl @@ -0,0 +1,198 @@ +#!/usr/bin/perl -w +use strict; +package DrawView; +use TQt; +use TQt::isa qw(TQt::Widget); +use TQt::slots + updateIt => ['int'], + printIt => []; +use TQt::attributes qw( + printer + bgroup + _print + drawindex + maxindex +); + +# +# First we define the functionality our demo should present +# to the user. You might add different demo-modes if you wish so +# + +# +# This function draws a color wheel. +# The coordinate system x=(0..500), y=(0..500) spans the paint device. +# + +sub drawColorWheel { + my $p = shift; + my $f = TQt::Font("times", 18, &TQt::Font::Bold); + $p->setFont($f); + $p->setPen(&black); + $p->setWindow(0, 0, 500, 500); # defines coordinate system + + for my $i (0..35) { + my $matrix = TQt::WMatrix; + $matrix->translate(250.0, 250.0); # move to center + $matrix->shear(0.0, 0.3); # twist it + $matrix->rotate($i*10.0); # rotate 0,10,20,.. degrees + $p->setWorldMatrix($matrix); # use this world matrix + + my $c = TQt::Color; + $c->setHsv($i*10, 255, 255); # rainbow effect + $p->setBrush($c); # solid fill with color $c + $p->drawRect(70, -10, 80, 10); # draw the rectangle + + my $n = sprintf "H=%d", $i*10; + $p->drawText(80+70+5, 0, $n); # draw the hue number + } +} + +# +# This function draws a few lines of text using different fonts. +# + +sub drawFonts { + my $p = shift; + my @fonts = qw(Helvetica Courier Times); + my @sizes = (10, 12, 18, 24, 36); + my $y = 0; + for my $f (@fonts) { + for my $s (@sizes) { + my $font = TQt::Font($f, $s); + $p->setFont($font); + my $fm = $p->fontMetrics; + $y += $fm->ascent; + $p->drawText(10, $y, "Quartz Glyph Job Vex'd Cwm Finks"); + $y += $fm->descent; + } + } +} + +# +# This function draws some shapes +# + +sub drawShapes { + my $p = shift; + my $b1 = TQt::Brush(&blue); + my $b2 = TQt::Brush(&green, &Dense6Pattern); # green 12% fill + my $b3 = TQt::Brush(&NoBrush); # void brush + my $b4 = TQt::Brush(&CrossPattern); # black cross pattern + + $p->setPen(&red); + $p->setBrush($b1); + $p->drawRect(10, 10, 200, 100); + $p->setBrush($b2); + $p->drawRoundRect(10, 150, 200, 100, 20, 20); + $p->setBrush($b3); + $p->drawEllipse(250, 10, 200, 100); + $p->setBrush($b4); + $p->drawPie(250, 150, 200, 100, 45*16, 90*16); +} + +our @drawFunctions = ( +# title presented to user, reference to the function + { name => "Draw color wheel", f => \&drawColorWheel }, + { name => "Draw fonts" , f => \&drawFonts }, + { name => "Draw shapes" , f => \&drawShapes }, +); + +# +# Construct the DrawView with buttons. +# + +sub NEW { + shift->SUPER::NEW(@_); + + setCaption("PerlTQt Draw Demo Application"); + setBackgroundColor(&white); + + # Create a button group to contain all buttons + bgroup = TQt::ButtonGroup(this); + bgroup->resize(200, 200); + this->connect(bgroup, TQT_SIGNAL('clicked(int)'), TQT_SLOT('updateIt(int)')); + + # Calculate the size for the radio buttons + my $maxwidth = 80; + my $maxheight = 10; + my $fm = bgroup->fontMetrics; + + for my $i (0 .. $#drawFunctions) { + my $n = $drawFunctions[$i]{name}; + my $w = $fm->width($n); + $maxwidth = max($w, $maxwidth); + } + + $maxwidth += 30; + + for my $i (0 .. $#drawFunctions) { + my $n = $drawFunctions[$i]{name}; + my $rb = TQt::RadioButton($n, bgroup); + $rb->setGeometry(10, $i*30+10, $maxwidth, 30); + + $maxheight += 30; + + $rb->setChecked(1) unless $i; + $i++; + } + + $maxheight += 10; + + drawindex = 0; + maxindex = scalar @drawFunctions; + $maxwidth += 20; + + bgroup->resize($maxwidth, $maxheight); + + printer = TQt::Printer; + + _print = TQt::PushButton("Print...", bgroup); + _print->resize(80, 30); + _print->move($maxwidth/2 - _print->width/2, maxindex*30+20); + this->connect(_print, TQT_SIGNAL('clicked()'), TQT_SLOT('printIt()')); + + bgroup->resize($maxwidth, _print->y+_print->height+10); + + resize(640,300); +} + +sub updateIt { + my $index = shift; + if($index < maxindex) { + drawindex = $index; + update(); + } +} + +sub drawIt { + my $p = shift; + $drawFunctions[drawindex]{f}->($p); +} + +sub printIt { + if(printer->setup(this)) { + my $paint = TQt::Painter(printer); + drawIt($paint); + } +} + +sub paintEvent { + my $paint = TQt::Painter(this); + drawIt($paint); +} + +sub resizeEvent { + bgroup->move(int(width() - bgroup->width), int(0)); +} + +package main; +use TQt; +use DrawView; + +my $app = TQt::Application(\@ARGV); +my $draw = DrawView; +$app->setMainWidget($draw); +$draw->setCaption("PerlTQt Example - Drawdemo"); +$draw->show; +exit $app->exec; |