2021-11-05 14:25:36 +03:00
|
|
|
import 'package:graphs/src/graph.dart';
|
2021-11-05 00:35:51 +03:00
|
|
|
import 'package:graphs/curve_painter.dart';
|
2021-11-05 14:25:36 +03:00
|
|
|
|
|
|
|
import 'package:file_picker/file_picker.dart';
|
2021-11-05 00:35:51 +03:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
2021-11-05 02:50:05 +03:00
|
|
|
Graphs getGraph() {
|
|
|
|
List<Dot> d = <Dot>[];
|
|
|
|
d.add(Dot.fromTwoLists("1", [2, 3], [1, 1]));
|
|
|
|
d.add(Dot.fromTwoLists("2", [1, 3], [1, 1]));
|
|
|
|
d.add(Dot.fromTwoLists("3", [1, 2], [1, 1]));
|
|
|
|
d.add(Dot.fromTwoLists("Name1", [], []));
|
|
|
|
d.add(Dot.fromTwoLists("Name2", [], []));
|
|
|
|
return Graphs.fromList("1", d, false, false);
|
|
|
|
}
|
|
|
|
|
2021-11-05 00:35:51 +03:00
|
|
|
class DrawingPage extends StatefulWidget {
|
|
|
|
const DrawingPage({Key? key}) : super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
|
|
State<StatefulWidget> createState() => _DrawingPageState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _DrawingPageState extends State<DrawingPage> {
|
2021-11-05 01:40:16 +03:00
|
|
|
double screenSize = 0;
|
2021-11-05 02:50:05 +03:00
|
|
|
Graphs data = getGraph();
|
2021-11-05 00:35:51 +03:00
|
|
|
|
2021-11-05 02:50:05 +03:00
|
|
|
final _textNameController = TextEditingController();
|
2021-11-05 03:23:20 +03:00
|
|
|
final _textNumbController = TextEditingController();
|
2021-11-05 14:25:36 +03:00
|
|
|
final _textDestController = TextEditingController();
|
2021-11-05 02:50:05 +03:00
|
|
|
final _textLnthController = TextEditingController();
|
2021-11-05 14:25:36 +03:00
|
|
|
|
2021-11-05 02:50:05 +03:00
|
|
|
void clearTextControllers() {
|
2021-11-05 14:25:36 +03:00
|
|
|
_textDestController.clear();
|
2021-11-05 03:23:20 +03:00
|
|
|
_textNumbController.clear();
|
2021-11-05 02:50:05 +03:00
|
|
|
_textLnthController.clear();
|
|
|
|
_textNameController.clear();
|
|
|
|
}
|
2021-11-05 01:40:16 +03:00
|
|
|
|
2021-11-05 00:35:51 +03:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2021-11-05 01:40:16 +03:00
|
|
|
screenSize = MediaQuery.of(context).size.width;
|
2021-11-05 00:35:51 +03:00
|
|
|
return MaterialApp(
|
|
|
|
home: Scaffold(
|
|
|
|
appBar: AppBar(
|
|
|
|
title: const Text("Graph",
|
2021-11-05 14:25:36 +03:00
|
|
|
style: TextStyle(fontSize: 30, color: Colors.white)),
|
2021-11-05 00:35:51 +03:00
|
|
|
toolbarHeight: 110, // Set this height
|
|
|
|
flexibleSpace: Container(
|
|
|
|
color: Colors.blue,
|
|
|
|
child: Column(children: <Widget>[
|
|
|
|
const SizedBox(height: 5),
|
2021-11-05 02:50:05 +03:00
|
|
|
Row(children: [
|
2021-11-05 03:23:20 +03:00
|
|
|
addSpaceW(screenSize / 8),
|
2021-11-05 02:50:05 +03:00
|
|
|
createButton("\nAdd dot\n", addDotPushed),
|
|
|
|
createInputBox("Dot name", screenSize / 4 - 25, Icons.label,
|
|
|
|
_textNameController),
|
|
|
|
addSpaceW(20),
|
|
|
|
createButton("\nDel dot \n", delDotPushed),
|
|
|
|
createInputBox("Dot number", screenSize / 4 - 25,
|
2021-11-05 03:23:20 +03:00
|
|
|
Icons.fiber_manual_record, _textNumbController),
|
2021-11-05 02:50:05 +03:00
|
|
|
]),
|
|
|
|
addSpaceH(3),
|
2021-11-05 01:40:16 +03:00
|
|
|
Row(children: [
|
2021-11-05 14:25:36 +03:00
|
|
|
addSpaceW(screenSize / 8 - 4),
|
|
|
|
createButton("\nAdd path\n", addPathPushed),
|
|
|
|
createInputBox("Input length", screenSize / 4 - 25,
|
2021-11-05 02:50:05 +03:00
|
|
|
Icons.arrow_right_alt_outlined, _textLnthController),
|
2021-11-05 14:25:36 +03:00
|
|
|
addSpaceW(13),
|
|
|
|
createButton("\nDel path\n", delPathPushed),
|
|
|
|
createInputBox("Destination number", screenSize / 4 - 25,
|
|
|
|
Icons.fiber_manual_record, _textDestController),
|
2021-11-05 01:40:16 +03:00
|
|
|
]),
|
2021-11-05 00:35:51 +03:00
|
|
|
]),
|
|
|
|
),
|
|
|
|
actions: [
|
|
|
|
IconButton(
|
2021-11-05 14:25:36 +03:00
|
|
|
onPressed: clearScreen,
|
2021-11-05 02:50:05 +03:00
|
|
|
icon: const Icon(Icons.delete_sweep),
|
|
|
|
iconSize: 60,
|
2021-11-05 00:35:51 +03:00
|
|
|
),
|
|
|
|
]),
|
|
|
|
body: CustomPaint(
|
2021-11-05 02:50:05 +03:00
|
|
|
painter: CurvePainter(gr: data),
|
2021-11-05 03:23:20 +03:00
|
|
|
child: Align(
|
|
|
|
alignment: Alignment.topRight,
|
|
|
|
child: ButtonBar(
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
children: <Widget>[
|
2021-11-05 14:25:36 +03:00
|
|
|
createButton("Save to file", () {}),
|
|
|
|
createButton("Load from file", fileOpener),
|
2021-11-05 03:23:20 +03:00
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
2021-11-05 00:35:51 +03:00
|
|
|
),
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
2021-11-05 01:40:16 +03:00
|
|
|
// ignore: avoid_types_as_parameter_names, non_constant_identifier_names, use_function_type_syntax_for_parameters
|
|
|
|
ElevatedButton createButton(String txt, void onPressing()) {
|
2021-11-05 00:35:51 +03:00
|
|
|
return ElevatedButton(
|
2021-11-05 01:40:16 +03:00
|
|
|
onPressed: onPressing,
|
2021-11-05 00:35:51 +03:00
|
|
|
child: Text(txt,
|
|
|
|
style: const TextStyle(
|
|
|
|
fontSize: 15,
|
|
|
|
color: Colors.white,
|
|
|
|
height: 1,
|
|
|
|
)),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2021-11-05 01:40:16 +03:00
|
|
|
Container createInputBox(String text, double wid, IconData icon,
|
|
|
|
TextEditingController controller) {
|
|
|
|
return Container(
|
|
|
|
width: wid,
|
|
|
|
height: 40,
|
|
|
|
margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 5),
|
|
|
|
child: TextField(
|
|
|
|
controller: controller,
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
decoration: InputDecoration(
|
|
|
|
contentPadding:
|
|
|
|
const EdgeInsets.symmetric(vertical: 10, horizontal: 10),
|
|
|
|
filled: true,
|
|
|
|
fillColor: Colors.white,
|
|
|
|
prefixIcon: Icon(icon, color: Colors.black),
|
|
|
|
border: const OutlineInputBorder(
|
|
|
|
borderRadius: BorderRadius.all(Radius.circular(40))),
|
|
|
|
hintStyle: const TextStyle(color: Colors.black38),
|
|
|
|
hintText: text),
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
SizedBox addSpaceH(double h) {
|
2021-11-05 00:35:51 +03:00
|
|
|
return SizedBox(height: h);
|
|
|
|
}
|
|
|
|
|
2021-11-05 01:40:16 +03:00
|
|
|
SizedBox addSpaceW(double w) {
|
|
|
|
return SizedBox(width: w);
|
|
|
|
}
|
|
|
|
|
|
|
|
void addDotPushed() {
|
2021-11-05 02:50:05 +03:00
|
|
|
//showPopUp("Test", "Test message");
|
|
|
|
//var inp = int.tryParse(_textNameController.text);
|
|
|
|
if (_textNameController.text == "") {
|
|
|
|
showPopUp("Error", "No name in \"Dot name\" box");
|
|
|
|
} else {
|
|
|
|
String? res = data.addIsolated(_textNameController.text);
|
|
|
|
if (res != null) {
|
|
|
|
showPopUp("Error", res);
|
|
|
|
}
|
|
|
|
}
|
2021-11-05 14:25:36 +03:00
|
|
|
clearTextControllers();
|
|
|
|
}
|
|
|
|
|
|
|
|
void addPathPushed() {
|
|
|
|
if (_textDestController.text == "") {
|
|
|
|
showPopUp("Error", "No name in \"Dot name\" box");
|
|
|
|
} else {
|
|
|
|
String? res = data.addIsolated(_textNameController.text);
|
|
|
|
if (res != null) {
|
|
|
|
showPopUp("Error", res);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
clearTextControllers();
|
|
|
|
}
|
|
|
|
|
|
|
|
void delPathPushed() {
|
|
|
|
if (_textDestController.text == "") {
|
|
|
|
showPopUp("Error", "No name in \"Dot name\" box");
|
|
|
|
} else {
|
|
|
|
String? res = data.addIsolated(_textNameController.text);
|
|
|
|
if (res != null) {
|
|
|
|
showPopUp("Error", res);
|
|
|
|
}
|
|
|
|
}
|
2021-11-05 02:50:05 +03:00
|
|
|
clearTextControllers();
|
|
|
|
}
|
|
|
|
|
|
|
|
void delDotPushed() {
|
2021-11-05 03:23:20 +03:00
|
|
|
if (_textNumbController.text == "") {
|
|
|
|
showPopUp("Error", "No number in \"Dot number\" box");
|
2021-11-05 02:50:05 +03:00
|
|
|
} else {
|
2021-11-05 03:23:20 +03:00
|
|
|
int? dot = int.tryParse(_textNumbController.text);
|
|
|
|
if (dot == null) {
|
|
|
|
showPopUp("Error", "Can't parse input.\nInts only allowed");
|
|
|
|
} else {
|
|
|
|
String? res = data.delDot(dot);
|
|
|
|
if (res != null) {
|
|
|
|
showPopUp("Error", res);
|
|
|
|
}
|
2021-11-05 02:50:05 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
clearTextControllers();
|
2021-11-05 01:40:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void addLenPushed() {
|
2021-11-05 02:50:05 +03:00
|
|
|
//data.delDot()
|
2021-11-05 01:40:16 +03:00
|
|
|
print(
|
2021-11-05 14:25:36 +03:00
|
|
|
"${_textNumbController.text} -> ${_textDestController.text} = ${_textLnthController.text}");
|
2021-11-05 02:50:05 +03:00
|
|
|
clearTextControllers();
|
2021-11-05 01:40:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void showPopUp(String alertTitle, String err) => showDialog<String>(
|
|
|
|
context: context,
|
|
|
|
builder: (BuildContext context) => AlertDialog(
|
|
|
|
title: Text(alertTitle),
|
|
|
|
content: Text(err),
|
|
|
|
actions: <Widget>[
|
|
|
|
TextButton(
|
|
|
|
onPressed: () => Navigator.pop(context, 'OK'),
|
|
|
|
child: const Text('OK'),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
|
2021-11-05 14:25:36 +03:00
|
|
|
void fileOpener() async {
|
|
|
|
FilePickerResult? result = await FilePicker.platform.pickFiles();
|
|
|
|
|
|
|
|
if (result != null) {
|
|
|
|
print(result.files.single.path!);
|
|
|
|
data.replaceDataFromFile(result.files.single.path!);
|
|
|
|
} else {
|
|
|
|
showPopUp("Error", "No file selected");
|
|
|
|
// User canceled the picker
|
2021-11-05 00:35:51 +03:00
|
|
|
}
|
|
|
|
}
|
2021-11-05 14:25:36 +03:00
|
|
|
|
|
|
|
void clearScreen() => data.flushData();
|
2021-11-05 00:35:51 +03:00
|
|
|
}
|