Quantum GIS API Documentation
1.7.4
|
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 // allow for selection of more than one file 00047 openFileDialog->setFileMode( QFileDialog::ExistingFiles ); 00048 00049 if ( !lastUsedFilter.isEmpty() ) 00050 { 00051 openFileDialog->selectFilter( lastUsedFilter ); 00052 } 00053 openFileDialog->addCancelAll(); 00054 if ( openFileDialog->exec() == QDialog::Accepted ) 00055 { 00056 selectedFiles = openFileDialog->selectedFiles(); 00057 } 00058 else 00059 { 00060 //cancel or cancel all? 00061 if ( openFileDialog->cancelAll() ) 00062 { 00063 return true; 00064 } 00065 } 00066 } 00067 00068 if ( !selectedFiles.isEmpty() ) 00069 { 00070 // Fix by Tim - getting the dirPath from the dialog 00071 // directly truncates the last node in the dir path. 00072 // This is a workaround for that 00073 QString firstFileName = selectedFiles.first(); 00074 QFileInfo fi( firstFileName ); 00075 QString path = fi.path(); 00076 00077 QgsDebugMsg( "Writing last used dir: " + path ); 00078 00079 settings.setValue( "/UI/" + filterName, lastUsedFilter ); 00080 settings.setValue( "/UI/" + filterName + "Dir", path ); 00081 } 00082 return false; 00083 } 00084 00085 QPair<QString, QString> GUI_EXPORT getSaveAsImageName( QWidget *theParent, QString theMessage ) 00086 { 00087 // get a list of supported output image types 00088 QMap<QString, QString> filterMap; 00089 foreach( QByteArray format, QImageWriter::supportedImageFormats() ) 00090 { 00091 //svg doesnt work so skip it 00092 if ( format == "svg" ) 00093 continue; 00094 00095 filterMap.insert( createFileFilter_( format + " format", "*." + format ), format ); 00096 } 00097 00098 #ifdef QGISDEBUG 00099 QgsDebugMsg( "Available Filters Map: " ); 00100 for ( QMap<QString, QString>::iterator it = filterMap.begin(); it != filterMap.end(); ++it ) 00101 { 00102 QgsDebugMsg( it.key() + " : " + it.value() ); 00103 } 00104 #endif 00105 00106 //find out the last used filter 00107 QSettings settings; // where we keep last used filter in persistent state 00108 QString lastUsedFilter = settings.value( "/UI/lastSaveAsImageFilter" ).toString(); 00109 QString lastUsedDir = settings.value( "/UI/lastSaveAsImageDir", "." ).toString(); 00110 00111 QString outputFileName; 00112 QString selectedFilter = lastUsedFilter; 00113 QString ext; 00114 00115 #if defined(Q_OS_WIN) || defined(Q_OS_MAC) 00116 outputFileName = QFileDialog::getSaveFileName( theParent, theMessage, lastUsedDir, QStringList( filterMap.keys() ).join( ";;" ), &selectedFilter ); 00117 00118 if ( !outputFileName.isNull() ) 00119 { 00120 ext = filterMap.value( selectedFilter, QString::null ); 00121 if ( !ext.isNull() ) 00122 settings.setValue( "/UI/lastSaveAsImageFilter", selectedFilter ); 00123 settings.setValue( "/UI/lastSaveAsImageDir", QFileInfo( outputFileName ).absolutePath() ); 00124 } 00125 #else 00126 //create a file dialog using the the filter list generated above 00127 std::auto_ptr<QFileDialog> fileDialog( new QFileDialog( theParent, theMessage, lastUsedDir, QStringList( filterMap.keys() ).join( ";;" ) ) ); 00128 00129 // allow for selection of more than one file 00130 fileDialog->setFileMode( QFileDialog::AnyFile ); 00131 fileDialog->setAcceptMode( QFileDialog::AcceptSave ); 00132 fileDialog->setConfirmOverwrite( true ); 00133 00134 if ( !lastUsedFilter.isEmpty() ) // set the filter to the last one used 00135 { 00136 fileDialog->selectFilter( lastUsedFilter ); 00137 } 00138 00139 //prompt the user for a fileName 00140 if ( fileDialog->exec() == QDialog::Accepted ) 00141 { 00142 outputFileName = fileDialog->selectedFiles().first(); 00143 } 00144 00145 selectedFilter = fileDialog->selectedFilter(); 00146 QgsDebugMsg( "Selected filter: " + selectedFilter ); 00147 ext = filterMap.value( selectedFilter, QString::null ); 00148 00149 if ( !ext.isNull() ) 00150 settings.setValue( "/UI/lastSaveAsImageFilter", selectedFilter ); 00151 00152 settings.setValue( "/UI/lastSaveAsImageDir", fileDialog->directory().absolutePath() ); 00153 #endif 00154 00155 // Add the file type suffix to the fileName if required 00156 if ( !ext.isNull() && !outputFileName.endsWith( "." + ext ) ) 00157 { 00158 outputFileName += "." + ext; 00159 } 00160 00161 return qMakePair<QString, QString>( outputFileName, ext ); 00162 } 00163 00164 QString createFileFilter_( QString const &longName, QString const &glob ) 00165 { 00166 return longName + " (" + glob.toLower() + " " + glob.toUpper() + ")"; 00167 } 00168 00169 } // end of QgisGui namespace