loadWidget.cc

00001 /*===========================================================================*\
00002  *                                                                           *
00003  *                              OpenFlipper                                  *
00004  *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
00005  *                           www.openflipper.org                             *
00006  *                                                                           *
00007  *---------------------------------------------------------------------------*
00008  *  This file is part of OpenFlipper.                                        *
00009  *                                                                           *
00010  *  OpenFlipper is free software: you can redistribute it and/or modify      *
00011  *  it under the terms of the GNU Lesser General Public License as           *
00012  *  published by the Free Software Foundation, either version 3 of           *
00013  *  the License, or (at your option) any later version with the              *
00014  *  following exceptions:                                                    *
00015  *                                                                           *
00016  *  If other files instantiate templates or use macros                       *
00017  *  or inline functions from this file, or you compile this file and         *
00018  *  link it with other files to produce an executable, this file does        *
00019  *  not by itself cause the resulting executable to be covered by the        *
00020  *  GNU Lesser General Public License. This exception does not however       *
00021  *  invalidate any other reasons why the executable file might be            *
00022  *  covered by the GNU Lesser General Public License.                        *
00023  *                                                                           *
00024  *  OpenFlipper is distributed in the hope that it will be useful,           *
00025  *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
00026  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
00027  *  GNU Lesser General Public License for more details.                      *
00028  *                                                                           *
00029  *  You should have received a copy of the GNU LesserGeneral Public          *
00030  *  License along with OpenFlipper. If not,                                  *
00031  *  see <http://www.gnu.org/licenses/>.                                      *
00032  *                                                                           *
00033 \*===========================================================================*/
00034 
00035 /*===========================================================================*\
00036  *                                                                           *
00037  *   $Revision: 6733 $                                                         *
00038  *   $Author: moebius $                                                      *
00039  *   $Date: 2009-08-05 09:32:32 +0200 (Mi, 05. Aug 2009) $                   *
00040  *                                                                           *
00041 \*===========================================================================*/
00042 
00043 
00044 
00045 
00046 #include "loadWidget.hh"
00047 #include <OpenFlipper/common/GlobalOptions.hh>
00048 #include "OpenFlipper/BasePlugin/PluginFunctions.hh"
00049 #include <QCompleter>
00050 #include <QMessageBox>
00051 #include <QFile>
00052 #include <QFileDialog>
00053 #include <QDir>
00054 #include <QDebug>
00055 
00056 
00057  #include <QHBoxLayout>
00058 
00059 LoadWidget::LoadWidget(std::vector<fileTypes>& _supportedTypes , QWidget *parent)
00060   : QFileDialog(parent),
00061     loadMode_(true),
00062     supportedTypes_(_supportedTypes)
00063 {
00064   setOption (QFileDialog::DontUseNativeDialog, true);
00065 
00066   // Get our layout
00067   QGridLayout *gridLayout = (QGridLayout*)layout();
00068 
00069   //supported Types
00070   typeBox_ = new QComboBox(this);
00071   typeBox_->setDuplicatesEnabled(false);
00072   for (int i=0; i < (int)supportedTypes_.size(); i++)
00073     typeBox_->addItem(supportedTypes_[i].plugin->typeName(),QVariant(supportedTypes_[i].type));
00074 
00075   // add the type box to the bottom
00076   gridLayout->addWidget( typeBox_, gridLayout->rowCount() , 1 );
00077 
00078   // Add a nice label for it
00079   QLabel* typeLabel = new QLabel(tr("Object type:") , this);
00080   gridLayout->addWidget( typeLabel, gridLayout->rowCount() -1 , 0 );
00081 
00082   // Add a frame to the right of the dialog
00083   box_ = new QGroupBox( this ) ;
00084   box_->setFlat ( false );
00085   box_->setSizePolicy( QSizePolicy ( QSizePolicy::Preferred , QSizePolicy::Expanding ) );
00086   gridLayout->addWidget( box_, 0 , gridLayout->columnCount(),gridLayout->rowCount(),1 );
00087 
00088   //init layout for the frame
00089   boxLayout_ = new QHBoxLayout();
00090   box_->setLayout(boxLayout_);
00091 
00092   //set last used DataType as currentItem
00093   for (int i=0; i < typeBox_->count(); i++){
00094     if (typeBox_->itemText(i) == OpenFlipper::Options::lastDataType()){
00095       typeBox_->setCurrentIndex(i);
00096       if (loadMode_)
00097         slotSetLoadFilters(i);
00098       else
00099         slotSetSaveFilters(i);
00100     }
00101   }
00102 
00103   connect(this, SIGNAL(filterSelected(QString)), this, SLOT(currentFilterChanged(QString)));
00104 
00105   //overwrite dialog shouldn't be handled by the qfiledialog
00106   setConfirmOverwrite(false);
00107 
00108   setDirectory(OpenFlipper::Options::currentDirStr());
00109 }
00110 
00112 LoadWidget::~LoadWidget()
00113 {
00114   // remove the optionWidgets so they don't get destroyed
00115   // (the fileplugins control the optionWidgets)
00116   for (int i=0; i < boxWidgets_.size(); i++){
00117     boxLayout_->removeWidget( boxWidgets_[i] );
00118     boxWidgets_[i]->setParent(0);
00119   }
00120 }
00121 
00123 void LoadWidget::currentFilterChanged(QString _currentFilter){
00124 
00125   for (int i=0; i < boxWidgets_.size(); i++){
00126     boxLayout_->removeWidget( boxWidgets_[i] );
00127     boxWidgets_[i]->setParent(0);
00128   }
00129 
00130   boxWidgets_.clear();
00131 
00132   const DataType type = (DataType) typeBox_->itemData( typeBox_->currentIndex() ).toInt();
00133 
00134   if ( loadMode_ ){
00135   for (int i=0; i < (int)supportedTypes_.size(); i++)
00136     if (supportedTypes_[i].type == type){
00137       //add Widget for new Filter
00138       QWidget* nuWidget = 0;
00139       nuWidget = supportedTypes_[i].plugin->loadOptionsWidget(_currentFilter);
00140 
00141       if (nuWidget != 0){
00142         boxLayout_->addWidget( nuWidget );
00143         boxWidgets_.push_back( nuWidget );
00144         box_->show();
00145       }
00146     }
00147   }else{
00148     for (int i=0; i < (int)supportedTypes_.size(); i++)
00149       if (supportedTypes_[i].type == type){
00150         //add Widget for new Filter
00151         QWidget* nuWidget = 0;
00152         nuWidget = supportedTypes_[i].plugin->saveOptionsWidget(_currentFilter);
00153 
00154         if (nuWidget != 0){
00155           boxLayout_->addWidget( nuWidget );
00156           boxWidgets_.push_back( nuWidget );
00157           box_->show();
00158         }
00159       }
00160   }
00161 }
00162 
00164 void LoadWidget::slotSetLoadFilters(int _typeIndex){
00165   box_->setTitle(tr("Load Options"));
00166 
00167   for (int i=0; i < boxWidgets_.size(); i++){
00168     boxLayout_->removeWidget( boxWidgets_[i] );
00169     boxWidgets_[i]->setParent(0);
00170   }
00171 
00172   boxWidgets_.clear();
00173 
00174   const DataType type = (DataType) typeBox_->itemData(_typeIndex).toInt();
00175   for (int i=0; i < (int)supportedTypes_.size(); i++)
00176     if (supportedTypes_[i].type == type){
00177       QStringList filters = supportedTypes_[i].loadFilters.split(";;");
00178       for (int f=0; f < filters.size(); f++)
00179         if (filters[f].trimmed() == "") filters.removeAt(f);
00180       setNameFilters(filters);
00181 
00182       //add Widget for new Filter
00183       QWidget* nuWidget = 0;
00184       nuWidget = supportedTypes_[i].plugin->loadOptionsWidget("");
00185 
00186       if ( nuWidget != 0 ) {
00187         boxLayout_->addWidget( nuWidget );
00188         boxWidgets_.push_back( nuWidget );
00189         box_->show();
00190       }
00191     }
00192 
00193   if (box_->children().count() == 1) //only the layout is left
00194     box_->hide();
00195 }
00196 
00198 void LoadWidget::slotSetSaveFilters(int _typeIndex){
00199   box_->setTitle(tr("Save Options"));
00200 
00201   for (int i=0; i < boxWidgets_.size(); i++){
00202     boxLayout_->removeWidget( boxWidgets_[i] );
00203     boxWidgets_[i]->setParent(0);
00204   }
00205 
00206   boxWidgets_.clear();
00207 
00208   const DataType type = (DataType) typeBox_->itemData(_typeIndex).toInt();
00209   for (int i=0; i < (int)supportedTypes_.size(); i++)
00210     if (supportedTypes_[i].type == type){
00211       QStringList filters = supportedTypes_[i].saveFilters.split(";;");
00212       for (int f=0; f < filters.size(); f++)
00213         if (filters[f].trimmed() == "") filters.removeAt(f);
00214       setNameFilters(filters);
00215 
00216       //add Widget for new Filter
00217       QWidget* nuWidget = 0;
00218       nuWidget = supportedTypes_[i].plugin->saveOptionsWidget("");
00219 
00220       if ( nuWidget != 0 ) {
00221         boxLayout_->addWidget( nuWidget );
00222         boxWidgets_.push_back( nuWidget );
00223         box_->show();
00224       }
00225     }
00226 
00227   if (box_->children().count() == 1) //only the layout is left
00228     box_->hide();
00229 }
00230 
00231 
00232 
00234 void LoadWidget::loadFile(){
00235 
00236   //get selection
00237   QStringList files = selectedFiles();
00238 
00239   bool success = false;
00240 
00241   //iterate over selection
00242   for (int i=0; i < files.size(); i++){
00243     QFileInfo fi(files[i]);
00244     QString filename = fi.absoluteFilePath();
00245     OpenFlipper::Options::currentDir(fi.absolutePath());
00246     QFile file(filename);
00247 
00248     if (fi.isDir() || !file.exists()) continue; //do nothing if its a not a valid file
00249     QString ext = fi.suffix();
00250 
00251     //emit load signal
00252     DataType type = (DataType) typeBox_->itemData(typeBox_->currentIndex()).toInt();
00253     int unused;
00254     emit load(filename, type, unused);
00255     success = true;
00256   }
00257 
00258 
00259 
00260   if (success) //at least one item was loaded successfully
00261     OpenFlipper::Options::lastDataType(typeBox_->currentText());
00262 }
00263 
00265 void LoadWidget::saveFile(){
00266   //get selection
00267   QStringList files = selectedFiles();
00268 
00269   if ( files.size() != 1 ) {
00270     std::cerr << "Error no or multiple save files selected" << std::endl;
00271     return;
00272   }
00273 
00274   QString filename = files[0];
00275 
00276   //get filename
00277   if (!filename.contains(".",Qt::CaseSensitive)){ //check for extension
00278 
00279     int s = selectedFilter().indexOf("*")+1;
00280     int e = selectedFilter().indexOf(" ", s);
00281     int e2 = selectedFilter().indexOf(")", s);
00282     if (e == -1 || e2 < e) e = e2;
00283 
00284     QString ext = selectedFilter().mid(s,e-s);
00285     filename += ext;
00286   }
00287 
00288   QFile f(filename);
00289   if (f.exists()){ //check for extension
00290     int ret = QMessageBox::warning(this, tr("File exists"),tr("This file already exists.\n"
00291         "Do you want to overwrite the file?"),QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
00292     if (ret == QMessageBox::No)
00293       return; //abort if users doesn't want to overwrite
00294   }
00295   QFileInfo fi(filename);
00296   QString ext = fi.suffix();
00297 
00298   emit save(id_,filename);
00299   OpenFlipper::Options::lastDataType(typeBox_->currentText());
00300 
00301   OpenFlipper::Options::currentDir(fi.absolutePath());
00302 
00303 }
00304 
00306 int LoadWidget::showLoad(){
00307   setAcceptMode ( QFileDialog::AcceptOpen );
00308   setWindowTitle(tr("Load Object"));
00309   typeBox_->setEnabled(true);
00310   loadMode_ = true;
00311 
00312   setFileMode(QFileDialog::ExistingFiles);
00313   disconnect(typeBox_, SIGNAL(activated(int)), 0, 0);
00314   connect(typeBox_,SIGNAL(activated(int)),this,SLOT(slotSetLoadFilters(int)));
00315 
00316   slotSetLoadFilters(typeBox_->currentIndex());
00317 
00318   return this->exec();
00319 }
00320 
00322 int LoadWidget::showSave(int _id, QString _filename){
00323   setAcceptMode ( QFileDialog::AcceptSave );
00324   setFileMode( QFileDialog::AnyFile );
00325   setWindowTitle(tr("Save Object"));
00326   typeBox_->setEnabled(false);
00327   loadMode_ = false;
00328 
00329   id_ = _id;
00330 
00331   //set dataType
00332   BaseObjectData* object;
00333   PluginFunctions::getObject(_id,object);
00334 
00335   bool typeFound = false;
00336   for (int i=0; i < typeBox_->count(); i++){
00337     DataType type = (DataType) typeBox_->itemData(i).toInt();
00338     if (object->dataType(type)){
00339       typeBox_->setCurrentIndex(i);
00340       slotSetSaveFilters(i);
00341       typeFound = true;
00342     }
00343   }
00344 
00345   if (!typeFound){
00346     std::cerr << "No suitable plugin for saving this dataType." << std::endl;
00347     return QDialog::Rejected;
00348   }
00349 
00350   disconnect(typeBox_, SIGNAL(activated(int)), 0, 0);
00351   connect(typeBox_,SIGNAL(activated(int)),this,SLOT(slotSetSaveFilters(int)));
00352 
00353   slotSetSaveFilters(typeBox_->currentIndex());
00354 
00355   //display correct path/name
00356   QFileInfo fi(_filename);
00357   QFile file(_filename);
00358 
00359   if (file.exists()) {
00360     setDirectory( fi.absolutePath() );
00361     selectFile ( fi.fileName() );
00362   } else {
00363 //     setDirectory(OpenFlipper::Options::currentDir().absolutePath() );
00364     std::cout << "setting filename = " << _filename.toStdString() << std::endl;
00365     setDirectory( fi.absolutePath() );
00366     selectFile ( fi.fileName() );
00367   }
00368 
00369 
00370   //try to select the best fitting name filter
00371   for (int i=0; i < nameFilters().count(); i++){
00372     int s = nameFilters()[i].indexOf("*")+2;
00373     int e = nameFilters()[i].indexOf(" ", s);
00374     int e2 = nameFilters()[i].indexOf(")", s);
00375     if (e == -1 || e2 < e) e = e2;
00376 
00377     QString ext = nameFilters()[i].mid(s,e-s);
00378 
00379     if (ext == fi.completeSuffix()){
00380       selectNameFilter(nameFilters()[i]);
00381       break;
00382     }
00383   }
00384 
00385   return this->exec();
00386 }
00387 
00388 void LoadWidget::accept() {
00389   if ( loadMode_ )
00390     loadFile();
00391   else
00392     saveFile();
00393 
00394 
00395   QFileDialog::accept();
00396 }

acg pic Project OpenFlipper, ©  Computer Graphics Group, RWTH Aachen. Documentation generated using doxygen .