7#ifndef __KIS_MULTINODE_PROPERTY_H
8#define __KIS_MULTINODE_PROPERTY_H
24#include "kritaui_export.h"
80 QRegExp rexp(
"^(.+) (\\d{1,3})$");
81 int pos = rexp.indexIn(name);
111 return qRound(node->
opacity() / 255.0 * 100);
135 return prop.
state.toBool();
144 bool stateChanged =
false;
147 KisBaseNode::PropertyList::iterator it = props.begin();
148 KisBaseNode::PropertyList::iterator end = props.end();
149 for (; it != end; ++it) {
167 QHash<QString, std::pair<KisBaseNode::Property, int>> adapters;
170 int sortingIndex = 0;
173 if (prop.
state.type() != QVariant::Bool)
continue;
175 if (!adapters.contains(prop.
id)) {
176 adapters.insert(prop.
id, std::make_pair(prop, sortingIndex));
178 adapters[prop.
id].second = qMin(adapters[prop.
id].second, sortingIndex);
184 QMultiMap<int, KisBaseNode::Property> sortedAdapters;
185 auto it = adapters.constBegin();
186 auto end = adapters.constEnd();
187 for (; it != end; ++it) {
189 int sortingIndex = 0;
190 std::tie(prop, sortingIndex) = it.value();
192 sortedAdapters.insert(sortingIndex, prop);
195 return sortedAdapters.values();
221 if (flags.isEmpty())
return true;
232 if (flags.isEmpty()) {
250 bool nodesDiffer = KisLayerUtils::checkNodesDiffer<const KoColorSpace*>(nodes, [](
KisNodeSP node) {
return node->
colorSpace(); });
273 filteredNodes << node;
276 return filteredNodes;
280 return qobject_cast<KisLayer*>(node.
data());
300 void connectValueChangedSignal(
const QObject *receiver,
const char *method, Qt::ConnectionType type = Qt::AutoConnection);
308 virtual void connectAutoEnableWidget(QWidget *widget);
320 virtual void notifyValueChanged();
333 void connectIgnoreCheckBox(QCheckBox *ignoreBox)
override;
334 void notifyIgnoreChanged()
override;
336 void connectAutoEnableWidget(QWidget *widget)
override;
339 void slotIgnoreCheckBoxChanged(
int state)
override;
350template <
class PropertyAdapter>
379 Qt::CheckState newState =
392 if (state == Qt::PartiallyChecked) {
409template <
class PropertyAdapter>
483template <
class PropertyAdapter>
491 :
m_nodes(PropertyAdapter::filterNodes(nodes)),
504 if (
value != lastValue) {
512 m_nodes.size() > 1 && PropertyAdapter::forceIgnoreByDefault ?
526 if (
value != lastValue) {
527 qWarning() <<
"WARNING: multiprops: values differ after reread!";
598 m_connector->connectValueChangedSignal(receiver, method, type);
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
virtual KUndo2Command * createPostExecutionUndoCommand()=0
virtual void setIgnored(bool value)=0
virtual void rereadCurrentValue()=0
virtual void connectValueChangedSignal(const QObject *receiver, const char *method, Qt::ConnectionType type=Qt::AutoConnection)=0
virtual bool savedValuesDiffer() const =0
virtual bool haveTheOnlyNode() const =0
virtual void connectIgnoreCheckBox(QCheckBox *ignoreBox)=0
virtual bool isIgnored() const =0
virtual void connectAutoEnableWidget(QWidget *widget)=0
PropertyAdapter::ConnectorType ConnectorType
KUndo2Command * createPostExecutionUndoCommand() override
bool savedValuesDiffer() const override
KisMultinodeProperty(KisNodeList nodes, PropertyAdapter adapter=PropertyAdapter())
QScopedPointer< MultinodePropertyConnectorInterface > m_connector
bool isIgnored() const override
void connectAutoEnableWidget(QWidget *widget) override
ValueType defaultValue() const
PropertyAdapter::ValueType ValueType
QList< ValueType > m_savedValues
void connectValueChangedSignal(const QObject *receiver, const char *method, Qt::ConnectionType type=Qt::AutoConnection) override
~KisMultinodeProperty() override
void setValue(const ValueType &value)
bool haveTheOnlyNode() const override
void connectIgnoreCheckBox(QCheckBox *ignoreBox) override
PropertyAdapter m_propAdapter
void rereadCurrentValue() override
void setIgnored(bool value) override
virtual quint32 channelCount() const =0
QPointer< QCheckBox > m_ignoreBox
KisMultinodePropertyInterface * m_parent
QPointer< QCheckBox > m_ignoreBox
void connectIgnoreCheckBox(QCheckBox *ignoreBox) override
KisMultinodeProperty< PropertyAdapter > PropertyType
void slotIgnoreCheckBoxChanged(int state) override
void notifyValueChanged() override
MultinodePropertyBoolConnector(PropertyType *parent)
void notifyIgnoreChanged() override
virtual void notifyValueChanged()
virtual void connectIgnoreCheckBox(QCheckBox *ignoreBox)=0
virtual void slotIgnoreCheckBoxChanged(int state)=0
virtual void notifyIgnoreChanged()=0
PropertyAdapter::ValueType ValueType
PropertyAdapter m_propAdapter
QList< ValueType > m_oldValues
MultinodePropertyUndoCommand(PropertyAdapter propAdapter, KisNodeList nodes, const QList< ValueType > &oldValues, ValueType newValue, KUndo2Command *parent=0)
#define KIS_ASSERT_RECOVER(cond)
KisMultinodeProperty< ColorLabelAdapter > KisMultinodeColorLabelProperty
KisMultinodeProperty< OpacityAdapter > KisMultinodeOpacityProperty
uint qHash(const KisBaseNode::Property &prop, uint seed=0)
KisMultinodeProperty< NameAdapter > KisMultinodeNameProperty
KisMultinodeProperty< CompositeOpAdapter > KisMultinodeCompositeOpProperty
QSharedPointer< KisMultinodePropertyInterface > KisMultinodePropertyInterfaceSP
static KisNodeList filterNodes(KisNodeList nodes)
void setNumNodes(int numNodes)
Property(QString _name, int _channelIndex)
MultinodePropertyBoolConnector< ChannelFlagAdapter > ConnectorType
ChannelFlagAdapter(const Property &prop)
static KisLayerSP toLayer(KisNodeSP node)
static KisNodeList filterNodes(KisNodeList nodes)
void setPropForNode(KisNodeSP node, const ValueType &value, int index)
static PropertyList adaptersList(KisNodeList nodes)
ValueType propForNode(KisNodeSP node)
QList< Property > PropertyList
static const bool forceIgnoreByDefault
static const bool forceIgnoreByDefault
static ValueType propForNode(KisNodeSP node)
MultinodePropertyBaseConnector ConnectorType
static void setPropForNode(KisNodeSP node, const ValueType &value, int index)
static ValueType propForNode(KisNodeSP node)
static const bool forceIgnoreByDefault
MultinodePropertyBaseConnector ConnectorType
static void setPropForNode(KisNodeSP node, const ValueType &value, int index)
const QString & compositeOpId() const
void setOpacity(quint8 val)
void setColorLabelIndex(int index)
void setName(const QString &name)
virtual const KoColorSpace * colorSpace() const =0
int colorLabelIndex() const
virtual PropertyList sectionModelProperties() const
void setCompositeOpId(const QString &compositeOpId)
virtual void setSectionModelProperties(const PropertyList &properties)
const KoColorSpace * colorSpace() const override
returns the image's colorSpace or null, if there is no image
virtual void setChannelFlags(const QBitArray &channelFlags)
LayerPropertyAdapter(const QString &propName)
ValueType propForNode(KisNodeSP node)
static KisBaseNode::PropertyList adaptersList(KisNodeList nodes)
void setPropForNode(KisNodeSP node, const ValueType &value, int index)
static const bool forceIgnoreByDefault
MultinodePropertyBoolConnector< LayerPropertyAdapter > ConnectorType
ValueType propForNode(KisNodeSP node)
void setPropForNode(KisNodeSP node, const ValueType &value, int index)
static const bool forceIgnoreByDefault
MultinodePropertyBaseConnector ConnectorType
static QString stripName(QString name)
static const bool forceIgnoreByDefault
static void setPropForNode(KisNodeSP node, const ValueType &value, int index)
MultinodePropertyBaseConnector ConnectorType
static ValueType propForNode(KisNodeSP node)