Преглед изворни кода

Add ScrollParentage scroll option for scrolling only in closest scroll container

Use it in drop down widget, since that is shown on top of parents, and also because it results in closing the box when scrolling parents.
Michael Ragazzon пре 1 година
родитељ
комит
1c5c240587
3 измењених фајлова са 12 додато и 3 уклоњено
  1. 8 3
      Include/RmlUi/Core/ScrollTypes.h
  2. 3 0
      Source/Core/Element.cpp
  3. 1 0
      Source/Core/Elements/WidgetDropDown.cpp

+ 8 - 3
Include/RmlUi/Core/ScrollTypes.h

@@ -44,18 +44,23 @@ enum class ScrollAlignment {
 	Nearest, // Align with minimal scroll change.
 };
 
+enum class ScrollParentage {
+	All,     // Scroll all ancestor scroll containers as needed.
+	Closest, // Scroll only the closest scroll container.
+};
+
 /**
     Defines behavior of Element::ScrollIntoView.
  */
 struct ScrollIntoViewOptions {
 	ScrollIntoViewOptions(ScrollAlignment vertical = ScrollAlignment::Start, ScrollAlignment horizontal = ScrollAlignment::Nearest,
-		ScrollBehavior behavior = ScrollBehavior::Instant) :
-		vertical(vertical),
-		horizontal(horizontal), behavior(behavior)
+		ScrollBehavior behavior = ScrollBehavior::Instant, ScrollParentage parentage = ScrollParentage::All) :
+		vertical(vertical), horizontal(horizontal), behavior(behavior), parentage(parentage)
 	{}
 	ScrollAlignment vertical;
 	ScrollAlignment horizontal;
 	ScrollBehavior behavior;
+	ScrollParentage parentage;
 };
 
 } // namespace Rml

+ 3 - 0
Source/Core/Element.cpp

@@ -1228,6 +1228,9 @@ void Element::ScrollIntoView(const ScrollIntoViewOptions options)
 			// Currently, only a single scrollable parent can be smooth scrolled at a time, so any other parents must be instant scrolled.
 			scroll_behavior = ScrollBehavior::Instant;
 		}
+
+		if ((scrollable_box_x || scrollable_box_y) && options.parentage == ScrollParentage::Closest)
+			break;
 	}
 }
 

+ 1 - 0
Source/Core/Elements/WidgetDropDown.cpp

@@ -240,6 +240,7 @@ void WidgetDropDown::OnRender()
 				box_opened_since_last_format ? ScrollAlignment::Center : ScrollAlignment::Nearest,
 				ScrollAlignment::Nearest,
 				ScrollBehavior::Instant,
+				ScrollParentage::Closest,
 			};
 			GetOption(selection)->ScrollIntoView(scroll_options);
 		}