summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp
blob: 11bc917a8a71e7b038219efbab0a3a02b18df5dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright 2023 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#ifdef USE_RETRO_ACHIEVEMENTS
#include "DolphinQt/Achievements/AchievementsWindow.h"

#include <mutex>

#include <rcheevos/include/rc_error.h>

#include <QDialogButtonBox>
#include <QScrollArea>
#include <QScrollBar>
#include <QTabWidget>
#include <QVBoxLayout>

#include "Core/AchievementManager.h"

#include "DolphinQt/Achievements/AchievementHeaderWidget.h"
#include "DolphinQt/Achievements/AchievementLeaderboardWidget.h"
#include "DolphinQt/Achievements/AchievementProgressWidget.h"
#include "DolphinQt/Achievements/AchievementSettingsWidget.h"
#include "DolphinQt/QtUtils/QueueOnObject.h"
#include "DolphinQt/QtUtils/WrapInScrollArea.h"
#include "DolphinQt/Settings.h"

AchievementsWindow::AchievementsWindow(QWidget* parent) : QDialog(parent)
{
  setWindowTitle(tr("Achievements"));

  CreateMainLayout();
  ConnectWidgets();

  m_event_hook = AchievementManager::GetInstance().update_event.Register(
      [this](AchievementManager::UpdatedItems updated_items) {
        QueueOnObject(this, [this, updated_items = std::move(updated_items)] {
          AchievementsWindow::UpdateData(updated_items);
        });
      });
  UpdateData(AchievementManager::UpdatedItems{.all = true});

  connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
          [this] { m_settings_widget->UpdateData(RC_OK); });
}

void AchievementsWindow::showEvent(QShowEvent* event)
{
  QDialog::showEvent(event);
  update();
}

void AchievementsWindow::CreateMainLayout()
{
  const auto is_game_loaded = AchievementManager::GetInstance().IsGameLoaded();

  m_header_widget = new AchievementHeaderWidget(this);
  m_tab_widget = new QTabWidget();
  m_settings_widget = new AchievementSettingsWidget(m_tab_widget);
  m_progress_widget = new AchievementProgressWidget(m_tab_widget);
  m_leaderboard_widget = new AchievementLeaderboardWidget(m_tab_widget);
  m_tab_widget->addTab(GetWrappedWidget(m_settings_widget), tr("Settings"));
  m_tab_widget->addTab(GetWrappedWidget(m_progress_widget), tr("Progress"));
  m_tab_widget->addTab(GetWrappedWidget(m_leaderboard_widget), tr("Leaderboards"));

  m_button_box = new QDialogButtonBox(QDialogButtonBox::Close);

  auto* const layout = new QVBoxLayout{this};
  layout->addWidget(m_header_widget);
  layout->addWidget(m_tab_widget);
  layout->addWidget(m_button_box);

  adjustSize();

  m_tab_widget->setTabVisible(1, is_game_loaded);
  m_tab_widget->setTabVisible(2, is_game_loaded);
}

void AchievementsWindow::ConnectWidgets()
{
  connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
}

void AchievementsWindow::UpdateData(const AchievementManager::UpdatedItems& updated_items)
{
  m_settings_widget->UpdateData(updated_items.failed_login_code);
  if (updated_items.all)
  {
    m_header_widget->UpdateData();
    m_progress_widget->UpdateData(true);
    m_leaderboard_widget->UpdateData(true);
    static_cast<QScrollArea*>(m_tab_widget->widget(1))->verticalScrollBar()->setValue(0);
    static_cast<QScrollArea*>(m_tab_widget->widget(2))->verticalScrollBar()->setValue(0);
  }
  else
  {
    if (updated_items.player_icon || updated_items.game_icon || updated_items.rich_presence ||
        updated_items.all_achievements || updated_items.achievements.size() > 0)
    {
      m_header_widget->UpdateData();
    }
    if (updated_items.all_achievements || updated_items.rich_presence)
      m_progress_widget->UpdateData(false);
    else if (updated_items.achievements.size() > 0)
      m_progress_widget->UpdateData(updated_items.achievements);
    if (updated_items.all_leaderboards)
      m_leaderboard_widget->UpdateData(false);
    else if (updated_items.leaderboards.size() > 0)
      m_leaderboard_widget->UpdateData(updated_items.leaderboards);
  }

  {
    auto& instance = AchievementManager::GetInstance();
    std::lock_guard lg{instance.GetLock()};
    const bool is_game_loaded = instance.IsGameLoaded();
    m_header_widget->setVisible(instance.HasAPIToken());
    m_tab_widget->setTabVisible(1, is_game_loaded);
    m_tab_widget->setTabVisible(2, is_game_loaded);
  }
  update();
}

void AchievementsWindow::ForceSettingsTab()
{
  m_tab_widget->setCurrentIndex(0);
}

#endif  // USE_RETRO_ACHIEVEMENTS