diff --git a/MainWindow.cpp b/MainWindow.cpp index a336d10..6a63740 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -178,7 +178,15 @@ void MainWindow::handleItemDoubleClicked(QListWidgetItem* item) // Restart video playback. XXX Hack videoTimer->start(); if (!fileName.isEmpty()) - importMediaFile(fileName, paint); + importMediaFile(fileName, paint, false); + } + if (paint->getType() == "image") { + QString fileName = QFileDialog::getOpenFileName(this, + tr("Import media source file"), "."); + // Restart video playback. XXX Hack + videoTimer->start(); + if (!fileName.isEmpty()) + importMediaFile(fileName, paint, true); } else if (paint->getType() == "color") { // Pop-up color-choosing dialog to choose color paint. @@ -293,7 +301,7 @@ bool MainWindow::saveAs() return saveFile(fileName); } -void MainWindow::import() +void MainWindow::importVideo() { // Stop video playback to avoid lags. XXX Hack videoTimer->stop(); @@ -307,7 +315,24 @@ void MainWindow::import() videoTimer->start(); if (!fileName.isEmpty()) - importMediaFile(fileName, std::tr1::shared_ptr(static_cast(0))); + importMediaFile(fileName, std::tr1::shared_ptr(static_cast(0)), false); +} + +void MainWindow::importImage() +{ + // Stop video playback to avoid lags. XXX Hack + videoTimer->stop(); + + // Pop-up file-choosing dialog to choose media file. + // TODO: restrict the type of files that can be imported + QString fileName = QFileDialog::getOpenFileName(this, + tr("Import media source file"), "."); + + // Restart video playback. XXX Hack + videoTimer->start(); + + if (!fileName.isEmpty()) + importMediaFile(fileName, std::tr1::shared_ptr(static_cast(0)), true); } void MainWindow::addColor() @@ -555,7 +580,7 @@ bool MainWindow::clearProject() return true; } -uid MainWindow::createMediaPaint(uid paintId, QString uri, float x, float y, Paint::ptr oldPaint) +uid MainWindow::createMediaPaint(uid paintId, QString uri, float x, float y, Paint::ptr oldPaint, bool isImage) { // Cannot create image with already existing id. if (Paint::getUidAllocator().exists(paintId)) @@ -563,14 +588,18 @@ uid MainWindow::createMediaPaint(uid paintId, QString uri, float x, float y, Pai else { - Media* img = new Media(uri, paintId); -// Image* img = new Image(uri, paintId); + qDebug() << "Is image " << isImage << endl; + Texture* tex = 0; + if (isImage) + tex = new Image(uri, paintId); + else + tex = new Media(uri, paintId); // Create new image with corresponding ID. - img->setPosition(x, y); + tex->setPosition(x, y); // Add it to the manager. - Paint::ptr paint(img); + Paint::ptr paint(tex); // Add paint to model and return its uid. uid id = mappingManager->addPaint(paint); @@ -960,12 +989,19 @@ void MainWindow::createActions() saveAsAction->setIconVisibleInMenu(false); connect(saveAsAction, SIGNAL(triggered()), this, SLOT(saveAs())); - // Import media. - importAction = new QAction(tr("&Import media source file..."), this); - importAction->setIcon(QIcon(":/add-media")); - importAction->setStatusTip(tr("Import a media source file...")); - importAction->setIconVisibleInMenu(false); - connect(importAction, SIGNAL(triggered()), this, SLOT(import())); + // Import video. + importVideoAction = new QAction(tr("&Import media source file..."), this); + importVideoAction->setIcon(QIcon(":/add-video")); + importVideoAction->setStatusTip(tr("Import a media source file...")); + importVideoAction->setIconVisibleInMenu(false); + connect(importVideoAction, SIGNAL(triggered()), this, SLOT(importVideo())); + + // Import imiage. + importImageAction = new QAction(tr("&Import media source file..."), this); + importImageAction->setIcon(QIcon(":/add-image")); + importImageAction->setStatusTip(tr("Import a media source file...")); + importImageAction->setIconVisibleInMenu(false); + connect(importImageAction, SIGNAL(triggered()), this, SLOT(importImage())); // Add color. addColorAction = new QAction(tr("Add &Color paint..."), this); @@ -1130,7 +1166,8 @@ void MainWindow::createMenus() fileMenu->addAction(saveAction); fileMenu->addAction(saveAsAction); fileMenu->addSeparator(); - fileMenu->addAction(importAction); + fileMenu->addAction(importVideoAction); + fileMenu->addAction(importImageAction); fileMenu->addAction(addColorAction); fileMenu->addSeparator(); fileMenu->addAction(exitAction); @@ -1190,7 +1227,8 @@ void MainWindow::createToolBars() mainToolBar = addToolBar(tr("&File")); mainToolBar->setIconSize(QSize(MM::TOP_TOOLBAR_ICON_SIZE, MM::TOP_TOOLBAR_ICON_SIZE)); mainToolBar->setMovable(false); - mainToolBar->addAction(importAction); + mainToolBar->addAction(importVideoAction); + mainToolBar->addAction(importImageAction); mainToolBar->addAction(addColorAction); mainToolBar->addAction(newAction); mainToolBar->addAction(openAction); @@ -1374,7 +1412,7 @@ void MainWindow::setCurrentFile(const QString &fileName) // { // } -bool MainWindow::importMediaFile(const QString &fileName, Paint::ptr oldPaint) +bool MainWindow::importMediaFile(const QString &fileName, Paint::ptr oldPaint, bool isImage) { QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { @@ -1388,7 +1426,7 @@ bool MainWindow::importMediaFile(const QString &fileName, Paint::ptr oldPaint) QApplication::setOverrideCursor(Qt::WaitCursor); // Add media file to model. - uint mediaId = createMediaPaint(NULL_UID, fileName, 0, 0, oldPaint); + uint mediaId = createMediaPaint(NULL_UID, fileName, 0, 0, oldPaint, isImage); // Initialize position (center). std::tr1::shared_ptr media = std::tr1::static_pointer_cast(mappingManager->getPaintById(mediaId)); @@ -1468,7 +1506,7 @@ void MainWindow::addMappingItem(uid mappingId) // Add mapper. // XXX hardcoded for textures std::tr1::shared_ptr textureMapping; - if (paintType == "media") + if (paintType == "media" || paintType == "image") { textureMapping = std::tr1::static_pointer_cast(mapping); Q_CHECK_PTR(textureMapping); @@ -1811,8 +1849,13 @@ bool MainWindow::setTextureUri(int texture_id, const std::string &uri) { if (paint->getType() == "media") { - Media *media = (Media *) paint.get(); // FIXME: use sharedptr cast - success = media->setUri(QString(uri.c_str())); + Media *media = (Media *) paint.get(); // FIXME: use sharedptr cast + success = media->setUri(QString(uri.c_str())); + } + else if (paint->getType() == "image") + { + Image *media = (Image*) paint.get(); // FIXME: use sharedptr cast + success = media->setUri(QString(uri.c_str())); } else { diff --git a/MainWindow.h b/MainWindow.h index df70c2c..48db28f 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -79,7 +79,8 @@ private slots: void open(); bool save(); bool saveAs(); - void import(); + void importVideo(); + void importImage(); void addColor(); void about(); void updateStatusBar(); @@ -112,8 +113,8 @@ public slots: /// Clears all mappings and paints. bool clearProject(); - /// Create or replace an image paint. - uid createMediaPaint(uid paintId, QString uri, float x, float y, Paint::ptr oldPaint); + /// Create or replace a media paint (or image). + uid createMediaPaint(uid paintId, QString uri, float x, float y, Paint::ptr oldPaint, bool isImage); /// Create or replace a color paint. uid createColorPaint(uid paintId, QColor color, Paint::ptr oldPaint); @@ -186,7 +187,7 @@ public: bool loadFile(const QString &fileName); bool saveFile(const QString &fileName); void setCurrentFile(const QString &fileName); - bool importMediaFile(const QString &fileName, Paint::ptr oldPaint); + bool importMediaFile(const QString &fileName, Paint::ptr oldPaint, bool isImage); bool addColorPaint(const QColor& color, Paint::ptr oldPaint); void addMappingItem(uid mappingId); void removeMappingItem(uid mappingId); @@ -228,7 +229,8 @@ private: QAction *separatorAction; QAction *newAction; QAction *openAction; - QAction *importAction; + QAction *importVideoAction; + QAction *importImageAction; QAction *addColorAction; QAction *saveAction; QAction *saveAsAction; diff --git a/Paint.cpp b/Paint.cpp index 8ea95c8..eeb7682 100644 --- a/Paint.cpp +++ b/Paint.cpp @@ -42,6 +42,12 @@ Paint::~Paint() allocator.free(_id); } +bool Image::setUri(const QString &uri) +{ + this->uri = uri; + build(); + return true; +} /* Implementation of the Video class */ diff --git a/Paint.h b/Paint.h index 4c97681..25030e2 100644 --- a/Paint.h +++ b/Paint.h @@ -121,6 +121,7 @@ protected: y(0), bitsChanged(true) {} +public: virtual ~Texture() { if (textureId != 0) glDeleteTextures(1, &textureId); @@ -162,19 +163,21 @@ protected: public: Image(const QString uri_, uid id=NULL_UID) : - Texture(id), - uri(uri_) + Texture(id) { + setUri(uri_); } virtual ~Image() {} - const QString getUri() const { return uri; } - virtual void build() { - image = QGLWidget::convertToGLFormat(QImage(uri)); + image = QGLWidget::convertToGLFormat(QImage(uri)).mirrored(true, false).transformed(QTransform().rotate(180)); + bitsChanged = true; } + const QString getUri() const { return uri; } + bool setUri(const QString &uri); + virtual QString getType() const { return "image"; } virtual int getWidth() const { return image.width(); } diff --git a/ProjectReader.cpp b/ProjectReader.cpp index 5a8ce40..3cb4d4d 100644 --- a/ProjectReader.cpp +++ b/ProjectReader.cpp @@ -97,7 +97,18 @@ void ProjectReader::parsePaint(const QDomElement& paint) QString y = paint.firstChildElement("y").text(); uid id = _window->createMediaPaint(paintAttrId.toInt(), uri, x.toFloat(), y.toFloat(), - std::tr1::shared_ptr(static_cast(0))); + std::tr1::shared_ptr(static_cast(0)), false); + if (id == NULL_UID) + _xml.raiseError(QObject::tr("Cannot create media with uri %1.").arg(uri)); + } + else if (paintAttrType == "image") + { + QString uri = paint.firstChildElement("uri").text(); + QString x = paint.firstChildElement("x").text(); + QString y = paint.firstChildElement("y").text(); + + uid id = _window->createMediaPaint(paintAttrId.toInt(), uri, x.toFloat(), y.toFloat(), + std::tr1::shared_ptr(static_cast(0)), true); if (id == NULL_UID) _xml.raiseError(QObject::tr("Cannot create media with uri %1.").arg(uri)); } diff --git a/mapmap.qrc b/mapmap.qrc index 864ba7e..9229cee 100644 --- a/mapmap.qrc +++ b/mapmap.qrc @@ -9,7 +9,8 @@ resources/images/icons/nofullscreen_w.png resources/images/icons/ctrl2_w.png - resources/images/icons/add_movie_w.png + resources/images/icons/add_movie_w.png + resources/images/icons/add_img_w.png resources/images/icons/add_paint_w.png resources/images/shapes/add_quad.png