Skip to content

Commit

Permalink
Add rotationQuarterTurns property in the axis_chart_data to be able t…
Browse files Browse the repository at this point in the history
…o have rotated charts for bar_chart (Horizontal Bar Chart), line_chart and scatter chart
  • Loading branch information
imaNNeo committed Dec 25, 2024
1 parent e62aff9 commit e73c529
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 6 deletions.
5 changes: 5 additions & 0 deletions lib/src/chart/bar_chart/bar_chart_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class BarChartData extends AxisChartData with EquatableMixin {
RangeAnnotations? rangeAnnotations,
super.backgroundColor,
ExtraLinesData? extraLinesData,
super.rotationQuarterTurns,
}) : barGroups = barGroups ?? const [],
groupsSpace = groupsSpace ?? 16,
alignment = alignment ?? BarChartAlignment.spaceEvenly,
Expand Down Expand Up @@ -94,6 +95,7 @@ class BarChartData extends AxisChartData with EquatableMixin {
double? baselineY,
Color? backgroundColor,
ExtraLinesData? extraLinesData,
int? rotationQuarterTurns,
}) =>
BarChartData(
barGroups: barGroups ?? this.barGroups,
Expand All @@ -109,6 +111,7 @@ class BarChartData extends AxisChartData with EquatableMixin {
baselineY: baselineY ?? this.baselineY,
backgroundColor: backgroundColor ?? this.backgroundColor,
extraLinesData: extraLinesData ?? this.extraLinesData,
rotationQuarterTurns: rotationQuarterTurns ?? this.rotationQuarterTurns,
);

/// Lerps a [BaseChartData] based on [t] value, check [Tween.lerp].
Expand All @@ -131,6 +134,7 @@ class BarChartData extends AxisChartData with EquatableMixin {
backgroundColor: Color.lerp(a.backgroundColor, b.backgroundColor, t),
extraLinesData:
ExtraLinesData.lerp(a.extraLinesData, b.extraLinesData, t),
rotationQuarterTurns: b.rotationQuarterTurns,
);
} else {
throw Exception('Illegal State');
Expand All @@ -153,6 +157,7 @@ class BarChartData extends AxisChartData with EquatableMixin {
rangeAnnotations,
backgroundColor,
extraLinesData,
rotationQuarterTurns,
];
}

Expand Down
23 changes: 22 additions & 1 deletion lib/src/chart/base/axis_chart/axis_chart_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ abstract class AxisChartData extends BaseChartData with EquatableMixin {
super.borderData,
required super.touchData,
ExtraLinesData? extraLinesData,
this.rotationQuarterTurns = 0,
}) : gridData = gridData ?? const FlGridData(),
rangeAnnotations = rangeAnnotations ?? const RangeAnnotations(),
baselineX = baselineX ?? 0,
Expand Down Expand Up @@ -62,6 +63,9 @@ abstract class AxisChartData extends BaseChartData with EquatableMixin {
/// Extra horizontal or vertical lines to draw on the chart.
final ExtraLinesData extraLinesData;

/// Rotates the chart by 90 degrees clockwise in each turn
final int rotationQuarterTurns;

/// Used for equality check, see [EquatableMixin].
@override
List<Object?> get props => [
Expand All @@ -79,11 +83,22 @@ abstract class AxisChartData extends BaseChartData with EquatableMixin {
borderData,
touchData,
extraLinesData,
rotationQuarterTurns,
];
}

/// Represents a side of the chart
enum AxisSide { left, top, right, bottom }
enum AxisSide {
left,
top,
right,
bottom;

AxisSide rotateByQuarterTurns(int quarterTurns) {
const values = AxisSide.values;
return values[(values.indexOf(this) + quarterTurns) % values.length];
}
}

/// Contains meta information about the drawing title.
class TitleMeta {
Expand All @@ -96,6 +111,7 @@ class TitleMeta {
required this.sideTitles,
required this.formattedValue,
required this.axisSide,
required this.rotationQuarterTurns,
});

/// min axis value
Expand All @@ -122,6 +138,11 @@ class TitleMeta {

/// Determines the axis side of titles (left, top, right, bottom)
final AxisSide axisSide;

/// Chart is rotated by 90 degrees clockwise in each turn
///
/// default is zero, which means chart is normal and upward
final int rotationQuarterTurns;
}

/// It gives you the axis value and gets a String value based on it.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,12 @@ class _AxisChartScaffoldWidgetState extends State<AxisChartScaffoldWidget> {
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
return Stack(children: stackWidgets(constraints));
return RotatedBox(
quarterTurns: widget.data.rotationQuarterTurns,
child: Stack(
children: stackWidgets(constraints),
),
);
},
);
}
Expand Down
15 changes: 11 additions & 4 deletions lib/src/chart/base/axis_chart/side_titles/side_titles_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:fl_chart/src/extensions/bar_chart_data_extension.dart';
import 'package:fl_chart/src/extensions/edge_insets_extension.dart';
import 'package:fl_chart/src/extensions/fl_border_data_extension.dart';
import 'package:fl_chart/src/extensions/fl_titles_data_extension.dart';
import 'package:fl_chart/src/extensions/size_extension.dart';
import 'package:fl_chart/src/utils/utils.dart';
import 'package:flutter/material.dart';

Expand Down Expand Up @@ -105,13 +106,18 @@ class _SideTitlesWidgetState extends State<SideTitlesWidget> {
}

Size get viewSize {
late Size size;
final chartVirtualRect = widget.chartVirtualRect;
if (chartVirtualRect == null) {
return widget.parentSize;
size = widget.parentSize;
} else {
size = chartVirtualRect.size +
Offset(thisSidePaddingTotal, thisSidePaddingTotal);
}

return chartVirtualRect.size +
Offset(thisSidePaddingTotal, thisSidePaddingTotal);
return size.rotateByQuarterTurns(
widget.axisChartData.rotationQuarterTurns,
);
}

double get axisOffset {
Expand Down Expand Up @@ -195,6 +201,7 @@ class _SideTitlesWidgetState extends State<SideTitlesWidget> {
axisSide: side,
parentAxisSize: axisViewSize,
axisPosition: metaData.axisPixelLocation,
rotationQuarterTurns: widget.axisChartData.rotationQuarterTurns,
),
),
);
Expand All @@ -209,7 +216,7 @@ class _SideTitlesWidgetState extends State<SideTitlesWidget> {
final chartSize = Size(
widget.parentSize.width - thisSidePaddingTotal,
widget.parentSize.height - thisSidePaddingTotal,
);
).rotateByQuarterTurns(widget.axisChartData.rotationQuarterTurns);
// Add 1 pixel to the chart's edges to avoid clipping the last title.
final chartRect = (Offset.zero & chartSize).inflate(1);

Expand Down
5 changes: 5 additions & 0 deletions lib/src/chart/line_chart/line_chart_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class LineChartData extends AxisChartData with EquatableMixin {
super.baselineY,
super.clipData = const FlClipData.none(),
super.backgroundColor,
super.rotationQuarterTurns,
}) : super(
touchData: lineTouchData,
minX: minX ?? double.nan,
Expand Down Expand Up @@ -109,6 +110,7 @@ class LineChartData extends AxisChartData with EquatableMixin {
lerpBetweenBarsDataList(a.betweenBarsData, b.betweenBarsData, t)!,
lineTouchData: b.lineTouchData,
showingTooltipIndicators: b.showingTooltipIndicators,
rotationQuarterTurns: b.rotationQuarterTurns,
);
} else {
throw Exception('Illegal State');
Expand All @@ -135,6 +137,7 @@ class LineChartData extends AxisChartData with EquatableMixin {
double? baselineY,
FlClipData? clipData,
Color? backgroundColor,
int? rotationQuarterTurns,
}) =>
LineChartData(
lineBarsData: lineBarsData ?? this.lineBarsData,
Expand All @@ -155,6 +158,7 @@ class LineChartData extends AxisChartData with EquatableMixin {
baselineY: baselineY ?? this.baselineY,
clipData: clipData ?? this.clipData,
backgroundColor: backgroundColor ?? this.backgroundColor,
rotationQuarterTurns: rotationQuarterTurns ?? this.rotationQuarterTurns,
);

/// Used for equality check, see [EquatableMixin].
Expand All @@ -177,6 +181,7 @@ class LineChartData extends AxisChartData with EquatableMixin {
baselineY,
clipData,
backgroundColor,
rotationQuarterTurns,
];
}

Expand Down
5 changes: 5 additions & 0 deletions lib/src/chart/scatter_chart/scatter_chart_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class ScatterChartData extends AxisChartData with EquatableMixin {
FlClipData? clipData,
super.backgroundColor,
ScatterLabelSettings? scatterLabelSettings,
super.rotationQuarterTurns,
}) : scatterSpots = scatterSpots ?? const [],
scatterTouchData = scatterTouchData ?? ScatterTouchData(),
showingTooltipIndicators = showingTooltipIndicators ?? const [],
Expand Down Expand Up @@ -116,6 +117,7 @@ class ScatterChartData extends AxisChartData with EquatableMixin {
b.scatterLabelSettings,
t,
),
rotationQuarterTurns: b.rotationQuarterTurns,
);
} else {
throw Exception('Illegal State');
Expand All @@ -140,6 +142,7 @@ class ScatterChartData extends AxisChartData with EquatableMixin {
FlClipData? clipData,
Color? backgroundColor,
ScatterLabelSettings? scatterLabelSettings,
int? rotationQuarterTurns,
}) =>
ScatterChartData(
scatterSpots: scatterSpots ?? this.scatterSpots,
Expand All @@ -158,6 +161,7 @@ class ScatterChartData extends AxisChartData with EquatableMixin {
clipData: clipData ?? this.clipData,
backgroundColor: backgroundColor ?? this.backgroundColor,
scatterLabelSettings: scatterLabelSettings ?? this.scatterLabelSettings,
rotationQuarterTurns: rotationQuarterTurns ?? this.rotationQuarterTurns,
);

/// Used for equality check, see [EquatableMixin].
Expand All @@ -181,6 +185,7 @@ class ScatterChartData extends AxisChartData with EquatableMixin {
backgroundColor,
borderData,
touchData,
rotationQuarterTurns,
];
}

Expand Down

0 comments on commit e73c529

Please # to comment.