usbloadergx/source/prompts/CheckboxPrompt.cpp

244 lines
5.7 KiB
C++
Raw Normal View History

/****************************************************************************
* 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 "CheckboxPrompt.hpp"
#include "themes/CTheme.h"
#include "menu/menus.h"
#include "language/gettext.h"
CheckboxPrompt::CheckboxPrompt(const char * title, const char *msg)
: PromptWindow(title, msg)
{
PromptWindow::AddButton(tr("OK"));
PromptWindow::AddButton(tr("Cancel"));
}
CheckboxPrompt::~CheckboxPrompt()
{
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();
for(u32 i = 0; i < Checkbox.size(); ++i)
{
delete CheckboxTxt[i];
delete Checkbox[i];
}
}
void CheckboxPrompt::OnCheckBoxClick(GuiButton *sender, int chan, const POINT &pointer)
{
sender->ResetState();
}
void CheckboxPrompt::AddCheckBox(const char *text)
{
int size = Checkbox.size();
if(size > 5)
return;
CheckboxTxt.resize(size+1);
Checkbox.resize(size+1);
CheckboxTxt[size] = new GuiText(text, 20, thColor("r=0 g=0 b=0 a=255 - prompt windows text color"));
CheckboxTxt[size]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
CheckboxTxt[size]->SetPosition(30, 0);
Checkbox[size] = new GuiCheckbox(24, 24);
Checkbox[size]->SetLabel(CheckboxTxt[size]);
Checkbox[size]->SetSoundClick(btnSoundClick);
Checkbox[size]->SetSoundOver(btnSoundOver);
Checkbox[size]->SetTrigger(trigA);
Checkbox[size]->Clicked.connect(this, &CheckboxPrompt::OnCheckBoxClick);
Append(Checkbox[size]);
if (Settings.wsprompt && Settings.widescreen)
{
if(size == 0)
{
Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(80, -190);
}
else if(size == 1)
{
Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(80, -150);
}
else if(size == 2)
{
Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(80, -110);
}
else if(size == 3)
{
Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(-210, -190);
}
else if(size == 4)
{
Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(-210, -150);
}
else if(size == 5)
{
Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(-210, -110);
}
}
else
{
if(size == 0)
{
Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(40, -190);
}
else if(size == 1)
{
Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(40, -150);
}
else if(size == 2)
{
Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(40, -110);
}
else if(size == 3)
{
Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(-210, -190);
}
else if(size == 4)
{
Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(-210, -150);
}
else if(size == 5)
{
Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
Checkbox[size]->SetPosition(-210, -110);
}
}
}
int CheckboxPrompt::GetChoice()
{
int choice = PromptWindow::GetChoice();
if(choice == 0)
return CheckedNone;
else if(choice == 1)
{
int ret = 0;
for(u32 i = 0; i < Checkbox.size(); ++i)
{
if(Checkbox[i]->IsChecked())
ret |= 1 << i;
}
return ret;
}
return -2;
}
void CheckboxPrompt::SetChecked(int box, bool checked)
{
if(box < 0 || box >= (int) Checkbox.size())
return;
Checkbox[box]->SetChecked(checked);
}
int CheckboxPrompt::Show(const char *title, const char *msg,
const char *chbx1, const char *chbx2,
const char *chbx3, const char *chbx4,
const char *chbx5, const char *chbx6,
int initChecks)
{
CheckboxPrompt * Window = new CheckboxPrompt(title, msg);
if(chbx1)
{
Window->AddCheckBox(chbx1);
Window->SetChecked(0, initChecks & CheckedBox1);
}
if(chbx2)
{
Window->AddCheckBox(chbx2);
Window->SetChecked(1, initChecks & CheckedBox2);
}
if(chbx3)
{
Window->AddCheckBox(chbx3);
Window->SetChecked(2, initChecks & CheckedBox3);
}
if(chbx4)
{
Window->AddCheckBox(chbx4);
Window->SetChecked(3, initChecks & CheckedBox4);
}
if(chbx5)
{
Window->AddCheckBox(chbx5);
Window->SetChecked(4, initChecks & CheckedBox5);
}
if(chbx6)
{
Window->AddCheckBox(chbx6);
Window->SetChecked(5, initChecks & CheckedBox6);
}
mainWindow->SetState(STATE_DISABLED);
mainWindow->Append(Window);
mainWindow->ChangeFocus(Window);
int choice = -2;
while (choice == -2)
{
usleep(100);
if (shutdown)
Sys_Shutdown();
if (reset)
Sys_Reboot();
choice = Window->GetChoice();
}
delete Window;
mainWindow->SetState(STATE_DEFAULT);
return choice;
}