|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef _FUNCTIONTREEMODEL_
|
|
Toshihiro Shimizu |
890ddd |
#define _FUNCTIONTREEMODEL_
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tcommon.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#undef DVAPI
|
|
Toshihiro Shimizu |
890ddd |
#undef DVVAR
|
|
Toshihiro Shimizu |
890ddd |
#ifdef TOONZQT_EXPORTS
|
|
Toshihiro Shimizu |
890ddd |
#define DVAPI DV_EXPORT_API
|
|
Toshihiro Shimizu |
890ddd |
#define DVVAR DV_EXPORT_VAR
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
#define DVAPI DV_IMPORT_API
|
|
Toshihiro Shimizu |
890ddd |
#define DVVAR DV_IMPORT_VAR
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <qlist></qlist>
|
|
Toshihiro Shimizu |
890ddd |
#include <qvariant></qvariant>
|
|
Toshihiro Shimizu |
890ddd |
#include <qabstractitemmodel></qabstractitemmodel>
|
|
Toshihiro Shimizu |
890ddd |
#include <qmodelindex></qmodelindex>
|
|
Toshihiro Shimizu |
890ddd |
#include <qtreeview></qtreeview>
|
|
Toshihiro Shimizu |
890ddd |
#include <qitemdelegate></qitemdelegate>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
class TreeView;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//! generic tree model. It maintains internally a tree structure
|
|
Toshihiro Shimizu |
890ddd |
//! of TreeModel::Item's. Each QModelIndex created by the TreeModel
|
|
Toshihiro Shimizu |
890ddd |
//! points internally to the corrispondent TreeModel::Item
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TreeModel : public QAbstractItemModel {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
class DVAPI Item {
|
|
Shinya Kitaoka |
120a6e |
public:
|
|
Shinya Kitaoka |
120a6e |
Item();
|
|
Shinya Kitaoka |
120a6e |
virtual ~Item();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
Item *getParent() const { return m_parent; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int getChildCount() const { return m_childItems.count(); }
|
|
Shinya Kitaoka |
120a6e |
Item *getChild(int row) const { return m_childItems.value(row); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
Item *appendChild(Item *child); // gets ownership; returns child
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! see setChildren() below
|
|
Shinya Kitaoka |
120a6e |
virtual void *getInternalPointer() const { return 0; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Replace old children with new ones.
|
|
Shinya Kitaoka |
120a6e |
// If old and new child internalPointer are equal
|
|
Shinya Kitaoka |
120a6e |
// and not zero then the old child is used and the new one
|
|
Shinya Kitaoka |
120a6e |
// is discarded
|
|
Shinya Kitaoka |
120a6e |
// This method is used to "refresh" the child list.
|
|
Shinya Kitaoka |
120a6e |
// Take ownership of children
|
|
Shinya Kitaoka |
120a6e |
// After the call 'children' contains the new children only
|
|
Shinya Kitaoka |
120a6e |
// Unused old child are queued into m_itemsToDelete. They will eventually
|
|
Shinya Kitaoka |
120a6e |
// be deleted by endRefresh()
|
|
Shinya Kitaoka |
120a6e |
void setChildren(QList<item *=""> &children);</item>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// called by setChildren on "used" old child
|
|
Shinya Kitaoka |
120a6e |
virtual void refresh() {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TreeModel *getModel() const { return m_model; }
|
|
Shinya Kitaoka |
120a6e |
void setModel(TreeModel *model) { m_model = model; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! row is the Item index in the parent. (used by QModelIndex)
|
|
Shinya Kitaoka |
120a6e |
int getRow() const { return m_row; }
|
|
Shinya Kitaoka |
120a6e |
void setRow(int row) { m_row = row; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! root_depth == 0; son_depth == parent_depth + 1
|
|
Shinya Kitaoka |
120a6e |
int getDepth() const { return m_depth; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool isOpen() const { return m_opened; }
|
|
Shinya Kitaoka |
120a6e |
void setIsOpen(bool opened) { m_opened = opened; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! used by TreeModel::data(); default implementation provides
|
|
Shinya Kitaoka |
120a6e |
//! open/close folder icons
|
|
Shinya Kitaoka |
120a6e |
virtual QVariant data(int role) const;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QModelIndex createIndex();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
private:
|
|
Shinya Kitaoka |
120a6e |
// update children data (e.g.: parent, model, depth and row)
|
|
Shinya Kitaoka |
120a6e |
void updateChild(Item *child, int row);
|
|
Shinya Kitaoka |
120a6e |
void updateChildren(); // Note: is not ricursive, i.e. doesn't call itself
|
|
Shinya Kitaoka |
120a6e |
// on children
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TreeModel *m_model;
|
|
Shinya Kitaoka |
120a6e |
Item *m_parent;
|
|
Shinya Kitaoka |
120a6e |
QList<item *=""> m_childItems;</item>
|
|
Shinya Kitaoka |
120a6e |
int m_depth;
|
|
Shinya Kitaoka |
120a6e |
int m_row;
|
|
Shinya Kitaoka |
120a6e |
bool m_opened;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
public:
|
|
Shinya Kitaoka |
120a6e |
// int index() const {return
|
|
Shinya Kitaoka |
120a6e |
// (m_parent)?m_parent->m_childItems.indexOf(const_cast<item*>(this)):0;}</item*>
|
|
Shinya Kitaoka |
120a6e |
}; // class Item
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TreeModel(TreeView *parent = 0);
|
|
Shinya Kitaoka |
120a6e |
virtual ~TreeModel();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void setExpandedItem(const QModelIndex &index, bool expanded);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TreeView *getView() { return m_view; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public slots:
|
|
Shinya Kitaoka |
120a6e |
virtual void onExpanded(const QModelIndex &index);
|
|
Shinya Kitaoka |
120a6e |
virtual void onCollapsed(const QModelIndex &index);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! to update the model:
|
|
Shinya Kitaoka |
120a6e |
//! beginRefresh(),
|
|
Shinya Kitaoka |
120a6e |
//! Item::setChildren() and/or Item::appendChild() and/or setRootItem(),
|
|
Shinya Kitaoka |
120a6e |
//! endRefresh().
|
|
Shinya Kitaoka |
120a6e |
void beginRefresh();
|
|
Shinya Kitaoka |
120a6e |
void endRefresh();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// const QList<item*> &getItemsToDelete() const {return m_itemsToDelete;}</item*>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
|
Shinya Kitaoka |
120a6e |
QModelIndex index(int row, int column,
|
|
Shinya Kitaoka |
473e70 |
const QModelIndex &parent = QModelIndex()) const override;
|
|
Shinya Kitaoka |
473e70 |
QModelIndex parent(const QModelIndex &index) const override;
|
|
Shinya Kitaoka |
473e70 |
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
Shinya Kitaoka |
473e70 |
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
Shinya Kitaoka |
473e70 |
QVariant data(const QModelIndex &index, int role) const override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void setRowHidden(int row, const QModelIndex &parent, bool hide);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
void setRootItem(Item *rootItem);
|
|
Shinya Kitaoka |
120a6e |
Item *getRootItem() const { return m_rootItem; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Shinya Kitaoka |
120a6e |
Item *m_rootItem;
|
|
Shinya Kitaoka |
120a6e |
QList<item *=""> m_itemsToDelete;</item>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
TreeView *m_view;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//----------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TreeView : public QTreeView {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Shinya Kitaoka |
120a6e |
bool m_dragging;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
TreeView(QWidget *parent);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
d1f6c4 |
class Delegate final : public QItemDelegate
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
public:
|
|
Shinya Kitaoka |
120a6e |
Delegate(TreeView *parent) : QItemDelegate(parent), m_treeView(parent) {}
|
|
Shinya Kitaoka |
120a6e |
bool editorEvent(QEvent *e, QAbstractItemModel *model, const
|
|
Shinya Kitaoka |
120a6e |
QStyleOptionViewItem &option, const QModelIndex &index);
|
|
Shinya Kitaoka |
120a6e |
private:
|
|
Shinya Kitaoka |
120a6e |
TreeView *m_treeView;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
friend Delegate;
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// virtual void onClick(TreeModel::Item *item, const QPoint &pos, const
|
|
Shinya Kitaoka |
120a6e |
// QStyleOptionViewItem &option) {}
|
|
Shinya Kitaoka |
473e70 |
void mouseDoubleClickEvent(QMouseEvent *) override;
|
|
Shinya Kitaoka |
473e70 |
void mousePressEvent(QMouseEvent *) override;
|
|
Shinya Kitaoka |
473e70 |
void mouseReleaseEvent(QMouseEvent *) override;
|
|
Shinya Kitaoka |
473e70 |
void mouseMoveEvent(QMouseEvent *) override;
|
|
Shinya Kitaoka |
473e70 |
void resizeEvent(QResizeEvent *) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void setModel(TreeModel *model);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
virtual void onClick(TreeModel::Item *item, const QPoint &itemPos,
|
|
Shinya Kitaoka |
120a6e |
QMouseEvent *e) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void onDrag(TreeModel::Item *item, const QPoint &itemPos,
|
|
Shinya Kitaoka |
120a6e |
QMouseEvent *e) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void onRelease() {}
|
|
Shinya Kitaoka |
120a6e |
virtual void onMidClick(TreeModel::Item *item, const QPoint &itemPos,
|
|
Shinya Kitaoka |
120a6e |
QMouseEvent *e) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
virtual void openContextMenu(TreeModel::Item *item, const QPoint &globalPos) {
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public slots:
|
|
Shinya Kitaoka |
120a6e |
void resizeToConts(void);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#endif
|