From kde-commits Tue Feb 28 22:14:50 2006 From: Jan Hambrecht Date: Tue, 28 Feb 2006 22:14:50 +0000 To: kde-commits Subject: koffice/karbon Message-Id: <1141164890.858938.19242.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=114123717602242 SVN commit 514641 by jaham: some gradient tool improvements * properly initialize gradient widget (target, opacity * use opacity from gradient widget when previewing and for the result M +52 -13 tools/vgradienttool.cc M +2 -0 tools/vgradienttool.h M +26 -3 widgets/vgradienttabwidget.cc M +6 -2 widgets/vgradienttabwidget.h --- trunk/koffice/karbon/tools/vgradienttool.cc #514640:514641 @@ -148,6 +148,31 @@ return true; } +bool +VGradientTool::getOpacity( double &opacity ) +{ + if( ! view() ) + return false; + + // determine if stroke of fill is selected for editing + VStrokeFillPreview *preview = view()->strokeFillPreview(); + bool strokeSelected = ( preview && preview->strokeIsSelected() ); + + VSelection* selection = view()->part()->document().selection(); + if( selection->objects().count() != 1 ) + return false; + + VObject *obj = selection->objects().getFirst(); + // get the opacity of the first selected object, if any + if( strokeSelected && obj->stroke()->type() == VStroke::grad ) + opacity = obj->stroke()->color().opacity(); + else if( ! strokeSelected && obj->fill()->type() == VFill::grad ) + opacity = obj->fill()->color().opacity(); + else return false; + + return true; +} + void VGradientTool::draw( VPainter* painter ) { @@ -295,27 +320,41 @@ bool strokeSelected = false; + // determine the target from the stroke-fill-preview-widget + VStrokeFillPreview* preview = view()->strokeFillPreview(); + if( preview && preview->strokeIsSelected() ) + strokeSelected = true; + if( first() == last() ) { - if( showDialog() != QDialog::Accepted ) + m_optionsWidget->gradientWidget()->setGradient( m_gradient ); + if( strokeSelected ) + { + m_optionsWidget->gradientWidget()->setTarget( VGradientTabWidget::STROKE ); + m_optionsWidget->gradientWidget()->setOpacity( 1.0 ); + } + else + { + m_optionsWidget->gradientWidget()->setTarget( VGradientTabWidget::FILL ); + double opacity; + if( getOpacity( opacity ) ) + m_optionsWidget->gradientWidget()->setOpacity( opacity ); + } + + if( ! showDialog() ) return; + // if the gradient dialog was shown and accepted, determine the target from the dialog strokeSelected = ( m_optionsWidget->gradientWidget()->target() == VGradientTabWidget::STROKE ); } - else - { - // determine the target from the stroke-fill-preview-widget - VStrokeFillPreview* preview = view()->strokeFillPreview(); - if( preview && preview->strokeIsSelected() ) - strokeSelected = true; - } // calculate a sane intial position for the new gradient if( view()->part()->document().selection()->objects().count() == 1 ) { VObject *obj = view()->part()->document().selection()->objects().getFirst(); - if( obj->fill()->type() != VFill::grad ) + if( ( ! strokeSelected && obj->fill()->type() != VFill::grad ) + || ( strokeSelected && obj->stroke()->type() != VStroke::grad ) ) { KoRect bbox = obj->boundingBox(); switch( m_gradient.type() ) @@ -353,16 +392,16 @@ VFill fill; fill.gradient() = m_gradient; fill.setType( VFill::grad ); + VColor c = fill.color(); + c.setOpacity( m_optionsWidget->gradientWidget()->opacity() ); + fill.setColor( c, false ); view()->part()->addCommand( new VFillCmd( &view()->part()->document(), fill, "14_gradient" ), true ); } else { - VStroke stroke; - stroke.gradient() = m_gradient; - stroke.setType( VStroke::grad ); view()->part()->addCommand( - new VStrokeCmd( &view()->part()->document(), &stroke, "14_gradient" ), true ); + new VStrokeCmd( &view()->part()->document(), &m_gradient ), true ); } } --- trunk/koffice/karbon/tools/vgradienttool.h #514640:514641 @@ -67,6 +67,8 @@ */ bool getGradient( VGradient &gradient ); + bool getOpacity( double &opacity ); + protected slots: void targetChanged(); --- trunk/koffice/karbon/widgets/vgradienttabwidget.cc #514640:514641 @@ -100,8 +100,8 @@ painter->flush(); } // VGradientListItem::paint -VGradientPreview::VGradientPreview( VGradient*& gradient, QWidget* parent, const char* name ) - : QWidget( parent, name ), m_lpgradient( &gradient ) +VGradientPreview::VGradientPreview( VGradient*& gradient, double& opacity, QWidget* parent, const char* name ) + : QWidget( parent, name ), m_lpgradient( &gradient ), m_opacity( &opacity ) { setBackgroundMode( Qt::NoBackground ); setMinimumSize( 70, 70 ); @@ -137,6 +137,9 @@ 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 ) ); @@ -183,7 +186,7 @@ editLayout->setSpacing( 3 ); editLayout->setMargin( 6 ); editLayout->addRowSpacing( 0, 12 ); - editLayout->addMultiCellWidget( m_gradientPreview = new VGradientPreview( m_gradient, m_editGroup ), 1, 3, 0, 0 ); + 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 ); @@ -227,6 +230,7 @@ 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() @@ -234,7 +238,9 @@ m_gradientType->setCurrentItem( m_gradient->type() ); m_gradientRepeat->setCurrentItem( m_gradient->repeatMethod() ); m_gradientTarget->setCurrentItem( FILL ); + m_opacity->setValue( 100 ); + m_predefGradientsView->clear(); QPtrList* gradientList = m_resourceServer->gradients(); if( gradientList->count() > 0 ) for( VGradientListItem* g = gradientList->first(); g != NULL; g = gradientList->next() ) @@ -247,6 +253,16 @@ 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() { @@ -278,6 +294,12 @@ 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 ) ); @@ -301,6 +323,7 @@ (*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 ); --- trunk/koffice/karbon/widgets/vgradienttabwidget.h #514640:514641 @@ -64,13 +64,14 @@ class VGradientPreview : public QWidget { public: - VGradientPreview( VGradient*& gradient, QWidget* parent = 0L, const char* name = 0L ); + VGradientPreview( VGradient*& gradient, double& opacity, QWidget* parent = 0L, const char* name = 0L ); ~VGradientPreview(); virtual void paintEvent( QPaintEvent* ); protected: VGradient** m_lpgradient; + double* m_opacity; }; // VGradientPreview class KARBONBASE_EXPORT VGradientTabWidget : public QTabWidget @@ -93,6 +94,7 @@ void setTarget( VGradientTarget target ); double opacity() const; + void setOpacity( double opacity ); public slots: void combosChange( int ); @@ -100,7 +102,8 @@ void changeToPredef( QListBoxItem* ); void predefSelected( QListBoxItem* ); void deletePredef(); - + void opacityChanged( int ); + protected: void setupUI(); void initUI(); @@ -122,6 +125,7 @@ VGradient* m_gradient; /** The predefined gradients list. */ KarbonResourceServer* m_resourceServer; + double m_gradOpacity; }; // VGradientTabWidget #endif /* _VGRADIENTTABWIDGET_H_ */