00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
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
00067 QGridLayout *gridLayout = (QGridLayout*)layout();
00068
00069
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
00076 gridLayout->addWidget( typeBox_, gridLayout->rowCount() , 1 );
00077
00078
00079 QLabel* typeLabel = new QLabel(tr("Object type:") , this);
00080 gridLayout->addWidget( typeLabel, gridLayout->rowCount() -1 , 0 );
00081
00082
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
00089 boxLayout_ = new QHBoxLayout();
00090 box_->setLayout(boxLayout_);
00091
00092
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
00106 setConfirmOverwrite(false);
00107
00108 setDirectory(OpenFlipper::Options::currentDirStr());
00109 }
00110
00112 LoadWidget::~LoadWidget()
00113 {
00114
00115
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
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
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
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)
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
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)
00228 box_->hide();
00229 }
00230
00231
00232
00234 void LoadWidget::loadFile(){
00235
00236
00237 QStringList files = selectedFiles();
00238
00239 bool success = false;
00240
00241
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;
00249 QString ext = fi.suffix();
00250
00251
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)
00261 OpenFlipper::Options::lastDataType(typeBox_->currentText());
00262 }
00263
00265 void LoadWidget::saveFile(){
00266
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
00277 if (!filename.contains(".",Qt::CaseSensitive)){
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()){
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;
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
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
00356 QFileInfo fi(_filename);
00357 QFile file(_filename);
00358
00359 if (file.exists()) {
00360 setDirectory( fi.absolutePath() );
00361 selectFile ( fi.fileName() );
00362 } else {
00363
00364 std::cout << "setting filename = " << _filename.toStdString() << std::endl;
00365 setDirectory( fi.absolutePath() );
00366 selectFile ( fi.fileName() );
00367 }
00368
00369
00370
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 }