00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
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
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
00398
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