4jcraft/Minecraft.Client/Platform/Common/UI/UIScene_LeaderboardsMenu.h

166 lines
6 KiB
C++

#pragma once
#include "UIScene.h"
#include "../Leaderboards/LeaderboardInterface.h"
class UIScene_LeaderboardsMenu : public UIScene,
public LeaderboardReadListener {
private:
// 4J Stu - Because the kills leaderboard doesn't a peaceful entry there are
// some special handling to make it skip that. We have re-arranged the order
// of the leaderboards so I am making this in case we do it again. 4J Stu -
// Made it a member of the class, rather than a #define
static const int LEADERBOARD_KILLS_POSITION = 3;
static const int NUM_LEADERBOARDS =
4; // 6; //Number of leaderboards
static const int NUM_ENTRIES = 101; // Cache up to this many entries
static const int READ_SIZE = 15; // Read this many entries at a time
struct LeaderboardDescriptor {
unsigned int m_columnCount;
bool m_isDistanceLeaderboard;
unsigned int m_title;
LeaderboardDescriptor(unsigned int columnCount,
bool isDistanceLeaderboard, unsigned int title) {
m_columnCount = columnCount;
m_isDistanceLeaderboard = isDistanceLeaderboard;
m_title = title;
}
};
static const LeaderboardDescriptor LEADERBOARD_DESCRIPTORS[NUM_LEADERBOARDS]
[4];
static const int TitleIcons[NUM_LEADERBOARDS][7];
struct LeaderboardEntry {
PlayerUID m_xuid;
unsigned int
m_row; // Row identifier for passing to Iggy as a unique identifier
unsigned int m_rank;
wchar_t m_wcRank[12];
wchar_t m_gamerTag[XUSER_NAME_SIZE + 1];
// int m_locale;
unsigned int m_columns[7];
wchar_t m_wcColumns[7][12];
bool m_bPlayer; // Is the player
bool m_bOnline; // Is online
bool m_bFriend; // Is friend
bool m_bRequestedFriend; // Friend request sent but not answered
int m_idsErrorMessage; // 4J-JEV: Non-zero if this entry has an error
// message instead of results.
};
struct Leaderboard {
unsigned int m_totalEntryCount; // Either total number of entries in
// leaderboard, or total number of
// results for a friends query
std::vector<LeaderboardEntry> m_entries;
unsigned int m_numColumns;
};
Leaderboard m_leaderboard; // All leaderboard data for the currently
// selected filter
unsigned int
m_currentLeaderboard; // The current leaderboard selected for view
LeaderboardManager::EFilterMode
m_currentFilter; // The current filter selected
unsigned int m_currentDifficulty; // The current difficulty selected
unsigned int m_newEntryIndex; // Index of the first entry being read
unsigned int
m_newReadSize; // Number of entries in the current read operation
unsigned int m_newEntriesCount; // Number of new entries in this update
int m_newTop; // Index of the element that should be at the top of the list
int m_newSel; // Index of the element that should be selected in the list
bool m_isProcessingStatsRead;
bool m_bPopulatedOnce;
bool m_bReady;
LeaderboardInterface m_interface;
UIControl_LeaderboardList m_listEntries;
UIControl_Label m_labelFilter, m_labelLeaderboard, m_labelEntries,
m_labelInfo;
UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene)
UI_MAP_ELEMENT(m_listEntries, "Gamers")
UI_MAP_ELEMENT(m_labelFilter, "Filter")
UI_MAP_ELEMENT(m_labelLeaderboard, "Leaderboard")
UI_MAP_ELEMENT(m_labelEntries, "Entries")
UI_MAP_ELEMENT(m_labelInfo, "Info")
UI_END_MAP_ELEMENTS_AND_NAMES()
static int ExitLeaderboards(void* pParam, int iPad,
C4JStorage::EMessageResult result);
public:
UIScene_LeaderboardsMenu(int iPad, void* initData, UILayer* parentLayer);
~UIScene_LeaderboardsMenu();
virtual void updateTooltips();
virtual void updateComponents();
virtual EUIScene getSceneType() { return eUIScene_LeaderboardsMenu; }
// Returns true if this scene has focus for the pad passed in
virtual bool hasFocus(int iPad) { return bHasFocus; }
virtual void handleTimerComplete(int id);
private:
int GetEntryStartIndex();
protected:
virtual std::wstring getMoviePath();
public:
virtual void tick();
virtual void handleReload();
// INPUT
virtual void handleInput(int iPad, int key, bool repeat, bool pressed,
bool released, bool& handled);
private:
// Start a read request with the current parameters
void ReadStats(int startIndex);
// Copy the stats from the raw m_stats structure into the m_leaderboards
// structure
int m_numStats;
LeaderboardManager::ViewOut m_stats;
bool RetrieveStats();
// Copy a leaderboard entry from the stats row
void CopyLeaderboardEntry(LeaderboardManager::ReadScore* statsRow,
int leaderboardEntryIndex,
bool isDistanceLeaderboard);
// Populate the XUI leaderboard with the contents of m_leaderboards
void PopulateLeaderboard(LeaderboardManager::eStatsReturn ret);
// Set the header text of the leaderboard
void SetLeaderboardHeader();
// Set the title icons
int SetLeaderboardTitleIcons();
// Callback function called when stats read completes, userdata contains
// pointer to instance of CScene_Leaderboards
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret,
int numResults,
LeaderboardManager::ViewOut results);
virtual void customDraw(IggyCustomDrawCallbackRegion* region);
virtual void handleSelectionChanged(F64 selectedId);
virtual void handleRequestMoreData(F64 startIndex, bool up);
bool m_bIgnoreInput;
};