Quantum GIS API Documentation
1.8
|
00001 /*************************************************************************** 00002 qgisgui.cpp - Constants used throughout the QGIS GUI. 00003 -------------------------------------- 00004 Date : 11-Jan-2006 00005 Copyright : (C) 2006 by Tom Elwertowski 00006 Email : telwertowski at users dot sourceforge dot net 00007 *************************************************************************** 00008 * * 00009 * This program is free software; you can redistribute it and/or modify * 00010 * it under the terms of the GNU General Public License as published by * 00011 * the Free Software Foundation; either version 2 of the License, or * 00012 * (at your option) any later version. * 00013 * * 00014 ***************************************************************************/ 00015 #include "qgisgui.h" 00016 00017 #include <QSettings> 00018 #include <QObject> //for tr 00019 #include <QImageWriter> 00020 #include "qgsencodingfiledialog.h" 00021 #include "qgslogger.h" 00022 #include <memory> //for auto_ptr 00023 00024 00025 namespace QgisGui 00026 { 00027 00028 bool GUI_EXPORT openFilesRememberingFilter( QString const &filterName, 00029 QString const &filters, QStringList & selectedFiles, QString& enc, QString &title, 00030 bool cancelAll ) 00031 { 00032 Q_UNUSED( enc ); 00033 00034 QSettings settings; 00035 QString lastUsedFilter = settings.value( "/UI/" + filterName, "" ).toString(); 00036 QString lastUsedDir = settings.value( "/UI/" + filterName + "Dir", "." ).toString(); 00037 00038 QgsDebugMsg( "Opening file dialog with filters: " + filters ); 00039 if ( !cancelAll ) 00040 { 00041 selectedFiles = QFileDialog::getOpenFileNames( 0, title, lastUsedDir, filters, &lastUsedFilter ); 00042 } 00043 else //we have to use non-native dialog to add cancel all button 00044 { 00045 QgsEncodingFileDialog* openFileDialog = new QgsEncodingFileDialog( 0, title, lastUsedDir, filters, QString( "" ) ); 00046 00047 // allow for selection of more than one file 00048 openFileDialog->setFileMode( QFileDialog::ExistingFiles ); 00049 00050 if ( !lastUsedFilter.isEmpty() ) 00051 { 00052 openFileDialog->selectFilter( lastUsedFilter ); 00053 } 00054 openFileDialog->addCancelAll(); 00055 if ( openFileDialog->exec() == QDialog::Accepted ) 00056 { 00057 selectedFiles = openFileDialog->selectedFiles(); 00058 } 00059 else 00060 { 00061 //cancel or cancel all? 00062 if ( openFileDialog->cancelAll() ) 00063 { 00064 return true; 00065 } 00066 } 00067 } 00068 00069 if ( !selectedFiles.isEmpty() ) 00070 { 00071 // Fix by Tim - getting the dirPath from the dialog 00072 // directly truncates the last node in the dir path. 00073 // This is a workaround for that 00074 QString firstFileName = selectedFiles.first(); 00075 QFileInfo fi( firstFileName ); 00076 QString path = fi.path(); 00077 00078 QgsDebugMsg( "Writing last used dir: " + path ); 00079 00080 settings.setValue( "/UI/" + filterName, lastUsedFilter ); 00081 settings.setValue( "/UI/" + filterName + "Dir", path ); 00082 } 00083 return false; 00084 } 00085 00086 QPair<QString, QString> GUI_EXPORT getSaveAsImageName( QWidget *theParent, QString theMessage ) 00087 { 00088 // get a list of supported output image types 00089 QMap<QString, QString> filterMap; 00090 foreach( QByteArray format, QImageWriter::supportedImageFormats() ) 00091 { 00092 //svg doesnt work so skip it 00093 if ( format == "svg" ) 00094 continue; 00095 00096 filterMap.insert( createFileFilter_( format + " format", "*." + format ), format ); 00097 } 00098 00099 #ifdef QGISDEBUG 00100 QgsDebugMsg( "Available Filters Map: " ); 00101 for ( QMap<QString, QString>::iterator it = filterMap.begin(); it != filterMap.end(); ++it ) 00102 { 00103 QgsDebugMsg( it.key() + " : " + it.value() ); 00104 } 00105 #endif 00106 00107 //find out the last used filter 00108 QSettings settings; // where we keep last used filter in persistent state 00109 QString lastUsedFilter = settings.value( "/UI/lastSaveAsImageFilter" ).toString(); 00110 QString lastUsedDir = settings.value( "/UI/lastSaveAsImageDir", "." ).toString(); 00111 00112 QString outputFileName; 00113 QString selectedFilter = lastUsedFilter; 00114 QString ext; 00115 00116 #if defined(Q_OS_WIN) || defined(Q_OS_MAC) 00117 outputFileName = QFileDialog::getSaveFileName( theParent, theMessage, lastUsedDir, QStringList( filterMap.keys() ).join( ";;" ), &selectedFilter ); 00118 00119 if ( !outputFileName.isNull() ) 00120 { 00121 ext = filterMap.value( selectedFilter, QString::null ); 00122 if ( !ext.isNull() ) 00123 settings.setValue( "/UI/lastSaveAsImageFilter", selectedFilter ); 00124 settings.setValue( "/UI/lastSaveAsImageDir", QFileInfo( outputFileName ).absolutePath() ); 00125 } 00126 #else 00127 //create a file dialog using the the filter list generated above 00128 std::auto_ptr<QFileDialog> fileDialog( new QFileDialog( theParent, theMessage, lastUsedDir, QStringList( filterMap.keys() ).join( ";;" ) ) ); 00129 00130 // allow for selection of more than one file 00131 fileDialog->setFileMode( QFileDialog::AnyFile ); 00132 fileDialog->setAcceptMode( QFileDialog::AcceptSave ); 00133 fileDialog->setConfirmOverwrite( true ); 00134 00135 if ( !lastUsedFilter.isEmpty() ) // set the filter to the last one used 00136 { 00137 fileDialog->selectFilter( lastUsedFilter ); 00138 } 00139 00140 //prompt the user for a fileName 00141 if ( fileDialog->exec() == QDialog::Accepted ) 00142 { 00143 outputFileName = fileDialog->selectedFiles().first(); 00144 } 00145 00146 selectedFilter = fileDialog->selectedFilter(); 00147 QgsDebugMsg( "Selected filter: " + selectedFilter ); 00148 ext = filterMap.value( selectedFilter, QString::null ); 00149 00150 if ( !ext.isNull() ) 00151 settings.setValue( "/UI/lastSaveAsImageFilter", selectedFilter ); 00152 00153 settings.setValue( "/UI/lastSaveAsImageDir", fileDialog->directory().absolutePath() ); 00154 #endif 00155 00156 // Add the file type suffix to the fileName if required 00157 if ( !ext.isNull() && !outputFileName.endsWith( "." + ext ) ) 00158 { 00159 outputFileName += "." + ext; 00160 } 00161 00162 return qMakePair<QString, QString>( outputFileName, ext ); 00163 } 00164 00165 QString createFileFilter_( QString const &longName, QString const &glob ) 00166 { 00167 return longName + " (" + glob.toLower() + " " + glob.toUpper() + ")"; 00168 } 00169 00170 } // end of QgisGui namespace