annotate data/fileio/FileFinder.cpp @ 0:fc9323a41f5a

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