|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/treemodel.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <QStringList>
|
|
Toshihiro Shimizu |
890ddd |
#include <QTreeView>
|
|
Toshihiro Shimizu |
890ddd |
#include <QHeaderView>
|
|
Toshihiro Shimizu |
890ddd |
#include <QMouseEvent>
|
|
Toshihiro Shimizu |
890ddd |
#include <qvariant.h>
|
|
Toshihiro Shimizu |
890ddd |
#include <qicon.h>
|
|
Toshihiro Shimizu |
890ddd |
#include <qtextedit.h>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tfx.h"
|
|
Toshihiro Shimizu |
890ddd |
#include <assert.h>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//====================================================================================================
|
|
Toshihiro Shimizu |
890ddd |
// Item
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TreeModel::Item::Item()
|
|
Toshihiro Shimizu |
890ddd |
: m_model(0), m_parent(0), m_depth(0), m_row(0), m_opened(false)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TreeModel::Item::~Item()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
qDeleteAll(m_childItems);
|
|
Toshihiro Shimizu |
890ddd |
m_childItems.clear();
|
|
Toshihiro Shimizu |
890ddd |
m_model = 0;
|
|
Toshihiro Shimizu |
890ddd |
m_row = 0;
|
|
Toshihiro Shimizu |
890ddd |
m_depth = 0;
|
|
Toshihiro Shimizu |
890ddd |
m_parent = 0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::Item::updateChild(Item *child, int row)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(m_model);
|
|
Toshihiro Shimizu |
890ddd |
child->m_model = m_model;
|
|
Toshihiro Shimizu |
890ddd |
child->m_depth = m_depth + 1;
|
|
Toshihiro Shimizu |
890ddd |
child->m_parent = this;
|
|
Toshihiro Shimizu |
890ddd |
child->m_row = row;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::Item::updateChildren()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i;
|
|
Toshihiro Shimizu |
890ddd |
for (i = 0; i < m_childItems.size(); i++)
|
|
Toshihiro Shimizu |
890ddd |
updateChild(m_childItems[i], i);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TreeModel::Item *TreeModel::Item::appendChild(TreeModel::Item *child)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(child);
|
|
Toshihiro Shimizu |
890ddd |
assert(!m_childItems.contains(child));
|
|
Toshihiro Shimizu |
890ddd |
updateChild(child, m_childItems.size());
|
|
Toshihiro Shimizu |
890ddd |
m_childItems.append(child);
|
|
Toshihiro Shimizu |
890ddd |
return child;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::Item::deleteChild(Item *child)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int index = m_childItems.indexOf(child);
|
|
Toshihiro Shimizu |
890ddd |
if(index != -1)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_childItems.takeAt(index);
|
|
Toshihiro Shimizu |
890ddd |
assert(!m_childItems.contains(child));
|
|
Toshihiro Shimizu |
890ddd |
// m_childItems is not supposed to contain duplicated entries
|
|
Toshihiro Shimizu |
890ddd |
delete child;
|
|
Toshihiro Shimizu |
890ddd |
updateChildren();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*
|
|
Toshihiro Shimizu |
890ddd |
Item* matchItem(Item*item, QList<Item*> &items)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
void *itemData = item->getInternalPointer();
|
|
Toshihiro Shimizu |
890ddd |
if(!itemData) return 0;
|
|
Toshihiro Shimizu |
890ddd |
int i;
|
|
Toshihiro Shimizu |
890ddd |
for(i=0;i<items.size();i++)
|
|
Toshihiro Shimizu |
890ddd |
if(items.at(i)->getInternalPointer()==itemData)
|
|
Toshihiro Shimizu |
890ddd |
return items.at(i);
|
|
Toshihiro Shimizu |
890ddd |
return 0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::Item::setChildren(QList<Item *> &newChildren)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(m_model);
|
|
Toshihiro Shimizu |
890ddd |
QModelIndex itemIndex = createIndex();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// save old children and clear 'm_childItems'
|
|
Toshihiro Shimizu |
890ddd |
QList<Item *> oldChildren(m_childItems);
|
|
Toshihiro Shimizu |
890ddd |
m_childItems.clear();
|
|
Toshihiro Shimizu |
890ddd |
int i;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// for each child to add
|
|
Toshihiro Shimizu |
890ddd |
for (i = 0; i < newChildren.size(); i++) {
|
|
Toshihiro Shimizu |
890ddd |
Item *newChild = newChildren.at(i);
|
|
Toshihiro Shimizu |
890ddd |
void *newInternalPointer = newChild->getInternalPointer();
|
|
Toshihiro Shimizu |
890ddd |
if (newInternalPointer != 0) {
|
|
Toshihiro Shimizu |
890ddd |
// search among old children
|
|
Toshihiro Shimizu |
890ddd |
int j;
|
|
Toshihiro Shimizu |
890ddd |
for (j = 0; j < oldChildren.size(); j++)
|
|
Toshihiro Shimizu |
890ddd |
if (oldChildren.at(j)->getInternalPointer() == newInternalPointer)
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
if (j < oldChildren.size()) {
|
|
Toshihiro Shimizu |
890ddd |
Item *oldChild = oldChildren.takeAt(j);
|
|
Toshihiro Shimizu |
890ddd |
if (oldChild != newChild) {
|
|
Toshihiro Shimizu |
890ddd |
// Found! Delete newChild, remove it from 'newChildren' and
|
|
Toshihiro Shimizu |
890ddd |
// update consequently the index
|
|
Toshihiro Shimizu |
890ddd |
delete newChild;
|
|
Toshihiro Shimizu |
890ddd |
newChildren.takeAt(i);
|
|
Toshihiro Shimizu |
890ddd |
i--;
|
|
Toshihiro Shimizu |
890ddd |
// use the found child instead of the new one.
|
|
Toshihiro Shimizu |
890ddd |
newChild = oldChild;
|
|
Toshihiro Shimizu |
890ddd |
oldChild->refresh();
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
// should never happen; (if it happens this is not a big problem)
|
|
Toshihiro Shimizu |
890ddd |
assert(0);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
// add the new child to 'm_childItems'
|
|
Toshihiro Shimizu |
890ddd |
m_childItems.push_back(newChild);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
// update children model, row, parent, etc.
|
|
Toshihiro Shimizu |
890ddd |
updateChildren();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// postpone item deletion to avoid the (possible) reuse of the
|
|
Toshihiro Shimizu |
890ddd |
// same pointer for the newly created items. (Pointers match is
|
|
Toshihiro Shimizu |
890ddd |
// used updating persistent indices. see: TreeModel::endRefresh())
|
|
Toshihiro Shimizu |
890ddd |
for (i = 0; i < oldChildren.size(); i++) {
|
|
Toshihiro Shimizu |
890ddd |
Item *itemToDelete = oldChildren[i];
|
|
Toshihiro Shimizu |
890ddd |
if (!m_model->m_itemsToDelete.contains(itemToDelete))
|
|
Toshihiro Shimizu |
890ddd |
m_model->m_itemsToDelete.push_back(itemToDelete);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
QVariant TreeModel::Item::data(int role) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (role == Qt::DecorationRole)
|
|
Toshihiro Shimizu |
890ddd |
return QIcon(isOpen()
|
|
Toshihiro Shimizu |
890ddd |
? ":Resources/folder_open.png"
|
|
Toshihiro Shimizu |
890ddd |
: ":Resources/folder_close.png");
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return QVariant();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
QModelIndex TreeModel::Item::createIndex()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_parent ? m_model->createIndex(m_row, 0, this) : QModelIndex();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//====================================================================================================
|
|
Toshihiro Shimizu |
890ddd |
// TreeModel
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TreeModel::TreeModel(TreeView *parent)
|
|
Toshihiro Shimizu |
890ddd |
: QAbstractItemModel(parent), m_rootItem(0), m_view(parent)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TreeModel::~TreeModel()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
delete m_rootItem;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::setExpandedItem(const QModelIndex &index, bool expanded)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_view->setExpanded(index, expanded);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::beginRefresh()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
emit layoutAboutToBeChanged();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::endRefresh()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
QList<QModelIndex> oldIndices, newIndices;
|
|
Toshihiro Shimizu |
890ddd |
int i;
|
|
Toshihiro Shimizu |
890ddd |
QList<Item *>::iterator it;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
for (i = m_itemsToDelete.size() - 1; i >= 0; i--) {
|
|
Toshihiro Shimizu |
890ddd |
int row = m_itemsToDelete[i]->getRow();
|
|
Toshihiro Shimizu |
890ddd |
Item *parentItem = m_itemsToDelete[i]->getParent();
|
|
Toshihiro Shimizu |
890ddd |
QModelIndex parentIndex = parentItem ? parentItem->createIndex() : QModelIndex();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
beginRemoveRows(parentIndex, row, row);
|
|
Toshihiro Shimizu |
890ddd |
removeRow(row, parentIndex); //NOTE: This is currently doing NOTHING? (see Qt's manual)
|
|
Toshihiro Shimizu |
890ddd |
endRemoveRows();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
qDeleteAll(m_itemsToDelete);
|
|
Toshihiro Shimizu |
890ddd |
m_itemsToDelete.clear();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (!persistentIndexList().empty()) {
|
|
Toshihiro Shimizu |
890ddd |
for (i = 0; i < persistentIndexList().size(); i++) {
|
|
Toshihiro Shimizu |
890ddd |
QModelIndex oldIndex = persistentIndexList()[i];
|
|
Toshihiro Shimizu |
890ddd |
Item *item = static_cast<Item *>(oldIndex.internalPointer());
|
|
Toshihiro Shimizu |
890ddd |
if (item) {
|
|
Toshihiro Shimizu |
890ddd |
QModelIndex newIndex = item->createIndex();
|
|
Toshihiro Shimizu |
890ddd |
if (oldIndex != newIndex) {
|
|
Toshihiro Shimizu |
890ddd |
oldIndices.push_back(oldIndex);
|
|
Toshihiro Shimizu |
890ddd |
newIndices.push_back(newIndex);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
changePersistentIndexList(oldIndices, newIndices);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
emit layoutChanged();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int TreeModel::columnCount(const QModelIndex &parent) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return 1;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!index.isValid())
|
|
Toshihiro Shimizu |
890ddd |
return 0;
|
|
Toshihiro Shimizu |
890ddd |
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
// column=!0 are not supported
|
|
Toshihiro Shimizu |
890ddd |
if (column != 0)
|
|
Toshihiro Shimizu |
890ddd |
return QModelIndex();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
Item *parentItem = parent.isValid() ? (Item *)(parent.internalPointer()) : m_rootItem;
|
|
Toshihiro Shimizu |
890ddd |
// if m_rootItem has not been defined yet. (It should not happen, but just in case)
|
|
Toshihiro Shimizu |
890ddd |
if (!parentItem)
|
|
Toshihiro Shimizu |
890ddd |
return QModelIndex();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int childCount = parentItem->getChildCount();
|
|
Toshihiro Shimizu |
890ddd |
if (row < 0 || row >= childCount)
|
|
Toshihiro Shimizu |
890ddd |
return QModelIndex();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
Item *item = parentItem->getChild(row);
|
|
Toshihiro Shimizu |
890ddd |
if (!item)
|
|
Toshihiro Shimizu |
890ddd |
return QModelIndex(); // it should never happen
|
|
Toshihiro Shimizu |
890ddd |
return item->createIndex();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
QModelIndex TreeModel::parent(const QModelIndex &index) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!index.isValid())
|
|
Toshihiro Shimizu |
890ddd |
return QModelIndex();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
Item *item = (Item *)index.internalPointer();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TreeModel::Item *parentItem = item->getParent();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (!parentItem || parentItem == m_rootItem)
|
|
Toshihiro Shimizu |
890ddd |
return QModelIndex();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return parentItem->createIndex();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int TreeModel::rowCount(const QModelIndex &parent) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (parent.column() > 0)
|
|
Toshihiro Shimizu |
890ddd |
return 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (!parent.isValid())
|
|
Toshihiro Shimizu |
890ddd |
return m_rootItem ? m_rootItem->getChildCount() : 0;
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return ((Item *)(parent.internalPointer()))->getChildCount();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::onExpanded(const QModelIndex &index)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!index.isValid())
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
Item *item = (Item *)(index.internalPointer());
|
|
Toshihiro Shimizu |
890ddd |
item->setIsOpen(true);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::onCollapsed(const QModelIndex &index)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!index.isValid())
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
Item *item = (Item *)(index.internalPointer());
|
|
Toshihiro Shimizu |
890ddd |
item->setIsOpen(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
QVariant TreeModel::data(const QModelIndex &index, int role) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!index.isValid())
|
|
Toshihiro Shimizu |
890ddd |
return QVariant();
|
|
Toshihiro Shimizu |
890ddd |
Item *item = static_cast<Item *>(index.internalPointer());
|
|
Toshihiro Shimizu |
890ddd |
return item->data(role);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::setRootItem(Item *rootItem)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (rootItem == m_rootItem)
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
delete m_rootItem;
|
|
Toshihiro Shimizu |
890ddd |
m_rootItem = rootItem;
|
|
Toshihiro Shimizu |
890ddd |
if (m_rootItem)
|
|
Toshihiro Shimizu |
890ddd |
m_rootItem->setModel(this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeModel::setRowHidden(int row, const QModelIndex &parent, bool hide)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_view->setRowHidden(row, parent, hide);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//====================================================================================================
|
|
Toshihiro Shimizu |
890ddd |
// TreeView
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TreeView::TreeView(QWidget *parent)
|
|
Toshihiro Shimizu |
890ddd |
: QTreeView(parent), m_dragging(false)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
header()->hide();
|
|
Toshihiro Shimizu |
890ddd |
setUniformRowHeights(true);
|
|
Toshihiro Shimizu |
890ddd |
setIconSize(QSize(32, 32));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//!Resizes viewport to contents
|
|
Toshihiro Shimizu |
890ddd |
void TreeView::resizeToConts(void)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
resizeColumnToContents(0);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeView::resizeEvent(QResizeEvent *event)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
resizeColumnToContents(0);
|
|
Toshihiro Shimizu |
890ddd |
QTreeView::resizeEvent(event);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeView::setModel(TreeModel *model)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
QTreeView::setModel(model);
|
|
Toshihiro Shimizu |
890ddd |
disconnect();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
connect(this, SIGNAL(expanded(const QModelIndex &)), model, SLOT(onExpanded(const QModelIndex &)));
|
|
Toshihiro Shimizu |
890ddd |
connect(this, SIGNAL(collapsed(const QModelIndex &)), model, SLOT(onCollapsed(const QModelIndex &)));
|
|
Toshihiro Shimizu |
890ddd |
// setItemDelegate(new Delegate(this));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//Connect all possible changes that can alter the
|
|
Toshihiro Shimizu |
890ddd |
//bottom horizontal scrollbar to resize contents...
|
|
Toshihiro Shimizu |
890ddd |
connect(
|
|
Toshihiro Shimizu |
890ddd |
this, SIGNAL(expanded(const QModelIndex &)),
|
|
Toshihiro Shimizu |
890ddd |
this, SLOT(resizeToConts()));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
connect(
|
|
Toshihiro Shimizu |
890ddd |
this, SIGNAL(collapsed(const QModelIndex &)),
|
|
Toshihiro Shimizu |
890ddd |
this, SLOT(resizeToConts()));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
connect(
|
|
Toshihiro Shimizu |
890ddd |
this->model(), SIGNAL(layoutChanged()),
|
|
Toshihiro Shimizu |
890ddd |
this, SLOT(resizeToConts()));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeView::mouseDoubleClickEvent(QMouseEvent *)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
//ignore double click!
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeView::mousePressEvent(QMouseEvent *e)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (e->button() != Qt::RightButton)
|
|
Toshihiro Shimizu |
890ddd |
QTreeView::mousePressEvent(e);
|
|
Toshihiro Shimizu |
890ddd |
QModelIndex index = indexAt(e->pos());
|
|
Toshihiro Shimizu |
890ddd |
if (index.isValid()) {
|
|
Toshihiro Shimizu |
890ddd |
TreeModel::Item *item = static_cast<TreeModel::Item *>(index.internalPointer());
|
|
Toshihiro Shimizu |
890ddd |
QRect itemRect = visualRect(index);
|
|
Toshihiro Shimizu |
890ddd |
QPoint itemPos = e->pos() - itemRect.topLeft();
|
|
Toshihiro Shimizu |
890ddd |
if (e->button() == Qt::RightButton) {
|
|
Toshihiro Shimizu |
890ddd |
if (selectionMode() != QAbstractItemView::ExtendedSelection)
|
|
Toshihiro Shimizu |
890ddd |
setCurrentIndex(item->createIndex());
|
|
Toshihiro Shimizu |
890ddd |
onClick(item, itemPos, e);
|
|
Toshihiro Shimizu |
890ddd |
openContextMenu(item, e->globalPos());
|
|
Toshihiro Shimizu |
890ddd |
} else if (e->button() == Qt::LeftButton) {
|
|
Toshihiro Shimizu |
890ddd |
m_dragging = true;
|
|
Toshihiro Shimizu |
890ddd |
setMouseTracking(true);
|
|
Toshihiro Shimizu |
890ddd |
onClick(item, itemPos, e);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
// for drag & drop
|
|
Toshihiro Shimizu |
890ddd |
else if (e->button() == Qt::MidButton) {
|
|
Toshihiro Shimizu |
890ddd |
m_dragging = true;
|
|
Toshihiro Shimizu |
890ddd |
setMouseTracking(true);
|
|
Toshihiro Shimizu |
890ddd |
onMidClick(item, itemPos, e);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeView::mouseMoveEvent(QMouseEvent *e)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
QTreeView::mouseMoveEvent(e);
|
|
Toshihiro Shimizu |
890ddd |
if (m_dragging) {
|
|
Toshihiro Shimizu |
890ddd |
QModelIndex index = indexAt(e->pos());
|
|
Toshihiro Shimizu |
890ddd |
if (index.isValid()) {
|
|
Toshihiro Shimizu |
890ddd |
TreeModel::Item *item = static_cast<TreeModel::Item *>(index.internalPointer());
|
|
Toshihiro Shimizu |
890ddd |
QRect itemRect = visualRect(index);
|
|
Toshihiro Shimizu |
890ddd |
QPoint itemPos = e->pos() - itemRect.topLeft();
|
|
Toshihiro Shimizu |
890ddd |
onDrag(item, itemPos, e);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TreeView::mouseReleaseEvent(QMouseEvent *e)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
QTreeView::mouseReleaseEvent(e);
|
|
Toshihiro Shimizu |
890ddd |
if (m_dragging) {
|
|
Toshihiro Shimizu |
890ddd |
m_dragging = false;
|
|
Toshihiro Shimizu |
890ddd |
setMouseTracking(false);
|
|
Toshihiro Shimizu |
890ddd |
onRelease();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*
|
|
Toshihiro Shimizu |
890ddd |
bool TreeView::Delegate::editorEvent(QEvent *e, QAbstractItemModel *abstractModel, const QStyleOptionViewItem &option, const QModelIndex &index)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if(e->type() != QEvent::MouseButtonPress) return false;
|
|
Toshihiro Shimizu |
890ddd |
TreeModel *model = dynamic_cast<TreeModel *>(abstractModel);
|
|
Toshihiro Shimizu |
890ddd |
if(!model || !index.isValid()) return false;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TreeModel::Item *item = static_cast<TreeModel::Item *>(index.internalPointer());
|
|
Toshihiro Shimizu |
890ddd |
QMouseEvent* mouseEvent = dynamic_cast<QMouseEvent*>(e);
|
|
Toshihiro Shimizu |
890ddd |
QPoint pos = mouseEvent->pos();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_treeView->onClick(item, pos, option);
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
*/
|