Quantum GIS API Documentation  1.7.5-Wroclaw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
qgisgui.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgisgui.cpp - Constants used throughout the QGIS GUI.
3  --------------------------------------
4  Date : 11-Jan-2006
5  Copyright : (C) 2006 by Tom Elwertowski
6  Email : telwertowski at users dot sourceforge dot net
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 #include "qgisgui.h"
16 
17 #include <QSettings>
18 #include <QObject> //for tr
19 #include <QImageWriter>
20 #include "qgsencodingfiledialog.h"
21 #include "qgslogger.h"
22 #include <memory> //for auto_ptr
23 
24 
25 namespace QgisGui
26 {
27 
28  bool GUI_EXPORT openFilesRememberingFilter( QString const &filterName,
29  QString const &filters, QStringList & selectedFiles, QString& enc, QString &title,
30  bool cancelAll )
31  {
32  Q_UNUSED( enc );
33 
34  QSettings settings;
35  QString lastUsedFilter = settings.value( "/UI/" + filterName, "" ).toString();
36  QString lastUsedDir = settings.value( "/UI/" + filterName + "Dir", "." ).toString();
37 
38  QgsDebugMsg( "Opening file dialog with filters: " + filters );
39  if ( !cancelAll )
40  {
41  selectedFiles = QFileDialog::getOpenFileNames( 0, title, lastUsedDir, filters, &lastUsedFilter );
42  }
43  else //we have to use non-native dialog to add cancel all button
44  {
45  QgsEncodingFileDialog* openFileDialog = new QgsEncodingFileDialog( 0, title, lastUsedDir, filters, QString( "" ) );
46  // allow for selection of more than one file
47  openFileDialog->setFileMode( QFileDialog::ExistingFiles );
48 
49  if ( !lastUsedFilter.isEmpty() )
50  {
51  openFileDialog->selectFilter( lastUsedFilter );
52  }
53  openFileDialog->addCancelAll();
54  if ( openFileDialog->exec() == QDialog::Accepted )
55  {
56  selectedFiles = openFileDialog->selectedFiles();
57  }
58  else
59  {
60  //cancel or cancel all?
61  if ( openFileDialog->cancelAll() )
62  {
63  return true;
64  }
65  }
66  }
67 
68  if ( !selectedFiles.isEmpty() )
69  {
70  // Fix by Tim - getting the dirPath from the dialog
71  // directly truncates the last node in the dir path.
72  // This is a workaround for that
73  QString firstFileName = selectedFiles.first();
74  QFileInfo fi( firstFileName );
75  QString path = fi.path();
76 
77  QgsDebugMsg( "Writing last used dir: " + path );
78 
79  settings.setValue( "/UI/" + filterName, lastUsedFilter );
80  settings.setValue( "/UI/" + filterName + "Dir", path );
81  }
82  return false;
83  }
84 
85  QPair<QString, QString> GUI_EXPORT getSaveAsImageName( QWidget *theParent, QString theMessage )
86  {
87  // get a list of supported output image types
88  QMap<QString, QString> filterMap;
89  foreach( QByteArray format, QImageWriter::supportedImageFormats() )
90  {
91  //svg doesnt work so skip it
92  if ( format == "svg" )
93  continue;
94 
95  filterMap.insert( createFileFilter_( format + " format", "*." + format ), format );
96  }
97 
98 #ifdef QGISDEBUG
99  QgsDebugMsg( "Available Filters Map: " );
100  for ( QMap<QString, QString>::iterator it = filterMap.begin(); it != filterMap.end(); ++it )
101  {
102  QgsDebugMsg( it.key() + " : " + it.value() );
103  }
104 #endif
105 
106  //find out the last used filter
107  QSettings settings; // where we keep last used filter in persistent state
108  QString lastUsedFilter = settings.value( "/UI/lastSaveAsImageFilter" ).toString();
109  QString lastUsedDir = settings.value( "/UI/lastSaveAsImageDir", "." ).toString();
110 
111  QString outputFileName;
112  QString selectedFilter = lastUsedFilter;
113  QString ext;
114 
115 #if defined(Q_OS_WIN) || defined(Q_OS_MAC)
116  outputFileName = QFileDialog::getSaveFileName( theParent, theMessage, lastUsedDir, QStringList( filterMap.keys() ).join( ";;" ), &selectedFilter );
117 
118  if ( !outputFileName.isNull() )
119  {
120  ext = filterMap.value( selectedFilter, QString::null );
121  if ( !ext.isNull() )
122  settings.setValue( "/UI/lastSaveAsImageFilter", selectedFilter );
123  settings.setValue( "/UI/lastSaveAsImageDir", QFileInfo( outputFileName ).absolutePath() );
124  }
125 #else
126  //create a file dialog using the the filter list generated above
127  std::auto_ptr<QFileDialog> fileDialog( new QFileDialog( theParent, theMessage, lastUsedDir, QStringList( filterMap.keys() ).join( ";;" ) ) );
128 
129  // allow for selection of more than one file
130  fileDialog->setFileMode( QFileDialog::AnyFile );
131  fileDialog->setAcceptMode( QFileDialog::AcceptSave );
132  fileDialog->setConfirmOverwrite( true );
133 
134  if ( !lastUsedFilter.isEmpty() ) // set the filter to the last one used
135  {
136  fileDialog->selectFilter( lastUsedFilter );
137  }
138 
139  //prompt the user for a fileName
140  if ( fileDialog->exec() == QDialog::Accepted )
141  {
142  outputFileName = fileDialog->selectedFiles().first();
143  }
144 
145  selectedFilter = fileDialog->selectedFilter();
146  QgsDebugMsg( "Selected filter: " + selectedFilter );
147  ext = filterMap.value( selectedFilter, QString::null );
148 
149  if ( !ext.isNull() )
150  settings.setValue( "/UI/lastSaveAsImageFilter", selectedFilter );
151 
152  settings.setValue( "/UI/lastSaveAsImageDir", fileDialog->directory().absolutePath() );
153 #endif
154 
155  // Add the file type suffix to the fileName if required
156  if ( !ext.isNull() && !outputFileName.endsWith( "." + ext ) )
157  {
158  outputFileName += "." + ext;
159  }
160 
161  return qMakePair<QString, QString>( outputFileName, ext );
162  }
163 
164  QString createFileFilter_( QString const &longName, QString const &glob )
165  {
166  return longName + " (" + glob.toLower() + " " + glob.toUpper() + ")";
167  }
168 
169 } // end of QgisGui namespace