annotate data/fileio/FileFinder.cpp @ 118:fcffdd59e606

(none)
author ivand_qmul
date Mon, 22 Oct 2007 13:46:41 +0000
parents 00b5875d8c30
children 247ea6460ec2
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@0 130
lbajardsilogic@0 131 if (dialog.exec()) {
lbajardsilogic@0 132 QStringList files = dialog.selectedFiles();
lbajardsilogic@0 133 if (!files.empty()) path = *files.begin();
lbajardsilogic@0 134
lbajardsilogic@0 135 QFileInfo fi(path);
lbajardsilogic@0 136
lbajardsilogic@0 137 if (!fi.exists()) {
lbajardsilogic@0 138
lbajardsilogic@0 139 QMessageBox::critical(0, tr("File does not exist"),
lbajardsilogic@0 140 tr("File \"%1\" does not exist").arg(path));
lbajardsilogic@0 141 path = "";
lbajardsilogic@0 142
lbajardsilogic@0 143 } else if (!fi.isReadable()) {
lbajardsilogic@0 144
lbajardsilogic@0 145 QMessageBox::critical(0, tr("File is not readable"),
lbajardsilogic@0 146 tr("File \"%1\" can not be read").arg(path));
lbajardsilogic@0 147 path = "";
lbajardsilogic@0 148
lbajardsilogic@0 149 } else if (fi.isDir()) {
lbajardsilogic@0 150
lbajardsilogic@0 151 QMessageBox::critical(0, tr("Directory selected"),
lbajardsilogic@0 152 tr("File \"%1\" is a directory").arg(path));
lbajardsilogic@0 153 path = "";
lbajardsilogic@0 154
lbajardsilogic@0 155 } else if (!fi.isFile()) {
lbajardsilogic@0 156
lbajardsilogic@0 157 QMessageBox::critical(0, tr("Non-file selected"),
lbajardsilogic@0 158 tr("Path \"%1\" is not a file").arg(path));
lbajardsilogic@0 159 path = "";
lbajardsilogic@0 160
lbajardsilogic@0 161 } else if (fi.size() == 0) {
lbajardsilogic@0 162
lbajardsilogic@0 163 QMessageBox::critical(0, tr("File is empty"),
lbajardsilogic@0 164 tr("File \"%1\" is empty").arg(path));
lbajardsilogic@0 165 path = "";
lbajardsilogic@0 166 }
lbajardsilogic@0 167 }
lbajardsilogic@0 168
lbajardsilogic@0 169 if (path != "") {
lbajardsilogic@0 170 settings.setValue(settingsKey,
lbajardsilogic@0 171 QFileInfo(path).absoluteDir().canonicalPath());
lbajardsilogic@0 172 }
lbajardsilogic@0 173
lbajardsilogic@0 174 return path;
lbajardsilogic@0 175 }
lbajardsilogic@0 176
lbajardsilogic@0 177 QString
lbajardsilogic@0 178 FileFinder::getSaveFileName(FileType type, QString fallbackLocation)
lbajardsilogic@0 179 {
lbajardsilogic@0 180 QString settingsKey;
lbajardsilogic@0 181 QString lastPath = fallbackLocation;
lbajardsilogic@0 182
lbajardsilogic@0 183 QString title = tr("Select file");
lbajardsilogic@0 184 QString filter = tr("All files (*.*)");
lbajardsilogic@0 185
lbajardsilogic@0 186 switch (type) {
lbajardsilogic@0 187
lbajardsilogic@0 188 case SessionFile:
lbajardsilogic@0 189 settingsKey = "savesessionpath";
lbajardsilogic@0 190 title = tr("Select a session file");
lbajardsilogic@42 191 filter = tr("Sound Access session files (*.sv)\nAll files (*.*)");
lbajardsilogic@0 192 break;
lbajardsilogic@0 193
lbajardsilogic@0 194 case AudioFile:
lbajardsilogic@0 195 settingsKey = "saveaudiopath";
lbajardsilogic@0 196 title = "Select an audio file";
lbajardsilogic@0 197 title = tr("Select a file to export to");
lbajardsilogic@0 198 filter = tr("WAV audio files (*.wav)\nAll files (*.*)");
lbajardsilogic@0 199 break;
lbajardsilogic@0 200
lbajardsilogic@0 201 case LayerFile:
lbajardsilogic@0 202 settingsKey = "savelayerpath";
lbajardsilogic@0 203 title = tr("Select a file to export to");
lbajardsilogic@42 204 filter = tr("Sound Access Layer XML files (*.svl)\nComma-separated data files (*.csv)\nText files (*.txt)\nAll files (*.*)");
lbajardsilogic@0 205 break;
lbajardsilogic@0 206
lbajardsilogic@0 207 case SessionOrAudioFile:
lbajardsilogic@0 208 std::cerr << "ERROR: Internal error: FileFinder::getSaveFileName: SessionOrAudioFile cannot be used here" << std::endl;
lbajardsilogic@0 209 abort();
lbajardsilogic@0 210
lbajardsilogic@0 211 case ImageFile:
lbajardsilogic@0 212 settingsKey = "saveimagepath";
lbajardsilogic@0 213 title = tr("Select a file to export to");
lbajardsilogic@0 214 filter = tr("Portable Network Graphics files (*.png)\nAll files (*.*)");
lbajardsilogic@0 215 break;
lbajardsilogic@0 216
lbajardsilogic@0 217 case AnyFile:
lbajardsilogic@0 218 std::cerr << "ERROR: Internal error: FileFinder::getSaveFileName: AnyFile cannot be used here" << std::endl;
lbajardsilogic@0 219 abort();
lbajardsilogic@0 220 };
lbajardsilogic@0 221
lbajardsilogic@0 222 if (lastPath == "") {
lbajardsilogic@0 223 char *home = getenv("HOME");
lbajardsilogic@0 224 if (home) lastPath = home;
lbajardsilogic@0 225 else lastPath = ".";
lbajardsilogic@0 226 } else if (QFileInfo(lastPath).isDir()) {
lbajardsilogic@0 227 lastPath = QFileInfo(lastPath).canonicalPath();
lbajardsilogic@0 228 } else {
lbajardsilogic@0 229 lastPath = QFileInfo(lastPath).absoluteDir().canonicalPath();
lbajardsilogic@0 230 }
lbajardsilogic@0 231
lbajardsilogic@0 232 QSettings settings;
lbajardsilogic@0 233 settings.beginGroup("FileFinder");
lbajardsilogic@0 234 lastPath = settings.value(settingsKey, lastPath).toString();
lbajardsilogic@0 235
lbajardsilogic@0 236 QString path = "";
lbajardsilogic@0 237
lbajardsilogic@0 238 // Use our own QFileDialog instead of static functions, as we may
lbajardsilogic@0 239 // need to adjust the file extension based on the selected filter
lbajardsilogic@0 240
lbajardsilogic@0 241 QFileDialog dialog;
lbajardsilogic@0 242 dialog.setFilters(filter.split('\n'));
lbajardsilogic@0 243 dialog.setWindowTitle(title);
lbajardsilogic@0 244 dialog.setDirectory(lastPath);
lbajardsilogic@0 245
lbajardsilogic@0 246 dialog.setAcceptMode(QFileDialog::AcceptSave);
lbajardsilogic@0 247 dialog.setFileMode(QFileDialog::AnyFile);
lbajardsilogic@0 248 dialog.setConfirmOverwrite(false); // we'll do that
lbajardsilogic@0 249
lbajardsilogic@0 250 if (type == SessionFile) {
lbajardsilogic@0 251 dialog.setDefaultSuffix("sv");
lbajardsilogic@0 252 } else if (type == AudioFile) {
lbajardsilogic@0 253 dialog.setDefaultSuffix("wav");
lbajardsilogic@0 254 } else if (type == ImageFile) {
lbajardsilogic@0 255 dialog.setDefaultSuffix("png");
lbajardsilogic@0 256 }
lbajardsilogic@0 257
lbajardsilogic@0 258 bool good = false;
lbajardsilogic@0 259
lbajardsilogic@0 260 while (!good) {
lbajardsilogic@0 261
lbajardsilogic@0 262 path = "";
lbajardsilogic@0 263
lbajardsilogic@0 264 if (!dialog.exec()) break;
lbajardsilogic@0 265
lbajardsilogic@0 266 QStringList files = dialog.selectedFiles();
lbajardsilogic@0 267 if (files.empty()) break;
lbajardsilogic@0 268 path = *files.begin();
lbajardsilogic@0 269
lbajardsilogic@0 270 QFileInfo fi(path);
lbajardsilogic@0 271
lbajardsilogic@0 272 if (type == LayerFile && fi.suffix() == "") {
lbajardsilogic@0 273 QString expectedExtension;
lbajardsilogic@0 274 QString selectedFilter = dialog.selectedFilter();
lbajardsilogic@0 275 if (selectedFilter.contains(".svl")) {
lbajardsilogic@0 276 expectedExtension = "svl";
lbajardsilogic@0 277 } else if (selectedFilter.contains(".txt")) {
lbajardsilogic@0 278 expectedExtension = "txt";
lbajardsilogic@0 279 } else if (selectedFilter.contains(".csv")) {
lbajardsilogic@0 280 expectedExtension = "csv";
lbajardsilogic@0 281 }
lbajardsilogic@0 282 if (expectedExtension != "") {
lbajardsilogic@0 283 path = QString("%1.%2").arg(path).arg(expectedExtension);
lbajardsilogic@0 284 fi = QFileInfo(path);
lbajardsilogic@0 285 }
lbajardsilogic@0 286 }
lbajardsilogic@0 287
lbajardsilogic@0 288 if (fi.isDir()) {
lbajardsilogic@0 289 QMessageBox::critical(0, tr("Directory selected"),
lbajardsilogic@0 290 tr("File \"%1\" is a directory").arg(path));
lbajardsilogic@0 291 continue;
lbajardsilogic@0 292 }
lbajardsilogic@0 293
lbajardsilogic@0 294 if (fi.exists()) {
lbajardsilogic@0 295 if (QMessageBox::question(0, tr("File exists"),
lbajardsilogic@0 296 tr("The file \"%1\" already exists.\nDo you want to overwrite it?").arg(path),
lbajardsilogic@0 297 QMessageBox::Ok,
lbajardsilogic@0 298 QMessageBox::Cancel) != QMessageBox::Ok) {
lbajardsilogic@0 299 continue;
lbajardsilogic@0 300 }
lbajardsilogic@0 301 }
lbajardsilogic@0 302
lbajardsilogic@0 303 good = true;
lbajardsilogic@0 304 }
lbajardsilogic@0 305
lbajardsilogic@0 306 if (path != "") {
lbajardsilogic@0 307 settings.setValue(settingsKey,
lbajardsilogic@0 308 QFileInfo(path).absoluteDir().canonicalPath());
lbajardsilogic@0 309 }
lbajardsilogic@0 310
lbajardsilogic@0 311 return path;
lbajardsilogic@0 312 }
lbajardsilogic@0 313
lbajardsilogic@0 314 void
lbajardsilogic@0 315 FileFinder::registerLastOpenedFilePath(FileType type, QString path)
lbajardsilogic@0 316 {
lbajardsilogic@0 317 QString settingsKey;
lbajardsilogic@0 318
lbajardsilogic@0 319 switch (type) {
lbajardsilogic@0 320 case SessionFile:
lbajardsilogic@0 321 settingsKey = "sessionpath";
lbajardsilogic@0 322 break;
lbajardsilogic@0 323
lbajardsilogic@0 324 case AudioFile:
lbajardsilogic@0 325 settingsKey = "audiopath";
lbajardsilogic@0 326 break;
ivand_qmul@118 327 // Ivan Damnjanovic 09-10/2007 added video file import
ivand_qmul@118 328 case VideoFile:
ivand_qmul@118 329 settingsKey = "videopath";
ivand_qmul@118 330 break;
ivand_qmul@118 331 //
lbajardsilogic@0 332 case LayerFile:
lbajardsilogic@0 333 settingsKey = "layerpath";
lbajardsilogic@0 334 break;
lbajardsilogic@0 335
lbajardsilogic@0 336 case SessionOrAudioFile:
lbajardsilogic@0 337 settingsKey = "lastpath";
lbajardsilogic@0 338 break;
lbajardsilogic@0 339
lbajardsilogic@0 340 case ImageFile:
lbajardsilogic@0 341 settingsKey = "imagepath";
lbajardsilogic@0 342 break;
lbajardsilogic@0 343
lbajardsilogic@0 344 case AnyFile:
lbajardsilogic@0 345 settingsKey = "lastpath";
lbajardsilogic@0 346 break;
lbajardsilogic@0 347 }
lbajardsilogic@0 348
lbajardsilogic@0 349 if (path != "") {
lbajardsilogic@0 350 QSettings settings;
lbajardsilogic@0 351 settings.beginGroup("FileFinder");
lbajardsilogic@0 352 path = QFileInfo(path).absoluteDir().canonicalPath();
lbajardsilogic@0 353 settings.setValue(settingsKey, path);
lbajardsilogic@0 354 settings.setValue("lastpath", path);
lbajardsilogic@0 355 }
lbajardsilogic@0 356 }
lbajardsilogic@0 357
lbajardsilogic@0 358 QString
lbajardsilogic@0 359 FileFinder::find(FileType type, QString location, QString lastKnownLocation)
lbajardsilogic@0 360 {
lbajardsilogic@0 361 if (QFileInfo(location).exists()) return location;
lbajardsilogic@0 362
lbajardsilogic@0 363 if (RemoteFile::canHandleScheme(QUrl(location))) {
lbajardsilogic@0 364 RemoteFile rf(location);
lbajardsilogic@0 365 bool available = rf.isAvailable();
lbajardsilogic@0 366 rf.deleteLocalFile();
lbajardsilogic@0 367 if (available) return location;
lbajardsilogic@0 368 }
lbajardsilogic@0 369
lbajardsilogic@0 370 QString foundAt = "";
lbajardsilogic@0 371
lbajardsilogic@0 372 if ((foundAt = findRelative(location, lastKnownLocation)) != "") {
lbajardsilogic@0 373 return foundAt;
lbajardsilogic@0 374 }
lbajardsilogic@0 375
lbajardsilogic@0 376 if ((foundAt = findRelative(location, m_lastLocatedLocation)) != "") {
lbajardsilogic@0 377 return foundAt;
lbajardsilogic@0 378 }
lbajardsilogic@0 379
lbajardsilogic@0 380 return locateInteractive(type, location);
lbajardsilogic@0 381 }
lbajardsilogic@0 382
lbajardsilogic@0 383 QString
lbajardsilogic@0 384 FileFinder::findRelative(QString location, QString relativeTo)
lbajardsilogic@0 385 {
lbajardsilogic@0 386 if (relativeTo == "") return "";
lbajardsilogic@0 387
lbajardsilogic@0 388 std::cerr << "Looking for \"" << location.toStdString() << "\" next to \""
lbajardsilogic@0 389 << relativeTo.toStdString() << "\"..." << std::endl;
lbajardsilogic@0 390
lbajardsilogic@0 391 QString fileName;
lbajardsilogic@0 392 QString resolved;
lbajardsilogic@0 393
lbajardsilogic@0 394 if (RemoteFile::canHandleScheme(QUrl(location))) {
lbajardsilogic@0 395 fileName = QUrl(location).path().section('/', -1, -1,
lbajardsilogic@0 396 QString::SectionSkipEmpty);
lbajardsilogic@0 397 } else {
lbajardsilogic@0 398 fileName = QFileInfo(location).fileName();
lbajardsilogic@0 399 }
lbajardsilogic@0 400
lbajardsilogic@0 401 if (RemoteFile::canHandleScheme(QUrl(relativeTo))) {
lbajardsilogic@0 402 resolved = QUrl(relativeTo).resolved(fileName).toString();
lbajardsilogic@0 403 RemoteFile rf(resolved);
lbajardsilogic@0 404 if (!rf.isAvailable()) resolved = "";
lbajardsilogic@0 405 std::cerr << "resolved: " << resolved.toStdString() << std::endl;
lbajardsilogic@0 406 rf.deleteLocalFile();
lbajardsilogic@0 407 } else {
lbajardsilogic@0 408 resolved = QFileInfo(relativeTo).dir().filePath(fileName);
lbajardsilogic@0 409 if (!QFileInfo(resolved).exists() ||
lbajardsilogic@0 410 !QFileInfo(resolved).isFile() ||
lbajardsilogic@0 411 !QFileInfo(resolved).isReadable()) {
lbajardsilogic@0 412 resolved = "";
lbajardsilogic@0 413 }
lbajardsilogic@0 414 }
lbajardsilogic@0 415
lbajardsilogic@0 416 return resolved;
lbajardsilogic@0 417 }
lbajardsilogic@0 418
lbajardsilogic@0 419 QString
lbajardsilogic@0 420 FileFinder::locateInteractive(FileType type, QString thing)
lbajardsilogic@0 421 {
lbajardsilogic@0 422 QString question;
lbajardsilogic@0 423 if (type == AudioFile) {
lbajardsilogic@0 424 question = tr("Audio file \"%1\" could not be opened.\nDo you want to locate it?");
lbajardsilogic@0 425 } else {
lbajardsilogic@0 426 question = tr("File \"%1\" could not be opened.\nDo you want to locate it?");
lbajardsilogic@0 427 }
lbajardsilogic@0 428
lbajardsilogic@0 429 QString path = "";
lbajardsilogic@0 430 bool done = false;
lbajardsilogic@0 431
lbajardsilogic@0 432 while (!done) {
lbajardsilogic@0 433
lbajardsilogic@0 434 int rv = QMessageBox::question
lbajardsilogic@0 435 (0,
lbajardsilogic@0 436 tr("Failed to open file"),
lbajardsilogic@0 437 question.arg(thing),
lbajardsilogic@0 438 tr("Locate file..."),
lbajardsilogic@0 439 tr("Use URL..."),
lbajardsilogic@0 440 tr("Cancel"),
lbajardsilogic@0 441 0, 2);
lbajardsilogic@0 442
lbajardsilogic@0 443 switch (rv) {
lbajardsilogic@0 444
lbajardsilogic@0 445 case 0: // Locate file
lbajardsilogic@0 446
lbajardsilogic@0 447 if (QFileInfo(thing).dir().exists()) {
lbajardsilogic@0 448 path = QFileInfo(thing).dir().canonicalPath();
lbajardsilogic@0 449 }
lbajardsilogic@0 450
lbajardsilogic@0 451 path = getOpenFileName(type, path);
lbajardsilogic@0 452 done = (path != "");
lbajardsilogic@0 453 break;
lbajardsilogic@0 454
lbajardsilogic@0 455 case 1: // Use URL
lbajardsilogic@0 456 {
lbajardsilogic@0 457 bool ok = false;
lbajardsilogic@0 458 path = QInputDialog::getText
lbajardsilogic@0 459 (0, tr("Use URL"),
lbajardsilogic@0 460 tr("Please enter the URL to use for this file:"),
lbajardsilogic@0 461 QLineEdit::Normal, "", &ok);
lbajardsilogic@0 462
lbajardsilogic@0 463 if (ok && path != "") {
lbajardsilogic@0 464 RemoteFile rf(path);
lbajardsilogic@0 465 if (rf.isAvailable()) {
lbajardsilogic@0 466 done = true;
lbajardsilogic@0 467 } else {
lbajardsilogic@0 468 QMessageBox::critical
lbajardsilogic@0 469 (0, tr("Failed to open location"),
lbajardsilogic@0 470 tr("URL \"%1\" could not be opened").arg(path));
lbajardsilogic@0 471 path = "";
lbajardsilogic@0 472 }
lbajardsilogic@0 473 rf.deleteLocalFile();
lbajardsilogic@0 474 }
lbajardsilogic@0 475 break;
lbajardsilogic@0 476 }
lbajardsilogic@0 477
lbajardsilogic@0 478 case 2: // Cancel
lbajardsilogic@0 479 path = "";
lbajardsilogic@0 480 done = true;
lbajardsilogic@0 481 break;
lbajardsilogic@0 482 }
lbajardsilogic@0 483 }
lbajardsilogic@0 484
lbajardsilogic@0 485 if (path != "") m_lastLocatedLocation = path;
lbajardsilogic@0 486 return path;
lbajardsilogic@0 487 }
lbajardsilogic@0 488
lbajardsilogic@0 489