9#include "ImagePointTreeModel.h"
14#include <QFutureWatcher>
18#include <QtConcurrentMap>
20#include "ControlMeasure.h"
21#include "ControlNet.h"
22#include "ControlPoint.h"
25#include "TreeViewContent.h"
26#include "PointLeafItem.h"
28#include "ImageParentItem.h"
37 ImagePointTreeModel::ImagePointTreeModel(ControlNet *controlNet,
39 AbstractTreeModel(controlNet, v, parent) {
44 ImagePointTreeModel::~ImagePointTreeModel() {
48 ImagePointTreeModel::CreateRootItemFunctor::CreateRootItemFunctor(
49 AbstractTreeModel *tm, ControlNet *net,
QThread *tt) {
53 m_avgCharWidth = QFontMetrics(
54 m_treeModel->getView()->getContentFont()).averageCharWidth();
58 ImagePointTreeModel::CreateRootItemFunctor::CreateRootItemFunctor(
59 const CreateRootItemFunctor &other) {
60 m_treeModel = other.m_treeModel;
61 m_controlNet = other.m_controlNet;
62 m_targetThread = other.m_targetThread;
63 m_avgCharWidth = other.m_avgCharWidth;
67 ImagePointTreeModel::CreateRootItemFunctor::~CreateRootItemFunctor() {
68 m_targetThread = NULL;
74 ImageParentItem *ImagePointTreeModel::CreateRootItemFunctor::operator()(
75 QString imageSerial)
const {
76 ImageParentItem *imageItem = NULL;
80 imageItem =
new ImageParentItem(imageSerial, m_controlNet, m_avgCharWidth);
81 imageItem->setSelectable(
false);
82 imageItem->moveToThread(m_targetThread);
83 QList< ControlMeasure * > measures = m_controlNet->GetMeasuresInCube(imageSerial);
84 for (
int j = 0; j < measures.size(); j++) {
85 ControlPoint *point = measures[j]->Parent();
87 PointLeafItem *pointItem =
new PointLeafItem(
88 point, m_avgCharWidth, imageItem);
89 pointItem->setSelectable(
false);
90 pointItem->moveToThread(m_targetThread);
92 imageItem->addChild(pointItem);
99 void ImagePointTreeModel::CreateRootItemFunctor::addToRootItem(
100 QAtomicPointer< RootItem > & root, ImageParentItem *
const &item) {
103 if (root.testAndSetOrdered(NULL,
new RootItem)) {
104 root.loadAcquire()->moveToThread(item->thread());
108 root.loadAcquire()->addChild(item);
112 ImagePointTreeModel::CreateRootItemFunctor &
113 ImagePointTreeModel::CreateRootItemFunctor::operator=(
114 const CreateRootItemFunctor &other) {
115 if (
this != &other) {
116 m_treeModel = other.m_treeModel;
117 m_avgCharWidth = other.m_avgCharWidth;
124 void ImagePointTreeModel::rebuildItems() {
129 emit filterCountsChanged(-1, getTopLevelItemCount());
130 QFuture< QAtomicPointer< RootItem > > futureRoot;
131 if (getRebuildWatcher()->isStarted()) {
132 futureRoot = getRebuildWatcher()->future();
139 futureRoot = QtConcurrent::mappedReduced(
140 getControlNetwork()->GetCubeSerials(),
141 CreateRootItemFunctor(
this, getControlNetwork(), QThread::currentThread()),
142 &CreateRootItemFunctor::addToRootItem,
143 QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);
145 getRebuildWatcher()->setFuture(futureRoot);
This is free and unencumbered software released into the public domain.