File indexing completed on 2024-06-16 04:17:17

0001 /*
0002  *  SPDX-FileCopyrightText: 2022 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #include "KisSmudgeOverlayModeOptionWidget.h"
0007 
0008 #include <QWidget>
0009 #include <QLabel>
0010 #include <QCheckBox>
0011 #include <QHBoxLayout>
0012 #include <QVBoxLayout>
0013 
0014 #include <kis_paintop_lod_limitations.h>
0015 #include <KisSmudgeOverlayModeOptionModel.h>
0016 #include <KisWidgetConnectionUtils.h>
0017 
0018 struct KisSmudgeOverlayModeOptionWidget::Private
0019 {
0020     Private(lager::cursor<KisSmudgeOverlayModeOptionData> optionData,
0021             lager::reader<bool> overlayModeAllowed)
0022         : model(optionData, overlayModeAllowed)
0023         , warningLabelVisible{overlayModeAllowed.map(std::logical_not{})}
0024         , lodLimitations(optionData.map(std::mem_fn(&KisSmudgeOverlayModeOptionData::lodLimitations)))
0025     {
0026     }
0027 
0028     KisSmudgeOverlayModeOptionModel model;
0029     lager::reader<bool> warningLabelVisible;
0030     lager::reader<KisPaintopLodLimitations> lodLimitations;
0031 };
0032 
0033 
0034 KisSmudgeOverlayModeOptionWidget::KisSmudgeOverlayModeOptionWidget(lager::cursor<KisSmudgeOverlayModeOptionData> optionData,
0035                                                                    lager::reader<bool> overlayModeAllowed)
0036     : KisPaintOpOption(i18n("Overlay Mode"),
0037                        KisPaintOpOption::GENERAL,
0038                        optionData[&KisSmudgeOverlayModeOptionData::isChecked],
0039                        overlayModeAllowed)
0040     , m_d(new Private(optionData, overlayModeAllowed))
0041 {
0042     using namespace KisWidgetConnectionUtils;
0043 
0044     QWidget *page = new QWidget();
0045 
0046     QLabel *label = new QLabel(
0047         i18n("Paints on the current layer\n"
0048              "but uses all layers that are currently visible for smudge input\n"
0049              "NOTE: This mode is only able to work correctly with a fully opaque background"),
0050         page);
0051 
0052     label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
0053 
0054 
0055     QLabel *disabledWarningLabel = new QLabel(
0056         i18n("Disabled: overlay mode is not supported in Lightness mode of the brush"),
0057         page);
0058 
0059     disabledWarningLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
0060 
0061 
0062     QVBoxLayout *layout = new QVBoxLayout(page);
0063     layout->addWidget(disabledWarningLabel);
0064     layout->addWidget(label, 1);
0065 
0066     m_d->warningLabelVisible.bind(std::bind(&QWidget::setVisible, disabledWarningLabel, std::placeholders::_1));
0067 
0068     setConfigurationPage(page);
0069 
0070     m_d->model.optionData.bind(std::bind(&KisSmudgeOverlayModeOptionWidget::emitSettingChanged, this));
0071 }
0072 
0073 KisSmudgeOverlayModeOptionWidget::~KisSmudgeOverlayModeOptionWidget()
0074 {
0075 }
0076 
0077 void KisSmudgeOverlayModeOptionWidget::writeOptionSetting(KisPropertiesConfigurationSP setting) const
0078 {
0079     m_d->model.bakedOptionData().write(setting.data());
0080 }
0081 
0082 void KisSmudgeOverlayModeOptionWidget::readOptionSetting(const KisPropertiesConfigurationSP setting)
0083 {
0084     KisSmudgeOverlayModeOptionData data = *m_d->model.optionData;
0085     data.read(setting.data());
0086     m_d->model.optionData.set(data);
0087 
0088 }
0089 
0090 KisPaintOpOption::OptionalLodLimitationsReader KisSmudgeOverlayModeOptionWidget::lodLimitationsReader() const
0091 {
0092     return m_d->lodLimitations;
0093 }