1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-22 22:13:35 +02:00
vcmi/client/mainmenu/CHighScoreScreen.h
Ivan Savenko 9fbeacb688 Fix possible memory corruption in video player
Fixes two bugs, one was definitely happening, and 2nd one that is causing
undefined behavior and may work only in some std implementations

- VideoPlayer would attempt to access subtitles widget after VideoPlayer
itself was destroyed in onPlaybackFinished call
- std::function was destroyed from a function that is being called by
it. Replaced with 1-method interface to avoid usage of std::function in
this scenario
2024-12-07 15:37:03 +00:00

98 lines
2.4 KiB
C++

/*
* CHighScoreScreen.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#pragma once
#include "../widgets/IVideoHolder.h"
#include "../windows/CWindowObject.h"
#include "../../lib/gameState/HighScore.h"
#include "../../lib/gameState/GameStatistics.h"
class CButton;
class CLabel;
class CMultiLineLabel;
class CAnimImage;
class CTextInput;
class VideoWidgetBase;
class CFilledTexture;
class TransparentFilledRectangle;
class CHighScoreScreen : public CWindowObject
{
public:
enum HighScorePage { SCENARIO, CAMPAIGN };
private:
void addButtons();
void addHighScores();
void buttonCampaignClick();
void buttonScenarioClick();
void buttonResetClick();
void buttonExitClick();
void showPopupWindow(const Point & cursorPosition) override;
HighScorePage highscorepage;
std::shared_ptr<CPicture> background;
std::shared_ptr<CFilledTexture> backgroundAroundMenu;
std::vector<std::shared_ptr<CButton>> buttons;
std::vector<std::shared_ptr<CLabel>> texts;
std::vector<std::shared_ptr<CAnimImage>> images;
const int screenRows = 11;
int highlighted;
public:
CHighScoreScreen(HighScorePage highscorepage, int highlighted = -1);
};
class CHighScoreInput : public CWindowObject
{
std::shared_ptr<CMultiLineLabel> text;
std::shared_ptr<CButton> buttonOk;
std::shared_ptr<CButton> buttonCancel;
std::shared_ptr<CGStatusBar> statusBar;
std::shared_ptr<CTextInput> textInput;
std::function<void(std::string text)> ready;
void okay();
void abort();
public:
CHighScoreInput(std::string playerName, std::function<void(std::string text)> readyCB);
};
class CHighScoreInputScreen : public CWindowObject, public IVideoHolder
{
std::vector<std::shared_ptr<CLabel>> texts;
std::shared_ptr<CHighScoreInput> input;
std::shared_ptr<TransparentFilledRectangle> background;
std::shared_ptr<VideoWidgetBase> videoPlayer;
std::shared_ptr<CFilledTexture> backgroundAroundMenu;
std::shared_ptr<CButton> statisticButton;
bool won;
HighScoreCalculation calc;
StatisticDataSet stat;
void onVideoPlaybackFinished() override;
public:
CHighScoreInputScreen(bool won, HighScoreCalculation calc, const StatisticDataSet & statistic);
int addEntry(std::string text);
void clickPressed(const Point & cursorPosition) override;
void keyPressed(EShortcut key) override;
void show(Canvas & to) override;
};