Browse Source

Remove scrollchange event, replace by function call.

Michael Ragazzon 6 years ago
parent
commit
130e3fb48f

+ 1 - 6
Include/Rocket/Core/ElementScroll.h

@@ -29,7 +29,6 @@
 #define ROCKETCOREELEMENTSCROLL_H
 
 #include "Header.h"
-#include "EventListener.h"
 
 namespace Rocket {
 namespace Core {
@@ -43,7 +42,7 @@ class WidgetSliderScroll;
 	@author Peter Curry
  */
 
-class ROCKETCORE_API ElementScroll : public EventListener
+class ROCKETCORE_API ElementScroll
 {
 public:
 	enum Orientation
@@ -85,10 +84,6 @@ public:
 	/// Clears the scrollbars, resetting it to initial conditions.
 	void ClearScrollbars();
 
-protected:
-	/// Handles the 'onchange' events for the scrollbars.
-	void ProcessEvent(Event& event) override;
-
 private:
 	struct Scrollbar
 	{

+ 0 - 1
Include/Rocket/Core/ID.h

@@ -64,7 +64,6 @@ enum class EventId : uint16_t
 	Handledrag,
 	Resize,
 	Scroll,
-	Scrollchange,
 	Animationend,
 	Transitionend,
 

+ 25 - 14
Source/Core/Element.cpp

@@ -1081,11 +1081,15 @@ float Element::GetScrollLeft()
 // Sets the left scroll offset of the element.
 void Element::SetScrollLeft(float scroll_left)
 {
-	scroll_offset.x = Math::Clamp(scroll_left, 0.0f, GetScrollWidth() - GetClientWidth());
-	scroll->UpdateScrollbar(ElementScroll::HORIZONTAL);
-	DirtyOffset();
+	const float new_offset = Math::Clamp(scroll_left, 0.0f, GetScrollWidth() - GetClientWidth());
+	if (new_offset != scroll_offset.x)
+	{
+		scroll_offset.x = new_offset;
+		scroll->UpdateScrollbar(ElementScroll::HORIZONTAL);
+		DirtyOffset();
 
-	DispatchEvent(EventId::Scroll, Dictionary());
+		DispatchEvent(EventId::Scroll, Dictionary());
+	}
 }
 
 // Gets the top scroll offset of the element.
@@ -1097,11 +1101,15 @@ float Element::GetScrollTop()
 // Sets the top scroll offset of the element.
 void Element::SetScrollTop(float scroll_top)
 {
-	scroll_offset.y = Math::Clamp(scroll_top, 0.0f, GetScrollHeight() - GetClientHeight());
-	scroll->UpdateScrollbar(ElementScroll::VERTICAL);
-	DirtyOffset();
+	const float new_offset = Math::Clamp(scroll_top, 0.0f, GetScrollHeight() - GetClientHeight());
+	if(new_offset != scroll_offset.y)
+	{
+		scroll_offset.y = new_offset;
+		scroll->UpdateScrollbar(ElementScroll::VERTICAL);
+		DirtyOffset();
 
-	DispatchEvent(EventId::Scroll, Dictionary());
+		DispatchEvent(EventId::Scroll, Dictionary());
+	}
 }
 
 // Gets the width of the scrollable content of the element; it includes the element padding but not its margin.
@@ -2101,14 +2109,17 @@ void Element::ReleaseElements(ElementList& released_elements)
 
 void Element::DirtyOffset()
 {
-	offset_dirty = true;
+	if(!offset_dirty)
+	{
+		offset_dirty = true;
 
-	if(transform_state)
-		DirtyTransformState(true, true, false);
+		if(transform_state)
+			DirtyTransformState(true, true, false);
 
-	// Not strictly true ... ?
-	for (size_t i = 0; i < children.size(); i++)
-		children[i]->DirtyOffset();
+		// Not strictly true ... ?
+		for (size_t i = 0; i < children.size(); i++)
+			children[i]->DirtyOffset();
+	}
 }
 
 void Element::UpdateOffset()

+ 0 - 15
Source/Core/ElementScroll.cpp

@@ -54,7 +54,6 @@ void ElementScroll::ClearScrollbars()
 	{
 		if (scrollbars[i].element != NULL)
 		{
-			scrollbars[i].element->RemoveEventListener("scrollchange", this);
 			scrollbars[i] = Scrollbar();
 		}
 	}
@@ -227,19 +226,6 @@ void ElementScroll::FormatScrollbars()
 	}
 }
 
-// Handles the 'onchange' events for the scrollbars.
-void ElementScroll::ProcessEvent(Event& event)
-{
-	if (event == EventId::Scrollchange)
-	{
-		float value = event.GetParameter< float >("value", 0);
-
-		if (event.GetTargetElement() == scrollbars[VERTICAL].element)
-			element->SetScrollTop(value * (element->GetScrollHeight() - element->GetClientHeight()));
-		else
-			element->SetScrollLeft(value * (element->GetScrollWidth() - element->GetClientWidth()));
-	}
-}
 
 // Creates one of the scroll component's scrollbar.
 bool ElementScroll::CreateScrollbar(Orientation orientation)
@@ -249,7 +235,6 @@ bool ElementScroll::CreateScrollbar(Orientation orientation)
 		return true;
 
 	scrollbars[orientation].element = Factory::InstanceElement(element, "*", orientation == VERTICAL ? "scrollbarvertical" : "scrollbarhorizontal", XMLAttributes());
-	scrollbars[orientation].element->AddEventListener("scrollchange", this);
 	scrollbars[orientation].element->SetProperty(CLIP, Property(1, Property::NUMBER));
 
 	scrollbars[orientation].widget = new WidgetSliderScroll(scrollbars[orientation].element);

+ 0 - 1
Source/Core/EventSpecification.cpp

@@ -75,7 +75,6 @@ void Initialize()
 		{EventId::Handledrag    , "handledrag"    , false , true  , DefaultActionPhase::None},
 		{EventId::Resize        , "resize"        , false , false , DefaultActionPhase::None},
 		{EventId::Scroll        , "scroll"        , false , true  , DefaultActionPhase::None},
-		{EventId::Scrollchange  , "scrollchange"  , false , true  , DefaultActionPhase::None},
 		{EventId::Animationend  , "animationend"  , true  , true  , DefaultActionPhase::None},
 		{EventId::Transitionend , "transitionend" , true  , true  , DefaultActionPhase::None},
 								 				 

+ 13 - 3
Source/Core/WidgetSlider.cpp

@@ -190,9 +190,19 @@ void WidgetSlider::SetBarPosition(float _bar_position)
 {
 	bar_position = Math::Clamp(_bar_position, 0.0f, 1.0f);
 	PositionBar();
-
-	Dictionary parameters = { {"value", bar_position} };
-	parent->DispatchEvent(EventId::Scrollchange, parameters);
+	
+	// 'parent' is the scrollbar element, its parent again is the actual element we want to scroll
+	Element* element_scroll = parent->GetParentNode();
+	if (!element_scroll)
+	{
+		ROCKET_ERROR;
+		return;
+	}
+	
+	if (orientation == VERTICAL)
+		element_scroll->SetScrollTop(bar_position * (element_scroll->GetScrollHeight() - element_scroll->GetClientHeight()));
+	else if (orientation == HORIZONTAL)
+		element_scroll->SetScrollLeft(bar_position * (element_scroll->GetScrollWidth() - element_scroll->GetClientWidth()));
 }
 
 // Returns the current position of the bar.