summaryrefslogtreecommitdiffstats
path: root/examples/xform
diff options
context:
space:
mode:
Diffstat (limited to 'examples/xform')
-rw-r--r--examples/xform/README1
-rw-r--r--examples/xform/aticatac.cppbin0 -> 6346 bytes
-rw-r--r--examples/xform/image.anybin0 -> 12414 bytes
-rw-r--r--examples/xform/picture.anybin0 -> 545 bytes
-rw-r--r--examples/xform/xform.cpp507
-rw-r--r--examples/xform/xform.doc17
-rw-r--r--examples/xform/xform.pro10
7 files changed, 535 insertions, 0 deletions
diff --git a/examples/xform/README b/examples/xform/README
new file mode 100644
index 000000000..6b2f48d4d
--- /dev/null
+++ b/examples/xform/README
@@ -0,0 +1 @@
+The xform program demonstrates rotation/shearing of text and pixmaps.
diff --git a/examples/xform/aticatac.cpp b/examples/xform/aticatac.cpp
new file mode 100644
index 000000000..515127743
--- /dev/null
+++ b/examples/xform/aticatac.cpp
Binary files differ
diff --git a/examples/xform/image.any b/examples/xform/image.any
new file mode 100644
index 000000000..2f47f4cb2
--- /dev/null
+++ b/examples/xform/image.any
Binary files differ
diff --git a/examples/xform/picture.any b/examples/xform/picture.any
new file mode 100644
index 000000000..d9cf7f22a
--- /dev/null
+++ b/examples/xform/picture.any
Binary files differ
diff --git a/examples/xform/xform.cpp b/examples/xform/xform.cpp
new file mode 100644
index 000000000..dfe351946
--- /dev/null
+++ b/examples/xform/xform.cpp
@@ -0,0 +1,507 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+
+#include <qdialog.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <qlcdnumber.h>
+#include <qslider.h>
+#include <qmenubar.h>
+#include <qfontdialog.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qwidgetstack.h>
+
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpicture.h>
+
+#include <stdlib.h>
+
+
+class ModeNames {
+public:
+ enum Mode { Text, Image, Picture };
+};
+
+
+class XFormControl : public TQVBox, public ModeNames
+{
+ Q_OBJECT
+public:
+ XFormControl( const TQFont &initialFont, TQWidget *parent=0, const char *name=0 );
+ ~XFormControl() {}
+
+ TQWMatrix matrix();
+
+signals:
+ void newMatrix( TQWMatrix );
+ void newText( const TQString& );
+ void newFont( const TQFont & );
+ void newMode( int );
+private slots:
+ void newMtx();
+ void newTxt(const TQString&);
+ void selectFont();
+ void fontSelected( const TQFont & );
+ void changeMode(int);
+ void timerEvent(TQTimerEvent*);
+private:
+ Mode mode;
+ TQSlider *rotS; // Rotation angle scroll bar
+ TQSlider *shearS; // Shear value scroll bar
+ TQSlider *magS; // Magnification value scroll bar
+ TQLCDNumber *rotLCD; // Rotation angle LCD display
+ TQLCDNumber *shearLCD; // Shear value LCD display
+ TQLCDNumber *magLCD; // Magnification value LCD display
+ TQCheckBox *mirror; // Checkbox for mirror image on/of
+ TQWidgetStack* optionals;
+ TQLineEdit *textEd; // Inp[ut field for xForm text
+ TQPushButton *fpb; // Select font push button
+ TQRadioButton *rb_txt; // Radio button for text
+ TQRadioButton *rb_img; // Radio button for image
+ TQRadioButton *rb_pic; // Radio button for picture
+ TQFont currentFont;
+};
+
+/*
+ ShowXForm displays a text or a pixmap (TQPixmap) using a coordinate
+ transformation matrix (TQWMatrix)
+*/
+
+class ShowXForm : public TQWidget, public ModeNames
+{
+ Q_OBJECT
+public:
+ ShowXForm( const TQFont &f, TQWidget *parent=0, const char *name=0 );
+ ~ShowXForm() {}
+ void showIt(); // (Re)displays text or pixmap
+
+ Mode mode() const { return m; }
+public slots:
+ void setText( const TQString& );
+ void setMatrix( TQWMatrix );
+ void setFont( const TQFont &f );
+ void setPixmap( TQPixmap );
+ void setPicture( const TQPicture& );
+ void setMode( int );
+private:
+ TQSizePolicy sizePolicy() const;
+ TQSize sizeHint() const;
+ void paintEvent( TQPaintEvent * );
+ void resizeEvent( TQResizeEvent * );
+ TQWMatrix mtx; // coordinate transform matrix
+ TQString text; // text to be displayed
+ TQPixmap pix; // pixmap to be displayed
+ TQPicture picture; // text to be displayed
+ TQRect eraseRect; // covers last displayed text/pixmap
+ Mode m;
+};
+
+XFormControl::XFormControl( const TQFont &initialFont,
+ TQWidget *parent, const char *name )
+ : TQVBox( parent, name )
+{
+ setSpacing(6);
+ setMargin(6);
+ currentFont = initialFont;
+ mode = Image;
+
+ rotLCD = new TQLCDNumber( 4, this, "rotateLCD" );
+ rotS = new TQSlider( TQSlider::Horizontal, this,
+ "rotateSlider" );
+ shearLCD = new TQLCDNumber( 5,this, "shearLCD" );
+ shearS = new TQSlider( TQSlider::Horizontal, this,
+ "shearSlider" );
+ mirror = new TQCheckBox( this, "mirrorCheckBox" );
+ rb_txt = new TQRadioButton( this, "text" );
+ rb_img = new TQRadioButton( this, "image" );
+ rb_pic = new TQRadioButton( this, "picture" );
+ optionals = new TQWidgetStack(this);
+ TQVBox* optionals_text = new TQVBox(optionals);
+ optionals_text->setSpacing(6);
+ TQVBox* optionals_other = new TQVBox(optionals);
+ optionals_other->setSpacing(6);
+ optionals->addWidget(optionals_text,0);
+ optionals->addWidget(optionals_other,1);
+ fpb = new TQPushButton( optionals_text, "text" );
+ textEd = new TQLineEdit( optionals_text, "text" );
+ textEd->setFocus();
+
+ rotLCD->display( " 0'" );
+
+ rotS->setRange( -180, 180 );
+ rotS->setValue( 0 );
+ connect( rotS, SIGNAL(valueChanged(int)), SLOT(newMtx()) );
+
+ shearLCD->display( "0.00" );
+
+ shearS->setRange( -25, 25 );
+ shearS->setValue( 0 );
+ connect( shearS, SIGNAL(valueChanged(int)), SLOT(newMtx()) );
+
+ mirror->setText( tr("Mirror") );
+ connect( mirror, SIGNAL(clicked()), SLOT(newMtx()) );
+
+ TQButtonGroup *bg = new TQButtonGroup(this);
+ bg->hide();
+ bg->insert(rb_txt,0);
+ bg->insert(rb_img,1);
+ bg->insert(rb_pic,2);
+ rb_txt->setText( tr("Text") );
+ rb_img->setText( tr("Image") );
+ rb_img->setChecked(TRUE);
+ rb_pic->setText( tr("Picture") );
+ connect( bg, SIGNAL(clicked(int)), SLOT(changeMode(int)) );
+
+ fpb->setText( tr("Select font...") );
+ connect( fpb, SIGNAL(clicked()), SLOT(selectFont()) );
+
+ textEd->setText( "Troll" );
+ connect( textEd, SIGNAL(textChanged(const TQString&)),
+ SLOT(newTxt(const TQString&)) );
+
+ magLCD = new TQLCDNumber( 4,optionals_other, "magLCD" );
+ magLCD->display( "100" );
+ magS = new TQSlider( TQSlider::Horizontal, optionals_other,
+ "magnifySlider" );
+ magS->setRange( 0, 800 );
+ connect( magS, SIGNAL(valueChanged(int)), SLOT(newMtx()) );
+ magS->setValue( 0 );
+ connect( magS, SIGNAL(valueChanged(int)), magLCD, SLOT(display(int)));
+
+ optionals_text->adjustSize();
+ optionals_other->adjustSize();
+ changeMode(Image);
+
+ startTimer(20); // start an initial animation
+}
+
+void XFormControl::timerEvent(TQTimerEvent*)
+{
+ int v = magS->value();
+ v = (v+2)+v/10;
+ if ( v >= 200 ) {
+ v = 200;
+ killTimers();
+ }
+ magS->setValue(v);
+}
+
+
+
+/*
+ Called whenever the user has changed one of the matrix parameters
+ (i.e. rotate, shear or magnification)
+*/
+void XFormControl::newMtx()
+{
+ emit newMatrix( matrix() );
+}
+
+void XFormControl::newTxt(const TQString& s)
+{
+ emit newText(s);
+ changeMode(Text);
+}
+
+/*
+ Calculates the matrix appropriate for the current controls,
+ and updates the displays.
+*/
+TQWMatrix XFormControl::matrix()
+{
+ TQWMatrix m;
+ if (mode != Text) {
+ double magVal = 1.0*magS->value()/100;
+ m.scale( magVal, magVal );
+ }
+ double shearVal = 1.0*shearS->value()/25;
+ m.shear( shearVal, shearVal );
+ m.rotate( rotS->value() );
+ if ( mirror->isChecked() ) {
+ m.scale( 1, -1 );
+ m.rotate( 180 );
+ }
+
+ TQString tmp;
+ tmp.sprintf( "%1.2f", shearVal );
+ if ( shearVal >= 0 )
+ tmp.insert( 0, " " );
+ shearLCD->display( tmp );
+
+ int rot = rotS->value();
+ if ( rot < 0 )
+ rot = rot + 360;
+ tmp.sprintf( "%3i'", rot );
+ rotLCD->display( tmp );
+ return m;
+}
+
+
+void XFormControl::selectFont()
+{
+ bool ok;
+ TQFont f = TQFontDialog::getFont( &ok, currentFont );
+ if ( ok ) {
+ currentFont = f;
+ fontSelected( f );
+ }
+}
+
+void XFormControl::fontSelected( const TQFont &font )
+{
+ emit newFont( font );
+ changeMode(Text);
+}
+
+/*
+ Sets the mode - Text, Image, or Picture.
+*/
+
+void XFormControl::changeMode(int m)
+{
+ mode = (Mode)m;
+
+ emit newMode( m );
+ newMtx();
+ if ( mode == Text ) {
+ optionals->raiseWidget(0);
+ rb_txt->setChecked(TRUE);
+ } else {
+ optionals->raiseWidget(1);
+ if ( mode == Image )
+ rb_img->setChecked(TRUE);
+ else
+ rb_pic->setChecked(TRUE);
+ }
+ qApp->flushX();
+}
+
+ShowXForm::ShowXForm( const TQFont &initialFont,
+ TQWidget *parent, const char *name )
+ : TQWidget( parent, name, WResizeNoErase )
+{
+ setFont( initialFont );
+ setBackgroundColor( white );
+ m = Text;
+ eraseRect = TQRect( 0, 0, 0, 0 );
+}
+
+TQSizePolicy ShowXForm::sizePolicy() const
+{
+ return TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Expanding );
+}
+
+TQSize ShowXForm::sizeHint() const
+{
+ return TQSize(400,400);
+}
+
+void ShowXForm::paintEvent( TQPaintEvent * )
+{
+ showIt();
+}
+
+void ShowXForm::resizeEvent( TQResizeEvent * )
+{
+ eraseRect = TQRect( width()/2, height()/2, 0, 0 );
+ repaint(rect());
+}
+
+void ShowXForm::setText( const TQString& s )
+{
+ text = s;
+ showIt();
+}
+
+void ShowXForm::setMatrix( TQWMatrix w )
+{
+ mtx = w;
+ showIt();
+}
+
+void ShowXForm::setFont( const TQFont &f )
+{
+ m = Text;
+ TQWidget::setFont( f );
+}
+
+void ShowXForm::setPixmap( TQPixmap pm )
+{
+ pix = pm;
+ m = Image;
+ showIt();
+}
+
+void ShowXForm::setPicture( const TQPicture& p )
+{
+ picture = p;
+ m = Picture;
+ showIt();
+}
+
+void ShowXForm::setMode( int mode )
+{
+ m = (Mode)mode;
+}
+
+void ShowXForm::showIt()
+{
+ TQPainter p;
+ TQRect r; // rectangle covering new text/pixmap in virtual coordinates
+ TQWMatrix um; // copy user specified transform
+ int textYPos = 0; // distance from boundingRect y pos to baseline
+ int textXPos = 0; // distance from boundingRect x pos to text start
+ TQRect br;
+ TQFontMetrics fm( fontMetrics() ); // get widget font metrics
+ switch ( mode() ) {
+ case Text:
+ br = fm.boundingRect( text ); // rectangle covering text
+ r = br;
+ textYPos = -r.y();
+ textXPos = -r.x();
+ br.moveTopLeft( TQPoint( -br.width()/2, -br.height()/2 ) );
+ break;
+ case Image:
+ r = TQRect(0, 0, pix.width()+1, pix.height()+1);
+ break;
+ case Picture:
+ // ### need TQPicture::boundingRect()
+ r = TQRect(0,0,1000,1000);
+ break;
+ }
+ r.moveTopLeft( TQPoint(-r.width()/2, -r.height()/2) );
+ r.moveBy( -1, -1 ); // add border for matrix round off
+ r.setSize( TQSize( r.width() + 2,r.height() + 2 ) );
+ // compute union of new and old rect
+ // the resulting rectangle will cover what is already displayed
+ // and have room for the new text/pixmap
+ eraseRect = eraseRect.unite( mtx.mapRect(r) );
+ int pw = TQMIN(eraseRect.width(),width());
+ int ph = TQMIN(eraseRect.height(),height());
+ TQPixmap pm( pw, ph ); // off-screen drawing pixmap
+ pm.fill( backgroundColor() );
+
+ p.begin( &pm );
+ um.translate( pw/2, ph/2 ); // 0,0 is center
+ um = mtx * um;
+ p.setWorldMatrix( um );
+ switch ( mode() ) {
+ case Text:
+ p.setFont( font() ); // use widget font
+ p.drawText( r.left() + textXPos, r.top() + textYPos, text );
+#if 0
+ p.setPen( red );
+ p.drawRect( br );
+#endif
+ break;
+ case Image:
+ p.drawPixmap( -pix.width()/2, -pix.height()/2, pix );
+ break;
+ case Picture:
+ // ### need TQPicture::boundingRect()
+ p.scale(0.25,0.25);
+ p.translate(-230,-180);
+ p.drawPicture( picture );
+ }
+ p.end();
+
+ int xpos = width()/2 - pw/2;
+ int ypos = height()/2 - ph/2;
+ bitBlt( this, xpos, ypos, // copy pixmap to widget
+ &pm, 0, 0, -1, -1 );
+ eraseRect = mtx.map( r );
+}
+
+
+/*
+ Grand unifying widget, putting ShowXForm and XFormControl
+ together.
+*/
+
+class XFormCenter : public TQHBox, public ModeNames
+{
+ Q_OBJECT
+public:
+ XFormCenter( TQWidget *parent=0, const char *name=0 );
+public slots:
+ void setFont( const TQFont &f ) { sx->setFont( f ); }
+ void newMode( int );
+private:
+ ShowXForm *sx;
+ XFormControl *xc;
+};
+
+void XFormCenter::newMode( int m )
+{
+ static bool first_i = TRUE;
+ static bool first_p = TRUE;
+
+ if ( sx->mode() == m )
+ return;
+ if ( m == Image && first_i ) {
+ first_i = FALSE;
+ TQPixmap pm;
+ if ( pm.load( "image.any" ) )
+ sx->setPixmap( pm );
+ return;
+ }
+ if ( m == Picture && first_p ) {
+ first_p = FALSE;
+ TQPicture p;
+ if (p.load( "picture.any" ))
+ sx->setPicture( p );
+ return;
+ }
+ sx->setMode(m);
+}
+
+XFormCenter::XFormCenter( TQWidget *parent, const char *name )
+ : TQHBox( parent, name )
+{
+ TQFont f( "Charter", 36, TQFont::Bold );
+
+ xc = new XFormControl( f, this );
+ sx = new ShowXForm( f, this );
+ setStretchFactor(sx,1);
+ xc->setFrameStyle( TQFrame::Panel | TQFrame::Raised );
+ xc->setLineWidth( 2 );
+ connect( xc, SIGNAL(newText(const TQString&)), sx,
+ SLOT(setText(const TQString&)) );
+ connect( xc, SIGNAL(newMatrix(TQWMatrix)),
+ sx, SLOT(setMatrix(TQWMatrix)) );
+ connect( xc, SIGNAL(newFont(const TQFont&)), sx,
+ SLOT(setFont(const TQFont&)) );
+ connect( xc, SIGNAL(newMode(int)), SLOT(newMode(int)) );
+ sx->setText( "Troll" );
+ newMode( Image );
+ sx->setMatrix(xc->matrix());
+}
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ XFormCenter *xfc = new XFormCenter;
+
+ a.setMainWidget( xfc );
+ xfc->setCaption("TQt Example - XForm");
+ xfc->show();
+ return a.exec();
+}
+
+#include "xform.moc" // include metadata generated by the moc
diff --git a/examples/xform/xform.doc b/examples/xform/xform.doc
new file mode 100644
index 000000000..4bca655da
--- /dev/null
+++ b/examples/xform/xform.doc
@@ -0,0 +1,17 @@
+/*
+*/
+/*! \page xform-example.html
+
+ \ingroup examples
+ \title Transformed Graphics Demo
+
+ This example lets the user rotate, shear and scale text and graphics
+ arbitrarily.
+
+ <hr>
+
+ Implementation:
+
+ \include xform/xform.cpp
+*/
+
diff --git a/examples/xform/xform.pro b/examples/xform/xform.pro
new file mode 100644
index 000000000..a9c98784e
--- /dev/null
+++ b/examples/xform/xform.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = xform
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = xform.cpp