Skip to main content

oxihuman_viewer/
driver_graph_view.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![allow(dead_code)]
4
5//! Driver/dependency graph view stub.
6
7/// Graph node type.
8#[derive(Debug, Clone, Copy, PartialEq)]
9pub enum GraphNodeType {
10    Driver,
11    Driven,
12    Intermediate,
13}
14
15/// A graph node entry.
16#[derive(Debug, Clone)]
17pub struct GraphNode {
18    pub id: u32,
19    pub node_type: GraphNodeType,
20    pub label: String,
21    pub position: [f32; 2],
22}
23
24/// Driver graph view configuration.
25#[derive(Debug, Clone)]
26pub struct DriverGraphView {
27    pub nodes: Vec<GraphNode>,
28    pub show_edge_labels: bool,
29    pub zoom: f32,
30    pub enabled: bool,
31}
32
33impl DriverGraphView {
34    pub fn new() -> Self {
35        DriverGraphView {
36            nodes: Vec::new(),
37            show_edge_labels: true,
38            zoom: 1.0,
39            enabled: true,
40        }
41    }
42}
43
44impl Default for DriverGraphView {
45    fn default() -> Self {
46        Self::new()
47    }
48}
49
50/// Create a new driver graph view.
51pub fn new_driver_graph_view() -> DriverGraphView {
52    DriverGraphView::new()
53}
54
55/// Add a node to the graph.
56pub fn dgv_add_node(view: &mut DriverGraphView, node: GraphNode) {
57    view.nodes.push(node);
58}
59
60/// Clear all nodes.
61pub fn dgv_clear(view: &mut DriverGraphView) {
62    view.nodes.clear();
63}
64
65/// Set zoom level.
66pub fn dgv_set_zoom(view: &mut DriverGraphView, zoom: f32) {
67    view.zoom = zoom.max(0.01);
68}
69
70/// Toggle edge label display.
71pub fn dgv_show_edge_labels(view: &mut DriverGraphView, show: bool) {
72    view.show_edge_labels = show;
73}
74
75/// Enable or disable.
76pub fn dgv_set_enabled(view: &mut DriverGraphView, enabled: bool) {
77    view.enabled = enabled;
78}
79
80/// Return node count.
81pub fn dgv_node_count(view: &DriverGraphView) -> usize {
82    view.nodes.len()
83}
84
85/// Serialize to JSON-like string.
86pub fn dgv_to_json(view: &DriverGraphView) -> String {
87    format!(
88        r#"{{"node_count":{},"show_edge_labels":{},"zoom":{},"enabled":{}}}"#,
89        view.nodes.len(),
90        view.show_edge_labels,
91        view.zoom,
92        view.enabled
93    )
94}
95
96#[cfg(test)]
97mod tests {
98    use super::*;
99
100    fn make_node(id: u32) -> GraphNode {
101        GraphNode {
102            id,
103            node_type: GraphNodeType::Driver,
104            label: "driver".to_string(),
105            position: [0.0, 0.0],
106        }
107    }
108
109    #[test]
110    fn test_initial_empty() {
111        let v = new_driver_graph_view();
112        assert_eq!(dgv_node_count(&v), 0 /* no nodes initially */);
113    }
114
115    #[test]
116    fn test_add_node() {
117        let mut v = new_driver_graph_view();
118        dgv_add_node(&mut v, make_node(0));
119        assert_eq!(dgv_node_count(&v), 1 /* one node after add */);
120    }
121
122    #[test]
123    fn test_clear() {
124        let mut v = new_driver_graph_view();
125        dgv_add_node(&mut v, make_node(0));
126        dgv_clear(&mut v);
127        assert_eq!(dgv_node_count(&v), 0 /* cleared */);
128    }
129
130    #[test]
131    fn test_zoom_min() {
132        let mut v = new_driver_graph_view();
133        dgv_set_zoom(&mut v, 0.0);
134        assert!((v.zoom - 0.01).abs() < 1e-6 /* zoom minimum must be 0.01 */);
135    }
136
137    #[test]
138    fn test_set_zoom() {
139        let mut v = new_driver_graph_view();
140        dgv_set_zoom(&mut v, 2.5);
141        assert!((v.zoom - 2.5).abs() < 1e-6 /* zoom must be set */);
142    }
143
144    #[test]
145    fn test_edge_labels() {
146        let mut v = new_driver_graph_view();
147        dgv_show_edge_labels(&mut v, false);
148        assert!(!v.show_edge_labels /* edge labels must be hidden */);
149    }
150
151    #[test]
152    fn test_set_enabled() {
153        let mut v = new_driver_graph_view();
154        dgv_set_enabled(&mut v, false);
155        assert!(!v.enabled /* must be disabled */);
156    }
157
158    #[test]
159    fn test_to_json_has_node_count() {
160        let v = new_driver_graph_view();
161        let j = dgv_to_json(&v);
162        assert!(j.contains("\"node_count\"") /* JSON must have node_count */);
163    }
164
165    #[test]
166    fn test_enabled_default() {
167        let v = new_driver_graph_view();
168        assert!(v.enabled /* must be enabled by default */);
169    }
170}