Added share menu to FormulaScreen

This commit is contained in:
Álvaro González 2026-04-17 12:37:12 +02:00
parent 1757d13b6e
commit 8a42d53c77
3 changed files with 90 additions and 47 deletions

View file

@ -1,6 +1,8 @@
import 'package:d4rt_formulas/error_handler.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; // For Clipboard
import 'package:d4rt_formulas/formula_models.dart';
import 'package:get_it/get_it.dart';
import '../corpus.dart';
import '../set_utils.dart';
import 'formula_screen.dart';
@ -22,6 +24,53 @@ class FormulaList extends StatefulWidget {
@override
State<FormulaList> createState() => _FormulaListState();
static String _formulaAndDependenciesToExportStringLiteral(Formula formula) {
final corpus = GetIt.instance.get<Corpus>();
final dependencies = corpus.withDependencies(formula);
final dependenciesAsMap = dependencies.map((f) => f.toMap()).toList();
for( final f in dependenciesAsMap ){
f.remove("uuid");
}
return SetUtils.prettyPrint(dependenciesAsMap);
}
static void shareFormula(Formula formula) async {
try {
final exportString = _formulaAndDependenciesToExportStringLiteral(formula);
// Share the string
await share_plus.SharePlus.instance.share(
share_plus.ShareParams(
text: exportString,
subject: 'Sharing formula: ${formula.name}',
),
);
} catch (e, st) {
errorHandler.notify(e, st);
}
}
static void copyFormula(BuildContext context, Formula formula) async {
try {
final exportString = _formulaAndDependenciesToExportStringLiteral(formula);
// Copy to clipboard
await Clipboard.setData(ClipboardData(text: exportString));
// Show a snackbar to confirm
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Formula and dependencies copied to clipboard!'),
duration: Duration(seconds: 2),
),
);
} catch (e, st) {
errorHandler.notify(e, st);
}
}
}
class _FormulaListState extends State<FormulaList> {
@ -56,49 +105,6 @@ class _FormulaListState extends State<FormulaList> {
}).toList();
}
String _formulaAndDependenciesToExportStringLiteral(Formula formula) {
final dependencies = widget.corpus.withDependencies(formula);
final dependenciesAsMap = dependencies.map((f) => f.toMap()).toList();
for( final f in dependenciesAsMap ){
f.remove("uuid");
}
return SetUtils.prettyPrint(dependenciesAsMap);
}
void _shareFormula(Formula formula) async {
try {
final exportString = _formulaAndDependenciesToExportStringLiteral(formula);
// Share the string
await share_plus.SharePlus.instance.share(
share_plus.ShareParams(
text: exportString,
subject: 'Sharing formula: ${formula.name}',
),
);
} catch (e) {
_showErrorDialog('Error sharing formula: $e');
}
}
void _copyFormula(Formula formula) async {
try {
final exportString = _formulaAndDependenciesToExportStringLiteral(formula);
// Copy to clipboard
await Clipboard.setData(ClipboardData(text: exportString));
// Show a snackbar to confirm
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Formula and dependencies copied to clipboard!'),
duration: Duration(seconds: 2),
),
);
} catch (e) {
_showErrorDialog('Error copying formula: $e');
}
}
void _showErrorDialog(String message) {
showDialog(
@ -155,9 +161,9 @@ class _FormulaListState extends State<FormulaList> {
tooltip: 'Share or copy to clipboard',
onSelected: (value) {
if (value == 'share') {
_shareFormula(formula);
FormulaList.shareFormula(formula);
} else if (value == 'copy') {
_copyFormula(formula);
FormulaList.copyFormula(context, formula);
}
},
itemBuilder: (context) => [

View file

@ -9,6 +9,7 @@ import '../corpus.dart';
import '../error_handler.dart';
import '../value_formatter.dart';
import 'd4rt_editing_controller.dart';
import 'formula_list.dart';
import 'unit_dropdown.dart';
import 'formula_editor.dart';
@ -157,6 +158,42 @@ class _FormulaScreenState extends State<FormulaScreen> {
appBar: AppBar(
title: Text(formula.name),
actions: [
PopupMenuButton(
icon: const Icon(Icons.share),
tooltip: 'Share or copy to clipboard',
onSelected: (value) {
if (value == 'share') {
FormulaList.shareFormula(formula.originalFormula);
} else if (value == 'copy') {
FormulaList.copyFormula(context, formula.originalFormula);
}
},
itemBuilder: (context) => [
PopupMenuItem(
value: 'share',
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.share, size: 20),
const SizedBox(width: 8),
Flexible(child: Text('Share', softWrap: false)),
],
),
),
PopupMenuItem(
value: 'copy',
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.copy, size: 20),
const SizedBox(width: 8),
Flexible(child: Text('Copy to clipboard', softWrap: false)),
],
),
),
],
),
IconButton(
icon: const Icon(Icons.edit),
onPressed: formula is DerivedFormula

View file

@ -423,7 +423,7 @@ Number functionSolver(
final Number dy = numericalDerivative(x);
if (dy == 0 || dy.abs() < 1e-12) {
throw NoSolutionException("Derivative is zero or too small, cannot continue Newton-Raphson.");
throw NoSolutionException("Derivative is zero or too small, cannot continue Newton-Raphson: $dy");
}
final Number delta = y / dy;
@ -436,7 +436,7 @@ Number functionSolver(
// If step exploded, cap the step to a reasonable multiple of `step`
final Number maxStepAllowed = step * 1e6;
if ((xNew - x).abs() > maxStepAllowed) {
xNew = x + (delta.isNegative ? -maxStepAllowed : maxStepAllowed);
xNew = x - (delta.isNegative ? -maxStepAllowed : maxStepAllowed);
}
x = xNew;