From f1df814f2e5795330615c00e5d8069325a3629bf Mon Sep 17 00:00:00 2001 From: noname Date: Mon, 3 Mar 2025 00:51:26 +1100 Subject: implement node class --- lib/sway/node.vala | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 lib/sway/node.vala (limited to 'lib/sway/node.vala') 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 _nodes = + new HashTable(i => i, (a,b) => a==b); + public List 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(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; + } + } +} -- cgit v1.2.3