Loading...
Searching...
No Matches
plugins/score-lib-process/Control/Layout.hpp
1#pragma once
2#include <Process/Dataflow/PortFactory.hpp>
3#include <Process/LayerPresenter.hpp>
4#include <Process/LayerView.hpp>
5
6#include <score/graphics/GraphicsLayout.hpp>
7#include <score/graphics/TextItem.hpp>
8#include <score/model/Skin.hpp>
9
10#include <span>
11
12namespace Process
13{
14
15struct SCORE_LIB_PROCESS_EXPORT LayoutBuilderBase
16{
17 QObject& context;
18 const Process::ProcessModel& proc;
19 const Process::Context& doc;
20 const Process::PortFactoryList& portFactory;
21
22 const Process::Inlets& inlets;
23 const Process::Outlets& outlets;
24
25 QGraphicsItem* layout{}; // The current container
26 std::vector<score::GraphicsLayout*> createdLayouts{};
27
30 bool marginOnNestedLayouts{true};
31
33 makePort(Process::Inlet& portModel, const Process::ControlPresentation& = {});
35 makePort(Process::Outlet& portModel, const Process::ControlPresentation& = {});
36
37 std::pair<Process::ControlInlet*, Process::ControlLayout>
38 makeInlet(Process::Inlet*, const Process::ControlPresentation& = {});
39 std::pair<Process::ControlOutlet*, Process::ControlLayout>
40 makeOutlet(Process::Outlet*, const Process::ControlPresentation& = {});
41 std::vector<std::pair<Process::ControlInlet*, Process::ControlLayout>>
42 makeInlets(std::span<Process::Inlet*>);
43 std::vector<std::pair<Process::ControlOutlet*, Process::ControlLayout>>
44 makeOutlets(std::span<Process::Outlet*>);
45 QGraphicsItem* makeLabel(std::string_view item);
46
47 void finalizeLayout(QGraphicsItem* rootItem);
48
52 template <typename T>
54 {
55 auto& skin = score::Skin::instance();
56#define SCORE_MAP_LAYOUT_COLOR(Name, Brush) \
57 if constexpr(requires { T::Name; }) \
58 if(cur == T::Name) \
59 return Brush;
60
61 SCORE_MAP_LAYOUT_COLOR(darker, skin.Gray.darker300)
62 SCORE_MAP_LAYOUT_COLOR(dark, skin.Gray.darker)
63 SCORE_MAP_LAYOUT_COLOR(mid, skin.Gray.main)
64 SCORE_MAP_LAYOUT_COLOR(light, skin.Gray.lighter)
65 SCORE_MAP_LAYOUT_COLOR(lighter, skin.Gray.lighter180)
66
67 SCORE_MAP_LAYOUT_COLOR(background_darker, skin.Background2.darker300)
68 SCORE_MAP_LAYOUT_COLOR(background_dark, skin.Background2.darker)
69 SCORE_MAP_LAYOUT_COLOR(background_mid, skin.Background2.main)
70 SCORE_MAP_LAYOUT_COLOR(background_light, skin.Background2.lighter)
71 SCORE_MAP_LAYOUT_COLOR(background_lighter, skin.Background2.lighter180)
72
73 // Base4 is what a slider fills its handle with, Base1 what it draws the
74 // value the execution sends back with.
75 SCORE_MAP_LAYOUT_COLOR(editable_value_dark, skin.Base4.darker)
76 SCORE_MAP_LAYOUT_COLOR(editable_value_mid, skin.Base4.main)
77 SCORE_MAP_LAYOUT_COLOR(editable_value_light, skin.Base4.lighter180)
78
79 SCORE_MAP_LAYOUT_COLOR(runtime_value_dark, skin.Base1.darker)
80 SCORE_MAP_LAYOUT_COLOR(runtime_value_mid, skin.Base1.main)
81 SCORE_MAP_LAYOUT_COLOR(runtime_value_light, skin.Base1.lighter180)
82#undef SCORE_MAP_LAYOUT_COLOR
83
84 return skin.Background2.main;
85 }
86
88 template <typename T>
89 static Qt::Alignment get_alignment(T cur) noexcept
90 {
91 if constexpr(requires { T::left; })
92 if(cur == T::left)
93 return Qt::AlignLeft;
94 if constexpr(requires { T::center; })
95 if(cur == T::center)
96 return Qt::AlignHCenter;
97 if constexpr(requires { T::right; })
98 if(cur == T::right)
99 return Qt::AlignRight;
100 return {};
101 }
102
103 template <typename Item>
104 void setupLayout(const Item& it, score::GraphicsLayout& item)
105 {
106 if constexpr(requires { Item::padding(); })
107 item.setPadding(Item::padding());
108 if constexpr(requires { Item::spacing(); })
109 item.setSpacing(Item::spacing());
110 if constexpr(requires { Item::alignment(); })
111 item.setAlignment(get_alignment(Item::alignment()));
112
113 if constexpr(requires { Item::background(); })
114 {
115 if constexpr(requires { std::string_view{Item::background()}; })
116 item.setBackground(Item::background());
117 else
118 item.setBrush(get_brush(Item::background()));
119 }
120
121 if constexpr(
122 requires { Item::width(); } && requires { Item::height(); })
123 {
124 item.setRect({0., 0., (qreal)Item::width(), (qreal)Item::height()});
125 }
126 else if constexpr(
127 requires { Item::width; } && requires { Item::height; })
128 {
129 item.setRect({0., 0., (qreal)it.width, (qreal)it.height});
130 }
131 }
132
133 template <typename Item>
134 void setupItem(const Item& it, QGraphicsItem& item)
135 {
136 item.setParentItem(layout);
137 if constexpr(
138 requires { Item::x(); } && requires { Item::y(); })
139 {
140 item.setPos(Item::x(), Item::y());
141 }
142 else if constexpr(
143 requires { Item::x; } && requires { Item::y; })
144 {
145 item.setPos(it.x, it.y);
146 }
147
148 if constexpr(requires { Item::scale(); })
149 {
150 item.setScale(Item::scale());
151 }
152 else if constexpr(requires { Item::scale; })
153 {
154 item.setScale(it.scale);
155 }
156 }
157};
158
159}
Definition Port.hpp:221
Definition Port.hpp:329
Definition PortFactory.hpp:121
The Process class.
Definition score-lib-process/Process/Process.hpp:82
Definition GraphicsLayout.hpp:8
void setSpacing(qreal s)
Gap between box layout children. Default: 2 * padding.
Definition GraphicsLayout.cpp:50
void setAlignment(Qt::Alignment a)
Definition GraphicsLayout.cpp:60
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
Definition ProcessContext.hpp:12
Definition PortFactory.hpp:54
Overrides of a control's default presentation in a layout.
Definition PortFactory.hpp:25
Definition PortForward.hpp:23
Definition plugins/score-lib-process/Control/Layout.hpp:16
static Qt::Alignment get_alignment(T cur) noexcept
Any enum with left, center and right, like halp::alignments.
Definition plugins/score-lib-process/Control/Layout.hpp:89
score::BrushSet & get_brush(T cur)
Definition plugins/score-lib-process/Control/Layout.hpp:53
Definition PortForward.hpp:27
Definition Skin.hpp:25