DDraceNetwork Documentation
Loading...
Searching...
No Matches
skins.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef GAME_CLIENT_COMPONENTS_SKINS_H
4#define GAME_CLIENT_COMPONENTS_SKINS_H
5
6#include <base/lock.h>
7
10
12#include <game/client/skin.h>
13
14#include <chrono>
15#include <list>
16#include <optional>
17#include <set>
18#include <string_view>
19#include <unordered_map>
20#include <utility>
21
22class CHttpRequest;
23
24class CSkins : public CComponent
25{
26private:
38
43 {
44 public:
45 CAbstractSkinLoadJob(CSkins *pSkins, const char *pName);
46 ~CAbstractSkinLoadJob() override;
47
49 bool m_NotFound = false;
50
51 protected:
54 };
55
56public:
61 {
62 friend class CSkins;
63
64 public:
65 enum class EType
66 {
75 };
76
105
106 CSkinContainer(CSkinContainer &&Other) = default;
107 CSkinContainer(CSkins *pSkins, const char *pName, EType Type, int StorageType);
109
110 bool operator<(const CSkinContainer &Other) const;
112
113 const char *Name() const { return m_aName; }
114 EType Type() const { return m_Type; }
115 int StorageType() const { return m_StorageType; }
116 bool IsVanilla() const { return m_Vanilla; }
117 bool IsSpecial() const { return m_Special; }
118 bool IsAlwaysLoaded() const { return m_AlwaysLoaded; }
119 EState State() const { return m_State; }
120 const std::unique_ptr<CSkin> &Skin() const { return m_pSkin; }
121
125 void RequestLoad();
126
127 private:
135
137 std::unique_ptr<CSkin> m_pSkin = nullptr;
138 std::shared_ptr<CAbstractSkinLoadJob> m_pLoadJob = nullptr;
139
143 std::optional<std::chrono::nanoseconds> m_FirstLoadRequest;
147 std::optional<std::chrono::nanoseconds> m_LastLoadRequest;
151 std::optional<std::list<std::string_view>::iterator> m_UsageEntryIterator;
152
154 void SetState(EState State);
155 };
156
161 {
162 public:
164 m_pSkinContainer(nullptr),
165 m_Favorite(false) {}
166 CSkinListEntry(CSkinContainer *pSkinContainer, bool Favorite, bool SelectedMain, bool SelectedDummy, std::optional<std::pair<int, int>> NameMatch) :
167 m_pSkinContainer(pSkinContainer),
168 m_Favorite(Favorite),
169 m_SelectedMain(SelectedMain),
170 m_SelectedDummy(SelectedDummy),
172
173 bool operator<(const CSkinListEntry &Other) const;
174
176 bool IsFavorite() const { return m_Favorite; }
177 bool IsSelectedMain() const { return m_SelectedMain; }
178 bool IsSelectedDummy() const { return m_SelectedDummy; }
179 const std::optional<std::pair<int, int>> &NameMatch() const { return m_NameMatch; }
180
181 const void *ListItemId() const { return &m_ListItemId; }
182 const void *FavoriteButtonId() const { return &m_FavoriteButtonId; }
183 const void *ErrorTooltipId() const { return &m_ErrorTooltipId; }
184
188 void RequestLoad();
189
190 private:
195 std::optional<std::pair<int, int>> m_NameMatch;
199 };
200
202 {
203 friend class CSkins;
204
205 public:
206 std::vector<CSkinListEntry> &Skins() { return m_vSkins; }
207 int UnfilteredCount() const { return m_UnfilteredCount; }
208 void ForceRefresh() { m_NeedsUpdate = true; }
209
210 private:
211 std::vector<CSkinListEntry> m_vSkins;
213 bool m_NeedsUpdate = true;
214 };
215
217 {
218 public:
219 size_t m_NumUnloaded = 0;
220 size_t m_NumPending = 0;
221 size_t m_NumLoading = 0;
222 size_t m_NumLoaded = 0;
223 size_t m_NumError = 0;
224 size_t m_NumNotFound = 0;
225 };
226
227 CSkins();
228
229 typedef std::function<void()> TSkinLoadedCallback;
230
231 int Sizeof() const override { return sizeof(*this); }
232 void OnConsoleInit() override;
233 void OnInit() override;
234 void OnShutdown() override;
235 void OnUpdate() override;
236
237 void RefreshEventSkins();
238 void Refresh(TSkinLoadedCallback &&SkinLoadedCallback);
239 CSkinLoadingStats LoadingStats() const;
240 CSkinList &SkinList();
241
242 const CSkinContainer *FindContainerOrNullptr(const char *pName);
243 const CSkin *FindOrNullptr(const char *pName);
244 const CSkin *Find(const char *pName);
245
246 void AddFavorite(const char *pName);
247 void RemoveFavorite(const char *pName);
248 bool IsFavorite(const char *pName) const;
249
250 void RandomizeSkin(int Dummy);
251
252 const char *SkinPrefix() const;
253
254 static bool IsSpecialSkin(const char *pName);
255
256private:
257 static bool IsVanillaSkin(const char *pName);
258
264 constexpr static const char *VANILLA_SKINS[] = {"bluekitty", "bluestripe", "brownbear",
265 "cammo", "cammostripes", "coala", "default", "limekitty",
266 "pinky", "redbopp", "redstripe", "saddo", "toptri",
267 "twinbop", "twintri", "warpaint", "x_ninja", "x_spec"};
268
270 {
271 public:
272 CSkinLoadJob(CSkins *pSkins, const char *pName, int StorageType);
273
274 protected:
275 void Run() override;
276
277 private:
279 };
280
282 {
283 public:
284 CSkinDownloadJob(CSkins *pSkins, const char *pName);
285
286 bool Abort() override REQUIRES(!m_Lock);
287
288 protected:
289 void Run() override REQUIRES(!m_Lock);
290
291 private:
293 std::shared_ptr<CHttpRequest> m_pGetRequest GUARDED_BY(m_Lock);
294 };
295
296 std::unordered_map<std::string_view, std::unique_ptr<CSkinContainer>> m_Skins;
297 std::optional<std::chrono::nanoseconds> m_ContainerUpdateTime;
302 std::list<std::string_view> m_SkinsUsageList;
303
305 std::set<std::string> m_Favorites;
306
309
310 bool LoadSkinData(const char *pName, CSkinLoadData &Data) const;
311 void LoadSkinFinish(CSkinContainer *pSkinContainer, const CSkinLoadData &Data);
312 void LoadSkinDirect(const char *pName);
313 const CSkinContainer *FindContainerImpl(const char *pName);
314 static int SkinScan(const char *pName, int IsDir, int StorageType, void *pUser);
315
318 void UpdateFinishLoading(CSkinLoadingStats &Stats, std::chrono::nanoseconds StartTime, std::chrono::nanoseconds MaxTime);
319
320 static void ConAddFavoriteSkin(IConsole::IResult *pResult, void *pUserData);
321 static void ConRemFavoriteSkin(IConsole::IResult *pResult, void *pUserData);
322 static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData);
323 void OnConfigSave(IConfigManager *pConfigManager);
324 static void ConchainRefreshSkinList(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
325};
326#endif
Definition component.h:165
Definition http.h:54
Definition image.h:12
Definition lock.h:90
Definition skin.h:79
Definition skin.h:11
char m_aName[MAX_SKIN_LENGTH]
Definition skins.h:53
bool m_NotFound
Definition skins.h:49
CSkins * m_pSkins
Definition skins.h:52
~CAbstractSkinLoadJob() override
Definition skins.cpp:31
CAbstractSkinLoadJob(CSkins *pSkins, const char *pName)
Definition skins.cpp:24
CSkinLoadData m_Data
Definition skins.h:48
Definition skins.h:61
EState State() const
Definition skins.h:119
EType m_Type
Definition skins.h:130
bool m_AlwaysLoaded
Definition skins.h:134
std::shared_ptr< CAbstractSkinLoadJob > m_pLoadJob
Definition skins.h:138
CSkins * m_pSkins
Definition skins.h:128
EState m_State
Definition skins.h:136
bool IsVanilla() const
Definition skins.h:116
EType Type() const
Definition skins.h:114
~CSkinContainer()
Definition skins.cpp:54
bool operator<(const CSkinContainer &Other) const
Definition skins.cpp:62
bool m_Special
Definition skins.h:133
char m_aName[MAX_SKIN_LENGTH]
Definition skins.h:129
int StorageType() const
Definition skins.h:115
EState
Definition skins.h:78
@ UNLOADED
Definition skins.h:82
@ NOT_FOUND
Definition skins.h:103
@ LOADED
Definition skins.h:95
@ ERROR
Definition skins.h:99
@ PENDING
Definition skins.h:87
@ LOADING
Definition skins.h:91
bool IsSpecial() const
Definition skins.h:117
bool m_Vanilla
Definition skins.h:132
friend class CSkins
Definition skins.h:62
void SetState(EState State)
Definition skins.cpp:136
void RequestLoad()
Definition skins.cpp:74
EState DetermineInitialState() const
Definition skins.cpp:117
std::optional< std::chrono::nanoseconds > m_FirstLoadRequest
Definition skins.h:143
const char * Name() const
Definition skins.h:113
EType
Definition skins.h:66
@ LOCAL
Definition skins.h:70
@ DOWNLOAD
Definition skins.h:74
std::unique_ptr< CSkin > m_pSkin
Definition skins.h:137
std::optional< std::chrono::nanoseconds > m_LastLoadRequest
Definition skins.h:147
CSkinContainer & operator=(CSkinContainer &&Other)=default
bool IsAlwaysLoaded() const
Definition skins.h:118
std::optional< std::list< std::string_view >::iterator > m_UsageEntryIterator
Definition skins.h:151
CSkinContainer(CSkinContainer &&Other)=default
const std::unique_ptr< CSkin > & Skin() const
Definition skins.h:120
int m_StorageType
Definition skins.h:131
std::shared_ptr< CHttpRequest > m_pGetRequest GUARDED_BY(m_Lock)
void Run() override REQUIRES(!m_Lock)
Definition skins.cpp:991
CSkinDownloadJob(CSkins *pSkins, const char *pName)
Definition skins.cpp:970
bool Abort() override REQUIRES(!m_Lock)
Definition skins.cpp:975
CLock m_Lock
Definition skins.h:292
Definition skins.h:161
const std::optional< std::pair< int, int > > & NameMatch() const
Definition skins.h:179
CSkinContainer * m_pSkinContainer
Definition skins.h:191
bool operator<(const CSkinListEntry &Other) const
Definition skins.cpp:163
char m_ListItemId
Definition skins.h:196
const void * ErrorTooltipId() const
Definition skins.h:183
bool m_SelectedMain
Definition skins.h:193
CSkinListEntry()
Definition skins.h:163
bool IsFavorite() const
Definition skins.h:176
bool m_SelectedDummy
Definition skins.h:194
std::optional< std::pair< int, int > > m_NameMatch
Definition skins.h:195
CSkinListEntry(CSkinContainer *pSkinContainer, bool Favorite, bool SelectedMain, bool SelectedDummy, std::optional< std::pair< int, int > > NameMatch)
Definition skins.h:166
bool IsSelectedMain() const
Definition skins.h:177
bool IsSelectedDummy() const
Definition skins.h:178
const CSkinContainer * SkinContainer() const
Definition skins.h:175
const void * ListItemId() const
Definition skins.h:181
char m_FavoriteButtonId
Definition skins.h:197
char m_ErrorTooltipId
Definition skins.h:198
const void * FavoriteButtonId() const
Definition skins.h:182
bool m_Favorite
Definition skins.h:192
void RequestLoad()
Definition skins.cpp:176
Definition skins.h:202
void ForceRefresh()
Definition skins.h:208
int m_UnfilteredCount
Definition skins.h:212
friend class CSkins
Definition skins.h:203
std::vector< CSkinListEntry > & Skins()
Definition skins.h:206
std::vector< CSkinListEntry > m_vSkins
Definition skins.h:211
int UnfilteredCount() const
Definition skins.h:207
bool m_NeedsUpdate
Definition skins.h:213
Definition skins.h:31
CSkin::CSkinMetrics m_Metrics
Definition skins.h:35
CImageInfo m_Info
Definition skins.h:33
CImageInfo m_InfoGrayscale
Definition skins.h:34
ColorRGBA m_BloodColor
Definition skins.h:36
CSkinLoadJob(CSkins *pSkins, const char *pName, int StorageType)
Definition skins.cpp:37
void Run() override
Definition skins.cpp:952
int m_StorageType
Definition skins.h:278
Definition skins.h:217
size_t m_NumUnloaded
Definition skins.h:219
size_t m_NumLoading
Definition skins.h:221
size_t m_NumError
Definition skins.h:223
size_t m_NumNotFound
Definition skins.h:224
size_t m_NumPending
Definition skins.h:220
size_t m_NumLoaded
Definition skins.h:222
std::set< std::string > m_Favorites
Definition skins.h:305
bool IsFavorite(const char *pName) const
Definition skins.cpp:881
void UpdateStartLoading(CSkinLoadingStats &Stats)
Definition skins.cpp:590
static void ConchainRefreshSkinList(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
Definition skins.cpp:1131
char m_aEventSkinPrefix[MAX_SKIN_LENGTH]
Definition skins.h:308
const CSkin * FindOrNullptr(const char *pName)
Definition skins.cpp:845
static bool IsVanillaSkin(const char *pName)
Definition skins.cpp:206
void OnUpdate() override
Definition skins.cpp:517
std::unordered_map< std::string_view, std::unique_ptr< CSkinContainer > > m_Skins
Definition skins.h:296
std::optional< std::chrono::nanoseconds > m_ContainerUpdateTime
Definition skins.h:297
void UpdateUnloadSkins(CSkinLoadingStats &Stats)
Definition skins.cpp:543
CSkin m_PlaceholderSkin
Definition skins.h:307
void OnShutdown() override
Definition skins.cpp:505
const CSkinContainer * FindContainerOrNullptr(const char *pName)
Definition skins.cpp:809
CSkins()
Definition skins.cpp:181
void RemoveFavorite(const char *pName)
Definition skins.cpp:871
CSkinList & SkinList()
Definition skins.cpp:736
int Sizeof() const override
Definition skins.h:231
void OnInit() override
Definition skins.cpp:495
static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData)
Definition skins.cpp:1115
std::function< void()> TSkinLoadedCallback
Definition skins.h:229
CSkinLoadingStats LoadingStats() const
Definition skins.cpp:706
void RandomizeSkin(int Dummy)
Definition skins.cpp:886
void UpdateFinishLoading(CSkinLoadingStats &Stats, std::chrono::nanoseconds StartTime, std::chrono::nanoseconds MaxTime)
Definition skins.cpp:620
void LoadSkinFinish(CSkinContainer *pSkinContainer, const CSkinLoadData &Data)
Definition skins.cpp:413
static void ConRemFavoriteSkin(IConsole::IResult *pResult, void *pUserData)
Definition skins.cpp:1109
static bool IsSpecialSkin(const char *pName)
Definition skins.cpp:201
static void ConAddFavoriteSkin(IConsole::IResult *pResult, void *pUserData)
Definition skins.cpp:1103
static constexpr const char * VANILLA_SKINS[]
Definition skins.h:264
CSkinList m_SkinList
Definition skins.h:304
bool LoadSkinData(const char *pName, CSkinLoadData &Data) const
Definition skins.cpp:288
const CSkin * Find(const char *pName)
Definition skins.cpp:795
void OnConsoleInit() override
Definition skins.cpp:485
const char * SkinPrefix() const
Definition skins.cpp:939
void OnConfigSave(IConfigManager *pConfigManager)
Definition skins.cpp:1121
std::list< std::string_view > m_SkinsUsageList
Definition skins.h:302
void AddFavorite(const char *pName)
Definition skins.cpp:855
void RefreshEventSkins()
Definition skins.cpp:667
void Refresh(TSkinLoadedCallback &&SkinLoadedCallback)
Definition skins.cpp:680
void LoadSkinDirect(const char *pName)
Definition skins.cpp:453
static int SkinScan(const char *pName, int IsDir, int StorageType, void *pUser)
Definition skins.cpp:220
const CSkinContainer * FindContainerImpl(const char *pName)
Definition skins.cpp:826
Definition color.h:182
Definition config.h:9
Definition console.h:64
void(* FCommandCallback)(IResult *pResult, void *pUserData)
Definition console.h:102
IJob()
Definition jobs.cpp:7
@ MAX_SKIN_LENGTH
Definition protocol.h:101
#define REQUIRES(...)
Definition lock.h:34