From 5307304c579de280cd0f7a3256622cab639a623c Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Wed, 8 Jun 2022 11:52:07 -0400 Subject: [PATCH] Separate traditional desktop interface from CLI, in preparation for QML --- CMakeLists.txt | 6 +- include/cmdinterface.h | 18 ++++++ include/desktopinterface.h | 15 +++++ src/cmdinterface.cpp | 65 +++++++++++++++++++++ src/desktopinterface.cpp | 51 ++++++++++++++++ src/main.cpp | 115 ++++--------------------------------- 6 files changed, 166 insertions(+), 104 deletions(-) create mode 100644 include/cmdinterface.h create mode 100644 include/desktopinterface.h create mode 100644 src/cmdinterface.cpp create mode 100644 src/desktopinterface.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a44d207..445f963 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,11 @@ set(SRC src/aboutwindow.cpp include/aboutwindow.h src/bannerwidget.cpp - include/bannerwidget.h) + include/bannerwidget.h + include/desktopinterface.h + include/cmdinterface.h + src/cmdinterface.cpp + src/desktopinterface.cpp) include(FetchContent) diff --git a/include/cmdinterface.h b/include/cmdinterface.h new file mode 100644 index 0000000..857c3bc --- /dev/null +++ b/include/cmdinterface.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include "launchercore.h" + +/* + * The CLI interface for Astra, driven primarily by the command-line. + */ +class CMDInterface { +public: + CMDInterface(QCommandLineParser& parser); + + bool parse(QCommandLineParser& parser, LauncherCore& core); + +private: + QCommandLineOption profileOption = {"default-profile", "Profile to use for default profile and autologin.", "profile"}; + QCommandLineOption autologinOption = {"autologin", "Auto-login with the default profile. This requires the profile to have remember username/password enabled!"}; +}; \ No newline at end of file diff --git a/include/desktopinterface.h b/include/desktopinterface.h new file mode 100644 index 0000000..41b8234 --- /dev/null +++ b/include/desktopinterface.h @@ -0,0 +1,15 @@ +#pragma once + +#include "launcherwindow.h" + +/* + * The desktop, mouse and keyboard-driven interface for Astra. Primarily meant + * for regular desktop usage. + */ +class DesktopInterface { +public: + DesktopInterface(LauncherCore& core); + +private: + LauncherWindow* window = nullptr; +}; \ No newline at end of file diff --git a/src/cmdinterface.cpp b/src/cmdinterface.cpp new file mode 100644 index 0000000..37c71e8 --- /dev/null +++ b/src/cmdinterface.cpp @@ -0,0 +1,65 @@ +#include +#include "cmdinterface.h" +#include "squareboot.h" +#include "sapphirelauncher.h" + +CMDInterface::CMDInterface(QCommandLineParser &parser) { + parser.addOption(autologinOption); + parser.addOption(profileOption); +} + +bool CMDInterface::parse(QCommandLineParser &parser, LauncherCore &core) { + if(parser.isSet(profileOption)) { + core.defaultProfileIndex = core.getProfileIndex(parser.value(profileOption)); + + if(core.defaultProfileIndex == -1) { + qInfo() << "The profile \"" << parser.value(profileOption) << "\" does not exist!"; + return false; + } + } + + if(parser.isSet(autologinOption)) { + auto profile = core.getProfile(core.defaultProfileIndex); + + if(!profile.rememberUsername || !profile.rememberPassword) { + qInfo() << "Profile does not have a username and/or password saved, autologin disabled."; + + return false; + } + + auto loop = new QEventLoop(); + QString username, password; + + auto usernameJob = new QKeychain::ReadPasswordJob("LauncherWindow"); + usernameJob->setKey(profile.name + "-username"); + usernameJob->start(); + + core.connect(usernameJob, &QKeychain::ReadPasswordJob::finished, [loop, usernameJob, &username](QKeychain::Job* j) { + username = usernameJob->textData(); + loop->quit(); + }); + + loop->exec(); + + auto passwordJob = new QKeychain::ReadPasswordJob("LauncherWindow"); + passwordJob->setKey(profile.name + "-password"); + passwordJob->start(); + + core.connect(passwordJob, &QKeychain::ReadPasswordJob::finished, [loop, passwordJob, &password](QKeychain::Job* j) { + password = passwordJob->textData(); + loop->quit(); + }); + + loop->exec(); + + auto info = LoginInformation{&profile, username, password, ""}; + + if(profile.isSapphire) { + core.sapphireLauncher->login(profile.lobbyURL, info); + } else { + core.squareBoot->bootCheck(info); + } + } + + return true; +} diff --git a/src/desktopinterface.cpp b/src/desktopinterface.cpp new file mode 100644 index 0000000..5198596 --- /dev/null +++ b/src/desktopinterface.cpp @@ -0,0 +1,51 @@ +#include "desktopinterface.h" +#include "gameinstaller.h" + +DesktopInterface::DesktopInterface(LauncherCore& core) { + window = new LauncherWindow(core); + window->show(); + + auto defaultProfile = core.getProfile(core.defaultProfileIndex); + + if(!defaultProfile.isGameInstalled()) { + auto messageBox = new QMessageBox(window); + messageBox->setIcon(QMessageBox::Icon::Question); + messageBox->setText("No Game Found"); + messageBox->setInformativeText("FFXIV is not installed. Would you like to install it now?"); + + QString detailedText = QString("Astra will install FFXIV for you at '%1'").arg(core.getProfile(core.defaultProfileIndex).gamePath); + detailedText.append("\n\nIf you do not wish to install it to this location, please set it in your default profile first."); + + messageBox->setDetailedText(detailedText); + messageBox->setWindowModality(Qt::WindowModal); + + auto installButton = messageBox->addButton("Install Game", QMessageBox::YesRole); + core.connect(installButton, &QPushButton::clicked, [&core, messageBox] { + installGame(core, core.getProfile(core.defaultProfileIndex), [messageBox, &core] { + core.readGameVersion(); + + messageBox->close(); + }); + }); + + messageBox->addButton(QMessageBox::StandardButton::No); + messageBox->setDefaultButton(installButton); + + messageBox->exec(); + } + +#if defined(Q_OS_LINUX) || defined(Q_OS_MAC) + if(!defaultProfile.isWineInstalled()) { + auto messageBox = new QMessageBox(window); + messageBox->setIcon(QMessageBox::Icon::Critical); + messageBox->setText("No Wine Found"); + messageBox->setInformativeText("Wine is not installed but is required to FFXIV on this operating system."); + messageBox->setWindowModality(Qt::WindowModal); + + messageBox->addButton(QMessageBox::StandardButton::Ok); + messageBox->setDefaultButton(QMessageBox::StandardButton::Ok); + + messageBox->exec(); + } +#endif +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ece7c72..a5d3523 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,8 @@ #include "squareboot.h" #include "gameinstaller.h" #include "config.h" +#include "desktopinterface.h" +#include "cmdinterface.h" int main(int argc, char* argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); @@ -25,6 +27,11 @@ int main(int argc, char* argv[]) { QCoreApplication::setApplicationVersion(version); + // we want to decide which interface to use. this is decided by the + // -cli, -desktop, or -tablet + // the default is -desktop + // cli is a special case where it's always "enabled" + QCommandLineParser parser; parser.setApplicationDescription("Cross-platform FFXIV Launcher"); @@ -34,11 +41,7 @@ int main(int argc, char* argv[]) { QCommandLineOption noguiOption("nogui", "Don't open a main window."); parser.addOption(noguiOption); - QCommandLineOption autologinOption("autologin", "Auto-login with the default profile. This requires the profile to have remember username/password enabled!"); - parser.addOption(autologinOption); - - QCommandLineOption profileOption("default-profile", "Profile to use for default profile and autologin.", "profile"); - parser.addOption(profileOption); + auto cmd = new CMDInterface(parser); parser.process(app); @@ -51,106 +54,12 @@ int main(int argc, char* argv[]) { } LauncherCore c; - - if(parser.isSet(profileOption)) { - c.defaultProfileIndex = c.getProfileIndex(parser.value(profileOption)); - - if(c.defaultProfileIndex == -1) { - qInfo() << "The profile \"" << parser.value(profileOption) << "\" does not exist!"; - return 0; - } - } - - if(parser.isSet(autologinOption)) { - auto profile = c.getProfile(c.defaultProfileIndex); - - if(!profile.rememberUsername || !profile.rememberPassword) { - qInfo() << "Profile does not have a username and/or password saved, autologin disabled."; - - return 0; - } - - auto loop = new QEventLoop(); - QString username, password; - - auto usernameJob = new QKeychain::ReadPasswordJob("LauncherWindow"); - usernameJob->setKey(profile.name + "-username"); - usernameJob->start(); - - c.connect(usernameJob, &QKeychain::ReadPasswordJob::finished, [loop, usernameJob, &username](QKeychain::Job* j) { - username = usernameJob->textData(); - loop->quit(); - }); - - loop->exec(); - - auto passwordJob = new QKeychain::ReadPasswordJob("LauncherWindow"); - passwordJob->setKey(profile.name + "-password"); - passwordJob->start(); - - c.connect(passwordJob, &QKeychain::ReadPasswordJob::finished, [loop, passwordJob, &password](QKeychain::Job* j) { - password = passwordJob->textData(); - loop->quit(); - }); - - loop->exec(); - - auto info = LoginInformation{&profile, username, password, ""}; - - if(profile.isSapphire) { - c.sapphireLauncher->login(profile.lobbyURL, info); - } else { - c.squareBoot->bootCheck(info); - } - } - LauncherWindow w(c); if(!parser.isSet(noguiOption)) { - w.show(); - - auto defaultProfile = c.getProfile(c.defaultProfileIndex); - - if(!defaultProfile.isGameInstalled()) { - auto messageBox = new QMessageBox(&w); - messageBox->setIcon(QMessageBox::Icon::Question); - messageBox->setText("No Game Found"); - messageBox->setInformativeText("FFXIV is not installed. Would you like to install it now?"); - - QString detailedText = QString("Astra will install FFXIV for you at '%1'").arg(c.getProfile(c.defaultProfileIndex).gamePath); - detailedText.append("\n\nIf you do not wish to install it to this location, please set it in your default profile first."); - - messageBox->setDetailedText(detailedText); - messageBox->setWindowModality(Qt::WindowModal); - - auto installButton = messageBox->addButton("Install Game", QMessageBox::YesRole); - c.connect(installButton, &QPushButton::clicked, [&c, messageBox] { - installGame(c, c.getProfile(c.defaultProfileIndex), [messageBox, &c] { - c.readGameVersion(); - - messageBox->close(); - }); - }); - - messageBox->addButton(QMessageBox::StandardButton::No); - messageBox->setDefaultButton(installButton); - - messageBox->exec(); - } - -#if defined(Q_OS_LINUX) || defined(Q_OS_MAC) - if(!defaultProfile.isWineInstalled()) { - auto messageBox = new QMessageBox(&w); - messageBox->setIcon(QMessageBox::Icon::Critical); - messageBox->setText("No Wine Found"); - messageBox->setInformativeText("Wine is not installed but is required to FFXIV on this operating system."); - messageBox->setWindowModality(Qt::WindowModal); - - messageBox->addButton(QMessageBox::StandardButton::Ok); - messageBox->setDefaultButton(QMessageBox::StandardButton::Ok); - - messageBox->exec(); - } -#endif + new DesktopInterface(c); + } else { + if(!cmd->parse(parser, c)) + return -1; } return app.exec();