aboutsummaryrefslogtreecommitdiff
path: root/frontend/lib/viewmodels/skill_tree_viewmodel.dart
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/lib/viewmodels/skill_tree_viewmodel.dart')
-rw-r--r--frontend/lib/viewmodels/skill_tree_viewmodel.dart87
1 files changed, 87 insertions, 0 deletions
diff --git a/frontend/lib/viewmodels/skill_tree_viewmodel.dart b/frontend/lib/viewmodels/skill_tree_viewmodel.dart
new file mode 100644
index 000000000..5383d127c
--- /dev/null
+++ b/frontend/lib/viewmodels/skill_tree_viewmodel.dart
@@ -0,0 +1,87 @@
+import 'dart:convert';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:graphview/GraphView.dart';
+
+import 'package:auto_gpt_flutter_client/models/skill_tree/skill_tree_category.dart';
+import 'package:auto_gpt_flutter_client/models/skill_tree/skill_tree_edge.dart';
+import 'package:auto_gpt_flutter_client/models/skill_tree/skill_tree_node.dart';
+
+class SkillTreeViewModel extends ChangeNotifier {
+ List<SkillTreeNode> _skillTreeNodes = [];
+ List<SkillTreeNode> get skillTreeNodes => _skillTreeNodes;
+
+ List<SkillTreeEdge> _skillTreeEdges = [];
+ List<SkillTreeEdge> get skillTreeEdges => _skillTreeEdges;
+
+ SkillTreeNode? _selectedNode;
+ SkillTreeNode? get selectedNode => _selectedNode;
+
+ final Graph graph = Graph();
+ SugiyamaConfiguration builder = SugiyamaConfiguration();
+
+ SkillTreeCategory currentSkillTreeType = SkillTreeCategory.general;
+
+ Future<void> initializeSkillTree() async {
+ try {
+ resetState();
+
+ String fileName = currentSkillTreeType.jsonFileName;
+
+ // Read the JSON file from assets
+ String jsonContent = await rootBundle.loadString('assets/$fileName');
+
+ // Decode the JSON string
+ Map<String, dynamic> decodedJson = jsonDecode(jsonContent);
+
+ // Create SkillTreeNodes from the decoded JSON
+ for (var nodeMap in decodedJson['nodes']) {
+ SkillTreeNode node = SkillTreeNode.fromJson(nodeMap);
+ _skillTreeNodes.add(node);
+ }
+
+ // Create SkillTreeEdges from the decoded JSON
+ for (var edgeMap in decodedJson['edges']) {
+ SkillTreeEdge edge = SkillTreeEdge.fromJson(edgeMap);
+ _skillTreeEdges.add(edge);
+ }
+
+ builder.orientation = (SugiyamaConfiguration.ORIENTATION_LEFT_RIGHT);
+ builder.bendPointShape = CurvedBendPointShape(curveLength: 20);
+
+ notifyListeners();
+
+ return Future.value(); // Explicitly return a completed Future
+ } catch (e) {
+ print(e);
+ }
+ }
+
+ void resetState() {
+ _skillTreeNodes = [];
+ _skillTreeEdges = [];
+ _selectedNode = null;
+ }
+
+ void toggleNodeSelection(String nodeId) {
+ if (_selectedNode?.id == nodeId) {
+ // Unselect the node if it's already selected
+ _selectedNode = null;
+ } else {
+ // Select the new node
+ _selectedNode = _skillTreeNodes.firstWhere((node) => node.id == nodeId);
+ }
+ notifyListeners();
+ }
+
+ // Function to get a node by its ID
+ SkillTreeNode? getNodeById(String nodeId) {
+ try {
+ // Find the node in the list where the ID matches
+ return _skillTreeNodes.firstWhere((node) => node.id == nodeId);
+ } catch (e) {
+ print("Node with ID $nodeId not found: $e");
+ return null;
+ }
+ }
+}