3 #include "ImagePointTreeModel.h"
8 #include <QFutureWatcher>
10 #include <QModelIndex>
12 #include <QtConcurrentMap>
20 #include "TreeViewContent.h"
21 #include "PointLeafItem.h"
23 #include "ImageParentItem.h"
33 ImagePointTreeModel::ImagePointTreeModel(ControlNet *controlNet,
35 AbstractTreeModel(controlNet, v, parent) {
40 ImagePointTreeModel::~ImagePointTreeModel() {
44 ImagePointTreeModel::CreateRootItemFunctor::CreateRootItemFunctor(
45 AbstractTreeModel *tm,
QThread *tt) {
48 m_avgCharWidth = QFontMetrics(
49 m_treeModel->getView()->getContentFont()).averageCharWidth();
53 ImagePointTreeModel::CreateRootItemFunctor::CreateRootItemFunctor(
54 const CreateRootItemFunctor &other) {
55 m_treeModel = other.m_treeModel;
56 m_targetThread = other.m_targetThread;
57 m_avgCharWidth = other.m_avgCharWidth;
61 ImagePointTreeModel::CreateRootItemFunctor::~CreateRootItemFunctor() {
62 m_targetThread = NULL;
67 ImageParentItem *ImagePointTreeModel::CreateRootItemFunctor::operator()(
68 ControlCubeGraphNode *
const &node)
const {
69 ImageParentItem *imageItem = NULL;
71 imageItem =
new ImageParentItem(node, m_avgCharWidth);
72 imageItem->setSelectable(
false);
73 imageItem->moveToThread(m_targetThread);
75 for (
int j = 0; j < measures.size(); j++) {
77 ControlPoint *point = measures[j]->Parent();
80 PointLeafItem *pointItem =
new PointLeafItem(
81 point, m_avgCharWidth, imageItem);
82 pointItem->setSelectable(
false);
83 pointItem->moveToThread(m_targetThread);
85 imageItem->addChild(pointItem);
92 void ImagePointTreeModel::CreateRootItemFunctor::addToRootItem(
96 if (root.testAndSetOrdered(NULL,
new RootItem)) {
97 root.loadAcquire()->moveToThread(item->thread());
101 root.loadAcquire()->addChild(item);
105 ImagePointTreeModel::CreateRootItemFunctor &
106 ImagePointTreeModel::CreateRootItemFunctor::operator=(
107 const CreateRootItemFunctor &other) {
108 if (
this != &other) {
109 m_treeModel = other.m_treeModel;
110 m_avgCharWidth = other.m_avgCharWidth;
117 void ImagePointTreeModel::rebuildItems() {
123 QFuture< QAtomicPointer< RootItem > > futureRoot;
124 if (getRebuildWatcher()->isStarted()) {
125 futureRoot = getRebuildWatcher()->future();
132 futureRoot = QtConcurrent::mappedReduced(
133 getControlNetwork()->GetCubeGraphNodes(),
134 CreateRootItemFunctor(
this, QThread::currentThread()),
135 &CreateRootItemFunctor::addToRootItem,
136 QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);
138 getRebuildWatcher()->setFuture(futureRoot);
void filterCountsChanged(int visibleTopLevelItemCount, int topLevelItemCount)
This signal is emitted after filtering to provide the number of visible top-level items remaining aft...