Initial commit of Dink Smallwood HD source. See the "Programmer readme.txt" for information on how to set it up.
git-svn-id: svn://rtsoft.com/rtsvn/projects/RTDink@1469 353e56fe-9613-0410-8469-b96ad8e6f29c
This commit is contained in:
parent
dfbc2348a5
commit
d4f66a5d2e
115 changed files with 37737 additions and 0 deletions
251
source/GUI/PopUpMenu.cpp
Normal file
251
source/GUI/PopUpMenu.cpp
Normal file
|
@ -0,0 +1,251 @@
|
|||
#include "PlatformPrecomp.h"
|
||||
#include "PopUpMenu.h"
|
||||
#include "Entity/EntityUtils.h"
|
||||
#include "App.h"
|
||||
|
||||
Entity * PopUpRestoreFocusToOriginalMenu(Entity *pEntClicked)
|
||||
{
|
||||
Entity *pFinishMenu = GetEntityRoot()->GetEntityByName(pEntClicked->GetParent()->GetParent()->GetVar("finishMenuName")->GetString());
|
||||
assert(pFinishMenu);
|
||||
|
||||
if (pFinishMenu)
|
||||
{
|
||||
if (pEntClicked->GetParent()->GetParent()->GetVar("requireMoveMessages")->GetUINT32() == 1)
|
||||
{
|
||||
AddFocusIfNeeded(pFinishMenu, true, 0);
|
||||
} else
|
||||
{
|
||||
pFinishMenu->AddComponent(new FocusInputComponent);
|
||||
}
|
||||
}
|
||||
return pFinishMenu;
|
||||
}
|
||||
|
||||
void ReloadMainMenu(VariantList *pVList);
|
||||
|
||||
//general purpose pop up menu, I've hardcoded various behaviors here, it knows what to do based on the button name
|
||||
|
||||
void PopUpMenuOnSelect(VariantList *pVList) //0=vec2 point of click, 1=entity sent from
|
||||
{
|
||||
Entity *pEntClicked = pVList->m_variant[1].GetEntity();
|
||||
|
||||
LogMsg("Clicked %s entity at %s", pEntClicked->GetName().c_str(),pVList->m_variant[1].Print().c_str());
|
||||
|
||||
FadeOutEntity(pEntClicked->GetParent()->GetParent(), true, 300);
|
||||
GetMessageManager()->CallEntityFunction(pEntClicked->GetParent()->GetParent(), 500, "OnDelete", NULL);
|
||||
DisableAllButtonsEntity(pEntClicked->GetParent()->GetParent());
|
||||
Entity *pDarken = GetEntityRoot()->GetEntityByName("pop_up_darken");
|
||||
|
||||
FadeScreen(pDarken, 0, 0, 400, true);
|
||||
KillEntity(pDarken, 400);
|
||||
pDarken->SetName("");
|
||||
|
||||
//set the game pause state back to whatever it was originally
|
||||
GetApp()->SetGameTickPause(pEntClicked->GetParent()->GetParent()->GetVar("gamePaused")->GetUINT32() != 0);
|
||||
|
||||
|
||||
if (pEntClicked->GetName() == "url")
|
||||
{
|
||||
LogMsg("Launch url: %s", pEntClicked->GetVar("url")->GetString().c_str());
|
||||
LaunchURL(pEntClicked->GetVar("url")->GetString());
|
||||
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
||||
} else if (pEntClicked->GetName() == "url_update")
|
||||
{
|
||||
LogMsg("Launch url: %s", pEntClicked->GetVar("url")->GetString().c_str());
|
||||
LaunchURL(pEntClicked->GetVar("url")->GetString());
|
||||
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
||||
//kill current menu
|
||||
//GetMessageManager()->CallEntityFunction(pFinishMenu, 200, "OnDelete", NULL);
|
||||
|
||||
PopUpCreate(pFinishMenu, "Please close the game and install the new version!", "", "cancel", "", "", "", true);
|
||||
|
||||
}
|
||||
else
|
||||
|
||||
/*
|
||||
if (pEntClicked->GetName() == "music_disable")
|
||||
{
|
||||
//add control back
|
||||
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
||||
|
||||
GetApp()->GetShared()->GetVar("musicDisabled")->Set(uint32(1));
|
||||
GetAudioManager()->SetMusicEnabled(false);
|
||||
|
||||
string msg = "Music disabled. You can re-enable it from the `wOptions`` menu later.";
|
||||
PopUpCreate(pFinishMenu, msg, "", "cancel", "Continue", "", "", true);
|
||||
GetAudioManager()->Play(GetApp()->GetMainMenuMusic(), true, true); //because music is disabled this won't play, but it will remember this if
|
||||
//we enable music again so we still want it
|
||||
|
||||
} else
|
||||
|
||||
if (pEntClicked->GetName() == "music_on")
|
||||
{
|
||||
//add control back
|
||||
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
||||
GetAudioManager()->Play(GetApp()->GetMainMenuMusic(), true, true);
|
||||
|
||||
} else
|
||||
|
||||
if (pEntClicked->GetName() == "quit_game")
|
||||
{
|
||||
|
||||
Entity *pGameMenu = GetEntityRoot()->GetEntityByName("GameMenu");
|
||||
|
||||
//GetApp()->SetGameType(GAME_TYPE_NONE);
|
||||
//slide it off the screen and then kill the whole menu tree
|
||||
SlideScreen(pGameMenu, false, 500, 10);
|
||||
GetMessageManager()->CallEntityFunction(pGameMenu, 900, "OnDelete", NULL);
|
||||
//SummaryMenuCreate(pGameMenu->GetParent());
|
||||
GetBaseApp()->SetGameTickPause(false);
|
||||
|
||||
|
||||
} else
|
||||
*/
|
||||
|
||||
if (pEntClicked->GetName() == "cancel")
|
||||
{
|
||||
//add control back
|
||||
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
||||
}if (pEntClicked->GetName() == "cancel_update")
|
||||
{
|
||||
//add control back
|
||||
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
||||
//kill current menu
|
||||
GetMessageManager()->CallEntityFunction(pFinishMenu, 100, "OnDelete", NULL);
|
||||
|
||||
VariantList vList(pFinishMenu->GetParent());
|
||||
GetMessageManager()->CallStaticFunction(ReloadMainMenu, 200, &vList, TIMER_SYSTEM);
|
||||
}
|
||||
else
|
||||
|
||||
if (pEntClicked->GetName() == "reset")
|
||||
{
|
||||
//add control back
|
||||
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
||||
GetAudioManager()->Play("audio/tip_start.wav");
|
||||
//GetHighScoreManager()->ResetLocalScores();
|
||||
//belay that order, show another pop up...
|
||||
PopUpCreate(pFinishMenu, "Local high scores have been reset.", "", "cancel", "Continue", "", "", true);
|
||||
|
||||
} else
|
||||
{
|
||||
//unhandled
|
||||
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
||||
|
||||
//call this function on the original guy, just in case they want to do something with it
|
||||
VariantList vList(pFinishMenu, pEntClicked->GetName());
|
||||
pFinishMenu->GetFunction(pEntClicked->GetName())->sig_function(&vList);
|
||||
|
||||
}
|
||||
|
||||
GetEntityRoot()->PrintTreeAsText(); //useful for debugging
|
||||
}
|
||||
|
||||
void PopUpCreate(Entity *pEnt, string msg, string url, string button1Action, string button1Label, string button2Action, string button2Label,
|
||||
bool bRequireMoveMessages, string button3Action, string button3Label)
|
||||
{
|
||||
pEnt->RemoveComponentByName("FocusInput");
|
||||
|
||||
bool bGamePaused = GetBaseApp()->GetGameTickPause();
|
||||
GetBaseApp()->SetGameTickPause(true);
|
||||
// GetMessageManager()->RemoveComponentByName(pEnt, 201, "FocusInput"); //hack that works around a problem of pending FocusInput messages coming in
|
||||
|
||||
//remember where we should give focus to later
|
||||
string parentName = pEnt->GetName();
|
||||
assert(!parentName.empty());
|
||||
|
||||
//let's build our own menu right on the GUI branch of the tree
|
||||
pEnt = GetEntityRoot()->GetEntityByName("GUI");
|
||||
Entity *pDarken = pEnt->AddEntity(new Entity("pop_up_darken"));
|
||||
pDarken->AddComponent(new FocusRenderComponent);
|
||||
pDarken->AddComponent(new FocusUpdateComponent);
|
||||
FadeScreen(pDarken, 0, 0.7, 400, false); //fade the whole GUI
|
||||
|
||||
//add our prompt
|
||||
Entity *pBG = CreateOverlayEntity(pEnt, "pop_up", ReplaceWithLargeInFileName("interface/iphone/pop_up.rttex"), 0,0);
|
||||
|
||||
//Ok, at this point we can check the image dimensions and center it based on the bitmap size itself
|
||||
pBG->GetVar("pos2d")->Set( (GetScreenSize()/2) - pBG->GetVar("size2d")->GetVector2()/2);
|
||||
|
||||
// pBG->AddComponent(new FocusInputComponent);
|
||||
pBG->GetVar("finishMenuName")->Set(parentName);
|
||||
|
||||
if (bRequireMoveMessages)
|
||||
{
|
||||
pBG->GetVar("requireMoveMessages")->Set(uint32(1));
|
||||
}
|
||||
|
||||
AddFocusIfNeeded(pBG);
|
||||
CL_Vec2f vTextArea = pBG->GetVar("size2d")->GetVector2();
|
||||
float padding = 30;
|
||||
vTextArea.x -= iPhoneMapX2X(padding*2);
|
||||
|
||||
//add our msg and word wrap it
|
||||
Entity *pText = CreateTextBoxEntity(pBG, "pop_up_text", (pBG->GetVar("size2d")->GetVector2()/2)+CL_Vec2f(0, iPhoneMapY2X(-17)), vTextArea, msg);
|
||||
SetAlignmentEntity(pText, ALIGNMENT_CENTER);
|
||||
float textHeight = pText->GetVar("size2d")->GetVector2().y;
|
||||
|
||||
FadeInEntity(pBG, true, 300);
|
||||
|
||||
//pText->GetVar("color")->Set(MAKE_RGBA(203,177,137,255));
|
||||
|
||||
pBG->GetVar("gamePaused")->Set(uint32(bGamePaused != 0)); //remember this for later
|
||||
Entity *pButton = NULL;
|
||||
CL_Vec2f vButtonSize;
|
||||
Entity *pLabel;
|
||||
Entity *pButton1, *pButton2;
|
||||
|
||||
float buttonHeight = iPhoneMapY2X(120);
|
||||
if (textHeight > iPhoneMapY2X(50))
|
||||
{
|
||||
//well, we need more space for this much text. Move the buttons down a bit.
|
||||
buttonHeight = iPhoneMapY2X(135);
|
||||
}
|
||||
//add the buttons
|
||||
pButton = CreateOverlayEntity(pBG, "button1", ReplaceWithLargeInFileName("interface/iphone/pop_up_button.rttex"), iPhoneMapX2X(21), buttonHeight);
|
||||
pButton1 = pButton;
|
||||
vButtonSize = pButton->GetVar("size2d")->GetVector2();
|
||||
//add the text label
|
||||
pLabel = CreateTextButtonEntity(pButton, button1Action, vButtonSize.x/2, vButtonSize.y/2, "`w"+button1Label, false);
|
||||
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
||||
pLabel->GetFunction("OnButtonSelected")->sig_function.connect(&PopUpMenuOnSelect);
|
||||
pLabel->GetVar("url")->Set(url); //just in case we want to know this later, store it in the button itself
|
||||
FadeInEntity(pButton, true, 300, 250);
|
||||
if (button2Label.empty())
|
||||
{
|
||||
//we only have one button? Fine, center it.
|
||||
pButton->GetVar("pos2d")->Set(iPhoneMapX(88), buttonHeight);
|
||||
} else
|
||||
{
|
||||
pButton = CreateOverlayEntity(pBG, "button2", ReplaceWithLargeInFileName("interface/iphone/pop_up_button.rttex"), iPhoneMapY2X(180), buttonHeight);
|
||||
pButton2 = pButton;
|
||||
vButtonSize = pButton->GetVar("size2d")->GetVector2();
|
||||
//add the text label
|
||||
pLabel = CreateTextButtonEntity(pButton, button2Action, vButtonSize.x/2, vButtonSize.y/2, "`w"+button2Label, false);
|
||||
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
||||
pLabel->GetFunction("OnButtonSelected")->sig_function.connect(&PopUpMenuOnSelect);
|
||||
pLabel->GetVar("url")->Set(url); //just in case we want to know this later, store it in the button itself
|
||||
FadeInEntity(pButton, true, 300, 350);
|
||||
|
||||
if (button3Label.empty())
|
||||
{
|
||||
//we only have two buttons? fine. Done then
|
||||
} else
|
||||
{
|
||||
pButton1->GetVar("pos2d")->Set(iPhoneMapX2X(20), buttonHeight);
|
||||
pButton2->GetVar("pos2d")->Set(iPhoneMapX2X(180), buttonHeight);
|
||||
|
||||
//move stuff around and add a third button
|
||||
pButton = CreateOverlayEntity(pBG, "button2", ReplaceWithLargeInFileName("interface/iphone/pop_up_button.rttex"), iPhoneMapX2X(100), buttonHeight);
|
||||
vButtonSize = pButton->GetVar("size2d")->GetVector2();
|
||||
//add the text label
|
||||
pLabel = CreateTextButtonEntity(pButton, button3Action, vButtonSize.x/2, vButtonSize.y/2, "`w"+button3Label, false);
|
||||
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
||||
pLabel->GetFunction("OnButtonSelected")->sig_function.connect(&PopUpMenuOnSelect);
|
||||
pLabel->GetVar("url")->Set(url); //just in case we want to know this later, store it in the button itself
|
||||
FadeInEntity(pButton, true, 300, 450);
|
||||
}
|
||||
}
|
||||
|
||||
GetEntityRoot()->PrintTreeAsText(); //useful for debugging
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue