ttx 0.1.0
Loading...
Searching...
No Matches
layout_json.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/container/string/prelude.h"
4#include "di/reflect/prelude.h"
5#include "di/serialization/json_deserializer.h"
6#include "di/serialization/json_serializer.h"
7#include "di/serialization/percent_encoded.h"
8#include "ttx/direction.h"
9
10namespace ttx::json::v1 {
11struct Pane {
12 i64 relative_size { 0 };
13 u64 id { 0 };
14 di::Optional<di::PercentEncoded<>> current_working_directory;
15
16 auto operator==(Pane const&) const -> bool = default;
17
18 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<Pane>) {
19 return di::make_fields<"json::v1::Pane">(
20 di::field<"relative_size", &Pane::relative_size>, di::field<"id", &Pane::id>,
21 di::field<"current_working_directory", &Pane::current_working_directory>);
22 }
23};
24
25struct PaneLayoutNode;
26
27struct PaneLayoutVariant : di::Variant<di::Box<PaneLayoutNode>, Pane> {
28 using Base = di::Variant<di::Box<PaneLayoutNode>, Pane>;
29
30 using Base::Base;
31 using Base::operator=;
32
33 auto operator==(PaneLayoutVariant const& other) const -> bool;
34};
35
37 di::Vector<PaneLayoutVariant> children;
38 i64 relative_size { 0 };
40
41 auto operator==(PaneLayoutNode const& other) const -> bool = default;
42
43 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<PaneLayoutNode>) {
44 return di::make_fields<"json::v1::PaneLayoutNode">(di::field<"children", &PaneLayoutNode::children>,
45 di::field<"relative_size", &PaneLayoutNode::relative_size>,
46 di::field<"direction", &PaneLayoutNode::direction>);
47 }
48};
49
50inline auto PaneLayoutVariant::operator==(PaneLayoutVariant const& other) const -> bool {
51 if (index() != other.index()) {
52 return false;
53 }
54 if (index() == 0) {
55 return *di::get<di::Box<PaneLayoutNode>>(*this) == *di::get<di::Box<PaneLayoutNode>>(other);
56 }
57 return di::get<Pane>(*this) == di::get<Pane>(other);
58}
59
60struct Tab {
62 di::Vector<u64> pane_ids_by_recency;
63 di::Optional<u64> active_pane_id;
64 di::Optional<u64> full_screen_pane_id;
65 di::String name;
66 u64 id { 0 };
67
68 auto operator==(Tab const&) const -> bool = default;
69
70 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<Tab>) {
71 return di::make_fields<"json::v1::Tab">(di::field<"pane_layout", &Tab::pane_layout>,
72 di::field<"pane_ids_by_recency", &Tab::pane_ids_by_recency>,
73 di::field<"active_pane_id", &Tab::active_pane_id>,
74 di::field<"full_screen_pane_id", &Tab::full_screen_pane_id>,
75 di::field<"name", &Tab::name>, di::field<"id", &Tab::id>);
76 }
77};
78
79struct Session {
80 di::Vector<Tab> tabs;
81 di::Optional<u64> active_tab_id;
82 di::String name;
83 u64 id { 0 };
84
85 auto operator==(Session const&) const -> bool = default;
86
87 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<Session>) {
88 return di::make_fields<"json::v1::Session">(di::field<"tabs", &Session::tabs>,
89 di::field<"active_tab_id", &Session::active_tab_id>,
90 di::field<"name", &Session::name>, di::field<"id", &Session::id>);
91 }
92};
93
95 di::Vector<Session> sessions;
96 di::Optional<u64> active_session_id;
97
98 auto operator==(LayoutState const&) const -> bool = default;
99
100 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<LayoutState>) {
101 return di::make_fields<"json::v1::LayoutState">(
102 di::field<"sessions", &LayoutState::sessions>,
103 di::field<"active_session_id", &LayoutState::active_session_id>);
104 }
105};
106}
107
108namespace ttx::json {
109using Layout = di::Variant<json::v1::LayoutState>;
110}
Definition layout_json.h:10
Definition layout_json.h:10
di::Variant< json::v1::LayoutState > Layout
Definition layout_json.h:109
Direction
Definition direction.h:7
@ None
Definition direction.h:8
Definition layout_json.h:94
di::Optional< u64 > active_session_id
Definition layout_json.h:96
di::Vector< Session > sessions
Definition layout_json.h:95
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< LayoutState >)
Definition layout_json.h:100
auto operator==(LayoutState const &) const -> bool=default
Definition layout_json.h:36
i64 relative_size
Definition layout_json.h:38
di::Vector< PaneLayoutVariant > children
Definition layout_json.h:37
Direction direction
Definition layout_json.h:39
auto operator==(PaneLayoutNode const &other) const -> bool=default
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< PaneLayoutNode >)
Definition layout_json.h:43
Definition layout_json.h:27
auto operator==(PaneLayoutVariant const &other) const -> bool
Definition layout_json.h:50
di::Variant< di::Box< PaneLayoutNode >, Pane > Base
Definition layout_json.h:28
Definition layout_json.h:11
auto operator==(Pane const &) const -> bool=default
di::Optional< di::PercentEncoded<> > current_working_directory
Definition layout_json.h:14
u64 id
Definition layout_json.h:13
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< Pane >)
Definition layout_json.h:18
i64 relative_size
Definition layout_json.h:12
Definition layout_json.h:79
di::Optional< u64 > active_tab_id
Definition layout_json.h:81
di::String name
Definition layout_json.h:82
auto operator==(Session const &) const -> bool=default
di::Vector< Tab > tabs
Definition layout_json.h:80
u64 id
Definition layout_json.h:83
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< Session >)
Definition layout_json.h:87
Definition layout_json.h:60
u64 id
Definition layout_json.h:66
di::Optional< u64 > full_screen_pane_id
Definition layout_json.h:64
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< Tab >)
Definition layout_json.h:70
di::Optional< u64 > active_pane_id
Definition layout_json.h:63
PaneLayoutNode pane_layout
Definition layout_json.h:61
di::String name
Definition layout_json.h:65
auto operator==(Tab const &) const -> bool=default
di::Vector< u64 > pane_ids_by_recency
Definition layout_json.h:62