/* client/playersettingsmenu.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "client/playersettingsmenu.h" #include "core/cvar.h" #include "ui/button.h" #include "ui/colorpicker.h" #include "ui/iconbutton.h" #include "ui/inputbox.h" #include "ui/label.h" #include "ui/ui.h" #include namespace client { PlayerSettingsMenu::PlayerSettingsMenu(ui::Widget *parent, const char *label) : ui::Window(parent) { set_label(label); set_border(true); set_background(true); set_font(ui::root()->font_small()); // window title _titlelabel = new ui::Label(this); _titlelabel->set_label("title"); _titlelabel->set_background(false); _titlelabel->set_border(false); _titlelabel->set_font(ui::root()->font_large()); _titlelabel->set_alignment(ui::AlignCenter); _titlelabel->set_text("PLAYER SETTINGS"); // close button _closebutton = new ui::IconButton(_titlelabel, "bitmaps/icons/window_close"); // content frame _frame = new ui::Widget(this); _frame->set_label("frame"); _frame->set_background(true); _frame->set_border(true); _frame->set_focus(); // player name _playernamelabel = new ui::Label(_frame); _playernamelabel->set_background(false); _playernamelabel->set_border(false); _playernamelabel->set_text("Name"); _playernameinput = new ui::InputBox(_frame); _playernameinput ->set_label("cl_name"); _playernameinput->set_background(false); _playernameinput->set_border(true); _playernameinput->set_alignment(ui::AlignLeft | ui::AlignVCenter); _playernameinput->set_max(64); // primary color _primarycolorlabel = new ui::Label(_frame); _primarycolorlabel ->set_label("cl_color"); _primarycolorlabel->set_background(false); _primarycolorlabel->set_border(false); _primarycolorlabel->set_text("Primary color"); _primarycolorpicker = new ui::ColorPicker(_frame); _primarycolorpicker->set_background(false); _primarycolorpicker->set_border(true); // secondary color _secondarycolorlabel = new ui::Label(_frame); _secondarycolorlabel ->set_label("cl_colorsecond"); _secondarycolorlabel->set_background(false); _secondarycolorlabel->set_border(false); _secondarycolorlabel->set_text("Secondary color"); _secondarycolorpicker = new ui::ColorPicker(_frame); _secondarycolorpicker->set_background(false); _secondarycolorpicker->set_border(true); // apply button _applybutton = new ui::Button(_frame, "Apply"); _applybutton->set_label("apply"); // reset button _resetbutton = new ui::Button(_frame, "Reset"); _resetbutton->set_label("reset"); } PlayerSettingsMenu::~PlayerSettingsMenu() { } void PlayerSettingsMenu::refresh() { math::Color color; // player name core::Cvar *cv_playername = core::Cvar::find("cl_name"); if (cv_playername) { _playernameinput->set_text(cv_playername->str()); } else { _playernameinput->clear(); } // player primary color core::Cvar *cv_primarycolor = core::Cvar::find("cl_color"); if (cv_primarycolor) { std::stringstream str(cv_primarycolor->str()); if (!(str >> color)) { color.assign(1.0f); } } else { color.assign(1.0f); } _primarycolorpicker->set_color(color); // player secondary color core::Cvar *cv_secondarycolor = core::Cvar::find("cl_colorsecond"); if (cv_secondarycolor) { std::stringstream str(cv_secondarycolor->str()); if (!(str >> color)) { color.assign(0.5f); } } else { color.assign(0.5f); } _secondarycolorpicker->set_color(color); } void PlayerSettingsMenu::show() { refresh(); ui::Window::show(); } void PlayerSettingsMenu::apply() { // verify player name std::string playername(_playernameinput->text()); aux::strip_quotes(playername); aux::trim(playername); if (!playername.size()) { playername.assign("Player"); } _playernameinput->set_text(playername); // apply player name core::Cvar *cv_playername = core::Cvar::find("cl_name"); if (cv_playername) { cv_playername->assign(playername); } // apply player primary color core::Cvar *cv_primarycolor = core::Cvar::find("cl_color"); if (cv_primarycolor) { math::Color color(_primarycolorpicker->color()); std::stringstream str; str << color; cv_primarycolor->assign(str.str()); } // apply player secondary color core::Cvar *cv_secondarycolor = core::Cvar::find("cl_colorsecond"); if (cv_secondarycolor) { math::Color color(_secondarycolorpicker->color()); std::stringstream str; str << color; cv_secondarycolor->assign(str.str()); } } void PlayerSettingsMenu::resize() { const float padding = ui::UI::padding; const float margin = ui::UI::margin; // resize title label _titlelabel->set_size(width() - padding * 2.0f, _titlelabel->font()->height()); _titlelabel->set_location(padding, padding); // resize close button _closebutton->set_size(_titlelabel->font()->height(), _titlelabel->font()->height()); _closebutton->set_location(_titlelabel->width() - _closebutton->width(), 0); // resize content frame _frame->set_location(_titlelabel->left(), _titlelabel->bottom() + padding); _frame->set_size(_titlelabel->width(), height() - _titlelabel->bottom() - padding * 2.0f); //---- inside _frame ---- // resize player name label _playernamelabel->set_location(padding, padding); _playernamelabel->set_size(ui::UI::elementsize.width(), _playernamelabel->font()->height() + margin); // resize player name inputbox _playernameinput->set_location(_playernamelabel->right() + padding, _playernamelabel->top()); _playernameinput->set_size(_frame->width() - _playernamelabel->right() - 2.0f * padding, _playernamelabel->height()); // resize primary color label _primarycolorlabel->set_size(ui::UI::elementsize.width(), _primarycolorlabel->font()->height() + margin); _primarycolorlabel->set_location(padding, _playernamelabel->bottom() + margin); // resize primary color picker _primarycolorpicker->set_size(_playernameinput->width(), ui::UI::elementsize.height() * 4.0f); _primarycolorpicker->set_location(_primarycolorlabel->right() + padding, _primarycolorlabel->top()); // resize secondary color label _secondarycolorlabel->set_size(ui::UI::elementsize.width(), _primarycolorlabel->font()->height() + margin); _secondarycolorlabel->set_location(padding,_primarycolorpicker->bottom() + margin); // resize secondary color picker _secondarycolorpicker->set_size(_playernameinput->width(), ui::UI::elementsize.height() * 4.0f); _secondarycolorpicker->set_location(_secondarycolorlabel->right() + padding, _secondarycolorlabel->top()); // resize apply button _applybutton->set_size(ui::UI::elementsize); _applybutton->set_location( (_frame->width() - 2.0f * ui::UI::elementsize.width() - padding) * 0.5f, _frame->height() - _applybutton->height() - padding ); // resize reset button _resetbutton->set_size(ui::UI::elementsize); _resetbutton->set_location(_applybutton->right() + padding, _applybutton->top()); } bool PlayerSettingsMenu::on_emit(ui::Widget *sender, const ui::Widget::Event event, void *data) { if (sender == _closebutton) { if (event == ui::Widget::EventButtonClicked) { parent()->hide(); return true; } } else if (sender == _applybutton) { if (event == ui::Widget::EventButtonClicked) { apply(); return true; } } else if (sender == _resetbutton) { if (event == ui::Widget::EventButtonClicked) { refresh(); return true; } } return Window::on_emit(sender, event, data); } } // namespace client