Skip to content

Commit 0d753bb

Browse files
committed
feat: introduce ChartLowLayerConfig and ChartLowLayerPainter for customizable low layer background
1 parent 6bda4a9 commit 0d753bb

9 files changed

Lines changed: 431 additions & 9 deletions

File tree

lib/deriv_chart.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ export 'src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/ohlc_t
146146
export 'src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/ohlc_painter.dart';
147147
export 'src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/ohlc_painting.dart';
148148
export 'src/deriv_chart/chart/data_visualization/chart_series/data_painter.dart';
149+
export 'src/models/chart_low_layer_config.dart';
149150
export 'src/theme/chart_default_theme.dart';
150151
export 'src/models/chart_config.dart';
151152
export 'src/deriv_chart/chart/data_visualization/markers/marker_icon_painters/accumulator_marker_icon_painter.dart';

lib/src/deriv_chart/chart/basic_chart.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:deriv_chart/src/deriv_chart/chart/y_axis/y_grid_line_painter.dar
77
import 'package:deriv_chart/src/deriv_chart/chart/x_axis/x_axis_model.dart';
88
import 'package:deriv_chart/src/models/chart_axis_config.dart';
99
import 'package:deriv_chart/src/models/chart_config.dart';
10+
import 'package:deriv_chart/src/models/chart_low_layer_config.dart';
1011
import 'package:deriv_chart/src/theme/chart_theme.dart';
1112
import 'package:flutter/foundation.dart';
1213
import 'package:flutter/material.dart';
@@ -35,6 +36,7 @@ class BasicChart extends StatefulWidget {
3536
this.currentTickAnimationDuration = _defaultDuration,
3637
this.quoteBoundsAnimationDuration = _defaultDuration,
3738
this.enableYAxisScaling = true,
39+
this.chartLowLayerConfig,
3840
}) : chartAxisConfig = chartAxisConfig ?? const ChartAxisConfig(),
3941
super(key: key);
4042

@@ -63,6 +65,10 @@ class BasicChart extends StatefulWidget {
6365
/// Defaults to true.
6466
final bool enableYAxisScaling;
6567

68+
/// 磨砂背景配置,用于在图表数据下方绘制磨砂背景区域
69+
/// 背景绘制在网格线之上,但在所有其他绘制元素之下
70+
final ChartLowLayerConfig? chartLowLayerConfig;
71+
6672
@override
6773
BasicChartState<BasicChart> createState() => BasicChartState<BasicChart>();
6874
}
@@ -518,6 +524,7 @@ class BasicChartState<T extends BasicChart> extends State<T>
518524
topY: chartQuoteToCanvasY(widget.mainSeries.maxValue),
519525
bottomY: chartQuoteToCanvasY(widget.mainSeries.minValue),
520526
chartScaleModel: context.watch<ChartScaleModel>(),
527+
chartLowLayerConfig: widget.chartLowLayerConfig,
521528
),
522529
),
523530
),

lib/src/deriv_chart/chart/chart.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
import 'package:collection/collection.dart';
22
import 'package:deriv_chart/src/deriv_chart/chart/data_visualization/models/chart_scale_model.dart';
3+
import 'package:deriv_chart/src/deriv_chart/chart/gestures/gesture_manager.dart';
34
import 'package:deriv_chart/src/deriv_chart/chart/mobile_chart_frame_dividers.dart';
45
import 'package:deriv_chart/src/deriv_chart/chart/x_axis/x_axis_model.dart';
5-
import 'package:deriv_chart/src/deriv_chart/interactive_layer/crosshair/crosshair_variant.dart';
6-
import 'package:deriv_chart/src/theme/dimens.dart';
7-
import 'package:flutter/foundation.dart';
8-
import 'package:deriv_chart/src/deriv_chart/chart/gestures/gesture_manager.dart';
96
import 'package:deriv_chart/src/deriv_chart/chart/x_axis/x_axis_wrapper.dart';
107
import 'package:deriv_chart/src/deriv_chart/drawing_tool_chart/drawing_tools.dart';
8+
import 'package:deriv_chart/src/deriv_chart/interactive_layer/crosshair/crosshair_variant.dart';
119
import 'package:deriv_chart/src/misc/callbacks.dart';
1210
import 'package:deriv_chart/src/models/chart_axis_config.dart';
1311
import 'package:deriv_chart/src/models/chart_config.dart';
12+
import 'package:deriv_chart/src/models/chart_low_layer_config.dart';
1413
import 'package:deriv_chart/src/models/indicator_input.dart';
1514
import 'package:deriv_chart/src/theme/chart_default_light_theme.dart';
15+
import 'package:deriv_chart/src/theme/dimens.dart';
16+
import 'package:flutter/foundation.dart';
1617
import 'package:flutter/material.dart';
1718
import 'package:provider/provider.dart';
1819
import 'package:provider/single_child_widget.dart';
20+
1921
import '../../add_ons/indicators_ui/indicator_config.dart';
2022
import '../../add_ons/repository.dart';
2123
import '../../misc/chart_controller.dart';
@@ -33,9 +35,8 @@ import 'data_visualization/markers/marker_series.dart';
3335
import 'data_visualization/models/chart_object.dart';
3436
import 'main_chart.dart';
3537

36-
part 'chart_state_web.dart';
37-
3838
part 'chart_state_mobile.dart';
39+
part 'chart_state_web.dart';
3940

4041
const Duration _defaultDuration = Duration(milliseconds: 300);
4142

@@ -83,6 +84,7 @@ class Chart extends StatefulWidget {
8384
this.loadingAnimationColor,
8485
this.useDrawingToolsV2 = false,
8586
this.enableYAxisScaling = true,
87+
this.chartLowLayerConfig,
8688
Key? key,
8789
}) : super(key: key);
8890

@@ -224,6 +226,10 @@ class Chart extends StatefulWidget {
224226
/// Defaults to true.
225227
final bool enableYAxisScaling;
226228

229+
/// 磨砂背景配置,用于在图表数据下方绘制磨砂背景区域
230+
/// 背景绘制在网格线之上,但在所有其他绘制元素之下
231+
final ChartLowLayerConfig? chartLowLayerConfig;
232+
227233
@override
228234
State<StatefulWidget> createState() =>
229235
// TODO(Ramin): Make this customizable from outside.

lib/src/deriv_chart/chart/chart_state_mobile.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ class _ChartStateMobile extends _ChartState {
139139
onCrosshairDisappeared: widget.onCrosshairDisappeared,
140140
onCrosshairHover: _onCrosshairHover,
141141
onCrosshairTickChanged: widget.onCrosshairTickChanged,
142-
onCrosshairTickEpochChanged: widget.onCrosshairTickEpochChanged,
142+
onCrosshairTickEpochChanged:
143+
widget.onCrosshairTickEpochChanged,
143144
loadingAnimationColor: widget.loadingAnimationColor,
144145
currentTickAnimationDuration: currentTickAnimationDuration,
145146
quoteBoundsAnimationDuration: quoteBoundsAnimationDuration,
@@ -149,6 +150,7 @@ class _ChartStateMobile extends _ChartState {
149150
interactiveLayerBehaviour: widget.interactiveLayerBehaviour,
150151
useDrawingToolsV2: widget.useDrawingToolsV2,
151152
enableYAxisScaling: widget.enableYAxisScaling,
153+
chartLowLayerConfig: widget.chartLowLayerConfig,
152154
),
153155
Align(
154156
alignment: Alignment.topLeft,

lib/src/deriv_chart/chart/chart_state_web.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class _ChartStateWeb extends _ChartState {
5454
interactiveLayerBehaviour: widget.interactiveLayerBehaviour,
5555
useDrawingToolsV2: widget.useDrawingToolsV2,
5656
enableYAxisScaling: widget.enableYAxisScaling,
57+
chartLowLayerConfig: widget.chartLowLayerConfig,
5758
),
5859
),
5960
if (bottomSeries?.isNotEmpty ?? false)

lib/src/deriv_chart/chart/custom_painters/chart_data_painter.dart

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
// ignore_for_file: unnecessary_null_comparison
2-
32
import 'package:deriv_chart/src/deriv_chart/chart/data_visualization/chart_data.dart';
43
import 'package:deriv_chart/src/deriv_chart/chart/data_visualization/models/animation_info.dart';
54
import 'package:deriv_chart/src/deriv_chart/chart/data_visualization/models/chart_scale_model.dart';
65
import 'package:deriv_chart/src/models/chart_config.dart';
6+
import 'package:deriv_chart/src/models/chart_low_layer_config.dart';
77
import 'package:deriv_chart/src/theme/chart_theme.dart';
88
import 'package:flutter/material.dart';
99

1010
import '../data_visualization/chart_series/line_series/line_series.dart';
1111
import '../data_visualization/chart_series/ohlc_series/candle/candle_series.dart';
1212
import '../data_visualization/chart_series/series.dart';
13+
import 'chart_low_layer_painter.dart';
1314

1415
/// A `CustomPainter` which paints the chart data inside the chart.
1516
class ChartDataPainter extends BaseChartDataPainter {
@@ -28,6 +29,7 @@ class ChartDataPainter extends BaseChartDataPainter {
2829
required ChartScaleModel chartScaleModel,
2930
List<Series> secondarySeries = const <Series>[],
3031
AnimationInfo animationInfo = const AnimationInfo(),
32+
this.chartLowLayerConfig,
3133
}) : super(
3234
chartConfig: chartConfig,
3335
theme: theme,
@@ -45,8 +47,25 @@ class ChartDataPainter extends BaseChartDataPainter {
4547
/// Chart's main data series.
4648
final Series mainSeries;
4749

50+
/// 磨砂背景配置,如果为 null 则不绘制背景
51+
final ChartLowLayerConfig? chartLowLayerConfig;
52+
4853
@override
4954
void paint(Canvas canvas, Size size) {
55+
// 先绘制磨砂背景(在网格线之上,但在所有其他元素之下)
56+
if (chartLowLayerConfig != null) {
57+
ChartLowLayerPainter.paint(
58+
canvas: canvas,
59+
size: size,
60+
config: chartLowLayerConfig!,
61+
epochToCanvasX: epochToCanvasX,
62+
defaultBackgroundColor: theme.backgroundColor,
63+
topY: 0,
64+
bottomY: size.height,
65+
);
66+
}
67+
68+
// 然后绘制主系列
5069
mainSeries.paint(
5170
canvas,
5271
size,
@@ -73,9 +92,13 @@ class ChartDataPainter extends BaseChartDataPainter {
7392
bool visibleAnimationChanged() =>
7493
mainSeries.shouldRepaint(oldDelegate.mainSeries);
7594

95+
bool backgroundChanged() =>
96+
chartLowLayerConfig != oldDelegate.chartLowLayerConfig;
97+
7698
return super.shouldRepaint(oldDelegate) ||
7799
styleChanged() ||
78-
visibleAnimationChanged();
100+
visibleAnimationChanged() ||
101+
backgroundChanged();
79102
}
80103
}
81104

0 commit comments

Comments
 (0)