//============================================================================= // // OpenFlipper // Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen // www.openflipper.org // //----------------------------------------------------------------------------- // // License // // OpenFlipper is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // OpenFlipper is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with OpenFlipper. If not, see . // //----------------------------------------------------------------------------- // // $Revision: 3388 $ // $Author: wilden $ // $Date: 2008-10-15 11:26:18 +0200 (Wed, 15 Oct 2008) $ // //============================================================================= #include "Core.hh" #include "OpenFlipper/common/GlobalOptions.hh" #include "OpenFlipper/BasePlugin/PluginFunctions.hh" #include "OpenFlipper/widgets/loadWidget/loadWidget.hh" #include #include #include /// Save Settings (slot is called from CoreWidget's File-Menu) void Core::saveSettings(){ // ======================================================================================== // generate the saveSettings-Dialog // ======================================================================================== QString complete_name; QFileDialog fileDialog( coreWidget_, tr("Save Settings"), OpenFlipper::Options::currentDirStr(), tr("INI files (*.ini);;OBJ files (*.obj )") ); fileDialog.setAcceptMode ( QFileDialog::AcceptSave ); fileDialog.setFileMode ( QFileDialog::AnyFile ); QGridLayout *layout = (QGridLayout*)fileDialog.layout(); QGroupBox* optionsBox = new QGroupBox( &fileDialog ) ; optionsBox->setSizePolicy( QSizePolicy ( QSizePolicy::Expanding , QSizePolicy::Preferred ) ); optionsBox->setTitle("Options"); layout->addWidget( optionsBox, layout->rowCount() , 0 , 1,layout->columnCount() ); QCheckBox *saveProgramSettings = new QCheckBox(optionsBox); saveProgramSettings->setText("Save program settings"); saveProgramSettings->setToolTip("Save all current program settings to the file ( This will include view settings, colors,...) "); saveProgramSettings->setCheckState( Qt::Unchecked ); QCheckBox *savePluginSettings = new QCheckBox(optionsBox); savePluginSettings->setText("Save per Plugin Settings"); savePluginSettings->setToolTip("Plugins should add their current global settings to the file"); savePluginSettings->setCheckState( Qt::Checked ); QCheckBox *saveObjectInfo = new QCheckBox(optionsBox); saveObjectInfo->setText("Save open object information to the file"); saveObjectInfo->setToolTip("Save all open Objects and add them to the settings file ( they will be loaded if opening the settings file"); saveObjectInfo->setCheckState( Qt::Checked ); QCheckBox *saveAllBox = new QCheckBox(optionsBox); saveAllBox->setText("Save everything to same folder"); saveAllBox->setToolTip("Save all open files to the same folder as the ini file"); saveAllBox->setCheckState( Qt::Checked ); QCheckBox *askOverwrite = new QCheckBox(optionsBox); askOverwrite->setText("Ask before overwriting files"); askOverwrite->setToolTip("If a file exists you will get asked what to do"); askOverwrite->setCheckState( Qt::Checked ); QCheckBox *targetOnly = new QCheckBox(optionsBox); targetOnly->setText("Save only target objects"); targetOnly->setToolTip("Only objects with target flag will be handled"); targetOnly->setCheckState( Qt::Unchecked ); QBoxLayout* frameLayout = new QBoxLayout(QBoxLayout::TopToBottom,optionsBox); frameLayout->addWidget( saveProgramSettings , 0 , 0); frameLayout->addWidget( savePluginSettings , 1 , 0); frameLayout->addWidget( saveObjectInfo , 2 , 0); frameLayout->addWidget( saveAllBox , 3 , 0); frameLayout->addWidget( askOverwrite , 4 , 0); frameLayout->addWidget( targetOnly , 5 , 0); frameLayout->addStretch(); fileDialog.resize(550 ,600); // ======================================================================================== // show the saveSettings-Dialog and get the target file // ======================================================================================== QStringList fileNames; if (fileDialog.exec()) { fileNames = fileDialog.selectedFiles(); } else { return; } if ( fileNames.size() > 1 ) { std::cerr << "Too many save filenames selected" << std::endl; return; } complete_name = fileNames[0]; //check the extension if its a known one if ( !complete_name.endsWith(".ini", Qt::CaseInsensitive) && !complete_name.endsWith(".obj", Qt::CaseInsensitive) ){ // If its unknown, get the type from the currently selected filter and add this extension to the filename if ( fileDialog.selectedNameFilter().contains("INI files (*.ini)") ) complete_name += ".ini"; else complete_name += ".obj"; } // Get the chosen directory and remember it. QString newpath = complete_name.section(OpenFlipper::Options::dirSeparator(),0,-2); OpenFlipper::Options::currentDir(newpath); // ======================================================================================== // update status information // ======================================================================================== OpenFlipper::Options::savingSettings(true); if ( OpenFlipper::Options::gui() ) { coreWidget_->statusMessage( "Saving Settings to " + complete_name + " ..."); coreWidget_->setStatus(ApplicationStatus::BLOCKED ); } // ======================================================================================== // Save the objects itself // ======================================================================================== // Depending on the checkbox iterate over all objects or only the selected ones. if ( saveObjectInfo->isChecked() ) { PluginFunctions::IteratorRestriction restriction; if ( targetOnly->isChecked() ) restriction = PluginFunctions::TARGET_OBJECTS; else restriction = PluginFunctions::ALL_OBJECTS; //Iterate over opened objects and save them for ( PluginFunctions::ObjectIterator o_it(restriction); o_it != PluginFunctions::objectsEnd(); ++o_it) { QString filename; if ( saveAllBox->isChecked() ) { // Use path of settings file for all objects filename = newpath + OpenFlipper::Options::dirSeparator() + o_it->name(); } else { // Use objects own path if it has one. Otherwise also use path of settings file filename = o_it->path() + OpenFlipper::Options::dirSeparator() + o_it->name(); // handle the case that the object was created in current session and not loaded from disk if (o_it->path() == ".") { filename = newpath + OpenFlipper::Options::dirSeparator() + o_it->name(); std::cerr << "newpath : " << newpath.toStdString() << std::endl; std::cerr << "name : " << o_it->name().toStdString() << std::endl; } } // enforce that all files end with obj extension if its an obj-settings file if ( complete_name.endsWith("obj") ) { if (!filename.endsWith("obj")) { // remove old extension int pos = filename.lastIndexOf("."); filename.remove(pos+1, filename.length() - pos); // add obj extension filename += "obj"; } } // decide whether to use saveObject or saveObjectTo if ( !QFile(filename).exists() || !askOverwrite->isChecked() ) saveObject( o_it->id(), filename); else saveObjectTo(o_it->id(), filename); } } // ======================================================================================== // Finally save all Settings // ======================================================================================== if ( complete_name.endsWith("ini") ) { // write to ini writeIniFile( complete_name, saveAllBox->isChecked(), targetOnly->isChecked(), saveProgramSettings->isChecked(), savePluginSettings->isChecked(), saveObjectInfo->isChecked()); } else if ( complete_name.endsWith("obj") ) { //write to obj writeObjFile(complete_name, saveAllBox->isChecked(), targetOnly->isChecked() ); } // update status OpenFlipper::Options::savingSettings(false); if ( OpenFlipper::Options::gui() ) { coreWidget_->statusMessage( "Saving Settings to " + complete_name + " ... Done", 4000); coreWidget_->setStatus(ApplicationStatus::READY ); } //add to recent files if ( OpenFlipper::Options::gui() ) coreWidget_->addRecent( complete_name, DATA_NONE ); }