Isis 3 Programmer Reference
ImagePointTreeModel.cpp
1
7/* SPDX-License-Identifier: CC0-1.0 */
8
9#include "ImagePointTreeModel.h"
10
11#include <iostream>
12
13#include <QFuture>
14#include <QFutureWatcher>
15#include <QList>
16#include <QModelIndex>
17#include <QString>
18#include <QtConcurrentMap>
19
20#include "ControlMeasure.h"
21#include "ControlNet.h"
22#include "ControlPoint.h"
23
24#include "TreeView.h"
25#include "TreeViewContent.h"
26#include "PointLeafItem.h"
27#include "RootItem.h"
28#include "ImageParentItem.h"
29
30#include <QTime>
31
32
33using std::cerr;
34
35
36namespace Isis {
37 ImagePointTreeModel::ImagePointTreeModel(ControlNet *controlNet,
38 TreeView *v, QObject *parent) :
39 AbstractTreeModel(controlNet, v, parent) {
40 rebuildItems();
41 }
42
43
44 ImagePointTreeModel::~ImagePointTreeModel() {
45 }
46
47
48 ImagePointTreeModel::CreateRootItemFunctor::CreateRootItemFunctor(
49 AbstractTreeModel *tm, ControlNet *net, QThread *tt) {
50 m_treeModel = tm;
51 m_controlNet = net;
52 m_targetThread = tt;
53 m_avgCharWidth = QFontMetrics(
54 m_treeModel->getView()->getContentFont()).averageCharWidth();
55 }
56
57
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;
64 }
65
66
67 ImagePointTreeModel::CreateRootItemFunctor::~CreateRootItemFunctor() {
68 m_targetThread = NULL;
69 m_controlNet = NULL;
70 m_treeModel = NULL;
71 }
72
73
74 ImageParentItem *ImagePointTreeModel::CreateRootItemFunctor::operator()(
75 QString imageSerial) const {
76 ImageParentItem *imageItem = NULL;
77
78 // TODO connect parent item destroy to image removed from network
79
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();
86
87 PointLeafItem *pointItem = new PointLeafItem(
88 point, m_avgCharWidth, imageItem);
89 pointItem->setSelectable(false);
90 pointItem->moveToThread(m_targetThread);
91
92 imageItem->addChild(pointItem);
93 }
94
95 return imageItem;
96 }
97
98
99 void ImagePointTreeModel::CreateRootItemFunctor::addToRootItem(
100 QAtomicPointer< RootItem > & root, ImageParentItem *const &item) {
101
102 // Allocate a new root item if our root is NULL
103 if (root.testAndSetOrdered(NULL, new RootItem)) {
104 root.loadAcquire()->moveToThread(item->thread());
105 }
106
107 if (item)
108 root.loadAcquire()->addChild(item);
109 }
110
111
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;
118 }
119
120 return *this;
121 }
122
123
124 void ImagePointTreeModel::rebuildItems() {
125 // cerr << "ImagePointTreeModel::rebuildItems\n";
126 if (!isFrozen()) {
127 emit cancelSort();
128 setRebuilding(true);
129 emit filterCountsChanged(-1, getTopLevelItemCount());
130 QFuture< QAtomicPointer< RootItem > > futureRoot;
131 if (getRebuildWatcher()->isStarted()) {
132 futureRoot = getRebuildWatcher()->future();
133 futureRoot.cancel();
134 // futureRoot.waitForFinished();
135 // if (futureRoot.result())
136 // delete futureRoot.result();
137 }
138
139 futureRoot = QtConcurrent::mappedReduced(
140 getControlNetwork()->GetCubeSerials(),
141 CreateRootItemFunctor(this, getControlNetwork(), QThread::currentThread()),
142 &CreateRootItemFunctor::addToRootItem,
143 QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);
144
145 getRebuildWatcher()->setFuture(futureRoot);
146 }
147 else {
148 queueRebuild();
149 }
150 // cerr << "/ImagePointTreeModel::rebuildItems\n";
151 }
152}
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16