Skip to content

Commit

Permalink
fix: Auto scale y-axis to fit selected data.
Browse files Browse the repository at this point in the history
  • Loading branch information
just-seba committed Sep 10, 2024
1 parent 5f1ea70 commit 597cae4
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 17 deletions.
6 changes: 2 additions & 4 deletions app/lib/ui/analytics/analytics_view_model.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:emma/application/analytics/analytics_demo_data.dart';
import 'package:emma/ui/analytics/analytics_period.dart';
import 'package:emma/ui/analytics/charts/analytics_chart_control_view_model.dart';
import 'package:flutter/material.dart';
import 'package:signals/signals.dart';

Expand All @@ -17,10 +18,7 @@ class AnalyticsViewModel {
debugLabel: "analytics.vm.range",
);

final showProduction = signal(true);
final showHome = signal(true);
final showGridFeedIn = signal(true);
final showGridConsume = signal(true);
final chartControl = AnalyticsChartControlViewModel();

ReadonlySignal<AnalyticsPeriod> get period => _period;
ReadonlySignal<DateTimeRange> get range => _range;
Expand Down
2 changes: 1 addition & 1 deletion app/lib/ui/analytics/charts/analytics_chart.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class AnalyticsChart extends StatelessWidget {
),
),
const SizedBox(height: 16),
AnalyticsChartControl(viewModel: viewModel)
AnalyticsChartControl(viewModel: viewModel.chartControl),
],
);
}
Expand Down
14 changes: 10 additions & 4 deletions app/lib/ui/analytics/charts/analytics_chart_control.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:emma/ui/analytics/analytics_view_model.dart';
import 'package:emma/ui/analytics/charts/analytics_chart_colors.dart';
import 'package:emma/ui/analytics/charts/analytics_chart_control_view_model.dart';
import 'package:flutter/material.dart';
import 'package:signals/signals_flutter.dart';

Expand All @@ -9,7 +9,7 @@ class AnalyticsChartControl extends StatelessWidget {
required this.viewModel,
});

final AnalyticsViewModel viewModel;
final AnalyticsChartControlViewModel viewModel;

@override
Widget build(BuildContext context) {
Expand All @@ -22,21 +22,25 @@ class AnalyticsChartControl extends StatelessWidget {
label: "Produktion",
color: AnalyticsChartColors.production,
state: viewModel.showProduction,
onPressed: viewModel.toggleProduction,
),
_ToggleButton(
label: "Hausverbrauch",
color: AnalyticsChartColors.home,
state: viewModel.showHome,
onPressed: viewModel.toggleHome,
),
_ToggleButton(
label: "Einspeisung",
color: AnalyticsChartColors.gridFeedIn,
state: viewModel.showGridFeedIn,
onPressed: viewModel.toggleGridFeedIn,
),
_ToggleButton(
label: "Netzbezug",
color: AnalyticsChartColors.gridConsumption,
state: viewModel.showGridConsume,
onPressed: viewModel.toggleGridConsume,
),
],
);
Expand All @@ -48,17 +52,19 @@ class _ToggleButton extends StatelessWidget {
required this.label,
required this.color,
required this.state,
required this.onPressed,
});

final String label;
final Color color;
final Signal<bool> state;
final ReadonlySignal<bool> state;
final VoidCallback onPressed;

@override
Widget build(BuildContext context) {
return Watch(
(context) => OutlinedButton(
onPressed: () => state.value = !state.value,
onPressed: onPressed,
style: state.value ? _enabled() : _disabled(context),
child: Text(label),
),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:signals/signals.dart';

class AnalyticsChartControlViewModel {
final _showProduction = signal(true);
final _showHome = signal(true);
final _showGridFeedIn = signal(true);
final _showGridConsume = signal(true);

late final Iterable<ReadonlySignal<bool>> _all = [
_showProduction,
_showHome,
_showGridFeedIn,
_showGridConsume,
];

ReadonlySignal<bool> get showProduction => _showProduction;
ReadonlySignal<bool> get showHome => _showHome;
ReadonlySignal<bool> get showGridFeedIn => _showGridFeedIn;
ReadonlySignal<bool> get showGridConsume => _showGridConsume;

void toggleProduction() => _toggle(_showProduction);
void toggleHome() => _toggle(_showHome);
void toggleGridFeedIn() => _toggle(_showGridFeedIn);
void toggleGridConsume() => _toggle(_showGridConsume);

void _toggle(Signal<bool> signal) {
if (!signal.value) {
signal.value = true;
} else {
final canDisable = _all.where((x) => x.value).length > 1;
if (canDisable) {
signal.value = false;
}
}
}
}
20 changes: 12 additions & 8 deletions app/lib/ui/analytics/charts/analytics_day_chart.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,14 @@ class AnalyticsDayChart extends StatelessWidget {
.toDouble();

final maxValue = [
...viewModel.day.value.home,
...viewModel.day.value.production,
...viewModel.day.value.gridConsume,
...viewModel.day.value.gridFeedIn,
if (viewModel.chartControl.showHome.value) ...viewModel.day.value.home,
if (viewModel.chartControl.showProduction.value)
...viewModel.day.value.production,
if (viewModel.chartControl.showGridConsume.value)
...viewModel.day.value.gridConsume,
if (viewModel.chartControl.showGridFeedIn.value)
...viewModel.day.value.gridFeedIn,
PowerDataPointDto(DateTime.now(), 100),
].map((x) => x.power).reduce(math.max);

final niceScale = NiceScale.calculate(
Expand Down Expand Up @@ -120,19 +124,19 @@ class AnalyticsDayChart extends StatelessWidget {
),
lineBarsData: [
_getLineChartData(
show: viewModel.showProduction.value,
show: viewModel.chartControl.showProduction.value,
data: viewModel.day.value.production,
color: AnalyticsChartColors.production),
_getLineChartData(
show: viewModel.showHome.value,
show: viewModel.chartControl.showHome.value,
data: viewModel.day.value.home,
color: AnalyticsChartColors.home),
_getLineChartData(
show: viewModel.showGridConsume.value,
show: viewModel.chartControl.showGridConsume.value,
data: viewModel.day.value.gridConsume,
color: AnalyticsChartColors.gridConsumption),
_getLineChartData(
show: viewModel.showGridFeedIn.value,
show: viewModel.chartControl.showGridFeedIn.value,
data: viewModel.day.value.gridFeedIn,
color: AnalyticsChartColors.gridFeedIn),
],
Expand Down

0 comments on commit 597cae4

Please sign in to comment.