openclonk/src/gui/C4GameOverDlg.h

97 lines
3.0 KiB
C++

/*
* OpenClonk, http://www.openclonk.org
*
* Copyright (c) 2008-2009, RedWolf Design GmbH, http://www.clonk.de/
* Copyright (c) 2009-2016, The OpenClonk Team and contributors
*
* Distributed under the terms of the ISC license; see accompanying file
* "COPYING" for details.
*
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
* See accompanying file "TRADEMARK" for details.
*
* To redistribute this file separately, substitute the full license texts
* for the above references.
*/
// game over dialog showing winners and losers
#ifndef INC_C4GameOverDlg
#define INC_C4GameOverDlg
#include "gui/C4Gui.h"
#include "control/C4RoundResults.h"
// horizontal display of goal symbols; filfilled goals marked
// maybe to be reused for a game goal dialog?
class C4GoalDisplay : public C4GUI::Window
{
private:
// element that draws one goal
class GoalPicture : public C4GUI::Window
{
private:
C4ID idGoal;
bool fFulfilled;
C4FacetSurface Picture;
public:
GoalPicture(const C4Rect &rcBounds, C4ID idGoal, bool fFulfilled);
protected:
void DrawElement(C4TargetFacet &cgo) override;
};
public:
C4GoalDisplay(const C4Rect &rcBounds) : C4GUI::Window() { SetBounds(rcBounds); }
~C4GoalDisplay() override = default;
void SetGoals(const C4IDList &rAllGoals, const C4IDList &rFulfilledGoals, int32_t iGoalSymbolHeight);
};
class C4GameOverDlg : public C4GUI::Dialog, private C4ApplicationSec1Timer
{
private:
static bool is_shown;
int32_t iPlrListCount;
class C4PlayerInfoListBox **ppPlayerLists;
C4GoalDisplay *pGoalDisplay;
C4GUI::Label *pNetResultLabel{nullptr}; // label showing league result, disconnect, etc.
C4GUI::Button *pBtnExit, *pBtnContinue;
bool fIsNetDone{false}; // set if league is evaluated and round results arrived
bool fIsQuitBtnVisible; // quit button available? set if not host or when fIsNetDone
bool fHasNextMissionButton{false}; // continue button replaced by "next mission"-button?
private:
void OnExitBtn(C4GUI::Control *btn); // callback: exit button pressed
void OnContinueBtn(C4GUI::Control *btn); // callback: continue button pressed
void Update();
void SetNetResult(const char *szResultString, C4RoundResults::NetResult eResultType, size_t iPendingStreamingData, bool fIsStreaming);
protected:
void OnShown() override;
void OnClosed(bool fOK) override;
bool OnEnter() override { if (fIsQuitBtnVisible) OnExitBtn(nullptr); return true; } // enter on non-button: Always quit
bool OnEscape() override { if (fIsQuitBtnVisible) UserClose(false); return true; } // escape ignored if still streaming
// true for dialogs that should span the whole screen
// not just the mouse-viewport
bool IsFreePlaceDialog() override { return true; }
// true for dialogs that receive full keyboard and mouse input even in shared mode
bool IsExclusiveDialog() override { return true; }
// sec1 timer
void OnSec1Timer() override { Update(); }
public:
C4GameOverDlg();
~C4GameOverDlg() override;
static bool IsShown() { return is_shown; }
};
#endif // INC_C4GameOverDlg