summaryrefslogtreecommitdiffstats
path: root/karbon/widgets/vgradienttabwidget.cc
diff options
context:
space:
mode:
Diffstat (limited to 'karbon/widgets/vgradienttabwidget.cc')
-rw-r--r--karbon/widgets/vgradienttabwidget.cc343
1 files changed, 343 insertions, 0 deletions
diff --git a/karbon/widgets/vgradienttabwidget.cc b/karbon/widgets/vgradienttabwidget.cc
new file mode 100644
index 00000000..44bb53bc
--- /dev/null
+++ b/karbon/widgets/vgradienttabwidget.cc
@@ -0,0 +1,343 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001, 2002, 2003 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 <qlabel.h>
+#include <qpainter.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+#include <qfileinfo.h>
+#include <qpixmap.h>
+
+#include <knuminput.h>
+#include <kcombobox.h>
+#include <klocale.h>
+#include <klistbox.h>
+#include <kiconloader.h>
+
+#include "vgradientwidget.h"
+#include "vgradienttabwidget.h"
+#include "karbon_resourceserver.h"
+#include "vkopainter.h"
+#include "vfill.h"
+
+VGradientListItem::VGradientListItem( const VGradient& gradient, QString filename )
+ : QListBoxItem( 0L ), m_filename( filename )
+{
+ m_gradient = new VGradient( gradient );
+
+ m_pixmap.resize( 200, 16 );
+ VKoPainter gp( &m_pixmap, m_pixmap.width(), m_pixmap.height() );
+ gp.setRasterOp( Qt::XorROP );
+ gp.newPath();
+ VGradient grad( *m_gradient );
+ grad.setOrigin( KoPoint( 0, 0 ) );
+ grad.setVector( KoPoint( m_pixmap.width() - 1, 0 ) );
+ grad.setType( VGradient::linear );
+ VFill fill;
+ fill.gradient() = grad;
+ fill.setType( VFill::grad );
+ gp.setBrush( fill );
+ gp.moveTo( KoPoint( 0, 0 ) );
+ gp.lineTo( KoPoint( 0, m_pixmap.height() - 1 ) );
+ gp.lineTo( KoPoint( m_pixmap.width() - 1, m_pixmap.height() - 1 ) );
+ gp.lineTo( KoPoint( m_pixmap.width() - 1, 0 ) );
+ gp.lineTo( KoPoint( 0, 0 ) );
+ gp.fillPath();
+ gp.end();
+
+ m_delete = QFileInfo( filename ).isWritable();
+} // VGradientListItem::VGradientListItem
+
+VGradientListItem::VGradientListItem( const VGradientListItem& gradient )
+ : QListBoxItem( 0L )
+{
+ m_pixmap = gradient.m_pixmap;
+ m_delete = gradient.m_delete;
+ m_gradient = new VGradient( *gradient.gradient() );
+ m_filename = gradient.m_filename;
+} // VGradientListItem::VGradientListItem
+
+VGradientListItem::~VGradientListItem()
+{
+ delete m_gradient;
+} // VGradientListItem::~VGradientListItem
+
+int VGradientListItem::width( const QListBox* lb ) const
+{
+ return lb->width() - 25;
+} // VGradientListItem::width
+
+void VGradientListItem::paint( QPainter* painter )
+{
+ painter->save();
+ painter->setRasterOp( Qt::CopyROP );
+ QRect r ( 0, 0, width( listBox() ), height( listBox() ) );
+ painter->scale( ( (float)( width( listBox() ) ) ) / 200., 1. );
+ painter->drawPixmap( 0, 0, m_pixmap );
+ painter->restore();
+ if ( isSelected() )
+ painter->setPen( listBox()->colorGroup().highlightedText() );
+ else
+ painter->setPen( listBox()->colorGroup().base() );
+ painter->drawRect( r );
+ painter->flush();
+} // VGradientListItem::paint
+
+VGradientPreview::VGradientPreview( VGradient& gradient, double& opacity, QWidget* parent, const char* name )
+ : QWidget( parent, name ), m_gradient( &gradient ), m_opacity( &opacity )
+{
+ setBackgroundMode( Qt::NoBackground );
+ setMinimumSize( 70, 70 );
+} // VGradientPreview::VGradientPreview
+
+VGradientPreview::~VGradientPreview()
+{
+} // VGradientPreview::~VGradientPreview
+
+void VGradientPreview::paintEvent( QPaintEvent* )
+{
+ QPixmap pixmap( width(), height() );
+ VKoPainter gp( &pixmap, width(), height() );
+ gp.setRasterOp( Qt::XorROP );
+ gp.newPath();
+ VGradient gradient( *m_gradient );
+ if( gradient.type() == VGradient::radial || gradient.type() == VGradient::conic )
+ {
+ gradient.setOrigin( KoPoint( width() / 2, height() / 2 ) );
+ gradient.setFocalPoint( KoPoint( width() / 2, height() / 2 ) );
+ gradient.setVector( KoPoint( width() / 4, height() / 4 ) );
+ }
+ else
+ {
+ gradient.setOrigin( KoPoint( width() / 3, 2 * ( height() / 3 ) ) );
+ gradient.setVector( KoPoint( 2 * ( width() / 3 ), height() / 3 ) );
+ }
+ VFill fill;
+ KIconLoader il;
+ fill.pattern() = VPattern( il.iconPath( "karbon.png", KIcon::Small ) );
+ fill.setType( VFill::patt );
+ gp.setBrush( fill );
+ gp.fillPath();
+ fill.gradient() = gradient;
+ fill.setType( VFill::grad );
+ VColor c = fill.color();
+ c.setOpacity( *m_opacity );
+ fill.setColor( c, false );
+ gp.setBrush( fill );
+ gp.moveTo( KoPoint( 2, 2 ) );
+ gp.lineTo( KoPoint( 2, height() - 2 ) );
+ gp.lineTo( KoPoint( width() - 2, height() - 2 ) );
+ gp.lineTo( KoPoint( width() - 2, 2 ) );
+ gp.lineTo( KoPoint( 2, 2 ) );
+ gp.fillPath();
+ gp.end();
+
+ QPainter p( &pixmap );
+
+ p.setPen( colorGroup().light() );
+ p.moveTo( 1, height() - 1 );
+ p.lineTo( 1, 1 );
+ p.lineTo( width() - 1, 1 );
+ p.lineTo( width() - 1, height() - 1 );
+ p.lineTo( 1, height() - 1 );
+ p.setPen( colorGroup().dark() );
+ p.moveTo( 0, height() - 1 );
+ p.lineTo( 0, 0 );
+ p.lineTo( width() - 1, 0 );
+ p.moveTo( width() - 2, 2 );
+ p.lineTo( width() - 2, height() - 2 );
+ p.lineTo( 2, height() - 2 );
+ bitBlt( this, 0, 0, &pixmap, 0, 0, width(), height() );
+} // VGradientPreview::paintEvent
+
+VGradientTabWidget::VGradientTabWidget( VGradient& gradient, KarbonResourceServer* server, QWidget* parent, const char* name )
+ : QTabWidget( parent, name ), m_gradient( gradient ), m_resourceServer( server )
+{
+ setupUI();
+ setupConnections();
+ initUI();
+} // VGradientTabWidget::VGradientTabWidget
+
+VGradientTabWidget::~VGradientTabWidget()
+{
+} // VGradientTabWidget::~VGradientTabWidget
+
+void VGradientTabWidget::setupUI()
+{
+ m_editGroup = new QGroupBox( i18n( "Edit Gradient" ) );
+ QGridLayout* editLayout = new QGridLayout( m_editGroup, 7, 3 );
+ editLayout->setSpacing( 3 );
+ editLayout->setMargin( 6 );
+ editLayout->addRowSpacing( 0, 12 );
+ editLayout->addMultiCellWidget( m_gradientPreview = new VGradientPreview( m_gradient, m_gradOpacity, m_editGroup ), 1, 3, 0, 0 );
+ editLayout->addWidget( new QLabel( i18n( "Type:" ), m_editGroup ), 1, 1 );
+ editLayout->addWidget( new QLabel( i18n( "Repeat:" ), m_editGroup ), 2, 1 );
+ editLayout->addWidget( new QLabel( i18n( "Target:" ), m_editGroup ), 3, 1 );
+ editLayout->addWidget( m_gradientType = new KComboBox( false, m_editGroup ), 1, 2 );
+ m_gradientType->insertItem( i18n( "Linear" ), 0 );
+ m_gradientType->insertItem( i18n( "Radial" ), 1 );
+ m_gradientType->insertItem( i18n( "Conical" ), 2 );
+ editLayout->addWidget( m_gradientRepeat = new KComboBox( false, m_editGroup ), 2, 2 );
+ m_gradientRepeat->insertItem( i18n( "None" ), 0 );
+ m_gradientRepeat->insertItem( i18n( "Reflect" ), 1 );
+ m_gradientRepeat->insertItem( i18n( "Repeat" ), 2 );
+ editLayout->addWidget( m_gradientTarget = new KComboBox( false, m_editGroup ), 3, 2 );
+ m_gradientTarget->insertItem( i18n( "Stroke" ), 0 );
+ m_gradientTarget->insertItem( i18n( "Fill" ), 1 );
+ editLayout->addMultiCellWidget( m_addToPredefs = new QPushButton( i18n( "&Add to Predefined Gradients" ), m_editGroup ), 6, 6, 0, 2 );
+ editLayout->addMultiCellWidget( m_gradientWidget = new VGradientWidget( m_gradient, m_editGroup ), 4, 4, 0, 2 );
+ editLayout->addWidget( new QLabel( i18n( "Overall opacity:" ), m_editGroup ), 5, 0 );
+ m_opacity = new KIntNumInput( 100, m_editGroup );
+ m_opacity->setRange( 0, 100, 1, true );
+ m_opacity->setValue( 100 );
+ editLayout->addMultiCellWidget( m_opacity, 5, 5, 1, 2 );
+ addTab( m_editGroup, i18n( "Edit" ) );
+
+ QGroupBox* predefGroup = new QGroupBox( i18n( "Predefined Gradients" ) );
+ QGridLayout* predefLayout = new QGridLayout( predefGroup, 3, 2 );
+ predefLayout->setSpacing( 3 );
+ predefLayout->setMargin( 6 );
+ predefLayout->addRowSpacing( 0, 12 );
+ predefLayout->addMultiCellWidget( m_predefGradientsView = new KListBox( predefGroup ), 1, 1, 0, 2 );
+ predefLayout->addWidget( m_predefDelete = new QPushButton( i18n( "&Delete" ), predefGroup ), 2, 0 );
+ predefLayout->addWidget( m_predefImport = new QPushButton( i18n( "&Import" ), predefGroup ), 2, 1 );
+ m_predefImport->setEnabled( false );
+ addTab( predefGroup, i18n( "Predefined" ) );
+} // VGradientTabWidget::setupUI
+
+void VGradientTabWidget::setupConnections()
+{
+ connect( m_gradientType, SIGNAL( activated( int ) ), this, SLOT( combosChange( int ) ) );
+ connect( m_gradientRepeat, SIGNAL( activated( int ) ), this, SLOT( combosChange( int ) ) );
+ connect( m_gradientWidget, SIGNAL( changed() ), m_gradientPreview, SLOT( update() ) );
+ connect( m_addToPredefs, SIGNAL( clicked() ), this, SLOT( addGradientToPredefs() ) );
+ connect( m_predefGradientsView, SIGNAL( doubleClicked( QListBoxItem *, const QPoint & ) ), this, SLOT( changeToPredef( QListBoxItem* ) ) );
+ connect( m_predefDelete, SIGNAL( clicked() ), this, SLOT( deletePredef() ) );
+ connect( m_opacity, SIGNAL( valueChanged( int ) ), this, SLOT( opacityChanged( int ) ) );
+} // VGradientTabWidget::setupConnection
+
+void VGradientTabWidget::initUI()
+{
+ m_gradientType->setCurrentItem( m_gradient.type() );
+ m_gradientRepeat->setCurrentItem( m_gradient.repeatMethod() );
+ m_gradientTarget->setCurrentItem( FILL );
+ m_opacity->setValue( 100 );
+
+ m_predefGradientsView->clear();
+ QPtrList<VGradientListItem>* gradientList = m_resourceServer->gradients();
+ if( gradientList->count() > 0 )
+ for( VGradientListItem* g = gradientList->first(); g != NULL; g = gradientList->next() )
+ m_predefGradientsView->insertItem( new VGradientListItem( *g ) );
+} // VGradientTabWidget::initUI
+
+double
+VGradientTabWidget::opacity() const
+{
+ return m_opacity->value() / 100.0;
+}
+
+void
+VGradientTabWidget::setOpacity( double opacity )
+{
+ if( opacity < 0.0 || opacity > 1.0 )
+ return;
+
+ m_gradOpacity = opacity;
+ m_opacity->setValue( int(opacity*100.0) );
+}
+
+const VGradient&
+VGradientTabWidget::gradient()
+{
+ return m_gradient;
+} // VGradientTabWidget::gradient
+
+void VGradientTabWidget::setGradient( VGradient& gradient )
+{
+ m_gradient = gradient;
+
+ initUI();
+} // VGradientTabWidget::setGradient
+
+VGradientTabWidget::VGradientTarget VGradientTabWidget::target()
+{
+ return (VGradientTarget)m_gradientTarget->currentItem();
+} // VGradientTabWidget::target
+
+void VGradientTabWidget::setTarget( VGradientTarget target )
+{
+ m_gradientTarget->setCurrentItem( target );
+} // VGradientTabWidget::setTarget
+
+void VGradientTabWidget::combosChange( int )
+{
+ m_gradient.setType( (VGradient::VGradientType)m_gradientType->currentItem() );
+ m_gradient.setRepeatMethod( (VGradient::VGradientRepeatMethod)m_gradientRepeat->currentItem() );
+
+ m_gradientPreview->update();
+} // VGradientTabWidget::combosChange
+
+void VGradientTabWidget::opacityChanged( int value )
+{
+ m_gradOpacity = value / 100.0;
+ m_gradientPreview->update();
+}
+
+void VGradientTabWidget::addGradientToPredefs()
+{
+ VGradientListItem* item = m_resourceServer->addGradient( new VGradient( m_gradient ) );
+ m_predefGradientsView->insertItem( item );
+} // VGradientTabWidget::addGradientToPredefs()
+
+void VGradientTabWidget::predefSelected( QListBoxItem* item )
+{
+ if( item )
+ {
+ VGradientListItem* gradientItem = (VGradientListItem*)item;
+ m_predefDelete->setEnabled( gradientItem->canDelete() );
+ }
+} // VGradientTabWidget::predefSelected
+
+void VGradientTabWidget::changeToPredef( QListBoxItem* item )
+{
+ if( item )
+ {
+ VGradientListItem* gradientItem = (VGradientListItem*)item;
+ m_gradient = *gradientItem->gradient();
+ m_gradientType->setCurrentItem( m_gradient.type() );
+ m_gradientRepeat->setCurrentItem( m_gradient.repeatMethod() );
+ m_opacity->setValue( 100 );
+ m_gradientPreview->update();
+ m_gradientWidget->update();
+ showPage( m_editGroup );
+ }
+} // VGradientTabWidget::changeToPredef
+
+void VGradientTabWidget::deletePredef()
+{
+ int i = m_predefGradientsView->currentItem();
+ if( !m_predefGradientsView->item( i ) )
+ return;
+ m_resourceServer->removeGradient( (VGradientListItem*)m_predefGradientsView->item( i ) );
+ m_predefGradientsView->removeItem( i );
+} // VGradientTabWidget::deletePredef
+
+#include "vgradienttabwidget.moc"
+