1
1
forked from 0ad/0ad

CSlider inherits IGUIButtonBehavior to gains button sounds, press/release events, duplication removal, continuation of sliding if the object is not hovered while the button is still pressed, refs #2593, c016a74309/D325, 359df88f1a/D1622.

Use the events to fix jittering of the gamesetup slider in
multiplayermode, refs 352d4ea78f/D2571.

Differential Revision: https://code.wildfiregames.com/D2592
Reviewed By: nani
Comments By: Vladislav
This was SVN commit r23435.
This commit is contained in:
elexis 2020-01-24 00:56:51 +00:00
parent 8e3f6439db
commit ccea97670e
7 changed files with 68 additions and 48 deletions

View File

@ -145,6 +145,7 @@
sprite_bar="ModernSliderLine"
button_width="20"
tooltip_style="tooltipInstant"
sound_pressed="audio/interface/ui/ui_button_click.ogg"
/>
<style name="ModernButtonRed"
sprite="ModernButtonRed"

View File

@ -8,8 +8,11 @@ class GameSettingControlSlider extends GameSettingControl
super(...args);
this.isInGuiUpdate = false;
this.isPressing = false;
this.slider.onValueChange = this.onValueChangeSuper.bind(this);
this.slider.onPress = this.onPress.bind(this);
this.slider.onRelease = this.onRelease.bind(this);
if (this.MinValue !== undefined)
this.slider.min_value = this.MinValue;
@ -44,9 +47,12 @@ class GameSettingControlSlider extends GameSettingControl
setSelectedValue(value, caption)
{
this.isInGuiUpdate = true;
this.slider.value = value;
this.isInGuiUpdate = false;
if (!this.isPressing)
{
this.isInGuiUpdate = true;
this.slider.value = value;
this.isInGuiUpdate = false;
}
this.label.caption = caption;
this.valueLabel.caption = caption;
@ -57,6 +63,16 @@ class GameSettingControlSlider extends GameSettingControl
if (!this.isInGuiUpdate)
this.onValueChange(this.slider.value);
}
onPress()
{
this.isPressing = true;
}
onRelease()
{
this.isPressing = false;
}
}
GameSettingControlSlider.prototype.UnknownValue =

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2019 Wildfire Games.
/* Copyright (C) 2020 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -25,6 +25,8 @@ const CStr IGUIButtonBehavior::EventNamePress = "Press";
const CStr IGUIButtonBehavior::EventNamePressRight = "PressRight";
const CStr IGUIButtonBehavior::EventNameDoublePress = "DoublePress";
const CStr IGUIButtonBehavior::EventNameDoublePressRight = "DoublePressRight";
const CStr IGUIButtonBehavior::EventNameRelease = "Release";
const CStr IGUIButtonBehavior::EventNameReleaseRight = "ReleaseRight";
IGUIButtonBehavior::IGUIButtonBehavior(IGUIObject& pObject)
: m_pObject(pObject),
@ -49,8 +51,19 @@ IGUIButtonBehavior::~IGUIButtonBehavior()
void IGUIButtonBehavior::ResetStates()
{
m_Pressed = false;
m_PressedRight = false;
if (m_Pressed)
{
m_Pressed = false;
m_pObject.PlaySound(m_SoundReleased);
m_pObject.SendEvent(GUIM_PRESSED_MOUSE_RELEASE, EventNameRelease);
}
if (m_PressedRight)
{
m_PressedRight = false;
m_pObject.PlaySound(m_SoundReleased);
m_pObject.SendEvent(GUIM_PRESSED_MOUSE_RELEASE_RIGHT, EventNameReleaseRight);
}
}
void IGUIButtonBehavior::HandleMessage(SGUIMessage& Message)
@ -112,25 +125,13 @@ void IGUIButtonBehavior::HandleMessage(SGUIMessage& Message)
break;
case GUIM_MOUSE_RELEASE_RIGHT:
if (!m_pObject.IsEnabled())
break;
if (m_PressedRight)
{
m_PressedRight = false;
m_pObject.PlaySound(m_SoundReleased);
}
if (m_pObject.IsEnabled())
ResetStates();
break;
case GUIM_MOUSE_RELEASE_LEFT:
if (!m_pObject.IsEnabled())
break;
if (m_Pressed)
{
m_Pressed = false;
m_pObject.PlaySound(m_SoundReleased);
}
if (m_pObject.IsEnabled())
ResetStates();
break;
default:

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2019 Wildfire Games.
/* Copyright (C) 2020 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -64,6 +64,8 @@ protected:
static const CStr EventNamePressRight;
static const CStr EventNameDoublePress;
static const CStr EventNameDoublePressRight;
static const CStr EventNameRelease;
static const CStr EventNameReleaseRight;
/**
* @see IGUIObject#ResetStates()

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2019 Wildfire Games.
/* Copyright (C) 2020 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -26,7 +26,7 @@ const CStr CSlider::EventNameValueChange = "ValueChange";
CSlider::CSlider(CGUI& pGUI)
: IGUIObject(pGUI),
m_IsPressed(),
IGUIButtonBehavior(*static_cast<IGUIObject*>(this)),
m_ButtonSide(),
m_CellID(),
m_MaxValue(),
@ -50,6 +50,12 @@ CSlider::~CSlider()
{
}
void CSlider::ResetStates()
{
IGUIObject::ResetStates();
IGUIButtonBehavior::ResetStates();
}
float CSlider::GetSliderRatio() const
{
return (m_MaxValue - m_MinValue) / (m_CachedActualSize.GetWidth() - m_ButtonSide);
@ -64,6 +70,7 @@ void CSlider::IncrementallyChangeValue(const float difference)
void CSlider::HandleMessage(SGUIMessage& Message)
{
IGUIObject::HandleMessage(Message);
IGUIButtonBehavior::HandleMessage(Message);
switch (Message.type)
{
@ -74,40 +81,26 @@ void CSlider::HandleMessage(SGUIMessage& Message)
}
case GUIM_MOUSE_WHEEL_DOWN:
{
if (m_IsPressed)
if (m_Pressed)
break;
IncrementallyChangeValue(-0.01f);
break;
}
case GUIM_MOUSE_WHEEL_UP:
{
if (m_IsPressed)
if (m_Pressed)
break;
IncrementallyChangeValue(0.01f);
break;
}
case GUIM_MOUSE_PRESS_LEFT:
{
m_Mouse = m_pGUI.GetMousePos();
m_IsPressed = true;
IncrementallyChangeValue((m_Mouse.x - GetButtonRect().CenterPoint().x) * GetSliderRatio());
break;
}
case GUIM_MOUSE_RELEASE_LEFT:
{
m_IsPressed = false;
break;
}
FALLTHROUGH;
case GUIM_MOUSE_MOTION:
{
if (!IsMouseOver())
m_IsPressed = false;
if (m_IsPressed)
if (m_Pressed)
{
float difference = float(m_pGUI.GetMousePos().x - m_Mouse.x) * GetSliderRatio();
m_Mouse = m_pGUI.GetMousePos();
IncrementallyChangeValue(difference);
IncrementallyChangeValue((m_Mouse.x - GetButtonRect().CenterPoint().x) * GetSliderRatio());
}
break;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2019 Wildfire Games.
/* Copyright (C) 2020 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -19,9 +19,10 @@
#define INCLUDED_CSLIDER
#include "gui/CGUISprite.h"
#include "gui/ObjectBases/IGUIButtonBehavior.h"
#include "gui/ObjectBases/IGUIObject.h"
class CSlider : public IGUIObject
class CSlider : public IGUIObject, public IGUIButtonBehavior
{
GUI_OBJECT(CSlider)
@ -32,6 +33,11 @@ public:
protected:
static const CStr EventNameValueChange;
/**
* @see IGUIObject#ResetStates()
*/
virtual void ResetStates();
/**
* @see IGUIObject#HandleMessage()
*/
@ -63,7 +69,6 @@ protected:
float m_Value;
private:
bool m_IsPressed;
CPos m_Mouse;
};

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2019 Wildfire Games.
/* Copyright (C) 2020 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -51,6 +51,8 @@ enum EGUIMessageType
GUIM_LOST_FOCUS,
GUIM_PRESSED_MOUSE_RIGHT,
GUIM_DOUBLE_PRESSED_MOUSE_RIGHT,
GUIM_PRESSED_MOUSE_RELEASE,
GUIM_PRESSED_MOUSE_RELEASE_RIGHT,
GUIM_TAB, // Used by CInput
GUIM_TEXTEDIT
};