C4StartupAboutDlg::C4StartupAboutDlg() : C4StartupDlg(LoadResStr("IDS_DLG_ABOUT")) { // ctor UpdateSize(); CStdFont &rUseFont = ::GraphicsResource.TextFont; C4Rect rcClient = GetContainedClientRect(); // bottom line buttons and copyright messages C4GUI::ComponentAligner caMain(rcClient, 0,0, true); C4GUI::ComponentAligner caButtons(caMain.GetFromBottom(caMain.GetHeight()*1/8), 0,0, false); C4GUI::CallbackButton<C4StartupAboutDlg> *btn; #if AUDIO_TK == AUDIO_TK_FMOD AddElement(new C4GUI::Label("Using FMOD Sound System, copyright (c) Firelight Technologies Pty, Ltd., 1994-2010.", caMain.GetFromBottom(rUseFont.GetLineHeight()))); #endif int32_t iButtonWidth = caButtons.GetInnerWidth() / 4; AddElement(btn = new C4GUI::CallbackButton<C4StartupAboutDlg>(LoadResStr("IDS_BTN_BACK"), caButtons.GetGridCell(0,3,0,1,iButtonWidth,C4GUI_ButtonHgt,true), &C4StartupAboutDlg::OnBackBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_BACKMAIN")); #ifdef WITH_AUTOMATIC_UPDATE AddElement(btn = new C4GUI::CallbackButton<C4StartupAboutDlg>(LoadResStr("IDS_BTN_CHECKFORUPDATES"), caButtons.GetGridCell(2,3,0,1,iButtonWidth,C4GUI_ButtonHgt,true), &C4StartupAboutDlg::OnUpdateBtn)); btn->SetToolTip(LoadResStr("IDS_DESC_CHECKONLINEFORNEWVERSIONS")); #endif AddElement(new C4GUI::Label("'Clonk' is a registered trademark of Matthes Bender.", caButtons.GetFromBottom(rUseFont.GetLineHeight()))); }
C4GameOverDlg::C4GameOverDlg() : C4GUI::Dialog( (C4GUI::GetScreenWdt() < 800) ? (C4GUI::GetScreenWdt()-10) : Min<int32_t>(C4GUI::GetScreenWdt()-150, 800), (C4GUI::GetScreenHgt() < 600) ? (C4GUI::GetScreenHgt()-10) : Min<int32_t>(C4GUI::GetScreenHgt()-150, 600), LoadResStr("IDS_TEXT_EVALUATION"), false), pNetResultLabel(NULL), fIsNetDone(false), fHasNextMissionButton(false) { is_shown = true; // assume dlg will be shown, soon UpdateOwnPos(); // indents / sizes int32_t iDefBtnHeight = 32; int32_t iIndentX1=10; int32_t iIndentY1=6, iIndentY2=0; // main screen components C4GUI::ComponentAligner caMain(GetClientRect(), 0,iIndentY1,true); int32_t iMainTextWidth = caMain.GetWidth() - 6*iIndentX1; caMain.GetFromBottom(iIndentY2); // lower button-area C4GUI::ComponentAligner caBottom(caMain.GetFromBottom(iDefBtnHeight+iIndentY1*2), iIndentX1,0); int32_t iBottomButtonSize = caBottom.GetInnerWidth(); iBottomButtonSize = Min<int32_t>(iBottomButtonSize/2-2*iIndentX1, C4GUI::GetRes()->CaptionFont.GetTextWidth("Quit it, baby! And some.")*2); // goal display const C4IDList &rGoals = Game.RoundResults.GetGoals(); const C4IDList &rFulfilledGoals = Game.RoundResults.GetFulfilledGoals(); if (rGoals.GetNumberOfIDs()) { C4GoalDisplay *pGoalDisplay = new C4GoalDisplay(caMain.GetFromTop(C4GUI_IconExHgt)); pGoalDisplay->SetGoals(rGoals, rFulfilledGoals, C4GUI_IconExHgt); AddElement(pGoalDisplay); // goal display may have resized itself; adjust component aligner caMain.ExpandTop(C4GUI_IconExHgt - pGoalDisplay->GetBounds().Hgt); } // league/network result, present or pending fIsNetDone = false; bool fHasNetResult = Game.RoundResults.HasNetResult(); const char *szNetResult = NULL; if (Game.Parameters.isLeague() || fHasNetResult) { if (fHasNetResult) szNetResult = Game.RoundResults.GetNetResultString(); else szNetResult = LoadResStr("IDS_TEXT_LEAGUEWAITINGFOREVALUATIO"); pNetResultLabel = new C4GUI::Label("", caMain.GetFromTop(C4GUI::GetRes()->TextFont.GetLineHeight()*2, iMainTextWidth), ACenter, C4GUI_Caption2FontClr, NULL, false, false, true); AddElement(pNetResultLabel); // only add label - contents and fIsNetDone will be set in next update } else { // otherwise, network is always done fIsNetDone = true; } // extra evaluation string area const char *szCustomEvaluationStrings = Game.RoundResults.GetCustomEvaluationStrings(); if (szCustomEvaluationStrings && *szCustomEvaluationStrings) { int32_t iMaxHgt = caMain.GetInnerHeight() / 3; // max 1/3rd of height for extra data C4GUI::MultilineLabel *pCustomStrings = new C4GUI::MultilineLabel(caMain.GetFromTop(0 /* resized later*/, iMainTextWidth), 0,0, " ", true, true); pCustomStrings->AddLine(szCustomEvaluationStrings, &C4GUI::GetRes()->TextFont, C4GUI_MessageFontClr, true, false, NULL); C4Rect rcCustomStringBounds = pCustomStrings->GetBounds(); if (rcCustomStringBounds.Hgt > iMaxHgt) { // Buffer too large: Use a scrollbox instead delete pCustomStrings; rcCustomStringBounds.Hgt = iMaxHgt; C4GUI::TextWindow *pCustomStringsWin = new C4GUI::TextWindow(rcCustomStringBounds, 0,0,0, 0,0," ",true, NULL,0, true); pCustomStringsWin->SetDecoration(false, false, NULL, false); pCustomStringsWin->AddTextLine(szCustomEvaluationStrings, &C4GUI::GetRes()->TextFont, C4GUI_MessageFontClr, true, false, NULL); caMain.ExpandTop(-iMaxHgt); AddElement(pCustomStringsWin); } else { // buffer size OK: Reserve required space caMain.ExpandTop(-rcCustomStringBounds.Hgt); AddElement(pCustomStrings); } } // player list area C4GUI::ComponentAligner caPlayerArea(caMain.GetAll(), iIndentX1,0); iPlrListCount = 1; bool fSepTeamLists = false; if (Game.Teams.GetTeamCount() == 2 && !Game.Teams.IsAutoGenerateTeams()) { // exactly two predefined teams: Use two player list boxes; one for each team iPlrListCount = 2; fSepTeamLists = true; } ppPlayerLists = new C4PlayerInfoListBox *[iPlrListCount]; for (int32_t i=0; i<iPlrListCount; ++i) { ppPlayerLists[i] = new C4PlayerInfoListBox(caPlayerArea.GetGridCell(i,iPlrListCount,0,1), C4PlayerInfoListBox::PILBM_Evaluation, fSepTeamLists ? Game.Teams.GetTeamByIndex(i)->GetID() : 0); /*if (fSepTeamLists) not necessary and popping up on too much area ppPlayerLists[i]->SetToolTip(FormatString(LoadResStr("IDS_DESC_TEAM"), Game.Teams.GetTeamByIndex(i)->GetName()).getData()); else ppPlayerLists[i]->SetToolTip(LoadResStr("IDS_DESC_LISTOFPLAYERSWHOPARTICIPA"));*/ //ppPlayerLists[i]->SetCustomFont(&Game.GraphicsResource.FontTooltip, 0xff000000); - display black on white? ppPlayerLists[i]->SetSelectionDiabled(true); ppPlayerLists[i]->SetDecoration(false, NULL, true, false); AddElement(ppPlayerLists[i]); } // add buttons C4GUI::CallbackButton<C4GameOverDlg> *btnExit; pBtnExit = btnExit = new C4GUI::CallbackButton<C4GameOverDlg>(LoadResStr("IDS_BTN_ENDROUND"), caBottom.GetGridCell(0,2, 0,1, iBottomButtonSize, -1, true), &C4GameOverDlg::OnExitBtn); btnExit->SetToolTip(LoadResStr("IDS_DESC_ENDTHEROUND")); AddElement(btnExit); C4GUI::CallbackButton<C4GameOverDlg> *btnContinue; pBtnContinue = btnContinue = new C4GUI::CallbackButton<C4GameOverDlg>(LoadResStr("IDS_BTN_CONTINUEGAME"), caBottom.GetGridCell(1,2, 0,1, iBottomButtonSize, -1, true), &C4GameOverDlg::OnContinueBtn); btnContinue->SetToolTip(LoadResStr("IDS_DESC_CONTINUETHEROUNDWITHNOFUR")); AddElement(btnContinue); // convert continue button to "next mission" button if available if (Game.NextMission) { // not available for regular replay and network clients, obviously // it is available for films though, so you can create cinematics for adventures if (Game.Control.isCtrlHost() || (Game.C4S.Head.Film == 2)) { fHasNextMissionButton = true; btnContinue->SetText(Game.NextMissionText.getData()); btnContinue->SetToolTip(Game.NextMissionDesc.getData()); } } // updates pSec1Timer = new C4Sec1TimerCallback<C4GameOverDlg>(this); Update(); // initial focus on quit button if visible, so space/enter/low gamepad buttons quit fIsQuitBtnVisible = fIsNetDone || !Game.Network.isHost(); if (fIsQuitBtnVisible) SetFocus(btnExit, false); }
C4StartupNetDlg::C4StartupNetDlg() : C4StartupDlg(LoadResStr("IDS_DLG_NETSTART")) { // ctor // key bindings C4CustomKey::CodeList keys; keys.emplace_back(K_BACK); keys.emplace_back(K_LEFT); pKeyBack = new C4KeyBinding(keys, "StartupNetBack", KEYSCOPE_Gui, new C4GUI::DlgKeyCB<C4StartupNetDlg>(*this, &C4StartupNetDlg::KeyBack), C4CustomKey::PRIO_Dlg); pKeyRefresh = new C4KeyBinding(C4KeyCodeEx(K_F5), "StartupNetReload", KEYSCOPE_Gui, new C4GUI::DlgKeyCB<C4StartupNetDlg>(*this, &C4StartupNetDlg::KeyRefresh), C4CustomKey::PRIO_CtrlOverride); // screen calculations UpdateSize(); int32_t iIconSize = C4GUI_IconExWdt; int32_t iButtonWidth,iCaptionFontHgt, iSideSize = std::max<int32_t>(GetBounds().Wdt/6, iIconSize); int32_t iButtonHeight = C4GUI_ButtonHgt, iButtonIndent = GetBounds().Wdt/40; ::GraphicsResource.CaptionFont.GetTextExtent("<< BACK", iButtonWidth, iCaptionFontHgt, true); iButtonWidth *= 3; C4GUI::ComponentAligner caMain(GetClientRect(), 0,0, true); C4GUI::ComponentAligner caButtonArea(caMain.GetFromBottom(caMain.GetHeight()/7),0,0); int32_t iButtonAreaWdt = caButtonArea.GetWidth()*7/8; iButtonWidth = std::min<int32_t>(iButtonWidth, (iButtonAreaWdt - 8 * iButtonIndent)/4); iButtonIndent = (iButtonAreaWdt - 4 * iButtonWidth) / 8; C4GUI::ComponentAligner caButtons(caButtonArea.GetCentered(iButtonAreaWdt, iButtonHeight),iButtonIndent,0); C4GUI::ComponentAligner caLeftBtnArea(caMain.GetFromLeft(iSideSize), std::min<int32_t>(caMain.GetWidth()/20, (iSideSize-C4GUI_IconExWdt)/2), caMain.GetHeight()/40); C4GUI::ComponentAligner caConfigArea(caMain.GetFromRight(iSideSize), std::min<int32_t>(caMain.GetWidth()/20, (iSideSize-C4GUI_IconExWdt)/2), caMain.GetHeight()/40); // left button area: Switch between chat and game list if (C4ChatDlg::IsChatEnabled()) { btnGameList = new C4GUI::CallbackButton<C4StartupNetDlg, C4GUI::IconButton>(C4GUI::Ico_Ex_GameList, caLeftBtnArea.GetFromTop(iIconSize, iIconSize), '\0', &C4StartupNetDlg::OnBtnGameList); btnGameList->SetToolTip(LoadResStr("IDS_DESC_SHOWSAVAILABLENETWORKGAME")); btnGameList->SetText(LoadResStr("IDS_BTN_GAMES")); AddElement(btnGameList); btnChat = new C4GUI::CallbackButton<C4StartupNetDlg, C4GUI::IconButton>(C4GUI::Ico_Ex_Chat, caLeftBtnArea.GetFromTop(iIconSize, iIconSize), '\0', &C4StartupNetDlg::OnBtnChat); btnChat->SetToolTip(LoadResStr("IDS_DESC_CONNECTSTOANIRCCHATSERVER")); btnChat->SetText(LoadResStr("IDS_BTN_CHAT")); AddElement(btnChat); } else btnChat = nullptr; // main area: Tabular to switch between game list and chat pMainTabular = new C4GUI::Tabular(caMain.GetAll(), C4GUI::Tabular::tbNone); pMainTabular->SetDrawDecoration(false); pMainTabular->SetSheetMargin(0); AddElement(pMainTabular); // main area: game selection sheet C4GUI::Tabular::Sheet *pSheetGameList = pMainTabular->AddSheet(nullptr); C4GUI::ComponentAligner caGameList(pSheetGameList->GetContainedClientRect(), 0,0, false); C4GUI::WoodenLabel *pGameListLbl; int32_t iCaptHgt = C4GUI::WoodenLabel::GetDefaultHeight(&::GraphicsResource.TextFont); pGameListLbl = new C4GUI::WoodenLabel(LoadResStr("IDS_NET_GAMELIST"), caGameList.GetFromTop(iCaptHgt), C4GUI_Caption2FontClr, &::GraphicsResource.TextFont, ALeft); // search field C4GUI::WoodenLabel *pSearchLbl; const char *szSearchLblText = LoadResStr("IDS_NET_MSSEARCH"); int32_t iSearchWdt=100, iSearchHgt; ::GraphicsResource.TextFont.GetTextExtent(szSearchLblText, iSearchWdt, iSearchHgt, true); C4GUI::ComponentAligner caSearch(caGameList.GetFromTop(iSearchHgt), 0,0); pSearchLbl = new C4GUI::WoodenLabel(szSearchLblText, caSearch.GetFromLeft(iSearchWdt+10), C4GUI_Caption2FontClr, &::GraphicsResource.TextFont); const char *szSearchTip = LoadResStr("IDS_NET_MSSEARCH_DESC"); pSearchLbl->SetToolTip(szSearchTip); pSheetGameList->AddElement(pSearchLbl); pSearchFieldEdt = new C4GUI::CallbackEdit<C4StartupNetDlg>(caSearch.GetAll(), this, &C4StartupNetDlg::OnSearchFieldEnter); pSearchFieldEdt->SetToolTip(szSearchTip); pSheetGameList->AddElement(pSearchFieldEdt); pSheetGameList->AddElement(pGameListLbl); pGameSelList = new C4GUI::ListBox(caGameList.GetFromTop(caGameList.GetHeight() - iCaptHgt)); pGameSelList->SetDecoration(true, nullptr, true, true); pGameSelList->UpdateElementPositions(); pGameSelList->SetSelectionDblClickFn(new C4GUI::CallbackHandler<C4StartupNetDlg>(this, &C4StartupNetDlg::OnSelDblClick)); pGameSelList->SetSelectionChangeCallbackFn(new C4GUI::CallbackHandler<C4StartupNetDlg>(this, &C4StartupNetDlg::OnSelChange)); pSheetGameList->AddElement(pGameSelList); C4GUI::ComponentAligner caIP(caGameList.GetAll(), 0,0); C4GUI::WoodenLabel *pIPLbl; const char *szIPLblText = LoadResStr("IDS_NET_IP"); int32_t iIPWdt=100, Q; ::GraphicsResource.TextFont.GetTextExtent(szIPLblText, iIPWdt, Q, true); pIPLbl = new C4GUI::WoodenLabel(szIPLblText, caIP.GetFromLeft(iIPWdt+10), C4GUI_Caption2FontClr, &::GraphicsResource.TextFont); const char *szIPTip = LoadResStr("IDS_NET_IP_DESC"); pIPLbl->SetToolTip(szIPTip); pSheetGameList->AddElement(pIPLbl); pJoinAddressEdt = new C4GUI::CallbackEdit<C4StartupNetDlg>(caIP.GetAll(), this, &C4StartupNetDlg::OnJoinAddressEnter); pJoinAddressEdt->SetToolTip(szIPTip); pSheetGameList->AddElement(pJoinAddressEdt); // main area: chat sheet if (C4ChatDlg::IsChatEnabled()) { C4GUI::Tabular::Sheet *pSheetChat = pMainTabular->AddSheet(nullptr); C4GUI::ComponentAligner caChat(pSheetChat->GetContainedClientRect(), 0,0, false); pSheetChat->AddElement(pChatTitleLabel = new C4GUI::WoodenLabel("", caChat.GetFromTop(iCaptHgt), C4GUI_Caption2FontClr, &::GraphicsResource.TextFont, ALeft, false)); C4GUI::GroupBox *pChatGroup = new C4GUI::GroupBox(caChat.GetAll()); pChatGroup->SetColors(0u, C4GUI_CaptionFontClr, C4GUI_StandardBGColor); pChatGroup->SetMargin(2); pSheetChat->AddElement(pChatGroup); pChatCtrl = new C4ChatControl(&Application.IRCClient); pChatCtrl->SetBounds(pChatGroup->GetContainedClientRect()); pChatCtrl->SetTitleChangeCB(new C4GUI::InputCallback<C4StartupNetDlg>(this, &C4StartupNetDlg::OnChatTitleChange)); StdStrBuf sCurrTitle; sCurrTitle.Ref(pChatCtrl->GetTitle()); OnChatTitleChange(sCurrTitle); pChatGroup->AddElement(pChatCtrl); } // config area btnInternet = new C4GUI::CallbackButton<C4StartupNetDlg, C4GUI::IconButton>(Config.Network.MasterServerSignUp ? C4GUI::Ico_Ex_InternetOn : C4GUI::Ico_Ex_InternetOff, caConfigArea.GetFromTop(iIconSize, iIconSize), '\0', &C4StartupNetDlg::OnBtnInternet); btnInternet->SetToolTip(LoadResStr("IDS_DLGTIP_SEARCHINTERNETGAME")); btnInternet->SetText(LoadResStr("IDS_CTL_INETSERVER")); AddElement(btnInternet); btnRecord = new C4GUI::CallbackButton<C4StartupNetDlg, C4GUI::IconButton>(Game.Record ? C4GUI::Ico_Ex_RecordOn : C4GUI::Ico_Ex_RecordOff, caConfigArea.GetFromTop(iIconSize, iIconSize), '\0', &C4StartupNetDlg::OnBtnRecord); btnRecord->SetToolTip(LoadResStr("IDS_DLGTIP_RECORD")); btnRecord->SetText(LoadResStr("IDS_CTL_RECORD")); AddElement(btnRecord); #ifdef WITH_AUTOMATIC_UPDATE btnUpdate = new C4GUI::CallbackButton<C4StartupNetDlg, C4GUI::IconButton>(C4GUI::Ico_Ex_Update, caConfigArea.GetFromTop(iIconSize, iIconSize), '\0', &C4StartupNetDlg::OnBtnUpdate); btnUpdate->SetVisibility(false); // update only available if masterserver notifies it btnUpdate->SetToolTip(LoadResStr("IDS_DLGTIP_UPDATE")); btnUpdate->SetText(LoadResStr("IDS_CTL_UPDATE")); AddElement(btnUpdate); #endif // button area C4GUI::CallbackButton<C4StartupNetDlg> *btn; AddElement(btn = new C4GUI::CallbackButton<C4StartupNetDlg>(LoadResStr("IDS_BTN_BACK"), caButtons.GetFromLeft(iButtonWidth), &C4StartupNetDlg::OnBackBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_BACKMAIN")); AddElement(btnRefresh = new C4GUI::CallbackButton<C4StartupNetDlg>(LoadResStr("IDS_BTN_RELOAD"), caButtons.GetFromLeft(iButtonWidth), &C4StartupNetDlg::OnRefreshBtn)); btnRefresh->SetToolTip(LoadResStr("IDS_NET_RELOAD_DESC")); AddElement(btnJoin = new C4GUI::CallbackButton<C4StartupNetDlg>(LoadResStr("IDS_NET_JOINGAME_BTN"), caButtons.GetFromLeft(iButtonWidth), &C4StartupNetDlg::OnJoinGameBtn)); btnJoin->SetToolTip(LoadResStr("IDS_NET_JOINGAME_DESC")); AddElement(btn = new C4GUI::CallbackButton<C4StartupNetDlg>(LoadResStr("IDS_NET_NEWGAME"), caButtons.GetFromLeft(iButtonWidth), &C4StartupNetDlg::OnCreateGameBtn)); btn->SetToolTip(LoadResStr("IDS_NET_NEWGAME_DESC")); // initial dlg mode UpdateDlgMode(); // initial focus SetFocus(GetDlgModeFocusControl(), false); // initialize discovery DiscoverClient.Init(Config.Network.PortDiscovery); DiscoverClient.StartDiscovery(); iGameDiscoverInterval = C4NetGameDiscoveryInterval; // register timer Application.Add(this); // register as receiver of reference notifies Application.InteractiveThread.SetCallback(Ev_HTTP_Response, this); }
C4StartupMainDlg::C4StartupMainDlg() : C4StartupDlg(NULL) // create w/o title; it is drawn in custom draw proc { // ctor fFirstShown = true; // screen calculations int iButtonPadding = 2; int iButtonHeight = C4GUI_BigButtonHgt; C4GUI::ComponentAligner caMain(rcBounds, 0, 0, true); C4GUI::ComponentAligner caRightPanel( caMain.GetFromRight(rcBounds.Wdt * 2 / 5), rcBounds.Wdt / 26, 40 + rcBounds.Hgt / 8); // C4GUI::ComponentAligner // caButtons(caRightPanel.GetCentered(caRightPanel.GetWidth(), // (iButtonHeight+iButtonPadding) * iButtonCount - iButtonPadding), 0, // iButtonPadding); C4GUI::ComponentAligner caButtons(caRightPanel.GetAll(), 0, iButtonPadding); // main menu buttons C4GUI::CallbackButton<C4StartupMainDlg> *btn; AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>( LoadResStr("IDS_BTN_LOCALGAME"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnStartBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_STARTGAME")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); pStartButton = btn; #ifdef NETWORK AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>( LoadResStr("IDS_BTN_NETWORKGAME"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnNetJoinBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_NETWORKGAME")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); #endif AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>( LoadResStr("IDS_DLG_PLAYERSELECTION"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnPlayerSelectionBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_PLAYERSELECTION")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>( LoadResStr("IDS_DLG_OPTIONS"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnOptionsBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_OPTIONS")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>( LoadResStr("IDS_DLG_ABOUT"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnAboutBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_ABOUT")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>( LoadResStr("IDS_DLG_EXIT"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnExitBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_EXIT")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); // list of selected players AddElement(pParticipantsLbl = new C4GUI::Label( "test", GetClientRect().Wdt * 39 / 40, GetClientRect().Hgt * 9 / 10, ARight, 0xffffffff, &C4GUI::GetRes()->TitleFont, false)); pParticipantsLbl->SetToolTip(LoadResStr("IDS_DLGTIP_SELECTEDPLAYERS")); // player selection shortcut - to be made optional UpdateParticipants(); pParticipantsLbl->SetContextHandler( new C4GUI::CBContextHandler<C4StartupMainDlg>( this, &C4StartupMainDlg::OnPlayerSelContext)); /*new C4GUI::ContextButton(pParticipantsLbl, true, 0,0);*/ // key bindings C4CustomKey::CodeList keys; keys.push_back(C4KeyCodeEx(K_DOWN)); keys.push_back(C4KeyCodeEx(K_RIGHT)); if (Config.Controls.GamepadGuiControl) { keys.push_back(C4KeyCodeEx( KEY_Gamepad(0, KEY_JOY_Down))); // right will be done by Dialog already } pKeyDown = new C4KeyBinding(keys, "StartupMainCtrlNext", KEYSCOPE_Gui, new C4GUI::DlgKeyCBEx<C4StartupMainDlg, bool>( *this, false, &C4StartupMainDlg::KeyAdvanceFocus), C4CustomKey::PRIO_CtrlOverride); keys.clear(); keys.push_back(C4KeyCodeEx(K_UP)); keys.push_back(C4KeyCodeEx(K_LEFT)); if (Config.Controls.GamepadGuiControl) { keys.push_back(C4KeyCodeEx( KEY_Gamepad(0, KEY_JOY_Up))); // left will be done by Dialog already } pKeyUp = new C4KeyBinding(keys, "StartupMainCtrlPrev", KEYSCOPE_Gui, new C4GUI::DlgKeyCBEx<C4StartupMainDlg, bool>( *this, true, &C4StartupMainDlg::KeyAdvanceFocus), C4CustomKey::PRIO_CtrlOverride); keys.clear(); keys.push_back(C4KeyCodeEx(K_RETURN)); pKeyEnter = new C4KeyBinding(keys, "StartupMainOK", KEYSCOPE_Gui, new C4GUI::DlgKeyCB<C4StartupMainDlg>( *this, &C4StartupMainDlg::KeyEnterDown, &C4StartupMainDlg::KeyEnterUp), C4CustomKey::PRIO_CtrlOverride); keys.clear(); keys.push_back(C4KeyCodeEx(K_F6)); pKeyEditor = new C4KeyBinding(keys, "StartupMainEditor", KEYSCOPE_Gui, new C4GUI::DlgKeyCB<C4StartupMainDlg>( *this, &C4StartupMainDlg::SwitchToEditor, NULL), C4CustomKey::PRIO_CtrlOverride); }
C4StartupMainDlg::C4StartupMainDlg() : C4StartupDlg(NULL) // create w/o title; it is drawn in custom draw proc { // ctor fFirstShown = true; // screen calculations int iButtonPadding = 2; int iButtonHeight = C4GUI_BigButtonHgt; C4GUI::ComponentAligner caMain(rcBounds, 0, 0, true); C4GUI::ComponentAligner caRightPanel(caMain.GetFromLeft(rcBounds.Wdt * 2 / 5), rcBounds.Wdt / 26, 40 + rcBounds.Hgt / 5); C4GUI::ComponentAligner caButtons(caRightPanel.GetAll(), 0, iButtonPadding); //infobox C4GUI::TextWindow* instructionsWindow; C4Rect rcInstructionsWindow = C4Rect(rcBounds.Wdt / 2, rcBounds.Hgt / 11, rcBounds.Wdt * 5 / 16, rcBounds.Hgt * 5 / 12); AddElement(instructionsWindow = new C4GUI::TextWindow(rcInstructionsWindow, 0, 0, 0, 100, 4096, " ", false, NULL, 0, true)); instructionsWindow->SetDecoration(true, true, &C4Startup::Get()->Graphics.sfctBookScroll, true); instructionsWindow->UpdateHeight(); instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS1")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); // instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS2")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS3")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS4")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS5")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); // main menu buttons C4GUI::CallbackButton<C4StartupMainDlg> *btn; AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_BTN_LOCALGAME"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnStartBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_STARTGAME")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); pStartButton = btn; // AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_QUESTIONNAIRE"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnQuestionnaireBtn)); // btn->SetToolTip(LoadResStr("IDS_DLGTIP_ABOUT")); // btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_SURVEY"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnSurveyBtn)); // btn->SetToolTip(LoadResStr("IDS_DLGTIP_ABOUT")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); // AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_BTN_NETWORKGAME"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnNetJoinBtn)); // btn->SetToolTip(LoadResStr("IDS_DLGTIP_NETWORKGAME")); // btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_PLAYERSELECTION"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnPlayerSelectionBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_PLAYERSELECTION")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_OPTIONS"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnOptionsBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_OPTIONS")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_ABOUT"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnAboutBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_ABOUT")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_EXIT"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnExitBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_EXIT")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); // list of selected players AddElement(pParticipantsLbl = new C4GUI::Label("test", GetClientRect().Wdt * 39 / 40, GetClientRect().Hgt * 9 / 10, ARight, 0xffffffff, &::GraphicsResource.TitleFont, false)); pParticipantsLbl->SetToolTip(LoadResStr("IDS_DLGTIP_SELECTEDPLAYERS")); // player selection shortcut - to be made optional UpdateParticipants(); pParticipantsLbl->SetContextHandler(new C4GUI::CBContextHandler<C4StartupMainDlg>(this, &C4StartupMainDlg::OnPlayerSelContext)); // key bindings C4CustomKey::CodeList keys; keys.push_back(C4KeyCodeEx(K_DOWN)); keys.push_back(C4KeyCodeEx(K_RIGHT)); if (Config.Controls.GamepadGuiControl) { keys.push_back(C4KeyCodeEx(KEY_Gamepad(0, KEY_JOY_Down))); // right will be done by Dialog already } pKeyDown = new C4KeyBinding(keys, "StartupMainCtrlNext", KEYSCOPE_Gui, new C4GUI::DlgKeyCBEx<C4StartupMainDlg, bool>(*this, false, &C4StartupMainDlg::KeyAdvanceFocus), C4CustomKey::PRIO_CtrlOverride); keys.clear(); keys.push_back(C4KeyCodeEx(K_UP)); keys.push_back(C4KeyCodeEx(K_LEFT)); if (Config.Controls.GamepadGuiControl) { keys.push_back(C4KeyCodeEx(KEY_Gamepad(0, KEY_JOY_Up))); // left will be done by Dialog already } pKeyUp = new C4KeyBinding(keys, "StartupMainCtrlPrev", KEYSCOPE_Gui, new C4GUI::DlgKeyCBEx<C4StartupMainDlg, bool>(*this, true, &C4StartupMainDlg::KeyAdvanceFocus), C4CustomKey::PRIO_CtrlOverride); keys.clear(); keys.push_back(C4KeyCodeEx(K_RETURN)); pKeyEnter = new C4KeyBinding(keys, "StartupMainOK", KEYSCOPE_Gui, new C4GUI::DlgKeyCB<C4StartupMainDlg>(*this, &C4StartupMainDlg::KeyEnterDown, &C4StartupMainDlg::KeyEnterUp), C4CustomKey::PRIO_CtrlOverride); }
C4StartupAboutDlg::C4StartupAboutDlg() : C4StartupDlg("") { // ctor UpdateSize(); // key bindings: No longer back on any key pKeyBack = NULL; //C4CustomKey::CodeList keys; //keys.push_back(C4KeyCodeEx(KEY_Any)); keys.push_back(C4KeyCodeEx(KEY_JOY_AnyButton)); //pKeyBack = new C4KeyBinding(keys, "StartupAboutBack", KEYSCOPE_Gui, // new C4GUI::DlgKeyCB<C4StartupAboutDlg>(*this, &C4StartupAboutDlg::KeyBack), C4CustomKey::PRIO_Dlg); // version and registration info in topright corner C4Rect rcClient = GetContainedClientRect(); StdStrBuf sVersion; sVersion.Format(LoadResStr("IDS_DLG_VERSION"), C4VERSION); CStdFont &rUseFont = C4GUI::GetRes()->TextFont; int32_t iInfoWdt = Min<int32_t>(rcClient.Wdt/2, rUseFont.GetTextWidth("General info text width")*2); C4GUI::ComponentAligner caInfo(C4Rect(rcClient.x + rcClient.Wdt - iInfoWdt, rcClient.y, iInfoWdt, rcClient.Hgt/8), 0,0, false); AddElement(new C4GUI::Label(sVersion.getData(), caInfo.GetGridCell(0,1,0,4), ARight)); StdStrBuf sRegStr, sKeyFile; if (Config.Registered()) { StdStrBuf sRegName, sFirstName, sLastName, sNick; sFirstName.Copy(Config.GetRegistrationData("FirstName")); sLastName.Copy(Config.GetRegistrationData("LastName")); sNick.Copy(Config.GetRegistrationData("Nick")); sRegName.Format("%s %s (%s)", sFirstName.getData(), sLastName.getData(), sNick.getData()); sRegStr.Format(LoadResStr("IDS_PRC_REG"), sRegName.getData()); sKeyFile.Format(LoadResStr("IDS_CTL_KEYFILE")); sKeyFile+=" "; sKeyFile+=Config.GetKeyFilename(); C4GUI::Label *pLbl; AddElement(pLbl = new C4GUI::Label(sRegStr.getData(), caInfo.GetGridCell(0,1,1,4), ARight)); pLbl->SetToolTip(sKeyFile.getData()); AddElement(pLbl = new C4GUI::Label(FormatString("%s %s", LoadResStr("IDS_CTL_CUID"), Config.GetRegistrationData("Cuid")).getData(), caInfo.GetGridCell(0,1,2,4), ARight)); pLbl->SetToolTip(sKeyFile.getData()); AddElement(pWebCodeLbl = new C4GUI::Label("", caInfo.GetGridCell(0,1,3,4), ARight)); pWebCodeLbl ->SetToolTip(sKeyFile.getData()); } else { /*AddElement(new C4GUI::Label(FormatString("%s - %s", "FREEWARE", LoadResStr("IDS_CTL_UNREGISTERED")).getData(), caInfo.GetGridCell(0,1,1,4), ARight));*/ AddElement(new C4GUI::Label("FREEWARE", caInfo.GetGridCell(0,1,1,4), ARight)); AddElement(new C4GUI::Label(Config.GetRegistrationError(), caInfo.GetGridCell(0,1,2,4), ARight)); pWebCodeLbl = NULL; } // webcode-display timer iWebCodeTimer = C4AboutWebCodeShowTime + 1; pSec1Timer = new C4Sec1TimerCallback<C4StartupAboutDlg>(this); OnSec1Timer(); // bottom line buttons C4GUI::ComponentAligner caMain(rcClient, 0,0, true); C4GUI::ComponentAligner caButtons(caMain.GetFromBottom(caMain.GetHeight()*1/8), 0,0, false); C4GUI::CallbackButton<C4StartupAboutDlg> *btn; int32_t iButtonWidth = caButtons.GetInnerWidth() / 4; AddElement(btn = new C4GUI::CallbackButton<C4StartupAboutDlg>(LoadResStr("IDS_BTN_BACK"), caButtons.GetGridCell(0,3,0,1,iButtonWidth,C4GUI_ButtonHgt,true), &C4StartupAboutDlg::OnBackBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_BACKMAIN")); /*if (!Config.Registered()) { AddElement(btn = new C4GUI::CallbackButton<C4StartupAboutDlg>(LoadResStr("IDS_BTN_REGISTERNOW"), caButtons.GetGridCell(1,3,0,1,iButtonWidth,C4GUI_ButtonHgt,true), &C4StartupAboutDlg::OnRegisterBtn)); btn->SetToolTip(LoadResStr("IDS_DESC_GOTOTHEONLINEREGISTRATION")); }*/ #ifdef NETWORK AddElement(btn = new C4GUI::CallbackButton<C4StartupAboutDlg>(LoadResStr("IDS_BTN_CHECKFORUPDATES"), caButtons.GetGridCell(2,3,0,1,iButtonWidth,C4GUI_ButtonHgt,true), &C4StartupAboutDlg::OnUpdateBtn)); btn->SetToolTip(LoadResStr("IDS_DESC_CHECKONLINEFORNEWVERSIONS")); #endif }