File failed to load: https://isis.astrogeology.usgs.gov/9.0.0/Object/assets/jax/output/NativeMML/config.js
Isis 3 Programmer Reference
ImagePointTreeModel.cpp
1
6
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}
Base class for tree models.
a control network
Definition ControlNet.h:258
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16