From 93067f85087a884ab40fde5f8f1eca7f9a3edd37 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Mon, 9 May 2016 16:58:22 +0200
Subject: [PATCH] Experimenting with proxy model

---
 GUI/coregui/Models/FitParameterProxyModel.cpp | 63 ++++++++++++++++---
 GUI/coregui/Models/FitParameterProxyModel.h   | 14 ++++-
 .../Views/FitWidgets/FitParametersWidget.cpp  |  3 +-
 3 files changed, 69 insertions(+), 11 deletions(-)

diff --git a/GUI/coregui/Models/FitParameterProxyModel.cpp b/GUI/coregui/Models/FitParameterProxyModel.cpp
index 51cd8ba18a0..9cd1405c6ec 100644
--- a/GUI/coregui/Models/FitParameterProxyModel.cpp
+++ b/GUI/coregui/Models/FitParameterProxyModel.cpp
@@ -16,14 +16,26 @@
 
 #include "FitParameterProxyModel.h"
 #include "SessionItem.h"
+#include "FitParameterItems.h"
 #include "JobModel.h"
 
-FitParameterProxyModel::FitParameterProxyModel(JobModel *jobModel, QObject *parent)
+//FitParameterProxyModel::FitParameterProxyModel(JobModel *jobModel, FitParameterContainerItem *fitParContainer, QObject *parent)
+//    : QAbstractProxyModel(parent)
+//    , m_jobModel(jobModel)
+//    , m_parContainer(fitParContainer)
+//{
+//    Q_ASSERT(m_jobModel);
+//    Q_ASSERT(m_parContainer);
+//    setSourceModel(m_jobModel);
+//}
+
+FitParameterProxyModel::FitParameterProxyModel(FitParameterContainerItem *fitParContainer, QObject *parent)
     : QAbstractProxyModel(parent)
-    , m_jobModel(jobModel)
+    , m_parContainer(fitParContainer)
 {
-    Q_ASSERT(m_jobModel);
-    setSourceModel(m_jobModel);
+    Q_ASSERT(m_parContainer);
+    setSourceModel(fitParContainer->model());
+
 }
 
 QModelIndex FitParameterProxyModel::index(int row, int column, const QModelIndex &parent) const
@@ -69,6 +81,21 @@ int FitParameterProxyModel::rowCount(const QModelIndex &parent) const
 {
     Q_ASSERT(parent.isValid() ? parent.model() == this : true);
     return sourceModel()->rowCount(mapToSource(parent));
+
+    if(!parent.isValid()) {
+        return m_parContainer->rowCount();
+    }
+
+//    QModelIndex sourceIndex = mapToSource(parent);
+    if (SessionItem *item = this->itemForIndex(parent)) {
+        if(item->modelType() == Constants::FitParameterContainerType ||
+           item->modelType() == Constants::FitParameterType ) {
+            return item->rowCount();
+        }
+    }
+
+    return 0;
+//    return sourceModel()->rowCount(mapToSource(parent));
 }
 
 int FitParameterProxyModel::columnCount(const QModelIndex &parent) const
@@ -85,11 +112,23 @@ QModelIndex FitParameterProxyModel::mapToSource(const QModelIndex &proxyIndex) c
 //    return QModelIndex(proxyIndex.row(), proxyIndex.column(), proxyIndex.internalPointer(), sourceModel());
 //    return sourceModel()->createIndex(proxyIndex.row(), proxyIndex.column(), proxyIndex.internalPointer());
 
-    if (SessionItem *item = this->itemForIndex(proxyIndex))
-        return item->index();
-
+    if (SessionItem *item = this->itemForIndex(proxyIndex)) {
+        QModelIndex sourceParent;
+        if(item->parent()) sourceParent = item->parent()->index();
+        return jobModel()->index(proxyIndex.row(), proxyIndex.column(), sourceParent);
+//        return item->index();
+    }
     return QModelIndex();
 
+//    if(proxyIndex.isValid()) {
+//        const QModelIndex sourceIndex = mapToSource(proxyIndex);
+//        const QModelIndex sourceParent = sourceIndex.parent();
+
+//        return m_jobModel->index(proxyIndex.row(), proxyIndex.column(), sourceParent);
+//    }
+
+//    return QModelIndex();
+
 }
 
 QModelIndex FitParameterProxyModel::mapFromSource(const QModelIndex &sourceIndex) const
@@ -97,6 +136,11 @@ QModelIndex FitParameterProxyModel::mapFromSource(const QModelIndex &sourceIndex
     if (!sourceModel() || !sourceIndex.isValid())
         return QModelIndex();
 
+//    if (SessionItem *item = m_jobModel->itemForIndex(sourceIndex)) {
+
+//    }
+
+
     Q_ASSERT(sourceIndex.model() == sourceModel());
     return createIndex(sourceIndex.row(), sourceIndex.column(), sourceIndex.internalPointer());
 }
@@ -109,3 +153,8 @@ SessionItem *FitParameterProxyModel::itemForIndex(const QModelIndex &index) cons
     }
     return 0;
 }
+
+JobModel *FitParameterProxyModel::jobModel() const
+{
+    return dynamic_cast<JobModel *>(m_parContainer->model());
+}
diff --git a/GUI/coregui/Models/FitParameterProxyModel.h b/GUI/coregui/Models/FitParameterProxyModel.h
index 4801047b44d..751dc58d324 100644
--- a/GUI/coregui/Models/FitParameterProxyModel.h
+++ b/GUI/coregui/Models/FitParameterProxyModel.h
@@ -20,8 +20,11 @@
 #include "WinDllMacros.h"
 #include <QAbstractProxyModel>
 
-class SessionItem;
+//class SessionItem;
+//class JobModel;
 class JobModel;
+class FitParameterContainerItem;
+class SessionItem;
 
 //! The FitParameterProxyModel adopt original JobModel to show items from FitParameterContainer
 //! in 5 column tree view.
@@ -31,7 +34,8 @@ class BA_CORE_API_ FitParameterProxyModel : public QAbstractProxyModel
     Q_OBJECT
 
 public:
-    explicit FitParameterProxyModel(JobModel *jobModel, QObject *parent = 0);
+//    explicit FitParameterProxyModel(JobModel *jobModel, FitParameterContainerItem *fitParContainer, QObject *parent = 0);
+    explicit FitParameterProxyModel(FitParameterContainerItem *fitParContainer, QObject *parent = 0);
 
     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
     QModelIndex parent(const QModelIndex &child) const;
@@ -44,7 +48,11 @@ public:
     SessionItem *itemForIndex(const QModelIndex &index) const;
 
 private:
-    JobModel *m_jobModel;
+    JobModel *jobModel() const;
+
+//    JobModel *m_jobModel;
+    FitParameterContainerItem *m_parContainer;
+//    JobItem *m_jobItem;
 };
 
 
diff --git a/GUI/coregui/Views/FitWidgets/FitParametersWidget.cpp b/GUI/coregui/Views/FitWidgets/FitParametersWidget.cpp
index db505f99aad..101dc912928 100644
--- a/GUI/coregui/Views/FitWidgets/FitParametersWidget.cpp
+++ b/GUI/coregui/Views/FitWidgets/FitParametersWidget.cpp
@@ -252,7 +252,8 @@ void FitParametersWidget::init_job_item()
     m_fitParameterModel->createFitParameter();
     spanParameters();
 
-    FitParameterProxyModel *proxy = new FitParameterProxyModel(dynamic_cast<JobModel *>(m_jobItem->model()));
+//    FitParameterProxyModel *proxy = new FitParameterProxyModel(dynamic_cast<JobModel *>(m_jobItem->model()), parsContainerItem);
+    FitParameterProxyModel *proxy = new FitParameterProxyModel(m_jobItem->fitParameterContainerItem());
     m_treeView->setModel(proxy);
 
 
-- 
GitLab