Skip to content

Commit 6670ca5

Browse files
authored
refactor: deduplicate save filename dialog across instrument screens (#3236)
1 parent 8bef730 commit 6670ca5

13 files changed

Lines changed: 65 additions & 363 deletions

lib/constants.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ const multimeterScreenTitleKey = 'multimeter_screen_title';
1010
const waveGeneratorScreenTitleKey = 'wave_generator_screen_title';
1111
const oscilloscopeScreenTitleKey = 'oscilloscope_screen_title';
1212

13+
const int kMaxFileNameLength = 200;
14+
1315
AppLocalizations appLocalizations = getIt.get<AppLocalizations>();
1416

1517
List<String> instrumentIcons = [

lib/view/accelerometer_screen.dart

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'package:flutter/material.dart';
2-
import 'package:intl/intl.dart';
32
import 'package:provider/provider.dart';
43
import 'package:pslab/constants.dart';
54
import 'package:pslab/l10n/app_localizations.dart';
65
import 'package:pslab/providers/locator.dart';
76
import 'package:pslab/view/widgets/guide_widget.dart';
7+
import 'package:pslab/view/widgets/save_filename_dialog.dart';
88
import 'package:pslab/providers/accelerometer_state_provider.dart';
99
import 'package:pslab/view/widgets/common_scaffold_widget.dart';
1010
import 'package:pslab/view/widgets/accelerometer_card.dart';
@@ -173,38 +173,7 @@ class _AccelerometerScreenState extends State<AccelerometerScreen> {
173173
}
174174

175175
Future<void> _showSaveFileDialog(List<List<dynamic>> data) async {
176-
final TextEditingController filenameController = TextEditingController();
177-
final String defaultFilename =
178-
'${DateFormat('yyyy-MM-dd_HH-mm-ss').format(DateTime.now())}.csv';
179-
filenameController.text = defaultFilename;
180-
181-
final String? fileName = await showDialog<String>(
182-
context: context,
183-
builder: (context) {
184-
return AlertDialog(
185-
title: Text(appLocalizations.saveRecording),
186-
content: TextField(
187-
controller: filenameController,
188-
decoration: InputDecoration(
189-
hintText: appLocalizations.enterFileName,
190-
labelText: appLocalizations.fileName,
191-
),
192-
),
193-
actions: [
194-
TextButton(
195-
onPressed: () => Navigator.pop(context),
196-
child: Text(appLocalizations.cancel.toUpperCase()),
197-
),
198-
ElevatedButton(
199-
onPressed: () {
200-
Navigator.pop(context, filenameController.text);
201-
},
202-
child: Text(appLocalizations.save),
203-
),
204-
],
205-
);
206-
},
207-
);
176+
final String? fileName = await showSaveFileNameDialog(context);
208177

209178
if (fileName != null) {
210179
_csvService.writeMetaData(

lib/view/barometer_screen.dart

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'dart:math';
2-
import 'package:intl/intl.dart';
32
import 'package:pslab/communication/peripherals/i2c.dart';
43
import 'package:pslab/communication/science_lab.dart';
54
import 'package:flutter/material.dart';
@@ -12,6 +11,7 @@ import 'package:pslab/view/widgets/common_scaffold_widget.dart';
1211
import 'package:pslab/view/widgets/barometer_card.dart';
1312
import 'package:fl_chart/fl_chart.dart';
1413
import 'package:pslab/view/widgets/guide_widget.dart';
14+
import 'package:pslab/view/widgets/save_filename_dialog.dart';
1515
import 'package:pslab/others/csv_service.dart';
1616
import 'package:pslab/view/logged_data_screen.dart';
1717

@@ -208,38 +208,7 @@ class _BarometerScreenState extends State<BarometerScreen> {
208208
}
209209

210210
Future<void> _showSaveFileDialog(List<List<dynamic>> data) async {
211-
final TextEditingController filenameController = TextEditingController();
212-
final String defaultFilename =
213-
'${DateFormat('yyyy-MM-dd_HH-mm-ss').format(DateTime.now())}.csv';
214-
filenameController.text = defaultFilename;
215-
216-
final String? fileName = await showDialog<String>(
217-
context: context,
218-
builder: (context) {
219-
return AlertDialog(
220-
title: Text(appLocalizations.saveRecording),
221-
content: TextField(
222-
controller: filenameController,
223-
decoration: InputDecoration(
224-
hintText: appLocalizations.enterFileName,
225-
labelText: appLocalizations.fileName,
226-
),
227-
),
228-
actions: [
229-
TextButton(
230-
onPressed: () => Navigator.pop(context),
231-
child: Text(appLocalizations.cancel),
232-
),
233-
ElevatedButton(
234-
onPressed: () {
235-
Navigator.pop(context, filenameController.text);
236-
},
237-
child: Text(appLocalizations.save),
238-
),
239-
],
240-
);
241-
},
242-
);
211+
final String? fileName = await showSaveFileNameDialog(context);
243212

244213
if (fileName != null) {
245214
_csvService.writeMetaData(appLocalizations.barometer.toLowerCase(), data);

lib/view/compass_screen.dart

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import 'package:flutter/material.dart';
2-
import 'package:intl/intl.dart';
32
import 'package:provider/provider.dart';
43
import 'package:pslab/others/csv_service.dart';
54
import 'package:pslab/view/widgets/common_scaffold_widget.dart';
65
import 'package:pslab/view/widgets/guide_widget.dart';
6+
import 'package:pslab/view/widgets/save_filename_dialog.dart';
77
import 'package:pslab/view/logged_data_screen.dart';
88
import 'package:pslab/view/compass_config_screen.dart';
99
import '../l10n/app_localizations.dart';
@@ -172,38 +172,7 @@ class _CompassScreenContentState extends State<CompassScreenContent> {
172172
}
173173

174174
Future<void> _showSaveFileDialog(List<List<dynamic>> data) async {
175-
final TextEditingController filenameController = TextEditingController();
176-
final String defaultFilename =
177-
'${DateFormat('yyyy-MM-dd_HH-mm-ss').format(DateTime.now())}.csv';
178-
filenameController.text = defaultFilename;
179-
180-
final String? fileName = await showDialog<String>(
181-
context: context,
182-
builder: (context) {
183-
return AlertDialog(
184-
title: Text(appLocalizations.saveRecording),
185-
content: TextField(
186-
controller: filenameController,
187-
decoration: InputDecoration(
188-
hintText: appLocalizations.enterFileName,
189-
labelText: appLocalizations.fileName,
190-
),
191-
),
192-
actions: [
193-
TextButton(
194-
onPressed: () => Navigator.pop(context),
195-
child: Text(appLocalizations.cancel.toUpperCase()),
196-
),
197-
ElevatedButton(
198-
onPressed: () {
199-
Navigator.pop(context, filenameController.text);
200-
},
201-
child: Text(appLocalizations.save),
202-
),
203-
],
204-
);
205-
},
206-
);
175+
final String? fileName = await showSaveFileNameDialog(context);
207176

208177
if (fileName != null) {
209178
_csvService.writeMetaData(

lib/view/gyroscope_screen.dart

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import 'package:flutter/material.dart';
2-
import 'package:intl/intl.dart';
32
import 'package:provider/provider.dart';
43
import 'package:pslab/providers/gyroscope_config_provider.dart';
54
import 'package:pslab/providers/gyroscope_state_provider.dart';
65
import 'package:pslab/view/widgets/guide_widget.dart';
76
import 'package:pslab/view/widgets/gyroscope_card.dart';
87
import 'package:pslab/view/widgets/common_scaffold_widget.dart';
8+
import 'package:pslab/view/widgets/save_filename_dialog.dart';
99
import 'package:pslab/l10n/app_localizations.dart';
1010
import 'package:pslab/providers/locator.dart';
1111
import 'package:pslab/others/csv_service.dart';
@@ -164,38 +164,7 @@ class _GyroscopeScreenState extends State<GyroscopeScreen> {
164164
}
165165

166166
Future<void> _showSaveFileDialog(List<List<dynamic>> data) async {
167-
final TextEditingController filenameController = TextEditingController();
168-
final String defaultFilename =
169-
'${DateFormat('yyyy-MM-dd_HH-mm-ss').format(DateTime.now())}.csv';
170-
filenameController.text = defaultFilename;
171-
172-
final String? fileName = await showDialog<String>(
173-
context: context,
174-
builder: (context) {
175-
return AlertDialog(
176-
title: Text(appLocalizations.saveRecording),
177-
content: TextField(
178-
controller: filenameController,
179-
decoration: InputDecoration(
180-
hintText: appLocalizations.enterFileName,
181-
labelText: appLocalizations.fileName,
182-
),
183-
),
184-
actions: [
185-
TextButton(
186-
onPressed: () => Navigator.pop(context),
187-
child: Text(appLocalizations.cancel.toUpperCase()),
188-
),
189-
ElevatedButton(
190-
onPressed: () {
191-
Navigator.pop(context, filenameController.text);
192-
},
193-
child: Text(appLocalizations.save),
194-
),
195-
],
196-
);
197-
},
198-
);
167+
final String? fileName = await showSaveFileNameDialog(context);
199168

200169
if (fileName != null) {
201170
_csvService.writeMetaData(appLocalizations.gyroscope.toLowerCase(), data);

lib/view/logic_analyzer_screen.dart

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter/services.dart';
3-
import 'package:intl/intl.dart';
43
import 'package:provider/provider.dart';
54
import 'package:pslab/communication/science_lab.dart';
65
import 'package:pslab/constants.dart';
@@ -14,6 +13,7 @@ import 'package:pslab/view/widgets/common_scaffold_widget.dart';
1413
import 'package:pslab/view/widgets/guide_widget.dart';
1514
import 'package:pslab/view/widgets/logic_analyzer_channel_selection.dart';
1615
import 'package:pslab/view/widgets/logic_analyzer_graph.dart';
16+
import 'package:pslab/view/widgets/save_filename_dialog.dart';
1717
import 'package:pslab/l10n/app_localizations.dart';
1818
import 'package:pslab/providers/locator.dart';
1919

@@ -167,38 +167,7 @@ class _LogicAnalyzerScreenState extends State<LogicAnalyzerScreen> {
167167
}
168168

169169
Future<void> _showSaveFileDialog(List<List<dynamic>> data) async {
170-
final TextEditingController filenameController = TextEditingController();
171-
final String defaultFilename =
172-
'${DateFormat('yyyy-MM-dd_HH-mm-ss').format(DateTime.now())}.csv';
173-
filenameController.text = defaultFilename;
174-
175-
final String? fileName = await showDialog<String>(
176-
context: context,
177-
builder: (context) {
178-
return AlertDialog(
179-
title: Text(appLocalizations.saveRecording),
180-
content: TextField(
181-
controller: filenameController,
182-
decoration: InputDecoration(
183-
hintText: appLocalizations.enterFileName,
184-
labelText: appLocalizations.fileName,
185-
),
186-
),
187-
actions: [
188-
TextButton(
189-
onPressed: () => Navigator.pop(context),
190-
child: Text(appLocalizations.cancel.toUpperCase()),
191-
),
192-
ElevatedButton(
193-
onPressed: () {
194-
Navigator.pop(context, filenameController.text);
195-
},
196-
child: Text(appLocalizations.save),
197-
),
198-
],
199-
);
200-
},
201-
);
170+
final String? fileName = await showSaveFileNameDialog(context);
202171

203172
if (fileName != null) {
204173
_csvService.writeMetaData(

lib/view/luxmeter_screen.dart

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'dart:async';
22
import 'package:flutter/material.dart';
3-
import 'package:intl/intl.dart';
43
import 'package:provider/provider.dart';
54
import 'package:pslab/l10n/app_localizations.dart';
65
import 'package:pslab/providers/locator.dart';
@@ -11,6 +10,7 @@ import 'package:pslab/view/logged_data_screen.dart';
1110
import 'package:pslab/view/widgets/common_scaffold_widget.dart';
1211
import 'package:pslab/view/widgets/guide_widget.dart';
1312
import 'package:pslab/view/widgets/luxmeter_card.dart';
13+
import 'package:pslab/view/widgets/save_filename_dialog.dart';
1414
import 'package:fl_chart/fl_chart.dart';
1515
import 'package:pslab/view/luxmeter_config_screen.dart';
1616
import '../providers/experiment_provider.dart';
@@ -149,38 +149,7 @@ class _LuxMeterScreenState extends State<LuxMeterScreen> {
149149
}
150150

151151
Future<void> _showSaveFileDialog(List<List<dynamic>> data) async {
152-
final TextEditingController filenameController = TextEditingController();
153-
final String defaultFilename =
154-
'${DateFormat('yyyy-MM-dd_HH-mm-ss').format(DateTime.now())}.csv';
155-
filenameController.text = defaultFilename;
156-
157-
final String? fileName = await showDialog<String>(
158-
context: context,
159-
builder: (context) {
160-
return AlertDialog(
161-
title: Text(appLocalizations.saveRecording),
162-
content: TextField(
163-
controller: filenameController,
164-
decoration: InputDecoration(
165-
hintText: appLocalizations.enterFileName,
166-
labelText: appLocalizations.fileName,
167-
),
168-
),
169-
actions: [
170-
TextButton(
171-
onPressed: () => Navigator.pop(context),
172-
child: Text(appLocalizations.cancel.toUpperCase()),
173-
),
174-
ElevatedButton(
175-
onPressed: () {
176-
Navigator.pop(context, filenameController.text);
177-
},
178-
child: Text(appLocalizations.save),
179-
),
180-
],
181-
);
182-
},
183-
);
152+
final String? fileName = await showSaveFileNameDialog(context);
184153

185154
if (fileName != null) {
186155
_csvService.writeMetaData(appLocalizations.luxMeter.toLowerCase(), data);

lib/view/multimeter_screen.dart

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:flutter/material.dart';
2-
import 'package:intl/intl.dart';
32
import 'package:provider/provider.dart';
43
import 'package:pslab/constants.dart';
54
import 'package:pslab/l10n/app_localizations.dart';
@@ -13,6 +12,7 @@ import 'package:pslab/view/multimeter_config_screen.dart';
1312
import 'package:pslab/view/widgets/common_scaffold_widget.dart';
1413
import 'package:pslab/view/widgets/guide_widget.dart';
1514
import 'package:pslab/view/widgets/multimeter_knob.dart';
15+
import 'package:pslab/view/widgets/save_filename_dialog.dart';
1616

1717
class MultimeterScreen extends StatefulWidget {
1818
final String icRecord = 'assets/icons/ic_record_white.png';
@@ -206,38 +206,7 @@ class _MultimeterScreenState extends State<MultimeterScreen> {
206206
}
207207

208208
Future<void> _showSaveFileDialog(List<List<dynamic>> data) async {
209-
final TextEditingController filenameController = TextEditingController();
210-
final String defaultFilename =
211-
'${DateFormat('yyyy-MM-dd_HH-mm-ss').format(DateTime.now())}.csv';
212-
filenameController.text = defaultFilename;
213-
214-
final String? fileName = await showDialog<String>(
215-
context: context,
216-
builder: (context) {
217-
return AlertDialog(
218-
title: Text(appLocalizations.saveRecording),
219-
content: TextField(
220-
controller: filenameController,
221-
decoration: InputDecoration(
222-
hintText: appLocalizations.enterFileName,
223-
labelText: appLocalizations.fileName,
224-
),
225-
),
226-
actions: [
227-
TextButton(
228-
onPressed: () => Navigator.pop(context),
229-
child: Text(appLocalizations.cancel.toUpperCase()),
230-
),
231-
ElevatedButton(
232-
onPressed: () {
233-
Navigator.pop(context, filenameController.text);
234-
},
235-
child: Text(appLocalizations.save),
236-
),
237-
],
238-
);
239-
},
240-
);
209+
final String? fileName = await showSaveFileNameDialog(context);
241210

242211
if (fileName != null) {
243212
_csvService.writeMetaData(

0 commit comments

Comments
 (0)