Linux multi-monitor fullscreen support
[ryzomcore.git] / studio / src / plugins / tile_editor / tile_item.cpp
blob10f9b02027a032236e72bfaf0447af973e83e769
1 // Object Viewer Qt - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
2 // Copyright (C) 2010 Winch Gate Property Limited
3 //
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>
7 //
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/>.
21 #include <QPixmap>
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;
34 m_itemData = data;
37 Node::~Node()
39 qDeleteAll(m_childItems);
40 m_childItems.clear();
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
62 if(m_parentItem)
63 return m_parentItem->m_childItems.indexOf(const_cast<Node*>(this));
64 return 0;
67 bool Node::insertChildren(int position, int count, int columns)
69 if(position<0 || position>m_childItems.size())
70 return false;
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);
79 return true;
82 bool Node::removeChildren(int position, int count)
84 if(position<0 || position+count>m_childItems.size())
85 return false;
87 for(int row=0; row<count; row++)
88 delete m_childItems.takeAt(position);
90 return true;
93 bool Node::insertColumns(int position, int columns)
95 if(position<0 || position > m_itemData.size())
96 return false;
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);
104 return true;
107 int Node::row() const
109 if(m_parentItem)
110 return m_parentItem->m_childItems.indexOf(const_cast<Node*>(this));
112 return 0;
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);
127 return QVariant();
130 bool Node::setData(int column, const QVariant &value)
132 if(column < 0 || column >= m_itemData.size())
133 return false;
135 m_itemData[column] = value;
136 return true;
139 Node *Node::parent()
141 return m_parentItem;
144 void Node::setParent(Node *parent)
146 m_parentItem = parent;
149 void Node::appendRow(const QList<Node*> &items)
151 Q_FOREACH(Node *item, items)
152 appendRow(item);
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;
168 void Node::clear()
170 qDeleteAll( m_childItems );
171 m_childItems.clear();
172 m_itemData.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);
195 return QVariant();
198 int TileSetNode::columnCount() const
200 return 1;
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));
223 return QVariant();
227 int TileTypeNode::columnCount() const
229 return 1;
232 TileConstants::TNodeTileType TileTypeNode::getTileType()
234 return m_nodeTileType;
237 bool TileTypeNode::removeChildren( int position, int count )
239 bool ok = Node::removeChildren( position, count );
240 if( !ok )
241 return false;
243 reindex();
245 return true;
248 void TileTypeNode::reindex()
250 int i = 0;
252 QListIterator< Node* > itr( m_childItems );
253 while( itr.hasNext() )
255 TileItemNode *n = dynamic_cast< TileItemNode* >( itr.next() );
256 if( n == NULL )
257 continue;
259 n->setId( i );
261 i++;
266 ///////////////////////////////////////////////////
268 class TileItemNodePvt
270 public:
272 TileItemNodePvt()
276 bool loadImage( TileConstants::TTileChannel channel, const QString &fn )
278 if( fn.isEmpty() )
280 pixmaps[ channel ] = TileItemNodePvt::emptyPm();
281 return true;
284 QPixmap temp;
285 bool b = temp.load( fn );
287 if( !b )
289 return false;
292 pixmaps[ channel ] = temp;
294 return true;
297 static bool loadEmptyImage()
299 bool b = empty.load( ":/placeHolder/images/empty_image.png" );
300 if( !b )
302 empty = QPixmap();
305 return b;
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; }
319 private:
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 )
330 m_id = tileId;
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()
342 delete pvt;
343 pvt = NULL;
345 qDeleteAll(m_childItems);
348 bool TileItemNode::setTileFilename(TileConstants::TTileChannel channel, QString filename)
350 bool b = pvt->loadImage( channel, filename );
351 if( !b )
352 return false;
354 m_tileFilename[channel] = filename;
355 return true;
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() )
363 return "";
365 return itr.value();
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);
380 if(parent == NULL)
381 return QVariant();
383 // Retrieve the target tile size.
384 uint32 tileSize = TileModel::getTileTypeSize(parent->getTileType());
386 if(TileModel::CurrentZoomFactor == TileModel::TileZoom200)
387 tileSize *= 2;
388 else if(TileModel::CurrentZoomFactor == TileModel::TileZoom50)
389 tileSize /= 2;
391 QPixmap pixmap = pvt->pixMap( TileItemNode::s_displayChannel );
393 pixmap = pixmap.scaled(tileSize, tileSize);
395 return pixmap;
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)+")");
414 return QVariant();
417 int TileItemNode::columnCount() const
419 return 1;
422 QVariant TileItemNode::pixmap( TileConstants::TTileChannel channel ) const
424 return pvt->pixMap( channel );