Salome HOME
Add license
[modules/hexablock.git] / src / HEXABLOCKGUI / klinkitemselectionmodel.hxx
1 /*
2     Copyright (C) 2010 Klarälvdalens Datakonsult AB,
3         a KDAB Group company, info@kdab.net,
4         author Stephen Kelly <stephen@kdab.com>
5
6     This library is free software; you can redistribute it and/or modify it
7     under the terms of the GNU Library General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or (at your
9     option) any later version.
10
11     This library is distributed in the hope that it will be useful, but WITHOUT
12     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
14     License for more details.
15
16     You should have received a copy of the GNU Library General Public License
17     along with this library; see the file COPYING.LIB.  If not, write to the
18     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19     02110-1301, USA.
20 */
21
22 #ifndef KLINKITEMSELECTIONMODEL_H
23 #define KLINKITEMSELECTIONMODEL_H
24
25 #include "HEXABLOCKGUI_Export.hxx"
26
27 #include <QObject>
28 #include <QItemSelectionModel>
29 #include <QAbstractProxyModel>
30
31 #include <iostream>
32
33 // #include "kdeui_export.h"
34 // #include "klinkitemselectionmodel_p.hxx"
35
36 #include "hexa_base.hxx"
37 #include "kmodelindexproxymapper.hxx"
38
39 class KLinkItemSelectionModelPrivate;
40
41 class HEXABLOCK_EXPORT KLinkItemSelectionModel : public QItemSelectionModel
42 {
43     Q_OBJECT
44 public:
45     KLinkItemSelectionModel(QAbstractItemModel *targetModel, QItemSelectionModel *linkedItemSelectionModel, QObject *parent = 0);
46     ~KLinkItemSelectionModel();
47     /* reimp */ void select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command);
48     /* reimp */ void select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command);
49
50 protected:
51     KLinkItemSelectionModelPrivate * const d_ptr;
52
53 private:
54     Q_DECLARE_PRIVATE(KLinkItemSelectionModel)
55     Q_PRIVATE_SLOT( d_func(), void sourceSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected))
56
57 };
58
59 class KLinkItemSelectionModelPrivate
60 {
61 public:
62     KLinkItemSelectionModelPrivate(KLinkItemSelectionModel *proxySelectionModel, QAbstractItemModel *model,
63                                     QItemSelectionModel *linkedItemSelectionModel)
64       : q_ptr(proxySelectionModel),
65         m_model(model),
66         m_linkedItemSelectionModel(linkedItemSelectionModel),
67         m_ignoreCurrentChanged(false),
68         m_indexMapper(new KModelIndexProxyMapper(model, linkedItemSelectionModel->model(), proxySelectionModel))
69     {
70     }
71
72     Q_DECLARE_PUBLIC(KLinkItemSelectionModel)
73     KLinkItemSelectionModel * const q_ptr;
74
75
76     bool assertSelectionValid(const QItemSelection &selection) const {
77       foreach(const QItemSelectionRange &range, selection) {
78 //         if (!range.isValid()) {
79 //           kDebug() << selection;
80 //         }
81         
82         Q_ASSERT(range.isValid());
83       }
84       return true;
85     }
86
87 void sourceSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected)
88 {
89
90     
91     Q_Q(KLinkItemSelectionModel);
92     QItemSelection _selected = selected;
93     QItemSelection _deselected = deselected;
94     Q_ASSERT(assertSelectionValid(_selected));
95     Q_ASSERT(assertSelectionValid(_deselected));
96
97 //     std::cout << "XXXXXXXXXXXXX  _selected.count() "   << _selected.count() << std::endl;
98 //     std::cout << "XXXXXXXXXXXXX  _deselected.count() " << _deselected.count() << std::endl;
99
100     const QItemSelection mappedDeselection = m_indexMapper->mapSelectionRightToLeft(_deselected);
101     const QItemSelection mappedSelection   = m_indexMapper->mapSelectionRightToLeft(_selected);
102
103 //     const QItemSelection mappedDeselection = _deselected;
104 //     const QItemSelection mappedSelection   = _selected;
105
106 //     std::cout << "XXXXXXXXXXXXX  mappedSelection.count() "   << mappedSelection.count() << std::endl;
107 //     std::cout << "XXXXXXXXXXXXX  mappedDeselection.count() " << mappedDeselection.count() << std::endl;
108
109     q->QItemSelectionModel::select(mappedDeselection, QItemSelectionModel::Deselect);
110     q->QItemSelectionModel::select(mappedSelection, QItemSelectionModel::Select);
111
112 //     q->select(mappedDeselection, QItemSelectionModel::Deselect);
113 //     q->select(mappedSelection, QItemSelectionModel::Select);
114
115
116 }
117
118     QAbstractItemModel * const m_model;
119     QItemSelectionModel * const m_linkedItemSelectionModel;
120     bool m_ignoreCurrentChanged;
121     KModelIndexProxyMapper * const m_indexMapper;
122 };
123
124
125
126 #endif