瀏覽代碼

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.
 	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.
     Defines behavior of Element::ScrollIntoView.
  */
  */
 struct ScrollIntoViewOptions {
 struct ScrollIntoViewOptions {
 	ScrollIntoViewOptions(ScrollAlignment vertical = ScrollAlignment::Start, ScrollAlignment horizontal = ScrollAlignment::Nearest,
 	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 vertical;
 	ScrollAlignment horizontal;
 	ScrollAlignment horizontal;
 	ScrollBehavior behavior;
 	ScrollBehavior behavior;
+	ScrollParentage parentage;
 };
 };
 
 
 } // namespace Rml
 } // 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.
 			// 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;
 			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,
 				box_opened_since_last_format ? ScrollAlignment::Center : ScrollAlignment::Nearest,
 				ScrollAlignment::Nearest,
 				ScrollAlignment::Nearest,
 				ScrollBehavior::Instant,
 				ScrollBehavior::Instant,
+				ScrollParentage::Closest,
 			};
 			};
 			GetOption(selection)->ScrollIntoView(scroll_options);
 			GetOption(selection)->ScrollIntoView(scroll_options);
 		}
 		}