GUIEngine::EventPropagation PlayerInfoDialog::processEvent(const std::string& eventSource) { if (eventSource == "renameplayer") { // accept entered name stringw playerName = textCtrl->getText().trim(); const int playerAmount = UserConfigParams::m_all_players.size(); for(int n=0; n<playerAmount; n++) { if (UserConfigParams::m_all_players.get(n) == m_player) continue; if (UserConfigParams::m_all_players[n].getName() == playerName) { ButtonWidget* label = getWidget<ButtonWidget>("renameplayer"); label->setBadge(BAD_BADGE); sfx_manager->quickSound( "anvil" ); return GUIEngine::EVENT_BLOCK; } } if (playerName.size() <= 0) return GUIEngine::EVENT_BLOCK; OptionsScreenPlayers::getInstance()->renamePlayer( playerName, m_player ); // irrLicht is too stupid to remove focus from deleted widgets // so do it by hand GUIEngine::getGUIEnv()->removeFocus( textCtrl->getIrrlichtElement() ); GUIEngine::getGUIEnv()->removeFocus( m_irrlicht_window ); ModalDialog::dismiss(); dismiss(); return GUIEngine::EVENT_BLOCK; } else if (eventSource == "removeplayer") { showConfirmDialog(); return GUIEngine::EVENT_BLOCK; } else if (eventSource == "confirmremove") { OptionsScreenPlayers::getInstance()->deletePlayer( m_player ); m_player = NULL; // irrLicht is too stupid to remove focus from deleted widgets // so do it by hand GUIEngine::getGUIEnv()->removeFocus( textCtrl->getIrrlichtElement() ); GUIEngine::getGUIEnv()->removeFocus( m_irrlicht_window ); ModalDialog::dismiss(); return GUIEngine::EVENT_BLOCK; } else if(eventSource == "cancelremove") { showRegularDialog(); return GUIEngine::EVENT_BLOCK; } else if(eventSource == "cancel") { // irrLicht is too stupid to remove focus from deleted widgets // so do it by hand GUIEngine::getGUIEnv()->removeFocus( textCtrl->getIrrlichtElement() ); GUIEngine::getGUIEnv()->removeFocus( m_irrlicht_window ); ModalDialog::dismiss(); return GUIEngine::EVENT_BLOCK; } return GUIEngine::EVENT_LET; }
// ----------------------------------------------------------------------------- void PlayerInfoDialog::showRegularDialog() { clearWindow(); const int y1 = m_area.getHeight()/6; const int y2 = m_area.getHeight()*2/6; const int y3 = m_area.getHeight()*3/6; const int y4 = m_area.getHeight()*5/6; ScalableFont* font = GUIEngine::getFont(); const int textHeight = GUIEngine::getFontHeight(); const int buttonHeight = textHeight + 10; { textCtrl = new TextBoxWidget(); textCtrl->m_properties[PROP_ID] = "newname"; textCtrl->setText(m_player->getName()); textCtrl->m_x = 50; textCtrl->m_y = y1 - textHeight/2; textCtrl->m_w = m_area.getWidth()-100; textCtrl->m_h = textHeight + 5; textCtrl->setParent(m_irrlicht_window); m_widgets.push_back(textCtrl); textCtrl->add(); } { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "renameplayer"; //I18N: In the player info dialog widget->setText( _("Rename") ); const int textWidth = font->getDimension( widget->getText().c_str() ).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = y2; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); } { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "cancel"; widget->setText( _("Cancel") ); const int textWidth = font->getDimension(widget->getText().c_str()).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = y3; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); } { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "removeplayer"; //I18N: In the player info dialog widget->setText( _("Remove")); const int textWidth = font->getDimension(widget->getText().c_str()).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = y4; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); } textCtrl->setFocusForPlayer( PLAYER_ID_GAME_MASTER ); }
AddDeviceDialog::AddDeviceDialog() : ModalDialog(0.90f, 0.80f) { doInit(); ScalableFont* font = GUIEngine::getFont(); const int textHeight = GUIEngine::getFontHeight(); const int buttonHeight = textHeight + 10; #ifdef ENABLE_WIIUSE const int nbButtons = 3; #else const int nbButtons = 2; #endif const int y_bottom = m_area.getHeight() - nbButtons*(buttonHeight + 10) - 10; const int y_stride = buttonHeight+10; int cur_y = y_bottom; core::rect<s32> text_area( 15, 15, m_area.getWidth()-15, y_bottom-15 ); core::stringw msg = _("To add a new Gamepad/Joystick device, simply start SuperTuxKart " "with it connected and it will appear in the list.\n\nTo add a " "keyboard config, you can use the button below, HOWEVER please " "note that most keyboards only support a limited amount of " "simultaneous keypresses and are thus inappropriate for multiplayer " "gameplay. (You can, however, connect multiple keyboards to the " "computer. Remember that everyone still needs different keybindings " "in this case.)"); IGUIStaticText* b = GUIEngine::getGUIEnv()->addStaticText(msg.c_str(), text_area, /*border*/false , /*word wrap*/true, m_irrlicht_window); b->setTabStop(false); b->setRightToLeft(translations->isRTLLanguage()); // because it looks like 'setRightToLeft' applies next time // setText is called only b->setText(msg.c_str()); #ifdef ENABLE_WIIUSE { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "addwiimote"; //I18N: In the 'add new input device' dialog widget->setText( _("Add Wiimote") ); const int textWidth = font->getDimension( widget->getText().c_str() ).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = cur_y; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); cur_y += y_stride; } #endif // ENABLE_WIIUSE { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "addkeyboard"; //I18N: In the 'add new input device' dialog widget->setText( _("Add Keyboard Configuration") ); const int textWidth = font->getDimension( widget->getText().c_str() ).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = cur_y; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); cur_y += y_stride; } { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "cancel"; widget->setText( _("Cancel") ); const int textWidth = font->getDimension( widget->getText().c_str() ).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = cur_y; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); cur_y += y_stride; widget->setFocusForPlayer( PLAYER_ID_GAME_MASTER ); } } // AddDeviceDialog
void PlayerInfoDialog::showConfirmDialog() { clearWindow(); IGUIFont* font = GUIEngine::getFont(); const int textHeight = GUIEngine::getFontHeight(); const int buttonHeight = textHeight + 10; irr::core::stringw message = //I18N: In the player info dialog (when deleting) _("Do you really want to delete player '%s' ?", m_player->getName()); if (unlock_manager->getCurrentSlotID() == m_player->getUniqueID()) { message = _("You cannot delete this player because it is currently in use."); } core::rect< s32 > area_left(5, 0, m_area.getWidth()-5, m_area.getHeight()/2); // When there is no need to tab through / click on images/labels, // we can add irrlicht labels directly // (more complicated uses require the use of our widget set) IGUIStaticText* a = GUIEngine::getGUIEnv()->addStaticText( message.c_str(), area_left, false /* border */, true /* word wrap */, m_irrlicht_window); a->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER); if (unlock_manager->getCurrentSlotID() != m_player->getUniqueID()) { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "confirmremove"; //I18N: In the player info dialog (when deleting) widget->setText( _("Confirm Remove") ); const int textWidth = font->getDimension(widget->getText().c_str()).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = m_area.getHeight()/2; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); } { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "cancelremove"; //I18N: In the player info dialog (when deleting) widget->setText( _("Cancel Remove") ); const int textWidth = font->getDimension( widget->getText().c_str() ).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = m_area.getHeight()*3/4; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); widget->setFocusForPlayer( PLAYER_ID_GAME_MASTER ); } }
// ---------------------------------------------------------------------------- void OptionsScreenInput2::eventCallback(Widget* widget, const std::string& name, const int playerID) { //const std::string& screen_name = getName(); StateManager *sm = StateManager::get(); if (name == "options_choice") { std::string selection = ((RibbonWidget*)widget)->getSelectionIDString(PLAYER_ID_GAME_MASTER); Screen *screen = NULL; if (selection == "tab_audio") screen = OptionsScreenAudio::getInstance(); //else if (selection == "tab_video") // screen = OptionsScreenVideo::getInstance(); else if (selection == "tab_players") screen = TabbedUserScreen::getInstance(); //else if (selection == "tab_controls") // screen = OptionsScreenInput::getInstance(); else if (selection == "tab_ui") screen = OptionsScreenUI::getInstance(); if(screen) StateManager::get()->replaceTopMostScreen(screen); } else if (name == "back_to_device_list") { sm->replaceTopMostScreen(OptionsScreenInput::getInstance()); } else if (name == "back") { sm->replaceTopMostScreen(OptionsScreenInput::getInstance()); } else if (name == "actions") { GUIEngine::ListWidget* actions = getWidget<GUIEngine::ListWidget>("actions"); assert( actions != NULL ); // a player action in the list was clicked. find which one const std::string& clicked = actions->getSelectionInternalName(); for (int n=PA_BEFORE_FIRST+1; n<PA_COUNT; n++) { if (KartActionStrings[n] == clicked) { // we found which one. show the "press a key" dialog. if (UserConfigParams::logMisc()) { Log::info("OptionsScreenInput2", "Entering sensing mode for %s", m_config->getName().c_str()); } binding_to_set = (PlayerAction)n; new PressAKeyDialog(0.4f, 0.4f); if (m_config->getType() == DEVICE_CONFIG_TYPE_KEYBOARD) { input_manager->setMode(InputManager::INPUT_SENSE_KEYBOARD); } else if (m_config->getType() == DEVICE_CONFIG_TYPE_GAMEPAD) { input_manager->setMode(InputManager::INPUT_SENSE_GAMEPAD); } else { Log::error("OptionsScreenInput2", "Unknown selection device in options: %s", m_config->getName().c_str()); } break; } } } else if (name == "delete") { if (m_config->getType() == DEVICE_CONFIG_TYPE_KEYBOARD) { // keyboard configs may be deleted //I18N: shown before deleting an input configuration new MessageDialog( _("Are you sure you want to permanently delete " "this configuration?"), MessageDialog::MESSAGE_DIALOG_CONFIRM, this, false ); } else { // gamepad configs may be disabled if (m_config->isEnabled()) m_config->setEnabled(false); else m_config->setEnabled(true); // update widget label ButtonWidget* deleteBtn = getWidget<ButtonWidget>("delete"); deleteBtn->setLabel(m_config->isEnabled() ? _("Disable Device") : _("Enable Device") ); input_manager->getDeviceList()->serialize(); } } } // eventCallback
void OptionsScreenInput2::init() { Screen::init(); RibbonWidget* tabBar = getWidget<RibbonWidget>("options_choice"); if (tabBar != NULL) tabBar->select( "tab_controls", PLAYER_ID_GAME_MASTER ); tabBar->getRibbonChildren()[0].setTooltip( _("Graphics") ); tabBar->getRibbonChildren()[1].setTooltip( _("Audio") ); tabBar->getRibbonChildren()[2].setTooltip( _("User Interface") ); tabBar->getRibbonChildren()[3].setTooltip( _("Players") ); ButtonWidget* deleteBtn = getWidget<ButtonWidget>("delete"); if (m_config->getType() != DEVICE_CONFIG_TYPE_KEYBOARD) { core::stringw label = (m_config->isEnabled() ? //I18N: button to disable a gamepad configuration _("Disable Device") : //I18N: button to enable a gamepad configuration _("Enable Device")); // Make sure button is wide enough as the text is being changed away // from the original value core::dimension2d<u32> size = GUIEngine::getFont()->getDimension(label.c_str()); const int needed = size.Width + deleteBtn->getWidthNeededAroundLabel(); if (deleteBtn->m_w < needed) deleteBtn->m_w = needed; deleteBtn->setLabel(label); } else { deleteBtn->setLabel(_("Delete Configuration")); if (input_manager->getDeviceList()->getKeyboardAmount() < 2) { // don't allow deleting the last config deleteBtn->setDeactivated(); } else { deleteBtn->setActivated(); } } // Make the two buttons the same length, not strictly needed but will // look nicer... ButtonWidget* backBtn = getWidget<ButtonWidget>("back_to_device_list"); if (backBtn->m_w < deleteBtn->m_w) backBtn->m_w = deleteBtn->m_w; else deleteBtn->m_w = backBtn->m_w; backBtn->moveIrrlichtElement(); deleteBtn->moveIrrlichtElement(); LabelWidget* label = getWidget<LabelWidget>("title"); label->setText( m_config->getName().c_str(), false ); GUIEngine::ListWidget* actions = getWidget<GUIEngine::ListWidget>("actions"); assert( actions != NULL ); // ---- create list skeleton (right number of items, right internal names) // their actualy contents will be adapted as needed after //I18N: Key binding section addListItemSubheader(actions, "game_keys_section", _("Game Keys")); addListItem(actions, PA_STEER_LEFT); addListItem(actions, PA_STEER_RIGHT); addListItem(actions, PA_ACCEL); addListItem(actions, PA_BRAKE); addListItem(actions, PA_FIRE); addListItem(actions, PA_NITRO); addListItem(actions, PA_DRIFT); addListItem(actions, PA_LOOK_BACK); addListItem(actions, PA_RESCUE); addListItem(actions, PA_PAUSE_RACE); //I18N: Key binding section addListItemSubheader(actions, "menu_keys_section", _("Menu Keys")); addListItem(actions, PA_MENU_UP); addListItem(actions, PA_MENU_DOWN); addListItem(actions, PA_MENU_LEFT); addListItem(actions, PA_MENU_RIGHT); addListItem(actions, PA_MENU_SELECT); addListItem(actions, PA_MENU_CANCEL); updateInputButtons(); // Disable deletion keyboard configurations if (StateManager::get()->getGameState() == GUIEngine::INGAME_MENU) { getWidget<ButtonWidget>("delete")->setDeactivated(); } else { getWidget<ButtonWidget>("delete")->setActivated(); } } // init
GPInfoDialog::GPInfoDialog(const std::string& gpIdent, const float w, const float h) : ModalDialog(w, h) { doInit(); m_curr_time = 0.0f; const int y1 = m_area.getHeight()/7; const int y2 = m_area.getHeight()*6/7; m_gp_ident = gpIdent; const GrandPrixData* gp = grand_prix_manager->getGrandPrix(gpIdent); assert (gp != NULL); // ---- GP Name core::rect< s32 > area_top(0, 0, m_area.getWidth(), y1); IGUIStaticText* title = GUIEngine::getGUIEnv()->addStaticText( translations->fribidize(gp->getName()), area_top, false, true, // border, word wrap m_irrlicht_window); title->setTabStop(false); title->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER); // ---- Track listings const std::vector<std::string> tracks = gp->getTrackNames(); const int trackAmount = tracks.size(); int height_of_one_line = (y2 - y1)/(trackAmount+1); const int textHeight = GUIEngine::getFontHeight(); if (height_of_one_line > (int)(textHeight*1.5f)) height_of_one_line = (int)(textHeight*1.5f); bool gp_ok = true; for (int t=0; t<trackAmount; t++) { const int from_y = y1 + height_of_one_line*(t+1); Track* track = track_manager->getTrack(tracks[t]); stringw lineText; if (track == NULL) { lineText = L"MISSING : "; lineText.append( stringw(tracks[t].c_str()) ); gp_ok = false; } else { lineText = track->getName(); } LabelWidget* widget = new LabelWidget(); widget->setText(translations->fribidize(lineText), false); widget->m_x = 20; widget->m_y = from_y; widget->m_w = m_area.getWidth()/2 - 20; widget->m_h = height_of_one_line; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); // IGUIStaticText* line = GUIEngine::getGUIEnv()->addStaticText( lineText.c_str(), // entry_area, false , true , // border, word wrap // m_irrlicht_window); } // ---- Track screenshot m_screenshot_widget = new IconButtonWidget(IconButtonWidget::SCALE_MODE_KEEP_CUSTOM_ASPECT_RATIO, false /* tab stop */, false /* focusable */, IconButtonWidget::ICON_PATH_TYPE_ABSOLUTE /* Track gives us absolute paths */); // images are saved squared, but must be stretched to 4:3 m_screenshot_widget->setCustomAspectRatio(4.0f / 3.0f); m_screenshot_widget->m_x = m_area.getWidth()/2; m_screenshot_widget->m_y = y1; m_screenshot_widget->m_w = m_area.getWidth()/2; m_screenshot_widget->m_h = y2 - y1 - 10; Track* track = (tracks.size() == 0 ? NULL : track_manager->getTrack(tracks[0])); m_screenshot_widget->m_properties[PROP_ICON] = (track != NULL ? track->getScreenshotFile().c_str() : file_manager->getAsset(FileManager::GUI,"main_help.png")); m_screenshot_widget->setParent(m_irrlicht_window); m_screenshot_widget->add(); m_widgets.push_back(m_screenshot_widget); // ---- Start button ButtonWidget* okBtn = new ButtonWidget(); ButtonWidget* continueBtn = new ButtonWidget(); SavedGrandPrix* saved_gp = SavedGrandPrix::getSavedGP( StateManager::get() ->getActivePlayerProfile(0) ->getUniqueID(), gpIdent, race_manager->getDifficulty(), race_manager->getNumberOfKarts(), race_manager->getNumLocalPlayers()); if (tracks.size() == 0) { okBtn->m_properties[PROP_ID] = "cannot_start"; okBtn->setText(_("Sorry, no tracks available")); } else if (gp_ok) { okBtn->m_properties[PROP_ID] = "start"; okBtn->setText(_("Start Grand Prix")); continueBtn->m_properties[PROP_ID] = "continue"; continueBtn->setText(_("Continue")); } else { okBtn->m_properties[PROP_ID] = "cannot_start"; okBtn->setText(_("This Grand Prix is broken!")); okBtn->setBadge(BAD_BADGE); } if (saved_gp && gp_ok) { continueBtn->m_x = m_area.getWidth()/2 + 110; continueBtn->m_y = y2; continueBtn->m_w = 200; continueBtn->m_h = m_area.getHeight() - y2 - 15; continueBtn->setParent(m_irrlicht_window); m_widgets.push_back(continueBtn); continueBtn->add(); continueBtn->getIrrlichtElement()->setTabStop(true); continueBtn->getIrrlichtElement()->setTabGroup(false); okBtn->m_x = m_area.getWidth()/2 - 310; } else { okBtn->m_x = m_area.getWidth()/2 - 200; } okBtn->m_y = y2; okBtn->m_w = 400; okBtn->m_h = m_area.getHeight() - y2 - 15; okBtn->setParent(m_irrlicht_window); m_widgets.push_back(okBtn); okBtn->add(); okBtn->getIrrlichtElement()->setTabStop(true); okBtn->getIrrlichtElement()->setTabGroup(false); okBtn->setFocusForPlayer( PLAYER_ID_GAME_MASTER ); }
WidgetBase* ButtonWidget::Create(const TiXmlNode* data) { ButtonWidget* gw = new ButtonWidget(); gw->ParseAndAddEvents(data); return gw; }
AddDeviceDialog::AddDeviceDialog() : ModalDialog(0.90f, 0.80f) { ScalableFont* font = GUIEngine::getFont(); const int textHeight = GUIEngine::getFontHeight(); const int buttonHeight = textHeight + 10; const int y_bottom = m_area.getHeight() - 2*(buttonHeight + 10) - 10; core::rect<s32> text_area( 15, 15, m_area.getWidth()-15, y_bottom-15 ); IGUIStaticText* b = GUIEngine::getGUIEnv()->addStaticText( _("To add a new Gamepad/Joystick device, simply start SuperTuxKart with it connected and it will appear in the list.\n\nTo add a keyboard config, you can use the button below, HOWEVER please note that most keyboards only support a limited amount of simultaneous keypresses and are thus inappropriate for multiplayer gameplay. (You can, however, connect multiple keyboards to the computer. Remember that everyone still needs different keybindings in this case.)"), text_area, false , true , // border, word warp m_irrlicht_window); b->setTabStop(false); { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "addkeyboard"; //I18N: In the 'add new input device' dialog widget->setText( _("Add Keyboard Configuration") ); const int textWidth = font->getDimension( widget->getText().c_str() ).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = y_bottom; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); } { ButtonWidget* widget = new ButtonWidget(); widget->m_properties[PROP_ID] = "cancel"; widget->setText( _("Cancel") ); const int textWidth = font->getDimension( widget->getText().c_str() ).Width + 40; widget->m_x = m_area.getWidth()/2 - textWidth/2; widget->m_y = y_bottom + buttonHeight + 10; widget->m_w = textWidth; widget->m_h = buttonHeight; widget->setParent(m_irrlicht_window); m_widgets.push_back(widget); widget->add(); widget->setFocusForPlayer( PLAYER_ID_GAME_MASTER ); } }
// ----------------------------------------------------------------------------- void ListWidget::add() { const int header_height = GUIEngine::getFontHeight() + 15; rect<s32> widget_size = (m_header.size() > 0 ? rect<s32>(m_x, m_y + header_height, m_x + m_w, m_y + m_h) : rect<s32>(m_x, m_y, m_x + m_w, m_y + m_h) ); IGUISkin * current_skin = GUIEngine::getGUIEnv()->getSkin(); IGUIFont * current_font = GUIEngine::getGUIEnv()->getBuiltInFont(); CGUISTKListBox * list_box = new CGUISTKListBox( GUIEngine::getGUIEnv(), m_parent ? m_parent : GUIEngine::getGUIEnv()->getRootGUIElement(), getNewID(), widget_size, true, true, false); if (current_skin && current_skin->getSpriteBank()) { list_box->setSpriteBank(current_skin->getSpriteBank()); } else if (current_font && current_font->getType() == EGFT_BITMAP) { list_box->setSpriteBank( ((IGUIFontBitmap*)current_font)->getSpriteBank()); } list_box->drop(); list_box->setAutoScrollEnabled(false); m_element = list_box; m_element->setTabOrder( list_box->getID() ); if (m_header.size() > 0) { //const int col_size = m_w / m_header.size(); int proportion_total = 0; for (unsigned int n=0; n<m_header.size(); n++) { proportion_total += m_header[n].m_proportion; } int x = m_x; for (unsigned int n=0; n<m_header.size(); n++) { std::ostringstream name; name << m_properties[PROP_ID]; name << "_column_"; name << n; ButtonWidget* header = new ButtonWidget(); header->m_reserved_id = getNewNoFocusID(); header->m_y = m_y; header->m_h = header_height; header->m_x = x; header->m_w = (int)(m_w * float(m_header[n].m_proportion) /float(proportion_total)); x += header->m_w; header->setText( m_header[n].m_text ); header->m_properties[PROP_ID] = name.str(); header->add(); header->m_event_handler = this; header->getIrrlichtElement()->setTabStop(false); m_children.push_back(header); m_header_elements.push_back(header); } m_check_inside_me = true; } }
void init() { // Renderer selection { HorizontalPanelWidget * pc = new HorizontalPanelWidget; std::string szMenuText = getLocalised("system_menus_options_video_renderer", "Renderer"); szMenuText += " "; TextWidget * me = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(20), 0)); me->SetCheckOff(); pc->AddElement(me); CycleTextWidget * slider = new CycleTextWidget; slider->valueChanged = boost::bind(&VideoOptionsMenuPage::onChangedRenderer, this, _1, _2); { TextWidget * text = new TextWidget(BUTTON_INVALID, hFontMenu, "Auto-Select", Vec2i(0, 0)); slider->AddText(text); slider->selectLast(); } #if ARX_HAVE_SDL1 || ARX_HAVE_SDL2 { TextWidget * text = new TextWidget(BUTTON_INVALID, hFontMenu, "OpenGL", Vec2i(0, 0)); slider->AddText(text); if(config.window.framework == "SDL") { slider->selectLast(); } } #endif float fRatio = (RATIO_X(m_size.x-9) - slider->m_rect.width()); slider->Move(Vec2i(checked_range_cast<int>(fRatio), 0)); pc->AddElement(slider); addCenter(pc); } { std::string szMenuText = getLocalised("system_menus_options_videos_full_screen"); if(szMenuText.empty()) { // TODO once we ship our own amendmends to the loc files a cleaner // fix would be to just define system_menus_options_videos_full_screen // for the german version there szMenuText = getLocalised("system_menus_options_video_full_screen"); } szMenuText += " "; TextWidget * text = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(20), 0.f)); text->SetCheckOff(); CheckboxWidget * cb = new CheckboxWidget(text); cb->stateChanged = boost::bind(&VideoOptionsMenuPage::onChangedFullscreen, this, _1); cb->iState = config.video.fullscreen ? 1 : 0; addCenter(cb); fullscreenCheckbox = cb; } { HorizontalPanelWidget * pc = new HorizontalPanelWidget; std::string szMenuText = getLocalised("system_menus_options_video_resolution"); szMenuText += " "; TextWidget * me = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(20), 0.f)); me->SetCheckOff(); pc->AddElement(me); pMenuSliderResol = new CycleTextWidget; pMenuSliderResol->valueChanged = boost::bind(&VideoOptionsMenuPage::onChangedResolution, this, _1, _2); pMenuSliderResol->setEnabled(config.video.fullscreen); const RenderWindow::DisplayModes & modes = mainApp->getWindow()->getDisplayModes(); for(size_t i = 0; i != modes.size(); ++i) { const DisplayMode & mode = modes[i]; // find the aspect ratio unsigned a = mode.resolution.x; unsigned b = mode.resolution.y; while(b != 0) { unsigned t = a % b; a = b, b = t; } Vec2i aspect = mode.resolution / Vec2i(a); std::stringstream ss; ss << mode; if(aspect.x < 100 && aspect.y < 100) { if(aspect == Vec2i(8, 5)) { aspect = Vec2i(16, 10); } ss << " (" << aspect.x << ':' << aspect.y << ')'; } pMenuSliderResol->AddText(new TextWidget(BUTTON_INVALID, hFontMenu, ss.str())); if(mode.resolution == config.video.resolution) { pMenuSliderResol->selectLast(); } } pMenuSliderResol->AddText(new TextWidget(BUTTON_INVALID, hFontMenu, AUTO_RESOLUTION_STRING)); if(config.video.resolution == Vec2i_ZERO) { pMenuSliderResol->selectLast(); } float fRatio = (RATIO_X(m_size.x-9) - pMenuSliderResol->m_rect.width()); pMenuSliderResol->Move(Vec2i(checked_range_cast<int>(fRatio), 0)); pc->AddElement(pMenuSliderResol); addCenter(pc); } { HorizontalPanelWidget * pc = new HorizontalPanelWidget; std::string szMenuText = getLocalised("system_menus_options_detail"); szMenuText += " "; TextWidget * me = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(20), 0)); me->SetCheckOff(); pc->AddElement(me); CycleTextWidget * cb = new CycleTextWidget; cb->valueChanged = boost::bind(&VideoOptionsMenuPage::onChangedQuality, this, _1, _2); szMenuText = getLocalised("system_menus_options_video_texture_low"); cb->AddText(new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText)); szMenuText = getLocalised("system_menus_options_video_texture_med"); cb->AddText(new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText)); szMenuText = getLocalised("system_menus_options_video_texture_high"); cb->AddText(new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText)); cb->setValue(config.video.levelOfDetail); cb->Move(Vec2i(RATIO_X(m_size.x-9) - cb->m_rect.width(), 0)); pc->AddElement(cb); addCenter(pc); } { HorizontalPanelWidget * pc = new HorizontalPanelWidget; std::string szMenuText = getLocalised("system_menus_options_video_brouillard"); TextWidget * me = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(20), 0.f)); me->SetCheckOff(); pc->AddElement(me); SliderWidget * sld = new SliderWidget(Vec2i(RATIO_X(200), 0)); sld->valueChanged = boost::bind(&VideoOptionsMenuPage::onChangedFogDistance, this, _1); sld->setValue(config.video.fogDistance); pc->AddElement(sld); addCenter(pc); } { std::string szMenuText = getLocalised("system_menus_options_video_crosshair", "Show Crosshair"); szMenuText += " "; TextWidget * text = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(20), 0.f)); text->SetCheckOff(); CheckboxWidget * cb = new CheckboxWidget(text); cb->stateChanged = boost::bind(&VideoOptionsMenuPage::onChangedCrosshair, this, _1); cb->iState = config.video.showCrosshair ? 1 : 0; addCenter(cb); } { std::string szMenuText = getLocalised("system_menus_options_video_antialiasing", "antialiasing"); szMenuText += " "; TextWidget * text = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(20), 0)); text->SetCheckOff(); CheckboxWidget * cb = new CheckboxWidget(text); cb->stateChanged = boost::bind(&VideoOptionsMenuPage::onChangedAntialiasing, this, _1); cb->iState = config.video.antialiasing ? 1 : 0; addCenter(cb); } ARX_SetAntiAliasing(); { std::string szMenuText = getLocalised("system_menus_options_video_vsync", "VSync"); szMenuText += " "; TextWidget * text = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(20), 0)); text->SetCheckOff(); CheckboxWidget * cb = new CheckboxWidget(text); cb->stateChanged = boost::bind(&VideoOptionsMenuPage::onChangedVsync, this, _1); cb->iState = config.video.vsync ? 1 : 0; addCenter(cb); } { std::string szMenuText = getLocalised("system_menus_options_video_hud_scale", "Scale Hud"); szMenuText += " "; TextWidget * text = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(20), 0)); text->SetCheckOff(); CheckboxWidget * cb = new CheckboxWidget(text); cb->stateChanged = boost::bind(&VideoOptionsMenuPage::onChangedHudScale, this, _1); cb->iState = config.video.hudScale ? 1 : 0; addCenter(cb); } { HorizontalPanelWidget * pc = new HorizontalPanelWidget; std::string szMenuText = getLocalised("system_menus_video_apply"); szMenuText += " "; TextWidget * me = new TextWidget(BUTTON_INVALID, hFontMenu, szMenuText, Vec2i(RATIO_X(240), 0)); me->clicked = boost::bind(&VideoOptionsMenuPage::onClickedApply, this); me->SetPos(Vec2i(RATIO_X(m_size.x-10)-me->m_rect.width(), RATIO_Y(380) + RATIO_Y(40))); me->SetCheckOff(); pc->AddElementNoCenterIn(me); pMenuElementApply = me; ButtonWidget * cb = new ButtonWidget(RATIO_2(Vec2i(20, 420)), "graph/interface/menus/back"); cb->clicked = boost::bind(&VideoOptionsMenuPage::onClickedBack, this); cb->m_targetMenu = OPTIONS; cb->SetShortCut(Keyboard::Key_Escape); pc->AddElementNoCenterIn(cb); add(pc); } }
void init() { { ButtonWidget * cb = new ButtonWidget(Vec2i(RATIO_X(10), 0), "graph/interface/icons/menu_main_save"); cb->SetCheckOff(); addCenter(cb, true); } std::string quicksaveName = getLocalised("system_menus_main_quickloadsave", "Quicksave"); size_t quicksaveNum = 0; // Show quicksaves. for(size_t i = 0; i < savegames.size(); i++) { const SaveGame & save = savegames[i]; if(!save.quicksave) { continue; } std::ostringstream text; text << quicksaveName << ' ' << ++quicksaveNum << " " << save.time; TextWidget * e = new TextWidget(BUTTON_MENUEDITQUEST_SAVEINFO, hFontControls, text.str(), Vec2i(RATIO_X(20), 0.f)); e->m_targetMenu = EDIT_QUEST_SAVE_CONFIRM; e->setColor(Color::grayb(127)); e->SetCheckOff(); e->m_savegame = SavegameHandle(i); addCenter(e); } // Show regular saves. for(size_t i = 0; i < savegames.size(); i++) { const SaveGame & save = savegames[i]; if(save.quicksave) { continue; } std::string text = save.name + " " + save.time; TextWidget * e = new TextWidget(BUTTON_MENUEDITQUEST_SAVEINFO, hFontControls, text, Vec2i(RATIO_X(20), 0.f)); e->m_targetMenu = EDIT_QUEST_SAVE_CONFIRM; e->m_savegame = SavegameHandle(i); addCenter(e); } for(size_t i = savegames.size(); i <= 15; i++) { std::ostringstream text; text << '-' << std::setfill('0') << std::setw(4) << i << '-'; TextWidget * e = new TextWidget(BUTTON_MENUEDITQUEST_SAVEINFO, hFontControls, text.str(), Vec2i(RATIO_X(20), 0)); e->m_targetMenu = EDIT_QUEST_SAVE_CONFIRM; e->m_savegame = SavegameHandle::Invalid; addCenter(e); } { TextWidget * me01 = new TextWidget(BUTTON_INVALID, hFontControls, " ", Vec2i(RATIO_X(20), 0)); me01->m_targetMenu = EDIT_QUEST_SAVE_CONFIRM; me01->m_savegame = SavegameHandle::Invalid; me01->SetCheckOff(); addCenter(me01); } { ButtonWidget * cb = new ButtonWidget(RATIO_2(Vec2i(20, 420)), "graph/interface/menus/back"); cb->m_targetMenu = EDIT_QUEST; cb->SetShortCut(Keyboard::Key_Escape); add(cb); } }
void init() { { ButtonWidget * cb = new ButtonWidget(Vec2i(0, 0), "graph/interface/icons/menu_main_load"); cb->SetCheckOff(); addCenter(cb, true); } std::string quicksaveName = getLocalised("system_menus_main_quickloadsave", "Quicksave"); // TODO make this list scrollable // TODO align the date part to the right! { size_t quicksaveNum = 0; // Show quicksaves. for(size_t i = 0; i < savegames.size(); i++) { const SaveGame & save = savegames[i]; if(!save.quicksave) { continue; } std::ostringstream text; text << quicksaveName << ' ' << ++quicksaveNum << " " << save.time; TextWidget * e = new TextWidget(BUTTON_MENUEDITQUEST_LOAD, hFontControls, text.str(), Vec2i(RATIO_X(20), 0)); e->m_savegame = SavegameHandle(i); addCenter(e); } // Show regular saves. for(size_t i = 0; i < savegames.size(); i++) { const SaveGame & save = savegames[i]; if(save.quicksave) { continue; } std::string text = save.name + " " + save.time; TextWidget * e = new TextWidget(BUTTON_MENUEDITQUEST_LOAD, hFontControls, text, Vec2i(RATIO_X(20), 0)); e->m_savegame = SavegameHandle(i); addCenter(e); } { TextWidget * confirm = new TextWidget(BUTTON_INVALID, hFontControls, " ", Vec2i(RATIO_X(20), 0)); confirm->m_targetMenu = EDIT_QUEST_SAVE_CONFIRM; confirm->SetCheckOff(); confirm->m_savegame = SavegameHandle::Invalid; addCenter(confirm); } // Delete button { std::string szMenuText = getLocalised("system_menus_main_editquest_delete"); szMenuText += " "; TextWidget * me = new TextWidget(BUTTON_MENUEDITQUEST_DELETE_CONFIRM, hFontMenu, szMenuText, Vec2i(0, 0)); me->m_targetMenu = EDIT_QUEST_LOAD; me->SetPos(Vec2i(RATIO_X(m_size.x-10)-me->m_rect.width(), RATIO_Y(42))); me->SetCheckOff(); me->lOldColor = me->lColor; me->lColor = Color::grayb(127); add(me); pDeleteConfirm = me; } // Load button { std::string szMenuText = getLocalised("system_menus_main_editquest_load"); szMenuText += " "; TextWidget * me = new TextWidget(BUTTON_MENUEDITQUEST_LOAD_CONFIRM, hFontMenu, szMenuText, Vec2i(0, 0)); me->m_targetMenu = MAIN; me->SetPos(Vec2i(RATIO_X(m_size.x-10)-me->m_rect.width(), RATIO_Y(380) + RATIO_Y(40))); me->SetCheckOff(); me->lOldColor = me->lColor; me->lColor = Color::grayb(127); add(me); pLoadConfirm = me; } // Back button { ButtonWidget * cb = new ButtonWidget(RATIO_2(Vec2i(20, 420)), "graph/interface/menus/back"); cb->clicked = boost::bind(&LoadMenuPage::onClickBack, this); cb->m_targetMenu = EDIT_QUEST; cb->SetShortCut(Keyboard::Key_Escape); add(cb); } } }