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