TextureMapping.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (c) 2010 Werner Mayer <wmayer[at]users.sourceforge.net>     *
00003  *                                                                         *
00004  *   This file is part of the FreeCAD CAx development system.              *
00005  *                                                                         *
00006  *   This library is free software; you can redistribute it and/or         *
00007  *   modify it under the terms of the GNU Library General Public           *
00008  *   License as published by the Free Software Foundation; either          *
00009  *   version 2 of the License, or (at your option) any later version.      *
00010  *                                                                         *
00011  *   This library  is distributed in the hope that it will be useful,      *
00012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00014  *   GNU Library General Public License for more details.                  *
00015  *                                                                         *
00016  *   You should have received a copy of the GNU Library General Public     *
00017  *   License along with this library; see the file COPYING.LIB. If not,    *
00018  *   write to the Free Software Foundation, Inc., 59 Temple Place,         *
00019  *   Suite 330, Boston, MA  02111-1307, USA                                *
00020  *                                                                         *
00021  ***************************************************************************/
00022 
00023 
00024 #include "PreCompiled.h"
00025 
00026 #ifndef _PreComp_
00027 # include <Inventor/nodes/SoGroup.h>
00028 # include <Inventor/nodes/SoTexture2.h>
00029 # include <QImage>
00030 # include <QMessageBox>
00031 # include <QImageReader>
00032 #endif
00033 
00034 #include <Inventor/nodes/SoTextureCoordinateEnvironment.h>
00035 #include <QDialogButtonBox>
00036 
00037 #include <App/Application.h>
00038 
00039 #include "TextureMapping.h"
00040 #include "BitmapFactory.h"
00041 #include "ui_TextureMapping.h"
00042 #include "Application.h"
00043 #include "Document.h"
00044 #include "View3DInventor.h"
00045 #include "View3DInventorViewer.h"
00046 
00047 using namespace Gui::Dialog;
00048 
00049 /* TRANSLATOR Gui::Dialog::TextureMapping */
00050 
00051 TextureMapping::TextureMapping(QWidget* parent, Qt::WFlags fl)
00052   : QDialog(parent, fl), grp(0), tex(0), env(0)
00053 {
00054     ui = new Ui_TextureMapping();
00055     ui->setupUi(this);
00056     ui->checkGlobal->hide();
00057 
00058     // add all supported QImage formats
00059     QStringList formats;
00060     QList<QByteArray> qtformats = QImageReader::supportedImageFormats();
00061     for (QList<QByteArray>::Iterator it = qtformats.begin(); it != qtformats.end(); ++it) {
00062         formats << QString::fromAscii("*.%1").arg(QLatin1String(*it));
00063     }
00064     
00065     ui->fileChooser->setFilter(tr("Image files (%1)").arg(formats.join(QLatin1String(" "))));
00066 
00067     this->tex = new SoTexture2();
00068     this->tex->ref();
00069     this->env = new SoTextureCoordinateEnvironment();
00070     this->env->ref();
00071 
00072     std::string path = App::GetApplication().Config()["TextureImage"];
00073     if (!path.empty()) {
00074         QString file = QString::fromUtf8(path.c_str());
00075         ui->fileChooser->setFileName(file);
00076         on_fileChooser_fileNameSelected(file);
00077     }
00078 }
00079 
00080 TextureMapping::~TextureMapping()
00081 {
00082     this->tex->unref();
00083     this->env->unref();
00084     delete ui;
00085 }
00086 
00087 void TextureMapping::accept()
00088 {
00089     QDialog::accept();
00090 }
00091 
00092 void TextureMapping::reject()
00093 {
00094     if (this->grp) {
00095         this->grp->removeChild(this->tex);
00096         if (this->grp->findChild(this->env) > -1)
00097             this->grp->removeChild(this->env);
00098         this->grp->unref();
00099     }
00100 
00101     QDialog::reject();
00102 }
00103 
00104 void TextureMapping::changeEvent(QEvent *e)
00105 {
00106     if (e->type() == QEvent::LanguageChange) {
00107         ui->retranslateUi(this);
00108     }
00109     else {
00110         QDialog::changeEvent(e);
00111     }
00112 }
00113 
00114 void TextureMapping::on_fileChooser_fileNameSelected(const QString& s)
00115 {
00116     QImage image;
00117     if (!image.load(s)) {
00118         QMessageBox::warning(this, tr("No image"), tr("The specified file is not a valid image file."));
00119         return;
00120     }
00121 
00122     if (!this->grp) {
00123         Gui::Document* doc = Gui::Application::Instance->activeDocument();
00124         if (doc) {
00125             Gui::MDIView* mdi = doc->getActiveView();
00126             if (mdi && mdi->isDerivedFrom(View3DInventor::getClassTypeId())) {
00127                 Gui::View3DInventorViewer* view = static_cast<View3DInventor*>(mdi)->getViewer();
00128                 this->grp = static_cast<SoGroup *>(view->getSceneGraph());
00129                 this->grp->ref();
00130                 this->grp->insertChild(this->tex,1);
00131                 if (ui->checkEnv->isChecked())
00132                     this->grp->insertChild(this->env,2);
00133             }
00134         }
00135     }
00136 
00137     if (!this->grp) {
00138         QMessageBox::warning(this, tr("No 3d view"), tr("No active 3d view found."));
00139         return;
00140     }
00141 
00142     SoSFImage texture;
00143     Gui::BitmapFactory().convert(image, texture);
00144     this->tex->image = texture;
00145     //this->tex->filename = (const char*)s.toUtf8();
00146     App::GetApplication().Config()["TextureImage"] = (const char*)s.toUtf8();
00147 }
00148 
00149 void TextureMapping::on_checkEnv_toggled(bool b)
00150 {
00151     if (!this->grp)
00152         return;
00153     if (b) {
00154         this->grp->insertChild(this->env,2);
00155     }
00156     else {
00157         this->grp->removeChild(this->env);
00158     }
00159 }
00160 
00161 // ---------------------------------------
00162 
00163 TaskTextureMapping::TaskTextureMapping()
00164 {
00165     dialog = new TextureMapping();
00166     taskbox = new Gui::TaskView::TaskBox(QPixmap(), dialog->windowTitle(), true, 0);
00167     taskbox->groupLayout()->addWidget(dialog);
00168     Content.push_back(taskbox);
00169 }
00170 
00171 TaskTextureMapping::~TaskTextureMapping()
00172 {
00173     // automatically deleted in the sub-class
00174 }
00175 
00176 bool TaskTextureMapping::accept()
00177 {
00178     dialog->accept();
00179     return (dialog->result() == QDialog::Accepted);
00180 }
00181 
00182 bool TaskTextureMapping::reject()
00183 {
00184     dialog->reject();
00185     return (dialog->result() == QDialog::Rejected);
00186 }
00187 
00188 #include "moc_TextureMapping.cpp"

Generated on Wed Nov 23 19:00:45 2011 for FreeCAD by  doxygen 1.6.1