Quantum GIS API Documentation  1.7.4
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       // 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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines