openclonk/src/network/C4Network2Dialogs.h

281 lines
7.8 KiB
C++

/*
* OpenClonk, http://www.openclonk.org
*
* Copyright (c) 2004-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.
*/
// dialogs for network information
#ifndef INC_C4Network2Dialogs
#define INC_C4Network2Dialogs
#include "gui/C4Gui.h"
#include "landscape/C4Scenario.h"
#include "network/C4Network2Res.h"
class C4Graph;
// dialog showing info about a connected client
class C4Network2ClientDlg : public C4GUI::InfoDialog
{
protected:
int iClientID; // ID of client info is shown about
protected:
void UpdateText() override; // compose message text
virtual int GetUpdateInterval() { return 500; } // update every 0.5 seconds
const char *GetID() override { return "ClientDialog"; }
public:
C4Network2ClientDlg(int iForClientID); // ctor
};
// resource dialog: created as listbox inside another dialog
class C4Network2ResDlg : public C4GUI::ListBox, private C4ApplicationSec1Timer
{
public:
enum { IconLabelSpacing = 2 }; // space between an icon and its text
private:
class ListItem : public C4GUI::Window
{
private:
// subcomponents
C4GUI::Icon *pFileIcon; // icon indicating file type
C4GUI::Label *pLabel; // label indicating file name
C4GUI::Label *pProgress; // label indicating file progress
C4GUI::IconButton *pSaveBtn; // file save button
int iResID, iProgress;
void LocalSaveResource(bool fDoOverwrite); // called by OnButtonSave*: queried local saving of resource
public:
ListItem(class C4Network2ResDlg *pForResDlg, const class C4Network2Res *pByRes); // ctor
void Update(const class C4Network2Res *pByRes); // update data
int GetResID() const { return iResID; }
bool IsSavePossible();
C4GUI::ContextMenu *OnContext(C4GUI::Element *pListItem, int iX, int iY); // open context menu
void OnButtonSave(C4GUI::Control *pButton); // queried resource save
void OnButtonSaveConfirm(C4GUI::Element *pNull); // confirmed file overwrite
C4Network2Res::Ref GetRefRes(); // get associated resource
};
public:
C4Network2ResDlg(const C4Rect &rcBounds, bool fActive);
~C4Network2ResDlg() override { Deactivate(); }
// enable/disable updates by timer calls
void Activate(); void Deactivate();
// update by resources
void OnSec1Timer() override { Update(); }
void Update();
};
// client list dialog: created as listbox inside another dialog
class C4Network2ClientListBox : public C4GUI::ListBox, private C4ApplicationSec1Timer
{
public:
enum {
IconLabelSpacing = 2,
SoundIconShowTime = 1 // seconds. min time a sound icon is shown}; // space between an icon and its text
};
private:
class ListItem : public C4GUI::Window
{
protected:
int32_t iClientID;
C4Network2ClientListBox *pForDlg;
public:
ListItem(class C4Network2ClientListBox *pForDlg, int32_t iClientID) // ctor
: iClientID(iClientID), pForDlg(pForDlg) {}
virtual void Update() = 0;
int32_t GetClientID() const { return iClientID; }
virtual int32_t GetConnectionID() const { return -1; }
};
class ClientListItem : public ListItem
{
private:
// subcomponents
C4GUI::Icon *pStatusIcon; // client network status
C4GUI::Label *pName; // client name
C4GUI::Label *pPing; // client control ping
C4GUI::IconButton *pActivateBtn, *pKickBtn; // buttons for host
bool fShownActive;
time_t last_sound_time; // now() when the client last issued a sound (display as sound icon). 0 for no sound.
public:
ClientListItem(class C4Network2ClientListBox *pForDlg, int iClientID); // ctor
void Update() override; // update data
const C4Client *GetClient() const; // get client by associated ID
void OnButtonActivate(C4GUI::Control *pButton);
void OnButtonKick(C4GUI::Control *pButton);
void SetSoundIcon();
};
class ConnectionListItem : public ListItem
{
private:
int32_t iConnID; // connection ID
// subcomponents
C4GUI::Label *pDesc; // connection description
C4GUI::Label *pPing; // connection ping
C4GUI::IconButton *pReconnectBtn, *pDisconnectBtn; // buttons to restore/destroy connection
public:
ConnectionListItem(class C4Network2ClientListBox *pForDlg, int32_t iClientID, int32_t iConnectionID); // ctor
void Update() override; // update data
C4Network2IOConnection *GetConnection() const; // get connection by connection ID
int32_t GetConnectionID() const override { return iConnID; }
void OnButtonReconnect(C4GUI::Control *pButton);
void OnButtonDisconnect(C4GUI::Control *pButton);
};
private:
bool fStartup;
ClientListItem *GetClientListItem(int32_t iForClientID);
public:
C4Network2ClientListBox(C4Rect &rcBounds, bool fStartup);
~C4Network2ClientListBox() override;
// update by client list
void OnSec1Timer() override { Update(); }
void Update();
bool IsStartup() { return fStartup; }
void SetClientSoundIcon(int32_t client_id);
};
// dialog framing the C4Network2ClientListBox and a game option list and a status label
class C4Network2ClientListDlg : public C4GUI::Dialog, private C4ApplicationSec1Timer
{
private:
class C4GameOptionsList *pGameOptions;
C4GUI::Label *pStatusLabel;
C4Network2ClientListBox *pListBox;
static C4Network2ClientListDlg *pInstance; // singleton-instance
const char *GetID() override { return "ClientListDialog"; }
public:
C4Network2ClientListDlg();
~C4Network2ClientListDlg() override;
void OnSec1Timer() override { Update(); }
void Update();
void OnSound(class C4Client *singer); // mark the specified client
static bool Toggle(); // toggle dlg on/off
static C4Network2ClientListDlg *GetInstance() { return pInstance; }
};
// host dialog shown at initial wait
class C4Network2StartWaitDlg : public C4GUI::Dialog
{
private:
C4Network2ClientListBox *pClientListBox{nullptr};
enum { DialogWidth = 250, DialogHeight = 300 };
protected:
const char *GetID() override { return "NetStartWaitDialog"; }
public:
C4Network2StartWaitDlg();
~C4Network2StartWaitDlg() override = default;
};
// button area for some game options during lobby and scenario selection time
class C4GameOptionButtons : public C4GUI::Window
{
private:
C4GUI::IconButton *btnInternet, *btnLeague, *btnPassword, *btnComment, *btnRecord;
bool fNetwork, fHost, fLobby, fCountdown;
public:
C4GameOptionButtons(const C4Rect &rcBounds, bool fNetwork, bool fHost, bool fLobby);
~C4GameOptionButtons() override = default;
void SetCountdown(bool fToVal);
protected:
void OnBtnInternet(C4GUI::Control *btn);
void OnBtnLeague(C4GUI::Control *btn);
void OnBtnRecord(C4GUI::Control *btn);
void OnBtnPassword(C4GUI::Control *btn);
void OnPasswordSet(const StdStrBuf &rsNewPassword);
void OnBtnComment(C4GUI::Control *btn);
void OnCommentSet(const StdStrBuf &rsNewComment);
public:
void UpdatePasswordBtn();
};
// graph display component
class C4Chart : public C4GUI::Element
{
protected:
const C4Graph *pDisplayGraph;
bool fOwnGraph;
void DrawElement(C4TargetFacet &cgo) override; // draw the chart
public:
C4Chart(C4Rect &rcBounds);
~C4Chart() override;
void SetGraph(const C4Graph *pNewGraph, bool fOwn) { pDisplayGraph = pNewGraph; fOwnGraph = fOwn; }
};
// C4Chart framing dialog
class C4ChartDialog : public C4GUI::Dialog
{
private:
C4GUI::Tabular *pChartTabular{nullptr};
// singleton-stuff
static C4ChartDialog *pChartDlg;
enum { DialogWidth = 400, DialogHeight = 300 };
void AddChart(const StdStrBuf &rszName);
protected:
const char *GetID() override { return "ChartDialog"; }
public:
C4ChartDialog();
// singleton-stuff
~C4ChartDialog() override { if (pChartDlg==this) pChartDlg = nullptr; }
static void Toggle();
};
#endif // INC_C4Network2Dialogs