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
*/