32 : pNetDlg(pNetDlg), pList(pForListBox), pRefClient(nullptr), pRef(nullptr), fError(false), eQueryType(NRQT_Unknown), iTimeout(0), iInfoIconCount(0), iSortOrder(0), fIsSmall(false), fIsCollapsed(false), fIsEnabled(true), fIsImportant(false)
37 rctIconLarge.
Set(0, 0, iHeight, iHeight);
38 int32_t iSmallIcon = iHeight * 2 / 3; rctIconSmall.
Set((iHeight - iSmallIcon)/2, (iHeight - iSmallIcon)/2, iSmallIcon, iSmallIcon);
48 int32_t iThisWdt = rcIconRect.
Wdt;
49 rcIconRect.
x = iThisWdt - iIconSize * (iInfoIconCount + 1);
50 rcIconRect.
Wdt = rcIconRect.
Hgt = iIconSize;
51 for (
auto & pInfoIcon : pInfoIcons)
54 rcIconRect.
x -= rcIconRect.
Wdt;
57 rcLabelBounds.
x = iHeight+3;
58 rcLabelBounds.
Hgt = iLineHgt;
62 rcLabelBounds.
y = 1+i*(iLineHgt+2);
63 rcLabelBounds.
Wdt = iThisWdt - rcLabelBounds.
x - 1;
64 if (!i) rcLabelBounds.
Wdt -= iLineHgt;
91 ParentClass::DrawElement(cgo);
101 delete pRefClient; pRefClient =
nullptr;
103 if (pRef) {
delete pRef; pRef =
nullptr; }
105 iTimeout = iRequestTimeout = 0;
110 InvalidateStatusIcons();
111 sRefClientAddress.
Clear();
113 fIsImportant =
false;
116 const char *C4StartupNetListEntry::GetQueryTypeName(QueryType eQueryType)
137 sRefClientAddress.
Copy(szAddress);
138 this->eQueryType = eQueryType;
140 if (!pRefClient->
Init() || !pRefClient->
SetServer(szAddress))
143 sInfoText[0].
Clear();
150 UpdateSmallState(); UpdateText();
162 bool C4StartupNetListEntry::QueryReferences()
180 if (iTimeout)
if (time(
nullptr) >= iTimeout)
201 if (fError)
return true;
203 if (!pRefClient)
return true;
207 if (time(
nullptr) >= iRequestTimeout)
210 pRefClient->
Cancel(
"Timeout");
218 if (!pRefClient || pRefClient->
isBusy())
248 for (
int i = 0; i < iNewRefCount; i++)
254 sInfoText[1].
Format(
LoadResStr(
"IDS_NET_INFOGAMES"), (
int) iNewRefCount, iPlayerCount);
286 if (pEntry->iSortOrder < sortOrder)
297 if (fIsCollapsed == fToCollapseValue)
return;
298 fIsCollapsed = fToCollapseValue;
302 void C4StartupNetListEntry::UpdateSmallState()
305 bool fNewIsSmall = !sInfoText[2].
getLength() || fIsCollapsed;
306 if (fNewIsSmall == fIsSmall)
return;
307 fIsSmall = fNewIsSmall;
312 void C4StartupNetListEntry::UpdateEntrySize()
317 for (
int i=0; i<iLblCnt; ++i)
330 void C4StartupNetListEntry::UpdateText()
332 bool fRestackElements=
false;
346 if (!i) iAvailableWdt -= sx;
348 pUseFont->
BreakMessage(sInfoText[i].getData(), iAvailableWdt, &BrokenText,
true);
352 if ((pInfoLbl[i]->
GetBounds().Hgt != iHgt) || (pInfoLbl[i]->
GetBounds().Wdt != iAvailableWdt))
358 fRestackElements =
true;
364 if (fRestackElements) UpdateEntrySize();
368 bool fChange = fToValue !=
fVisible;
370 if(fChange) UpdateEntrySize();
373 void C4StartupNetListEntry::AddStatusIcon(
C4GUI::Icons eIcon,
const char *szToolTip)
378 pInfoIcons[iInfoIconCount]->
SetIcon(eIcon);
379 pInfoIcons[iInfoIconCount]->
SetToolTip(szToolTip);
389 int32_t iIcon = pRef->
getIcon();
414 sInfoText[1].
Append(
" - "); sInfoText[1].
Append(strDuration);
421 if (i) sAddress.
Append(
", ");
467 UpdateSmallState(); UpdateText();
470 void C4StartupNetListEntry::SetError(
const char *szErrorText, TimeoutType eTimeout)
474 sInfoText[1].
Copy(szErrorText);
476 InvalidateStatusIcons();
477 UpdateSmallState(); UpdateText();
481 SetTimeout(eTimeout);
484 void C4StartupNetListEntry::SetTimeout(TimeoutType eTimeout)
494 iTimeout = time(
nullptr) + iTime;
526 if (!pRef)
return false;
529 if (!pHost1 || !pHost2)
return false;
537 if (!pRef)
return false;
552 if (!pRefClient)
return false;
564 if (!pRef)
return false;
575 if (!pRefClient)
return nullptr;
599 keys.emplace_back(K_BACK); keys.emplace_back(K_LEFT);
608 int32_t iButtonWidth,iCaptionFontHgt, iSideSize = std::max<int32_t>(
GetBounds().Wdt/6, iIconSize);
614 int32_t iButtonAreaWdt = caButtonArea.
GetWidth()*7/8;
615 iButtonWidth = std::min<int32_t>(iButtonWidth, (iButtonAreaWdt - 8 * iButtonIndent)/4);
616 iButtonIndent = (iButtonAreaWdt - 4 * iButtonWidth) / 8;
633 else btnChat =
nullptr;
648 const char *szSearchLblText =
LoadResStr(
"IDS_NET_MSSEARCH");
649 int32_t iSearchWdt=100, iSearchHgt;
653 const char *szSearchTip =
LoadResStr(
"IDS_NET_MSSEARCH_DESC");
668 const char *szIPLblText =
LoadResStr(
"IDS_NET_IP");
669 int32_t iIPWdt=100, Q;
672 const char *szIPTip =
LoadResStr(
"IDS_NET_IP_DESC");
705 #ifdef WITH_AUTOMATIC_UPDATE
707 btnUpdate->SetVisibility(
false);
708 btnUpdate->SetToolTip(
LoadResStr(
"IDS_DLGTIP_UPDATE"));
709 btnUpdate->SetText(
LoadResStr(
"IDS_CTL_UPDATE"));
749 DiscoverClient.
Close();
751 if (pMasterserverClient)
delete pMasterserverClient;
761 Base::DrawElement(cgo);
770 UpdateUpdateButton();
771 UpdateMasterserver();
773 tLastRefresh = time(
nullptr);
775 if (pChatCtrl) pChatCtrl->
OnShown();
781 if (pMasterserverClient) {
delete pMasterserverClient; pMasterserverClient=
nullptr; }
788 if (GetDlgMode() == SNDM_Chat && pChatCtrl)
799 if (GetDlgMode() == SNDM_Chat && pChatCtrl)
837 UpdateMasterserver();
849 #ifdef WITH_AUTOMATIC_UPDATE
860 void C4StartupNetDlg::UpdateMasterserver()
868 delete pMasterserverClient;
869 pMasterserverClient =
nullptr;
880 void C4StartupNetDlg::UpdateList(
bool fGotReference)
883 if (fUpdatingList)
return;
884 fUpdatingList =
true;
887 const char *szGameMask = pSearchFieldEdt->
GetText();
888 if (!szGameMask) szGameMask =
"";
890 bool fAnyRemoval =
false;
892 while ((pElem=pNextElem))
898 bool fKeepEntry =
true;
902 fKeepEntry = pEntry->
Execute();
927 if (fIsCollapsed && fAnyRemoval)
930 fIsCollapsed =
false;
940 fUpdatingList =
false;
943 UpdateSelection(
false);
946 void C4StartupNetDlg::UpdateCollapsed()
956 void C4StartupNetDlg::UpdateSelection(
bool fUpdateCollapsed)
959 if (fUpdatingList)
return;
961 if (fIsCollapsed && fUpdateCollapsed) UpdateCollapsed();
964 void C4StartupNetDlg::UpdateDlgMode()
966 DlgMode eMode = GetDlgMode();
976 C4StartupNetDlg::DlgMode C4StartupNetDlg::GetDlgMode()
979 if (pMainTabular->
GetActiveSheetIndex() == SNDM_Chat)
return SNDM_Chat;
else return SNDM_GameList;
984 UpdateUpdateButton();
988 void C4StartupNetDlg::UpdateUpdateButton()
990 if (!fUpdateCheckPending)
return;
1000 #ifdef WITH_AUTOMATIC_UPDATE
1001 btnUpdate->SetVisibility(C4UpdateDlg::IsValidUpdate(versionInfo.
getData()));
1003 fUpdateCheckPending =
false;
1009 if (GetDlgMode() == SNDM_Chat)
return pChatCtrl->
DlgEnter();
1013 const char *szDirectJoinAddress = pJoinAddressEdt->
GetText();
1014 if (szDirectJoinAddress && *szDirectJoinAddress)
1020 while (std::isspace(*szDirectJoinAddress))
1022 ++szDirectJoinAddress;
1023 if (!*szDirectJoinAddress)
1026 const char *szDirectJoinAddressEnd = szDirectJoinAddress + std::strlen(szDirectJoinAddress) - 1;
1027 while (std::isspace(*szDirectJoinAddressEnd))
1029 --szDirectJoinAddressEnd;
1030 if (*++szDirectJoinAddressEnd)
1033 std::string strDirectJoinAddressStripped(szDirectJoinAddress, szDirectJoinAddressEnd - szDirectJoinAddress);
1062 const char *szError;
1063 if ((szError = pRefEntry->
GetError()))
1075 if (!pRef && !(szDirectJoinAddress && *szDirectJoinAddress))
1131 bool success =
false;
1188 time_t tNow = time(
nullptr);
1195 tLastRefresh = tNow;
1197 fUpdatingList =
true;
1199 pMasterserverClient=
nullptr;
1212 UpdateMasterserver();
1214 fUpdatingList =
false;
1230 if (!iGameDiscoverInterval--)
1259 else if (fIsCollapsed)
1272 #ifdef WITH_AUTOMATIC_UPDATE
1281 fUpdateCheckPending =
true;
C4Application Application
C4GraphicsResource GraphicsResource
#define C4GUI_InactMessageFontClr
#define C4GUI_StandardBGColor
#define C4GUI_ImportantBGColor
#define C4GUI_CaptionFontClr
#define C4GUI_MessageFontClr
#define C4GUI_Caption2FontClr
const char * LoadResStr(const char *id)
const int C4NetMasterServerQueryInterval
const int C4NetReferenceTimeout
const int C4NetErrorRefTimeout
const int C4NetMinRefreshInterval
const int C4NetRefRequestTimeout
const int C4NetGameDiscoveryInterval
const int32_t C4StartupScenSel_IconCount
const int32_t C4StartupScenSel_DefaultIcon_Scenario
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
const char * SSearchNoCase(const char *szString, const char *szIndex)
bool SEqual(const char *szStr1, const char *szStr2)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
StdStrBuf FormatString(const char *szFmt,...)
void MakeTempFilename(char *szFilename)
bool EraseFile(const char *szFileName)
C4InteractiveThread InteractiveThread
void OpenGame(const char *scenario=nullptr)
C4Network2IRCClient & IRCClient
void SetTitleChangeCB(C4GUI::BaseInputCallback *pNewCB)
virtual class C4GUI::Control * GetDefaultControl()
static bool IsChatEnabled()
const char * getCUID() const
const char * getName() const
StdStrBuf GetAllClientNames() const
C4Client * getHost() const
int32_t getClientCnt() const
const char * AtTempPath(const char *filename)
int32_t MasterServerSignUp
const char * GetLeagueServerAddress()
int32_t UseAlternateServer
std::vector< C4KeyCodeEx > CodeList
void DrawBoxDw(C4Surface *sfcDest, int iX1, int iY1, int iX2, int iY2, DWORD dwClr)
bool GetFromLeft(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
bool GetCentered(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
int32_t GetHeight() const
bool GetFromRight(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
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)
virtual bool IsSelectedChild(Element *pChild)
void SetVisibility(bool fToValue) override
void SetFocus(Control *pCtrl, bool fByMouse)
bool IsActive(bool fForKeyboard)
void UpdateSize() override
virtual Screen * GetScreen()
Element * GetNext() const
C4Rect GetContainedClientRect()
virtual void UpdateSize()
void SetBounds(const C4Rect &rcNewBound)
void SetToolTip(const char *szNewTooltip, bool is_immediate=false)
void SetColors(uint32_t dwFrameClr, uint32_t dwTitleClr, uint32_t dwBackClr=0xffffffff)
void SetMargin(int32_t iNewMargin)
void SetIcon(Icons icoNewIconIndex)
void SetText(const char *szToText, bool fAllowHotkey=true)
void SetAutosize(bool fToVal)
void SetColor(DWORD dwToClr, bool fMakeReadableOnBlack=true)
Element * GetSelectedItem()
bool IsScrollingNecessary()
bool InsertElement(Element *pChild, Element *pInsertBefore, int32_t iIndent=0)
void SetSelectionDblClickFn(BaseCallbackHandler *pToHandler)
void SetSelectionChangeCallbackFn(BaseCallbackHandler *pToHandler)
void UpdateElementPositions()
void SetDecoration(bool fDrawBG, ScrollBarFacets *pToGfx, bool fAutoScroll, bool fDrawBorder=false)
void SelectEntry(Element *pNewSel, bool fByUser)
void SetFacet(const C4Facet &fct)
void SetAnimated(bool fEnabled, int iDelay)
const C4FacetSurface & GetFacet() const
bool ShowErrorMessage(const char *szMessage)
bool ShowMessageModal(const char *szMessage, const char *szCaption, DWORD dwButtons, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
bool ShowMessage(const char *szMessage, const char *szCaption, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
Sheet * AddSheet(const char *szTitle, int32_t icoTitle=Ico_None)
void SelectSheet(int32_t iIndex, bool fByUser)
int32_t GetActiveSheetIndex()
void SetDrawDecoration(bool fToVal)
void SetSheetMargin(int32_t iMargin)
C4Rect & GetClientRect() override
static int32_t GetDefaultHeight(CStdFont *pUseFont=nullptr)
char DirectJoinAddress[_MAX_PATH_LEN]
char ScenarioFilename[_MAX_PATH_LEN]
static constexpr const char * DirectJoinFilePrefix
std::unique_ptr< C4Network2Reference > pJoinReference
char DefinitionFilenames[20 *_MAX_PATH_LEN]
C4PlayerInfoList PlayerInfos
virtual const char * GetError() const
bool SetServer(const char *szServerAddress)
const char * getServerName() const
void SetNotify(class C4InteractiveThread *pnNotify)
void Cancel(const char *szReason)
void RemoveProc(StdSchedulerProc *pProc)
void ClearCallback(C4InteractiveEventType eEvent, Callback *pnNetworkCallback)
bool AddProc(StdSchedulerProc *pProc)
void SetCallback(C4InteractiveEventType eEvent, Callback *pnNetworkCallback)
virtual const char * GetError() const
bool Execute(int iMaxTime=TO_INF, pollfd *=nullptr) override
StdStrBuf toString() const
bool PopDiscover(C4NetIO::addr_t &Discover)
bool Init(uint16_t iPort=C4NetIO::addr_t::IPPORT_NONE) override
bool GetReferences(C4Network2Reference **&rpReferences, int32_t &rRefCount)
C4GameParameters Parameters
bool isPasswordNeeded() const
int32_t getSortOrder() const
const C4GameVersion & getGameVersion() const
const C4Network2Address & getAddr(int i) const
bool isOfficialServer() const
int32_t getStartTime() const
const char * getComment() const
StdStrBuf getGameGoalString() const
const char * getTitle() const
bool isJoinAllowed() const
C4Network2Status getGameStatus() const
bool isLobbyActive() const
const char * getDescription() const
bool GetVersion(StdStrBuf *pVersion)
bool GetUpdateURL(StdStrBuf *pUpdateURL)
StdStrBuf GetActivePlayerNames(bool fCountInvisible, int32_t iAtClientID=-1) const
int32_t GetActivePlayerCount(bool fCountInvisible) const
void Set(int32_t iX, int32_t iY, int32_t iWdt, int32_t iHgt)
class C4StartupDlg * SwitchDialog(DialogID eToDlg, bool fFade=true, const char *szSubDialog=nullptr)
C4StartupGraphics Graphics
void OnChatTitleChange(const StdStrBuf &sNewTitle)
void OnBtnRecord(C4GUI::Control *btn)
void OnClosed(bool fOK) override
C4GUI::Edit::InputResult OnJoinAddressEnter(C4GUI::Edit *edt, bool fPasting, bool fPastingMore)
void OnCreateGameBtn(C4GUI::Control *btn)
void OnReferenceEntryAdd(C4StartupNetListEntry *pEntry)
~C4StartupNetDlg() override
void OnBackBtn(C4GUI::Control *btn)
void OnRefreshBtn(C4GUI::Control *btn)
C4GUI::Control * GetDefaultControl() override
void DrawElement(C4TargetFacet &cgo) override
void OnSelDblClick(class C4GUI::Element *pEl)
void OnBtnInternet(C4GUI::Control *btn)
C4GUI::Edit::InputResult OnSearchFieldEnter(C4GUI::Edit *edt, bool fPasting, bool fPastingMore)
void CheckVersionUpdate()
void OnJoinGameBtn(C4GUI::Control *btn)
void OnSec1Timer() override
void OnBtnGameList(C4GUI::Control *btn)
void OnSelChange(class C4GUI::Element *pEl)
C4GUI::Control * GetDlgModeFocusControl()
void OnBtnChat(C4GUI::Control *btn)
void DrawElement(C4TargetFacet &cgo) override
C4Network2Reference * GetReference() const
~C4StartupNetListEntry() override
const char * GetJoinAddress()
void SetRefQuery(const char *szAddress, QueryType eQueryType)
void UpdateCollapsed(bool fToCollapseValue)
void SetReference(C4Network2Reference *pNewRef)
C4GUI::Element * GetNextLower(int32_t sortOrder)
void SetVisibility(bool fToValue) override
bool IsSameAddress(const C4Network2Reference *pRef2)
bool IsSameHost(const C4Network2Reference *pRef2)
C4StartupNetListEntry(C4GUI::ListBox *pForListBox, C4GUI::Element *pInsertBefore, class C4StartupNetDlg *pNetDlg)
bool KeywordMatch(const char *szMatch)
bool IsSameRefQueryAddress(const char *szJoinAddress)
C4Network2Reference * GrabReference()
int GetLineHeight() const
std::tuple< std::string, int > BreakMessage(const char *szMsg, int iWdt, bool fCheckMarkup, float fZoom=1.0f)
bool GetTextExtent(const char *szText, int32_t &rsx, int32_t &rsy, bool fCheckMarkup=true)
void Remove(StdSchedulerProc *pProc)
void Add(StdSchedulerProc *pProc)
void Ref(const char *pnData)
const char * getData() const
void Append(const char *pnData, size_t iChars)
bool SaveToFile(const char *szFile) const
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
void GUISound(const char *szSound)
StdStrBuf GetString() const
StdStrBuf ToString(int flags=0) const