guiVolumeChange: prevent wrong value position by using 1 label instead of 2 (#5839)

* Use only one label instead of two for the soundText, this permit to ensure both label & values are aligned
* Add '%' character too, to reflect it's a percentage volume
* Remove rect on regenerateGui (upper part) which shadows outer part and which is not needed outside of the DesiredRect affectation

Fix issue #5837
This commit is contained in:
Loïc Blot 2017-05-28 15:23:30 +02:00 committed by GitHub
parent c09e16ff5b
commit ef152428ef

@ -30,10 +30,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "gettext.h"
const int ID_soundText1 = 263;
const int ID_soundText2 = 264;
const int ID_soundExitButton = 265;
const int ID_soundSlider = 266;
const int ID_soundText = 263;
const int ID_soundExitButton = 264;
const int ID_soundSlider = 265;
GUIVolumeChange::GUIVolumeChange(gui::IGUIEnvironment* env,
gui::IGUIElement* parent, s32 id,
@ -50,10 +49,7 @@ GUIVolumeChange::~GUIVolumeChange()
void GUIVolumeChange::removeChildren()
{
if (gui::IGUIElement *e = getElementFromId(ID_soundText1))
e->remove();
if (gui::IGUIElement *e = getElementFromId(ID_soundText2))
if (gui::IGUIElement *e = getElementFromId(ID_soundText))
e->remove();
if (gui::IGUIElement *e = getElementFromId(ID_soundExitButton))
@ -73,34 +69,31 @@ void GUIVolumeChange::regenerateGui(v2u32 screensize)
/*
Calculate new sizes and positions
*/
core::rect<s32> rect(
DesiredRect = core::rect<s32>(
screensize.X/2 - 380/2,
screensize.Y/2 - 200/2,
screensize.X/2 + 380/2,
screensize.Y/2 + 200/2
);
DesiredRect = rect;
recalculateAbsolutePosition(false);
v2s32 size = rect.getSize();
int volume = (int)(g_settings->getFloat("sound_volume")*100);
v2s32 size = DesiredRect.getSize();
int volume = (int)(g_settings->getFloat("sound_volume") * 100);
/*
Add stuff
*/
{
core::rect<s32> rect(0, 0, 120, 20);
rect = rect + v2s32(size.X/2-60, size.Y/2-35);
core::rect<s32> rect(0, 0, 160, 20);
rect = rect + v2s32(size.X / 2 - 80, size.Y / 2 - 35);
const wchar_t *text = wgettext("Sound Volume: ");
Environment->addStaticText(text, rect, false,
true, this, ID_soundText1);
delete[] text;
}
{
core::rect<s32> rect(0, 0, 30, 20);
rect = rect + v2s32(size.X/2+40, size.Y/2-35);
Environment->addStaticText(core::stringw(volume).c_str(), rect, false,
true, this, ID_soundText2);
core::stringw volume_text = text;
delete [] text;
volume_text += core::stringw(volume) + core::stringw("%");
Environment->addStaticText(volume_text.c_str(), rect, false,
true, this, ID_soundText);
}
{
core::rect<s32> rect(0, 0, 80, 30);
@ -155,10 +148,15 @@ bool GUIVolumeChange::OnEvent(const SEvent& event)
if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) {
if (event.GUIEvent.Caller->getID() == ID_soundSlider) {
s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos();
g_settings->setFloat("sound_volume", (float)pos/100);
g_settings->setFloat("sound_volume", (float) pos / 100);
gui::IGUIElement *e = getElementFromId(ID_soundText2);
e->setText(core::stringw(pos).c_str());
gui::IGUIElement *e = getElementFromId(ID_soundText);
const wchar_t *text = wgettext("Sound Volume: ");
core::stringw volume_text = text;
delete [] text;
volume_text += core::stringw(pos) + core::stringw("%");
e->setText(volume_text.c_str());
return true;
}
}