void Screen::ShowBadError(const char *msg) { fprintf(stderr, "%s", msg); baseContainer->HideChildren(); Gui::Fixed *f = new Gui::Fixed(6*GetWidth()/8, 6*GetHeight()/8); Gui::Screen::AddBaseWidget(f, GetWidth()/8, GetHeight()/8); f->SetTransparency(false); f->SetBgColor(0.4,0,0,1.0); f->Add(new Gui::Label(msg), 10, 10); Gui::Button *okButton = new Gui::LabelButton(new Gui::Label("Ok")); okButton->SetShortcut(SDLK_RETURN, KMOD_NONE); f->Add(okButton, 10, 6*GetHeight()/8 - 32); f->ShowAll(); f->Show(); do { Gui::MainLoopIteration(); SDL_Delay(10); } while (!okButton->IsPressed()); Gui::Screen::RemoveBaseWidget(f); delete f; baseContainer->ShowAll(); }
void Screen::ShowBadError(const char *msg) { // to make things simple for ourselves, we want to hide all the existing widgets // however, if we do it through baseContainer->HideChildren() then we lose track of // which widgets should be shown again when the red-screen is cleared. // So to avoid this problem we don't hide anything, we just temporarily swap to // a different base container which is just used for this red-screen Gui::Fixed *oldBaseContainer = Screen::baseContainer; Screen::baseContainer = new Gui::Fixed(); Screen::baseContainer->SetSize(float(Screen::width), float(Screen::height)); Screen::baseContainer->Show(); Gui::Fixed *f = new Gui::Fixed(6*GetWidth()/8.0f, 6*GetHeight()/8.0f); Gui::Screen::AddBaseWidget(f, GetWidth()/8, GetHeight()/8); f->SetTransparency(false); f->SetBgColor(0.4f,0,0,1.0f); f->Add(new Gui::Label(msg, TextLayout::ColourMarkupNone), 10, 10); Gui::Button *okButton = new Gui::LabelButton(new Gui::Label("Ok")); okButton->SetShortcut(SDLK_RETURN, KMOD_NONE); f->Add(okButton, 10.0f, 6*GetHeight()/8.0f - 32); f->ShowAll(); f->Show(); do { Gui::MainLoopIteration(); SDL_Delay(10); } while (!okButton->IsPressed()); delete f; // Gui::Fixed does a horrible thing and calls Gui::Screen::RemoveBaseWidget(this) in its destructor delete Screen::baseContainer; Screen::baseContainer = oldBaseContainer; }
Viewer(): Gui::Fixed(float(g_width), float(g_height)) { m_model = 0; m_cmesh = 0; m_geom = 0; m_space = new CollisionSpace(); m_showBoundingRadius = false; Gui::Screen::AddBaseWidget(this, 0, 0); SetTransparency(true); m_trisReadout = new Gui::Label(""); Add(m_trisReadout, 500, 0); { Gui::Button *b = new Gui::SolidButton(); b->SetShortcut(SDLK_c, KMOD_NONE); b->onClick.connect(sigc::mem_fun(*this, &Viewer::OnClickChangeView)); Add(b, 10, 10); Add(new Gui::Label("[c] Change view (normal, collision mesh"), 30, 10); } { Gui::Button *b = new Gui::SolidButton(); b->SetShortcut(SDLK_r, KMOD_NONE); b->onClick.connect(sigc::mem_fun(*this, &Viewer::OnResetAdjustments)); Add(b, 10, 30); Add(new Gui::Label("[r] Reset thruster and anim sliders"), 30, 30); } { Gui::Button *b = new Gui::SolidButton(); b->SetShortcut(SDLK_m, KMOD_NONE); b->onClick.connect(sigc::mem_fun(*this, &Viewer::OnClickRebuildCollMesh)); Add(b, 10, 50); Add(new Gui::Label("[m] Rebuild collision mesh"), 30, 50); } { Gui::Button *b = new Gui::SolidButton(); b->SetShortcut(SDLK_p, KMOD_NONE); b->onClick.connect(sigc::mem_fun(*this, &Viewer::OnClickToggleBenchmark)); Add(b, 10, 70); Add(new Gui::Label("[p] Toggle performance test (renders models 1000 times per frame)"), 30, 70); } { Gui::Button *b = new Gui::SolidButton(); b->SetShortcut(SDLK_b, KMOD_LSHIFT); b->onClick.connect(sigc::mem_fun(*this, &Viewer::OnToggleBoundingRadius)); Add(b, 10, 90); Add(new Gui::Label("[shift-b] Visualize bounding radius"), 30, 90); } #if 0 { Gui::Button *b = new Gui::SolidButton(); b->SetShortcut(SDLK_g, KMOD_NONE); b->onClick.connect(sigc::mem_fun(*this, &Viewer::OnToggleGearState)); Add(b, 10, 30); Add(new Gui::Label("[g] Toggle gear state"), 30, 30); } #endif /* 0 */ { Add(new Gui::Label("Linear thrust"), 0, Gui::Screen::GetHeight()-140.0f); for (int i=0; i<3; i++) { m_linthrust[i] = new Gui::Adjustment(); m_linthrust[i]->SetValue(0.5); Gui::VScrollBar *v = new Gui::VScrollBar(); v->SetAdjustment(m_linthrust[i]); Add(v, float(i*25), Gui::Screen::GetHeight()-120.0f); } Add(new Gui::Label("Angular thrust"), 100, Gui::Screen::GetHeight()-140.0f); for (int i=0; i<3; i++) { m_angthrust[i] = new Gui::Adjustment(); m_angthrust[i]->SetValue(0.5); Gui::VScrollBar *v = new Gui::VScrollBar(); v->SetAdjustment(m_angthrust[i]); Add(v, float(100 + i*25), Gui::Screen::GetHeight()-120.0f); } Add(new Gui::Label("Animations (0 gear, 1-4 are time - ignore them comrade)"), 200, Gui::Screen::GetHeight()-140.0f); for (int i=0; i<LMR_ARG_MAX; i++) { Gui::Fixed *box = new Gui::Fixed(32.0f, 120.0f); Add(box, float(200 + i*25), Gui::Screen::GetHeight()-120.0f); m_anim[i] = new Gui::Adjustment(); m_anim[i]->SetValue(0); Gui::VScrollBar *v = new Gui::VScrollBar(); v->SetAdjustment(m_anim[i]); box->Add(v, 0, 42.0f); char buf[32]; snprintf(buf, sizeof(buf), "%d", i); box->Add(new Gui::Label(buf), 0, 0); m_animEntry[i] = new Gui::TextEntry(); box->Add(m_animEntry[i], 0, 16.0f); m_anim[i]->onValueChanged.connect(sigc::bind(sigc::mem_fun(this, &Viewer::OnAnimChange), m_anim[i], m_animEntry[i])); OnAnimChange(m_anim[i], m_animEntry[i]); } } ShowAll(); Show(); }