From 02fd849484f9c334445bb184414826e754a0f6cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez?= Date: Thu, 19 Mar 2026 18:52:33 +0100 Subject: [PATCH] import_from_text_screen.dart in its own file --- lib/ai/import_from_text_screen.dart | 140 ++++++++++++++++++++++++++++ lib/ai/import_preview_screen.dart | 121 ------------------------ lib/main.dart | 1 + 3 files changed, 141 insertions(+), 121 deletions(-) create mode 100644 lib/ai/import_from_text_screen.dart diff --git a/lib/ai/import_from_text_screen.dart b/lib/ai/import_from_text_screen.dart new file mode 100644 index 0000000..8219eb2 --- /dev/null +++ b/lib/ai/import_from_text_screen.dart @@ -0,0 +1,140 @@ +import 'package:d4rt_formulas/d4rt_formulas.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_code_editor/flutter_code_editor.dart'; +import 'package:get_it/get_it.dart'; +import 'package:flutter_highlight/themes/monokai-sublime.dart'; +import 'package:highlight/languages/dart.dart'; + +import '../database/database_service.dart'; +import '../service_locator.dart'; + +import '../services/import_service.dart'; +import 'formula_list.dart'; +import '../corpus.dart'; +import '../defaults/default_corpus.dart'; +import '../formula_models.dart' as models; +import 'import_preview_screen.dart'; + + +/// Screen to import formula elements from text +class ImportFromTextScreen extends StatefulWidget { + final Corpus corpus; + + const ImportFromTextScreen({super.key, required this.corpus}); + + @override + State createState() => _ImportFromTextScreenState(); +} + +class _ImportFromTextScreenState extends State { + final CodeController _codeController = CodeController(language: dart, text: "// Insert code here..."); + bool _isLoading = false; + + @override + void dispose() { + _codeController.dispose(); + super.dispose(); + } + + Future _pasteFromClipboard() async { + setState(() => _isLoading = true); + + try { + final clipboardData = await Clipboard.getData('text/plain'); + if (clipboardData?.text != null) { + _codeController.text = clipboardData!.text!; + } else { + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('Clipboard is empty'), backgroundColor: Colors.orange)); + } + } catch (e) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('Error pasting from clipboard: $e'), backgroundColor: Colors.red)); + } finally { + setState(() => _isLoading = false); + } + } + + Future _import() async { + final text = _codeController.fullText; + if (text.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please enter or paste formula text'), backgroundColor: Colors.orange), + ); + return; + } + + setState(() => _isLoading = true); + + try { + final importService = ImportService(); + final elements = importService.parseSharedText(text); + + if (!mounted) return; + + final result = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ImportPreviewScreen(elements: elements, corpus: widget.corpus), + ), + ); + + if (result == true) { + Navigator.pop(context, true); + } + } catch (e) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('Error parsing text: $e'), backgroundColor: Colors.red)); + } finally { + setState(() => _isLoading = false); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Import from Text')), + body: Column( + children: [ + Expanded( + child: CodeTheme( + data: CodeThemeData(styles: monokaiSublimeTheme), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: SingleChildScrollView(child: CodeField(controller: _codeController)), + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Row( + children: [ + Expanded( + child: ElevatedButton.icon( + onPressed: _isLoading ? null : _pasteFromClipboard, + icon: _isLoading + ? const SizedBox(width: 16, height: 16, child: CircularProgressIndicator(strokeWidth: 2)) + : const Icon(Icons.content_paste), + label: const Text('Paste'), + ), + ), + const SizedBox(width: 16), + Expanded( + child: ElevatedButton.icon( + onPressed: _isLoading ? null : _import, + icon: const Icon(Icons.library_add), + label: const Text('Import'), + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/ai/import_preview_screen.dart b/lib/ai/import_preview_screen.dart index efb5288..62ce1f4 100644 --- a/lib/ai/import_preview_screen.dart +++ b/lib/ai/import_preview_screen.dart @@ -210,124 +210,3 @@ class _ImportPreviewScreenState extends State { } } -/// Screen to import formula elements from text -class ImportFromTextScreen extends StatefulWidget { - final Corpus corpus; - - const ImportFromTextScreen({super.key, required this.corpus}); - - @override - State createState() => _ImportFromTextScreenState(); -} - -class _ImportFromTextScreenState extends State { - final CodeController _codeController = CodeController(language: dart, text: "// Insert code here..."); - bool _isLoading = false; - - @override - void dispose() { - _codeController.dispose(); - super.dispose(); - } - - Future _pasteFromClipboard() async { - setState(() => _isLoading = true); - - try { - final clipboardData = await Clipboard.getData('text/plain'); - if (clipboardData?.text != null) { - _codeController.text = clipboardData!.text!; - } else { - ScaffoldMessenger.of( - context, - ).showSnackBar(const SnackBar(content: Text('Clipboard is empty'), backgroundColor: Colors.orange)); - } - } catch (e) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Error pasting from clipboard: $e'), backgroundColor: Colors.red)); - } finally { - setState(() => _isLoading = false); - } - } - - Future _import() async { - final text = _codeController.fullText; - if (text.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please enter or paste formula text'), backgroundColor: Colors.orange), - ); - return; - } - - setState(() => _isLoading = true); - - try { - final importService = ImportService(); - final elements = importService.parseSharedText(text); - - if (!mounted) return; - - final result = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ImportPreviewScreen(elements: elements, corpus: widget.corpus), - ), - ); - - if (result == true) { - Navigator.pop(context, true); - } - } catch (e) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Error parsing text: $e'), backgroundColor: Colors.red)); - } finally { - setState(() => _isLoading = false); - } - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: const Text('Import from Text')), - body: Column( - children: [ - Expanded( - child: CodeTheme( - data: CodeThemeData(styles: monokaiSublimeTheme), - child: Padding( - padding: const EdgeInsets.all(16.0), - child: SingleChildScrollView(child: CodeField(controller: _codeController)), - ), - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: Row( - children: [ - Expanded( - child: ElevatedButton.icon( - onPressed: _isLoading ? null : _pasteFromClipboard, - icon: _isLoading - ? const SizedBox(width: 16, height: 16, child: CircularProgressIndicator(strokeWidth: 2)) - : const Icon(Icons.content_paste), - label: const Text('Paste'), - ), - ), - const SizedBox(width: 16), - Expanded( - child: ElevatedButton.icon( - onPressed: _isLoading ? null : _import, - icon: const Icon(Icons.library_add), - label: const Text('Import'), - ), - ), - ], - ), - ), - ], - ), - ); - } -} diff --git a/lib/main.dart b/lib/main.dart index 16cc515..a31e947 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:d4rt_formulas/d4rt_formulas.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; +import 'ai/import_from_text_screen.dart'; import 'database/database_service.dart'; import 'service_locator.dart';