diff options
Diffstat (limited to 'karbon/widgets/vstrokefillpreview.cpp')
-rw-r--r-- | karbon/widgets/vstrokefillpreview.cpp | 447 |
1 files changed, 447 insertions, 0 deletions
diff --git a/karbon/widgets/vstrokefillpreview.cpp b/karbon/widgets/vstrokefillpreview.cpp new file mode 100644 index 00000000..f69d5d85 --- /dev/null +++ b/karbon/widgets/vstrokefillpreview.cpp @@ -0,0 +1,447 @@ +/* This file is part of the KDE project + Copyright (C) 2002 - 2005, The Karbon Developers + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#include <tqcolor.h> + +#include <kdebug.h> +#include <KoPoint.h> + +#include "karbon_part.h" +#include "vcolordlg.h" +#include "vfill.h" +#include "vfillcmd.h" +#include "vkopainter.h" +#include "vselection.h" +#include "vstroke.h" +#include "vstrokecmd.h" +#include "vstrokefillpreview.h" + +#define PANEL_SIZEX 50.0 +#define PANEL_SIZEY 50.0 + +#define FILL_TOPX 15.0 +#define FILL_TOPY 15.0 +#define FILL_BOTTOMX 45.0 +#define FILL_BOTTOMY 45.0 + +#define STROKE_TOPX 5.0 +#define STROKE_TOPY 5.0 +#define STROKE_BOTTOMX 35.0 +#define STROKE_BOTTOMY 35.0 + +#define STROKE_TOPX_INNER STROKE_TOPX + 4 +#define STROKE_TOPY_INNER STROKE_TOPY + 4 +#define STROKE_BOTTOMX_INNER STROKE_BOTTOMX - 4 +#define STROKE_BOTTOMY_INNER STROKE_BOTTOMY - 4 + + +VStrokeFillPreview::VStrokeFillPreview( + KarbonPart *part, TQWidget* parent, const char* name ) + : TQFrame( parent, name ), m_part( part ) +{ + m_strokeWidget = false; + setFocusPolicy( TQ_NoFocus ); + + setFrameStyle( TQFrame::GroupBoxPanel | TQFrame::Sunken ); + + installEventFilter( this ); + m_pixmap.resize( int( PANEL_SIZEX ), int( PANEL_SIZEY ) ); + m_painter = new VKoPainter( TQT_TQPAINTDEVICE(&m_pixmap), uint( PANEL_SIZEX ), uint( PANEL_SIZEY ) ); +} + +VStrokeFillPreview::~VStrokeFillPreview() +{ + delete( m_painter ); +} + +void +VStrokeFillPreview::paintEvent( TQPaintEvent* event ) +{ + bitBlt( this, + (int)( width() - PANEL_SIZEX ) / 2, (int)( height() - PANEL_SIZEY ) / 2, + &m_pixmap, + 0, 0, (int)PANEL_SIZEX, (int)PANEL_SIZEY ); + + TQFrame::paintEvent( event ); +} + +bool +VStrokeFillPreview::eventFilter( TQObject *, TQEvent *event ) +{ + TQMouseEvent* e = TQT_TQMOUSEEVENT( event ); + + int ex = e->x() - int( ( width() - PANEL_SIZEX ) / 2 ); + int ey = e->y() - int( ( height() - PANEL_SIZEY ) / 2 ); + + if( event && event->type() == TQEvent::MouseButtonPress ) + { + if ( m_strokeWidget ) + { + if( + ex >= STROKE_TOPX && ex <= STROKE_BOTTOMX && + ey >= STROKE_TOPY && ey <= STROKE_BOTTOMY ) + { + m_strokeWidget = true; + emit strokeSelected(); + } + else if( + ex >= FILL_TOPX && ex <= FILL_BOTTOMX && + ey >= FILL_TOPY && ey <= FILL_BOTTOMY ) + { + m_strokeWidget = false; + emit fillSelected(); + } + } + else + { + if( + ex >= FILL_TOPX && ex <= FILL_BOTTOMX && + ey >= FILL_TOPY && ey <= FILL_BOTTOMY ) + { + m_strokeWidget = false; + emit fillSelected(); + } + else if( + ex >= STROKE_TOPX && ex <= STROKE_BOTTOMX && + ey >= STROKE_TOPY && ey <= STROKE_BOTTOMY ) + { + m_strokeWidget = true; + emit strokeSelected(); + } + } + update( m_stroke, m_fill ); + } + + if( event && event->type() == TQEvent::MouseButtonDblClick ) + { + if( + ex >= FILL_TOPX && ex <= FILL_BOTTOMX && + ey >= FILL_TOPY && ey <= FILL_BOTTOMY ) + { + VColorDlg* dialog = new VColorDlg( m_fill.color(), this ); + if( dialog->exec() == TQDialog::Accepted ) + { + if( m_part && m_part->document().selection() ) m_part->addCommand( new VFillCmd( &m_part->document(), VFill( dialog->Color() ) ), true ); + } + delete dialog; + } + else if( + ex >= STROKE_TOPX && ex <= STROKE_BOTTOMX + && ey >= STROKE_TOPY && ey <= STROKE_BOTTOMY ) + { + VColorDlg* dialog = new VColorDlg( m_stroke.color(), this ); + if( dialog->exec() == TQDialog::Accepted ) + { + if( m_part && m_part->document().selection() ) m_part->addCommand( new VStrokeCmd( &m_part->document(), dialog->Color() ), true ); + } + delete dialog; + } + } + return false; +} + +void +VStrokeFillPreview::update( const VStroke &s, const VFill &f ) +{ + m_painter->begin(); + + if( &f ) + m_fill = f; + else + m_fill = VFill(); + if( &s ) + m_stroke = s; + else + m_stroke = VStroke(); + + // draw checkerboard + VFill fill; + m_painter->setPen( TQt::NoPen ); + + for( unsigned char y = 0; y < PANEL_SIZEY; y += 10 ) + for( unsigned char x = 0; x < PANEL_SIZEX; x += 10 ) + { + fill.setColor( ( ( ( x + y ) % 20 ) == 0 ) ? TQColor( 180, 180, 180 ) : TQColor( 100, 100, 100 ) ); + m_painter->setBrush( fill ); + m_painter->drawRect( x, y, 10, 10 ); + } + + if ( m_strokeWidget ) + { + drawFill( m_fill ); + drawStroke( m_stroke ); + } + else + { + drawStroke( m_stroke ); + drawFill( m_fill ); + } + + m_painter->end(); + + repaint(); +} + +void +VStrokeFillPreview::drawFill( const VFill &f ) +{ + VStroke stroke; + + if( f.type() != VFill::none ) + { + if( f.type() != VFill::solid ) + { + VFill fill; + fill = f; + + if( f.type() == VFill::grad ) + { + if( f.gradient().type() == VGradient::linear ) + { + fill.gradient().setOrigin( KoPoint( 30, 20 ) ); + fill.gradient().setVector( KoPoint( 30, 50 ) ); + } + else if( f.gradient().type() == VGradient::radial || + f.gradient().type() == VGradient::conic ) + { + fill.gradient().setOrigin( KoPoint( 30, 35 ) ); + fill.gradient().setFocalPoint( KoPoint( 30, 35 ) ); + fill.gradient().setVector( KoPoint( 30, 50 ) ); + } + } + if( f.type() == VFill::patt ) + { + fill.pattern() = f.pattern(); + fill.pattern().setOrigin( KoPoint( 20, 10 ) ); + fill.pattern().setVector( KoPoint( 30, 10 ) ); + fill.setType( VFill::patt ); + } + + m_painter->setBrush( fill ); + } + else + m_painter->setBrush( f ); + m_painter->setPen( TQt::NoPen ); + m_painter->drawRect( KoRect( FILL_TOPX, FILL_TOPY, FILL_BOTTOMX - FILL_TOPX, FILL_BOTTOMY - FILL_TOPY ) ); + } + else + { + VFill fill; + fill.setColor( TQt::white ); + m_painter->setBrush( fill ); + m_painter->setPen( TQt::NoPen ); + + m_painter->drawRect( KoRect( FILL_TOPX, FILL_TOPY, + FILL_BOTTOMX - FILL_TOPX, + FILL_BOTTOMY - FILL_TOPY ) ); + } + + // show 3D outline of fill part + VColor color; + + m_painter->setBrush( TQt::NoBrush ); + color.set( 1.0, 1.0, 1.0 ); + stroke.setColor( color ); + m_painter->setPen( stroke ); + + m_painter->newPath(); + m_painter->moveTo( KoPoint( FILL_BOTTOMX, FILL_TOPY ) ); + m_painter->lineTo( KoPoint( FILL_TOPX, FILL_TOPY ) ); + m_painter->lineTo( KoPoint( FILL_TOPX, FILL_BOTTOMY ) ); + m_painter->strokePath(); + + color.set( 0.5, 0.5, 0.5 ); + stroke.setColor( color ); + m_painter->setPen( stroke ); + + m_painter->newPath(); + m_painter->moveTo( KoPoint( FILL_BOTTOMX, FILL_TOPY ) ); + m_painter->lineTo( KoPoint( FILL_BOTTOMX, FILL_BOTTOMY ) ); + m_painter->lineTo( KoPoint( FILL_TOPX, FILL_BOTTOMY ) ); + m_painter->strokePath(); + + if( f.type() == VFill::none ) + { + stroke.setColor( TQt::red ); + m_painter->setPen( stroke ); + m_painter->newPath(); + m_painter->moveTo( KoPoint( FILL_BOTTOMX, FILL_TOPY ) ); + m_painter->lineTo( KoPoint( FILL_TOPX, FILL_BOTTOMY ) ); + m_painter->strokePath(); + } +} + +void +VStrokeFillPreview::drawStroke( const VStroke &s ) +{ + VStroke stroke; + stroke.setLineWidth( 2.0 ); + + m_painter->setPen( TQt::NoPen ); + + if( s.type() != VStroke::none ) + { + VFill fill; + + if( s.type() != VStroke::solid ) + { + if( s.type() == VStroke::grad ) + { + fill.gradient() = s.gradient(); + + if( s.gradient().type() == VGradient::linear ) + { + fill.gradient().setOrigin( KoPoint( FILL_TOPX, 10 ) ); + fill.gradient().setVector( KoPoint( FILL_TOPX, 40 ) ); + } + else if( s.gradient().type() == VGradient::radial || + s.gradient().type() == VGradient::conic ) + { + fill.gradient().setOrigin( KoPoint( FILL_TOPX, 25 ) ); + fill.gradient().setFocalPoint( KoPoint( FILL_TOPX, 25 ) ); + fill.gradient().setVector( KoPoint( FILL_TOPX, 40 ) ); + } + + fill.setType( VFill::grad ); + } + if( s.type() == VStroke::patt ) + { + fill.pattern() = s.pattern(); + fill.pattern().setOrigin( KoPoint( FILL_TOPX, 10 ) ); + fill.pattern().setVector( KoPoint( FILL_TOPX, 40 ) ); + fill.setType( VFill::patt ); + } + } + else + fill.setColor( s.color() ); + + m_painter->setFillRule( evenOdd ); + + m_painter->setBrush( fill ); + + m_painter->newPath(); + m_painter->moveTo( KoPoint( STROKE_TOPX, STROKE_TOPY ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX, STROKE_TOPY ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX, STROKE_BOTTOMY ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_BOTTOMY ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_TOPY ) ); + + m_painter->moveTo( KoPoint( STROKE_TOPX_INNER, STROKE_TOPY_INNER ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER, STROKE_TOPY_INNER ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER, STROKE_BOTTOMY_INNER ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX_INNER, STROKE_BOTTOMY_INNER ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX_INNER, STROKE_TOPY_INNER ) ); + m_painter->fillPath(); + } + else + { + VFill fill; + m_painter->setFillRule( evenOdd ); + fill.setColor( TQt::white ); + + m_painter->setBrush( fill ); + m_painter->setPen( TQt::NoPen ); + + m_painter->newPath(); + m_painter->moveTo( KoPoint( STROKE_TOPX, STROKE_TOPY ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX, STROKE_TOPY ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX, STROKE_BOTTOMY ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_BOTTOMY ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_TOPY ) ); + + m_painter->moveTo( KoPoint( STROKE_TOPX_INNER, STROKE_TOPY_INNER ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER, STROKE_TOPY_INNER ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER, STROKE_BOTTOMY_INNER ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX_INNER, STROKE_BOTTOMY_INNER ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX_INNER, STROKE_TOPY_INNER ) ); + m_painter->fillPath(); + } + + // show 3D outline of stroke part + VColor color; + + color.set( 1.0, 1.0, 1.0 ); + stroke.setColor( color ); + m_painter->setBrush( TQt::NoBrush ); + m_painter->setPen( stroke ); + + m_painter->newPath(); + m_painter->moveTo( KoPoint( STROKE_BOTTOMX + 1, STROKE_TOPY - 1 ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX - 1, STROKE_TOPY - 1 ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX - 1, STROKE_BOTTOMY + 1 ) ); + m_painter->strokePath(); + + color.set( 0.5, 0.5, 0.5 ); + stroke.setColor( color ); + m_painter->setPen( stroke ); + + m_painter->newPath(); + m_painter->moveTo( KoPoint( STROKE_BOTTOMX + 1, STROKE_TOPY - 1 ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX + 1, STROKE_BOTTOMY + 1 ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX - 1, STROKE_BOTTOMY + 1 ) ); + m_painter->strokePath(); + + //stroke.setColor( TQt::black.rgb() ); + //m_painter->setPen( stroke ); + m_painter->newPath(); + m_painter->moveTo( KoPoint( STROKE_BOTTOMX_INNER - 1, STROKE_TOPY_INNER + 1 ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX_INNER + 1, STROKE_TOPY_INNER + 1 ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX_INNER + 1, STROKE_BOTTOMY_INNER - 1 ) ); + m_painter->strokePath(); + + color.set( 1.0, 1.0, 1.0 ); + stroke.setColor( color ); + m_painter->setPen( stroke ); + + m_painter->newPath(); + m_painter->moveTo( KoPoint( STROKE_BOTTOMX_INNER - 1, STROKE_TOPY_INNER + 1 ) ); + m_painter->lineTo( KoPoint( STROKE_BOTTOMX_INNER - 1, STROKE_BOTTOMY_INNER - 1 ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX_INNER + 1, STROKE_BOTTOMY_INNER - 1 ) ); + m_painter->strokePath(); + + if( s.type() == VStroke::none ) + { + stroke.setColor( TQt::red ); + m_painter->setPen( stroke ); + + m_painter->newPath(); + m_painter->moveTo( KoPoint( STROKE_BOTTOMX, STROKE_TOPY ) ); + m_painter->lineTo( KoPoint( STROKE_TOPX, STROKE_BOTTOMY ) ); + m_painter->strokePath(); + } +} + +void +VStrokeFillPreview::setFillSelected() +{ + m_strokeWidget = false; + update( m_stroke, m_fill ); + emit fillSelected(); +} + +void +VStrokeFillPreview::setStrokeSelected() +{ + m_strokeWidget = true; + update( m_stroke, m_fill ); + emit strokeSelected(); +} + +#include "vstrokefillpreview.moc" + |