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.
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.
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
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #include <HYDROGUI_StricklerTableDlg.h>
20 #include <HYDROGUI_LineEditDoubleValidator.h>
21 #include <HYDROGUI_Tool.h>
22 #include <HYDROData_StricklerTable.h>
23 #include <SUIT_FileDlg.h>
25 #include <SUIT_ResourceMgr.h>
26 #include <SUIT_Session.h>
29 #include <QColorDialog>
31 #include <QHeaderView>
35 #include <QTableWidget>
36 #include <QToolButton>
38 HYDROGUI_ColorDelegate::HYDROGUI_ColorDelegate( QWidget* theParent )
42 HYDROGUI_ColorDelegate::~HYDROGUI_ColorDelegate()
46 void HYDROGUI_ColorDelegate::paint( QPainter* thePainter, const QStyleOptionViewItem& theOption,
47 const QModelIndex& theIndex ) const
49 QColor aColor = theIndex.data( Qt::BackgroundColorRole ).value<QColor>();
50 thePainter->fillRect( theOption.rect, aColor );
53 QWidget* HYDROGUI_ColorDelegate::createEditor( QWidget* theParent,
54 const QStyleOptionViewItem& theOption,
55 const QModelIndex& theIndex ) const
57 QColor aColor = theIndex.data( Qt::BackgroundColorRole ).value<QColor>();
58 QColor aNewColor = QColorDialog::getColor( aColor );
59 if( aNewColor.isValid() )
61 QAbstractItemModel* aModel = const_cast<QAbstractItemModel*>( theIndex.model() );
62 QVariant aValue = qVariantFromValue( aNewColor );
63 aModel->setData( theIndex, aValue, Qt::BackgroundColorRole );
68 void HYDROGUI_ColorDelegate::setEditorData( QWidget* theEditor, const QModelIndex& theIndex ) const
72 void HYDROGUI_ColorDelegate::setModelData( QWidget* theEditor, QAbstractItemModel* theModel,
73 const QModelIndex& theIndex ) const
77 QSize HYDROGUI_ColorDelegate::sizeHint( const QStyleOptionViewItem& theOption, const QModelIndex& theIndex ) const
79 return theOption.rect.size();
84 const int COLUMNS_COUNT = 4;
87 HYDROGUI_StricklerTableDlg::HYDROGUI_StricklerTableDlg( HYDROGUI_Module* theModule, const QString& theTitle, int theType )
88 : HYDROGUI_InputPanel( theModule, theTitle ),
91 QString fileGroupTitle = theType == Export ? tr( "EXPORT_STRICKLER_TABLE_FILE" ) : tr( "IMPORT_STRICKLER_TABLE_FILE" );
93 // Import Strickler table from file
94 QGroupBox* aFileNameGroup = new QGroupBox( fileGroupTitle, this );
95 aFileNameGroup->setVisible( theType != Edit );
97 QLabel* aFileNameLabel = new QLabel( tr( "FILE_NAME" ), aFileNameGroup );
99 myFileName = new QLineEdit( aFileNameGroup );
100 myFileName->setReadOnly( true );
102 QToolButton* aBrowseBtn = new QToolButton( aFileNameGroup );
104 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
105 aBrowseBtn->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "BROWSE_ICO" ) ) );
108 QBoxLayout* aFileNameLayout = new QHBoxLayout( aFileNameGroup );
109 aFileNameLayout->setMargin( 5 );
110 aFileNameLayout->setSpacing( 5 );
111 aFileNameLayout->addWidget( aFileNameLabel );
112 aFileNameLayout->addWidget( myFileName );
113 aFileNameLayout->addWidget( aBrowseBtn );
115 // Strickler table name
116 QGroupBox* aNameGroup = new QGroupBox( tr( "STRICKLER_TABLE_NAME" ), this );
118 QLabel* anImageNameLabel = new QLabel( tr( "NAME" ), aNameGroup );
119 myName = new QLineEdit( aNameGroup );
121 QGroupBox* aAttrNameGroup = new QGroupBox( tr( "STRICKLER_TABLE_ATTR_NAME" ), this );
122 aAttrNameGroup->setVisible( theType == Edit );
123 QLabel* aAttrNameLabel = new QLabel( tr( "ATTR_NAME" ), aAttrNameGroup );
124 myAttrName = new QLineEdit( aAttrNameGroup );
126 QBoxLayout* anImageNameLayout = new QHBoxLayout( aNameGroup );
127 anImageNameLayout->setMargin( 5 );
128 anImageNameLayout->setSpacing( 5 );
129 anImageNameLayout->addWidget( anImageNameLabel );
130 anImageNameLayout->addWidget( myName );
132 QBoxLayout* anAttrNameLayout = new QHBoxLayout( aAttrNameGroup );
133 anAttrNameLayout->setMargin( 5 );
134 anAttrNameLayout->setSpacing( 5 );
135 anAttrNameLayout->addWidget( aAttrNameLabel );
136 anAttrNameLayout->addWidget( myAttrName );
139 QGroupBox* aTableGroup = new QGroupBox( tr( "STRICKLER_TABLE_TABLE" ), this );
140 aTableGroup->setVisible( theType == Edit );
143 QVBoxLayout* aTableLayout = new QVBoxLayout( aTableGroup );
144 aTableLayout->setMargin( 5 );
145 aTableLayout->setSpacing( 5 );
148 myAddBtn = new QToolButton;
149 myAddBtn->setText( tr( "ADD" ) );
150 myRemoveBtn = new QToolButton;
151 myRemoveBtn->setText( tr( "REMOVE" ) );
152 myClearBtn = new QToolButton;
153 myClearBtn->setText( tr( "CLEAR_ALL" ) );
156 myTable = new QTableWidget( mainFrame() );
157 myTable->setItemDelegateForColumn( 1, new HYDROGUI_LineEditDoubleValidator( this ) );
158 myTable->setItemDelegateForColumn( 3, new HYDROGUI_ColorDelegate( this ) );
159 myTable->setEditTriggers( QAbstractItemView::DoubleClicked |
160 QAbstractItemView::SelectedClicked |
161 QAbstractItemView::EditKeyPressed );
163 myTable->setColumnCount( COLUMNS_COUNT );
165 QStringList aColumnNames;
166 aColumnNames << tr( "STRICKLER_TYPE" ) << tr( "STRICKLER_COEFFICIENT" ) << tr( "ATTR_VALUE" ) << tr( "COLOR" );
167 myTable->setHorizontalHeaderLabels( aColumnNames );
169 myTable->horizontalHeader()->setStretchLastSection( false );
170 myTable->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::Interactive );
171 myTable->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Interactive );
172 myTable->horizontalHeader()->setSectionResizeMode( 2, QHeaderView::Interactive );
173 myTable->horizontalHeader()->setSectionResizeMode( 3, QHeaderView::Interactive );
174 myTable->verticalHeader()->setSectionResizeMode( QHeaderView::ResizeToContents );
176 const int default_size = 50;
177 myTable->horizontalHeader()->setMinimumSectionSize( default_size );
178 myTable->horizontalHeader()->resizeSection( 0, 300 );
179 myTable->horizontalHeader()->resizeSection( 1, 75 );
180 myTable->horizontalHeader()->resizeSection( 2, 75 );
181 myTable->horizontalHeader()->resizeSection( 3, 75 );
185 QHBoxLayout* aButtonsLayout = new QHBoxLayout();
186 aButtonsLayout->addWidget( myAddBtn );
187 aButtonsLayout->addWidget( myRemoveBtn );
188 aButtonsLayout->addStretch( 1 );
189 aButtonsLayout->addWidget( myClearBtn );
192 aTableLayout->addLayout( aButtonsLayout );
193 aTableLayout->addWidget( myTable );
196 addWidget( aFileNameGroup );
197 addWidget( aNameGroup );
198 addWidget( aAttrNameGroup );
199 addWidget( aTableGroup );
205 connect( aBrowseBtn, SIGNAL( clicked() ), this, SLOT( onBrowse() ) );
206 connect( myAddBtn, SIGNAL( clicked() ), this, SLOT( onAddCoefficient() ) );
207 connect( myRemoveBtn, SIGNAL( clicked() ), this, SLOT( onRemoveCoefficient() ) );
208 connect( myClearBtn, SIGNAL( clicked() ), this, SLOT( onClearCoefficients() ) );
209 connect( myTable->selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ),
210 this, SLOT( onSelectionChanged() ) );
212 setMinimumWidth( 450 );
214 if ( theType != Edit )
218 HYDROGUI_StricklerTableDlg::~HYDROGUI_StricklerTableDlg()
222 void HYDROGUI_StricklerTableDlg::reset()
229 QString HYDROGUI_StricklerTableDlg::getFileName() const
231 return myFileName->text();
234 void HYDROGUI_StricklerTableDlg::setFileName( const QString& theName )
236 myFileName->setText( theName );
239 void HYDROGUI_StricklerTableDlg::setTableName( const QString& theName )
241 myName->setText(theName);
244 QString HYDROGUI_StricklerTableDlg::getTableName() const
246 return myName->text();
249 bool HYDROGUI_StricklerTableDlg::isTableNameReadOnly() const
251 return myName->isReadOnly();
254 void HYDROGUI_StricklerTableDlg::setTableNameReadOnly( bool on )
256 myName->setReadOnly( on );
259 void HYDROGUI_StricklerTableDlg::getGuiData( Handle(HYDROData_StricklerTable)& theTable ) const
261 if( theTable.IsNull() )
264 theTable->SetAttrName( myAttrName->text() );
266 for ( int i = 0; i < myTable->rowCount(); i++ )
268 QTableWidgetItem* typeItem = myTable->item( i, 0 );
269 QString aType = typeItem->data( Qt::DisplayRole ).toString();
271 QTableWidgetItem* coeffItem = myTable->item( i, 1 );
272 QString aCoeffStr = coeffItem->data( Qt::DisplayRole ).toString();
273 double aCoeff = aCoeffStr.toDouble();
275 QTableWidgetItem* attrValueItem = myTable->item( i, 2 );
276 QString anAttrValue = attrValueItem->data( Qt::DisplayRole ).toString();
278 QTableWidgetItem* colorItem = myTable->item( i, 3 );
279 QColor aColor = colorItem->backgroundColor();
281 theTable->Set( aType, aCoeff );
282 theTable->SetAttrValue( aType, anAttrValue );
283 theTable->SetColor( aType, aColor );
287 void HYDROGUI_StricklerTableDlg::setGuiData( const Handle(HYDROData_StricklerTable)& theTable )
289 myAttrName->setText( theTable->GetAttrName() );
291 if( theTable.IsNull() )
293 myTable->setRowCount( 0 );
297 QStringList aTypes = theTable->GetTypes();
298 myTable->setRowCount( 0 );
299 foreach( QString aType, aTypes )
301 // Check the current Strickler type
302 if( aType.isEmpty() )
305 // Get Strickler data for the current Strickler type
306 QString aCoefficient = HYDROGUI_Tool::GetCoordinateString( theTable->Get( aType, 0.0 ), false );
307 QString anAttrValue = theTable->GetAttrValue( aType );
308 QColor aColor = theTable->GetColor( aType );
310 // Insert row with the data
311 int aRow = myTable->rowCount();
312 myTable->insertRow( aRow );
315 QTableWidgetItem* aTypeItem = new QTableWidgetItem( aType );
316 myTable->setItem( aRow, 0, aTypeItem );
318 // "Coefficient" column
319 myTable->setItem( aRow, 1, new QTableWidgetItem( aCoefficient ) );
321 // "Attribute value" column
322 myTable->setItem( aRow, 2, new QTableWidgetItem( anAttrValue ) );
325 QTableWidgetItem* anItem = new QTableWidgetItem();
326 anItem->setBackgroundColor( aColor );
327 myTable->setItem( aRow, 3, anItem );
330 //myTable->resizeColumnToContents( 0 );
331 myTable->resizeRowsToContents();
336 void HYDROGUI_StricklerTableDlg::updateControls()
338 bool isTableNotEmpty = myTable->rowCount() > 0;
339 myClearBtn->setEnabled( isTableNotEmpty );
340 onSelectionChanged();
343 void HYDROGUI_StricklerTableDlg::removeRows( const QList<int> theRows )
345 QList<int> aSortedRows = theRows;
346 qSort( aSortedRows );
348 int aRowToRemove = -1;
350 foreach ( int aRow, aSortedRows ) {
351 aRowToRemove = aRow - aNbRemoved;
352 if ( myTable->model()->removeRow( aRowToRemove ) ) {
357 if ( aNbRemoved > 0 )
361 void HYDROGUI_StricklerTableDlg::onBrowse()
363 QString aFilter( tr( "STRICKLER_TABLE_FILTER" ) );
364 QString aFileName = SUIT_FileDlg::getFileName( this, "", aFilter, myFileName->parent()->property( "title" ).toString(), myType == Import );
365 if ( !aFileName.isEmpty() )
367 setFileName( aFileName );
368 emit fileSelected( aFileName );
373 Add the new default constructed Strickler coefficient.
375 void HYDROGUI_StricklerTableDlg::onAddCoefficient()
377 int aRow = myTable->rowCount();
378 myTable->insertRow( aRow );
380 for( int i=0; i<COLUMNS_COUNT; i++ )
382 myTable->setItem( aRow, i, new QTableWidgetItem() );
385 // Set default type (=> generate unique type name) and coefficient
392 Remove the selected Strickler coefficient.
394 void HYDROGUI_StricklerTableDlg::onRemoveCoefficient()
397 QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedIndexes();
398 foreach ( const QModelIndex& anIndex, aSelectedIndexes ) {
399 int aRowIndex = anIndex.row();
400 if ( !aRows.contains( aRowIndex ) )
408 Clear all Strickler coefficients.
410 void HYDROGUI_StricklerTableDlg::onClearCoefficients()
413 for ( int i=0; i< myTable->rowCount(); i++ ) {
421 Slot called on table selection change.
423 void HYDROGUI_StricklerTableDlg::onSelectionChanged()
425 QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedIndexes();
426 myRemoveBtn->setEnabled( aSelectedIndexes.count() > 0 );