diff --git a/src/qdialogpixmap.cpp b/src/qdialogpixmap.cpp index cf66033..0d74e2b 100644 --- a/src/qdialogpixmap.cpp +++ b/src/qdialogpixmap.cpp @@ -63,7 +63,9 @@ bool QDialogPixmap::exec( QGraphicsItem *graphicsItem ) m_item = new QGraphicsPixmapItem; m_item->setPos( item->pos() ); + m_item->setOffset( item->offset() ); m_item->setPixmap( item->pixmap() ); + m_item->setData( 0, item->data( 0 ) ); scene.addItem( m_item ); @@ -79,19 +81,38 @@ bool QDialogPixmap::exec( QGraphicsItem *graphicsItem ) if( QDialog::exec() == Rejected ) return false; item->setPos( m_item->pos() ); + item->setOffset( m_item->offset() ); item->setPixmap( m_item->pixmap() ); + item->setData( 0, m_item->data( 0 ) ); return true; } void QDialogPixmap::onLoadImage() { + QString filter( tr("Images ( ") ); QList list = QImageReader::supportedImageFormats(); - QString msg; foreach( QByteArray arr, list ) { - msg += arr.data(); + filter += QString( "*." ) + arr.data() + " "; } - QMessageBox::warning( this, "Formats", msg ); + filter += tr( ")\nAll Files (*)" ); + QString fileName = QFileDialog::getOpenFileName( this, "Load image:", QString(), filter ); + if( fileName.isNull() ) + return; + + QPixmap pixmap( fileName ); + if( pixmap.isNull() ) { + QMessageBox::warning( this, + "Warning", + tr( "Cannot create image from file: " ) + fileName ); + return; + } + m_item->setPixmap( pixmap ); + m_item->setData( 0, fileName ); + m_item->setOffset( -QPointF( pixmap.size().height(), pixmap.size().width() ) / 2.0 ); + + m_ui->lineEdit->setText( fileName ); + m_ui->buttonBox->setStandardButtons( m_ui->buttonBox->standardButtons() | QDialogButtonBox::Ok ); } void QDialogPixmap::posChanged() diff --git a/src/qdialogpixmap.ui b/src/qdialogpixmap.ui index 3f7b8d8..72e4835 100644 --- a/src/qdialogpixmap.ui +++ b/src/qdialogpixmap.ui @@ -98,7 +98,11 @@ - + + + true + + @@ -139,7 +143,7 @@ Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Cancel diff --git a/src/qshapecontrollers.cpp b/src/qshapecontrollers.cpp index d013ae0..b9e71aa 100644 --- a/src/qshapecontrollers.cpp +++ b/src/qshapecontrollers.cpp @@ -16,10 +16,11 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - $Id:$ */ + $Id$ */ #include "qshapecontrollers.h" #include "qdialogtext.h" +#include "qdialogpixmap.h" #include #include @@ -89,3 +90,67 @@ void QShapeControllerText::readData( const QString &element, return; } } + +RegisterController< QShapeControllerPixmap > regControllerPixmap; + +QString QShapeControllerPixmap::name() const +{ + return "image"; +} + +QString QShapeControllerPixmap::menuName() const +{ + return QObject::tr( "Image", "QShapeControllerPixmap name" ); +} + +QGraphicsItem *QShapeControllerPixmap::create() const +{ + return new QGraphicsPixmapItem; +} + +QItemDialog *QShapeControllerPixmap::createDialog( QWidget *parent ) const +{ + return new QDialogPixmap( parent ); +} + +void QShapeControllerPixmap::writeData( QXmlStreamWriter &writer, const QGraphicsItem *item ) const +{ + const QGraphicsPixmapItem *pixmapItem + = static_cast< const QGraphicsPixmapItem * >( item ); + + writer.writeEmptyElement( "pos" ); + writer.writeAttribute( + QXmlStreamAttribute( "x", QString::number( pixmapItem->pos().x() ) ) ); + + writer.writeAttribute( + QXmlStreamAttribute( "y", QString::number( pixmapItem->pos().y() ) ) ); + + writer.writeTextElement( "image", pixmapItem->data( 0 ).toString() ); +} + + +void QShapeControllerPixmap::readData( const QString &element, + const QXmlStreamAttributes &attrs, + const QString &data, + QGraphicsItem *item ) const +{ + QGraphicsPixmapItem *pixmapItem = static_cast< QGraphicsPixmapItem * >( item ); + + if( element == "pos" ) { + pixmapItem->setPos( attrs.value( "x" ).toString().toDouble(), + attrs.value( "y" ).toString().toDouble() ); + return; + } + + if( element == "image" ) { + pixmapItem->setData( 0, data ); + QPixmap pixmap( data ); + if( pixmap.isNull() ) { + throw QString( "QShapeControllerPixmap: image loading from \"" ) + + data + "\" failed"; + } + pixmapItem->setPixmap( pixmap ); + pixmapItem->setOffset( -QPointF( pixmap.size().height(), pixmap.size().width() ) / 2.0 ); + return; + } +} diff --git a/src/qshapecontrollers.h b/src/qshapecontrollers.h index 5e58f6d..b24e034 100644 --- a/src/qshapecontrollers.h +++ b/src/qshapecontrollers.h @@ -16,7 +16,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - $Id:$ */ + $Id$ */ #ifndef QSHAPECONTROLLERS_H #define QSHAPECONTROLLERS_H @@ -24,6 +24,7 @@ #include "qshapefactory.h" #include +#include class QShapeControllerText : public QShapeController { public: @@ -43,4 +44,22 @@ protected: QGraphicsItem *item ) const; }; +class QShapeControllerPixmap : public QShapeController { +public: + enum { Type = QGraphicsPixmapItem::Type }; + + virtual QString name() const; + virtual QString menuName() const; + + virtual QGraphicsItem *create() const; + +protected: + virtual QItemDialog *createDialog( QWidget *parent ) const; + virtual void writeData( QXmlStreamWriter &writer, const QGraphicsItem *item ) const; + virtual void readData( const QString &element, + const QXmlStreamAttributes &attrs, + const QString &data, + QGraphicsItem *item ) const; +}; + #endif // QSHAPECONTROLLERS_H