/* * Copyright 2010-2015 OpenXcom Developers. * * This file is part of OpenXcom. * * OpenXcom is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenXcom is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenXcom. If not, see . */ #include "OptionsAdvancedState.h" #include #include "../Engine/Game.h" #include "../Resource/ResourcePack.h" #include "../Engine/LocalizedText.h" #include "../Interface/Window.h" #include "../Interface/Text.h" #include "../Interface/TextList.h" #include "../Engine/Options.h" #include "../Engine/Action.h" #include namespace OpenXcom { /** * Initializes all the elements in the Advanced Options window. * @param game Pointer to the core game. * @param origin Game section that originated this state. */ OptionsAdvancedState::OptionsAdvancedState(OptionsOrigin origin) : OptionsBaseState(origin) { setCategory(_btnAdvanced); // Create objects _lstOptions = new TextList(200, 136, 94, 8); if (origin != OPT_BATTLESCAPE) { add(_lstOptions, "optionLists", "advancedMenu"); } else { add(_lstOptions, "optionLists", "battlescape"); } centerAllSurfaces(); // how much room do we need for YES/NO Text text = Text(100, 9, 0, 0); text.initText(_game->getResourcePack()->getFont("FONT_BIG"), _game->getResourcePack()->getFont("FONT_SMALL"), _game->getLanguage()); text.setText(tr("STR_YES")); int yes = text.getTextWidth(); text.setText(tr("STR_NO")); int no = text.getTextWidth(); int rightcol = std::max(yes, no) + 2; int leftcol = _lstOptions->getWidth() - rightcol; // Set up objects _lstOptions->setAlign(ALIGN_RIGHT, 1); _lstOptions->setColumns(2, leftcol, rightcol); _lstOptions->setWordWrap(true); _lstOptions->setSelectable(true); _lstOptions->setBackground(_window); _lstOptions->onMouseClick((ActionHandler)&OptionsAdvancedState::lstOptionsClick, 0); _lstOptions->onMouseOver((ActionHandler)&OptionsAdvancedState::lstOptionsMouseOver); _lstOptions->onMouseOut((ActionHandler)&OptionsAdvancedState::lstOptionsMouseOut); _colorGroup = _lstOptions->getSecondaryColor(); const std::vector &options = Options::getOptionInfo(); for (std::vector::const_iterator i = options.begin(); i != options.end(); ++i) { if (i->type() != OPTION_KEY && !i->description().empty()) { if (i->category() == "STR_GENERAL") { _settingsGeneral.push_back(*i); } else if (i->category() == "STR_GEOSCAPE") { _settingsGeo.push_back(*i); } else if (i->category() == "STR_BATTLESCAPE") { _settingsBattle.push_back(*i); } } } } /** * */ OptionsAdvancedState::~OptionsAdvancedState() { } /** * Fills the settings list based on category. */ void OptionsAdvancedState::init() { OptionsBaseState::init(); _lstOptions->clearList(); _lstOptions->addRow(2, tr("STR_GENERAL").c_str(), L""); _lstOptions->setCellColor(0, 0, _colorGroup); addSettings(_settingsGeneral); _lstOptions->addRow(2, L"", L""); _lstOptions->addRow(2, tr("STR_GEOSCAPE").c_str(), L""); _lstOptions->setCellColor(_settingsGeneral.size() + 2, 0, _colorGroup); addSettings(_settingsGeo); _lstOptions->addRow(2, L"", L""); _lstOptions->addRow(2, tr("STR_BATTLESCAPE").c_str(), L""); _lstOptions->setCellColor(_settingsGeneral.size() + 2 + _settingsGeo.size() + 2, 0, _colorGroup); addSettings(_settingsBattle); } /** * Adds a bunch of settings to the list. * @param settings List of settings. */ void OptionsAdvancedState::addSettings(const std::vector &settings) { for (std::vector::const_iterator i = settings.begin(); i != settings.end(); ++i) { std::wstring name = tr(i->description()); std::wstring value; if (i->type() == OPTION_BOOL) { value = *i->asBool() ? tr("STR_YES") : tr("STR_NO"); } else if (i->type() == OPTION_INT) { std::wostringstream ss; ss << *i->asInt(); value = ss.str(); } _lstOptions->addRow(2, name.c_str(), value.c_str()); } } /** * Gets the currently selected setting. * @param sel Selected row. * @return Pointer to option, NULL if none selected. */ OptionInfo *OptionsAdvancedState::getSetting(size_t sel) { if (sel > 0 && sel <= _settingsGeneral.size()) { return &_settingsGeneral[sel - 1]; } else if (sel > _settingsGeneral.size() + 2 && sel <= _settingsGeneral.size() + 2 + _settingsGeo.size()) { return &_settingsGeo[sel - 1 - _settingsGeneral.size() - 2]; } else if (sel > _settingsGeneral.size() + 2 + _settingsGeo.size() + 2 && sel <= _settingsGeneral.size() + 2 + _settingsGeo.size() + 2 + _settingsBattle.size()) { return &_settingsBattle[sel - 1 - _settingsGeneral.size() - 2 - _settingsGeo.size() - 2]; } else { return 0; } } /** * Changes the clicked setting. * @param action Pointer to an action. */ void OptionsAdvancedState::lstOptionsClick(Action *action) { Uint8 button = action->getDetails()->button.button; if (button != SDL_BUTTON_LEFT && button != SDL_BUTTON_RIGHT) { return; } size_t sel = _lstOptions->getSelectedRow(); OptionInfo *setting = getSetting(sel); if (!setting) return; std::wstring settingText; if (setting->type() == OPTION_BOOL) { bool *b = setting->asBool(); *b = !*b; settingText = *b ? tr("STR_YES") : tr("STR_NO"); } else if (setting->type() == OPTION_INT) // integer variables will need special handling { int *i = setting->asInt(); int increment = (button == SDL_BUTTON_LEFT) ? 1 : -1; // left-click increases, right-click decreases if (i == &Options::changeValueByMouseWheel || i == &Options::FPS || i == &Options::FPSInactive) { increment *= 10; } *i += increment; int min = 0, max = 0; if (i == &Options::battleExplosionHeight) { min = 0; max = 3; } else if (i == &Options::changeValueByMouseWheel) { min = 0; max = 50; } else if (i == &Options::FPS) { min = 0; max = 120; } else if (i == &Options::FPSInactive) { min = 10; max = 120; } else if (i == &Options::mousewheelSpeed) { min = 1; max = 7; } else if (i == &Options::autosaveFrequency) { min = 1; max = 5; } if (*i < min) { *i = max; } else if (*i > max) { *i = min; } std::wostringstream ss; ss << *i; settingText = ss.str(); } _lstOptions->setCellText(sel, 1, settingText.c_str()); } void OptionsAdvancedState::lstOptionsMouseOver(Action *) { size_t sel = _lstOptions->getSelectedRow(); OptionInfo *setting = getSetting(sel); std::wstring desc; if (setting) { desc = tr(setting->description() + "_DESC"); } _txtTooltip->setText(desc.c_str()); } void OptionsAdvancedState::lstOptionsMouseOut(Action *) { _txtTooltip->setText(L""); } }