annotate data/fileio/FileFinder.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents 247ea6460ec2
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2007 QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "FileFinder.h"
lbajardsilogic@0 17 #include "RemoteFile.h"
lbajardsilogic@0 18 #include "AudioFileReaderFactory.h"
lbajardsilogic@0 19 #include "DataFileReaderFactory.h"
lbajardsilogic@0 20
lbajardsilogic@0 21 #include <QFileInfo>
lbajardsilogic@0 22 #include <QMessageBox>
lbajardsilogic@0 23 #include <QFileDialog>
lbajardsilogic@0 24 #include <QInputDialog>
lbajardsilogic@0 25 #include <QSettings>
lbajardsilogic@0 26
lbajardsilogic@0 27 #include <iostream>
lbajardsilogic@0 28
lbajardsilogic@0 29 FileFinder *
lbajardsilogic@0 30 FileFinder::m_instance = 0;
lbajardsilogic@0 31
lbajardsilogic@0 32 FileFinder::FileFinder() :
lbajardsilogic@0 33 m_lastLocatedLocation("")
lbajardsilogic@0 34 {
lbajardsilogic@0 35 }
lbajardsilogic@0 36
lbajardsilogic@0 37 FileFinder::~FileFinder()
lbajardsilogic@0 38 {
lbajardsilogic@0 39 }
lbajardsilogic@0 40
lbajardsilogic@0 41 FileFinder *
lbajardsilogic@0 42 FileFinder::getInstance()
lbajardsilogic@0 43 {
lbajardsilogic@0 44 if (m_instance == 0) {
lbajardsilogic@0 45 m_instance = new FileFinder();
lbajardsilogic@0 46 }
lbajardsilogic@0 47 return m_instance;
lbajardsilogic@0 48 }
lbajardsilogic@0 49
lbajardsilogic@0 50 QString
lbajardsilogic@0 51 FileFinder::getOpenFileName(FileType type, QString fallbackLocation)
lbajardsilogic@0 52 {
lbajardsilogic@0 53 QString settingsKey;
lbajardsilogic@0 54 QString lastPath = fallbackLocation;
lbajardsilogic@0 55
lbajardsilogic@0 56 QString title = tr("Select file");
lbajardsilogic@0 57 QString filter = tr("All files (*.*)");
lbajardsilogic@0 58
lbajardsilogic@0 59 switch (type) {
lbajardsilogic@0 60
lbajardsilogic@0 61 case SessionFile:
lbajardsilogic@0 62 settingsKey = "sessionpath";
lbajardsilogic@0 63 title = tr("Select a session file");
lbajardsilogic@42 64 filter = tr("Sound Access session files (*.sv)\nAll files (*.*)");
lbajardsilogic@0 65 break;
lbajardsilogic@0 66
lbajardsilogic@0 67 case AudioFile:
lbajardsilogic@0 68 settingsKey = "audiopath";
lbajardsilogic@0 69 title = "Select an audio file";
lbajardsilogic@0 70 filter = tr("Audio files (%1)\nAll files (*.*)")
lbajardsilogic@0 71 .arg(AudioFileReaderFactory::getKnownExtensions());
lbajardsilogic@0 72 break;
ivand_qmul@118 73 // Ivan Damnjanovic 09-10/2007 added video file import
ivand_qmul@118 74 case VideoFile:
ivand_qmul@118 75 settingsKey = "videopath";
ivand_qmul@118 76 title = "Select an video file";
ivand_qmul@118 77 filter = tr("All supported video files (*.avi *.mpg *.divx *.mov)\nAll files (*.*)")
ivand_qmul@118 78 .arg(AudioFileReaderFactory::getKnownExtensions());
ivand_qmul@118 79 break;
ivand_qmul@118 80 //
ivand_qmul@118 81 case LayerFile:
lbajardsilogic@0 82 settingsKey = "layerpath";
lbajardsilogic@42 83 filter = tr("All supported files (%1)\nSound Access Layer XML files (*.svl)\nComma-separated data files (*.csv)\nSpace-separated .lab files (*.lab)\nMIDI files (*.mid)\nText files (*.txt)\nAll files (*.*)").arg(DataFileReaderFactory::getKnownExtensions());
lbajardsilogic@0 84 break;
lbajardsilogic@0 85
lbajardsilogic@0 86 case SessionOrAudioFile:
lbajardsilogic@0 87 settingsKey = "lastpath";
lbajardsilogic@42 88 filter = tr("All supported files (*.sv %1)\nSound Access session files (*.sv)\nAudio files (%1)\nAll files (*.*)")
lbajardsilogic@0 89 .arg(AudioFileReaderFactory::getKnownExtensions());
lbajardsilogic@0 90 break;
lbajardsilogic@0 91
lbajardsilogic@0 92 case ImageFile:
lbajardsilogic@0 93 settingsKey = "imagepath";
lbajardsilogic@0 94 filter = tr("Portable Network Graphics files (*.png)\nAll files (*.*)");
lbajardsilogic@0 95 break;
lbajardsilogic@0 96
lbajardsilogic@0 97 case AnyFile:
lbajardsilogic@0 98 settingsKey = "lastpath";
lbajardsilogic@42 99 filter = tr("All supported files (*.sv %1 %2)\nSound Access session files (*.sv)\nAudio files (%1)\nLayer files (%2)\nAll files (*.*)")
lbajardsilogic@0 100 .arg(AudioFileReaderFactory::getKnownExtensions())
lbajardsilogic@0 101 .arg(DataFileReaderFactory::getKnownExtensions());
lbajardsilogic@0 102 break;
lbajardsilogic@0 103 };
lbajardsilogic@0 104
lbajardsilogic@0 105 if (lastPath == "") {
lbajardsilogic@0 106 char *home = getenv("HOME");
lbajardsilogic@0 107 if (home) lastPath = home;
lbajardsilogic@0 108 else lastPath = ".";
lbajardsilogic@0 109 } else if (QFileInfo(lastPath).isDir()) {
lbajardsilogic@0 110 lastPath = QFileInfo(lastPath).canonicalPath();
lbajardsilogic@0 111 } else {
lbajardsilogic@0 112 lastPath = QFileInfo(lastPath).absoluteDir().canonicalPath();
lbajardsilogic@0 113 }
lbajardsilogic@0 114
lbajardsilogic@0 115 QSettings settings;
lbajardsilogic@0 116 settings.beginGroup("FileFinder");
lbajardsilogic@0 117 lastPath = settings.value(settingsKey, lastPath).toString();
lbajardsilogic@0 118
lbajardsilogic@0 119 QString path = "";
lbajardsilogic@0 120
lbajardsilogic@0 121 // Use our own QFileDialog just for symmetry with getSaveFileName below
lbajardsilogic@0 122
lbajardsilogic@0 123 QFileDialog dialog;
lbajardsilogic@0 124 dialog.setFilters(filter.split('\n'));
lbajardsilogic@0 125 dialog.setWindowTitle(title);
lbajardsilogic@0 126 dialog.setDirectory(lastPath);
lbajardsilogic@0 127
lbajardsilogic@0 128 dialog.setAcceptMode(QFileDialog::AcceptOpen);
lbajardsilogic@0 129 dialog.setFileMode(QFileDialog::ExistingFile);
lbajardsilogic@128 130 dialog.setViewMode(QFileDialog::Detail);
lbajardsilogic@0 131
lbajardsilogic@0 132 if (dialog.exec()) {
lbajardsilogic@0 133 QStringList files = dialog.selectedFiles();
lbajardsilogic@0 134 if (!files.empty()) path = *files.begin();
lbajardsilogic@0 135
lbajardsilogic@0 136 QFileInfo fi(path);
lbajardsilogic@0 137
lbajardsilogic@0 138 if (!fi.exists()) {
lbajardsilogic@0 139
lbajardsilogic@0 140 QMessageBox::critical(0, tr("File does not exist"),
lbajardsilogic@0 141 tr("File \"%1\" does not exist").arg(path));
lbajardsilogic@0 142 path = "";
lbajardsilogic@0 143
lbajardsilogic@0 144 } else if (!fi.isReadable()) {
lbajardsilogic@0 145
lbajardsilogic@0 146 QMessageBox::critical(0, tr("File is not readable"),
lbajardsilogic@0 147 tr("File \"%1\" can not be read").arg(path));
lbajardsilogic@0 148 path = "";
lbajardsilogic@0 149
lbajardsilogic@0 150 } else if (fi.isDir()) {
lbajardsilogic@0 151
lbajardsilogic@0 152 QMessageBox::critical(0, tr("Directory selected"),
lbajardsilogic@0 153 tr("File \"%1\" is a directory").arg(path));
lbajardsilogic@0 154 path = "";
lbajardsilogic@0 155
lbajardsilogic@0 156 } else if (!fi.isFile()) {
lbajardsilogic@0 157
lbajardsilogic@0 158 QMessageBox::critical(0, tr("Non-file selected"),
lbajardsilogic@0 159 tr("Path \"%1\" is not a file").arg(path));
lbajardsilogic@0 160 path = "";
lbajardsilogic@0 161
lbajardsilogic@0 162 } else if (fi.size() == 0) {
lbajardsilogic@0 163
lbajardsilogic@0 164 QMessageBox::critical(0, tr("File is empty"),
lbajardsilogic@0 165 tr("File \"%1\" is empty").arg(path));
lbajardsilogic@0 166 path = "";
lbajardsilogic@0 167 }
lbajardsilogic@0 168 }
lbajardsilogic@0 169
lbajardsilogic@0 170 if (path != "") {
lbajardsilogic@0 171 settings.setValue(settingsKey,
lbajardsilogic@0 172 QFileInfo(path).absoluteDir().canonicalPath());
lbajardsilogic@0 173 }
lbajardsilogic@0 174
lbajardsilogic@0 175 return path;
lbajardsilogic@0 176 }
lbajardsilogic@0 177
lbajardsilogic@0 178 QString
lbajardsilogic@0 179 FileFinder::getSaveFileName(FileType type, QString fallbackLocation)
lbajardsilogic@0 180 {
lbajardsilogic@0 181 QString settingsKey;
lbajardsilogic@0 182 QString lastPath = fallbackLocation;
lbajardsilogic@0 183
lbajardsilogic@0 184 QString title = tr("Select file");
lbajardsilogic@0 185 QString filter = tr("All files (*.*)");
lbajardsilogic@0 186
lbajardsilogic@0 187 switch (type) {
lbajardsilogic@0 188
lbajardsilogic@0 189 case SessionFile:
lbajardsilogic@0 190 settingsKey = "savesessionpath";
lbajardsilogic@0 191 title = tr("Select a session file");
lbajardsilogic@42 192 filter = tr("Sound Access session files (*.sv)\nAll files (*.*)");
lbajardsilogic@0 193 break;
lbajardsilogic@0 194
lbajardsilogic@0 195 case AudioFile:
lbajardsilogic@0 196 settingsKey = "saveaudiopath";
lbajardsilogic@0 197 title = "Select an audio file";
lbajardsilogic@0 198 title = tr("Select a file to export to");
lbajardsilogic@0 199 filter = tr("WAV audio files (*.wav)\nAll files (*.*)");
lbajardsilogic@0 200 break;
lbajardsilogic@0 201
lbajardsilogic@0 202 case LayerFile:
lbajardsilogic@0 203 settingsKey = "savelayerpath";
lbajardsilogic@0 204 title = tr("Select a file to export to");
lbajardsilogic@42 205 filter = tr("Sound Access Layer XML files (*.svl)\nComma-separated data files (*.csv)\nText files (*.txt)\nAll files (*.*)");
lbajardsilogic@0 206 break;
lbajardsilogic@0 207
lbajardsilogic@0 208 case SessionOrAudioFile:
lbajardsilogic@0 209 std::cerr << "ERROR: Internal error: FileFinder::getSaveFileName: SessionOrAudioFile cannot be used here" << std::endl;
lbajardsilogic@0 210 abort();
lbajardsilogic@0 211
lbajardsilogic@0 212 case ImageFile:
lbajardsilogic@0 213 settingsKey = "saveimagepath";
lbajardsilogic@0 214 title = tr("Select a file to export to");
lbajardsilogic@0 215 filter = tr("Portable Network Graphics files (*.png)\nAll files (*.*)");
lbajardsilogic@0 216 break;
lbajardsilogic@0 217
lbajardsilogic@0 218 case AnyFile:
lbajardsilogic@0 219 std::cerr << "ERROR: Internal error: FileFinder::getSaveFileName: AnyFile cannot be used here" << std::endl;
lbajardsilogic@0 220 abort();
lbajardsilogic@0 221 };
lbajardsilogic@0 222
lbajardsilogic@0 223 if (lastPath == "") {
lbajardsilogic@0 224 char *home = getenv("HOME");
lbajardsilogic@0 225 if (home) lastPath = home;
lbajardsilogic@0 226 else lastPath = ".";
lbajardsilogic@0 227 } else if (QFileInfo(lastPath).isDir()) {
lbajardsilogic@0 228 lastPath = QFileInfo(lastPath).canonicalPath();
lbajardsilogic@0 229 } else {
lbajardsilogic@0 230 lastPath = QFileInfo(lastPath).absoluteDir().canonicalPath();
lbajardsilogic@0 231 }
lbajardsilogic@0 232
lbajardsilogic@0 233 QSettings settings;
lbajardsilogic@0 234 settings.beginGroup("FileFinder");
lbajardsilogic@0 235 lastPath = settings.value(settingsKey, lastPath).toString();
lbajardsilogic@0 236
lbajardsilogic@0 237 QString path = "";
lbajardsilogic@0 238
lbajardsilogic@0 239 // Use our own QFileDialog instead of static functions, as we may
lbajardsilogic@0 240 // need to adjust the file extension based on the selected filter
lbajardsilogic@0 241
lbajardsilogic@0 242 QFileDialog dialog;
lbajardsilogic@0 243 dialog.setFilters(filter.split('\n'));
lbajardsilogic@0 244 dialog.setWindowTitle(title);
lbajardsilogic@0 245 dialog.setDirectory(lastPath);
lbajardsilogic@0 246
lbajardsilogic@0 247 dialog.setAcceptMode(QFileDialog::AcceptSave);
lbajardsilogic@0 248 dialog.setFileMode(QFileDialog::AnyFile);
lbajardsilogic@0 249 dialog.setConfirmOverwrite(false); // we'll do that
lbajardsilogic@0 250
lbajardsilogic@0 251 if (type == SessionFile) {
lbajardsilogic@0 252 dialog.setDefaultSuffix("sv");
lbajardsilogic@0 253 } else if (type == AudioFile) {
lbajardsilogic@0 254 dialog.setDefaultSuffix("wav");
lbajardsilogic@0 255 } else if (type == ImageFile) {
lbajardsilogic@0 256 dialog.setDefaultSuffix("png");
lbajardsilogic@0 257 }
lbajardsilogic@0 258
lbajardsilogic@0 259 bool good = false;
lbajardsilogic@0 260
lbajardsilogic@0 261 while (!good) {
lbajardsilogic@0 262
lbajardsilogic@0 263 path = "";
lbajardsilogic@0 264
lbajardsilogic@0 265 if (!dialog.exec()) break;
lbajardsilogic@0 266
lbajardsilogic@0 267 QStringList files = dialog.selectedFiles();
lbajardsilogic@0 268 if (files.empty()) break;
lbajardsilogic@0 269 path = *files.begin();
lbajardsilogic@0 270
lbajardsilogic@0 271 QFileInfo fi(path);
lbajardsilogic@0 272
lbajardsilogic@0 273 if (type == LayerFile && fi.suffix() == "") {
lbajardsilogic@0 274 QString expectedExtension;
lbajardsilogic@0 275 QString selectedFilter = dialog.selectedFilter();
lbajardsilogic@0 276 if (selectedFilter.contains(".svl")) {
lbajardsilogic@0 277 expectedExtension = "svl";
lbajardsilogic@0 278 } else if (selectedFilter.contains(".txt")) {
lbajardsilogic@0 279 expectedExtension = "txt";
lbajardsilogic@0 280 } else if (selectedFilter.contains(".csv")) {
lbajardsilogic@0 281 expectedExtension = "csv";
lbajardsilogic@0 282 }
lbajardsilogic@0 283 if (expectedExtension != "") {
lbajardsilogic@0 284 path = QString("%1.%2").arg(path).arg(expectedExtension);
lbajardsilogic@0 285 fi = QFileInfo(path);
lbajardsilogic@0 286 }
lbajardsilogic@0 287 }
lbajardsilogic@0 288
lbajardsilogic@0 289 if (fi.isDir()) {
lbajardsilogic@0 290 QMessageBox::critical(0, tr("Directory selected"),
lbajardsilogic@0 291 tr("File \"%1\" is a directory").arg(path));
lbajardsilogic@0 292 continue;
lbajardsilogic@0 293 }
lbajardsilogic@0 294
lbajardsilogic@0 295 if (fi.exists()) {
lbajardsilogic@0 296 if (QMessageBox::question(0, tr("File exists"),
lbajardsilogic@0 297 tr("The file \"%1\" already exists.\nDo you want to overwrite it?").arg(path),
lbajardsilogic@0 298 QMessageBox::Ok,
lbajardsilogic@0 299 QMessageBox::Cancel) != QMessageBox::Ok) {
lbajardsilogic@0 300 continue;
lbajardsilogic@0 301 }
lbajardsilogic@0 302 }
lbajardsilogic@0 303
lbajardsilogic@0 304 good = true;
lbajardsilogic@0 305 }
lbajardsilogic@0 306
lbajardsilogic@0 307 if (path != "") {
lbajardsilogic@0 308 settings.setValue(settingsKey,
lbajardsilogic@0 309 QFileInfo(path).absoluteDir().canonicalPath());
lbajardsilogic@0 310 }
lbajardsilogic@0 311
lbajardsilogic@0 312 return path;
lbajardsilogic@0 313 }
lbajardsilogic@0 314
lbajardsilogic@0 315 void
lbajardsilogic@0 316 FileFinder::registerLastOpenedFilePath(FileType type, QString path)
lbajardsilogic@0 317 {
lbajardsilogic@0 318 QString settingsKey;
lbajardsilogic@0 319
lbajardsilogic@0 320 switch (type) {
lbajardsilogic@0 321 case SessionFile:
lbajardsilogic@0 322 settingsKey = "sessionpath";
lbajardsilogic@0 323 break;
lbajardsilogic@0 324
lbajardsilogic@0 325 case AudioFile:
lbajardsilogic@0 326 settingsKey = "audiopath";
lbajardsilogic@0 327 break;
ivand_qmul@118 328 // Ivan Damnjanovic 09-10/2007 added video file import
ivand_qmul@118 329 case VideoFile:
ivand_qmul@118 330 settingsKey = "videopath";
ivand_qmul@118 331 break;
ivand_qmul@118 332 //
lbajardsilogic@0 333 case LayerFile:
lbajardsilogic@0 334 settingsKey = "layerpath";
lbajardsilogic@0 335 break;
lbajardsilogic@0 336
lbajardsilogic@0 337 case SessionOrAudioFile:
lbajardsilogic@0 338 settingsKey = "lastpath";
lbajardsilogic@0 339 break;
lbajardsilogic@0 340
lbajardsilogic@0 341 case ImageFile:
lbajardsilogic@0 342 settingsKey = "imagepath";
lbajardsilogic@0 343 break;
lbajardsilogic@0 344
lbajardsilogic@0 345 case AnyFile:
lbajardsilogic@0 346 settingsKey = "lastpath";
lbajardsilogic@0 347 break;
lbajardsilogic@0 348 }
lbajardsilogic@0 349
lbajardsilogic@0 350 if (path != "") {
lbajardsilogic@0 351 QSettings settings;
lbajardsilogic@0 352 settings.beginGroup("FileFinder");
lbajardsilogic@0 353 path = QFileInfo(path).absoluteDir().canonicalPath();
lbajardsilogic@0 354 settings.setValue(settingsKey, path);
lbajardsilogic@0 355 settings.setValue("lastpath", path);
lbajardsilogic@0 356 }
lbajardsilogic@0 357 }
lbajardsilogic@0 358
lbajardsilogic@0 359 QString
lbajardsilogic@0 360 FileFinder::find(FileType type, QString location, QString lastKnownLocation)
lbajardsilogic@0 361 {
lbajardsilogic@0 362 if (QFileInfo(location).exists()) return location;
lbajardsilogic@0 363
lbajardsilogic@0 364 if (RemoteFile::canHandleScheme(QUrl(location))) {
lbajardsilogic@0 365 RemoteFile rf(location);
lbajardsilogic@0 366 bool available = rf.isAvailable();
lbajardsilogic@0 367 rf.deleteLocalFile();
lbajardsilogic@0 368 if (available) return location;
lbajardsilogic@0 369 }
lbajardsilogic@0 370
lbajardsilogic@0 371 QString foundAt = "";
lbajardsilogic@0 372
lbajardsilogic@0 373 if ((foundAt = findRelative(location, lastKnownLocation)) != "") {
lbajardsilogic@0 374 return foundAt;
lbajardsilogic@0 375 }
lbajardsilogic@0 376
lbajardsilogic@0 377 if ((foundAt = findRelative(location, m_lastLocatedLocation)) != "") {
lbajardsilogic@0 378 return foundAt;
lbajardsilogic@0 379 }
lbajardsilogic@0 380
lbajardsilogic@0 381 return locateInteractive(type, location);
lbajardsilogic@0 382 }
lbajardsilogic@0 383
lbajardsilogic@0 384 QString
lbajardsilogic@0 385 FileFinder::findRelative(QString location, QString relativeTo)
lbajardsilogic@0 386 {
lbajardsilogic@0 387 if (relativeTo == "") return "";
lbajardsilogic@0 388
lbajardsilogic@0 389 std::cerr << "Looking for \"" << location.toStdString() << "\" next to \""
lbajardsilogic@0 390 << relativeTo.toStdString() << "\"..." << std::endl;
lbajardsilogic@0 391
lbajardsilogic@0 392 QString fileName;
lbajardsilogic@0 393 QString resolved;
lbajardsilogic@0 394
lbajardsilogic@0 395 if (RemoteFile::canHandleScheme(QUrl(location))) {
lbajardsilogic@0 396 fileName = QUrl(location).path().section('/', -1, -1,
lbajardsilogic@0 397 QString::SectionSkipEmpty);
lbajardsilogic@0 398 } else {
lbajardsilogic@0 399 fileName = QFileInfo(location).fileName();
lbajardsilogic@0 400 }
lbajardsilogic@0 401
lbajardsilogic@0 402 if (RemoteFile::canHandleScheme(QUrl(relativeTo))) {
lbajardsilogic@0 403 resolved = QUrl(relativeTo).resolved(fileName).toString();
lbajardsilogic@0 404 RemoteFile rf(resolved);
lbajardsilogic@0 405 if (!rf.isAvailable()) resolved = "";
lbajardsilogic@0 406 std::cerr << "resolved: " << resolved.toStdString() << std::endl;
lbajardsilogic@0 407 rf.deleteLocalFile();
lbajardsilogic@0 408 } else {
lbajardsilogic@0 409 resolved = QFileInfo(relativeTo).dir().filePath(fileName);
lbajardsilogic@0 410 if (!QFileInfo(resolved).exists() ||
lbajardsilogic@0 411 !QFileInfo(resolved).isFile() ||
lbajardsilogic@0 412 !QFileInfo(resolved).isReadable()) {
lbajardsilogic@0 413 resolved = "";
lbajardsilogic@0 414 }
lbajardsilogic@0 415 }
lbajardsilogic@0 416
lbajardsilogic@0 417 return resolved;
lbajardsilogic@0 418 }
lbajardsilogic@0 419
lbajardsilogic@0 420 QString
lbajardsilogic@0 421 FileFinder::locateInteractive(FileType type, QString thing)
lbajardsilogic@0 422 {
lbajardsilogic@0 423 QString question;
lbajardsilogic@0 424 if (type == AudioFile) {
lbajardsilogic@0 425 question = tr("Audio file \"%1\" could not be opened.\nDo you want to locate it?");
lbajardsilogic@0 426 } else {
lbajardsilogic@0 427 question = tr("File \"%1\" could not be opened.\nDo you want to locate it?");
lbajardsilogic@0 428 }
lbajardsilogic@0 429
lbajardsilogic@0 430 QString path = "";
lbajardsilogic@0 431 bool done = false;
lbajardsilogic@0 432
lbajardsilogic@0 433 while (!done) {
lbajardsilogic@0 434
lbajardsilogic@0 435 int rv = QMessageBox::question
lbajardsilogic@0 436 (0,
lbajardsilogic@0 437 tr("Failed to open file"),
lbajardsilogic@0 438 question.arg(thing),
lbajardsilogic@0 439 tr("Locate file..."),
lbajardsilogic@0 440 tr("Use URL..."),
lbajardsilogic@0 441 tr("Cancel"),
lbajardsilogic@0 442 0, 2);
lbajardsilogic@0 443
lbajardsilogic@0 444 switch (rv) {
lbajardsilogic@0 445
lbajardsilogic@0 446 case 0: // Locate file
lbajardsilogic@0 447
lbajardsilogic@0 448 if (QFileInfo(thing).dir().exists()) {
lbajardsilogic@0 449 path = QFileInfo(thing).dir().canonicalPath();
lbajardsilogic@0 450 }
lbajardsilogic@0 451
lbajardsilogic@0 452 path = getOpenFileName(type, path);
lbajardsilogic@0 453 done = (path != "");
lbajardsilogic@0 454 break;
lbajardsilogic@0 455
lbajardsilogic@0 456 case 1: // Use URL
lbajardsilogic@0 457 {
lbajardsilogic@0 458 bool ok = false;
lbajardsilogic@0 459 path = QInputDialog::getText
lbajardsilogic@0 460 (0, tr("Use URL"),
lbajardsilogic@0 461 tr("Please enter the URL to use for this file:"),
lbajardsilogic@0 462 QLineEdit::Normal, "", &ok);
lbajardsilogic@0 463
lbajardsilogic@0 464 if (ok && path != "") {
lbajardsilogic@0 465 RemoteFile rf(path);
lbajardsilogic@0 466 if (rf.isAvailable()) {
lbajardsilogic@0 467 done = true;
lbajardsilogic@0 468 } else {
lbajardsilogic@0 469 QMessageBox::critical
lbajardsilogic@0 470 (0, tr("Failed to open location"),
lbajardsilogic@0 471 tr("URL \"%1\" could not be opened").arg(path));
lbajardsilogic@0 472 path = "";
lbajardsilogic@0 473 }
lbajardsilogic@0 474 rf.deleteLocalFile();
lbajardsilogic@0 475 }
lbajardsilogic@0 476 break;
lbajardsilogic@0 477 }
lbajardsilogic@0 478
lbajardsilogic@0 479 case 2: // Cancel
lbajardsilogic@0 480 path = "";
lbajardsilogic@0 481 done = true;
lbajardsilogic@0 482 break;
lbajardsilogic@0 483 }
lbajardsilogic@0 484 }
lbajardsilogic@0 485
lbajardsilogic@0 486 if (path != "") m_lastLocatedLocation = path;
lbajardsilogic@0 487 return path;
lbajardsilogic@0 488 }
lbajardsilogic@0 489
lbajardsilogic@0 490