karbon

vstrokefillpreview.cc

00001 /* This file is part of the KDE project
00002    Copyright (C) 2002 - 2005, The Karbon Developers
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018 */
00019 
00020 #include <qcolor.h>
00021 
00022 #include <kdebug.h>
00023 #include <KoPoint.h>
00024 
00025 #include "karbon_part.h"
00026 #include "vcolordlg.h"
00027 #include "vfill.h"
00028 #include "vfillcmd.h"
00029 #include "vkopainter.h"
00030 #include "vselection.h"
00031 #include "vstroke.h"
00032 #include "vstrokecmd.h"
00033 #include "vstrokefillpreview.h"
00034 
00035 #define PANEL_SIZEX     50.0
00036 #define PANEL_SIZEY     50.0
00037 
00038 #define FILL_TOPX       15.0
00039 #define FILL_TOPY       15.0
00040 #define FILL_BOTTOMX        45.0
00041 #define FILL_BOTTOMY        45.0
00042 
00043 #define STROKE_TOPX     5.0
00044 #define STROKE_TOPY     5.0
00045 #define STROKE_BOTTOMX      35.0
00046 #define STROKE_BOTTOMY      35.0
00047 
00048 #define STROKE_TOPX_INNER   STROKE_TOPX + 4
00049 #define STROKE_TOPY_INNER   STROKE_TOPY + 4
00050 #define STROKE_BOTTOMX_INNER    STROKE_BOTTOMX - 4
00051 #define STROKE_BOTTOMY_INNER    STROKE_BOTTOMY - 4
00052 
00053 
00054 VStrokeFillPreview::VStrokeFillPreview(
00055     KarbonPart *part, QWidget* parent, const char* name )
00056         : QFrame( parent, name ), m_part( part )
00057 {
00058     m_strokeWidget = false;
00059     setFocusPolicy( QWidget::NoFocus );
00060 
00061 #if QT_VERSION < 0x030100
00062     setFrameStyle( QFrame::Panel | QFrame::Sunken );
00063 #else
00064     setFrameStyle( QFrame::GroupBoxPanel | QFrame::Sunken );
00065 #endif
00066 
00067     installEventFilter( this );
00068     m_pixmap.resize( int( PANEL_SIZEX ), int( PANEL_SIZEY ) );
00069     m_painter = new VKoPainter( &m_pixmap, uint( PANEL_SIZEX ), uint( PANEL_SIZEY ) );
00070 }
00071 
00072 VStrokeFillPreview::~VStrokeFillPreview()
00073 {
00074     delete( m_painter );
00075 }
00076 
00077 void
00078 VStrokeFillPreview::paintEvent( QPaintEvent* event )
00079 {
00080         bitBlt( this,
00081                 (int)( width() - PANEL_SIZEX ) / 2, (int)( height() - PANEL_SIZEY ) / 2,
00082         &m_pixmap,
00083                 0, 0, (int)PANEL_SIZEX, (int)PANEL_SIZEY );
00084 
00085     QFrame::paintEvent( event );
00086 }
00087 
00088 bool
00089 VStrokeFillPreview::eventFilter( QObject *, QEvent *event )
00090 {
00091     QMouseEvent* e = static_cast<QMouseEvent *>( event );
00092 
00093     int ex = e->x() - int( ( width() - PANEL_SIZEX ) / 2 );
00094     int ey = e->y() - int( ( height() - PANEL_SIZEY ) / 2 );
00095 
00096     if( event && event->type() == QEvent::MouseButtonPress )
00097     {
00098         if ( m_strokeWidget )
00099         {
00100             if(
00101                 ex >= STROKE_TOPX && ex <= STROKE_BOTTOMX &&
00102                 ey >= STROKE_TOPY && ey <= STROKE_BOTTOMY )
00103             {
00104                 m_strokeWidget = true;
00105                 emit strokeSelected();
00106             }
00107             else if(
00108                 ex >= FILL_TOPX && ex <= FILL_BOTTOMX &&
00109                 ey >= FILL_TOPY && ey <= FILL_BOTTOMY )
00110             {
00111                 m_strokeWidget = false;
00112                 emit fillSelected();
00113             }
00114         }
00115         else
00116         {
00117             if(
00118                 ex >= FILL_TOPX && ex <= FILL_BOTTOMX &&
00119                 ey >= FILL_TOPY && ey <= FILL_BOTTOMY )
00120             {
00121                 m_strokeWidget = false;
00122                 emit fillSelected();
00123             }
00124             else if(
00125                 ex >= STROKE_TOPX && ex <= STROKE_BOTTOMX &&
00126                 ey >= STROKE_TOPY && ey <= STROKE_BOTTOMY )
00127             {
00128                 m_strokeWidget = true;
00129                 emit strokeSelected();
00130             }
00131         }
00132         update( *m_stroke, *m_fill );
00133     }
00134 
00135     if( event && event->type() == QEvent::MouseButtonDblClick )
00136     {
00137         if(
00138             ex >= FILL_TOPX && ex <= FILL_BOTTOMX &&
00139             ey >= FILL_TOPY && ey <= FILL_BOTTOMY )
00140         {
00141             VColorDlg* dialog = new VColorDlg( m_fill->color(), this );
00142             if( dialog->exec() == QDialog::Accepted )
00143             {
00144                 if( m_part && m_part->document().selection() ) m_part->addCommand( new VFillCmd( &m_part->document(), VFill( dialog->Color() ) ), true );
00145             }
00146             delete dialog;
00147         }
00148         else if(
00149             ex >= STROKE_TOPX && ex <= STROKE_BOTTOMX
00150             && ey >= STROKE_TOPY && ey <= STROKE_BOTTOMY )
00151         {
00152             VColorDlg* dialog = new VColorDlg( m_stroke->color(), this );
00153             if( dialog->exec() == QDialog::Accepted )
00154             {
00155                 if( m_part && m_part->document().selection() ) m_part->addCommand( new VStrokeCmd( &m_part->document(), dialog->Color() ), true );
00156             }
00157             delete dialog;
00158         }
00159     }
00160     return false;
00161 }
00162 
00163 void
00164 VStrokeFillPreview::update( const VStroke &s, const VFill &f )
00165 {
00166     m_painter->begin();
00167     m_fill = &f;
00168     m_stroke = &s;
00169 
00170     // draw checkerboard
00171     VFill fill;
00172     m_painter->setPen( Qt::NoPen );
00173 
00174     for( unsigned char y = 0; y < PANEL_SIZEY; y += 10 )
00175         for( unsigned char x = 0; x < PANEL_SIZEX; x += 10 )
00176         {
00177             fill.setColor( ( ( ( x + y ) % 20 ) == 0 ) ? QColor( 180, 180, 180 ) : QColor( 100, 100, 100 ) );
00178             m_painter->setBrush( fill );
00179             m_painter->drawRect( x, y, 10, 10 );
00180         }
00181 
00182     if ( m_strokeWidget )
00183     {
00184         drawFill( f );
00185         drawStroke( s );
00186     }
00187     else
00188     {
00189         drawStroke( s );
00190         drawFill( f );
00191     }
00192 
00193     m_painter->end();
00194 
00195     repaint();
00196 }
00197 
00198 void
00199 VStrokeFillPreview::drawFill( const VFill &f )
00200 {
00201     VStroke stroke;
00202 
00203     if( f.type() != VFill::none )
00204     {
00205         if( f.type() != VFill::solid )
00206         {
00207             VFill fill;
00208             fill = f;
00209 
00210             if( f.type() == VFill::grad )
00211             {
00212                 if( f.gradient().type() == VGradient::linear )
00213                 {
00214                     fill.gradient().setOrigin( KoPoint( 30, 20 ) );
00215                     fill.gradient().setVector( KoPoint( 30, 50 ) );
00216                 }
00217                 else if( f.gradient().type() == VGradient::radial ||
00218                          f.gradient().type() == VGradient::conic )
00219                 {
00220                     fill.gradient().setOrigin( KoPoint( 30, 35 ) );
00221                     fill.gradient().setFocalPoint( KoPoint( 30, 35 ) );
00222                     fill.gradient().setVector( KoPoint( 30, 50 ) );
00223                 }
00224             }
00225             if( f.type() == VFill::patt )
00226             {
00227                 fill.pattern() = f.pattern();
00228                 fill.pattern().setOrigin( KoPoint( 20, 10 ) );
00229                 fill.pattern().setVector( KoPoint( 30, 10 ) );
00230                 fill.setType( VFill::patt );
00231             }
00232 
00233             m_painter->setBrush( fill );
00234         }
00235         else
00236             m_painter->setBrush( f );
00237         m_painter->setPen( Qt::NoPen );
00238         m_painter->drawRect( KoRect( FILL_TOPX, FILL_TOPY, FILL_BOTTOMX - FILL_TOPX, FILL_BOTTOMY - FILL_TOPY ) );
00239     }
00240     else
00241     {
00242         VFill fill;
00243         fill.setColor( Qt::white );
00244         m_painter->setBrush( fill );
00245         m_painter->setPen( Qt::NoPen );
00246 
00247         m_painter->drawRect( KoRect(    FILL_TOPX, FILL_TOPY,
00248                                         FILL_BOTTOMX - FILL_TOPX,
00249                                         FILL_BOTTOMY - FILL_TOPY ) );
00250     }
00251 
00252     // show 3D outline of fill part
00253     VColor color;
00254 
00255     m_painter->setBrush( Qt::NoBrush );
00256     color.set( 1.0, 1.0, 1.0 );
00257     stroke.setColor( color );
00258     m_painter->setPen( stroke );
00259 
00260     m_painter->newPath();
00261     m_painter->moveTo( KoPoint( FILL_BOTTOMX, FILL_TOPY ) );
00262     m_painter->lineTo( KoPoint( FILL_TOPX, FILL_TOPY ) );
00263     m_painter->lineTo( KoPoint( FILL_TOPX, FILL_BOTTOMY ) );
00264     m_painter->strokePath();
00265 
00266     color.set( 0.5, 0.5, 0.5 );
00267     stroke.setColor( color );
00268     m_painter->setPen( stroke );
00269 
00270     m_painter->newPath();
00271     m_painter->moveTo( KoPoint( FILL_BOTTOMX, FILL_TOPY ) );
00272     m_painter->lineTo( KoPoint( FILL_BOTTOMX, FILL_BOTTOMY ) );
00273     m_painter->lineTo( KoPoint( FILL_TOPX, FILL_BOTTOMY ) );
00274     m_painter->strokePath();
00275 
00276     if( f.type() == VFill::none )
00277     {
00278         stroke.setColor( Qt::red );
00279         m_painter->setPen( stroke );
00280         m_painter->newPath();
00281         m_painter->moveTo( KoPoint( FILL_BOTTOMX, FILL_TOPY ) );
00282         m_painter->lineTo( KoPoint( FILL_TOPX, FILL_BOTTOMY ) );
00283         m_painter->strokePath();
00284     }
00285 }
00286 
00287 void
00288 VStrokeFillPreview::drawStroke( const VStroke &s )
00289 {
00290     VStroke stroke;
00291     stroke.setLineWidth( 2.0 );
00292 
00293     m_painter->setPen( Qt::NoPen );
00294 
00295     if( s.type() != VStroke::none )
00296     {
00297         VFill fill;
00298 
00299         if( s.type() != VStroke::solid )
00300         {
00301             if( s.type() == VStroke::grad )
00302             {
00303                 fill.gradient() = s.gradient();
00304 
00305                 if( s.gradient().type() == VGradient::linear )
00306                 {
00307                     fill.gradient().setOrigin( KoPoint( FILL_TOPX, 10 ) );
00308                     fill.gradient().setVector( KoPoint( FILL_TOPX, 40 ) );
00309                 }
00310                 else if( s.gradient().type() == VGradient::radial ||
00311                          s.gradient().type() == VGradient::conic )
00312                 {
00313                     fill.gradient().setOrigin( KoPoint( FILL_TOPX, 25 ) );
00314                     fill.gradient().setFocalPoint( KoPoint( FILL_TOPX, 25 ) );
00315                     fill.gradient().setVector( KoPoint( FILL_TOPX, 40 ) );
00316                 }
00317 
00318                 fill.setType( VFill::grad );
00319             }
00320             if( s.type() == VStroke::patt )
00321             {
00322                 fill.pattern() = s.pattern();
00323                 fill.pattern().setOrigin( KoPoint( FILL_TOPX, 10 ) );
00324                 fill.pattern().setVector( KoPoint( FILL_TOPX, 40 ) );
00325                 fill.setType( VFill::patt );
00326             }
00327         }
00328         else
00329             fill.setColor( s.color() );
00330 
00331         m_painter->setFillRule( evenOdd );
00332 
00333         m_painter->setBrush( fill );
00334 
00335         m_painter->newPath();
00336         m_painter->moveTo( KoPoint( STROKE_TOPX, STROKE_TOPY ) );
00337         m_painter->lineTo( KoPoint( STROKE_BOTTOMX, STROKE_TOPY ) );
00338         m_painter->lineTo( KoPoint( STROKE_BOTTOMX, STROKE_BOTTOMY ) );
00339         m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_BOTTOMY ) );
00340         m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_TOPY ) );
00341 
00342         m_painter->moveTo( KoPoint( STROKE_TOPX_INNER, STROKE_TOPY_INNER ) );
00343         m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER, STROKE_TOPY_INNER ) );
00344         m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER, STROKE_BOTTOMY_INNER ) );
00345         m_painter->lineTo( KoPoint( STROKE_TOPX_INNER, STROKE_BOTTOMY_INNER ) );
00346         m_painter->lineTo( KoPoint( STROKE_TOPX_INNER, STROKE_TOPY_INNER ) );
00347         m_painter->fillPath();
00348     }
00349     else
00350     {
00351         VFill fill;
00352         m_painter->setFillRule( evenOdd );
00353         fill.setColor( Qt::white );
00354 
00355         m_painter->setBrush( fill );
00356         m_painter->setPen( Qt::NoPen );
00357 
00358         m_painter->newPath();
00359         m_painter->moveTo( KoPoint( STROKE_TOPX, STROKE_TOPY ) );
00360         m_painter->lineTo( KoPoint( STROKE_BOTTOMX, STROKE_TOPY ) );
00361         m_painter->lineTo( KoPoint( STROKE_BOTTOMX, STROKE_BOTTOMY ) );
00362         m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_BOTTOMY ) );
00363         m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_TOPY ) );
00364 
00365         m_painter->moveTo( KoPoint( STROKE_TOPX_INNER, STROKE_TOPY_INNER ) );
00366         m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER, STROKE_TOPY_INNER ) );
00367         m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER, STROKE_BOTTOMY_INNER ) );
00368         m_painter->lineTo( KoPoint( STROKE_TOPX_INNER, STROKE_BOTTOMY_INNER ) );
00369         m_painter->lineTo( KoPoint( STROKE_TOPX_INNER, STROKE_TOPY_INNER ) );
00370         m_painter->fillPath();
00371     }
00372 
00373     // show 3D outline of stroke part
00374     VColor color;
00375 
00376     color.set( 1.0, 1.0, 1.0 );
00377     stroke.setColor( color );
00378     m_painter->setBrush( Qt::NoBrush );
00379     m_painter->setPen( stroke );
00380 
00381     m_painter->newPath();
00382     m_painter->moveTo( KoPoint( STROKE_BOTTOMX + 1, STROKE_TOPY - 1 ) );
00383     m_painter->lineTo( KoPoint( STROKE_TOPX - 1, STROKE_TOPY - 1 ) );
00384     m_painter->lineTo( KoPoint( STROKE_TOPX - 1, STROKE_BOTTOMY + 1 ) );
00385     m_painter->strokePath();
00386 
00387     color.set( 0.5, 0.5, 0.5 );
00388     stroke.setColor( color );
00389     m_painter->setPen( stroke );
00390 
00391     m_painter->newPath();
00392     m_painter->moveTo( KoPoint( STROKE_BOTTOMX + 1, STROKE_TOPY - 1 ) );
00393     m_painter->lineTo( KoPoint( STROKE_BOTTOMX + 1, STROKE_BOTTOMY + 1 ) );
00394     m_painter->lineTo( KoPoint( STROKE_TOPX - 1, STROKE_BOTTOMY + 1 ) );
00395     m_painter->strokePath();
00396 
00397     //stroke.setColor( Qt::black.rgb() );
00398     //m_painter->setPen( stroke );
00399     m_painter->newPath();
00400     m_painter->moveTo( KoPoint( STROKE_BOTTOMX_INNER - 1, STROKE_TOPY_INNER + 1 ) );
00401     m_painter->lineTo( KoPoint( STROKE_TOPX_INNER + 1, STROKE_TOPY_INNER + 1 ) );
00402     m_painter->lineTo( KoPoint( STROKE_TOPX_INNER + 1, STROKE_BOTTOMY_INNER - 1 ) );
00403     m_painter->strokePath();
00404 
00405     color.set( 1.0, 1.0, 1.0 );
00406     stroke.setColor( color );
00407     m_painter->setPen( stroke );
00408 
00409     m_painter->newPath();
00410     m_painter->moveTo( KoPoint( STROKE_BOTTOMX_INNER - 1, STROKE_TOPY_INNER + 1 ) );
00411     m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER - 1, STROKE_BOTTOMY_INNER - 1 ) );
00412     m_painter->lineTo( KoPoint( STROKE_TOPX_INNER + 1, STROKE_BOTTOMY_INNER - 1 ) );
00413     m_painter->strokePath();
00414 
00415     if( s.type() == VStroke::none )
00416     {
00417         stroke.setColor( Qt::red );
00418         m_painter->setPen( stroke );
00419 
00420         m_painter->newPath();
00421         m_painter->moveTo( KoPoint( STROKE_BOTTOMX, STROKE_TOPY ) );
00422         m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_BOTTOMY ) );
00423         m_painter->strokePath();
00424     }
00425 }
00426 
00427 #include "vstrokefillpreview.moc"
00428 
KDE Home | KDE Accessibility Home | Description of Access Keys