Skip to content

Commit 863c008

Browse files
committed
AutoScaleDown Creation #2
*Create autoScaleDown override behavior.
1 parent 84353f4 commit 863c008

File tree

1 file changed

+77
-29
lines changed

1 file changed

+77
-29
lines changed

lib/responsive_wrapper.dart

Lines changed: 77 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
159159
if (widget.maxWidth != null && windowWidth > widget.maxWidth) {
160160
// Check if there is an active breakpoint with autoScale set to true.
161161
if (activeBreakpointSegment.breakpoint >= widget.maxWidth &&
162-
activeBreakpointSegment.isAutoScale) {
162+
activeBreakpointSegment.responsiveBreakpoint.isAutoScale) {
163163
return widget.maxWidth +
164164
(windowWidth -
165165
activeBreakpointSegment.responsiveBreakpoint.breakpoint);
@@ -181,7 +181,7 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
181181
if (widget.maxWidth != null) if (windowWidth > widget.maxWidth) {
182182
// Check if there is an active breakpoint with autoScale set to true.
183183
if (activeBreakpointSegment.breakpoint > widget.maxWidth &&
184-
activeBreakpointSegment.isAutoScale) {
184+
activeBreakpointSegment.responsiveBreakpoint.isAutoScale) {
185185
// Scale screen height by the amount the width was scaled.
186186
return windowHeight / (screenWidth / widget.maxWidth);
187187
}
@@ -207,7 +207,7 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
207207
double scaledWidth = 0;
208208
double getScaledWidth() {
209209
// If widget should resize, use screenWidth.
210-
if (activeBreakpointSegment.isResize)
210+
if (activeBreakpointSegment.responsiveBreakpoint.isResize)
211211
return screenWidth /
212212
activeBreakpointSegment.responsiveBreakpoint.scaleFactor;
213213

@@ -241,7 +241,7 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
241241
double scaledHeight = 0;
242242
double getScaledHeight() {
243243
// If widget should resize, use screenHeight.
244-
if (activeBreakpointSegment.isResize)
244+
if (activeBreakpointSegment.responsiveBreakpoint.isResize)
245245
return screenHeight /
246246
activeBreakpointSegment.responsiveBreakpoint.scaleFactor;
247247

@@ -503,21 +503,57 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
503503
behavior: _ResponsiveBreakpointBehavior.AUTOSCALE,
504504
scaleFactor: breakpoint.scaleFactor));
505505
} else {
506-
// Construct midway breakpoint segment.
507-
_ResponsiveBreakpointSegment midwayBreakpointSegment =
508-
_ResponsiveBreakpointSegment(
509-
breakpoint:
510-
(breakpoint.breakpoint - breakpointHolder.breakpoint) /
511-
2 +
512-
breakpointHolder.breakpoint,
513-
responsiveBreakpointBehavior:
514-
_ResponsiveBreakpointBehavior.AUTOSCALEDOWN,
515-
responsiveBreakpoint: ResponsiveBreakpoint._(
516-
breakpoint: breakpoint.breakpoint,
517-
name: breakpointHolder.name,
518-
behavior: _ResponsiveBreakpointBehavior.AUTOSCALE,
519-
scaleFactor: breakpoint.scaleFactor));
520-
breakpointSegments.add(midwayBreakpointSegment);
506+
// Split AutoScale behavior between autoScale and autoScaleDown.
507+
if (breakpointHolder.isAutoScale) {
508+
// Construct midway breakpoint segment.
509+
_ResponsiveBreakpointSegment midwayBreakpointSegment =
510+
_ResponsiveBreakpointSegment(
511+
breakpoint: (breakpoint.breakpoint -
512+
breakpointHolder.breakpoint) /
513+
2 +
514+
breakpointHolder.breakpoint,
515+
responsiveBreakpointBehavior:
516+
_ResponsiveBreakpointBehavior.AUTOSCALEDOWN,
517+
responsiveBreakpoint: ResponsiveBreakpoint._(
518+
breakpoint: breakpoint.breakpoint,
519+
name: breakpointHolder.name,
520+
behavior: _ResponsiveBreakpointBehavior.AUTOSCALE,
521+
scaleFactor: breakpoint.scaleFactor));
522+
breakpointSegments.add(midwayBreakpointSegment);
523+
}
524+
// AutoScaleDown overrides resize behavior.
525+
if (breakpointHolder.isResize) {
526+
// Construct override breakpoint segment.
527+
int overrideBreakpointIndex = breakpointSegments.lastIndexWhere(
528+
(element) =>
529+
element.breakpoint == breakpointHolder.breakpoint &&
530+
element.isResize);
531+
_ResponsiveBreakpointSegment overrideBreakpointSegment =
532+
breakpointSegments[overrideBreakpointIndex];
533+
overrideBreakpointSegment = overrideBreakpointSegment.copyWith(
534+
responsiveBreakpoint:
535+
overrideBreakpointSegment.responsiveBreakpoint.copyWith(
536+
breakpoint: breakpoint.breakpoint,
537+
behavior: _ResponsiveBreakpointBehavior.AUTOSCALE));
538+
breakpointSegments[overrideBreakpointIndex] =
539+
overrideBreakpointSegment;
540+
// Remap all tags with override behavior.
541+
breakpointSegments = breakpointSegments.map((element) {
542+
if (element.breakpoint >= breakpointHolder.breakpoint &&
543+
element.isTag) {
544+
return element.copyWith(
545+
responsiveBreakpointBehavior:
546+
_ResponsiveBreakpointBehavior.AUTOSCALE,
547+
responsiveBreakpoint: element.responsiveBreakpoint
548+
.copyWith(
549+
breakpoint: breakpoint.breakpoint,
550+
behavior:
551+
_ResponsiveBreakpointBehavior.AUTOSCALE));
552+
}
553+
return element;
554+
}).toList();
555+
}
556+
// Construct autoScaleDown breakpoint.
521557
breakpointSegmentHolder = _ResponsiveBreakpointSegment(
522558
breakpoint: breakpoint.breakpoint,
523559
responsiveBreakpointBehavior: breakpoint.behavior,
@@ -535,7 +571,7 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
535571
breakpointSegmentHolder = _ResponsiveBreakpointSegment(
536572
breakpoint: breakpoint.breakpoint,
537573
// Tag inherits behavior from previous breakpoint.
538-
responsiveBreakpointBehavior: breakpointHolder.behavior,
574+
responsiveBreakpointBehavior: breakpoint.behavior,
539575
responsiveBreakpoint: breakpointHolder,
540576
);
541577
break;
@@ -762,6 +798,15 @@ class ResponsiveBreakpoint {
762798
'Breakpoints cannot be negative. To control behavior from 0, set `default` parameters in `ResponsiveWrapper`.'),
763799
assert(name != null, 'Breakpoint tags must be named.');
764800

801+
get isResize => behavior == _ResponsiveBreakpointBehavior.RESIZE;
802+
803+
get isAutoScale => behavior == _ResponsiveBreakpointBehavior.AUTOSCALE;
804+
805+
get isAutoScaleDown =>
806+
behavior == _ResponsiveBreakpointBehavior.AUTOSCALEDOWN;
807+
808+
get isTag => behavior == _ResponsiveBreakpointBehavior.TAG;
809+
765810
ResponsiveBreakpoint copyWith({
766811
double breakpoint,
767812
String name,
@@ -775,15 +820,6 @@ class ResponsiveBreakpoint {
775820
scaleFactor: scaleFactor ?? this.scaleFactor,
776821
);
777822

778-
get isResize => behavior == _ResponsiveBreakpointBehavior.RESIZE;
779-
780-
get isAutoScale => behavior == _ResponsiveBreakpointBehavior.AUTOSCALE;
781-
782-
get isAutoScaleDown =>
783-
behavior == _ResponsiveBreakpointBehavior.AUTOSCALEDOWN;
784-
785-
get isTag => behavior == _ResponsiveBreakpointBehavior.TAG;
786-
787823
@override
788824
String toString() =>
789825
'ResponsiveBreakpoint(' +
@@ -821,6 +857,18 @@ class _ResponsiveBreakpointSegment {
821857
get isTag =>
822858
responsiveBreakpointBehavior == _ResponsiveBreakpointBehavior.TAG;
823859

860+
_ResponsiveBreakpointSegment copyWith({
861+
double breakpoint,
862+
_ResponsiveBreakpointBehavior responsiveBreakpointBehavior,
863+
ResponsiveBreakpoint responsiveBreakpoint,
864+
}) =>
865+
_ResponsiveBreakpointSegment(
866+
breakpoint: breakpoint ?? this.breakpoint,
867+
responsiveBreakpointBehavior:
868+
responsiveBreakpointBehavior ?? this.responsiveBreakpointBehavior,
869+
responsiveBreakpoint: responsiveBreakpoint ?? this.responsiveBreakpoint,
870+
);
871+
824872
@override
825873
String toString() =>
826874
'ResponsiveBreakpointSegment(' +

0 commit comments

Comments
 (0)