Krita Source Code Documentation
Loading...
Searching...
No Matches
KisPaintOpOptionWidgetUtils.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2022 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#ifndef KISPAINTOPOPTIONWIDGETUTILS_H
7#define KISPAINTOPOPTIONWIDGETUTILS_H
8
9#include <boost/tti/has_type.hpp>
10#include <boost/tti/has_member_function.hpp>
11#include <lager/state.hpp>
12#include <KisLager.h>
15
17{
18
19namespace detail {
20
21BOOST_TTI_HAS_TYPE(data_type)
22BOOST_TTI_HAS_MEMBER_FUNCTION(lodLimitations)
23
24template <typename Data, typename... Args>
26{
27 DataStorage(Data &&data) : m_data(std::forward<Data>(data)) {}
28 lager::state<std::remove_reference_t<Data>, lager::automatic_tag> m_data;
29};
30
31template <bool needsConversion, typename Widget, typename Data, typename... Args>
33
34template <typename Widget, typename Data, typename... Args>
35struct WidgetWrapperConversionChecker<false, Widget, Data, Args...> : public DataStorage<Data, Args...>, public Widget
36{
37 WidgetWrapperConversionChecker(Data &&data, Args... args)
38 : DataStorage<Data, Args...>(std::forward<Data>(data)),
39 Widget(DataStorage<Data, Args...>::m_data, std::forward<Args>(args)...)
40 {
41 }
42};
43
44template <typename Widget, typename Data, typename... Args>
45struct WidgetWrapperConversionChecker<true, Widget, Data, Args...> : public DataStorage<Data, Args...>, public Widget
46{
47 WidgetWrapperConversionChecker(Data &&data, Args... args)
48 : DataStorage<Data, Args...>(std::forward<Data>(data)),
49 Widget(DataStorage<Data, Args...>::m_data.zoom(kislager::lenses::to_base<typename Widget::data_type>), std::forward<Args>(args)...)
50 {
51 }
52};
53
54template <bool hasDataType, typename Widget, typename Data, typename... Args>
56
57template <typename Widget, typename Data, typename... Args>
58struct WidgetWrapperDataTypeChecker<false, Widget, Data, Args...> :
59 WidgetWrapperConversionChecker<false, Widget, Data, Args...>
60{
61 using BaseClass = WidgetWrapperConversionChecker<false, Widget, Data, Args...>;
62
63 // reuse c-tor from the base
64 using BaseClass::BaseClass;
65};
66
67template <typename Widget, typename Data, typename... Args>
68struct WidgetWrapperDataTypeChecker<true, Widget, Data, Args...> :
69 WidgetWrapperConversionChecker<!std::is_same_v<Data, typename Widget::data_type>, Widget, Data, Args...>
70{
71 using BaseClass =
73
74 // reuse c-tor from the base
75 using BaseClass::BaseClass;
76};
77
78template <typename Widget, typename Data, typename... Args>
81 has_type_data_type<Widget>::value, Widget, Data, Args...>
82{
84 has_type_data_type<Widget>::value, Widget, Data, Args...>;
85
86 // reuse c-tor from the base
87 using BaseClass::BaseClass;
88};
89
90template <typename Widget, typename Data, typename... Args>
91struct WidgetWrapperWithLodLimitations : WidgetWrapper<Widget, Data, Args...>
92{
93 using BaseClass = WidgetWrapper<Widget, Data, Args...>;
94
95 // reuse c-tor from the base
97
99 lodLimitationsReader() const override {
101 std::bit_or{},
102 BaseClass::lodLimitationsReader(),
104 this->m_data.map(std::mem_fn(&Data::lodLimitations))));
105 }
106};
107
108} // namespace detail
109
124template <typename Widget, typename Data, typename... Args>
125Widget* createOptionWidget(Data&& data, Args... args)
126{
127 return new detail::WidgetWrapper<Widget, Data, Args...>(std::forward<Data>(data), std::forward<Args>(args)...);
128}
129
136template <typename Widget, typename Data, typename... Args>
137Widget* createOptionWidgetWithLodLimitations(Data&& data, Args... args)
138{
139 static_assert(detail::has_member_function_lodLimitations<KisPaintopLodLimitations (Data::*)() const>::value, "Data must have Data::lodLomitations() member function defined to use a widget with lod limitations generation");
140 return new detail::WidgetWrapperWithLodLimitations<Widget, Data, Args...>(std::forward<Data>(data), std::forward<Args>(args)...);
141}
142
143
153template <typename Widget>
155{
156 static_assert(detail::has_type_data_type<Widget>::value, "Widget must have 'data_type' member type defined to use the default construction method");
157 return createOptionWidget<Widget>(typename Widget::data_type{});
158}
159
173template <typename Widget>
175{
176 static_assert(detail::has_type_data_type<Widget>::value, "Widget must have 'data_type' member type defined to use the default construction method");
177 return createOptionWidgetWithLodLimitations<Widget>(typename Widget::data_type{});
178}
179
180
193template <typename Data, typename... Args>
195{
196 return createOptionWidget<KisCurveOptionWidget>(std::forward<Data>(data), std::forward<Args>(args)...);
197}
198
199}
200
201#endif // KISPAINTOPOPTIONWIDGETUTILS_H
float value(const T *src, size_t ch)
std::optional< lager::reader< KisPaintopLodLimitations > > OptionalLodLimitationsReader
KisCurveOptionWidget * createCurveOptionWidget(Data &&data, Args... args)
std::optional< lager::reader< T > > fold_optional_cursors(const Func &func, Cursors &&...cursors)
Definition KisLager.h:37
lager::state< std::remove_reference_t< Data >, lager::automatic_tag > m_data
KisPaintOpOption::OptionalLodLimitationsReader lodLimitationsReader() const override