diff options
Diffstat (limited to 'src/citra_qt')
| -rw-r--r-- | src/citra_qt/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/citra_qt/configuration/config.cpp | 8 | ||||
| -rw-r--r-- | src/citra_qt/configuration/configure.ui | 15 | ||||
| -rw-r--r-- | src/citra_qt/configuration/configure_dialog.cpp | 1 | ||||
| -rw-r--r-- | src/citra_qt/configuration/configure_graphics.ui | 11 | ||||
| -rw-r--r-- | src/citra_qt/configuration/configure_web.cpp | 52 | ||||
| -rw-r--r-- | src/citra_qt/configuration/configure_web.h | 30 | ||||
| -rw-r--r-- | src/citra_qt/configuration/configure_web.ui | 153 | ||||
| -rw-r--r-- | src/citra_qt/main.cpp | 46 | ||||
| -rw-r--r-- | src/citra_qt/main.h | 2 | ||||
| -rw-r--r-- | src/citra_qt/ui_settings.h | 2 | 
11 files changed, 318 insertions, 5 deletions
| diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt index f364b2284..e0a19fd9e 100644 --- a/src/citra_qt/CMakeLists.txt +++ b/src/citra_qt/CMakeLists.txt @@ -12,6 +12,7 @@ set(SRCS              configuration/configure_graphics.cpp              configuration/configure_input.cpp              configuration/configure_system.cpp +            configuration/configure_web.cpp              debugger/graphics/graphics.cpp              debugger/graphics/graphics_breakpoint_observer.cpp              debugger/graphics/graphics_breakpoints.cpp @@ -42,6 +43,7 @@ set(HEADERS              configuration/configure_graphics.h              configuration/configure_input.h              configuration/configure_system.h +            configuration/configure_web.h              debugger/graphics/graphics.h              debugger/graphics/graphics_breakpoint_observer.h              debugger/graphics/graphics_breakpoints.h @@ -71,6 +73,7 @@ set(UIS              configuration/configure_graphics.ui              configuration/configure_input.ui              configuration/configure_system.ui +            configuration/configure_web.ui              debugger/registers.ui              hotkeys.ui              main.ui diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index 6e42db007..e2dceaa4c 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -139,10 +139,13 @@ void Config::ReadValues() {      qt_config->endGroup();      qt_config->beginGroup("WebService"); +    Settings::values.enable_telemetry = qt_config->value("enable_telemetry", true).toBool();      Settings::values.telemetry_endpoint_url =          qt_config->value("telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry")              .toString()              .toStdString(); +    Settings::values.citra_username = qt_config->value("citra_username").toString().toStdString(); +    Settings::values.citra_token = qt_config->value("citra_token").toString().toStdString();      qt_config->endGroup();      qt_config->beginGroup("UI"); @@ -194,6 +197,7 @@ void Config::ReadValues() {      UISettings::values.show_status_bar = qt_config->value("showStatusBar", true).toBool();      UISettings::values.confirm_before_closing = qt_config->value("confirmClose", true).toBool();      UISettings::values.first_start = qt_config->value("firstStart", true).toBool(); +    UISettings::values.callout_flags = qt_config->value("calloutFlags", 0).toUInt();      qt_config->endGroup();  } @@ -283,8 +287,11 @@ void Config::SaveValues() {      qt_config->endGroup();      qt_config->beginGroup("WebService"); +    qt_config->setValue("enable_telemetry", Settings::values.enable_telemetry);      qt_config->setValue("telemetry_endpoint_url",                          QString::fromStdString(Settings::values.telemetry_endpoint_url)); +    qt_config->setValue("citra_username", QString::fromStdString(Settings::values.citra_username)); +    qt_config->setValue("citra_token", QString::fromStdString(Settings::values.citra_token));      qt_config->endGroup();      qt_config->beginGroup("UI"); @@ -320,6 +327,7 @@ void Config::SaveValues() {      qt_config->setValue("showStatusBar", UISettings::values.show_status_bar);      qt_config->setValue("confirmClose", UISettings::values.confirm_before_closing);      qt_config->setValue("firstStart", UISettings::values.first_start); +    qt_config->setValue("calloutFlags", UISettings::values.callout_flags);      qt_config->endGroup();  } diff --git a/src/citra_qt/configuration/configure.ui b/src/citra_qt/configuration/configure.ui index 85e206e42..6abd1917e 100644 --- a/src/citra_qt/configuration/configure.ui +++ b/src/citra_qt/configuration/configure.ui @@ -6,8 +6,8 @@     <rect>      <x>0</x>      <y>0</y> -    <width>441</width> -    <height>501</height> +    <width>740</width> +    <height>500</height>     </rect>    </property>    <property name="windowTitle"> @@ -49,6 +49,11 @@         <string>Debug</string>        </attribute>       </widget> +     <widget class="ConfigureWeb" name="webTab"> +      <attribute name="title"> +       <string>Web</string> +      </attribute> +     </widget>      </widget>     </item>     <item> @@ -97,6 +102,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/citra_qt/configuration/configure_dialog.cpp b/src/citra_qt/configuration/configure_dialog.cpp index dfc8c03a7..b87dc0e6c 100644 --- a/src/citra_qt/configuration/configure_dialog.cpp +++ b/src/citra_qt/configuration/configure_dialog.cpp @@ -23,5 +23,6 @@ void ConfigureDialog::applyConfiguration() {      ui->graphicsTab->applyConfiguration();      ui->audioTab->applyConfiguration();      ui->debugTab->applyConfiguration(); +    ui->webTab->applyConfiguration();      Settings::Apply();  } diff --git a/src/citra_qt/configuration/configure_graphics.ui b/src/citra_qt/configuration/configure_graphics.ui index 228f2a869..b340149d5 100644 --- a/src/citra_qt/configuration/configure_graphics.ui +++ b/src/citra_qt/configuration/configure_graphics.ui @@ -146,17 +146,22 @@             <widget class="QComboBox" name="layout_combobox">              <item>               <property name="text"> -              <string notr="true">Default</string> +              <string>Default</string>               </property>              </item>              <item>               <property name="text"> -              <string notr="true">Single Screen</string> +              <string>Single Screen</string>               </property>              </item>              <item>               <property name="text"> -              <string notr="true">Large Screen</string> +              <string>Large Screen</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string>Side by Side</string>               </property>              </item>             </widget> diff --git a/src/citra_qt/configuration/configure_web.cpp b/src/citra_qt/configuration/configure_web.cpp new file mode 100644 index 000000000..8715fb018 --- /dev/null +++ b/src/citra_qt/configuration/configure_web.cpp @@ -0,0 +1,52 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "citra_qt/configuration/configure_web.h" +#include "core/settings.h" +#include "core/telemetry_session.h" +#include "ui_configure_web.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); + +    this->setConfiguration(); +} + +ConfigureWeb::~ConfigureWeb() {} + +void ConfigureWeb::setConfiguration() { +    ui->web_credentials_disclaimer->setWordWrap(true); +    ui->telemetry_learn_more->setOpenExternalLinks(true); +    ui->telemetry_learn_more->setText("<a " +                                      "href='https://citra-emu.org/entry/" +                                      "telemetry-and-why-thats-a-good-thing/'>Learn more</a>"); + +    ui->web_signup_link->setOpenExternalLinks(true); +    ui->web_signup_link->setText("<a href='https://services.citra-emu.org/'>Sign up</a>"); +    ui->web_token_info_link->setOpenExternalLinks(true); +    ui->web_token_info_link->setText( +        "<a href='https://citra-emu.org/wiki/citra-web-service/'>What is my token?</a>"); + +    ui->toggle_telemetry->setChecked(Settings::values.enable_telemetry); +    ui->edit_username->setText(QString::fromStdString(Settings::values.citra_username)); +    ui->edit_token->setText(QString::fromStdString(Settings::values.citra_token)); +    ui->label_telemetry_id->setText("Telemetry ID: 0x" + +                                    QString::number(Core::GetTelemetryId(), 16).toUpper()); +} + +void ConfigureWeb::applyConfiguration() { +    Settings::values.enable_telemetry = ui->toggle_telemetry->isChecked(); +    Settings::values.citra_username = ui->edit_username->text().toStdString(); +    Settings::values.citra_token = ui->edit_token->text().toStdString(); +    Settings::Apply(); +} + +void ConfigureWeb::refreshTelemetryID() { +    const u64 new_telemetry_id{Core::RegenerateTelemetryId()}; +    ui->label_telemetry_id->setText("Telemetry ID: 0x" + +                                    QString::number(new_telemetry_id, 16).toUpper()); +} diff --git a/src/citra_qt/configuration/configure_web.h b/src/citra_qt/configuration/configure_web.h new file mode 100644 index 000000000..20bc254b9 --- /dev/null +++ b/src/citra_qt/configuration/configure_web.h @@ -0,0 +1,30 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <memory> +#include <QWidget> + +namespace Ui { +class ConfigureWeb; +} + +class ConfigureWeb : public QWidget { +    Q_OBJECT + +public: +    explicit ConfigureWeb(QWidget* parent = nullptr); +    ~ConfigureWeb(); + +    void applyConfiguration(); + +public slots: +    void refreshTelemetryID(); + +private: +    void setConfiguration(); + +    std::unique_ptr<Ui::ConfigureWeb> ui; +}; diff --git a/src/citra_qt/configuration/configure_web.ui b/src/citra_qt/configuration/configure_web.ui new file mode 100644 index 000000000..d8d283fad --- /dev/null +++ b/src/citra_qt/configuration/configure_web.ui @@ -0,0 +1,153 @@ +<?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>400</width> +    <height>300</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>Citra Web Service</string> +       </property> +       <layout class="QVBoxLayout" name="verticalLayoutCitraWebService"> +        <item> +         <widget class="QLabel" name="web_credentials_disclaimer"> +          <property name="text"> +           <string>By providing your username and token, you agree to allow Citra to collect additional usage data, which may include user identifying information.</string> +          </property> +         </widget> +        </item> +        <item> +         <layout class="QGridLayout" name="gridLayoutCitraUsername"> +          <item row="0" column="0"> +           <widget class="QLabel" name="label_username"> +            <property name="text"> +             <string>Username: </string> +            </property> +           </widget> +          </item> +          <item row="0" column="1"> +           <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="1"> +           <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="0"> +           <widget class="QLabel" name="web_signup_link"> +            <property name="text"> +             <string>Sign up</string> +            </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> +         </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 Citra 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> +    <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> diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index c1ae0ccc8..8adbcfe86 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -48,6 +48,47 @@  Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);  #endif +/** + * "Callouts" are one-time instructional messages shown to the user. In the config settings, there + * is a bitfield "callout_flags" options, used to track if a message has already been shown to the + * user. This is 32-bits - if we have more than 32 callouts, we should retire and recyle old ones. + */ +enum class CalloutFlag : uint32_t { +    Telemetry = 0x1, +}; + +static void ShowCalloutMessage(const QString& message, CalloutFlag flag) { +    if (UISettings::values.callout_flags & static_cast<uint32_t>(flag)) { +        return; +    } + +    UISettings::values.callout_flags |= static_cast<uint32_t>(flag); + +    QMessageBox msg; +    msg.setText(message); +    msg.setStandardButtons(QMessageBox::Ok); +    msg.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); +    msg.setStyleSheet("QLabel{min-width: 900px;}"); +    msg.exec(); +} + +void GMainWindow::ShowCallouts() { +    static const QString telemetry_message = +        tr("To help improve Citra, the Citra Team collects anonymous usage data. No private or " +           "personally identifying information is collected. This data helps us to understand how " +           "people use Citra and prioritize our efforts. Furthermore, it helps us to more easily " +           "identify emulation bugs and performance issues. This data includes:<ul><li>Information" +           " about the version of Citra you are using</li><li>Performance data about the games you " +           "play</li><li>Your configuration settings</li><li>Information about your computer " +           "hardware</li><li>Emulation errors and crash information</li></ul>By default, this " +           "feature is enabled. To disable this feature, click 'Emulation' from the menu and then " +           "select 'Configure...'. Then, on the 'Web' tab, uncheck 'Share anonymous usage data with" +           " the Citra team'. <br/><br/>By using this software, you agree to the above terms.<br/>" +           "<br/><a href='https://citra-emu.org/entry/telemetry-and-why-thats-a-good-thing/'>Learn " +           "more</a>"); +    ShowCalloutMessage(telemetry_message, CalloutFlag::Telemetry); +} +  GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {      Pica::g_debug_context = Pica::DebugContext::Construct();      setAcceptDrops(true); @@ -73,6 +114,9 @@ GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {      UpdateUITheme(); +    // Show one-time "callout" messages to the user +    ShowCallouts(); +      QStringList args = QApplication::arguments();      if (args.length() >= 2) {          BootGame(args[1]); @@ -320,6 +364,8 @@ bool GMainWindow::LoadROM(const QString& filename) {      const Core::System::ResultStatus result{system.Load(render_window, filename.toStdString())}; +    Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "Qt"); +      if (result != Core::System::ResultStatus::Success) {          switch (result) {          case Core::System::ResultStatus::ErrorGetLoader: diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h index 360de2ced..d59a6d67d 100644 --- a/src/citra_qt/main.h +++ b/src/citra_qt/main.h @@ -80,6 +80,8 @@ private:      void BootGame(const QString& filename);      void ShutdownGame(); +    void ShowCallouts(); +      /**       * Stores the filename in the recently loaded files list.       * The new filename is stored at the beginning of the recently loaded files list. diff --git a/src/citra_qt/ui_settings.h b/src/citra_qt/ui_settings.h index 025c73f84..d85c92765 100644 --- a/src/citra_qt/ui_settings.h +++ b/src/citra_qt/ui_settings.h @@ -48,6 +48,8 @@ struct Values {      // Shortcut name <Shortcut, context>      std::vector<Shortcut> shortcuts; + +    uint32_t callout_flags;  };  extern Values values; | 
