sortDrawOrder method

void sortDrawOrder()

Implementation

void sortDrawOrder() {
  hasChangedDrawOrderInLastUpdate = true;
  // Clear out rule first/last items.
  for (final rule in _sortedDrawRules) {
    rule.first = rule.last = null;
  }

  firstDrawable = null;
  Drawable? lastDrawable;
  for (final drawable in _drawables) {
    var rules = drawable.flattenedDrawRules;

    var target = rules?.activeTarget;
    if (target != null) {
      if (target.first == null) {
        target.first = target.last = drawable;
        drawable.prev = drawable.next = null;
      } else {
        target.last?.next = drawable;
        drawable.prev = target.last;
        target.last = drawable;
        drawable.next = null;
      }
    } else {
      drawable.prev = lastDrawable;
      drawable.next = null;
      if (lastDrawable == null) {
        lastDrawable = firstDrawable = drawable;
      } else {
        lastDrawable.next = drawable;
        lastDrawable = drawable;
      }
    }
  }

  for (final rule in _sortedDrawRules) {
    if (rule.first == null) {
      continue;
    }
    switch (rule.placement) {
      case DrawTargetPlacement.before:
        if (rule.drawable?.prev != null) {
          rule.drawable!.prev?.next = rule.first;
          rule.first?.prev = rule.drawable!.prev;
        }
        if (rule.drawable == firstDrawable) {
          firstDrawable = rule.first;
        }
        rule.drawable?.prev = rule.last;
        rule.last?.next = rule.drawable;
        break;
      case DrawTargetPlacement.after:
        if (rule.drawable?.next != null) {
          rule.drawable!.next!.prev = rule.last;
          rule.last?.next = rule.drawable?.next;
        }
        if (rule.drawable == lastDrawable) {
          lastDrawable = rule.last;
        }
        rule.drawable?.next = rule.first;
        rule.first?.prev = rule.drawable;
        break;
    }
  }

  firstDrawable = lastDrawable;
}