aboutsummaryrefslogtreecommitdiff
path: root/frontend/lib/views/skill_tree/tree_node_view.dart
blob: 83534144aafbcd70ac9362e3bcd6230301598eb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import 'package:auto_gpt_flutter_client/models/skill_tree/skill_tree_node.dart';
import 'package:auto_gpt_flutter_client/viewmodels/skill_tree_viewmodel.dart';
import 'package:auto_gpt_flutter_client/viewmodels/task_queue_viewmodel.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class TreeNodeView extends StatefulWidget {
  final SkillTreeNode node;
  final bool selected;

  TreeNodeView({required this.node, this.selected = false});

  @override
  _TreeNodeViewState createState() => _TreeNodeViewState();
}

class _TreeNodeViewState extends State<TreeNodeView> {
  bool _isHovering = false;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print('Node ${widget.node.id} clicked');
        final taskQueueViewModel =
            Provider.of<TaskQueueViewModel>(context, listen: false);
        if (!taskQueueViewModel.isBenchmarkRunning) {
          final skillTreeViewModel =
              Provider.of<SkillTreeViewModel>(context, listen: false);
          skillTreeViewModel.toggleNodeSelection(widget.node.id);
          taskQueueViewModel.updateSelectedNodeHierarchyBasedOnOption(
              taskQueueViewModel.selectedOption,
              skillTreeViewModel.selectedNode,
              skillTreeViewModel.skillTreeNodes,
              skillTreeViewModel.skillTreeEdges);
        }
      },
      child: MouseRegion(
        onEnter: (_) => setState(() => _isHovering = true),
        onExit: (_) => setState(() => _isHovering = false),
        child: Column(
          mainAxisSize: MainAxisSize.min, // Use minimum space
          children: [
            Container(
              width: 30,
              height: 30,
              decoration: BoxDecoration(
                color: Colors.grey[300], // Light grey
                borderRadius:
                    BorderRadius.circular(8), // Slight rounded corners
              ),
              child: Center(
                child: Icon(
                  Icons.star,
                  color: widget.selected
                      ? Colors.red
                      : (_isHovering
                          ? Colors.red
                          : Colors
                              .black), // Black when not hovering or selected
                ),
              ),
            ),
            SizedBox(height: 4),
            Text(
              widget.node.label,
              style: TextStyle(fontSize: 12),
            ),
          ],
        ),
      ),
    );
  }
}