diff --git a/src/common/ui_utils/mainwindowwithtray.cpp b/src/common/ui_utils/mainwindowwithtray.cpp index dbac8f8..7c0f575 100644 --- a/src/common/ui_utils/mainwindowwithtray.cpp +++ b/src/common/ui_utils/mainwindowwithtray.cpp @@ -59,8 +59,8 @@ void MainWindowWithTray::trayAction(QSystemTrayIcon::ActivationReason reason) void MainWindowWithTray::closeApp() { m_isExiting = true; - qApp->closeAllWindows(); - qApp->exit(0); + QApplication::closeAllWindows(); + QCoreApplication::exit(0); } void MainWindowWithTray::setVisible(bool visible) @@ -104,7 +104,7 @@ void MainWindowWithTray::showHideNotify() {} void MainWindowWithTray::createTrayMenu(QIcon const& icon, utilities::Tr::Translation const& projFullNameTr) { - qApp->setWindowIcon(icon); + QApplication::setWindowIcon(icon); #if !defined(Q_OS_MAC) m_tray = new QSystemTrayIcon(this); utilities::Tr::SetTr(m_tray, &QSystemTrayIcon::setToolTip, projFullNameTr); @@ -136,7 +136,7 @@ QAction* MainWindowWithTray::addTrayMenuItem(TrayMenu::ItemType itemType) case TrayMenu::Show: { action = createAction("actionShow", appShowTr, QKeySequence::UnknownKey, SLOT(restore())); - action->setIcon(qApp->windowIcon()); + action->setIcon(QApplication::windowIcon()); action->setIconVisibleInMenu(true); m_tray->contextMenu()->addAction(action); } diff --git a/src/common/utilities/associate_app_win.cpp b/src/common/utilities/associate_app_win.cpp index 984fbfa..60b5240 100644 --- a/src/common/utilities/associate_app_win.cpp +++ b/src/common/utilities/associate_app_win.cpp @@ -12,7 +12,7 @@ const auto torrentClassName = QStringLiteral(PROJECT_NAME ".torrent"); void setClassesToSelf(QSettings& settingRoot) { - QString appPath = QDir::toNativeSeparators(qApp->applicationFilePath()); + QString appPath = QDir::toNativeSeparators(QCoreApplication::applicationFilePath()); settingRoot.setValue(".", torrentClassName); settingRoot.beginGroup("DefaultIcon"); @@ -34,7 +34,7 @@ void associateApp(QString const& ext, WId parent = NULL) const bool isChangeNeeded = QSettings("HKEY_CLASSES_ROOT\\" + torrentClassName, QSettings::NativeFormat).value(".") != PROJECT_FULLNAME || QSettings("HKEY_CLASSES_ROOT\\" + ext, QSettings::NativeFormat).value(".") != torrentClassName || - QSettings("HKEY_CLASSES_ROOT\\" + torrentClassName + "\\shell\\open\\command", QSettings::NativeFormat).value(".") != QString("\"%1\" \"%2\"").arg(QDir::toNativeSeparators(qApp->applicationFilePath()), "%1"); + QSettings("HKEY_CLASSES_ROOT\\" + torrentClassName + "\\shell\\open\\command", QSettings::NativeFormat).value(".") != QString("\"%1\" \"%2\"").arg(QDir::toNativeSeparators(QCoreApplication::applicationFilePath()), "%1"); if (isChangeNeeded) { @@ -75,7 +75,7 @@ bool utilities::isDefaultTorrentApp() const bool isSelf = QSettings("HKEY_CLASSES_ROOT\\Magnet", QSettings::NativeFormat).value(".") == torrentClassName && QSettings("HKEY_CLASSES_ROOT\\.torrent", QSettings::NativeFormat).value(".") == torrentClassName && - QSettings("HKEY_CLASSES_ROOT\\" + torrentClassName + "\\shell\\open\\command", QSettings::NativeFormat).value(".") == QString("\"%1\" \"%2\"").arg(QDir::toNativeSeparators(qApp->applicationFilePath()), "%1") && + QSettings("HKEY_CLASSES_ROOT\\" + torrentClassName + "\\shell\\open\\command", QSettings::NativeFormat).value(".") == QString("\"%1\" \"%2\"").arg(QDir::toNativeSeparators(QCoreApplication::applicationFilePath()), "%1") && QSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.torrent\\UserChoice", QSettings::NativeFormat).value("ProgId") == torrentClassName; return isSelf; diff --git a/src/common/utilities/filesystem_utils.cpp b/src/common/utilities/filesystem_utils.cpp index 5802936..10fa381 100644 --- a/src/common/utilities/filesystem_utils.cpp +++ b/src/common/utilities/filesystem_utils.cpp @@ -1,9 +1,11 @@ #include "filesystem_utils.h" +#include #include #include #include #include +#include #include #include #include @@ -24,6 +26,9 @@ typedef HRESULT(STDAPICALLTYPE* GetPathFunc)(REFKNOWNFOLDERID, DWORD, HANDLE, PW namespace { +const char PORTABLE_MODE_FILE[] = "portable"; +const char DOWNLOADS_FOLDER_NAME[] = "downloads"; + #ifdef Q_OS_WIN32 const char EXPLORER_LABEL[] = "explorer"; #elif defined(Q_OS_MAC) @@ -153,6 +158,27 @@ bool MoveToTrashImpl(const QString& file) } #endif //Q_OS_MAC +QString StringOrEmpty(const QStringList& list) +{ + return list.empty() ? QString() : list.at(0); +} + +QString GetOrganizationName() +{ + return +#ifdef Q_OS_MAC + QCoreApplication::organizationDomain().isEmpty() + ? QCoreApplication::organizationName() + : QCoreApplication::organizationDomain() +#else + QCoreApplication::organizationName().isEmpty() + ? QCoreApplication::organizationDomain() + : QCoreApplication::organizationName() +#endif + ; +} + + } // namespace @@ -239,22 +265,30 @@ QString GetFileName(const QString& full_path) return (file_name.isEmpty()) ? full_path : file_name; } +bool IsPortableMode() +{ + static const bool isPortableMode = QFileInfo::exists( + QCoreApplication::applicationDirPath() + QDir::separator() + PORTABLE_MODE_FILE); + return isPortableMode; +} + QString getPathForDownloadFolder() { - QStringList paths = QStandardPaths::standardLocations(QStandardPaths::DownloadLocation); - QString startPath = !paths.empty() ? paths.at(0) : QString(); - return startPath; + return IsPortableMode() + ? PrepareCacheFolder(DOWNLOADS_FOLDER_NAME) + : StringOrEmpty(QStandardPaths::standardLocations(QStandardPaths::DownloadLocation)); } QString PrepareCacheFolder(const QString& subdir) { - QStringList paths = QStandardPaths::standardLocations(QStandardPaths::DataLocation); - QString path = !paths.isEmpty() ? paths.at(0) : QString(); + QString path = IsPortableMode() + ? QCoreApplication::applicationDirPath() + : StringOrEmpty(QStandardPaths::standardLocations(QStandardPaths::DataLocation)); - if (!subdir.isEmpty()) + if (!subdir.isEmpty() || IsPortableMode()) // indirect top level portable stuff like settings do { - path += QDir::separator() + subdir; + path += QDir::separator() + (subdir.isEmpty()? GetOrganizationName() : subdir); } Q_ASSERT(!path.isEmpty()); diff --git a/src/common/utilities/filesystem_utils.h b/src/common/utilities/filesystem_utils.h index 7dd8701..12620fd 100644 --- a/src/common/utilities/filesystem_utils.h +++ b/src/common/utilities/filesystem_utils.h @@ -21,6 +21,8 @@ void SelectFile(const QString& fileName, const QString& defFolderName); QString GetFileName(QNetworkReply* reply); QString GetFileName(const QString& full_path); +bool IsPortableMode(); + // Parameter: const QString & subdir - subdir to create; Returns: QString - directory name with ending slash QString PrepareCacheFolder(const QString& subdir = QString()); diff --git a/src/common/utilities/translatable.cpp b/src/common/utilities/translatable.cpp index c8e5728..f21111a 100644 --- a/src/common/utilities/translatable.cpp +++ b/src/common/utilities/translatable.cpp @@ -88,7 +88,7 @@ void Translatable::retranslateApp(const QString& locale) { if (translator_) { - qApp->removeTranslator(translator_); + QCoreApplication::removeTranslator(translator_); translator_->deleteLater(); } translator_ = new QTranslator(qApp); @@ -96,7 +96,7 @@ void Translatable::retranslateApp(const QString& locale) QString filename = translationFilePrefix + locale; if (translator_->load(filename, getTranslationsFolder())) { - qApp->installTranslator(translator_); + QCoreApplication::installTranslator(translator_); } Tr::RetranslateAll(qApp); diff --git a/src/common/utilities/utils.cpp b/src/common/utilities/utils.cpp index eded4b2..6ddc128 100644 --- a/src/common/utilities/utils.cpp +++ b/src/common/utilities/utils.cpp @@ -349,8 +349,8 @@ bool isAdminRights() void runWithPrivileges(const wchar_t* arg, WId parent) { - const auto applicationFilePath = qApp->applicationFilePath(); - const auto applicationDirPath = qApp->applicationDirPath(); + const auto applicationFilePath = QCoreApplication::applicationFilePath(); + const auto applicationDirPath = QCoreApplication::applicationDirPath(); SHELLEXECUTEINFOW shex = { diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 267f654..324b3a6 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -72,7 +72,7 @@ MainWindow::MainWindow() m_dlManager(nullptr) , isAutorun(false) { - qApp->setWindowIcon(QIcon(PROJECT_ICON)); + QApplication::setWindowIcon(QIcon(PROJECT_ICON)); ui->setupUi(this); @@ -153,7 +153,7 @@ MainWindow::MainWindow() VERIFY(connect(ui->linkEdit, SIGNAL(linksAdd(bool)), ui->lblClearText, SLOT(setVisible(bool)))); VERIFY(connect(ui->linkEdit, SIGNAL(returnPressed()), this, SLOT(on_buttonStart_clicked()))); - VERIFY(connect(ui->lblClearText, SIGNAL(clicked()), this, SLOT(onlblClearTextCliced()))); + VERIFY(connect(ui->lblClearText, SIGNAL(clicked()), this, SLOT(onlblClearTextClicked()))); refreshButtons(); } @@ -211,7 +211,8 @@ void MainWindow::showMainWindowAndPerformChecks() void MainWindow::checkDefaultTorrentApplication() { - if (QSettings().value(ShowAssociateTorrentDialog, ShowAssociateTorrentDialog_Default).toBool() + const bool initiallyShowDialog = ShowAssociateTorrentDialog_Default && !utilities::IsPortableMode(); + if (QSettings().value(ShowAssociateTorrentDialog, initiallyShowDialog).toBool() && !utilities::isDefaultTorrentApp()) { QMessageBox msgBox( @@ -318,7 +319,7 @@ void MainWindow::prepareToExit() #endif } -void MainWindow::onlblClearTextCliced() +void MainWindow::onlblClearTextClicked() { ui->linkEdit->setText(QString()); refreshButtons(); diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index e9978cd..32c070f 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -71,7 +71,7 @@ public Q_SLOTS: void closeApp(); void onAboutClicked(); void on_openTorrent_clicked(); - void onlblClearTextCliced(); + void onlblClearTextClicked(); private Q_SLOTS: void prepareToExit(); diff --git a/src/gui/torrentdetailsform.cpp b/src/gui/torrentdetailsform.cpp index 3ae85be..af1939f 100644 --- a/src/gui/torrentdetailsform.cpp +++ b/src/gui/torrentdetailsform.cpp @@ -202,7 +202,7 @@ template bool isNotAllSkipped(std::vector const& priorities) void TorrentDetailsForm::accept() { - qApp->processEvents(); // must call this to stop editing operations + QCoreApplication::processEvents(); // must call this to stop editing operations bool isEverithingOk = true; if (m_torrentHandle.is_valid()) diff --git a/src/main/main.cpp b/src/main/main.cpp index e966e21..1dd42aa 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -27,12 +27,26 @@ Q_IMPORT_PLUGIN(qico) #endif//QT_STATICPLUGINS +// Called once QCoreApplication exists +static void ApplicationDependentInitialization() +{ + if (utilities::IsPortableMode()) + { + QSettings::setDefaultFormat(QSettings::IniFormat); + QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, + QCoreApplication::applicationDirPath()); + } + + utilities::setWriteToLogFile( + QSettings().value(app_settings::LoggingEnabled, false).toBool()); +} + +Q_COREAPP_STARTUP_FUNCTION(ApplicationDependentInitialization) + int main(int argc, char* argv[]) { utilities::InitializeProjectDescription(); - utilities::setWriteToLogFile(QSettings().value(app_settings::LoggingEnabled, false).toBool()); - // single app Application app(QString(PROJECT_NAME), argc, argv);