/** Called when a user is selected. It updates the online checkbox and * entry fields. */ void BaseUserScreen::selectUser(int index) { PlayerProfile *profile = PlayerManager::get()->getPlayer(index); assert(profile); // Only set focus in case of non-tabbed version (so that keyboard // or gamepad navigation with tabs works as expected, i.e. you can // select the next tab without having to go up to the tab list first. bool focus_it = !getWidget<RibbonWidget>("options_choice"); m_players->setSelection(StringUtils::toString(index), PLAYER_ID_GAME_MASTER, focus_it); if (!m_new_registered_data) m_username_tb->setText(profile->getLastOnlineName(true/*ignoreRTL*/)); if (!m_new_registered_data) { // Delete a password that might have been typed for another user m_password_tb->setText(""); } getWidget<CheckBoxWidget>("remember-user")->setState( profile->rememberPassword()); // Last game was not online, so make the offline settings the default // (i.e. unckeck online checkbox, and make entry fields invisible). if (!profile->wasOnlineLastTime() || profile->getLastOnlineName() == "") { if (!m_new_registered_data) m_online_cb->setState(false); makeEntryFieldsVisible(); return; } // Now last use was with online --> Display the saved data if (UserConfigParams::m_internet_status == Online::RequestManager::IPERM_NOT_ALLOWED) m_online_cb->setState(false); else m_online_cb->setState(true); makeEntryFieldsVisible(); m_username_tb->setActive(profile->getLastOnlineName().size() == 0); // And make the password invisible if the session is saved (i.e // the user does not need to enter a password). if (profile->hasSavedSession()) { m_password_tb->setVisible(false); getWidget<LabelWidget>("label_password")->setVisible(false); getWidget<ButtonWidget>("password_reset")->setVisible(false); } } // selectUser
// ---------------------------------------------------------------------------- void MainMenuScreen::onUpdate(float delta) { PlayerProfile *player = PlayerManager::getCurrentPlayer(); if(PlayerManager::getCurrentOnlineState() == PlayerProfile::OS_GUEST || PlayerManager::getCurrentOnlineState() == PlayerProfile::OS_SIGNED_IN) { m_user_id->setText(player->getLastOnlineName() + "@stk"); m_online->setActivated(); m_online->setLabel( _("Online")); } else if (PlayerManager::getCurrentOnlineState() == PlayerProfile::OS_SIGNED_OUT) { m_online->setActivated(); m_online->setLabel( _("Login" )); m_user_id->setText(player->getName()); } else { // now must be either logging in or logging out m_online->setDeactivated(); m_user_id->setText(player->getName()); } m_online->setLabel(PlayerManager::getCurrentOnlineId() ? _("Online") : _("Login" ) ); IconButtonWidget* addons_icon = getWidget<IconButtonWidget>("addons"); if (addons_icon != NULL) { if (addons_manager->wasError()) { addons_icon->setActivated(); addons_icon->resetAllBadges(); addons_icon->setBadge(BAD_BADGE); } else if (addons_manager->isLoading() && UserConfigParams::m_internet_status == Online::RequestManager::IPERM_ALLOWED) { // Addons manager is still initialising/downloading. addons_icon->setDeactivated(); addons_icon->resetAllBadges(); addons_icon->setBadge(LOADING_BADGE); } else { addons_icon->setActivated(); addons_icon->resetAllBadges(); } // maybe add a new badge when not allowed to access the net } LabelWidget* w = getWidget<LabelWidget>("info_addons"); w->update(delta); if(w->scrolledOff()) { const core::stringw &news_text = NewsManager::get()->getNextNewsMessage(); w->setText(news_text, true); } } // onUpdate
/** Called when a user is selected. It updates the online checkbox and * entrye fields. */ void BaseUserScreen::selectUser(int index) { PlayerProfile *profile = PlayerManager::get()->getPlayer(index); assert(profile); m_players->setSelection(StringUtils::toString(index), PLAYER_ID_GAME_MASTER, /*focusIt*/ true); m_username_tb->setText(profile->getLastOnlineName()); // Delete a password that might have been typed for another user m_password_tb->setText(""); // Last game was not online, so make the offline settings the default // (i.e. unckeck online checkbox, and make entry fields invisible). if (!profile->wasOnlineLastTime() || profile->getLastOnlineName() == "") { m_online_cb->setState(false); makeEntryFieldsVisible(); return; } // Now last use was with online --> Display the saved data m_online_cb->setState(true); makeEntryFieldsVisible(); getWidget<CheckBoxWidget>("remember-user")->setState( profile->rememberPassword()); if(profile->getLastOnlineName().size()>0) m_username_tb->setDeactivated(); else m_username_tb->setActivated(); // And make the password invisible if the session is saved (i.e // the user does not need to enter a password). if (profile->hasSavedSession()) { m_password_tb->setVisible(false); getWidget<LabelWidget>("label_password")->setVisible(false); } } // selectUser
/** Make the entry fields either visible or invisible. * \param online Online state, which dicates if the entry fields are * visible (true) or not. */ void BaseUserScreen::makeEntryFieldsVisible() { #ifdef GUEST_ACCOUNTS_ENABLED getWidget<LabelWidget>("label_guest")->setVisible(online); getWidget<CheckBoxWidget>("guest")->setVisible(online); #endif bool online = m_online_cb->getState(); getWidget<LabelWidget>("label_username")->setVisible(online); m_username_tb->setVisible(online); getWidget<LabelWidget>("label_remember")->setVisible(online); getWidget<CheckBoxWidget>("remember-user")->setVisible(online); PlayerProfile *player = getSelectedPlayer(); // Don't show the password fields if the player wants to be online // and either is the current player and logged in (no need to enter a // password then) or has a saved session. if(player && online && (player->hasSavedSession() || (player==PlayerManager::getCurrentPlayer() && player->isLoggedIn() ) ) ) { // If we show the online login fields, but the player has a // saved session, don't show the password field. getWidget<LabelWidget>("label_password")->setVisible(false); m_password_tb->setVisible(false); getWidget<ButtonWidget>("password_reset")->setVisible(false); } else { getWidget<LabelWidget>("label_password")->setVisible(online); m_password_tb->setVisible(online); getWidget<ButtonWidget>("password_reset")->setVisible(Online::LinkHelper::isSupported() && online); // Is user has no online name, make sure the user can enter one if (player->getLastOnlineName().empty()) m_username_tb->setActive(true); } } // makeEntryFieldsVisible
/** Called once every frame. It will replace this screen with the main menu * screen if a successful login happened. */ void BaseUserScreen::onUpdate(float dt) { if (!m_options_widget->isActivated()) { core::stringw message = (m_state & STATE_LOGOUT) ? _(L"Signing out '%s'",m_sign_out_name.c_str()) : _(L"Signing in '%s'", m_sign_in_name.c_str()); m_info_widget->setText(StringUtils::loadingDots(message.c_str()), false ); } PlayerProfile *player = getSelectedPlayer(); if(player) { // If the player changes the online name, clear the saved session // flag, and make the password field visible again. if (m_username_tb->getText()!=player->getLastOnlineName()) { player->clearSession(); makeEntryFieldsVisible(); } } } // onUpdate
/** Called when OK or OK-and-save is clicked. * This will trigger the actual login (if requested) etc. * \param remember_me True if the login details should be remembered, * so that next time this menu can be skipped. */ void BaseUserScreen::login() { // If an error occurs, the callback informing this screen about the // problem will activate the widget again. m_options_widget->setActive(false); m_state = STATE_NONE; PlayerProfile *player = getSelectedPlayer(); PlayerProfile *current = PlayerManager::getCurrentPlayer(); core::stringw new_username = m_username_tb->getText(); // If a different player is connecting, or the same local player with // a different online account, log out the current player. if(current && current->isLoggedIn() && (player!=current || current->getLastOnlineName(true/*ignoreRTL*/)!=new_username) ) { m_sign_out_name = current->getLastOnlineName(true/*ignoreRTL*/); current->requestSignOut(); m_state = (UserScreenState)(m_state | STATE_LOGOUT); // If the online user name was changed, reset the save data // for this user (otherwise later the saved session will be // resumed, not logging the user with the new account). if(player==current && current->getLastOnlineName(true/*ignoreRTL*/)!=new_username) current->clearSession(); } PlayerManager::get()->setCurrentPlayer(player); assert(player); // If no online login requested, log the player out (if necessary) // and go to the main menu screen (though logout needs to finish first) if(!m_online_cb->getState()) { if(player->isLoggedIn()) { m_sign_out_name =player->getLastOnlineName(true/*ignoreRTL*/); player->requestSignOut(); m_state =(UserScreenState)(m_state| STATE_LOGOUT); } player->setWasOnlineLastTime(false); if(m_state==STATE_NONE) { closeScreen(); } return; } // Player wants to be online, and is already online - nothing to do if(player->isLoggedIn()) { player->setWasOnlineLastTime(true); closeScreen(); return; } m_state = (UserScreenState) (m_state | STATE_LOGIN); // Now we need to start a login request to the server // This implies that this screen will wait till the server responds, so // that error messages ('invalid password') can be shown, and the user // can decide what to do about them. if (player->hasSavedSession()) { m_sign_in_name = player->getLastOnlineName(true/*ignoreRTL*/); // Online login with saved token player->requestSavedSession(); } else { // Online login with password --> we need a valid password if (m_password_tb->getText() == "") { m_info_widget->setText(_("You need to enter a password."), true); SFXManager::get()->quickSound("anvil"); m_options_widget->setActive(true); return; } m_sign_in_name = m_username_tb->getText(); player->requestSignIn(m_username_tb->getText(), m_password_tb->getText()); } // !hasSavedSession } // login