1 // Object Viewer Qt - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
2 // Copyright (C) 2010 Winch Gate Property Limited
4 // This source file has been modified by the following contributors:
5 // Copyright (C) 2011-2012 Matt RAYKOWSKI (sfb) <matt.raykowski@gmail.com>
6 // Copyright (C) 2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
8 // This program is free software: you can redistribute it and/or modify
9 // it under the terms of the GNU Affero General Public License as
10 // published by the Free Software Foundation, either version 3 of the
11 // License, or (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU Affero General Public License for more details.
18 // You should have received a copy of the GNU Affero General Public License
19 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "tile_item.h"
25 #include <nel/misc/debug.h>
27 Node::Node() : m_parentItem(0)
31 Node::Node(const QVector
<QVariant
> &data
, Node
*parent
)
33 m_parentItem
= parent
;
39 qDeleteAll(m_childItems
);
43 void Node::appendChild(Node
*item
)
45 item
->setParent( this );
46 m_childItems
.append(item
);
49 Node
*Node::child(int row
)
51 //nlinfo("row %d and size %d", row, childItems.size());
52 return m_childItems
.value(row
);
55 int Node::childCount() const
57 return m_childItems
.count();
60 int Node::childNumber() const
63 return m_parentItem
->m_childItems
.indexOf(const_cast<Node
*>(this));
67 bool Node::insertChildren(int position
, int count
, int columns
)
69 if(position
<0 || position
>m_childItems
.size())
72 for(int row
= 0; row
< count
; row
++)
74 QVector
<QVariant
> data(columns
);
75 Node
*item
= new Node(data
, this);
76 m_childItems
.insert(position
, item
);
82 bool Node::removeChildren(int position
, int count
)
84 if(position
<0 || position
+count
>m_childItems
.size())
87 for(int row
=0; row
<count
; row
++)
88 delete m_childItems
.takeAt(position
);
93 bool Node::insertColumns(int position
, int columns
)
95 if(position
<0 || position
> m_itemData
.size())
98 for(int column
=0; column
<columns
; column
++)
99 m_itemData
.insert(position
, columns
);
101 Q_FOREACH(Node
*child
, m_childItems
)
102 child
->insertColumns(position
, columns
);
107 int Node::row() const
110 return m_parentItem
->m_childItems
.indexOf(const_cast<Node
*>(this));
115 int Node::columnCount() const
117 return m_itemData
.count();
120 QVariant
Node::data(int column
, int role
) const
122 if(role
== Qt::DisplayRole
||
123 role
== TileModel::TileFilenameIndexRole
||
124 role
== TileModel::TileFilenameRole
||
125 role
== TileModel::TileIndexRole
)
126 return m_itemData
.value(column
);
130 bool Node::setData(int column
, const QVariant
&value
)
132 if(column
< 0 || column
>= m_itemData
.size())
135 m_itemData
[column
] = value
;
144 void Node::setParent(Node
*parent
)
146 m_parentItem
= parent
;
149 void Node::appendRow(const QList
<Node
*> &items
)
151 Q_FOREACH(Node
*item
, items
)
155 void Node::appendRow(Node
*item
)
157 item
->setParent(this);
158 m_childItems
.append(item
);
161 void Node::swapRows( int a
, int b
)
163 Node
*temp
= m_childItems
[ a
];
164 m_childItems
[ a
] = m_childItems
[ b
];
165 m_childItems
[ b
] = temp
;
170 qDeleteAll( m_childItems
);
171 m_childItems
.clear();
175 ///////////////////////////////////////////////////
177 TileSetNode::TileSetNode(QString tileSetName
, Node
*parent
) : m_tileSetName(tileSetName
)
179 m_parentItem
= parent
;
182 TileSetNode::~TileSetNode()
184 qDeleteAll(m_childItems
);
185 m_childItems
.clear();
188 QVariant
TileSetNode::data(int column
, int role
) const
190 if(role
== Qt::DisplayRole
||
191 role
== TileModel::TileFilenameIndexRole
||
192 role
== TileModel::TileFilenameRole
||
193 role
== TileModel::TileIndexRole
)
194 return QVariant(m_tileSetName
);
198 int TileSetNode::columnCount() const
203 ///////////////////////////////////////////////////
205 TileTypeNode::TileTypeNode(TileConstants::TNodeTileType type
, Node
*parent
) : m_nodeTileType(type
)
207 m_parentItem
= parent
;
210 TileTypeNode::~TileTypeNode()
212 qDeleteAll(m_childItems
);
213 m_childItems
.clear();
216 QVariant
TileTypeNode::data(int column
, int role
) const
218 if(role
== Qt::DisplayRole
||
219 role
== TileModel::TileFilenameIndexRole
||
220 role
== TileModel::TileFilenameRole
||
221 role
== TileModel::TileIndexRole
)
222 return QVariant(TileModel::getTileTypeName(m_nodeTileType
));
227 int TileTypeNode::columnCount() const
232 TileConstants::TNodeTileType
TileTypeNode::getTileType()
234 return m_nodeTileType
;
237 bool TileTypeNode::removeChildren( int position
, int count
)
239 bool ok
= Node::removeChildren( position
, count
);
248 void TileTypeNode::reindex()
252 QListIterator
< Node
* > itr( m_childItems
);
253 while( itr
.hasNext() )
255 TileItemNode
*n
= dynamic_cast< TileItemNode
* >( itr
.next() );
266 ///////////////////////////////////////////////////
268 class TileItemNodePvt
276 bool loadImage( TileConstants::TTileChannel channel
, const QString
&fn
)
280 pixmaps
[ channel
] = TileItemNodePvt::emptyPm();
285 bool b
= temp
.load( fn
);
292 pixmaps
[ channel
] = temp
;
297 static bool loadEmptyImage()
299 bool b
= empty
.load( ":/placeHolder/images/empty_image.png" );
308 void clearImage( TileConstants::TTileChannel channel
)
310 pixmaps
[ channel
] = QPixmap();
313 const QPixmap
& pixMap( TileConstants::TTileChannel channel
) const{
314 return pixmaps
[ channel
];
317 static QPixmap
& emptyPm(){ return empty
; }
320 QPixmap pixmaps
[ TileConstants::TileChannelCount
];
321 static QPixmap empty
;
325 QPixmap
TileItemNodePvt::empty
= QPixmap();
326 TileConstants::TTileChannel
TileItemNode::s_displayChannel
= TileConstants::TileDiffuse
;
328 TileItemNode::TileItemNode( TileConstants::TNodeTileType type
, int tileId
, Node
*parent
)
331 m_parentItem
= parent
;
332 pvt
= new TileItemNodePvt();
334 for( int i
= 0; i
< TileConstants::TileChannelCount
; i
++ )
336 setTileFilename( TileConstants::TTileChannel( i
), "" );
340 TileItemNode::~TileItemNode()
345 qDeleteAll(m_childItems
);
348 bool TileItemNode::setTileFilename(TileConstants::TTileChannel channel
, QString filename
)
350 bool b
= pvt
->loadImage( channel
, filename
);
354 m_tileFilename
[channel
] = filename
;
358 QString
TileItemNode::getTileFilename(TileConstants::TTileChannel channel
)
360 QMap
< TileConstants::TTileChannel
, QString
>::const_iterator itr
361 = m_tileFilename
.find( channel
);
362 if( itr
== m_tileFilename
.end() )
368 bool TileItemNode::loadEmptyPixmap()
370 return TileItemNodePvt::loadEmptyImage();
373 QVariant
TileItemNode::data(int column
, int role
) const
375 QString tileFilename
= m_tileFilename
[ TileItemNode::s_displayChannel
];
377 if(role
== TileModel::TilePixmapRole
|| role
== Qt::DecorationRole
)
379 TileTypeNode
*parent
= dynamic_cast<TileTypeNode
*>(m_parentItem
);
383 // Retrieve the target tile size.
384 uint32 tileSize
= TileModel::getTileTypeSize(parent
->getTileType());
386 if(TileModel::CurrentZoomFactor
== TileModel::TileZoom200
)
388 else if(TileModel::CurrentZoomFactor
== TileModel::TileZoom50
)
391 QPixmap pixmap
= pvt
->pixMap( TileItemNode::s_displayChannel
);
393 pixmap
= pixmap
.scaled(tileSize
, tileSize
);
397 else if(role
== Qt::DisplayRole
)
399 return QVariant(tileFilename
);
401 else if(role
== TileModel::TileFilenameRole
)
403 return QVariant(tileFilename
);
405 else if(role
== TileModel::TileIndexRole
)
407 return QVariant("("+QString::number(m_id
)+")");
409 else if(role
== TileModel::TileFilenameIndexRole
)
411 return QVariant(tileFilename
+ " ("+QString::number(m_id
)+")");
417 int TileItemNode::columnCount() const
422 QVariant
TileItemNode::pixmap( TileConstants::TTileChannel channel
) const
424 return pvt
->pixMap( channel
);