/**************************************************************************** * 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 #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; }