32 template <
typename HtmlElem>
38 std::vector<std::function<std::shared_ptr<Dom::Element>(
Dom::Element&,
Renderer const&)>> children);
43 HtmlElem htmlElement_;
44 std::vector<std::function<std::shared_ptr<Dom::Element>(
Dom::Element&,
Renderer const&)>> children_;
46 template <
typename HtmlElem>
54 HtmlElem htmlElement_;
78 template <
typename... T>
87 return {name_, bridge_, attributes_};
91 template <
typename... ObservedValues, std::invocable GeneratorT>
94 return [self = this->
clone(),
95 observedValues = std::move(observedValues),
97 std::forward<GeneratorT>(elementRenderer)](
auto& parentElement,
Renderer const& gen) {
98 using ElementType = std::decay_t<
decltype(parentElement)>;
101 auto childrenRefabricator = std::make_shared<std::function<void()>>();
103 auto&& createdSelf =
renderElement(gen, parentElement, self);
107 *childrenRefabricator = [observedValues,
110 createdSelfWeak = std::weak_ptr<ElementType>(createdSelf),
111 childrenRefabricator]()
mutable {
112 fragmentContext.clear();
114 auto parent = createdSelfWeak.lock();
115 if (!parent || observedValues.isAnyExpired())
117 childrenRefabricator.reset();
124 if constexpr ((std::is_same_v<
decltype(elementRenderer()), std::string>))
125 parent->setTextContent(elementRenderer());
132 *childrenRefabricator = [observedValues,
134 createdSelfWeak = std::weak_ptr<ElementType>(createdSelf),
135 childrenRefabricator]()
mutable {
136 auto parent = createdSelfWeak.lock();
137 if (!parent || observedValues.isAnyExpired())
139 childrenRefabricator.reset();
144 parent->clearChildren();
149 if constexpr ((std::is_same_v<
decltype(elementRenderer()), std::string>))
150 parent->setTextContent(elementRenderer());
156 (*childrenRefabricator)();
161 template <
typename RangeType,
typename GeneratorT>
163 auto rangeRender(RangeType&& valueRange, GeneratorT&& elementRenderer) &&
165 return [self = this->
clone(),
166 rangeRenderer = std::make_shared<
168 std::forward<RangeType>(valueRange).underlying(), std::forward<GeneratorT>(elementRenderer))](
169 auto& parentElement, Renderer
const& gen)
mutable {
171 throw std::runtime_error(
"fragments are not supported for range generators");
173 auto&& materialized =
renderElement(gen, parentElement, self);
174 (*rangeRenderer)(materialized);
181 template <
typename... ElementT>
182 requires requires(ElementT&&... elements) {
183 std::vector<std::function<std::shared_ptr<Dom::Element>(Dom::Element&, Renderer
const&)>>{
184 std::forward<ElementT>(elements)...};
192 std::forward<ElementT>(elements)...}}};
219 template <
typename T>
220 requires std::same_as<std::decay_t<T>, std::string>
223 return [self = this->
clone(), text = std::forward<T>(text)](
auto& parentElement,
Renderer const& gen) {
225 materialized->setTextContent(text);
231 return [self = this->
clone(), view](
auto& parentElement,
Renderer const& gen) {
233 materialized->setTextContent(view);
239 return [self = this->
clone(), text](
auto& parentElement,
Renderer const& gen) {
241 materialized->setTextContent(text);
245 template <
typename T>
249 return [self = this->
clone(), fundamental](
auto& parentElement,
Renderer const& gen) {
251 materialized->setTextContent(std::to_string(fundamental));
257 template <
typename GeneratorT>
261 return [self = this->
clone(),
262 textGenerator = std::forward<GeneratorT>(textGenerator)](
auto& parentElement,
Renderer const& gen) {
264 materialized->setTextContent(textGenerator());
268 template <std::invocable GeneratorT>
270 auto operator()(GeneratorT&& elementRenderer) &&
272 return [self = this->
clone(), elementRenderer = std::forward<GeneratorT>(elementRenderer)](
273 auto& parentElement,
Renderer const& gen) {
279 template <
typename T, std::invocable<T&, Renderer const&> GeneratorT>
283 return [self = this->
clone(), elementRenderer = std::forward<GeneratorT>(elementRenderer)](
284 auto& parentElement,
Renderer const& gen) {
292 template <
typename... ObservedValues, std::invocable GeneratorT>
295 return std::move(*this).operator()(std::move(combinator).split(), std::move(combinator).generator());
297 template <
typename... ObservedValues, std::invocable GeneratorT>
300 return std::move(*this).reactiveRender(
301 std::move(observedValues), std::forward<GeneratorT>(elementRenderer));
305 template <
typename ObservedValue,
typename GeneratorT>
308 return std::move(*this).rangeRender(std::move(observedRange), std::forward<GeneratorT>(elementRenderer));
310 template <
typename ObservedValue,
typename GeneratorT>
313 return std::move(*this).rangeRender(std::move(mapPair.first), std::move(mapPair.second));
315 template <
typename IteratorT,
typename GeneratorT,
typename... ObservedT>
319 return [self = this->
clone(),
322 std::move(unoptimizedRange), std::forward<GeneratorT>(elementRenderer))](
323 auto& parentElement,
Renderer const& gen) {
325 throw std::runtime_error(
"fragments are not supported for range generators");
327 auto&& materialized =
renderElement(gen, parentElement, self);
328 (*rangeRenderer)(materialized);
336 return std::move(*this).operator()(
observe(observedString), [&observedString]() -> std::string {
337 return observedString.value();
340 template <
typename T>
344 return std::move(*this).operator()(
observe(observedNumber), [&observedNumber]() -> std::string {
345 return std::to_string(observedNumber.value());
367 std::vector<Attribute> attributes_;
Definition fragment_context.hpp:10
Definition range_renderer.hpp:19
Definition element.hpp:42
Definition html_element.hpp:58
HtmlElement & operator=(HtmlElement &&)=default
HtmlElement clone() const
Definition html_element.hpp:85
HtmlElement(char const *name, HtmlElementBridge const *bridge, std::vector< Attribute > const &attributes)
Definition html_element.hpp:68
auto operator()(GeneratorT &&textGenerator) &&
Definition html_element.hpp:259
std::vector< Attribute > const & attributes() const
Definition html_element.hpp:349
auto operator()(std::pair< ObservedRange< ObservedValue >, GeneratorT > &&mapPair) &&
Definition html_element.hpp:311
HtmlElementBridge const * bridge() const
Definition html_element.hpp:359
HtmlElement(HtmlElement &&)=default
auto operator()(Observed< T > const &observedNumber) &&
Definition html_element.hpp:342
friend class DomElement
Definition html_element.hpp:60
auto operator()(GeneratorT &&elementRenderer) &&
Definition html_element.hpp:281
auto operator()(std::string_view view) const &&
Definition html_element.hpp:229
auto operator()(ObservedValueCombinatorWithGenerator< GeneratorT, ObservedValues... > combinator) &&
Definition html_element.hpp:293
HtmlElement & operator=(HtmlElement const &)=default
HtmlElement(char const *name, HtmlElementBridge const *bridge, T &&... attributes)
Definition html_element.hpp:79
auto operator()(Observed< std::string > const &observedString) &&
Definition html_element.hpp:334
auto operator()(T fundamental) &&
Definition html_element.hpp:247
HtmlElement(char const *name, HtmlElementBridge const *bridge, std::vector< Attribute > &&attributes)
Definition html_element.hpp:73
virtual ~HtmlElement()=default
auto operator()() const &&
Definition html_element.hpp:207
auto operator()(char const *text) const &&
Definition html_element.hpp:237
auto operator()(ElementT &&... elements) &&
Definition html_element.hpp:186
auto operator()(T &&text) &&
Definition html_element.hpp:221
HtmlElement(HtmlElement const &)=default
auto operator()(ObservedValueCombinator< ObservedValues... > observedValues, GeneratorT &&elementRenderer) &&
Definition html_element.hpp:298
auto operator()(UnoptimizedRange< IteratorT, ObservedT... > &&unoptimizedRange, GeneratorT &&elementRenderer) &&
Definition html_element.hpp:317
auto operator()(ObservedRange< ObservedValue > observedRange, GeneratorT &&elementRenderer) &&
Definition html_element.hpp:306
char const * name() const
Definition html_element.hpp:354
Definition observed_value_combinator.hpp:108
Definition observed_value_combinator.hpp:159
Definition observed_value.hpp:1283
Definition concepts.hpp:11
Definition concepts.hpp:32
void makeChildrenUpdateEvent(auto &observedValues, auto &childrenRefabricator, auto &createdSelfWeak)
Definition make_children_update_event.hpp:7
static constexpr auto extractJsonMember(nlohmann::json const &json) -> decltype(auto)
Definition rpc_hub.hpp:29
Definition file_dialog.hpp:6
auto renderElement(Renderer const &gen, auto &element, auto const &htmlElement)
Definition materialize.hpp:61
ObservedValueCombinator< std::decay_t< Detail::ObservedAddReference_t< ObservedValues > >... > observe(ObservedValues &&... observedValues)
Definition observed_value_combinator.hpp:192
Definition html_element.hpp:34
ChildrenRenderer(HtmlElem htmlElement, std::vector< std::function< std::shared_ptr< Dom::Element >(Dom::Element &, Renderer const &)> > children)
std::shared_ptr< Dom::Element > operator()(Dom::Element &parentElement, Renderer const &gen) const
Definition html_element_bridge.hpp:14
Definition materialize.hpp:57
RendererType type
Definition materialize.hpp:58
Definition html_element.hpp:48
std::shared_ptr< Dom::Element > operator()(Dom::Element &parentElement, Renderer const &gen) const
TrivialRenderer(HtmlElem htmlElement)