diff options
Diffstat (limited to 'src/yuzu/configuration')
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 21 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure.ui | 11 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_dialog.cpp | 5 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_service.cpp | 138 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_service.h | 34 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_service.ui | 124 | 
7 files changed, 334 insertions, 1 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 92d9fb161..4cb27ddb2 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -525,6 +525,17 @@ void Config::ReadDebuggingValues() {      qt_config->endGroup();  } +void Config::ReadServiceValues() { +    qt_config->beginGroup(QStringLiteral("Services")); +    Settings::values.bcat_backend = +        ReadSetting(QStringLiteral("bcat_backend"), QStringLiteral("boxcat")) +            .toString() +            .toStdString(); +    Settings::values.bcat_boxcat_local = +        ReadSetting(QStringLiteral("bcat_boxcat_local"), false).toBool(); +    qt_config->endGroup(); +} +  void Config::ReadDisabledAddOnValues() {      const auto size = qt_config->beginReadArray(QStringLiteral("DisabledAddOns")); @@ -769,6 +780,7 @@ void Config::ReadValues() {      ReadMiscellaneousValues();      ReadDebuggingValues();      ReadWebServiceValues(); +    ReadServiceValues();      ReadDisabledAddOnValues();      ReadUIValues();  } @@ -866,6 +878,7 @@ void Config::SaveValues() {      SaveMiscellaneousValues();      SaveDebuggingValues();      SaveWebServiceValues(); +    SaveServiceValues();      SaveDisabledAddOnValues();      SaveUIValues();  } @@ -963,6 +976,14 @@ void Config::SaveDebuggingValues() {      qt_config->endGroup();  } +void Config::SaveServiceValues() { +    qt_config->beginGroup(QStringLiteral("Services")); +    WriteSetting(QStringLiteral("bcat_backend"), +                 QString::fromStdString(Settings::values.bcat_backend), QStringLiteral("null")); +    WriteSetting(QStringLiteral("bcat_boxcat_local"), Settings::values.bcat_boxcat_local, false); +    qt_config->endGroup(); +} +  void Config::SaveDisabledAddOnValues() {      qt_config->beginWriteArray(QStringLiteral("DisabledAddOns")); diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index 6b523ecdd..ba6888004 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -42,6 +42,7 @@ private:      void ReadCoreValues();      void ReadDataStorageValues();      void ReadDebuggingValues(); +    void ReadServiceValues();      void ReadDisabledAddOnValues();      void ReadMiscellaneousValues();      void ReadPathValues(); @@ -65,6 +66,7 @@ private:      void SaveCoreValues();      void SaveDataStorageValues();      void SaveDebuggingValues(); +    void SaveServiceValues();      void SaveDisabledAddOnValues();      void SaveMiscellaneousValues();      void SavePathValues(); diff --git a/src/yuzu/configuration/configure.ui b/src/yuzu/configuration/configure.ui index 49fadd0ef..372427ae2 100644 --- a/src/yuzu/configuration/configure.ui +++ b/src/yuzu/configuration/configure.ui @@ -98,6 +98,11 @@           <string>Web</string>          </attribute>         </widget> +       <widget class="ConfigureService" name="serviceTab"> +        <attribute name="title"> +         <string>Services</string> +        </attribute> +       </widget>        </widget>       </item>      </layout> @@ -178,6 +183,12 @@     <header>configuration/configure_hotkeys.h</header>     <container>1</container>    </customwidget> +  <customwidget> +   <class>ConfigureService</class> +   <extends>QWidget</extends> +   <header>configuration/configure_service.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 7c875ae87..25b2e1b05 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -44,6 +44,7 @@ void ConfigureDialog::ApplyConfiguration() {      ui->audioTab->ApplyConfiguration();      ui->debugTab->ApplyConfiguration();      ui->webTab->ApplyConfiguration(); +    ui->serviceTab->ApplyConfiguration();      Settings::Apply();      Settings::LogSettings();  } @@ -74,7 +75,8 @@ Q_DECLARE_METATYPE(QList<QWidget*>);  void ConfigureDialog::PopulateSelectionList() {      const std::array<std::pair<QString, QList<QWidget*>>, 4> items{          {{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->gameListTab}}, -         {tr("System"), {ui->systemTab, ui->profileManagerTab, ui->filesystemTab, ui->audioTab}}, +         {tr("System"), +          {ui->systemTab, ui->profileManagerTab, ui->serviceTab, ui->filesystemTab, ui->audioTab}},           {tr("Graphics"), {ui->graphicsTab}},           {tr("Controls"), {ui->inputTab, ui->hotkeysTab}}},      }; @@ -108,6 +110,7 @@ void ConfigureDialog::UpdateVisibleTabs() {          {ui->webTab, tr("Web")},          {ui->gameListTab, tr("Game List")},          {ui->filesystemTab, tr("Filesystem")}, +        {ui->serviceTab, tr("Services")},      };      [[maybe_unused]] const QSignalBlocker blocker(ui->tabWidget); diff --git a/src/yuzu/configuration/configure_service.cpp b/src/yuzu/configuration/configure_service.cpp new file mode 100644 index 000000000..06566e981 --- /dev/null +++ b/src/yuzu/configuration/configure_service.cpp @@ -0,0 +1,138 @@ +// Copyright 2019 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <QGraphicsItem> +#include <QtConcurrent/QtConcurrent> +#include "core/hle/service/bcat/backend/boxcat.h" +#include "core/settings.h" +#include "ui_configure_service.h" +#include "yuzu/configuration/configure_service.h" + +namespace { +QString FormatEventStatusString(const Service::BCAT::EventStatus& status) { +    QString out; + +    if (status.header.has_value()) { +        out += QStringLiteral("<i>%1</i><br>").arg(QString::fromStdString(*status.header)); +    } + +    if (status.events.size() == 1) { +        out += QStringLiteral("%1<br>").arg(QString::fromStdString(status.events.front())); +    } else { +        for (const auto& event : status.events) { +            out += QStringLiteral("- %1<br>").arg(QString::fromStdString(event)); +        } +    } + +    if (status.footer.has_value()) { +        out += QStringLiteral("<i>%1</i><br>").arg(QString::fromStdString(*status.footer)); +    } + +    return out; +} +} // Anonymous namespace + +ConfigureService::ConfigureService(QWidget* parent) +    : QWidget(parent), ui(std::make_unique<Ui::ConfigureService>()) { +    ui->setupUi(this); + +    ui->bcat_source->addItem(QStringLiteral("None")); +    ui->bcat_empty_label->setHidden(true); +    ui->bcat_empty_header->setHidden(true); + +#ifdef YUZU_ENABLE_BOXCAT +    ui->bcat_source->addItem(QStringLiteral("Boxcat"), QStringLiteral("boxcat")); +#endif + +    connect(ui->bcat_source, QOverload<int>::of(&QComboBox::currentIndexChanged), this, +            &ConfigureService::OnBCATImplChanged); + +    this->SetConfiguration(); +} + +ConfigureService::~ConfigureService() = default; + +void ConfigureService::ApplyConfiguration() { +    Settings::values.bcat_backend = ui->bcat_source->currentText().toLower().toStdString(); +} + +void ConfigureService::RetranslateUi() { +    ui->retranslateUi(this); +} + +void ConfigureService::SetConfiguration() { +    const int index = +        ui->bcat_source->findData(QString::fromStdString(Settings::values.bcat_backend)); +    ui->bcat_source->setCurrentIndex(index == -1 ? 0 : index); +} + +std::pair<QString, QString> ConfigureService::BCATDownloadEvents() { +    std::optional<std::string> global; +    std::map<std::string, Service::BCAT::EventStatus> map; +    const auto res = Service::BCAT::Boxcat::GetStatus(global, map); + +    switch (res) { +    case Service::BCAT::Boxcat::StatusResult::Success: +        break; +    case Service::BCAT::Boxcat::StatusResult::Offline: +        return {QString{}, +                tr("The boxcat service is offline or you are not connected to the internet.")}; +    case Service::BCAT::Boxcat::StatusResult::ParseError: +        return {QString{}, +                tr("There was an error while processing the boxcat event data. Contact the yuzu " +                   "developers.")}; +    case Service::BCAT::Boxcat::StatusResult::BadClientVersion: +        return {QString{}, +                tr("The version of yuzu you are using is either too new or too old for the server. " +                   "Try updating to the latest official release of yuzu.")}; +    } + +    if (map.empty()) { +        return {QStringLiteral("Current Boxcat Events"), +                tr("There are currently no events on boxcat.")}; +    } + +    QString out; + +    if (global.has_value()) { +        out += QStringLiteral("%1<br>").arg(QString::fromStdString(*global)); +    } + +    for (const auto& [key, value] : map) { +        out += QStringLiteral("%1<b>%2</b><br>%3") +                   .arg(out.isEmpty() ? QString{} : QStringLiteral("<br>")) +                   .arg(QString::fromStdString(key)) +                   .arg(FormatEventStatusString(value)); +    } +    return {QStringLiteral("Current Boxcat Events"), std::move(out)}; +} + +void ConfigureService::OnBCATImplChanged() { +#ifdef YUZU_ENABLE_BOXCAT +    const auto boxcat = ui->bcat_source->currentText() == QStringLiteral("Boxcat"); +    ui->bcat_empty_header->setHidden(!boxcat); +    ui->bcat_empty_label->setHidden(!boxcat); +    ui->bcat_empty_header->setText(QString{}); +    ui->bcat_empty_label->setText(tr("Yuzu is retrieving the latest boxcat status...")); + +    if (!boxcat) +        return; + +    const auto future = QtConcurrent::run([this] { return BCATDownloadEvents(); }); + +    watcher.setFuture(future); +    connect(&watcher, &QFutureWatcher<std::pair<QString, QString>>::finished, this, +            [this] { OnUpdateBCATEmptyLabel(watcher.result()); }); +#endif +} + +void ConfigureService::OnUpdateBCATEmptyLabel(std::pair<QString, QString> string) { +#ifdef YUZU_ENABLE_BOXCAT +    const auto boxcat = ui->bcat_source->currentText() == QStringLiteral("Boxcat"); +    if (boxcat) { +        ui->bcat_empty_header->setText(string.first); +        ui->bcat_empty_label->setText(string.second); +    } +#endif +} diff --git a/src/yuzu/configuration/configure_service.h b/src/yuzu/configuration/configure_service.h new file mode 100644 index 000000000..f5c1b703a --- /dev/null +++ b/src/yuzu/configuration/configure_service.h @@ -0,0 +1,34 @@ +// Copyright 2019 yuzu 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 ConfigureService; +} + +class ConfigureService : public QWidget { +    Q_OBJECT + +public: +    explicit ConfigureService(QWidget* parent = nullptr); +    ~ConfigureService() override; + +    void ApplyConfiguration(); +    void RetranslateUi(); + +private: +    void SetConfiguration(); + +    std::pair<QString, QString> BCATDownloadEvents(); +    void OnBCATImplChanged(); +    void OnUpdateBCATEmptyLabel(std::pair<QString, QString> string); + +    std::unique_ptr<Ui::ConfigureService> ui; +    QFutureWatcher<std::pair<QString, QString>> watcher{this}; +}; diff --git a/src/yuzu/configuration/configure_service.ui b/src/yuzu/configuration/configure_service.ui new file mode 100644 index 000000000..9668dd557 --- /dev/null +++ b/src/yuzu/configuration/configure_service.ui @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureService</class> + <widget class="QWidget" name="ConfigureService"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>433</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="groupBox"> +       <property name="title"> +        <string>BCAT</string> +       </property> +       <layout class="QGridLayout" name="gridLayout"> +        <item row="1" column="1" colspan="2"> +         <widget class="QLabel" name="label_2"> +          <property name="maximumSize"> +           <size> +            <width>260</width> +            <height>16777215</height> +           </size> +          </property> +          <property name="text"> +           <string>BCAT is Nintendo's way of sending data to games to engage its community and unlock additional content.</string> +          </property> +          <property name="wordWrap"> +           <bool>true</bool> +          </property> +         </widget> +        </item> +        <item row="0" column="0"> +         <widget class="QLabel" name="label"> +          <property name="maximumSize"> +           <size> +            <width>16777215</width> +            <height>16777215</height> +           </size> +          </property> +          <property name="text"> +           <string>BCAT Backend</string> +          </property> +         </widget> +        </item> +        <item row="3" column="1" colspan="2"> +         <widget class="QLabel" name="bcat_empty_label"> +          <property name="enabled"> +           <bool>true</bool> +          </property> +          <property name="maximumSize"> +           <size> +            <width>260</width> +            <height>16777215</height> +           </size> +          </property> +          <property name="text"> +           <string/> +          </property> +          <property name="alignment"> +           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> +          </property> +          <property name="wordWrap"> +           <bool>true</bool> +          </property> +         </widget> +        </item> +        <item row="2" column="1" colspan="2"> +         <widget class="QLabel" name="label_3"> +          <property name="text"> +           <string><html><head/><body><p><a href="https://yuzu-emu.org/help/feature/boxcat"><span style=" text-decoration: underline; color:#0000ff;">Learn more about BCAT, Boxcat, and Current Events</span></a></p></body></html></string> +          </property> +          <property name="openExternalLinks"> +           <bool>true</bool> +          </property> +         </widget> +        </item> +        <item row="0" column="1" colspan="2"> +         <widget class="QComboBox" name="bcat_source"/> +        </item> +        <item row="3" column="0"> +         <widget class="QLabel" name="bcat_empty_header"> +          <property name="text"> +           <string/> +          </property> +          <property name="alignment"> +           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> +          </property> +          <property name="wordWrap"> +           <bool>true</bool> +          </property> +         </widget> +        </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> | 
