diff options
Diffstat (limited to 'src/yuzu/configuration')
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 18 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure.ui | 11 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_dialog.cpp | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_web.cpp | 119 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_web.h | 38 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_web.ui | 206 | 
6 files changed, 393 insertions, 0 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index d229225b4..650dd03c0 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -136,8 +136,18 @@ void Config::ReadValues() {      Settings::values.gdbstub_port = qt_config->value("gdbstub_port", 24689).toInt();      qt_config->endGroup(); +    qt_config->beginGroup("WebService"); +    Settings::values.enable_telemetry = qt_config->value("enable_telemetry", true).toBool(); +    Settings::values.web_api_url = +        qt_config->value("web_api_url", "https://api.yuzu-emu.org").toString().toStdString(); +    Settings::values.yuzu_username = qt_config->value("yuzu_username").toString().toStdString(); +    Settings::values.yuzu_token = qt_config->value("yuzu_token").toString().toStdString(); +    qt_config->endGroup(); +      qt_config->beginGroup("UI");      UISettings::values.theme = qt_config->value("theme", UISettings::themes[0].second).toString(); +    UISettings::values.enable_discord_presence = +        qt_config->value("enable_discord_presence", true).toBool();      qt_config->beginGroup("UIGameList");      UISettings::values.show_unknown = qt_config->value("show_unknown", true).toBool(); @@ -261,8 +271,16 @@ void Config::SaveValues() {      qt_config->setValue("gdbstub_port", Settings::values.gdbstub_port);      qt_config->endGroup(); +    qt_config->beginGroup("WebService"); +    qt_config->setValue("enable_telemetry", Settings::values.enable_telemetry); +    qt_config->setValue("web_api_url", QString::fromStdString(Settings::values.web_api_url)); +    qt_config->setValue("yuzu_username", QString::fromStdString(Settings::values.yuzu_username)); +    qt_config->setValue("yuzu_token", QString::fromStdString(Settings::values.yuzu_token)); +    qt_config->endGroup(); +      qt_config->beginGroup("UI");      qt_config->setValue("theme", UISettings::values.theme); +    qt_config->setValue("enable_discord_presence", UISettings::values.enable_discord_presence);      qt_config->beginGroup("UIGameList");      qt_config->setValue("show_unknown", UISettings::values.show_unknown); diff --git a/src/yuzu/configuration/configure.ui b/src/yuzu/configuration/configure.ui index 20f120134..9b297df28 100644 --- a/src/yuzu/configuration/configure.ui +++ b/src/yuzu/configuration/configure.ui @@ -54,6 +54,11 @@         <string>Debug</string>        </attribute>       </widget> +      <widget class="ConfigureWeb" name="webTab"> +        <attribute name="title"> +          <string>Web</string> +        </attribute> +      </widget>      </widget>     </item>     <item> @@ -108,6 +113,12 @@     <header>configuration/configure_graphics.h</header>     <container>1</container>    </customwidget> +   <customwidget> +     <class>ConfigureWeb</class> +     <extends>QWidget</extends> +     <header>configuration/configure_web.h</header> +     <container>1</container> +   </customwidget>   </customwidgets>   <resources/>   <connections> diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index daa4cc0d9..3905423e9 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -27,5 +27,6 @@ void ConfigureDialog::applyConfiguration() {      ui->graphicsTab->applyConfiguration();      ui->audioTab->applyConfiguration();      ui->debugTab->applyConfiguration(); +    ui->webTab->applyConfiguration();      Settings::Apply();  } diff --git a/src/yuzu/configuration/configure_web.cpp b/src/yuzu/configuration/configure_web.cpp new file mode 100644 index 000000000..5fb9251db --- /dev/null +++ b/src/yuzu/configuration/configure_web.cpp @@ -0,0 +1,119 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <QIcon> +#include <QMessageBox> +#include <QtConcurrent/QtConcurrentRun> +#include "core/settings.h" +#include "core/telemetry_session.h" +#include "ui_configure_web.h" +#include "yuzu/configuration/configure_web.h" +#include "yuzu/ui_settings.h" + +ConfigureWeb::ConfigureWeb(QWidget* parent) +    : QWidget(parent), ui(std::make_unique<Ui::ConfigureWeb>()) { +    ui->setupUi(this); +    connect(ui->button_regenerate_telemetry_id, &QPushButton::clicked, this, +            &ConfigureWeb::RefreshTelemetryID); +    connect(ui->button_verify_login, &QPushButton::clicked, this, &ConfigureWeb::VerifyLogin); +    connect(&verify_watcher, &QFutureWatcher<bool>::finished, this, &ConfigureWeb::OnLoginVerified); + +#ifndef USE_DISCORD_PRESENCE +    ui->discord_group->setVisible(false); +#endif +    this->setConfiguration(); +} + +ConfigureWeb::~ConfigureWeb() = default; + +void ConfigureWeb::setConfiguration() { +    ui->web_credentials_disclaimer->setWordWrap(true); +    ui->telemetry_learn_more->setOpenExternalLinks(true); +    ui->telemetry_learn_more->setText( +        tr("<a href='https://yuzu-emu.org/help/features/telemetry/'><span style=\"text-decoration: " +           "underline; color:#039be5;\">Learn more</span></a>")); + +    ui->web_signup_link->setOpenExternalLinks(true); +    ui->web_signup_link->setText( +        tr("<a href='https://profile.yuzu-emu.org/'><span style=\"text-decoration: underline; " +           "color:#039be5;\">Sign up</span></a>")); +    ui->web_token_info_link->setOpenExternalLinks(true); +    ui->web_token_info_link->setText( +        tr("<a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style=\"text-decoration: " +           "underline; color:#039be5;\">What is my token?</span></a>")); + +    ui->toggle_telemetry->setChecked(Settings::values.enable_telemetry); +    ui->edit_username->setText(QString::fromStdString(Settings::values.yuzu_username)); +    ui->edit_token->setText(QString::fromStdString(Settings::values.yuzu_token)); +    // Connect after setting the values, to avoid calling OnLoginChanged now +    connect(ui->edit_token, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged); +    connect(ui->edit_username, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged); +    ui->label_telemetry_id->setText( +        tr("Telemetry ID: 0x%1").arg(QString::number(Core::GetTelemetryId(), 16).toUpper())); +    user_verified = true; + +    ui->toggle_discordrpc->setChecked(UISettings::values.enable_discord_presence); +} + +void ConfigureWeb::applyConfiguration() { +    Settings::values.enable_telemetry = ui->toggle_telemetry->isChecked(); +    UISettings::values.enable_discord_presence = ui->toggle_discordrpc->isChecked(); +    if (user_verified) { +        Settings::values.yuzu_username = ui->edit_username->text().toStdString(); +        Settings::values.yuzu_token = ui->edit_token->text().toStdString(); +    } else { +        QMessageBox::warning(this, tr("Username and token not verified"), +                             tr("Username and token were not verified. The changes to your " +                                "username and/or token have not been saved.")); +    } +} + +void ConfigureWeb::RefreshTelemetryID() { +    const u64 new_telemetry_id{Core::RegenerateTelemetryId()}; +    ui->label_telemetry_id->setText( +        tr("Telemetry ID: 0x%1").arg(QString::number(new_telemetry_id, 16).toUpper())); +} + +void ConfigureWeb::OnLoginChanged() { +    if (ui->edit_username->text().isEmpty() && ui->edit_token->text().isEmpty()) { +        user_verified = true; +        ui->label_username_verified->setPixmap(QIcon::fromTheme("checked").pixmap(16)); +        ui->label_token_verified->setPixmap(QIcon::fromTheme("checked").pixmap(16)); +    } else { +        user_verified = false; +        ui->label_username_verified->setPixmap(QIcon::fromTheme("failed").pixmap(16)); +        ui->label_token_verified->setPixmap(QIcon::fromTheme("failed").pixmap(16)); +    } +} + +void ConfigureWeb::VerifyLogin() { +    ui->button_verify_login->setDisabled(true); +    ui->button_verify_login->setText(tr("Verifying")); +    verify_watcher.setFuture( +        QtConcurrent::run([this, username = ui->edit_username->text().toStdString(), +                           token = ui->edit_token->text().toStdString()]() { +            return Core::VerifyLogin(username, token); +        })); +} + +void ConfigureWeb::OnLoginVerified() { +    ui->button_verify_login->setEnabled(true); +    ui->button_verify_login->setText(tr("Verify")); +    if (verify_watcher.result()) { +        user_verified = true; +        ui->label_username_verified->setPixmap(QIcon::fromTheme("checked").pixmap(16)); +        ui->label_token_verified->setPixmap(QIcon::fromTheme("checked").pixmap(16)); +    } else { +        ui->label_username_verified->setPixmap(QIcon::fromTheme("failed").pixmap(16)); +        ui->label_token_verified->setPixmap(QIcon::fromTheme("failed").pixmap(16)); +        QMessageBox::critical( +            this, tr("Verification failed"), +            tr("Verification failed. Check that you have entered your username and token " +               "correctly, and that your internet connection is working.")); +    } +} + +void ConfigureWeb::retranslateUi() { +    ui->retranslateUi(this); +} diff --git a/src/yuzu/configuration/configure_web.h b/src/yuzu/configuration/configure_web.h new file mode 100644 index 000000000..7741ab95d --- /dev/null +++ b/src/yuzu/configuration/configure_web.h @@ -0,0 +1,38 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <memory> +#include <QFutureWatcher> +#include <QWidget> + +namespace Ui { +class ConfigureWeb; +} + +class ConfigureWeb : public QWidget { +    Q_OBJECT + +public: +    explicit ConfigureWeb(QWidget* parent = nullptr); +    ~ConfigureWeb(); + +    void applyConfiguration(); +    void retranslateUi(); + +public slots: +    void RefreshTelemetryID(); +    void OnLoginChanged(); +    void VerifyLogin(); +    void OnLoginVerified(); + +private: +    void setConfiguration(); + +    bool user_verified = true; +    QFutureWatcher<bool> verify_watcher; + +    std::unique_ptr<Ui::ConfigureWeb> ui; +}; diff --git a/src/yuzu/configuration/configure_web.ui b/src/yuzu/configuration/configure_web.ui new file mode 100644 index 000000000..2f4b9dd73 --- /dev/null +++ b/src/yuzu/configuration/configure_web.ui @@ -0,0 +1,206 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureWeb</class> + <widget class="QWidget" name="ConfigureWeb"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>926</width> +    <height>561</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Form</string> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <item> +    <layout class="QVBoxLayout" name="verticalLayout_3"> +     <item> +      <widget class="QGroupBox" name="groupBoxWebConfig"> +       <property name="title"> +        <string>yuzu Web Service</string> +       </property> +       <layout class="QVBoxLayout" name="verticalLayoutYuzuWebService"> +        <item> +         <widget class="QLabel" name="web_credentials_disclaimer"> +          <property name="text"> +           <string>By providing your username and token, you agree to allow yuzu to collect additional usage data, which may include user identifying information.</string> +          </property> +         </widget> +        </item> +        <item> +         <layout class="QGridLayout" name="gridLayoutYuzuUsername"> +          <item row="2" column="3"> +           <widget class="QPushButton" name="button_verify_login"> +            <property name="sizePolicy"> +             <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +              <horstretch>0</horstretch> +              <verstretch>0</verstretch> +             </sizepolicy> +            </property> +            <property name="layoutDirection"> +             <enum>Qt::RightToLeft</enum> +            </property> +            <property name="text"> +             <string>Verify</string> +            </property> +           </widget> +          </item> +          <item row="2" column="0"> +           <widget class="QLabel" name="web_signup_link"> +            <property name="text"> +             <string>Sign up</string> +            </property> +           </widget> +          </item> +          <item row="0" column="1" colspan="3"> +           <widget class="QLineEdit" name="edit_username"> +            <property name="maxLength"> +             <number>36</number> +            </property> +           </widget> +          </item> +          <item row="1" column="0"> +           <widget class="QLabel" name="label_token"> +            <property name="text"> +             <string>Token: </string> +            </property> +           </widget> +          </item> +          <item row="1" column="4"> +           <widget class="QLabel" name="label_token_verified"> +           </widget> +          </item> +          <item row="0" column="0"> +           <widget class="QLabel" name="label_username"> +            <property name="text"> +             <string>Username: </string> +            </property> +           </widget> +          </item> +          <item row="0" column="4"> +           <widget class="QLabel" name="label_username_verified"> +           </widget> +          </item> +          <item row="1" column="1" colspan="3"> +           <widget class="QLineEdit" name="edit_token"> +            <property name="maxLength"> +             <number>36</number> +            </property> +            <property name="echoMode"> +             <enum>QLineEdit::Password</enum> +            </property> +           </widget> +          </item> +          <item row="2" column="1"> +           <widget class="QLabel" name="web_token_info_link"> +            <property name="text"> +             <string>What is my token?</string> +            </property> +           </widget> +          </item> +          <item row="2" column="2"> +           <spacer name="horizontalSpacer"> +            <property name="orientation"> +             <enum>Qt::Horizontal</enum> +            </property> +            <property name="sizeHint" stdset="0"> +             <size> +              <width>40</width> +              <height>20</height> +             </size> +            </property> +           </spacer> +          </item> +         </layout> +        </item> +       </layout> +      </widget> +     </item> +     <item> +      <widget class="QGroupBox" name="groupBox"> +       <property name="title"> +        <string>Telemetry</string> +       </property> +       <layout class="QVBoxLayout" name="verticalLayout_2"> +        <item> +         <widget class="QCheckBox" name="toggle_telemetry"> +          <property name="text"> +           <string>Share anonymous usage data with the yuzu team</string> +          </property> +         </widget> +        </item> +        <item> +         <widget class="QLabel" name="telemetry_learn_more"> +          <property name="text"> +           <string>Learn more</string> +          </property> +         </widget> +        </item> +        <item> +         <layout class="QGridLayout" name="gridLayoutTelemetryId"> +          <item row="0" column="0"> +           <widget class="QLabel" name="label_telemetry_id"> +            <property name="text"> +             <string>Telemetry ID:</string> +            </property> +           </widget> +          </item> +          <item row="0" column="1"> +           <widget class="QPushButton" name="button_regenerate_telemetry_id"> +            <property name="sizePolicy"> +             <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> +              <horstretch>0</horstretch> +              <verstretch>0</verstretch> +             </sizepolicy> +            </property> +            <property name="layoutDirection"> +             <enum>Qt::RightToLeft</enum> +            </property> +            <property name="text"> +             <string>Regenerate</string> +            </property> +           </widget> +          </item> +         </layout> +        </item> +       </layout> +      </widget> +     </item> +    </layout> +   </item> +   <item> +     <widget class="QGroupBox" name="discord_group"> +      <property name="title"> +       <string>Discord Presence</string> +      </property> +      <layout class="QVBoxLayout" name="verticalLayout_21"> +       <item> +        <widget class="QCheckBox" name="toggle_discordrpc"> +         <property name="text"> +          <string>Show Current Game in your Discord Status</string> +         </property> +        </widget> +       </item> +      </layout> +     </widget> +   </item> +   <item> +    <spacer name="verticalSpacer"> +     <property name="orientation"> +      <enum>Qt::Vertical</enum> +     </property> +     <property name="sizeHint" stdset="0"> +      <size> +       <width>20</width> +       <height>40</height> +      </size> +     </property> +    </spacer> +   </item> +  </layout> + </widget> + <resources/> + <connections/> +</ui> | 
