]> SALOME platform Git repositories - modules/hydro.git/blob - src/HYDROGUI/HYDROGUI_OrderedListWidget.cxx
Salome HOME
lot 15 :: updated gui
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_OrderedListWidget.cxx
1 // Copyright (C) 2014-2015  EDF-R&D
2 // This library is free software; you can redistribute it and/or
3 // modify it under the terms of the GNU Lesser General Public
4 // License as published by the Free Software Foundation; either
5 // version 2.1 of the License, or (at your option) any later version.
6 //
7 // This library is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10 // Lesser General Public License for more details.
11 //
12 // You should have received a copy of the GNU Lesser General Public
13 // License along with this library; if not, write to the Free Software
14 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
15 //
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
17 //
18
19 #include "HYDROGUI_OrderedListWidget.h"
20
21 #include "HYDROGUI_ListModel.h"
22
23 #include <SUIT_Session.h>
24 #include <SUIT_ResourceMgr.h>
25
26 #include <QLayout>
27 #include <QListView>
28 #include <QPushButton>
29 #include <QSignalMapper>
30 #include <QSortFilterProxyModel>
31
32
33 /**
34   Constructor.
35   @param theParent the parent widget
36   @param theIconSize the icon size for arrow buttons
37 */
38 HYDROGUI_OrderedListWidget::HYDROGUI_OrderedListWidget( QWidget* theParent, int theArrowIconSize )
39 : QWidget( theParent )
40 {
41   // Main layout
42   QHBoxLayout* aMainLayout = new QHBoxLayout( this );
43   aMainLayout->setMargin( 0 );
44   aMainLayout->setSpacing( 5 );
45
46   // List view
47   myList = new QListView( this );
48   myList->setSelectionMode( QAbstractItemView::ExtendedSelection );
49   // enable drag and drop
50   myList->setDragEnabled( true );
51   myList->setAcceptDrops( true );
52   // configure drag and drop
53   myList->setDropIndicatorShown( true );
54   myList->setDragDropMode( QAbstractItemView::InternalMove );
55
56   // Set the custom model
57   HYDROGUI_ListModel* aModel = new HYDROGUI_ListModel();
58   QSortFilterProxyModel* aFilteredModel = new QSortFilterProxyModel();
59   aFilteredModel->setSourceModel( aModel );
60   aFilteredModel->setFilterKeyColumn( 0 );
61   aFilteredModel->setFilterRole( HYDROGUI_VisibleRole );
62
63   myList->setModel( aFilteredModel );
64
65   // Add list to the main layout
66   aMainLayout->addWidget( myList );
67
68   // Buttons top, up, down, bottom
69   if ( theArrowIconSize > 0 ) {
70     SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
71     myTop = new QPushButton( this );
72     myTop->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_TOP_ICO" ) ) );
73     myTop->setIconSize( QSize( theArrowIconSize, theArrowIconSize ) );
74     myTop->setToolTip( tr( "TOP_TLT" ) );
75     myUp = new QPushButton( this );
76     myUp->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_UP_ICO" ) ) );
77     myUp->setIconSize( myTop->iconSize() );
78     myUp->setToolTip( tr( "UP_TLT" ) );
79     myDown = new QPushButton( this );
80     myDown->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_DOWN_ICO" ) ) );
81     myDown->setIconSize( myTop->iconSize() );
82     myDown->setToolTip( tr( "DOWN_TLT" ) );
83     myBottom = new QPushButton( this );
84     myBottom->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_BOTTOM_ICO" ) ) );
85     myBottom->setIconSize( myTop->iconSize() );
86     myBottom->setToolTip( tr( "BOTTOM_TLT" ) );
87
88     // Add buttons to the main layout
89     QVBoxLayout* aListButtonsLayout = new QVBoxLayout();
90     aListButtonsLayout->addWidget( myTop );
91     aListButtonsLayout->addWidget( myUp );
92     aListButtonsLayout->addWidget( myDown );
93     aListButtonsLayout->addWidget( myBottom );
94     aListButtonsLayout->addStretch();
95     
96     aMainLayout->addLayout( aListButtonsLayout );
97
98     // Buttons connections
99     QSignalMapper* aSignalMapper = new QSignalMapper( this );
100     aSignalMapper->setMapping( myTop, HYDROGUI_ListModel::Top );
101     aSignalMapper->setMapping( myUp, HYDROGUI_ListModel::Up );
102     aSignalMapper->setMapping( myDown, HYDROGUI_ListModel::Down );
103     aSignalMapper->setMapping( myBottom, HYDROGUI_ListModel::Bottom );
104     connect( myTop, SIGNAL( clicked() ), aSignalMapper, SLOT( map() ) );
105     connect( myUp, SIGNAL( clicked() ), aSignalMapper, SLOT( map() ) );
106     connect( myDown, SIGNAL( clicked() ), aSignalMapper, SLOT( map() ) );
107     connect( myBottom, SIGNAL( clicked() ), aSignalMapper, SLOT( map() ) );
108     connect( aSignalMapper, SIGNAL( mapped( int ) ), this, SLOT( onMove( int ) ) );
109   } else {
110     myTop = myUp = myDown = myBottom = 0;
111   }
112
113   connect ( myList->selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ), 
114             this, SIGNAL( selectionChanged() ) );
115   
116   connect ( myList->selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ), 
117             this, SLOT( onSelectionChanged() ) );
118
119   // Initialize
120   setHiddenObjectsShown( true );
121   setVisibilityIconShown( true );
122 }
123
124 void HYDROGUI_OrderedListWidget::onSelectionChanged()
125 {
126   QStringList selectedEntries = getSelectedEntries();
127
128 }
129
130 /**
131   Destructor.
132 */
133 HYDROGUI_OrderedListWidget::~HYDROGUI_OrderedListWidget()
134 {
135 }
136
137 /**
138   Set the list of objects (which supposed to be ordered by the widget).
139   @param theObjects the list of pairs (object; visibility)
140 */
141 void HYDROGUI_OrderedListWidget::setObjects( const HYDROGUI_ListModel::Object2VisibleList& theObjects )
142 {
143   HYDROGUI_ListModel* aModel = getSourceModel();
144   if( aModel ) {
145     aModel->setObjects( theObjects );
146   }
147 }
148
149 void HYDROGUI_OrderedListWidget::setBackgroundColor (int theInd, QColor theColor)
150 {
151   HYDROGUI_ListModel* aModel = getSourceModel();
152   if( aModel ) {
153     aModel->setBackgroundColor( theInd, theColor );
154   }
155 }
156
157 void HYDROGUI_OrderedListWidget::clearAllBackgroundColors ()
158 {
159   HYDROGUI_ListModel* aModel = getSourceModel();
160   if( aModel ) {
161     aModel->clearAllBackgroundColors( );
162   }
163 }
164
165
166  QColor HYDROGUI_OrderedListWidget::getBackgroundColor (int theInd) const
167  {
168    HYDROGUI_ListModel* aModel = getSourceModel();
169    if( aModel ) {
170      return aModel->getBackgroundColor( theInd );
171    }
172  }
173
174 /**
175   Returns the ordered list of objects.
176   @return the list of objects
177 */
178 QList<Handle(HYDROData_Entity)> HYDROGUI_OrderedListWidget::getObjects() const
179 {
180   QList<Handle(HYDROData_Entity)> anObjects;
181
182   HYDROGUI_ListModel* aModel = getSourceModel();
183   if( aModel ) {
184     anObjects = aModel->getObjects();
185   }
186
187   return anObjects;
188 }
189
190 /**
191   Add the object to the end of the list.
192   @param theObjects the pair (object; visibility)
193 */
194 void HYDROGUI_OrderedListWidget::addObject( const HYDROGUI_ListModel::Object2Visible& theObject )
195 {
196   HYDROGUI_ListModel* aModel = getSourceModel();
197   if( aModel ) {
198     aModel->addObject(theObject);
199   }
200 }
201
202 /**
203   Remove the object from the list.
204   @param theObjectName the name of the object to remove
205 */
206 void HYDROGUI_OrderedListWidget::removeObjectByName( const QString& theObjectName )
207 {
208   HYDROGUI_ListModel* aModel = getSourceModel();
209   if( aModel ) {
210     aModel->removeObjectByName(theObjectName);
211   }
212 }
213
214 /**
215   Set whether the hidden objects are presented in the list.
216   @param theIsToShow if true - the hidden objects will be shown in the list
217 */
218 void HYDROGUI_OrderedListWidget::setHiddenObjectsShown( const bool theIsToShow )
219 {
220   myIsHiddenObjectsShown = theIsToShow; 
221
222   QSortFilterProxyModel* aFilterModel = dynamic_cast<QSortFilterProxyModel*>( myList->model() );
223   QString anExpr = theIsToShow ? "true|false" : "true";
224   aFilterModel->setFilterRegExp( anExpr );
225 }
226
227 /**
228   Set whether the visibility icon (eye icon) are presented in the list.
229   @param theIsToShow if true - the eye icon will be shown in the list
230 */
231 void HYDROGUI_OrderedListWidget::setVisibilityIconShown( const bool theIsToShow )
232 {
233   HYDROGUI_ListModel* aModel = getSourceModel();
234   if( aModel ) {
235     aModel->setDecorationEnabled( theIsToShow );
236   }
237 }
238
239 /**
240   Get entries of the selected objects.
241   @return the list of entries
242 */
243 QStringList HYDROGUI_OrderedListWidget::getSelectedEntries() const
244
245   QStringList anEntries;
246
247   QSortFilterProxyModel* aFilterModel = 
248     dynamic_cast<QSortFilterProxyModel*>( myList->model() );
249   if( aFilterModel ) {
250     HYDROGUI_ListModel* aSourceModel = 
251       dynamic_cast<HYDROGUI_ListModel*>( aFilterModel->sourceModel() );
252     if ( aSourceModel ) {
253       QModelIndexList aSelectedIndexes = myList->selectionModel()->selectedIndexes();
254       foreach ( const QModelIndex& anIndex, aSelectedIndexes ) {
255         QModelIndex aSourceIndex = aFilterModel->mapToSource( anIndex );
256         QString anEntry = aSourceModel->data( aSourceIndex, HYDROGUI_EntryRole ).toString();
257         anEntries << anEntry;
258       }
259     }
260   }
261
262   return anEntries;
263 }
264
265 /**
266   Set objects with the given entries selected (other objects will deselected).
267   @param theEntries the list of entries
268 */
269 void HYDROGUI_OrderedListWidget::setSelectedEntries( const QStringList& theEntries ) const
270 {
271   QSortFilterProxyModel* aFilterModel = dynamic_cast<QSortFilterProxyModel*>( myList->model() );
272   if( !aFilterModel ) {
273     return;
274   }
275   HYDROGUI_ListModel* aSourceModel = dynamic_cast<HYDROGUI_ListModel*>( aFilterModel->sourceModel() );
276   if ( !aSourceModel ) {
277     return;
278   }
279   QItemSelectionModel* aSelectionModel = myList->selectionModel();
280   if ( !aSelectionModel ) {
281     return;
282   }
283   
284   for ( int aRow = 0 ; aRow < aSourceModel->rowCount() ; aRow++ ) {
285     QModelIndex anIndex = aSourceModel->index( aRow, 0 );
286     if ( !anIndex.isValid() ) {
287       continue;
288     }
289
290     QString anEntry = aSourceModel->data( anIndex, HYDROGUI_EntryRole ).toString();
291
292     bool isToSelect = theEntries.contains( anEntry );
293     QModelIndex aProxyModelIndex = aFilterModel->mapFromSource( anIndex );
294     QItemSelectionModel::SelectionFlags aSelectionFlags =
295       isToSelect ? QItemSelectionModel::Select : QItemSelectionModel::Deselect;
296     aSelectionModel->select( aProxyModelIndex, aSelectionFlags );
297   }
298 }
299
300 /**
301   Get names of the selected objects.
302   @return the list of names
303 */
304 QStringList HYDROGUI_OrderedListWidget::getSelectedNames() const
305 {
306   QStringList aNames;
307
308   QSortFilterProxyModel* aFilterModel = 
309     dynamic_cast<QSortFilterProxyModel*>( myList->model() );
310   if ( aFilterModel ) {
311     HYDROGUI_ListModel* aSourceModel = 
312       dynamic_cast<HYDROGUI_ListModel*>( aFilterModel->sourceModel() );
313     if ( aSourceModel ) {
314       QModelIndexList aSelectedIndexes = myList->selectionModel()->selectedIndexes();
315       foreach ( const QModelIndex& anIndex, aSelectedIndexes ) {
316         QModelIndex aSourceIndex = aFilterModel->mapToSource( anIndex );
317         QString anEntry = aSourceModel->data( aSourceIndex, Qt::DisplayRole ).toString();
318         aNames << anEntry;
319       }
320     }
321   }
322
323   return aNames;
324 }
325
326 /**
327   Get names of all objects.
328   @return the list of names
329 */
330 QStringList HYDROGUI_OrderedListWidget::getAllNames() const
331 {
332   QStringList aNames;
333
334
335   foreach ( const Handle(HYDROData_Entity)& anObject, getObjects() ) {
336     aNames << anObject->GetName();
337   }
338
339   return aNames;
340 }
341
342 /**
343   Slot called on top, up, down and bottom button click.
344   @param theType the move operation type
345 */
346 void HYDROGUI_OrderedListWidget::onMove( int theType )
347 {
348   bool isMoved = false;
349
350   QSortFilterProxyModel* aFilterModel = dynamic_cast<QSortFilterProxyModel*>( myList->model() );
351   if( aFilterModel ) {
352     HYDROGUI_ListModel* aModel = dynamic_cast<HYDROGUI_ListModel*>( aFilterModel->sourceModel() );
353     if( aModel ) {
354       QModelIndexList aSelectedIndexes = myList->selectionModel()->selectedIndexes();
355       QModelIndexList aSelectedSourceIndexes;
356       foreach ( const QModelIndex& anIndex, aSelectedIndexes ) {
357         aSelectedSourceIndexes << aFilterModel->mapToSource( anIndex );
358       }
359       QList<int> aSelectedIds = aModel->getIds( aSelectedSourceIndexes );
360       isMoved = aModel->move( aSelectedIds, ( HYDROGUI_ListModel::OpType )theType, 
361                               !myIsHiddenObjectsShown );
362     }
363   }
364
365   if ( isMoved )
366   {
367     emit orderChanged();
368   }
369 }
370
371 /**
372   Returns the list source model.
373   @return the source model
374 */
375 HYDROGUI_ListModel* HYDROGUI_OrderedListWidget::getSourceModel() const
376 {
377   HYDROGUI_ListModel* aSourceModel = 0;
378
379   QSortFilterProxyModel* aFilterModel = dynamic_cast<QSortFilterProxyModel*>( myList->model() );
380   if( aFilterModel ) {
381     aSourceModel = dynamic_cast<HYDROGUI_ListModel*>( aFilterModel->sourceModel() );
382   }
383
384   return aSourceModel;
385 }
386
387 /**
388   Enable/disable ordering (i.e. enable/disable arrow buttons and drag and drop).
389   @param theIsToEnable if true - ordering will bw enabled
390 */
391 void HYDROGUI_OrderedListWidget::setOrderingEnabled( const bool theIsToEnable )
392 {
393   // enable/disable arrow buttons
394   if ( myTop && myUp && myDown && myBottom ) {
395     myTop->setEnabled( theIsToEnable );
396     myUp->setEnabled( theIsToEnable );
397     myDown->setEnabled( theIsToEnable );
398     myBottom->setEnabled( theIsToEnable );
399   }
400
401   // enable/disable drag and drop
402   myList->setDragEnabled( theIsToEnable );
403 }
404
405 void HYDROGUI_OrderedListWidget::undoLastMove()
406 {
407   HYDROGUI_ListModel* aModel = getSourceModel();
408   if( aModel )
409     aModel->undoLastMove();
410 }