Paste P148

Masterwork From Distant Lands
ActivePublic

Authored by dkazakov on Dec 28 2017, 9:57 PM.
diff --git a/libs/image/brushengine/kis_paintop_settings.cpp b/libs/image/brushengine/kis_paintop_settings.cpp
index 1ed78ea..0802ec4 100644
--- a/libs/image/brushengine/kis_paintop_settings.cpp
+++ b/libs/image/brushengine/kis_paintop_settings.cpp
@@ -468,6 +468,16 @@ void KisPaintOpSettings::setLodUserAllowed(KisPropertiesConfigurationSP config,
config->setProperty("lodUserAllowed", value);
}
+qreal KisPaintOpSettings::lodSizeThreshold() const
+{
+ return getDouble("lodSizeThreshold", 100.0);
+}
+
+void KisPaintOpSettings::setLodSizeThreshold(qreal value)
+{
+ setProperty("lodSizeThreshold", value);
+}
+
#include "kis_standard_uniform_properties_factory.h"
QList<KisUniformPaintOpPropertySP> KisPaintOpSettings::uniformProperties(KisPaintOpSettingsSP settings)
diff --git a/libs/image/brushengine/kis_paintop_settings.h b/libs/image/brushengine/kis_paintop_settings.h
index 6fd18c0..8d7d1e2 100644
--- a/libs/image/brushengine/kis_paintop_settings.h
+++ b/libs/image/brushengine/kis_paintop_settings.h
@@ -290,6 +290,9 @@ public:
static bool isLodUserAllowed(const KisPropertiesConfigurationSP config);
static void setLodUserAllowed(KisPropertiesConfigurationSP config, bool value);
+ qreal lodSizeThreshold() const;
+ void setLodSizeThreshold(qreal value);
+
/**
* @return the option widget of the paintop (can be 0 is no option widgets is set)
*/
diff --git a/libs/ui/KisViewManager.cpp b/libs/ui/KisViewManager.cpp
index 2b0b8ad..5035142 100644
--- a/libs/ui/KisViewManager.cpp
+++ b/libs/ui/KisViewManager.cpp
@@ -345,6 +345,7 @@ void KisViewManager::initializeResourceManager(KoCanvasResourceManager *resource
resourceManager->addDerivedResourceConverter(toQShared(new KisFlowResourceConverter));
resourceManager->addDerivedResourceConverter(toQShared(new KisSizeResourceConverter));
resourceManager->addDerivedResourceConverter(toQShared(new KisLodAvailabilityResourceConverter));
+ resourceManager->addDerivedResourceConverter(toQShared(new KisLodSizeThresholdResourceConverter));
resourceManager->addDerivedResourceConverter(toQShared(new KisEraserModeResourceConverter));
resourceManager->addResourceUpdateMediator(toQShared(new KisPresetUpdateMediator));
}
diff --git a/libs/ui/kis_canvas_resource_provider.h b/libs/ui/kis_canvas_resource_provider.h
index 6f394a5..7ceaa1f 100644
--- a/libs/ui/kis_canvas_resource_provider.h
+++ b/libs/ui/kis_canvas_resource_provider.h
@@ -61,6 +61,7 @@ public:
CurrentCompositeOp,
CurrentEffectiveCompositeOp,
LodAvailability, ///<-user choice
+ LodSizeThreshold, ///<-user choice
EraserMode,
MirrorHorizontal,
MirrorVertical,
@@ -76,7 +77,6 @@ public:
DisablePressure,
PreviousPaintOpPreset,
EffectiveZoom, ///<-Used only by painting tools for non-displaying purposes
- PresetAllowsLod, ///<-combination of the user choice and thechnical abilities of the preset
SelectionAction,
SelectionMode
};
diff --git a/libs/ui/kis_derived_resources.cpp b/libs/ui/kis_derived_resources.cpp
index fa2be17..9f76c35 100644
--- a/libs/ui/kis_derived_resources.cpp
+++ b/libs/ui/kis_derived_resources.cpp
@@ -213,6 +213,31 @@ QVariant KisLodAvailabilityResourceConverter::toSource(const QVariant &value, co
}
/*********************************************************************/
+/* KisLodSizeThresholdResourceConverter */
+/*********************************************************************/
+
+KisLodSizeThresholdResourceConverter::KisLodSizeThresholdResourceConverter()
+ : KoDerivedResourceConverter(KisCanvasResourceProvider::LodSizeThreshold,
+ KisCanvasResourceProvider::CurrentPaintOpPreset)
+{
+}
+
+QVariant KisLodSizeThresholdResourceConverter::fromSource(const QVariant &value)
+{
+ KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
+ return preset ? preset->settings()->lodSizeThreshold() : QVariant();
+}
+
+QVariant KisLodSizeThresholdResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
+{
+ KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
+ if (!preset) return sourceValue;
+
+ preset->settings()->setLodSizeThreshold(value.toDouble());
+ return QVariant::fromValue(preset);
+}
+
+/*********************************************************************/
/* KisEraserModeResourceConverter */
/*********************************************************************/
diff --git a/libs/ui/kis_derived_resources.h b/libs/ui/kis_derived_resources.h
index 14974ad..ec84270 100644
--- a/libs/ui/kis_derived_resources.h
+++ b/libs/ui/kis_derived_resources.h
@@ -93,6 +93,15 @@ public:
QVariant toSource(const QVariant &value, const QVariant &sourceValue) override;
};
+class KisLodSizeThresholdResourceConverter : public KoDerivedResourceConverter
+{
+public:
+ KisLodSizeThresholdResourceConverter();
+
+ QVariant fromSource(const QVariant &value) override;
+ QVariant toSource(const QVariant &value, const QVariant &sourceValue) override;
+};
+
class KisEraserModeResourceConverter : public KoDerivedResourceConverter
{
public:
diff --git a/libs/ui/tool/kis_resources_snapshot.cpp b/libs/ui/tool/kis_resources_snapshot.cpp
index 319f026..e2211b5 100644
--- a/libs/ui/tool/kis_resources_snapshot.cpp
+++ b/libs/ui/tool/kis_resources_snapshot.cpp
@@ -130,7 +130,15 @@ KisResourcesSnapshot::KisResourcesSnapshot(KisImageSP image, KisNodeSP currentNo
m_d->globalAlphaLock = resourceManager->resource(KisCanvasResourceProvider::GlobalAlphaLock).toBool();
m_d->effectiveZoom = resourceManager->resource(KisCanvasResourceProvider::EffectiveZoom).toDouble();
- m_d->presetAllowsLod = resourceManager->resource(KisCanvasResourceProvider::PresetAllowsLod).toBool();
+
+
+ m_d->presetAllowsLod = true;
+
+ if (m_d->currentPaintOpPreset) {
+ m_d->presetAllowsLod =
+ KisPaintOpSettings::isLodUserAllowed(m_d->currentPaintOpPreset->settings()) &&
+ m_d->currentPaintOpPreset->settings()->lodSizeThreshold() <= m_d->currentPaintOpPreset->settings()->paintOpSize();
+ }
}
KisResourcesSnapshot::KisResourcesSnapshot(KisImageSP image, KisNodeSP currentNode, KisDefaultBoundsBaseSP bounds)
diff --git a/libs/ui/widgets/kis_lod_availability_widget.cpp b/libs/ui/widgets/kis_lod_availability_widget.cpp
index 1efe61e..2512554 100644
--- a/libs/ui/widgets/kis_lod_availability_widget.cpp
+++ b/libs/ui/widgets/kis_lod_availability_widget.cpp
@@ -25,6 +25,11 @@
#include <kis_canvas_resource_provider.h>
+#include <kis_slider_spin_box.h>
+#include "kis_config.h"
+#include <QWidgetAction>
+#include <QMenu>
+
struct KisLodAvailabilityWidget::Private
{
@@ -32,9 +37,13 @@ struct KisLodAvailabilityWidget::Private
QCheckBox *chkLod;
QPushButton *btnLod;
+ QScopedPointer<QMenu> thresholdMenu;
+ KisDoubleSliderSpinBox *thresholdSlider = 0;
KoCanvasResourceManager *resourceManager;
- void updateLodStatus();
+ KisPaintopLodLimitations limitations;
+
+ bool sizeThresholdPassed();
};
KisLodAvailabilityWidget::KisLodAvailabilityWidget(QWidget *parent)
@@ -48,6 +57,30 @@ KisLodAvailabilityWidget::KisLodAvailabilityWidget(QWidget *parent)
connect(m_d->btnLod, SIGNAL(clicked()), SLOT(showLodToolTip()));
+ {
+ m_d->thresholdMenu.reset(new QMenu());
+ m_d->thresholdMenu->addSection(i18n("Enable after:"));
+
+ m_d->btnLod->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(m_d->btnLod, SIGNAL(customContextMenuRequested(QPoint)),
+ this, SLOT(showLodThresholdWidget(QPoint)));
+
+ KisConfig cfg;
+ m_d->thresholdSlider = new KisDoubleSliderSpinBox(m_d->thresholdMenu.data());
+
+ m_d->thresholdSlider->setRange(0, cfg.readEntry("maximumBrushSize", 1000), 2);
+ m_d->thresholdSlider->setValue(100);
+ m_d->thresholdSlider->setSingleStep(1);
+ m_d->thresholdSlider->setExponentRatio(3.0);
+ m_d->thresholdSlider->setSuffix(i18n(" px"));
+ m_d->thresholdSlider->setBlockUpdateSignalOnDrag(true);
+
+ QWidgetAction *sliderAction = new QWidgetAction(this);
+ sliderAction->setDefaultWidget(m_d->thresholdSlider);
+
+ m_d->thresholdMenu->addAction(sliderAction);
+ }
+
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(m_d->chkLod);
layout->addWidget(m_d->btnLod);
@@ -57,10 +90,10 @@ KisLodAvailabilityWidget::KisLodAvailabilityWidget(QWidget *parent)
setLayout(layout);
// set no limitations
- KisPaintopLodLimitations l;
- setLimitations(l);
+ setLimitations(m_d->limitations);
connect(m_d->chkLod, SIGNAL(toggled(bool)), SIGNAL(sigUserChangedLodAvailability(bool)));
+ connect(m_d->thresholdSlider, SIGNAL(valueChanged(qreal)), SIGNAL(sigUserChangedLodThreshold(qreal)));
}
KisLodAvailabilityWidget::~KisLodAvailabilityWidget()
@@ -72,6 +105,12 @@ void KisLodAvailabilityWidget::showLodToolTip()
QToolTip::showText(QCursor::pos(), m_d->btnLod->toolTip(), m_d->btnLod);
}
+void KisLodAvailabilityWidget::showLodThresholdWidget(const QPoint &pos)
+{
+ Q_UNUSED(pos);
+ m_d->thresholdMenu->popup(QCursor::pos());
+}
+
void KisLodAvailabilityWidget::setLimitations(const KisPaintopLodLimitations &l)
{
QString limitationsText;
@@ -90,44 +129,67 @@ void KisLodAvailabilityWidget::setLimitations(const KisPaintopLodLimitations &l)
bool isBlocked = !l.blockers.isEmpty();
bool isLimited = !l.limitations.isEmpty();
- QString text = !isBlocked && isLimited ? i18n("(Instant Preview)*") : i18n("Instant Preview");
+ bool isBlockedByThreshold = !m_d->sizeThresholdPassed();
+
+ const QString text = !isBlocked && !isBlockedByThreshold && isLimited ?
+ i18n("(Instant Preview)*") : i18n("Instant Preview");
QString toolTip;
if (isBlocked) {
- toolTip.append(i18nc("@info:tooltip",
- "<p>Instant Preview Mode is "
- "disabled by the following options:"
- "<ul>%1</ul></p>", blockersText));
+ toolTip = i18nc("@info:tooltip",
+ "<p>Instant Preview Mode is "
+ "disabled by the following options:"
+ "<ul>%1</ul></p>", blockersText);
+ } else if (isBlockedByThreshold) {
+ const qreal lodThreshold = m_d->resourceManager->resource(KisCanvasResourceProvider::LodSizeThreshold).toDouble();
+ const qreal size = m_d->resourceManager->resource(KisCanvasResourceProvider::Size).toDouble();
+
+ toolTip = i18nc("@info:tooltip",
+ "<p>Instant Preview Mode is "
+ "disabled by the instant preview threshold. "
+ "Please right-click here to change the threshold"
+ "<ul><li>Brush size %1</li>"
+ "<li>Threshold: %2</li></ul></p>",
+ size, lodThreshold);
} else if (isLimited) {
- toolTip.append(i18nc("@info:tooltip",
- "<p>Instant Preview may look different "
- "from the final result. In case of troubles "
- "try disabling the following options:"
- "<ul>%1</ul></p>", limitationsText));
+ toolTip = i18nc("@info:tooltip",
+ "<p>Instant Preview may look different "
+ "from the final result. In case of troubles "
+ "try disabling the following options:"
+ "<ul>%1</ul></p>", limitationsText);
} else {
toolTip = i18nc("@info:tooltip", "<p>Instant Preview Mode is available</p>");
}
{
QFont font;
- font.setStrikeOut(isBlocked);
+ font.setStrikeOut(isBlocked || isBlockedByThreshold);
m_d->chkLod->setEnabled(!isBlocked);
-
m_d->btnLod->setEnabled(!isBlocked);
m_d->btnLod->setFont(font);
m_d->btnLod->setText(text);
m_d->btnLod->setToolTip(toolTip);
}
- m_d->updateLodStatus();
+ m_d->limitations = l;
}
void KisLodAvailabilityWidget::slotUserChangedLodAvailability(bool value)
{
m_d->chkLod->setChecked(value);
- m_d->updateLodStatus();
+}
+
+void KisLodAvailabilityWidget::slotUserChangedLodThreshold(qreal value)
+{
+ m_d->thresholdSlider->setValue(value);
+ setLimitations(m_d->limitations);
+}
+
+void KisLodAvailabilityWidget::slotUserChangedSize(qreal value)
+{
+ setLimitations(m_d->limitations);
}
void KisLodAvailabilityWidget::setCanvasResourceManager(KoCanvasResourceManager *resourceManager)
@@ -135,10 +197,12 @@ void KisLodAvailabilityWidget::setCanvasResourceManager(KoCanvasResourceManager
m_d->resourceManager = resourceManager;
}
-void KisLodAvailabilityWidget::Private::updateLodStatus()
+bool KisLodAvailabilityWidget::Private::sizeThresholdPassed()
{
- if (!resourceManager) return;
+ if (!resourceManager) return true;
+
+ const qreal lodThreshold = resourceManager->resource(KisCanvasResourceProvider::LodSizeThreshold).toDouble();
+ const qreal size = resourceManager->resource(KisCanvasResourceProvider::Size).toDouble();
- bool value = chkLod->isChecked() && chkLod->isEnabled();
- resourceManager->setResource(KisCanvasResourceProvider::PresetAllowsLod, value);
+ return size >= lodThreshold;
}
diff --git a/libs/ui/widgets/kis_lod_availability_widget.h b/libs/ui/widgets/kis_lod_availability_widget.h
index 674539d..023fa08 100644
--- a/libs/ui/widgets/kis_lod_availability_widget.h
+++ b/libs/ui/widgets/kis_lod_availability_widget.h
@@ -41,12 +41,16 @@ public:
public Q_SLOTS:
void slotUserChangedLodAvailability(bool value);
+ void slotUserChangedLodThreshold(qreal value);
+ void slotUserChangedSize(qreal value);
Q_SIGNALS:
void sigUserChangedLodAvailability(bool value);
+ void sigUserChangedLodThreshold(qreal value);
private Q_SLOTS:
void showLodToolTip();
+ void showLodThresholdWidget(const QPoint &pos);
private:
struct Private;
diff --git a/libs/ui/widgets/kis_paintop_presets_popup.cpp b/libs/ui/widgets/kis_paintop_presets_popup.cpp
index bad0d1f..aa54ee5 100644
--- a/libs/ui/widgets/kis_paintop_presets_popup.cpp
+++ b/libs/ui/widgets/kis_paintop_presets_popup.cpp
@@ -305,10 +305,17 @@ KisPaintOpPresetsPopup::KisPaintOpPresetsPopup(KisCanvasResourceProvider * resou
SIGNAL(sigUserChangedLodAvailability(bool)),
SLOT(slotLodAvailabilityChanged(bool)));
+ connect(m_d->uiWdgPaintOpPresetSettings.wdgLodAvailability,
+ SIGNAL(sigUserChangedLodThreshold(qreal)),
+ SLOT(slotLodThresholdChanged(qreal)));
+
slotResourceChanged(KisCanvasResourceProvider::LodAvailability,
resourceProvider->resourceManager()->
resource(KisCanvasResourceProvider::LodAvailability));
+ slotResourceChanged(KisCanvasResourceProvider::LodSizeThreshold,
+ resourceProvider->resourceManager()->
+ resource(KisCanvasResourceProvider::LodSizeThreshold));
connect(m_d->uiWdgPaintOpPresetSettings.brushEgineComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdatePaintOpFilter()));
@@ -422,6 +429,10 @@ void KisPaintOpPresetsPopup::slotResourceChanged(int key, const QVariant &value)
{
if (key == KisCanvasResourceProvider::LodAvailability) {
m_d->uiWdgPaintOpPresetSettings.wdgLodAvailability->slotUserChangedLodAvailability(value.toBool());
+ } else if (key == KisCanvasResourceProvider::LodSizeThreshold) {
+ m_d->uiWdgPaintOpPresetSettings.wdgLodAvailability->slotUserChangedLodThreshold(value.toDouble());
+ } else if (key == KisCanvasResourceProvider::Size) {
+ m_d->uiWdgPaintOpPresetSettings.wdgLodAvailability->slotUserChangedSize(value.toDouble());
}
}
@@ -430,6 +441,11 @@ void KisPaintOpPresetsPopup::slotLodAvailabilityChanged(bool value)
m_d->resourceProvider->resourceManager()->setResource(KisCanvasResourceProvider::LodAvailability, QVariant(value));
}
+void KisPaintOpPresetsPopup::slotLodThresholdChanged(qreal value)
+{
+ m_d->resourceProvider->resourceManager()->setResource(KisCanvasResourceProvider::LodSizeThreshold, QVariant(value));
+}
+
KisPaintOpPresetsPopup::~KisPaintOpPresetsPopup()
{
if (m_d->settingsWidget) {
diff --git a/libs/ui/widgets/kis_paintop_presets_popup.h b/libs/ui/widgets/kis_paintop_presets_popup.h
index 8b22f5b..e9f951f 100644
--- a/libs/ui/widgets/kis_paintop_presets_popup.h
+++ b/libs/ui/widgets/kis_paintop_presets_popup.h
@@ -120,6 +120,7 @@ private Q_SLOTS:
void slotSwitchScratchpad(bool visible);
void slotResourceChanged(int key, const QVariant &value);
void slotLodAvailabilityChanged(bool value);
+ void slotLodThresholdChanged(qreal value);
void slotSwitchShowEditor(bool visible);
void slotUpdatePaintOpFilter();
void slotSwitchShowPresets(bool visible);
dkazakov edited the content of this paste. (Show Details)Dec 28 2017, 9:57 PM
dkazakov changed the title of this paste from untitled to Masterwork From Distant Lands.
dkazakov updated the paste's language from autodetect to autodetect.