diff --git a/src/RunGui.cpp b/src/RunGui.cpp index 523a3c9fa..f4a11b19b 100644 --- a/src/RunGui.cpp +++ b/src/RunGui.cpp @@ -8,6 +8,7 @@ #include #include "Application.hpp" +#include "common/Modes.hpp" #include "common/NetworkManager.hpp" #include "singletons/Paths.hpp" #include "singletons/Resources.hpp" diff --git a/src/main.cpp b/src/main.cpp index 990f6e833..c2c4d9ab6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include "BrowserExtension.hpp" #include "RunGui.hpp" #include "common/Args.hpp" +#include "common/Modes.hpp" #include "singletons/Paths.hpp" #include "singletons/Settings.hpp" #include "util/IncognitoBrowser.hpp" @@ -28,9 +29,35 @@ int main(int argc, char **argv) else { initArgs(args); - Paths paths; - Settings settings(paths.settingsDirectory); + Paths *paths{}; - runGui(a, paths, settings); + try + { + paths = new Paths; + } + catch (std::runtime_error &error) + { + QMessageBox box; + if (Modes::getInstance().isPortable) + { + box.setText( + error.what() + + QStringLiteral( + "\n\nInfo: Portable mode requires the application to " + "be in a writeable location. If you don't want " + "portable mode reinstall the application. " + "https://chatterino.com.")); + } + else + { + box.setText(error.what()); + } + box.exec(); + return 1; + } + + Settings settings(paths->settingsDirectory); + + runGui(a, *paths, settings); } } diff --git a/src/singletons/Paths.cpp b/src/singletons/Paths.cpp index ea8e2526b..83d7ab5a6 100644 --- a/src/singletons/Paths.cpp +++ b/src/singletons/Paths.cpp @@ -11,6 +11,8 @@ #include "common/Modes.hpp" #include "util/CombinePath.hpp" +using namespace std::literals; + namespace chatterino { Paths *Paths::instance = nullptr; @@ -22,7 +24,7 @@ Paths::Paths() this->initAppFilePathHash(); this->initCheckPortable(); - this->initAppDataDirectory(); + this->initRootDirectory(); this->initSubDirectories(); } @@ -76,7 +78,7 @@ void Paths::initCheckPortable() combinePath(QCoreApplication::applicationDirPath(), "portable")); } -void Paths::initAppDataDirectory() +void Paths::initRootDirectory() { assert(this->portable_.is_initialized()); @@ -95,8 +97,8 @@ void Paths::initAppDataDirectory() QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); if (path.isEmpty()) { - throw std::runtime_error( - "Error finding writable location for settings"); + throw std::runtime_error("Could not create directory \""s + + path.toStdString() + "\""); } // create directory Chatterino2 instead of chatterino on windows because the @@ -123,8 +125,8 @@ void Paths::initSubDirectories() if (!QDir().mkpath(path)) { - throw std::runtime_error( - "Error creating appdata path %appdata%/chatterino/" + name); + throw std::runtime_error("Could not create directory \""s + + path.toStdString() + "\""); } return path; diff --git a/src/singletons/Paths.hpp b/src/singletons/Paths.hpp index 1df1fc77f..ea4cb6c2d 100644 --- a/src/singletons/Paths.hpp +++ b/src/singletons/Paths.hpp @@ -39,7 +39,7 @@ public: private: void initAppFilePathHash(); void initCheckPortable(); - void initAppDataDirectory(); + void initRootDirectory(); void initSubDirectories(); boost::optional portable_;