mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-05 11:05:06 +01:00
250 lines
7.8 KiB
C++
250 lines
7.8 KiB
C++
|
/****************************************************************************
|
||
|
* Copyright (C) 2010
|
||
|
* by Dimok
|
||
|
*
|
||
|
* This software is provided 'as-is', without any express or implied
|
||
|
* warranty. In no event will the authors be held liable for any
|
||
|
* damages arising from the use of this software.
|
||
|
*
|
||
|
* Permission is granted to anyone to use this software for any
|
||
|
* purpose, including commercial applications, and to alter it and
|
||
|
* redistribute it freely, subject to the following restrictions:
|
||
|
*
|
||
|
* 1. The origin of this software must not be misrepresented; you
|
||
|
* must not claim that you wrote the original software. If you use
|
||
|
* this software in a product, an acknowledgment in the product
|
||
|
* documentation would be appreciated but is not required.
|
||
|
*
|
||
|
* 2. Altered source versions must be plainly marked as such, and
|
||
|
* must not be misrepresented as being the original software.
|
||
|
*
|
||
|
* 3. This notice may not be removed or altered from any source
|
||
|
* distribution.
|
||
|
***************************************************************************/
|
||
|
#include <unistd.h>
|
||
|
#include "PromptWindow.hpp"
|
||
|
#include "menu/menus.h"
|
||
|
#include "settings/CSettings.h"
|
||
|
#include "themes/CTheme.h"
|
||
|
|
||
|
PromptWindow::PromptWindow(const char *title, const char *msg)
|
||
|
: GuiWindow(472, 320)
|
||
|
{
|
||
|
SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
||
|
SetPosition(0, -10);
|
||
|
|
||
|
btnOutline = Resources::GetImageData("button_dialogue_box.png");
|
||
|
dialogBox = Resources::GetImageData("dialogue_box.png");
|
||
|
|
||
|
width = dialogBox->GetWidth();
|
||
|
height = dialogBox->GetHeight();
|
||
|
|
||
|
trigA = new GuiTrigger;
|
||
|
trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
||
|
trigB = new GuiTrigger;
|
||
|
trigB->SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
||
|
|
||
|
dialogBoxImg = new GuiImage(dialogBox);
|
||
|
if(Settings.wsprompt)
|
||
|
dialogBoxImg->SetWidescreen(Settings.widescreen);
|
||
|
Append(dialogBoxImg);
|
||
|
|
||
|
titleTxt = new GuiText(title, 26, thColor("r=0 g=0 b=0 a=255 - prompt windows text color"));
|
||
|
titleTxt->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
||
|
titleTxt->SetPosition(0, 55);
|
||
|
if(Settings.wsprompt && Settings.widescreen)
|
||
|
titleTxt->SetMaxWidth(width-140, DOTTED);
|
||
|
else
|
||
|
titleTxt->SetMaxWidth(width-40, DOTTED);
|
||
|
Append(titleTxt);
|
||
|
|
||
|
msgTxt = new GuiText(msg, 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color"));
|
||
|
msgTxt->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
||
|
msgTxt->SetPosition(0, -40);
|
||
|
if(Settings.wsprompt && Settings.widescreen)
|
||
|
msgTxt->SetMaxWidth(width-140, WRAP);
|
||
|
else
|
||
|
msgTxt->SetMaxWidth(width-40, WRAP);
|
||
|
Append(msgTxt);
|
||
|
|
||
|
SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
||
|
}
|
||
|
|
||
|
PromptWindow::~PromptWindow()
|
||
|
{
|
||
|
ResumeGui();
|
||
|
|
||
|
SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
||
|
while(parentElement && this->GetEffect() > 0) usleep(100);
|
||
|
|
||
|
HaltGui();
|
||
|
if(parentElement)
|
||
|
((GuiWindow *) parentElement)->Remove(this);
|
||
|
parentElement = NULL;
|
||
|
|
||
|
RemoveAll();
|
||
|
|
||
|
delete btnOutline;
|
||
|
delete dialogBox;
|
||
|
|
||
|
delete trigA;
|
||
|
delete trigB;
|
||
|
|
||
|
delete dialogBoxImg;
|
||
|
|
||
|
delete titleTxt;
|
||
|
delete msgTxt;
|
||
|
|
||
|
for(u32 i = 0; i < Button.size(); ++i)
|
||
|
{
|
||
|
delete ButtonTxt[i];
|
||
|
delete ButtonImg[i];
|
||
|
delete Button[i];
|
||
|
}
|
||
|
|
||
|
ResumeGui();
|
||
|
}
|
||
|
|
||
|
void PromptWindow::PositionButtons()
|
||
|
{
|
||
|
if (Settings.wsprompt && Settings.widescreen)
|
||
|
{
|
||
|
switch(Button.size())
|
||
|
{
|
||
|
default:
|
||
|
break;
|
||
|
case 1:
|
||
|
Button[0]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
||
|
Button[0]->SetPosition(0, -80);
|
||
|
case 2:
|
||
|
Button[0]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
||
|
Button[0]->SetPosition(70, -80);
|
||
|
Button[1]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
||
|
Button[1]->SetPosition(-70, -80);
|
||
|
break;
|
||
|
case 3:
|
||
|
Button[0]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
||
|
Button[0]->SetPosition(70, -120);
|
||
|
Button[1]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
||
|
Button[1]->SetPosition(-70, -120);
|
||
|
Button[2]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
||
|
Button[2]->SetPosition(0, -55);
|
||
|
break;
|
||
|
case 4:
|
||
|
Button[0]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
||
|
Button[0]->SetPosition(70, -120);
|
||
|
Button[1]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
||
|
Button[1]->SetPosition(-70, -120);
|
||
|
Button[2]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
||
|
Button[2]->SetPosition(70, -55);
|
||
|
Button[3]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
||
|
Button[3]->SetPosition(-70, -55);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch(Button.size())
|
||
|
{
|
||
|
default:
|
||
|
break;
|
||
|
case 1:
|
||
|
Button[0]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
||
|
Button[0]->SetPosition(0, -45);
|
||
|
break;
|
||
|
case 2:
|
||
|
Button[0]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
||
|
Button[0]->SetPosition(50, -45);
|
||
|
Button[1]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
||
|
Button[1]->SetPosition(-50, -45);
|
||
|
break;
|
||
|
case 3:
|
||
|
Button[0]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
||
|
Button[0]->SetPosition(50, -120);
|
||
|
Button[1]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
||
|
Button[1]->SetPosition(-50, -120);
|
||
|
Button[2]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
||
|
Button[2]->SetPosition(0, -65);
|
||
|
break;
|
||
|
case 4:
|
||
|
Button[0]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
||
|
Button[0]->SetPosition(50, -120);
|
||
|
Button[1]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
||
|
Button[1]->SetPosition(-50, -120);
|
||
|
Button[2]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
||
|
Button[2]->SetPosition(50, -65);
|
||
|
Button[3]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
||
|
Button[3]->SetPosition(-50, -65);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void PromptWindow::AddButton(const char *text)
|
||
|
{
|
||
|
int size = Button.size();
|
||
|
if(size > 3)
|
||
|
return;
|
||
|
|
||
|
ButtonTxt.resize(size+1);
|
||
|
ButtonImg.resize(size+1);
|
||
|
Button.resize(size+1);
|
||
|
|
||
|
ButtonTxt[size] = new GuiText(text, 20, thColor("r=0 g=0 b=0 a=255 - prompt windows text color"));
|
||
|
ButtonImg[size] = new GuiImage(btnOutline);
|
||
|
if (Settings.wsprompt)
|
||
|
{
|
||
|
ButtonTxt[size]->SetWidescreen(Settings.widescreen);
|
||
|
ButtonImg[size]->SetWidescreen(Settings.widescreen);
|
||
|
}
|
||
|
|
||
|
Button[size] = new GuiButton(ButtonImg[size], ButtonImg[size], 0, 3, 0, 0, trigA, btnSoundOver, btnSoundClick2, 1);
|
||
|
Button[size]->SetLabel(ButtonTxt[size]);
|
||
|
Button[size]->SetState(STATE_SELECTED);
|
||
|
Button[size]->SetTrigger(1, trigB);
|
||
|
Append(Button[size]);
|
||
|
|
||
|
if(size > 0)
|
||
|
Button[size-1]->SetTrigger(1, NULL);
|
||
|
|
||
|
PositionButtons();
|
||
|
}
|
||
|
|
||
|
void PromptWindow::RemoveButton()
|
||
|
{
|
||
|
Remove(Button[Button.size()-1]);
|
||
|
|
||
|
delete ButtonTxt[ButtonTxt.size()-1];
|
||
|
delete ButtonImg[ButtonImg.size()-1];
|
||
|
delete Button[Button.size()-1];
|
||
|
|
||
|
ButtonTxt.pop_back();
|
||
|
ButtonImg.pop_back();
|
||
|
Button.pop_back();
|
||
|
|
||
|
if(ButtonImg.size() > 0)
|
||
|
Button[ButtonImg.size()-1]->SetTrigger(1, trigB);
|
||
|
|
||
|
PositionButtons();
|
||
|
}
|
||
|
|
||
|
void PromptWindow::RemoveButton(int i)
|
||
|
{
|
||
|
if(i >= 0 && i < (int) Button.size())
|
||
|
Remove(Button[i]);
|
||
|
}
|
||
|
|
||
|
int PromptWindow::GetChoice()
|
||
|
{
|
||
|
for(u32 i = 0; i < Button.size(); ++i)
|
||
|
{
|
||
|
if(Button[i]->GetState() == STATE_CLICKED)
|
||
|
{
|
||
|
Button[i]->ResetState();
|
||
|
return (i+1 != Button.size()) ? i+1 : 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|