1 // Copyright (C) 2013-2020 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "CurveCreator_TreeView.h"
21 #include "CurveCreator_ICurve.hxx"
22 #include "CurveCreator_Curve.hxx"
23 #include "CurveCreator_Utils.hxx"
25 #include <SUIT_Session.h>
26 #include <SUIT_ResourceMgr.h>
28 #include <QHeaderView>
29 #include <QtAlgorithms>
33 CurveCreator_TreeViewModel::CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent, bool toDrawColorIcon ) :
34 QAbstractItemModel(parent), myCurve(theCurve), myDrawColorIcon(toDrawColorIcon)
36 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
37 QPixmap aSplineIcon(aResMgr->loadPixmap("GEOM", tr("ICON_CC_SPLINE")));
38 QPixmap aPolylineIcon(aResMgr->loadPixmap("GEOM", tr("ICON_CC_POLYLINE")));
39 QPixmap aClosedSplineIcon(aResMgr->loadPixmap("GEOM", tr("ICON_CC_CLOSED_SPLINE")));
40 QPixmap aClosedPolylineIcon(aResMgr->loadPixmap("GEOM", tr("ICON_CC_CLOSED_POLYLINE")));
41 QPixmap aPointIcon(aResMgr->loadPixmap("GEOM", tr("ICON_CC_POINT")));
43 /* QPixmap aSplineIcon(tr(":images/ICON_SPLINE"));
44 QPixmap aPolylineIcon(tr(":images/ICON_POLYLINE"));
45 QPixmap aClosedPolylineIcon(tr(":images/ICON_CLOSED_POLYLINE"));
46 QPixmap aClosedSplineIcon(tr(":images/ICON_CLOSED_SPLINE"));
47 QPixmap aPointIcon(tr(":images/ICON_POINT")); */
49 if( !aSplineIcon.isNull() )
50 myCachedIcons[ICON_SPLINE] = aSplineIcon;
52 if( !aPolylineIcon.isNull() )
53 myCachedIcons[ICON_POLYLINE] = aPolylineIcon;
55 if( !aPolylineIcon.isNull() )
56 myCachedIcons[ICON_CLOSED_POLYLINE] = aClosedPolylineIcon;
58 if( !aPolylineIcon.isNull() )
59 myCachedIcons[ICON_CLOSED_SPLINE] = aClosedSplineIcon;
61 if( !aPointIcon.isNull() )
62 myCachedIcons[ICON_POINT] = aPointIcon;
64 setHeaderData(1, Qt::Horizontal, QVariant("Name"), Qt::DisplayRole);
65 setHeaderData(2, Qt::Horizontal, QVariant("Nb points"), Qt::DisplayRole);
68 int CurveCreator_TreeViewModel::columnCount(const QModelIndex & parent ) const
76 QVariant CurveCreator_TreeViewModel::data(const QModelIndex & index, int role ) const
78 int aRow = index.row();
79 int aColumn = index.column();
81 if( index.internalId() == (quintptr)ID_SECTION ){
82 if( role == Qt::DisplayRole ){
84 return QString::fromStdString(myCurve->getSectionName(aRow));
85 else if( aColumn == 1 )
86 return QString::number(myCurve->getNbPoints(aRow));
89 else if( role == Qt::DecorationRole ){
91 CurveCreator::SectionType aSectionType = myCurve->getSectionType(aRow);
92 if( aSectionType == CurveCreator::Polyline ){
93 if( myCurve->isClosed(aRow) ){
94 return myCachedIcons[ICON_CLOSED_POLYLINE];
97 return myCachedIcons[ICON_POLYLINE];
101 if( myCurve->isClosed(aRow) ){
102 return myCachedIcons[ICON_CLOSED_SPLINE];
105 return myCachedIcons[ICON_SPLINE];
109 else if (myDrawColorIcon && aColumn == 2)
111 Quantity_Color color = ((CurveCreator_Curve*)myCurve)->getColorSection(aRow);
112 QPixmap pixmap(16,16);
113 pixmap.fill( CurveCreator_Utils::colorConv(color));
119 if( role == Qt::DisplayRole ){
123 else if( aColumn == 0 ){
124 CurveCreator::Coordinates aCoords = myCurve->getCoordinates(index.internalId(),index.row() );
126 if( myCurve->getDimension() == CurveCreator::Dim2d ){
127 anOut = QString(tr("X=%1, Y=%2")).arg(aCoords[0]).arg(aCoords[1]);
130 anOut = QString(tr("X=%1, Y=%2, Z=%3")).arg(aCoords[0]).arg(aCoords[1]).arg(aCoords[2]);
135 else if( role == Qt::DecorationRole ){
137 return myCachedIcons[ICON_POINT];
145 QModelIndex CurveCreator_TreeViewModel::index(int row, int column, const QModelIndex & parent ) const
147 if( parent.isValid() ){
148 return createIndex(row, column, parent.row() );
151 QModelIndex aParent = createIndex(row, column, ID_SECTION );
154 return QModelIndex();
157 QModelIndex CurveCreator_TreeViewModel::parent(const QModelIndex & theIndex) const
159 if( !theIndex.isValid() )
160 return QModelIndex();
162 if( theIndex.internalId() == (quintptr)ID_SECTION ){
163 return QModelIndex();
165 return createIndex( theIndex.internalId(), 0, ID_SECTION );
168 int CurveCreator_TreeViewModel::rowCount(const QModelIndex & parent ) const
171 if( myCurve != NULL ){
172 if( !parent.isValid() ){
174 aRowCnt = myCurve->getNbSections();
177 if( parent.internalId() == (quintptr)ID_SECTION ){
179 aRowCnt = myCurve->getNbPoints(parent.row());
186 QModelIndex CurveCreator_TreeViewModel::sectionIndex( int theSection ) const
188 return createIndex( theSection, 0, ID_SECTION );
191 QModelIndex CurveCreator_TreeViewModel::nbPointsIndex( int theSection ) const
193 return createIndex( theSection, 1, ID_SECTION );
196 QModelIndex CurveCreator_TreeViewModel::pointIndex( int theSection, int thePoint ) const
198 return createIndex( thePoint, 0, theSection );
201 bool CurveCreator_TreeViewModel::isSection( const QModelIndex& theIndx ) const
203 if( theIndx.internalId() == (quintptr)ID_SECTION )
208 int CurveCreator_TreeViewModel::getSection( const QModelIndex& theIndx ) const
210 if( theIndx.internalId() == (quintptr)ID_SECTION )
211 return theIndx.row();
212 return theIndx.internalId();
215 int CurveCreator_TreeViewModel::getPoint( const QModelIndex& theIndx ) const
217 if( theIndx.internalId() == (quintptr)ID_SECTION )
219 return theIndx.row();
222 void CurveCreator_TreeViewModel::setCurve( CurveCreator_ICurve* theCurve )
229 /*****************************************************************************************/
230 CurveCreator_TreeView::CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent, bool toDrawColorIcon) :
234 header()->setSectionResizeMode(QHeaderView::ResizeToContents);
235 setUniformRowHeights(true);
236 setContextMenuPolicy( Qt::CustomContextMenu );
237 CurveCreator_TreeViewModel* aModel = new CurveCreator_TreeViewModel(theCurve, this, toDrawColorIcon);
239 setSelectionBehavior(SelectRows);
240 setSelectionMode(SingleSelection);
241 setRootIsDecorated(false);
242 setItemsExpandable(false);
243 setAllColumnsShowFocus(true);
244 connect( selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
245 this, SIGNAL(selectionChanged()) );
246 connect( this, SIGNAL(activated(QModelIndex)), this, SLOT(onActivated(QModelIndex)));
249 QList<int> CurveCreator_TreeView::getSelectedSections() const
252 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
255 // QModelIndexList anIndxs = selectionModel()->selectedIndexes();
256 QModelIndexList anIndxs = selectionModel()->selectedRows();
257 for( int i = 0 ; i < anIndxs.size() ; i++ ){
258 if( aModel->isSection(anIndxs[i]) ){
259 aSect << aModel->getSection( anIndxs[i] );
265 void CurveCreator_TreeView::pointsAdded( int theSection, int thePoint, int thePointsCnt )
267 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
269 QModelIndex aSectIndx = aModel->sectionIndex( theSection );
270 rowsInserted(aSectIndx, thePoint, thePoint + thePointsCnt - 1 );
271 // expand( aSectIndx );
272 update( aModel->nbPointsIndex( theSection ) );
276 void CurveCreator_TreeView::pointDataChanged( int theSection, int thePoint )
278 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
280 QModelIndex aPointIndx = aModel->pointIndex( theSection, thePoint );
281 dataChanged( aPointIndx, aPointIndx );
285 void CurveCreator_TreeView::pointsRemoved( int theSection, int thePoint, int thePointsCnt )
287 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
289 for( int i = 0 ; i < thePointsCnt ; i++ ){
290 QModelIndex aSectIndx = aModel->pointIndex(theSection, thePoint + i);
291 selectionModel()->select(aSectIndx,QItemSelectionModel::Deselect);
293 QModelIndex aSectIndx = aModel->sectionIndex( theSection );
294 rowsRemoved(aSectIndx, thePoint, thePoint + thePointsCnt - 1 );
298 void CurveCreator_TreeView::sectionAdded( int theSection )
300 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
302 int nbRows = aModel->rowCount();
303 int aSection = (theSection == -1 ? (nbRows==0 ? 0 : nbRows-1) : theSection);
304 rowsInserted(QModelIndex(), aSection, aSection );
305 QModelIndex aSectIndx = aModel->sectionIndex(aSection);
306 selectionModel()->select(aSectIndx, QItemSelectionModel::Rows | QItemSelectionModel::ClearAndSelect);
310 void CurveCreator_TreeView::sectionChanged( int theSection, int aSectCnt )
312 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
314 QModelIndex aFirstSectIndx = aModel->sectionIndex( theSection );
315 QModelIndex aLastSectIndx = aModel->sectionIndex( theSection + aSectCnt - 1);
316 dataChanged( aFirstSectIndx, aLastSectIndx );
320 void CurveCreator_TreeView::sectionsRemoved( int theSection, int theSectionCnt )
322 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
324 for( int i = 0 ; i < theSectionCnt ; i++ ){
325 QModelIndex aSectIndx = aModel->sectionIndex(theSection + i);
326 this->selectionModel()->select(aSectIndx,QItemSelectionModel::Deselect);
328 rowsRemoved( QModelIndex(), theSection, theSection+theSectionCnt-1 );
332 void CurveCreator_TreeView::setIndexState( const QModelIndex& theIndx, bool& isExpanded, bool& isSelected, bool& /*isCurrent*/ ) // todo: isCurrent is not set!
334 setExpanded( theIndx, isExpanded );
335 QItemSelectionModel::SelectionFlags aFlag = QItemSelectionModel::Select;
337 aFlag = QItemSelectionModel::Deselect;
339 selectionModel()->select( theIndx, aFlag );
342 void CurveCreator_TreeView::getIndexInfo( const QModelIndex& theIndx, bool& isExpand, bool& isSelected, bool& isCurrent )
344 isExpand = isExpanded(theIndx);
345 isSelected = selectionModel()->isSelected(theIndx);
346 isCurrent = (theIndx == selectionModel()->currentIndex());
349 void CurveCreator_TreeView::swapIndexes( const QModelIndex& theFirst, const QModelIndex& theSecond )
351 bool isFirstSelected;
352 bool isFirstExpanded;
354 getIndexInfo( theFirst, isFirstExpanded, isFirstSelected, isFirstCurrent );
356 bool isSecondSelected;
357 bool isSecondExpanded;
358 bool isSecondCurrent;
359 getIndexInfo( theSecond, isSecondExpanded, isSecondSelected, isSecondCurrent );
361 setIndexState( theFirst, isSecondExpanded, isSecondSelected, isSecondCurrent );
362 setIndexState( theSecond, isFirstExpanded, isFirstSelected, isFirstCurrent );
363 dataChanged(theFirst,theFirst);
364 dataChanged(theSecond,theSecond);
367 void CurveCreator_TreeView::sectionsSwapped( int theSection, int theOffset )
369 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
371 QModelIndex aFirstIndex = aModel->sectionIndex( theSection );
372 QModelIndex aSecondIndex = aModel->sectionIndex( theSection + theOffset );
373 swapIndexes( aFirstIndex, aSecondIndex );
377 void CurveCreator_TreeView::setSelectedSections( const QList<int>& theList )
379 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
381 selectionModel()->clearSelection();
382 for( int i = 0 ; i < theList.size() ; i++ ){
383 QModelIndex aSectIndx = aModel->sectionIndex(theList[i]);
384 selectionModel()->select(aSectIndx, QItemSelectionModel::Select | QItemSelectionModel::Rows );
389 bool pointLessThan(const QPair<int,int> &s1, const QPair<int,int> &s2)
391 if( s1.first < s2.first )
393 if( s1.first > s2.first )
395 return s1.second < s2.second;
398 CurveCreator_TreeView::SelectionType CurveCreator_TreeView::getSelectionType() const
400 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
403 bool isPointSel = false;
404 bool isSectSel = false;
405 bool isOneSection = true;
407 QModelIndexList aLst = selectionModel()->selectedIndexes();
408 for( int i = 0 ; i < aLst.size() ; i++ ){
409 if( aModel->isSection( aLst[i] ) ){
414 if( aSectNum == -1 ){
415 aSectNum = aModel->getSection(aLst[i]);
418 if( aSectNum != aModel->getSection( aLst[i] ) ){
419 isOneSection = false;
424 if( isSectSel && !isPointSel )
426 if( isPointSel && !isSectSel ){
428 return ST_POINTS_ONE_SECTION;
432 if( isPointSel && isSectSel )
437 void CurveCreator_TreeView::onActivated( QModelIndex theIndx )
439 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
442 int aSect = aModel->getSection(theIndx);
443 if( aModel->isSection(theIndx) ){
444 emit sectionEntered( aSect );
448 void CurveCreator_TreeView::setCurve( CurveCreator_ICurve* theCurve )
450 CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
452 aModel->setCurve(theCurve);
456 void CurveCreator_TreeView::reset()
458 QList<int> aSelSections = getSelectedSections();
460 setSelectedSections(aSelSections);