Quantum GIS API Documentation  1.8
src/gui/qgisgui.cpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines