Browse Source

Make slider widget only able to be dragged from the track or bar, instead of the whole element

Michael Ragazzon 2 years ago
parent
commit
dafe38bb40
1 changed files with 10 additions and 21 deletions
  1. 10 21
      Source/Core/Elements/WidgetSlider.cpp

+ 10 - 21
Source/Core/Elements/WidgetSlider.cpp

@@ -66,15 +66,10 @@ WidgetSlider::WidgetSlider(ElementFormControl* _parent)
 
 WidgetSlider::~WidgetSlider()
 {
-	if (bar != nullptr)
-	{
+	if (bar)
 		parent->RemoveChild(bar);
-	}
-
-	if (track != nullptr)
-	{
+	if (track)
 		parent->RemoveChild(track);
-	}
 
 	parent->RemoveEventListener(EventId::Blur, this);
 	parent->RemoveEventListener(EventId::Focus, this);
@@ -88,19 +83,14 @@ WidgetSlider::~WidgetSlider()
 
 	for (int i = 0; i < 2; i++)
 	{
-		if (arrows[i] != nullptr)
-		{
+		if (arrows[i])
 			parent->RemoveChild(arrows[i]);
-		}
 	}
 }
 
 // Initialises the slider to a given orientation.
 bool WidgetSlider::Initialise()
 {
-	Property drag_property = Property(Style::Drag::Drag);
-	parent->SetProperty(PropertyId::Drag, drag_property);
-
 	// Create all of our child elements as standard elements, and abort if we can't create them.
 	ElementPtr track_element = Factory::InstanceElement(parent, "*", "slidertrack", XMLAttributes());
 	ElementPtr bar_element = Factory::InstanceElement(parent, "*", "sliderbar", XMLAttributes());
@@ -108,9 +98,7 @@ bool WidgetSlider::Initialise()
 	ElementPtr arrow1_element = Factory::InstanceElement(parent, "*", "sliderarrowinc", XMLAttributes());
 
 	if (!track_element || !bar_element || !arrow0_element || !arrow1_element)
-	{
 		return false;
-	}
 
 	// Add them as non-DOM elements.
 	track = parent->AppendChild(std::move(track_element), false);
@@ -118,8 +106,9 @@ bool WidgetSlider::Initialise()
 	arrows[0] = parent->AppendChild(std::move(arrow0_element), false);
 	arrows[1] = parent->AppendChild(std::move(arrow1_element), false);
 
-	arrows[0]->SetProperty(PropertyId::Drag, drag_property);
-	arrows[1]->SetProperty(PropertyId::Drag, drag_property);
+	const Property drag_property = Property(Style::Drag::Drag);
+	track->SetProperty(PropertyId::Drag, drag_property);
+	bar->SetProperty(PropertyId::Drag, drag_property);
 
 	// Attach the listeners
 	// All listeners are attached to parent, ensuring that we don't get duplicate events when it bubbles from child to parent
@@ -374,7 +363,7 @@ void WidgetSlider::ProcessEvent(Event& event)
 		if (event.GetParameter("button", -1) != 0)
 			break;
 
-		if (event.GetTargetElement() == parent || event.GetTargetElement() == track)
+		if (event.GetTargetElement() == track)
 		{
 			float mouse_position, bar_halfsize;
 
@@ -419,7 +408,7 @@ void WidgetSlider::ProcessEvent(Event& event)
 
 	case EventId::Dragstart:
 	{
-		if (event.GetTargetElement() == parent)
+		if (event.GetTargetElement() == bar || event.GetTargetElement() == track)
 		{
 			bar->SetPseudoClass("active", true);
 
@@ -432,7 +421,7 @@ void WidgetSlider::ProcessEvent(Event& event)
 	break;
 	case EventId::Drag:
 	{
-		if (event.GetTargetElement() == parent)
+		if (event.GetTargetElement() == bar || event.GetTargetElement() == track)
 		{
 			float new_bar_offset = event.GetParameter< float >((orientation == HORIZONTAL ? "mouse_x" : "mouse_y"), 0) - bar_drag_anchor;
 			float new_bar_position = AbsolutePositionToBarPosition(new_bar_offset);
@@ -443,7 +432,7 @@ void WidgetSlider::ProcessEvent(Event& event)
 	break;
 	case EventId::Dragend:
 	{
-		if (event.GetTargetElement() == parent)
+		if (event.GetTargetElement() == bar || event.GetTargetElement() == track)
 		{
 			bar->SetPseudoClass("active", false);
 		}