Krita Source Code Documentation
Loading...
Searching...
No Matches
ChannelModel Class Reference

#include <channelmodel.h>

+ Inheritance diagram for ChannelModel:

Public Slots

void rowActivated (const QModelIndex &index)
 
void slotColorSpaceChanged (const KoColorSpace *colorSpace)
 

Signals

void channelFlagsChanged ()
 

Public Member Functions

 ChannelModel (QObject *parent=0)
 
int columnCount (const QModelIndex &parent=QModelIndex()) const override
 
QVariant data (const QModelIndex &index, int role=Qt::DisplayRole) const override
 
Qt::ItemFlags flags (const QModelIndex &index) const override
 
QVariant headerData (int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
 
int rowCount (const QModelIndex &parent=QModelIndex()) const override
 
void setCanvas (KisCanvas2 *canvas)
 
void setChannelThumbnails (const QVector< QImage > &channels, const KoColorSpace *cs)
 
bool setData (const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
 
void setThumbnailSizeLimit (QSize size)
 
QSize thumbnailSizeLimit () const
 
 ~ChannelModel () override
 

Private Member Functions

void emitAllDataChanged (int bottomRow, int rightColumn)
 

Private Attributes

QPointer< KisCanvas2m_canvas
 
KisSignalAutoConnectionsStore m_canvasConnections
 
int m_channelCount
 
QVector< QImage > m_thumbnails
 
QSize m_thumbnailSizeLimit
 

Detailed Description

Definition at line 21 of file channelmodel.h.

Constructor & Destructor Documentation

◆ ChannelModel()

ChannelModel::ChannelModel ( QObject * parent = 0)

Definition at line 22 of file channelmodel.cpp.

22 :
23 QAbstractTableModel(parent),
24 m_canvas(nullptr),
26{
27 setThumbnailSizeLimit(QSize(64, 64));
28}
QPointer< KisCanvas2 > m_canvas
void setThumbnailSizeLimit(QSize size)

References setThumbnailSizeLimit().

◆ ~ChannelModel()

ChannelModel::~ChannelModel ( )
override

Definition at line 30 of file channelmodel.cpp.

31{
32}

Member Function Documentation

◆ channelFlagsChanged

void ChannelModel::channelFlagsChanged ( )
signal

◆ columnCount()

int ChannelModel::columnCount ( const QModelIndex & parent = QModelIndex()) const
override

Definition at line 92 of file channelmodel.cpp.

93{
94 if (!m_canvas) return 0;
95
96 //columns are: checkbox, thumbnail, channel name
97 return 3;
98}

References m_canvas.

◆ data()

QVariant ChannelModel::data ( const QModelIndex & index,
int role = Qt::DisplayRole ) const
override

Definition at line 34 of file channelmodel.cpp.

35{
36 if (m_canvas && m_canvas->image() && index.isValid()) {
37 KisGroupLayerSP rootLayer = m_canvas->image()->rootLayer();
38 const KoColorSpace *cs = rootLayer->colorSpace();
39 if (cs->channelCount() != m_channelCount) return QVariant();
40
41 const QList<KoChannelInfo*> channels = cs->channels();
42
43 int channelIndex = index.row();
44
45 if (index.row() < cs->channelCount()) {
46
47 switch (role) {
48 case Qt::DisplayRole: {
49 if (index.column() == 2) {
50 return channels.at(channelIndex)->name();
51 }
52 return QVariant();
53 }
54 case Qt::DecorationRole: {
55 if (index.column() == 1 &&
56 !m_thumbnails.isEmpty() &&
57 index.row() < m_thumbnails.size()) {
58
59 return QVariant(m_thumbnails.at(index.row()));
60 }
61 return QVariant();
62 }
63 case Qt::CheckStateRole: {
64 Q_ASSERT(index.row() < rowCount());
65 Q_ASSERT(index.column() < columnCount());
66
67 if (index.column() == 0) {
68 QBitArray flags = rootLayer->channelFlags();
69 return (flags.isEmpty() || flags.testBit(channelIndex)) ? Qt::Checked : Qt::Unchecked;
70 }
71 return QVariant();
72 }
73 }
74 }
75 }
76 return QVariant();
77}
QVector< QImage > m_thumbnails
int columnCount(const QModelIndex &parent=QModelIndex()) const override
Qt::ItemFlags flags(const QModelIndex &index) const override
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QList< KoChannelInfo * > channels
virtual quint32 channelCount() const =0
const KoColorSpace * colorSpace() const override
QBitArray channelFlags
Definition kis_layer.cc:167

References KoColorSpace::channelCount(), KisLayer::channelFlags, KoColorSpace::channels, KisGroupLayer::colorSpace(), columnCount(), flags(), m_canvas, m_channelCount, m_thumbnails, and rowCount().

◆ emitAllDataChanged()

void ChannelModel::emitAllDataChanged ( int bottomRow,
int rightColumn )
private

Definition at line 217 of file channelmodel.cpp.

218{
219 if (bottomRow >= 0 && rightColumn >= 0) {
220 int rows = rowCount();
221 int cols = columnCount();
222 if (rows > 0 && cols > 0) {
223 Q_EMIT dataChanged(this->index(0, 0), this->index(qMin(bottomRow, rows - 1), qMin(rightColumn, cols - 1)));
224 }
225 }
226}

References columnCount(), and rowCount().

◆ flags()

Qt::ItemFlags ChannelModel::flags ( const QModelIndex & index) const
override

Definition at line 160 of file channelmodel.cpp.

161{
162 Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
163 return flags;
164}

References flags().

◆ headerData()

QVariant ChannelModel::headerData ( int section,
Qt::Orientation orientation,
int role = Qt::DisplayRole ) const
override

Definition at line 79 of file channelmodel.cpp.

80{
81 Q_UNUSED(section); Q_UNUSED(orientation); Q_UNUSED(role);
82 return QVariant();
83}

◆ rowActivated

void ChannelModel::rowActivated ( const QModelIndex & index)
slot

Definition at line 131 of file channelmodel.cpp.

132{
133 if (m_canvas && m_canvas->image()) {
134 KisGroupLayerWSP rootLayer = m_canvas->image()->rootLayer();
135 const KoColorSpace* cs = rootLayer->colorSpace();
136 if (cs->channelCount() != m_channelCount) return;
137
138 const QList<KoChannelInfo*> channels = cs->channels();
139 Q_ASSERT(index.row() <= channels.count());
140
141 int channelIndex = index.row();
142
143 QBitArray flags = rootLayer->channelFlags();
144 flags = flags.isEmpty() ? cs->channelFlags(true, true) : flags;
145 Q_ASSERT(!flags.isEmpty());
146
147 for (int i = 0; i < channels.count(); ++i) {
148 if (channels[i]->channelType() != KoChannelInfo::ALPHA) {
149 flags.setBit(i, (i == channelIndex));
150 }
151 }
152
153 rootLayer->setChannelFlags(flags);
154
155 Q_EMIT channelFlagsChanged();
156 emitAllDataChanged(channels.count() - 1, 0);
157 }
158}
void channelFlagsChanged()
void emitAllDataChanged(int bottomRow, int rightColumn)
@ ALPHA
The channel represents the opacity of a pixel.
QBitArray channelFlags(bool color=true, bool alpha=false) const

References KoChannelInfo::ALPHA, KoColorSpace::channelCount(), KoColorSpace::channelFlags(), channelFlagsChanged(), KoColorSpace::channels, emitAllDataChanged(), flags(), m_canvas, and m_channelCount.

◆ rowCount()

int ChannelModel::rowCount ( const QModelIndex & parent = QModelIndex()) const
override

Definition at line 85 of file channelmodel.cpp.

86{
87 if (!m_canvas || !m_canvas->image()) return 0;
88
89 return m_channelCount;
90}

References m_canvas, and m_channelCount.

◆ setCanvas()

void ChannelModel::setCanvas ( KisCanvas2 * canvas)

Definition at line 166 of file channelmodel.cpp.

167{
169
170 m_canvas = canvas;
171
172 if (m_canvas) {
174 SIGNAL(sigColorSpaceChanged(const KoColorSpace*)),
175 this,
176 SLOT(slotColorSpaceChanged(const KoColorSpace*)));
177 }
178}
void slotColorSpaceChanged(const KoColorSpace *colorSpace)
KisSignalAutoConnectionsStore m_canvasConnections
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)

References KisSignalAutoConnectionsStore::addConnection(), KisSignalAutoConnectionsStore::clear(), m_canvas, m_canvasConnections, and slotColorSpaceChanged().

◆ setChannelThumbnails()

void ChannelModel::setChannelThumbnails ( const QVector< QImage > & channels,
const KoColorSpace * cs )

Definition at line 180 of file channelmodel.cpp.

181{
182 if (m_canvas) {
183 KisGroupLayerWSP rootLayer = m_canvas->image()->rootLayer();
184
185 if (!cs || *rootLayer->colorSpace() == *cs) {
186 const int newChannelCount = cs ? cs->channelCount() : 0;
187
188
189 if (newChannelCount != m_channelCount) {
190 beginResetModel();
191 m_thumbnails = channels;
192 m_channelCount = newChannelCount;
193 endResetModel();
194 } else {
195 m_thumbnails = channels;
196 emitAllDataChanged(channels.count() - 1, columnCount() - 1);
197 }
198 }
199 }
200}

References KoColorSpace::channelCount(), columnCount(), emitAllDataChanged(), m_canvas, m_channelCount, and m_thumbnails.

◆ setData()

bool ChannelModel::setData ( const QModelIndex & index,
const QVariant & value,
int role = Qt::EditRole )
override

Definition at line 100 of file channelmodel.cpp.

101{
102 if (m_canvas && m_canvas->image()) {
103 KisGroupLayerSP rootLayer = m_canvas->image()->rootLayer();
104 const KoColorSpace *cs = rootLayer->colorSpace();
105 if (cs->channelCount() != m_channelCount) return false;
106
107 const QList<KoChannelInfo*> channels = cs->channels();
108 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(index.row() <= channels.count(), false);
109
110 int channelIndex = index.row();
111
112 if (role == Qt::CheckStateRole) {
113 QBitArray flags = rootLayer->channelFlags();
114 flags = flags.isEmpty() ? cs->channelFlags(true, true) : flags;
115 Q_ASSERT(!flags.isEmpty());
116
117 flags.setBit(channelIndex, value.toInt() == Qt::Checked);
118 rootLayer->setChannelFlags(flags);
119
120 Q_EMIT channelFlagsChanged();
121 emitAllDataChanged(channels.count() - 1, 0);
122 return true;
123 }
124 }
125 return false;
126}
float value(const T *src, size_t ch)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
virtual void setChannelFlags(const QBitArray &channelFlags)
Definition kis_layer.cc:342

References KoColorSpace::channelCount(), KisLayer::channelFlags, KoColorSpace::channelFlags(), channelFlagsChanged(), KoColorSpace::channels, KisGroupLayer::colorSpace(), emitAllDataChanged(), flags(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, m_canvas, m_channelCount, KisLayer::setChannelFlags(), and value().

◆ setThumbnailSizeLimit()

void ChannelModel::setThumbnailSizeLimit ( QSize size)

Definition at line 207 of file channelmodel.cpp.

208{
210}
QSize m_thumbnailSizeLimit
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References m_thumbnailSizeLimit.

◆ slotColorSpaceChanged

void ChannelModel::slotColorSpaceChanged ( const KoColorSpace * colorSpace)
slot

Definition at line 202 of file channelmodel.cpp.

203{
204 setChannelThumbnails({}, colorSpace);
205}
void setChannelThumbnails(const QVector< QImage > &channels, const KoColorSpace *cs)

References setChannelThumbnails().

◆ thumbnailSizeLimit()

QSize ChannelModel::thumbnailSizeLimit ( ) const

Definition at line 212 of file channelmodel.cpp.

213{
215}

References m_thumbnailSizeLimit.

Member Data Documentation

◆ m_canvas

QPointer<KisCanvas2> ChannelModel::m_canvas
private

Definition at line 52 of file channelmodel.h.

◆ m_canvasConnections

KisSignalAutoConnectionsStore ChannelModel::m_canvasConnections
private

Definition at line 56 of file channelmodel.h.

◆ m_channelCount

int ChannelModel::m_channelCount
private

Definition at line 57 of file channelmodel.h.

◆ m_thumbnails

QVector<QImage> ChannelModel::m_thumbnails
private

Definition at line 53 of file channelmodel.h.

◆ m_thumbnailSizeLimit

QSize ChannelModel::m_thumbnailSizeLimit
private

Definition at line 55 of file channelmodel.h.


The documentation for this class was generated from the following files: