Files
sdk/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
T
Aske Simon Christensen 4004194c29 Clean up super calls in swarm.
Remove redundant super calls and move all other super calls to the end
of the initializer list, as required by Dart 2.

Change-Id: I2b0968b9c6508d00a3379c225470d5d9c0ec9f78
Reviewed-on: https://dart-review.googlesource.com/69967
Reviewed-by: Stephen Adams <sra@google.com>
Commit-Queue: Stephen Adams <sra@google.com>
2018-08-21 17:56:13 +00:00

156 lines
4.3 KiB
Dart

// 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.
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;
}