void SystemInfoView::OnBodyViewed(SystemBody *b) { std::string desc, data; m_infoBox->DeleteAllChildren(); Gui::Fixed *outer = new Gui::Fixed(600, 200); m_infoBox->PackStart(outer); Gui::VBox *col1 = new Gui::VBox(); Gui::VBox *col2 = new Gui::VBox(); outer->Add(col1, 0, 0); outer->Add(col2, 300, 0); #define _add_label_and_value(label, value) { \ Gui::Label *l = (new Gui::Label(label))->Color(255,255,0); \ col1->PackEnd(l); \ l = (new Gui::Label(value))->Color(255,255,0); \ col2->PackEnd(l); \ } bool multiple = (b->GetSuperType() == SystemBody::SUPERTYPE_STAR && b->GetParent() && b->GetParent()->GetType() == SystemBody::TYPE_GRAVPOINT && b->GetParent()->GetParent()); { Gui::Label *l = new Gui::Label(b->GetName() + ": " + b->GetAstroDescription() + (multiple ? (std::string(" (")+b->GetParent()->GetName() + ")") : "")); l->Color(255,255,0); m_infoBox->PackStart(l); } _add_label_and_value(Lang::MASS, stringf(Lang::N_WHATEVER_MASSES, formatarg("mass", b->GetMassAsFixed().ToDouble()), formatarg("units", std::string(b->GetSuperType() == SystemBody::SUPERTYPE_STAR ? Lang::SOLAR : Lang::EARTH)))); _add_label_and_value(Lang::RADIUS, stringf(Lang::N_WHATEVER_RADII, formatarg("radius", b->GetRadiusAsFixed().ToDouble()), formatarg("units", std::string(b->GetSuperType() == SystemBody::SUPERTYPE_STAR ? Lang::SOLAR : Lang::EARTH)), formatarg("radkm", b->GetRadius() / 1000.0))); if (b->GetSuperType() == SystemBody::SUPERTYPE_STAR) { _add_label_and_value(Lang::EQUATORIAL_RADIUS_TO_POLAR_RADIUS_RATIO, stringf("%0{f.3}", b->GetAspectRatio())); } if (b->GetType() != SystemBody::TYPE_STARPORT_ORBITAL) { _add_label_and_value(Lang::SURFACE_TEMPERATURE, stringf(Lang::N_CELSIUS, formatarg("temperature", b->GetAverageTemp()-273))); _add_label_and_value(Lang::SURFACE_GRAVITY, stringf("%0{f.3} m/s^2", b->CalcSurfaceGravity())); } if (b->GetParent()) { float days = float(b->GetOrbit().Period()) / float(60*60*24); if (days > 1000) { data = stringf(Lang::N_YEARS, formatarg("years", days/365)); } else { data = stringf(Lang::N_DAYS, formatarg("days", b->GetOrbit().Period() / (60*60*24))); } if (multiple) { float pdays = float(b->GetParent()->GetOrbit().Period()) /float(60*60*24); data += " (" + (pdays > 1000 ? stringf(Lang::N_YEARS, formatarg("years", pdays/365)) : stringf(Lang::N_DAYS, formatarg("days", b->GetParent()->GetOrbit().Period() / (60*60*24)))) + ")"; } _add_label_and_value(Lang::ORBITAL_PERIOD, data); _add_label_and_value(Lang::PERIAPSIS_DISTANCE, format_distance(b->GetOrbMin()*AU, 3) + (multiple ? (std::string(" (") + format_distance(b->GetParent()->GetOrbMin()*AU, 3)+ ")") : "")); _add_label_and_value(Lang::APOAPSIS_DISTANCE, format_distance(b->GetOrbMax()*AU, 3) + (multiple ? (std::string(" (") + format_distance(b->GetParent()->GetOrbMax()*AU, 3)+ ")") : "")); _add_label_and_value(Lang::ECCENTRICITY, stringf("%0{f.2}", b->GetOrbit().GetEccentricity()) + (multiple ? (std::string(" (") + stringf("%0{f.2}", b->GetParent()->GetOrbit().GetEccentricity()) + ")") : "")); if (b->GetType() != SystemBody::TYPE_STARPORT_ORBITAL) { _add_label_and_value(Lang::AXIAL_TILT, stringf(Lang::N_DEGREES, formatarg("angle", b->GetAxialTilt() * (180.0/M_PI)))); if (b->IsRotating()) { _add_label_and_value( std::string(Lang::DAY_LENGTH)+std::string(Lang::ROTATIONAL_PERIOD), stringf(Lang::N_EARTH_DAYS, formatarg("days", b->GetRotationPeriodInDays()))); } } int numSurfaceStarports = 0; std::string nameList; for (const SystemBody* kid : b->GetChildren()) { if (kid->GetType() == SystemBody::TYPE_STARPORT_SURFACE) { nameList += (numSurfaceStarports ? ", " : "") + kid->GetName(); numSurfaceStarports++; } } if (numSurfaceStarports) { _add_label_and_value(Lang::STARPORTS, nameList); } } m_infoBox->ShowAll(); m_infoBox->ResizeRequest(); }
void SystemInfoView::OnBodyViewed(SBody *b) { std::string desc, data; m_infoBox->DeleteAllChildren(); Gui::Fixed *outer = new Gui::Fixed(600, 200); m_infoBox->PackStart(outer); Gui::VBox *col1 = new Gui::VBox(); Gui::VBox *col2 = new Gui::VBox(); outer->Add(col1, 0, 0); outer->Add(col2, 300, 0); #define _add_label_and_value(label, value) { \ Gui::Label *l = (new Gui::Label(label))->Color(1.0f,1.0f,0.0f); \ col1->PackEnd(l); \ l = (new Gui::Label(value))->Color(1.0f,1.0f,0.0f); \ col2->PackEnd(l); \ } { Gui::Label *l = new Gui::Label(b->name + ": " + b->GetAstroDescription()); l->Color(1,1,0); m_infoBox->PackStart(l); } _add_label_and_value(Lang::MASS, stringf(Lang::N_WHATEVER_MASSES, formatarg("mass", b->mass.ToDouble()), formatarg("units", std::string(b->GetSuperType() == SBody::SUPERTYPE_STAR ? Lang::SOLAR : Lang::EARTH)))); if (b->type != SBody::TYPE_STARPORT_ORBITAL) { _add_label_and_value(Lang::SURFACE_TEMPERATURE, stringf(Lang::N_CELSIUS, formatarg("temperature", b->averageTemp-273))); _add_label_and_value(Lang::SURFACE_GRAVITY, stringf("%0{f.3} m/s^2", b->CalcSurfaceGravity())); } if (b->parent) { float days = float(b->orbit.period) / float(60*60*24); if (days > 1000) { data = stringf(Lang::N_YEARS, formatarg("years", days/365)); } else { data = stringf(Lang::N_DAYS, formatarg("days", b->orbit.period / (60*60*24))); } _add_label_and_value(Lang::ORBITAL_PERIOD, data); _add_label_and_value(Lang::PERIAPSIS_DISTANCE, stringf("%0{f.3} AU", b->orbMin.ToDouble())); _add_label_and_value(Lang::APOAPSIS_DISTANCE, stringf("%0{f.3} AU", b->orbMax.ToDouble())); _add_label_and_value(Lang::ECCENTRICITY, stringf("%0{f.2}", b->orbit.eccentricity)); if (b->type != SBody::TYPE_STARPORT_ORBITAL) { _add_label_and_value(Lang::AXIAL_TILT, stringf(Lang::N_DEGREES, formatarg("angle", b->axialTilt.ToDouble() * (180.0/M_PI)))); if (b->rotationPeriod != 0) { _add_label_and_value( std::string(Lang::DAY_LENGTH)+std::string(Lang::ROTATIONAL_PERIOD), stringf(Lang::N_EARTH_DAYS, formatarg("days", b->rotationPeriod.ToDouble()))); } } int numSurfaceStarports = 0; std::string nameList; for (std::vector<SBody*>::iterator i = b->children.begin(); i != b->children.end(); ++i) { if ((*i)->type == SBody::TYPE_STARPORT_SURFACE) { nameList += (numSurfaceStarports ? ", " : "") + (*i)->name; numSurfaceStarports++; } } if (numSurfaceStarports) { _add_label_and_value(Lang::STARPORTS, nameList); } } m_infoBox->ShowAll(); m_infoBox->ResizeRequest(); }
SpaceStationView::SpaceStationView(): View() { Gui::Label *l = new Gui::Label(Lang::COMMS_LINK); l->Color(1,.7f,0); m_rightRegion2->Add(l, 10, 0); SetTransparency(false); m_title = new Gui::Label(""); Add(m_title, 10, 10); m_statusBox = new Gui::Fixed(300, 300); Add(m_statusBox, 10, 350); const float YSEP = Gui::Screen::GetFontHeight() * 1.2f; m_statusBox->Add(new Gui::Label(std::string("#007")+std::string(Lang::CASH)), 0, 0); m_statusBox->Add(new Gui::Label(std::string("#007")+std::string(Lang::LEGAL_STATUS)), 0, 2*YSEP); m_statusBox->Add(new Gui::Label(std::string("#007")+std::string(Lang::USED)), 130, 4*YSEP); m_statusBox->Add(new Gui::Label(std::string("#007")+std::string(Lang::FREE)), 210, 4*YSEP); m_statusBox->Add(new Gui::Label(std::string("#007")+std::string(Lang::CARGO_SPACE)), 0, 5*YSEP); m_statusBox->Add(new Gui::Label(std::string("#007")+std::string(Lang::SHIP_EQUIPMENT)), 0, 6*YSEP); m_statusBox->Add(new Gui::Label(std::string("#007")+std::string(Lang::CABINS)), 0, 7*YSEP); m_money = new Gui::Label(""); m_statusBox->Add(m_money, 210, 0); m_cargoSpaceUsed = new Gui::Label(""); m_statusBox->Add(m_cargoSpaceUsed, 130, 5*YSEP); m_cargoSpaceFree = new Gui::Label(""); m_statusBox->Add(m_cargoSpaceFree, 210, 5*YSEP); m_equipmentMass = new Gui::Label(""); m_statusBox->Add(m_equipmentMass, 130, 6*YSEP); m_cabinsUsed = new Gui::Label(""); m_statusBox->Add(m_cabinsUsed, 130, 7*YSEP); m_cabinsFree = new Gui::Label(""); m_statusBox->Add(m_cabinsFree, 210, 7*YSEP); m_legalstatus = new Gui::Label(Lang::CLEAN); m_statusBox->Add(m_legalstatus, 210, 2*YSEP); m_formStack = new Gui::Stack(); m_formController = new FormController(m_formStack); m_formController->onRefresh.connect(sigc::mem_fun(this, &SpaceStationView::RefreshForForm)); m_backButtonBox = new Gui::HBox(); m_backButtonBox->SetSpacing(4.0f); Add(m_backButtonBox, 680, 470); Gui::SolidButton *b = new Gui::SolidButton(); b->onClick.connect(sigc::mem_fun(m_formController, &FormController::CloseForm)); m_backButtonBox->PackEnd(b); m_backButtonBox->PackEnd(new Gui::Label(Lang::GO_BACK)); m_videoLink = 0; m_undockConnection = Pi::player->onUndock.connect(sigc::mem_fun(m_formStack, &Gui::Stack::Clear)); }
GameMenuView::GameMenuView(): View() { Gui::Tabbed *tabs = new Gui::Tabbed(); Add(tabs, 0, 0); Gui::Fixed *mainTab = new Gui::Fixed(800, 600); tabs->AddPage(new Gui::Label(Lang::SIGHTS_SOUNDS_SAVES), mainTab); mainTab->Add((new Gui::Label(Lang::PIONEER))->Shadow(true), 350, 10); SetTransparency(false); Gui::Label *l = new Gui::Label(Lang::PIONEER); l->Color(1,.7f,0); m_rightRegion2->Add(l, 10, 0); { Gui::Box *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); mainTab->Add(hbox, 20, 30); m_saveButton = new Gui::LabelButton(new Gui::Label(Lang::SAVE_THE_GAME)); m_saveButton->SetShortcut(SDLK_s, KMOD_NONE); m_saveButton->onClick.connect(sigc::mem_fun(this, &GameMenuView::OpenSaveDialog)); hbox->PackEnd(m_saveButton); m_loadButton = new Gui::LabelButton(new Gui::Label(Lang::LOAD_A_GAME)); m_loadButton->onClick.connect(sigc::mem_fun(this, &GameMenuView::OpenLoadDialog)); m_loadButton->SetShortcut(SDLK_l, KMOD_NONE); hbox->PackEnd(m_loadButton); m_exitButton = new Gui::LabelButton(new Gui::Label(Lang::EXIT_THIS_GAME)); m_exitButton->onClick.connect(sigc::mem_fun(this, &GameMenuView::HideAll)); m_exitButton->onClick.connect(sigc::ptr_fun(&Pi::EndGame)); hbox->PackEnd(m_exitButton); m_menuButton = new Gui::LabelButton(new Gui::Label(Lang::RETURN_TO_MENU)); m_menuButton->onClick.connect(sigc::bind(sigc::ptr_fun(&Pi::SetView), static_cast<View*>(0))); mainTab->Add(m_menuButton, 20, 30); } Gui::Box *vbox = new Gui::VBox(); vbox->SetSizeRequest(300, 440); vbox->SetSpacing(5.0); mainTab->Add(vbox, 20, 60); { vbox->PackEnd((new Gui::Label(Lang::WINDOW_OR_FULLSCREEN))->Color(1.0f,1.0f,0.0f)); m_toggleFullscreen = new Gui::ToggleButton(); m_toggleFullscreen->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleFullscreen)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(m_toggleFullscreen); hbox->PackEnd(new Gui::Label(Lang::FULL_SCREEN)); vbox->PackEnd(hbox); vbox->PackEnd((new Gui::Label(Lang::OTHER_GRAPHICS_SETTINGS))->Color(1.0f,1.0f,0.0f)); m_toggleShaders = new Gui::ToggleButton(); m_toggleShaders->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleShaders)); hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(m_toggleShaders); hbox->PackEnd(new Gui::Label(Lang::USE_SHADERS)); m_toggleCompressTextures = new Gui::ToggleButton(); m_toggleCompressTextures->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleCompressTextures)); hbox->PackEnd(m_toggleCompressTextures); hbox->PackEnd(new Gui::Label(Lang::COMPRESS_TEXTURES)); vbox->PackEnd(hbox); vbox->PackEnd((new Gui::Label(Lang::SOUND_SETTINGS))->Color(1.0f,1.0f,0.0f)); m_masterVolume = new VolumeControl(Lang::VOL_MASTER, Pi::config->Float("MasterVolume"), Pi::config->Int("MasterMuted")); vbox->PackEnd(m_masterVolume); m_sfxVolume = new VolumeControl(Lang::VOL_EFFECTS, Pi::config->Float("SfxVolume"), Pi::config->Int("SfxMuted")); vbox->PackEnd(m_sfxVolume); m_musicVolume = new VolumeControl(Lang::VOL_MUSIC, Pi::config->Float("MusicVolume"), Pi::config->Int("MusicMuted")); vbox->PackEnd(m_musicVolume); m_masterVolume->onChanged.connect(sigc::mem_fun(this, &GameMenuView::OnChangeVolume)); m_sfxVolume->onChanged.connect(sigc::mem_fun(this, &GameMenuView::OnChangeVolume)); m_musicVolume->onChanged.connect(sigc::mem_fun(this, &GameMenuView::OnChangeVolume)); } // Video mode selector { m_videoModes = Graphics::GetAvailableVideoModes(); vbox->PackEnd((new Gui::Label(Lang::VIDEO_RESOLUTION))->Color(1.0f,1.0f,0.0f)); m_screenModesGroup = new Gui::RadioGroup(); // box to put the scroll portal and its scroll bar into Gui::HBox *scrollHBox = new Gui::HBox(); vbox->PackEnd(scrollHBox); Gui::VScrollBar *scroll = new Gui::VScrollBar(); Gui::VScrollPortal *portal = new Gui::VScrollPortal(280); scroll->SetAdjustment(&portal->vscrollAdjust); scrollHBox->PackEnd(portal); scrollHBox->PackEnd(scroll); Gui::VBox *vbox2 = new Gui::VBox(); portal->Add(vbox2); for (std::vector<Graphics::VideoMode>::const_iterator it = m_videoModes.begin(); it != m_videoModes.end(); ++it) { Gui::RadioButton *temp = new Gui::RadioButton(m_screenModesGroup); temp->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeVideoResolution), it - m_videoModes.begin())); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(temp); hbox->PackEnd(new Gui::Label(stringf(Lang::X_BY_X, formatarg("x", int(it->width)), formatarg("y", int(it->height))))); vbox2->PackEnd(hbox); //mark the current video mode if ((Pi::GetScrWidth() == it->width) && (Pi::GetScrHeight() == it->height)) { temp->SetSelected(true); } } } //Graphical detail settings { Gui::HBox *detailBox = new Gui::HBox(); detailBox->SetSpacing(20.0f); mainTab->Add(detailBox, 350, 60); vbox = new Gui::VBox(); vbox->SetSpacing(5.0f); detailBox->PackEnd(vbox); vbox->PackEnd((new Gui::Label(Lang::CITY_DETAIL_LEVEL))->Color(1.0f,1.0f,0.0f)); m_cityDetailGroup = new Gui::RadioGroup(); for (int i=0; i<5; i++) { Gui::RadioButton *rb = new Gui::RadioButton(m_cityDetailGroup); rb->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeCityDetail), i)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(rb); hbox->PackEnd(new Gui::Label(planet_detail_desc[i])); vbox->PackEnd(hbox); } vbox = new Gui::VBox(); vbox->SetSpacing(5.0f); detailBox->PackEnd(vbox); vbox->PackEnd((new Gui::Label(Lang::PLANET_DETAIL_DISTANCE))->Color(1.0f,1.0f,0.0f)); m_planetDetailGroup = new Gui::RadioGroup(); for (int i=0; i<5; i++) { Gui::RadioButton *rb = new Gui::RadioButton(m_planetDetailGroup); rb->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangePlanetDetail), i)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(rb); hbox->PackEnd(new Gui::Label(planet_detail_desc[i])); vbox->PackEnd(hbox); } vbox = new Gui::VBox(); vbox->SetSpacing(5.0f); detailBox->PackEnd(vbox); vbox->PackEnd((new Gui::Label(Lang::PLANET_TEXTURES))->Color(1.0f,1.0f,0.0f)); m_planetTextureGroup = new Gui::RadioGroup(); for (int i=0; i<2; i++) { Gui::RadioButton *rb = new Gui::RadioButton(m_planetTextureGroup); rb->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangePlanetTextures), i)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(rb); hbox->PackEnd(new Gui::Label(planet_textures_desc[i])); vbox->PackEnd(hbox); } vbox = new Gui::VBox(); vbox->SetSpacing(5.0f); detailBox->PackEnd(vbox); vbox->PackEnd((new Gui::Label(Lang::FRACTAL_DETAIL))->Color(1.0f,1.0f,0.0f)); m_planetFractalGroup = new Gui::RadioGroup(); for (int i=0; i<5; i++) { Gui::RadioButton *rb = new Gui::RadioButton(m_planetFractalGroup); rb->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeFractalMultiple), i)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(rb); hbox->PackEnd(new Gui::Label(planet_fractal_desc[i])); vbox->PackEnd(hbox); } } // language vbox = new Gui::VBox(); vbox->SetSizeRequest(300, 200); mainTab->Add(vbox, 400, 250); vbox->PackEnd((new Gui::Label(Lang::LANGUAGE_SELECTION))->Color(1.0f,1.0f,0.0f)); m_languageGroup = new Gui::RadioGroup(); const std::vector<std::string> &availableLanguages = Lang::GetAvailableLanguages(); { // box to put the scroll portal and its scroll bar into Gui::HBox *scrollHBox = new Gui::HBox(); vbox->PackEnd(scrollHBox); Gui::VScrollBar *scroll = new Gui::VScrollBar(); Gui::VScrollPortal *portal = new Gui::VScrollPortal(280); scroll->SetAdjustment(&portal->vscrollAdjust); scrollHBox->PackEnd(portal); scrollHBox->PackEnd(scroll); Gui::VBox *vbox2 = new Gui::VBox(); portal->Add(vbox2); for (std::vector<std::string>::const_iterator i = availableLanguages.begin(); i != availableLanguages.end(); ++i) { Gui::RadioButton *temp = new Gui::RadioButton(m_languageGroup); temp->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeLanguage), *i)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(temp); hbox->PackEnd(new Gui::Label(*i)); vbox2->PackEnd(hbox); if ((*i) == Pi::config->String("Lang")) temp->SetSelected(true); } } // key binding tab 1 { Gui::Fixed *keybindingTab = new Gui::Fixed(800, 600); tabs->AddPage(new Gui::Label(Lang::CONTROLS), keybindingTab); Gui::VBox *box1 = new Gui::VBox(); box1->SetSpacing(5.0f); keybindingTab->Add(box1, 10, 10); Gui::VBox *box2 = new Gui::VBox(); box2->SetSpacing(5.0f); keybindingTab->Add(box2, 400, 10); Gui::VBox *box = box1; KeyGetter *keyg; for (int i=0; KeyBindings::bindingProtos[i].label; i++) { const char *label = KeyBindings::bindingProtos[i].label; const char *function = KeyBindings::bindingProtos[i].function; if (function) { KeyBindings::KeyBinding kb = KeyBindings::KeyBindingFromString(Pi::config->String(function)); keyg = new KeyGetter(label, kb); keyg->onChange.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeKeyBinding), function)); box->PackEnd(keyg); } else { // section box->PackEnd((new Gui::Label(label))->Color(1.0f, 1.0f, 0.0f)); } /* 2nd column */ if (i == 20) { box = box2; } } for (int i=0; KeyBindings::axisBindingProtos[i].label; i++) { AxisGetter *axisg; const char *label = KeyBindings::axisBindingProtos[i].label; const char *function = KeyBindings::axisBindingProtos[i].function; if (function) { KeyBindings::AxisBinding ab = KeyBindings::AxisBindingFromString(Pi::config->String(function).c_str()); axisg = new AxisGetter(label, ab); axisg->onChange.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeAxisBinding), function)); box->PackEnd(axisg); } else { // section box->PackEnd((new Gui::Label(label))->Color(1.0f, 1.0f, 0.0f)); } /* 2nd column */ if (i == 20) { box = box2; } } m_toggleJoystick = new Gui::ToggleButton(); m_toggleJoystick->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleJoystick)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(m_toggleJoystick); hbox->PackEnd(new Gui::Label(Lang::ENABLE_JOYSTICK)); box->PackEnd(hbox); // Invert Mouse m_toggleMouseYInvert = new Gui::ToggleButton(); m_toggleMouseYInvert->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleMouseYInvert)); box->PackEnd((new Gui::Label(Lang::MOUSE_INPUT))->Color(1.0f,1.0f,0.0f)); Gui::HBox *mybox = new Gui::HBox(); mybox->SetSpacing(5.0f); mybox->PackEnd(m_toggleMouseYInvert); mybox->PackEnd(new Gui::Label(Lang::INVERT_MOUSE_Y)); box->PackEnd(mybox); // Toggle nav tunnel m_toggleNavTunnel = new Gui::ToggleButton(); m_toggleNavTunnel->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleNavTunnel)); box->PackEnd((new Gui::Label(Lang::HUD))->Color(1.0f,1.0f,0.0f)); Gui::HBox *guibox = new Gui::HBox(); guibox->SetSpacing(5.0f); guibox->PackEnd(m_toggleNavTunnel); guibox->PackEnd(new Gui::Label(Lang::DISPLAY_NAV_TUNNEL)); box->PackEnd(guibox); } // key binding tab 2 { Gui::Fixed *keybindingTab = new Gui::Fixed(800, 600); tabs->AddPage(new Gui::Label(Lang::VIEW), keybindingTab); Gui::VBox *box1 = new Gui::VBox(); box1->SetSpacing(5.0f); keybindingTab->Add(box1, 10, 10); Gui::VBox *box = box1; KeyGetter *keyg; for (int i=0; KeyBindings::camBindingProtos[i].label; i++) { const char *label = KeyBindings::camBindingProtos[i].label; const char *function = KeyBindings::camBindingProtos[i].function; if (function) { KeyBindings::KeyBinding kb = KeyBindings::KeyBindingFromString(Pi::config->String(function)); keyg = new KeyGetter(label, kb); keyg->onChange.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeKeyBinding), function)); box->PackEnd(keyg); } else { // section box->PackEnd((new Gui::Label(label))->Color(1.0f, 1.0f, 0.0f)); } } } }
GameMenuView::GameMenuView(): View() { m_subview = 0; Gui::Tabbed *tabs = new Gui::Tabbed(); Add(tabs, 0, 0); Gui::Fixed *mainTab = new Gui::Fixed(800, 600); tabs->AddPage(new Gui::Label(Lang::SIGHTS_SOUNDS_SAVES), mainTab); mainTab->Add((new Gui::Label(Lang::PIONEER))->Shadow(true), 350, 10); SetTransparency(false); Gui::Label *l = new Gui::Label(Lang::PIONEER); l->Color(1,.7,0); m_rightRegion2->Add(l, 10, 0); { Gui::LabelButton *b; Gui::Box *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); mainTab->Add(hbox, 20, 30); b = new Gui::LabelButton(new Gui::Label(Lang::SAVE_THE_GAME)); b->SetShortcut(SDLK_s, KMOD_NONE); b->onClick.connect(sigc::mem_fun(this, &GameMenuView::OpenSaveDialog)); hbox->PackEnd(b); b = new Gui::LabelButton(new Gui::Label(Lang::LOAD_A_GAME)); b->onClick.connect(sigc::mem_fun(this, &GameMenuView::OpenLoadDialog)); b->SetShortcut(SDLK_l, KMOD_NONE); hbox->PackEnd(b); b = new Gui::LabelButton(new Gui::Label(Lang::EXIT_THIS_GAME)); b->onClick.connect(sigc::mem_fun(this, &GameMenuView::HideAll)); b->onClick.connect(sigc::ptr_fun(&Pi::EndGame)); hbox->PackEnd(b); } Gui::Box *vbox = new Gui::VBox(); vbox->SetSizeRequest(300, 440); vbox->SetSpacing(5.0); mainTab->Add(vbox, 20, 60); { vbox->PackEnd((new Gui::Label(Lang::WINDOW_OR_FULLSCREEN))->Color(1.0f,1.0f,0.0f)); m_toggleFullscreen = new Gui::ToggleButton(); m_toggleFullscreen->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleFullscreen)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(m_toggleFullscreen); hbox->PackEnd(new Gui::Label(Lang::FULL_SCREEN)); vbox->PackEnd(hbox); vbox->PackEnd((new Gui::Label(Lang::OTHER_GRAPHICS_SETTINGS))->Color(1.0f,1.0f,0.0f)); m_toggleShaders = new Gui::ToggleButton(); m_toggleShaders->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleShaders)); hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(m_toggleShaders); hbox->PackEnd(new Gui::Label(Lang::USE_SHADERS)); vbox->PackEnd(hbox); m_toggleHDR = new Gui::ToggleButton(); m_toggleHDR->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleHDR)); hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(m_toggleHDR); hbox->PackEnd(new Gui::Label(Lang::USE_HDR)); vbox->PackEnd(hbox); if (!Render::IsHDRAvailable()) m_toggleHDR->SetEnabled(false); vbox->PackEnd((new Gui::Label(Lang::SOUND_SETTINGS))->Color(1.0f,1.0f,0.0f)); m_masterVolume = new VolumeControl(Lang::VOL_MASTER, Pi::config.Float("MasterVolume"), Pi::config.Int("MasterMuted")); vbox->PackEnd(m_masterVolume); m_sfxVolume = new VolumeControl(Lang::VOL_EFFECTS, Pi::config.Float("SfxVolume"), Pi::config.Int("SfxMuted")); vbox->PackEnd(m_sfxVolume); m_musicVolume = new VolumeControl(Lang::VOL_MUSIC, Pi::config.Float("MusicVolume"), Pi::config.Int("MusicMuted")); vbox->PackEnd(m_musicVolume); m_masterVolume->onChanged.connect(sigc::mem_fun(this, &GameMenuView::OnChangeVolume)); m_sfxVolume->onChanged.connect(sigc::mem_fun(this, &GameMenuView::OnChangeVolume)); m_musicVolume->onChanged.connect(sigc::mem_fun(this, &GameMenuView::OnChangeVolume)); } vbox->PackEnd((new Gui::Label(Lang::VIDEO_RESOLUTION))->Color(1.0f,1.0f,0.0f)); Gui::RadioGroup *g = new Gui::RadioGroup(); SDL_Rect **modes; modes = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE); if ((modes!=0) && (modes != reinterpret_cast<SDL_Rect**>(-1))) { // box to put the scroll portal and its scroll bar into Gui::HBox *scrollHBox = new Gui::HBox(); vbox->PackEnd(scrollHBox); Gui::VScrollBar *scroll = new Gui::VScrollBar(); Gui::VScrollPortal *portal = new Gui::VScrollPortal(280); scroll->SetAdjustment(&portal->vscrollAdjust); scrollHBox->PackEnd(portal); scrollHBox->PackEnd(scroll); Gui::VBox *vbox2 = new Gui::VBox(); portal->Add(vbox2); for (int i=0; modes[i]; ++i) { Gui::RadioButton *temp = new Gui::RadioButton(g); temp->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeVideoResolution), i)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(temp); hbox->PackEnd(new Gui::Label(stringf(256, Lang::X_BY_X, modes[i]->w, modes[i]->h))); vbox2->PackEnd(hbox); if ((Pi::GetScrWidth() == modes[i]->w) && (Pi::GetScrHeight() == modes[i]->h)) { temp->SetSelected(true); } } } Gui::HBox *detailBox = new Gui::HBox(); detailBox->SetSpacing(60.0f); mainTab->Add(detailBox, 400, 60); vbox = new Gui::VBox(); vbox->SetSpacing(5.0f); detailBox->PackEnd(vbox); vbox->PackEnd((new Gui::Label(Lang::PLANET_DETAIL_LEVEL))->Color(1.0f,1.0f,0.0f)); m_planetDetailGroup = new Gui::RadioGroup(); for (int i=0; i<5; i++) { Gui::RadioButton *rb = new Gui::RadioButton(m_planetDetailGroup); rb->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangePlanetDetail), i)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(rb); hbox->PackEnd(new Gui::Label(planet_detail_desc[i])); vbox->PackEnd(hbox); } vbox = new Gui::VBox(); vbox->SetSpacing(5.0f); detailBox->PackEnd(vbox); vbox->PackEnd((new Gui::Label(Lang::CITY_DETAIL_LEVEL))->Color(1.0f,1.0f,0.0f)); m_cityDetailGroup = new Gui::RadioGroup(); for (int i=0; i<5; i++) { Gui::RadioButton *rb = new Gui::RadioButton(m_cityDetailGroup); rb->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeCityDetail), i)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(rb); hbox->PackEnd(new Gui::Label(planet_detail_desc[i])); vbox->PackEnd(hbox); } // language vbox = new Gui::VBox(); vbox->SetSizeRequest(300, 200); mainTab->Add(vbox, 400, 250); vbox->PackEnd((new Gui::Label(Lang::LANGUAGE_SELECTION))->Color(1.0f,1.0f,0.0f)); g = new Gui::RadioGroup(); const std::list<std::string> availableLanguages = Lang::GetAvailableLanguages(); { // box to put the scroll portal and its scroll bar into Gui::HBox *scrollHBox = new Gui::HBox(); vbox->PackEnd(scrollHBox); Gui::VScrollBar *scroll = new Gui::VScrollBar(); Gui::VScrollPortal *portal = new Gui::VScrollPortal(280); scroll->SetAdjustment(&portal->vscrollAdjust); scrollHBox->PackEnd(portal); scrollHBox->PackEnd(scroll); Gui::VBox *vbox2 = new Gui::VBox(); portal->Add(vbox2); for (std::list<std::string>::const_iterator i = availableLanguages.begin(); i != availableLanguages.end(); i++) { Gui::RadioButton *temp = new Gui::RadioButton(g); temp->onSelect.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeLanguage), *i)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(temp); hbox->PackEnd(new Gui::Label(*i)); vbox2->PackEnd(hbox); if ((*i) == Pi::config.String("Lang")) temp->SetSelected(true); } } // key binding tab { Gui::Fixed *keybindingTab = new Gui::Fixed(800, 600); tabs->AddPage(new Gui::Label(Lang::CONTROLS), keybindingTab); Gui::VBox *box1 = new Gui::VBox(); box1->SetSpacing(5.0f); keybindingTab->Add(box1, 10, 10); Gui::VBox *box2 = new Gui::VBox(); box2->SetSpacing(5.0f); keybindingTab->Add(box2, 400, 10); Gui::VBox *box = box1; KeyGetter *keyg; for (int i=0; KeyBindings::bindingProtos[i].label; i++) { const char *label = KeyBindings::bindingProtos[i].label; const char *function = KeyBindings::bindingProtos[i].function; if (function) { KeyBindings::KeyBinding kb = KeyBindings::KeyBindingFromString(Pi::config.String(function)); keyg = new KeyGetter(label, kb); keyg->onChange.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeKeyBinding), function)); box->PackEnd(keyg); } else { // section box->PackEnd((new Gui::Label(label))->Color(1.0f, 1.0f, 0.0f)); } /* 2nd column */ if (i == 20) { box = box2; } } for (int i=0; KeyBindings::axisBindingProtos[i].label; i++) { AxisGetter *axisg; const char *label = KeyBindings::axisBindingProtos[i].label; const char *function = KeyBindings::axisBindingProtos[i].function; if (function) { KeyBindings::AxisBinding ab = KeyBindings::AxisBindingFromString(Pi::config.String(function).c_str()); axisg = new AxisGetter(label, ab); axisg->onChange.connect(sigc::bind(sigc::mem_fun(this, &GameMenuView::OnChangeAxisBinding), function)); box->PackEnd(axisg); } else { // section box->PackEnd((new Gui::Label(label))->Color(1.0f, 1.0f, 0.0f)); } /* 2nd column */ if (i == 20) { box = box2; } } m_toggleJoystick = new Gui::ToggleButton(); m_toggleJoystick->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleJoystick)); Gui::HBox *hbox = new Gui::HBox(); hbox->SetSpacing(5.0f); hbox->PackEnd(m_toggleJoystick); hbox->PackEnd(new Gui::Label(Lang::ENABLE_JOYSTICK)); box->PackEnd(hbox); // Invert Mouse m_toggleMouseYInvert = new Gui::ToggleButton(); m_toggleMouseYInvert->onChange.connect(sigc::mem_fun(this, &GameMenuView::OnToggleMouseYInvert)); box->PackEnd((new Gui::Label(Lang::MOUSE_INPUT))->Color(1.0f,1.0f,0.0f)); Gui::HBox *mybox = new Gui::HBox(); mybox->SetSpacing(5.0f); mybox->PackEnd(m_toggleMouseYInvert); mybox->PackEnd(new Gui::Label(Lang::INVERT_MOUSE_Y)); box->PackEnd(mybox); } }