// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // @dart = 2.9 part of layout; // This file has classes representing the grid sizing functions /** * Represents the sizing function used for the min or max of a row or column. */ // TODO(jmesserly): rename to GridSizing, or make internal class SizingFunction { const SizingFunction(); bool get isContentSized => isMinContentSized || isMaxContentSized; bool get isMinContentSized => false; bool get isMaxContentSized => false; bool get isFraction => false; num resolveLength(num gridSize) => 0; num get fractionValue => 0; // TODO(jmesserly): this is only needed because FixedSizing is mutable SizingFunction clone() => this; } /** * Fixed size reprensents a length as defined by CSS3 Values spec. * Can also be a percentage of the Grid element's logical width (for columns) * or logical height (for rows). When the width or height of the Grid element * is undefined, the percentage is ignored and the Grid Track will be * auto-sized. */ class FixedSizing extends SizingFunction { final String units; final num length; // TODO(jmesserly): kind of ugly to have this mutable property here, but // we need to correctly track whether we're content sized during a layout bool _contentSized; FixedSizing(this.length, [this.units = 'px']) : _contentSized = false { if (units != 'px' && units != '%') { // TODO(jmesserly): support other unit types throw new UnsupportedError('Units other than px and %'); } } // TODO(jmesserly): this is only needed because of our mutable property FixedSizing clone() => new FixedSizing(length, units); bool get isMinContentSized => _contentSized; num resolveLength(num gridSize) { if (units == '%') { if (gridSize == null) { // Use content size when the grid doesn't have an absolute size in this // dimension _contentSized = true; return 0; } _contentSized = false; return (length / 100) * gridSize; } else { return length; } } String toString() => 'FixedSizing: ${length}${units} $_contentSized'; } /** * Fraction is a non-negative floating-point number followed by 'fr'. Each * fraction value takes a share of the remaining space proportional to its * number. */ class FractionSizing extends SizingFunction { final num fractionValue; FractionSizing(this.fractionValue); bool get isFraction => true; String toString() => 'FixedSizing: ${fractionValue}fr'; } class MinContentSizing extends SizingFunction { const MinContentSizing(); bool get isMinContentSized => true; String toString() => 'MinContentSizing'; } class MaxContentSizing extends SizingFunction { const MaxContentSizing(); bool get isMaxContentSized { return true; } String toString() => 'MaxContentSizing'; } /** The min and max sizing functions for a track. */ class TrackSizing { /** The min sizing function for the track. */ final SizingFunction min; /** The min sizing function for the track. */ final SizingFunction max; const TrackSizing.auto() : min = const MinContentSizing(), max = const MaxContentSizing(); TrackSizing(this.min, this.max) {} // TODO(jmesserly): this is only needed because FixedSizing is mutable TrackSizing clone() => new TrackSizing(min.clone(), max.clone()); } /** Represents a GridTrack breadth property. */ // TODO(jmesserly): these classes could be replaced with reflection/mirrors abstract class _BreadthAccumulator { void setSize(GridTrack t, num value); num getSize(GridTrack t); SizingFunction getSizingFunction(GridTrack t); } class _UsedBreadthAccumulator implements _BreadthAccumulator { const _UsedBreadthAccumulator(); void setSize(GridTrack t, num value) { t.usedBreadth = value; } num getSize(GridTrack t) => t.usedBreadth; SizingFunction getSizingFunction(GridTrack t) => t.minSizing; } class _MaxBreadthAccumulator implements _BreadthAccumulator { const _MaxBreadthAccumulator(); void setSize(GridTrack t, num value) { t.maxBreadth = value; } num getSize(GridTrack t) => t.maxBreadth; SizingFunction getSizingFunction(GridTrack t) => t.maxSizing; }