Isis 3.0 Programmer Reference
Back | Home
ImagePointTreeModel.cpp
1 #include "IsisDebug.h"
2 
3 #include "ImagePointTreeModel.h"
4 
5 #include <iostream>
6 
7 #include <QFuture>
8 #include <QFutureWatcher>
9 #include <QList>
10 #include <QModelIndex>
11 #include <QString>
12 #include <QtConcurrentMap>
13 
14 #include "ControlCubeGraphNode.h"
15 #include "ControlMeasure.h"
16 #include "ControlNet.h"
17 #include "ControlPoint.h"
18 
19 #include "TreeView.h"
20 #include "TreeViewContent.h"
21 #include "PointLeafItem.h"
22 #include "RootItem.h"
23 #include "ImageParentItem.h"
24 
25 #include <QTime>
26 
27 
28 using std::cerr;
29 
30 
31 namespace Isis {
32  namespace CnetViz {
33  ImagePointTreeModel::ImagePointTreeModel(ControlNet *controlNet,
34  TreeView *v, QObject *parent) :
35  AbstractTreeModel(controlNet, v, parent) {
36  rebuildItems();
37  }
38 
39 
40  ImagePointTreeModel::~ImagePointTreeModel() {
41  }
42 
43 
44  ImagePointTreeModel::CreateRootItemFunctor::CreateRootItemFunctor(
45  AbstractTreeModel *tm, QThread *tt) {
46  m_treeModel = tm;
47  m_targetThread = tt;
48  m_avgCharWidth = QFontMetrics(
49  m_treeModel->getView()->getContentFont()).averageCharWidth();
50  }
51 
52 
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;
58  }
59 
60 
61  ImagePointTreeModel::CreateRootItemFunctor::~CreateRootItemFunctor() {
62  m_targetThread = NULL;
63  m_treeModel = NULL;
64  }
65 
66 
67  ImageParentItem *ImagePointTreeModel::CreateRootItemFunctor::operator()(
68  ControlCubeGraphNode *const &node) const {
69  ImageParentItem *imageItem = NULL;
70 
71  imageItem = new ImageParentItem(node, m_avgCharWidth);
72  imageItem->setSelectable(false);
73  imageItem->moveToThread(m_targetThread);
74  QList< ControlMeasure * > measures = node->getMeasures();
75  for (int j = 0; j < measures.size(); j++) {
76  ASSERT(measures[j]);
77  ControlPoint *point = measures[j]->Parent();
78 
79  ASSERT(point);
80  PointLeafItem *pointItem = new PointLeafItem(
81  point, m_avgCharWidth, imageItem);
82  pointItem->setSelectable(false);
83  pointItem->moveToThread(m_targetThread);
84 
85  imageItem->addChild(pointItem);
86  }
87 
88  return imageItem;
89  }
90 
91 
92  void ImagePointTreeModel::CreateRootItemFunctor::addToRootItem(
93  QAtomicPointer< RootItem > & root, ImageParentItem *const &item) {
94 
95  // Allocate a new root item if our root is NULL
96  if (root.testAndSetOrdered(NULL, new RootItem)) {
97  root.loadAcquire()->moveToThread(item->thread());
98  }
99 
100  if (item)
101  root.loadAcquire()->addChild(item);
102  }
103 
104 
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;
111  }
112 
113  return *this;
114  }
115 
116 
117  void ImagePointTreeModel::rebuildItems() {
118  // cerr << "ImagePointTreeModel::rebuildItems\n";
119  if (!isFrozen()) {
120  emit cancelSort();
121  setRebuilding(true);
122  emit filterCountsChanged(-1, getTopLevelItemCount());
123  QFuture< QAtomicPointer< RootItem > > futureRoot;
124  if (getRebuildWatcher()->isStarted()) {
125  futureRoot = getRebuildWatcher()->future();
126  futureRoot.cancel();
127  // futureRoot.waitForFinished();
128  // if (futureRoot.result())
129  // delete futureRoot.result();
130  }
131 
132  futureRoot = QtConcurrent::mappedReduced(
133  getControlNetwork()->GetCubeGraphNodes(),
134  CreateRootItemFunctor(this, QThread::currentThread()),
135  &CreateRootItemFunctor::addToRootItem,
136  QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);
137 
138  getRebuildWatcher()->setFuture(futureRoot);
139  }
140  else {
141  queueRebuild();
142  }
143  // cerr << "/ImagePointTreeModel::rebuildItems\n";
144  }
145  }
146 }
void filterCountsChanged(int visibleTopLevelItemCount, int topLevelItemCount)
This signal is emitted after filtering to provide the number of visible top-level items remaining aft...

U.S. Department of the Interior | U.S. Geological Survey
ISIS | Privacy & Disclaimers | Astrogeology Research Program
To contact us, please post comments and questions on the ISIS Support Center
File Modified: 07/12/2023 23:20:17