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:
parent
8e3f6439db
commit
ccea97670e
@ -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"
|
||||
|
@ -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 =
|
||||
|
@ -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:
|
||||
|
@ -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()
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user