From 56d7e7deadef65feed1d8531580593e85ed69ff3 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 23 Jul 2016 19:18:30 +0200 Subject: Added player settings menu. --- src/client/playersettingsmenu.cc | 276 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100644 src/client/playersettingsmenu.cc (limited to 'src/client/playersettingsmenu.cc') diff --git a/src/client/playersettingsmenu.cc b/src/client/playersettingsmenu.cc new file mode 100644 index 0000000..ca7fadf --- /dev/null +++ b/src/client/playersettingsmenu.cc @@ -0,0 +1,276 @@ +/* + 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()); + // 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()); + // 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 -- cgit v1.2.3