File indexing completed on 2024-06-23 04:27:49

0001 /*
0002  *  SPDX-FileCopyrightText: 2022 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #ifndef KisCurveOptionWidget_H
0007 #define KisCurveOptionWidget_H
0008 
0009 #include <kis_paintop_option.h>
0010 
0011 class Ui_WdgCurveOption2;
0012 class KisCurveOption;
0013 class QComboBox;
0014 
0015 #include <KisCurveOptionData.h>
0016 #include <KisCurveRangeModelInterface.h>
0017 #include <KisCurveOptionInputControlsStrategyInterface.h>
0018 #include <KisCurveOptionRangeControlsStrategyInterface.h>
0019 #include <lager/cursor.hpp>
0020 #include <lager/constant.hpp>
0021 
0022 
0023 class PAINTOP_EXPORT KisCurveOptionWidget : public KisPaintOpOption
0024 {
0025     Q_OBJECT
0026 public:
0027     enum Flag {
0028         None = 0x0,
0029         SupportsCommonCurve = 0x1,
0030         SupportsCurveMode = 0x2,
0031         UseFloatingPointStrength = 0x4,
0032     };
0033 
0034     Q_DECLARE_FLAGS(Flags, Flag)
0035 
0036 public:
0037     using data_type = KisCurveOptionDataCommon;
0038 
0039     KisCurveOptionWidget(lager::cursor<KisCurveOptionDataCommon> optionData,
0040                           KisPaintOpOption::PaintopCategory category,
0041                           lager::reader<bool> enabledLink = lager::make_constant(true),
0042                           std::optional<lager::reader<std::tuple<qreal, qreal>>> strengthRangeReader = std::nullopt);
0043 
0044     KisCurveOptionWidget(lager::cursor<KisCurveOptionDataCommon> optionData,
0045                           KisPaintOpOption::PaintopCategory category,
0046                           const QString &curveMinLabel, const QString &curveMaxLabel,
0047                           lager::reader<bool> enabledLink = lager::make_constant(true),
0048                           std::optional<lager::reader<std::tuple<qreal, qreal>>> strengthRangeReader = std::nullopt);
0049 
0050     KisCurveOptionWidget(lager::cursor<KisCurveOptionDataCommon> optionData,
0051                           KisPaintOpOption::PaintopCategory category,
0052                           const QString &curveMinLabel, const QString &curveMaxLabel,
0053                           int curveMinValue, int curveMaxValue, const QString &curveValueSuffix,
0054                           lager::reader<bool> enabledLink = lager::make_constant(true),
0055                           std::optional<lager::reader<std::tuple<qreal, qreal>>> strengthRangeReader = std::nullopt);
0056 
0057     KisCurveOptionWidget(lager::cursor<KisCurveOptionDataCommon> optionData,
0058                           PaintopCategory category,
0059                           const QString &curveMinLabel, const QString &curveMaxLabel,
0060                           int curveMinValue, int curveMaxValue, const QString &curveValueSuffix,
0061                           const QString &strengthPrefix, const QString &strengthSuffix,
0062                           qreal strengthDisplayMultiplier,
0063                           lager::reader<bool> enabledLink = lager::make_constant(true),
0064                           std::optional<lager::reader<std::tuple<qreal, qreal>>> strengthRangeReader = std::nullopt);
0065 
0066 protected:
0067     KisCurveOptionWidget(lager::cursor<KisCurveOptionDataCommon> optionData,
0068                           KisPaintOpOption::PaintopCategory category,
0069                           const QString &strengthPrefix, const QString &strengthSuffix,
0070                           qreal strengthDisplayMultiplier,
0071                           lager::reader<bool> enabledLink,
0072                           std::optional<lager::reader<std::tuple<qreal, qreal>>> strengthRangeReader,
0073                           KisCurveRangeModelFactory curveRangeModelFactory,
0074                           KisCurveOptionInputControlsStrategyFactory inputControlsFactory,
0075                           KisCurveOptionRangeControlsStrategyFactory rangeControlsFactory,
0076                           Flags flags);
0077 public:
0078 
0079     ~KisCurveOptionWidget() override;
0080 
0081     void writeOptionSetting(KisPropertiesConfigurationSP setting) const override;
0082     void readOptionSetting(const KisPropertiesConfigurationSP setting) override;
0083 
0084     bool isCheckable() const override;
0085     void show();
0086 
0087 protected:
0088     lager::cursor<qreal> strengthValueDenorm();
0089 
0090     void setCurveWidgetsEnabled(bool value);
0091     QWidget* curveWidget();
0092 
0093 protected Q_SLOTS:
0094     void updateThemedIcons();
0095 
0096 
0097     // curve shape preset buttons
0098     void changeCurveLinear();
0099     void changeCurveReverseLinear();
0100     void changeCurveSShape();
0101     void changeCurveReverseSShape();
0102     void changeCurveJShape();
0103     void changeCurveLShape();
0104     void changeCurveUShape();
0105     void changeCurveArchShape();
0106 
0107 
0108 protected:
0109     QWidget* m_widget {nullptr};
0110     Ui_WdgCurveOption2* m_curveOptionWidget {nullptr};
0111     QScopedPointer<KisCurveOptionInputControlsStrategyInterface> m_curveInputControlsStrategy;
0112     QScopedPointer<KisCurveOptionRangeControlsStrategyInterface> m_curveRangeControlsStrategy;
0113     QComboBox* m_curveMode {nullptr};
0114     struct Private;
0115     const QScopedPointer<Private> m_d;
0116 };
0117 
0118 Q_DECLARE_OPERATORS_FOR_FLAGS(KisCurveOptionWidget::Flags)
0119 
0120 #endif // KisCurveOptionWidget_H