3 #include "ImageImageTreeModel.h"
8 #include <QFutureWatcher>
11 #include <QtConcurrentMap>
18 #include "TreeViewContent.h"
19 #include "PointLeafItem.h"
21 #include "ImageLeafItem.h"
22 #include "ImageParentItem.h"
32 ImageImageTreeModel::ImageImageTreeModel(ControlNet *cNet, TreeView *v,
33 QObject *parent) : AbstractTreeModel(cNet, v, parent) {
38 ImageImageTreeModel::~ImageImageTreeModel() {
42 ImageImageTreeModel::CreateRootItemFunctor::CreateRootItemFunctor(
43 AbstractTreeModel *tm,
QThread *tt) {
46 m_avgCharWidth = QFontMetrics(
47 m_treeModel->getView()->getContentFont()).averageCharWidth();
51 ImageImageTreeModel::CreateRootItemFunctor::CreateRootItemFunctor(
52 const CreateRootItemFunctor &other) {
53 m_treeModel = other.m_treeModel;
54 m_targetThread = other.m_targetThread;
55 m_avgCharWidth = other.m_avgCharWidth;
59 ImageImageTreeModel::CreateRootItemFunctor::~CreateRootItemFunctor() {
61 m_targetThread = NULL;
65 ImageParentItem *ImageImageTreeModel::CreateRootItemFunctor::operator()(
66 ControlCubeGraphNode *
const &node)
const {
67 ImageParentItem *parentItem =
68 new ImageParentItem(node, m_avgCharWidth);
69 parentItem->setSelectable(
false);
70 parentItem->moveToThread(m_targetThread);
74 for (
int j = 0; j < connectedNodes.size(); j++) {
75 ControlCubeGraphNode *connectedNode = connectedNodes[j];
76 ImageLeafItem *serialItem =
77 new ImageLeafItem(connectedNode, m_avgCharWidth, parentItem);
78 serialItem->setSelectable(
false);
79 serialItem->moveToThread(m_targetThread);
81 parentItem->addChild(serialItem);
88 void ImageImageTreeModel::CreateRootItemFunctor::addToRootItem(
92 if (root.testAndSetOrdered(NULL,
new RootItem)) {
93 root.loadAcquire()->moveToThread(item->thread());
97 root.loadAcquire()->addChild(item);
101 ImageImageTreeModel::CreateRootItemFunctor &
102 ImageImageTreeModel::CreateRootItemFunctor::operator=(
103 const CreateRootItemFunctor &other) {
104 if (
this != &other) {
105 m_treeModel = other.m_treeModel;
106 m_avgCharWidth = other.m_avgCharWidth;
113 void ImageImageTreeModel::rebuildItems() {
119 QFuture< QAtomicPointer< RootItem > > futureRoot;
121 if (getRebuildWatcher()->isStarted()) {
122 futureRoot = getRebuildWatcher()->future();
129 futureRoot = QtConcurrent::mappedReduced(
130 getControlNetwork()->GetCubeGraphNodes(),
131 CreateRootItemFunctor(
this, QThread::currentThread()),
132 &CreateRootItemFunctor::addToRootItem,
133 QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);
135 getRebuildWatcher()->setFuture(futureRoot);
void filterCountsChanged(int visibleTopLevelItemCount, int topLevelItemCount)
This signal is emitted after filtering to provide the number of visible top-level items remaining aft...