Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/screen/area_query.c')
-rw-r--r--source/blender/editors/screen/area_query.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/source/blender/editors/screen/area_query.c b/source/blender/editors/screen/area_query.c
index fd4f3964398..30e744ca174 100644
--- a/source/blender/editors/screen/area_query.c
+++ b/source/blender/editors/screen/area_query.c
@@ -140,6 +140,10 @@ bool ED_region_overlap_isect_xy_with_margin(const ARegion *region,
ED_region_overlap_isect_y_with_margin(region, event_xy[1], margin));
}
+/**
+ * \note: This may return true for multiple overlapping regions. If it matters, check overlapped
+ * regions first (#ARegion.overlap).
+ */
bool ED_region_contains_xy(const ARegion *region, const int event_xy[2])
{
/* Only use the margin when inside the region. */
@@ -188,3 +192,44 @@ bool ED_region_contains_xy(const ARegion *region, const int event_xy[2])
}
return false;
}
+
+/**
+ * Similar to #BKE_area_find_region_xy() but when \a event_xy intersects an overlapping region,
+ * this returns the region that is visually under the cursor. E.g. when over the
+ * transparent part of the region, it returns the region underneath.
+ *
+ * The overlapping region is determined using the #ED_region_contains_xy() query.
+ */
+ARegion *ED_area_find_region_xy_visual(const ScrArea *area,
+ const int regiontype,
+ const int event_xy[2])
+{
+ if (!area) {
+ return NULL;
+ }
+
+ /* Check overlapped regions first. */
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
+ if (!region->overlap) {
+ continue;
+ }
+ if (ELEM(regiontype, RGN_TYPE_ANY, region->regiontype)) {
+ if (ED_region_contains_xy(region, event_xy)) {
+ return region;
+ }
+ }
+ }
+ /* Now non-overlapping ones. */
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
+ if (region->overlap) {
+ continue;
+ }
+ if (ELEM(regiontype, RGN_TYPE_ANY, region->regiontype)) {
+ if (ED_region_contains_xy(region, event_xy)) {
+ return region;
+ }
+ }
+ }
+
+ return NULL;
+}