@@ -19,104 +19,161 @@ import 'package:flutter/material.dart';
1919/// `left` , `top` , `right` , `bottom`  are some place holders to show titles 
2020/// provided by [AxisChartData.titlesData]  around the chart 
2121/// `chart`  is a centered place holder to show a raw chart. 
22- class  AxisChartScaffoldWidget  extends  StatelessWidget  {
22+ class  AxisChartScaffoldWidget  extends  StatefulWidget  {
2323  const  AxisChartScaffoldWidget ({
2424    super .key,
2525    required  this .chart,
2626    required  this .data,
2727  });
28+ 
2829  final  Widget  chart;
2930  final  AxisChartData  data;
3031
32+   @override 
33+   State <AxisChartScaffoldWidget > createState () => 
34+       _AxisChartScaffoldWidgetState ();
35+ }
36+ 
37+ class  _AxisChartScaffoldWidgetState  extends  State <AxisChartScaffoldWidget > {
38+   late  ScrollController  scrollController;
39+ 
40+   @override 
41+   void  initState () {
42+     scrollController =  ScrollController ();
43+     super .initState ();
44+   }
45+ 
46+   @override 
47+   void  dispose () {
48+     scrollController.dispose ();
49+     super .dispose ();
50+   }
51+ 
3152  bool  get  showLeftTitles {
32-     if  (! data.titlesData.show) {
53+     if  (! widget. data.titlesData.show) {
3354      return  false ;
3455    }
35-     final  showAxisTitles =  data.titlesData.leftTitles.showAxisTitles;
36-     final  showSideTitles =  data.titlesData.leftTitles.showSideTitles;
56+     final  showAxisTitles =  widget. data.titlesData.leftTitles.showAxisTitles;
57+     final  showSideTitles =  widget. data.titlesData.leftTitles.showSideTitles;
3758    return  showAxisTitles ||  showSideTitles;
3859  }
3960
4061  bool  get  showRightTitles {
41-     if  (! data.titlesData.show) {
62+     if  (! widget. data.titlesData.show) {
4263      return  false ;
4364    }
44-     final  showAxisTitles =  data.titlesData.rightTitles.showAxisTitles;
45-     final  showSideTitles =  data.titlesData.rightTitles.showSideTitles;
65+     final  showAxisTitles =  widget. data.titlesData.rightTitles.showAxisTitles;
66+     final  showSideTitles =  widget. data.titlesData.rightTitles.showSideTitles;
4667    return  showAxisTitles ||  showSideTitles;
4768  }
4869
4970  bool  get  showTopTitles {
50-     if  (! data.titlesData.show) {
71+     if  (! widget. data.titlesData.show) {
5172      return  false ;
5273    }
53-     final  showAxisTitles =  data.titlesData.topTitles.showAxisTitles;
54-     final  showSideTitles =  data.titlesData.topTitles.showSideTitles;
74+     final  showAxisTitles =  widget. data.titlesData.topTitles.showAxisTitles;
75+     final  showSideTitles =  widget. data.titlesData.topTitles.showSideTitles;
5576    return  showAxisTitles ||  showSideTitles;
5677  }
5778
5879  bool  get  showBottomTitles {
59-     if  (! data.titlesData.show) {
80+     if  (! widget. data.titlesData.show) {
6081      return  false ;
6182    }
62-     final  showAxisTitles =  data.titlesData.bottomTitles.showAxisTitles;
63-     final  showSideTitles =  data.titlesData.bottomTitles.showSideTitles;
83+     final  showAxisTitles =  widget. data.titlesData.bottomTitles.showAxisTitles;
84+     final  showSideTitles =  widget. data.titlesData.bottomTitles.showSideTitles;
6485    return  showAxisTitles ||  showSideTitles;
6586  }
6687
6788  List <Widget > stackWidgets (BoxConstraints  constraints) {
89+     final  chartWidth =  constraints.maxWidth - 
90+         widget.data.titlesData.allSidesPadding.horizontal;
91+ 
92+     final  xDelta =  widget.data.maxX -  widget.data.minX;
93+     final  largeChartWidth =  xDelta *  widget.data.horizontalZoomConfig.amount;
94+ 
6895    final  widgets =  < Widget > [
6996      Container (
70-         margin:  data.titlesData.allSidesPadding,
97+         margin:  widget. data.titlesData.allSidesPadding,
7198        decoration:  BoxDecoration (
72-           border:  data.borderData.isVisible () ?  data.borderData.border :  null ,
99+           border:  widget.data.borderData.isVisible ()
100+               ?  widget.data.borderData.border
101+               :  null ,
73102        ),
74-         child:  chart,
103+         child:  switch  (widget.data.horizontalZoomConfig.enabled) {
104+           true  =>  SingleChildScrollView (
105+               controller:  scrollController,
106+               scrollDirection:  Axis .horizontal,
107+               child:  SizedBox (
108+                 width:  largeChartWidth,
109+                 height:  constraints.maxHeight,
110+                 child:  widget.chart,
111+               ),
112+             ),
113+           false  =>  SizedBox (
114+               width:  constraints.maxWidth,
115+               height:  constraints.maxHeight,
116+               child:  widget.chart,
117+             ),
118+         },
75119      ),
76120    ];
77121
78122    int  insertIndex (bool  drawBelow) =>  drawBelow ?  0  :  widgets.length;
79123
124+     double ?  axisMinXOverride;
125+     double ?  axisMaxXOverride;
126+     if  (scrollController.hasClients) {
127+       final  xAmount =  widget.data.horizontalZoomConfig.amount;
128+       final  showingXDelta =  chartWidth /  xAmount;
129+       axisMinXOverride =  scrollController.offset /  xAmount;
130+       axisMaxXOverride =  axisMinXOverride +  showingXDelta;
131+     }
132+ 
80133    if  (showLeftTitles) {
81134      widgets.insert (
82-         insertIndex (data.titlesData.leftTitles.drawBelowEverything),
135+         insertIndex (widget. data.titlesData.leftTitles.drawBelowEverything),
83136        SideTitlesWidget (
84137          side:  AxisSide .left,
85-           axisChartData:  data,
138+           axisChartData:  widget. data,
86139          parentSize:  constraints.biggest,
87140        ),
88141      );
89142    }
90143
91144    if  (showTopTitles) {
92145      widgets.insert (
93-         insertIndex (data.titlesData.topTitles.drawBelowEverything),
146+         insertIndex (widget. data.titlesData.topTitles.drawBelowEverything),
94147        SideTitlesWidget (
95148          side:  AxisSide .top,
96-           axisChartData:  data,
149+           axisChartData:  widget. data,
97150          parentSize:  constraints.biggest,
151+           axisMinOverride:  axisMinXOverride,
152+           axisMaxOverride:  axisMaxXOverride,
98153        ),
99154      );
100155    }
101156
102157    if  (showRightTitles) {
103158      widgets.insert (
104-         insertIndex (data.titlesData.rightTitles.drawBelowEverything),
159+         insertIndex (widget. data.titlesData.rightTitles.drawBelowEverything),
105160        SideTitlesWidget (
106161          side:  AxisSide .right,
107-           axisChartData:  data,
162+           axisChartData:  widget. data,
108163          parentSize:  constraints.biggest,
109164        ),
110165      );
111166    }
112167
113168    if  (showBottomTitles) {
114169      widgets.insert (
115-         insertIndex (data.titlesData.bottomTitles.drawBelowEverything),
170+         insertIndex (widget. data.titlesData.bottomTitles.drawBelowEverything),
116171        SideTitlesWidget (
117172          side:  AxisSide .bottom,
118-           axisChartData:  data,
173+           axisChartData:  widget. data,
119174          parentSize:  constraints.biggest,
175+           axisMinOverride:  axisMinXOverride,
176+           axisMaxOverride:  axisMaxXOverride,
120177        ),
121178      );
122179    }
@@ -125,9 +182,16 @@ class AxisChartScaffoldWidget extends StatelessWidget {
125182
126183  @override 
127184  Widget  build (BuildContext  context) {
128-     return  LayoutBuilder (
129-       builder:  (context, constraints) {
130-         return  Stack (children:  stackWidgets (constraints));
185+     return  ListenableBuilder (
186+       listenable:  scrollController,
187+       builder:  (context, child) {
188+         return  LayoutBuilder (
189+           builder:  (context, constraints) {
190+             return  Stack (
191+               children:  stackWidgets (constraints),
192+             );
193+           },
194+         );
131195      },
132196    );
133197  }
0 commit comments