33 #include <sys/socket.h>
34 #include <netinet/in.h>
35 #include <arpa/inet.h>
42 :
C4GUI::InfoDialog(
LoadResStr(
"IDS_NET_CLIENT_INFO"), 10), iClientID(iForClientID)
78 for (
int i=0; i<
iCnt; ++i)
118 : ListItem(pForDlg, iClientID), pStatusIcon(nullptr), pName(nullptr), pPing(nullptr), pActivateBtn(nullptr), pKickBtn(nullptr), last_sound_time(0)
121 const C4Client *pClient = GetClient();
124 if (pForDlg->
IsStartup()) iIconSize *= 2;
126 int iVerticalIndent = 2;
130 bool fIsHost = pClient && pClient->
isHost();
142 sNameLabel.
Ref(
"???");
152 pActivateBtn =
new C4GUI::CallbackButtonEx<C4Network2ClientListBox::ClientListItem, C4GUI::IconButton>(
C4GUI::Ico_Active,
GetToprightCornerRect(std::max(iIconSize, 16),std::max(iIconSize, 16),2,1,1), 0,
this, &ClientListItem::OnButtonActivate);
155 pKickBtn =
new C4GUI::CallbackButtonEx<C4Network2ClientListBox::ClientListItem, C4GUI::IconButton>(
C4GUI::Ico_Kick,
GetToprightCornerRect(std::max(iIconSize, 16),std::max(iIconSize, 16),2,1,0), 0,
this, &ClientListItem::OnButtonKick);
162 pPing->SetToolTip(
LoadResStr(
"IDS_DESC_CONTROLWAITTIME"));
175 void C4Network2ClientListBox::ClientListItem::Update()
182 pPing->SetColor(
C4RGB(
184 Clamp(255-iWait*5, 0, 255),
185 Clamp(255+iWait*5, 0, 255)));
188 const C4Client *pClient = GetClient();
if (!pClient)
return;
190 if (fIsActive != fShownActive)
192 fShownActive = fIsActive;
197 pActivateBtn->SetToolTip(
LoadResStrNoAmp(fIsActive ?
"IDS_NET_DEACTIVATECLIENT" :
"IDS_NET_ACTIVATECLIENT"));
202 pName->SetToolTip(sCltPlrs.getData());
233 time_t dt = time(
nullptr) - last_sound_time;
234 if (dt >= SoundIconShowTime)
255 pStatusIcon->SetIcon(icoStatus);
258 const C4Client *C4Network2ClientListBox::ClientListItem::GetClient()
const
263 C4Network2ClientListBox::ClientListItem *C4Network2ClientListBox::GetClientListItem(int32_t client_id)
270 ListItem *list_item2 =
static_cast<ListItem *
>(list_item);
271 if (list_item2->GetClientID() == client_id)
272 if (list_item2->GetConnectionID() == -1)
273 return static_cast<ClientListItem *
>(list_item2);
279 void C4Network2ClientListBox::ClientListItem::OnButtonActivate(
C4GUI::Control *pButton)
291 void C4Network2ClientListBox::ClientListItem::OnButtonKick(
C4GUI::Control *pButton)
301 void C4Network2ClientListBox::ClientListItem::SetSoundIcon()
304 last_sound_time = time(
nullptr);
313 C4Network2ClientListBox::ConnectionListItem::ConnectionListItem(
class C4Network2ClientListBox *pForDlg, int32_t iClientID, int32_t iConnectionID)
314 : ListItem(pForDlg, iClientID), iConnID(iConnectionID), pDesc(nullptr), pPing(nullptr), pDisconnectBtn(nullptr)
320 int iVerticalIndent = 2;
324 ca.ExpandLeft(-iIconSize*2);
330 pDisconnectBtn->SetToolTip(
LoadResStr(
"IDS_MENU_DISCONNECT"));
333 int32_t sx=40, sy=iIconSize;
336 pPing->SetToolTip(
LoadResStr(
"IDS_NET_CONTROL_PING"));
342 if (pDisconnectBtn)
AddElement(pDisconnectBtn);
353 if (!pNetClient)
return nullptr;
354 if (iConnID == 0)
return pNetClient->
getDataConn();
355 if (iConnID == 1)
return pNetClient->
getMsgConn();
359 void C4Network2ClientListBox::ConnectionListItem::Update()
365 pDesc->SetText(
"???");
366 pPing->SetText(
"???");
370 int iPing = pConn->
getLag();
374 const char *szConnType;
377 szConnType =
"Data/Msg";
390 void C4Network2ClientListBox::ConnectionListItem::OnButtonDisconnect(
C4GUI::Control *pButton)
400 void C4Network2ClientListBox::ConnectionListItem::OnButtonReconnect(
C4GUI::Control *pButton)
432 while (pItem && (pItem->GetClientID() < pClient->
getID()))
434 pNext =
static_cast<ListItem *
>(pItem->GetNext());
435 delete pItem; pItem =
pNext;
439 if (pItem && pItem->GetClientID() == pClient->
getID())
442 pItem =
static_cast<ListItem *
>(pItem->GetNext());
452 if (!pNetClient)
continue;
454 for (
int i = 0; i<2; ++i)
457 if (!pConn)
continue;
458 if (pConn == pLastConn)
continue;
461 while (pItem && ((pItem->GetClientID() < pClient->
getID()) || ((pItem->GetClientID() == pClient->
getID()) && (pItem->GetConnectionID() < i))))
463 pNext =
static_cast<ListItem *
>(pItem->GetNext());
464 delete pItem; pItem =
pNext;
467 if (pItem && pItem->GetClientID() == pClient->
getID() && pItem->GetConnectionID() == i)
470 pItem =
static_cast<ListItem *
>(pItem->GetNext());
482 pNext =
static_cast<ListItem *
>(pItem->GetNext());
483 delete pItem; pItem =
pNext;
490 ClientListItem *item = GetClientListItem(client_id);
491 if (item) item->SetSoundIcon();
502 : Dialog(::
pGUI->GetPreferredDlgRect().Wdt*3/4, ::
pGUI->GetPreferredDlgRect().Hgt*3/4,
LoadResStr(
"IDS_NET_CAPTION"), false)
528 if (
this==pInstance) pInstance=
nullptr;
536 sStatusText.
Format(
"Tick %d, Behind %d, Rate %d, PreSend %d, ACT: %d",
547 if (pInstance) { pInstance->
Close(
true);
return true; }
562 :
C4GUI::Dialog(DialogWidth, DialogHeight,
LoadResStr(
"IDS_NET_CAPTION"), false)
582 :
C4GUI::Window(), fNetwork(fNetwork),
fHost(
fHost), fLobby(fLobby), fCountdown(false)
586 int32_t iButtonCount = fNetwork ?
fHost ? 6 : 3 : 2;
588 if ((iIconSize+iIconSpacing*2)*iButtonCount >
rcBounds.
Wdt)
592 iIconSpacing = std::max<int32_t>(0, (
rcBounds.
Wdt-iIconSize*iButtonCount)/(iButtonCount*2)-1);
603 if (fNetwork &&
fHost)
616 else btnInternet =
nullptr;
617 bool fIsLeague =
false;
628 else btnLeague=
nullptr;
629 if (fNetwork &&
fHost)
636 else btnPassword=btnComment=
nullptr;
644 if (!fNetwork || !fHost)
return;
672 if (!fNetwork || !fHost)
return;
692 if (!fNetwork || !fHost)
return;
717 bool fHasPassword = (szPass && *szPass);
730 bool fHasPassword = szPass && *szPass;
768 while (iVal) { iVal/=10; iDec*=10; }
776 if (iDec == 1)
return 1;
777 int iNextStepDivider = 2;
778 while (iDec>=iNextStepDivider && iNextStepDivider*iRange/iDec <= iMaxSteps)
780 iDec/=iNextStepDivider;
781 iNextStepDivider = 7 - iNextStepDivider;
793 if (!iSeriesCount)
return;
794 assert(iSeriesCount>0);
802 const int AxisArrowLen = 6,
804 AxisArrowThickness = 3,
806 int32_t YAxisMinStepHgt, XAxisMinStepWdt;
810 if (iMinTime >= iMaxTime)
return;
813 if (iMinVal == iMaxVal) ++iMaxVal;
814 if (iMinVal > 0 && iMaxVal/iMinVal >= 2) iMinVal = 0;
815 else if (iMaxVal < 0 && iMinVal/iMaxVal >= 2) iMaxVal = 0;
818 iMaxVal = ((iMaxVal-(iMaxVal>0))/ddv+(iMaxVal>0))*ddv;
820 iMinVal = ((iMinVal-(iMinVal<0))/ddv+(iMinVal<0))*ddv;
821 ValueType dv=iMaxVal-iMinVal; TimeType dt=iMaxTime-iMinTime;
823 sbuf.
Format(
"-%d", (
int) std::max(
Abs(iMaxVal),
Abs(iMinVal)));
825 YAxisWdt += XAxisMinStepWdt; XAxisHgt += YAxisMinStepHgt;
826 XAxisMinStepWdt += 2; YAxisMinStepHgt += 2;
832 if (iSeriesCount > 1)
834 int iSeries = 0;
const C4Graph *pSeries;
835 int32_t iLegendWdt = 0, Q,W;
839 iLegendWdt = std::max(iLegendWdt, W);
843 int iYLegendDraw = (th - iSeriesCount*Q)/2 + ty;
851 if (tw < 10 || th < 10)
return;
859 tw -= AxisArrowLen + AxisArrowIndent;
860 th -= AxisArrowLen + AxisArrowIndent; ty += AxisArrowLen + AxisArrowIndent;
864 int iX, iY, iTime, iVal;
866 iTime = ((iMinTime-(iMinTime>0))/iXAxisSteps+(iMinTime>0))*iXAxisSteps;
867 for (; iTime <= iMaxTime; iTime += iXAxisSteps)
869 iX = tx + tw * (iTime-iMinTime) / dt;
871 sbuf.
Format(
"%d", (
int) iTime);
874 iVal = int( ((iMinVal-(iMinVal>0))/iYAxisSteps+(iMinVal>0))*iYAxisSteps );
875 for (; iVal <= iMaxVal; iVal += iYAxisSteps)
877 iY = ty+th - int((iVal-iMinVal) / dv * th);
879 sbuf.
Format(
"%d", (
int) iVal);
886 int iThisMinTime = std::max(iMinTime, pSeries->GetStartTime());
887 int iThisMaxTime = std::min(iMaxTime, pSeries->GetEndTime());
888 bool fAnyVal =
false;
889 for (iX = 0; iX<tw; ++iX)
891 iTime = iMinTime + dt*iX/tw;
892 if (!
Inside(iTime, iThisMinTime, iThisMaxTime))
continue;
893 int iY2 = int((-pSeries->GetValue(iTime) + iMinVal) * th / dv) + ty+th;
894 if (fAnyVal)
pDraw->
DrawLineDw(cgo.
Surface, (
float) (tx+iX-1), (
float) iY, (
float) (tx+iX), (
float) iY2, pSeries->GetColorDw() | 0xff000000);
933 void C4ChartDialog::AddChart(
const StdStrBuf &rszName)
937 bool fOwnGraph =
false;
942 if (!pSheet) {
if (fOwnGraph)
delete pGraph;
return; }
945 pNewChart->
SetGraph(pGraph, fOwnGraph);
952 if (pChartDlg) { pChartDlg->
Close(
false);
return; }
C4Application Application
C4GraphicsResource GraphicsResource
#define C4GUI_ButtonAreaHgt
#define C4GUI_DefDlgIndent
#define C4GUI_DefButtonWdt
const char * LoadResStrNoAmp(const char *id)
const char * LoadResStr(const char *id)
bool Log(const char *szMessage)
int GetValueDecade(int iVal)
int GetAxisStepRange(int iRange, int iMaxSteps)
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
T Clamp(T bval, T lbound, T rbound)
bool Inside(T ival, U lbound, V rbound)
StdStrBuf FormatString(const char *szFmt,...)
const C4Graph * pDisplayGraph
C4Chart(C4Rect &rcBounds)
void SetGraph(const C4Graph *pNewGraph, bool fOwn)
void DrawElement(C4TargetFacet &cgo) override
const char * getNick() const
C4Network2Client * getNetClient() const
const char * getName() const
C4Client * getClient(const C4Client *pAfter=nullptr) const
C4Client * getClientByID(int32_t iID) const
void CtrlRemove(const C4Client *pClient, const char *szReason)
ValidatedStdCopyStrBuf< C4InVal::VAL_Comment > Comment
int32_t MasterServerSignUp
char LastPassword[CFG_MaxString+1]
int32_t LeagueServerSignUp
void DrawLineDw(C4Surface *sfcTarget, float x1, float y1, float x2, float y2, DWORD dwClr, float width=1.0f)
bool TextOut(const char *szText, CStdFont &rFont, float fZoom, C4Surface *sfcDest, float iTx, float iTy, DWORD dwFCol=0xffffffff, BYTE byForm=ALeft, bool fDoMarkup=true)
int32_t GetInnerHeight() const
bool GetFromLeft(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
bool GetCentered(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
void ExpandTop(int32_t iByHgt)
bool GetFromTop(int32_t iHgt, int32_t iWdt, C4Rect &rcOut)
void GetAll(C4Rect &rcOut)
bool GetFromBottom(int32_t iHgt, int32_t iWdt, C4Rect &rcOut)
void AddElement(Element *pChild)
C4Rect GetToprightCornerRect(int32_t iWidth=16, int32_t iHeight=16, int32_t iHIndent=4, int32_t iVIndent=4, int32_t iIndexX=0)
virtual Screen * GetScreen()
Element * GetNext() const
C4Rect GetContainedClientRect()
void SetBounds(const C4Rect &rcNewBound)
void AddLine(const char *szText)
void AddLineFmt(const char *szFmtString,...) GNUC_FORMAT_ATTRIBUTE_O
void SetText(const char *szToText, bool fAllowHotkey=true)
bool InsertElement(Element *pChild, Element *pInsertBefore, int32_t iIndent=0)
int32_t ContractToElementHeight()
bool AddElement(Element *pChild, int32_t iIndent=0)
ScrollWindow * pClientWindow
void SetDecoration(bool fDrawBG, ScrollBarFacets *pToGfx, bool fAutoScroll, bool fDrawBorder=false)
void SetSelectionDiabled(bool fToVal=true)
bool ShowRemoveDlg(Dialog *pDlg)
Sheet * AddSheet(const char *szTitle, int32_t icoTitle=Ico_None)
C4Rect & GetClientRect() override
C4GameControlNetwork Network
void DoInput(C4PacketType eCtrlType, C4ControlPacket *pPkt, C4ControlDeliveryType eDelivery)
int32_t ClientPerfStat(int32_t iClientID)
int32_t getAvgControlSendTime() const
int32_t getControlPreSend() const
int32_t GetBehind(int32_t iTick) const
bool ClientReady(int32_t iClientID, int32_t iTick)
std::unique_ptr< C4Network2Stats > pNetworkStatistics
C4PlayerInfoList & PlayerInfos
C4GameParameters & Parameters
virtual ValueType GetMinValue() const =0
const char * GetTitle() const
virtual TimeType GetStartTime() const =0
virtual void Update() const
virtual TimeType GetEndTime() const =0
virtual const C4Graph * GetSeries(int iIndex) const =0
virtual ValueType GetMaxValue() const =0
virtual int GetSeriesCount() const =0
StdStrBuf toString() const
void UpdateText() override
C4Network2ClientDlg(int iForClientID)
C4Network2IOConnection * getDataConn() const
C4Network2IOConnection * getMsgConn() const
C4Network2ClientStatus getStatus() const
const C4Network2Address & getAddr(int32_t i) const
int32_t getAddrCnt() const
C4Network2ClientListBox(C4Rect &rcBounds, bool fStartup)
~C4Network2ClientListBox() override
void SetClientSoundIcon(int32_t client_id)
C4Network2ClientListDlg()
void OnSound(class C4Client *singer)
~C4Network2ClientListDlg() override
C4Network2Client * GetClientByID(int32_t iID) const
bool LeagueSignupEnable()
const char * GetPassword() const
void InvalidateReference()
void Vote(C4ControlVoteType eType, bool fApprove=true, int32_t iData=0)
bool isPassworded() const
void SetPassword(const char *szToPassword)
void LeagueSignupDisable()
C4Network2ClientList Clients
C4NetIO * getNetClass() const
const C4NetIO::addr_t & getPeerAddr() const
int getPacketLoss() const
const char * getNetIOName(C4NetIO *pNetIO)
StdStrBuf GetActivePlayerNames(bool fCountInvisible, int32_t iAtClientID=-1) const
C4Player * GetAtClient(int iClient, int iIndex=0) const
void OnLeagueOptionChanged()
int GetLineHeight() const
bool GetTextExtent(const char *szText, int32_t &rsx, int32_t &rsy, bool fCheckMarkup=true)
void Remove(StdSchedulerProc *pProc)
void Add(StdSchedulerProc *pProc)
void AppendFormat(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
void Ref(const char *pnData)
const char * getData() const
void Append(const char *pnData, size_t iChars)
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
void GUISound(const char *szSound)
StdStrBuf ToString(int flags=0) const
void CopyValidated(const char *szFromVal)