Skip to content

Commit 9c31c91

Browse files
committed
AutoScaleDown Creation
*Create AutoScaleDown behavior.
1 parent 4271f57 commit 9c31c91

File tree

1 file changed

+72
-3
lines changed

1 file changed

+72
-3
lines changed

lib/responsive_wrapper.dart

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -413,14 +413,27 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
413413
// Order breakpoints from smallest to largest.
414414
// Perform ordering operation to allow breakpoints
415415
// to be accepted in any order.
416-
breakpoints.sort((a, b) => a.breakpoint.compareTo(b.breakpoint));
416+
breakpoints.sort((a, b) {
417+
// If breakpoints are equal, return autoScaleDown
418+
// breakpoints first.
419+
if (a.breakpoint == b.breakpoint && a.isAutoScaleDown) {
420+
if (a.isAutoScaleDown) {
421+
return -1;
422+
}
423+
424+
return 0;
425+
}
426+
427+
return a.breakpoint.compareTo(b.breakpoint);
428+
});
417429

418430
ResponsiveBreakpoint initialBreakpoint =
419431
breakpoints.firstWhere((element) => !element.isTag, orElse: null);
420432
ResponsiveBreakpoint breakpointHolder;
421433
// Construct breakpoint segments for initial and minWidth special cases.
422434
if (initialBreakpoint == null ||
423-
initialBreakpoint.breakpoint > widget.minWidth) {
435+
(initialBreakpoint.breakpoint > widget.minWidth &&
436+
!initialBreakpoint.isAutoScaleDown)) {
424437
// Construct two segments. 1. From 0 to the minWidth. 2. From minWidth to the next breakpoint.
425438
breakpointHolder = ResponsiveBreakpoint._(
426439
breakpoint: widget.minWidth,
@@ -449,7 +462,11 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
449462
breakpointHolder = ResponsiveBreakpoint._(
450463
breakpoint: initialBreakpoint.breakpoint,
451464
name: defaultBreakpoint.name,
452-
behavior: defaultBreakpoint.behavior,
465+
// Special condition: return autoScale if initial
466+
// breakpoint is autoScaleDown.
467+
behavior: (initialBreakpoint.isAutoScaleDown)
468+
? _ResponsiveBreakpointBehavior.AUTOSCALE
469+
: defaultBreakpoint.behavior,
453470
scaleFactor: defaultBreakpoint.scaleFactor);
454471
breakpointSegments.insert(
455472
0,
@@ -475,6 +492,44 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
475492
// Update holder with active breakpoint
476493
breakpointHolder = breakpoint;
477494
break;
495+
case _ResponsiveBreakpointBehavior.AUTOSCALEDOWN:
496+
if (breakpointHolder.isAutoScaleDown) {
497+
breakpointSegmentHolder = _ResponsiveBreakpointSegment(
498+
breakpoint: breakpointHolder.breakpoint,
499+
responsiveBreakpointBehavior: breakpoint.behavior,
500+
responsiveBreakpoint: ResponsiveBreakpoint._(
501+
breakpoint: breakpoint.breakpoint,
502+
name: breakpoint.name,
503+
behavior: _ResponsiveBreakpointBehavior.AUTOSCALE,
504+
scaleFactor: breakpoint.scaleFactor));
505+
} 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);
521+
breakpointSegmentHolder = _ResponsiveBreakpointSegment(
522+
breakpoint: breakpoint.breakpoint,
523+
responsiveBreakpointBehavior: breakpoint.behavior,
524+
responsiveBreakpoint: ResponsiveBreakpoint._(
525+
breakpoint: breakpoint.breakpoint,
526+
name: breakpoint.name,
527+
behavior: _ResponsiveBreakpointBehavior.AUTOSCALE,
528+
scaleFactor: breakpoint.scaleFactor));
529+
}
530+
// Update holder with active breakpoint
531+
breakpointHolder = breakpoint;
532+
break;
478533
case _ResponsiveBreakpointBehavior.TAG:
479534
breakpointSegmentHolder = _ResponsiveBreakpointSegment(
480535
breakpoint: breakpoint.breakpoint,
@@ -653,6 +708,7 @@ class InheritedResponsiveWrapper extends InheritedWidget {
653708
enum _ResponsiveBreakpointBehavior {
654709
RESIZE,
655710
AUTOSCALE,
711+
AUTOSCALEDOWN,
656712
TAG,
657713
}
658714

@@ -681,6 +737,12 @@ class ResponsiveBreakpoint {
681737
assert(breakpoint != null && breakpoint >= 0,
682738
'Breakpoints cannot be negative. To control behavior from 0, set `default` parameters in `ResponsiveWrapper`.');
683739

740+
const ResponsiveBreakpoint.autoScaleDown(this.breakpoint,
741+
{this.name, this.scaleFactor = 1})
742+
: this.behavior = _ResponsiveBreakpointBehavior.AUTOSCALEDOWN,
743+
assert(breakpoint != null && breakpoint >= 0,
744+
'Breakpoints cannot be negative. To control behavior from 0, set `default` parameters in `ResponsiveWrapper`.');
745+
684746
const ResponsiveBreakpoint.tag(this.breakpoint, {@required this.name})
685747
: this.behavior = _ResponsiveBreakpointBehavior.TAG,
686748
this.scaleFactor = 1,
@@ -705,6 +767,9 @@ class ResponsiveBreakpoint {
705767

706768
get isAutoScale => behavior == _ResponsiveBreakpointBehavior.AUTOSCALE;
707769

770+
get isAutoScaleDown =>
771+
behavior == _ResponsiveBreakpointBehavior.AUTOSCALEDOWN;
772+
708773
get isTag => behavior == _ResponsiveBreakpointBehavior.TAG;
709774

710775
@override
@@ -737,6 +802,10 @@ class _ResponsiveBreakpointSegment {
737802
get isAutoScale =>
738803
responsiveBreakpointBehavior == _ResponsiveBreakpointBehavior.AUTOSCALE;
739804

805+
get isAutoScaleDown =>
806+
responsiveBreakpointBehavior ==
807+
_ResponsiveBreakpointBehavior.AUTOSCALEDOWN;
808+
740809
get isTag =>
741810
responsiveBreakpointBehavior == _ResponsiveBreakpointBehavior.TAG;
742811

0 commit comments

Comments
 (0)