diff options
author | noname <[email protected]> | 2025-03-03 00:51:26 +1100 |
---|---|---|
committer | noname <[email protected]> | 2025-03-03 22:06:48 +1100 |
commit | f1df814f2e5795330615c00e5d8069325a3629bf (patch) | |
tree | 67e95e0e3f866efa96b3ae31c786aaed0c8db4d7 /lib/sway/node.vala | |
parent | 57d00e5eb47576e4c6711547aa1611a2f542c8d9 (diff) |
implement node class
Diffstat (limited to 'lib/sway/node.vala')
-rw-r--r-- | lib/sway/node.vala | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/sway/node.vala b/lib/sway/node.vala new file mode 100644 index 0000000..c3777f3 --- /dev/null +++ b/lib/sway/node.vala @@ -0,0 +1,77 @@ +namespace AstalSway { + public enum NodeType { + ROOT, + WORKSPACE, + CONTAINER, + CLIENT, + MONITOR + } + + public class Node : Object { + public int id {get; private set; } + public bool focused { get; private set; } + public string name; + public string layout; + public NodeType type; + public weak Node parent; + + private HashTable<int, Node> _nodes = + new HashTable<int, Node>(i => i, (a,b) => a==b); + public List<weak Node> nodes { owned get { return _nodes.get_values(); } } + + protected Json.Object data; + + public static Node? build(Json.Object obj) { + if (obj == null) { + return null; + } + switch (obj.get_string_member("type")) { + case "workspace": + var ws = new Workspace(); + ws.sync(obj); + return ws as Node; + + default: + var node = new Node(); + node.sync(obj); + return node; + break; + + } + return null; + } + + internal virtual void sync(Json.Object obj) { + if (obj == null) { + return; + } + data = obj; + id = (int)obj.get_int_member("id"); + name = obj.get_string_member("name"); + focused = obj.get_boolean_member("focused"); + layout = obj.get_string_member("layout"); + + var arr = obj.get_array_member("nodes"); + sync_nodes(arr); + } + + private void sync_nodes(Json.Array arr) { + var new_nodes = new HashTable<int, Node>(i => i, (a,b) => a==b); + + foreach (var item in arr.get_elements()) { + var obj = item.get_object(); + int id = (int)obj.get_int_member("id"); + var node = _nodes.get(id); + + if (node == null) { + node = Node.build(obj); + } + + new_nodes.insert(id, node); + node.sync(obj); + } + + _nodes = new_nodes; + } + } +} |