Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Kite 521c84
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/treemodel.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qstringlist></qstringlist>
Toshihiro Shimizu 890ddd
#include <qtreeview></qtreeview>
Toshihiro Shimizu 890ddd
#include <qheaderview></qheaderview>
Toshihiro Shimizu 890ddd
#include <qmouseevent></qmouseevent>
Toshihiro Shimizu 890ddd
#include <qvariant.h></qvariant.h>
Toshihiro Shimizu 890ddd
#include <qicon.h></qicon.h>
Toshihiro Shimizu 890ddd
#include <qtextedit.h></qtextedit.h>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tfx.h"
Toshihiro Shimizu 890ddd
#include <assert.h></assert.h>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//====================================================================================================
Toshihiro Shimizu 890ddd
// Item
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TreeModel::Item::Item()
Shinya Kitaoka 120a6e
    : m_model(0), m_parent(0), m_depth(0), m_row(0), m_opened(false) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TreeModel::Item::~Item() {
Shinya Kitaoka 120a6e
  qDeleteAll(m_childItems);
Shinya Kitaoka 120a6e
  m_childItems.clear();
Shinya Kitaoka 120a6e
  m_model  = 0;
Shinya Kitaoka 120a6e
  m_row    = 0;
Shinya Kitaoka 120a6e
  m_depth  = 0;
Shinya Kitaoka 120a6e
  m_parent = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeModel::Item::updateChild(Item *child, int row) {
Shinya Kitaoka 120a6e
  assert(m_model);
Shinya Kitaoka 120a6e
  child->m_model  = m_model;
Shinya Kitaoka 120a6e
  child->m_depth  = m_depth + 1;
Shinya Kitaoka 120a6e
  child->m_parent = this;
Shinya Kitaoka 120a6e
  child->m_row    = row;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeModel::Item::updateChildren() {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < m_childItems.size(); i++) updateChild(m_childItems[i], i);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TreeModel::Item *TreeModel::Item::appendChild(TreeModel::Item *child) {
Shinya Kitaoka 120a6e
  assert(child);
Shinya Kitaoka 120a6e
  assert(!m_childItems.contains(child));
Shinya Kitaoka 120a6e
  updateChild(child, m_childItems.size());
Shinya Kitaoka 120a6e
  m_childItems.append(child);
Shinya Kitaoka 120a6e
  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);
Shinya Kitaoka 120a6e
    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)</item*>
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
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
Shinya Kitaoka 120a6e
void TreeModel::Item::setChildren(QList<item *=""> &newChildren) {</item>
Shinya Kitaoka 120a6e
  assert(m_model);
Shinya Kitaoka 120a6e
  QModelIndex itemIndex = createIndex();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // save old children and clear 'm_childItems'
Shinya Kitaoka 120a6e
  QList<item *=""> oldChildren(m_childItems);</item>
Shinya Kitaoka 120a6e
  m_childItems.clear();
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // for each child to add
Shinya Kitaoka 120a6e
  for (i = 0; i < newChildren.size(); i++) {
Shinya Kitaoka 120a6e
    Item *newChild           = newChildren.at(i);
Shinya Kitaoka 120a6e
    void *newInternalPointer = newChild->getInternalPointer();
Shinya Kitaoka 120a6e
    if (newInternalPointer != 0) {
Shinya Kitaoka 120a6e
      // search among old children
Shinya Kitaoka 120a6e
      int j;
Shinya Kitaoka 120a6e
      for (j = 0; j < oldChildren.size(); j++)
Shinya Kitaoka 120a6e
        if (oldChildren.at(j)->getInternalPointer() == newInternalPointer)
Shinya Kitaoka 120a6e
          break;
Shinya Kitaoka 120a6e
      if (j < oldChildren.size()) {
Shinya Kitaoka 120a6e
        Item *oldChild = oldChildren.takeAt(j);
Shinya Kitaoka 120a6e
        if (oldChild != newChild) {
Shinya Kitaoka 120a6e
          // Found! Delete newChild, remove it from 'newChildren' and
Shinya Kitaoka 120a6e
          // update consequently the index
Shinya Kitaoka 120a6e
          delete newChild;
Shinya Kitaoka 120a6e
          newChildren.takeAt(i);
Shinya Kitaoka 120a6e
          i--;
Shinya Kitaoka 120a6e
          // use the found child instead of the new one.
Shinya Kitaoka 120a6e
          newChild = oldChild;
Shinya Kitaoka 120a6e
          oldChild->refresh();
Shinya Kitaoka 120a6e
        } else {
Shinya Kitaoka 120a6e
          // should never happen; (if it happens this is not a big problem)
Shinya Kitaoka 120a6e
          assert(0);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // add the new child to 'm_childItems'
Shinya Kitaoka 120a6e
    m_childItems.push_back(newChild);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // update children model, row, parent, etc.
Shinya Kitaoka 120a6e
  updateChildren();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // postpone item deletion to avoid the (possible) reuse of the
Shinya Kitaoka 120a6e
  // same pointer for the newly created items. (Pointers match is
Shinya Kitaoka 120a6e
  // used updating persistent indices. see: TreeModel::endRefresh())
Shinya Kitaoka 120a6e
  for (i = 0; i < oldChildren.size(); i++) {
Shinya Kitaoka 120a6e
    Item *itemToDelete = oldChildren[i];
Shinya Kitaoka 120a6e
    if (!m_model->m_itemsToDelete.contains(itemToDelete))
Shinya Kitaoka 120a6e
      m_model->m_itemsToDelete.push_back(itemToDelete);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QVariant TreeModel::Item::data(int role) const {
Shinya Kitaoka 120a6e
  if (role == Qt::DecorationRole)
Kite 521c84
    return createQIcon("folder", true);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    return QVariant();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QModelIndex TreeModel::Item::createIndex() {
Shinya Kitaoka 120a6e
  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)
Shinya Kitaoka 120a6e
    : QAbstractItemModel(parent), m_rootItem(0), m_view(parent) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TreeModel::~TreeModel() { delete m_rootItem; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeModel::setExpandedItem(const QModelIndex &index, bool expanded) {
shun-iwasawa 4a3868
  if (m_view) m_view->setExpanded(index, expanded);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeModel::beginRefresh() { emit layoutAboutToBeChanged(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeModel::endRefresh() {
Shinya Kitaoka 120a6e
  QList<qmodelindex> oldIndices, newIndices;</qmodelindex>
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  QList<item *="">::iterator it;</item>
Shinya Kitaoka 120a6e
shun-iwasawa 0d01d8
  // comment out as no subclass of TreeModel reimplement removeRows() for now
shun-iwasawa 0d01d8
  // and it causes assertion failure on calling beginRemoveRows() when deleting
shun-iwasawa 0d01d8
  // the last column in the xsheet
shun-iwasawa 0d01d8
  /*
Shinya Kitaoka 120a6e
  for (i = m_itemsToDelete.size() - 1; i >= 0; i--) {
Shinya Kitaoka 120a6e
    int row          = m_itemsToDelete[i]->getRow();
Shinya Kitaoka 120a6e
    Item *parentItem = m_itemsToDelete[i]->getParent();
Shinya Kitaoka 120a6e
    QModelIndex parentIndex =
Shinya Kitaoka 120a6e
        parentItem ? parentItem->createIndex() : QModelIndex();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    beginRemoveRows(parentIndex, row, row);
shun-iwasawa 0d01d8
    removeRows(row, 1, parentIndex);  // NOTE: This is currently doing NOTHING?
shun-iwasawa 0d01d8
  (see
Shinya Kitaoka 120a6e
                                  // Qt's manual)
Shinya Kitaoka 120a6e
    endRemoveRows();
shun-iwasawa 0d01d8
  }*/
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  qDeleteAll(m_itemsToDelete);
Shinya Kitaoka 120a6e
  m_itemsToDelete.clear();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!persistentIndexList().empty()) {
Shinya Kitaoka 120a6e
    for (i = 0; i < persistentIndexList().size(); i++) {
Shinya Kitaoka 120a6e
      QModelIndex oldIndex = persistentIndexList()[i];
Shinya Kitaoka 120a6e
      Item *item           = static_cast<item *="">(oldIndex.internalPointer());</item>
Shinya Kitaoka 120a6e
      if (item) {
Shinya Kitaoka 120a6e
        QModelIndex newIndex = item->createIndex();
Shinya Kitaoka 120a6e
        if (oldIndex != newIndex) {
Shinya Kitaoka 120a6e
          oldIndices.push_back(oldIndex);
Shinya Kitaoka 120a6e
          newIndices.push_back(newIndex);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    changePersistentIndexList(oldIndices, newIndices);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  emit layoutChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int TreeModel::columnCount(const QModelIndex &parent) const { return 1; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const {
shun-iwasawa 443318
  if (!index.isValid()) return Qt::ItemFlags();
Shinya Kitaoka 120a6e
  return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QModelIndex TreeModel::index(int row, int column,
Shinya Kitaoka 120a6e
                             const QModelIndex &parent) const {
Shinya Kitaoka 120a6e
  // column=!0 are not supported
Shinya Kitaoka 120a6e
  if (column != 0) return QModelIndex();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  Item *parentItem =
Shinya Kitaoka 120a6e
      parent.isValid() ? (Item *)(parent.internalPointer()) : m_rootItem;
Shinya Kitaoka 120a6e
  // if m_rootItem has not been defined yet. (It should not happen, but just in
Shinya Kitaoka 120a6e
  // case)
Shinya Kitaoka 120a6e
  if (!parentItem) return QModelIndex();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int childCount = parentItem->getChildCount();
Shinya Kitaoka 120a6e
  if (row < 0 || row >= childCount) return QModelIndex();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  Item *item = parentItem->getChild(row);
Shinya Kitaoka 120a6e
  if (!item) return QModelIndex();  // it should never happen
Shinya Kitaoka 120a6e
  return item->createIndex();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QModelIndex TreeModel::parent(const QModelIndex &index) const {
Shinya Kitaoka 120a6e
  if (!index.isValid()) return QModelIndex();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  Item *item = (Item *)index.internalPointer();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TreeModel::Item *parentItem = item->getParent();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (!parentItem || parentItem == m_rootItem) return QModelIndex();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return parentItem->createIndex();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int TreeModel::rowCount(const QModelIndex &parent) const {
Shinya Kitaoka 120a6e
  if (parent.column() > 0) return 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (!parent.isValid())
Shinya Kitaoka 120a6e
    return m_rootItem ? m_rootItem->getChildCount() : 0;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    return ((Item *)(parent.internalPointer()))->getChildCount();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeModel::onExpanded(const QModelIndex &index) {
Shinya Kitaoka 120a6e
  if (!index.isValid()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  Item *item = (Item *)(index.internalPointer());
Shinya Kitaoka 120a6e
  item->setIsOpen(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeModel::onCollapsed(const QModelIndex &index) {
Shinya Kitaoka 120a6e
  if (!index.isValid()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  Item *item = (Item *)(index.internalPointer());
Shinya Kitaoka 120a6e
  item->setIsOpen(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QVariant TreeModel::data(const QModelIndex &index, int role) const {
Shinya Kitaoka 120a6e
  if (!index.isValid()) return QVariant();
Shinya Kitaoka 120a6e
  Item *item = static_cast<item *="">(index.internalPointer());</item>
Shinya Kitaoka 120a6e
  return item->data(role);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeModel::setRootItem(Item *rootItem) {
Shinya Kitaoka 120a6e
  if (rootItem == m_rootItem) return;
Shinya Kitaoka 120a6e
  delete m_rootItem;
Shinya Kitaoka 120a6e
  m_rootItem = rootItem;
Shinya Kitaoka 120a6e
  if (m_rootItem) m_rootItem->setModel(this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Campbell Barton 6e785f
// postpone freeing, so existing items can be referenced while refreshing.
Campbell Barton 6e785f
void TreeModel::setRootItem_NoFree(Item *rootItem) {
Campbell Barton 6e785f
  if (rootItem == m_rootItem) return;
Campbell Barton 6e785f
  m_rootItem = rootItem;
Campbell Barton 6e785f
  if (m_rootItem) m_rootItem->setModel(this);
Campbell Barton 6e785f
}
Campbell Barton 6e785f
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeModel::setRowHidden(int row, const QModelIndex &parent, bool hide) {
shun-iwasawa 4a3868
  if (m_view) 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
Shinya Kitaoka 120a6e
TreeView::TreeView(QWidget *parent) : QTreeView(parent), m_dragging(false) {
Shinya Kitaoka 120a6e
  header()->hide();
Shinya Kitaoka 120a6e
  setUniformRowHeights(true);
Shinya Kitaoka 120a6e
  setIconSize(QSize(32, 32));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! Resizes viewport to contents
Shinya Kitaoka 120a6e
void TreeView::resizeToConts(void) { resizeColumnToContents(0); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeView::resizeEvent(QResizeEvent *event) {
Shinya Kitaoka 120a6e
  resizeColumnToContents(0);
Shinya Kitaoka 120a6e
  QTreeView::resizeEvent(event);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeView::setModel(TreeModel *model) {
Shinya Kitaoka 120a6e
  QTreeView::setModel(model);
Shinya Kitaoka 120a6e
  disconnect();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(expanded(const QModelIndex &)), model,
Shinya Kitaoka 120a6e
          SLOT(onExpanded(const QModelIndex &)));
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(collapsed(const QModelIndex &)), model,
Shinya Kitaoka 120a6e
          SLOT(onCollapsed(const QModelIndex &)));
Shinya Kitaoka 120a6e
  // setItemDelegate(new Delegate(this));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Connect all possible changes that can alter the
Shinya Kitaoka 120a6e
  // bottom horizontal scrollbar to resize contents...
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(expanded(const QModelIndex &)), this,
Shinya Kitaoka 120a6e
          SLOT(resizeToConts()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(collapsed(const QModelIndex &)), this,
Shinya Kitaoka 120a6e
          SLOT(resizeToConts()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(this->model(), SIGNAL(layoutChanged()), this, SLOT(resizeToConts()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//----------------------------------------------------------------------------------------------------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void TreeView::mouseDoubleClickEvent(QMouseEvent *) {
Shinya Kitaoka 120a6e
  // ignore double click!
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void TreeView::mousePressEvent(QMouseEvent *e) {
Shinya Kitaoka 120a6e
  if (e->button() != Qt::RightButton) QTreeView::mousePressEvent(e);
Shinya Kitaoka 120a6e
  QModelIndex index = indexAt(e->pos());
Shinya Kitaoka 120a6e
  if (index.isValid()) {
Shinya Kitaoka 120a6e
    TreeModel::Item *item =
Shinya Kitaoka 120a6e
        static_cast<treemodel::item *="">(index.internalPointer());</treemodel::item>
Shinya Kitaoka 120a6e
    QRect itemRect = visualRect(index);
Shinya Kitaoka 120a6e
    QPoint itemPos = e->pos() - itemRect.topLeft();
Shinya Kitaoka 120a6e
    if (e->button() == Qt::RightButton) {
Shinya Kitaoka 120a6e
      if (selectionMode() != QAbstractItemView::ExtendedSelection)
Shinya Kitaoka 120a6e
        setCurrentIndex(item->createIndex());
Shinya Kitaoka 120a6e
      onClick(item, itemPos, e);
Shinya Kitaoka 120a6e
      openContextMenu(item, e->globalPos());
Shinya Kitaoka 120a6e
    } else if (e->button() == Qt::LeftButton) {
Shinya Kitaoka 120a6e
      m_dragging = true;
Shinya Kitaoka 120a6e
      setMouseTracking(true);
Shinya Kitaoka 120a6e
      onClick(item, itemPos, e);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // for drag & drop
shun-iwasawa 443318
    else if (e->button() == Qt::MiddleButton) {
Shinya Kitaoka 120a6e
      m_dragging = true;
Shinya Kitaoka 120a6e
      setMouseTracking(true);
Shinya Kitaoka 120a6e
      onMidClick(item, itemPos, e);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeView::mouseMoveEvent(QMouseEvent *e) {
Shinya Kitaoka 120a6e
  QTreeView::mouseMoveEvent(e);
Shinya Kitaoka 120a6e
  if (m_dragging) {
Shinya Kitaoka 120a6e
    QModelIndex index = indexAt(e->pos());
Shinya Kitaoka 120a6e
    if (index.isValid()) {
Shinya Kitaoka 120a6e
      TreeModel::Item *item =
Shinya Kitaoka 120a6e
          static_cast<treemodel::item *="">(index.internalPointer());</treemodel::item>
Shinya Kitaoka 120a6e
      QRect itemRect = visualRect(index);
Shinya Kitaoka 120a6e
      QPoint itemPos = e->pos() - itemRect.topLeft();
Shinya Kitaoka 120a6e
      onDrag(item, itemPos, e);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeView::mouseReleaseEvent(QMouseEvent *e) {
Shinya Kitaoka 120a6e
  QTreeView::mouseReleaseEvent(e);
Shinya Kitaoka 120a6e
  if (m_dragging) {
Shinya Kitaoka 120a6e
    m_dragging = false;
Shinya Kitaoka 120a6e
    setMouseTracking(false);
Shinya Kitaoka 120a6e
    onRelease();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Shinya Kitaoka 120a6e
bool TreeView::Delegate::editorEvent(QEvent *e, QAbstractItemModel
Shinya Kitaoka 120a6e
*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);</treemodel>
Toshihiro Shimizu 890ddd
  if(!model || !index.isValid()) return false;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TreeModel::Item *item = static_cast
Shinya Kitaoka 120a6e
*>(index.internalPointer());
Toshihiro Shimizu 890ddd
  QMouseEvent* mouseEvent = dynamic_cast<qmouseevent*>(e);</qmouseevent*>
Toshihiro Shimizu 890ddd
  QPoint pos = mouseEvent->pos();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_treeView->onClick(item, pos, option);
Toshihiro Shimizu 890ddd
  return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/