-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
+// Copyright (C) 2014-2015 EDF-R&D
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
#include "HYDROData_PriorityQueue.h"
+#include <SUIT_MessageBox.h>
+
#include <QComboBox>
+#include <QHeaderView>
#include <QLayout>
-#include <QStyledItemDelegate>
#include <QTableView>
#include <QToolButton>
-/**
- Custom item delegate (combobox)
- */
-class HYDROGUI_PriorityWidget::Delegate : public QStyledItemDelegate
-{
-public:
- Delegate( QObject* theParent = 0 );
-
- QWidget* createEditor( QWidget*, const QStyleOptionViewItem&,
- const QModelIndex& ) const;
-
- void setEditorData( QWidget*, const QModelIndex& ) const;
- void setModelData( QWidget*, QAbstractItemModel*, const QModelIndex& ) const;
-};
-
/**
Constructor.
@param theParent the parent object
aComboBox->addItem( aText, aMap.value( aText ).toInt() );
}
} else if ( theIndex.column() == 0 || theIndex.column() == 2 ) {
- QStringList anItems = theIndex.data( Qt::UserRole ).toStringList();
QStringList anObjNames = theIndex.data( Qt::UserRole ).toStringList();
aComboBox->addItems( anObjNames );
}
+ connect( aComboBox, SIGNAL( activated( int ) ), this, SLOT( finishEditing() ) );
+
return aComboBox;
}
if ( aComboBox ) {
int aColumn = theIndex.column();
if ( aColumn == 0 || aColumn == 2 ) {
- theModel->setData( theIndex, aComboBox->currentText() );
+ QString aCurrentText = theIndex.data( Qt::EditRole ).toString();
+ QString aNewText = aComboBox->currentText();
+ if ( aNewText != aCurrentText ) {
+ theModel->setData( theIndex, aNewText );
+ }
} else {
theModel->setData( theIndex, aComboBox->itemData( aComboBox->currentIndex() ) );
}
}
}
+/**
+ Emit signal indicating that the user has finished editing.
+ */
+void HYDROGUI_PriorityWidget::Delegate::finishEditing()
+{
+ QWidget* anEditor = qobject_cast<QWidget*>( sender() );
+ if ( anEditor ) {
+ emit commitData( anEditor );
+ emit closeEditor( anEditor );
+ }
+}
+
/**
Constructor.
myAdd->setText( tr( "ADD" ) );
myRemove = new QToolButton;
myRemove->setText( tr( "REMOVE" ) );
- myRemove->setEnabled( false );
-
+ myClear = new QToolButton;
+ myClear->setText( tr( "CLEAR_ALL" ) );
+
// Table view
myTable = new QTableView( this );
myTable->setItemDelegate( new Delegate( this ) );
- myTable->setEditTriggers( QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked );
-
+ myTable->setEditTriggers( QAbstractItemView::DoubleClicked |
+ QAbstractItemView::SelectedClicked |
+ QAbstractItemView::EditKeyPressed );
+
// Set the custom model
- myTable->setModel( new HYDROGUI_PriorityTableModel() );
-
+ HYDROGUI_PriorityTableModel* aModel = new HYDROGUI_PriorityTableModel();
+ myTable->setModel( aModel );
+
+ // Set resize mode
+ myTable->horizontalHeader()->setStretchLastSection( false);
+ myTable->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::Stretch );
+ myTable->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::ResizeToContents );
+ myTable->horizontalHeader()->setSectionResizeMode( 2, QHeaderView::Stretch );
+ myTable->horizontalHeader()->setSectionResizeMode( 3, QHeaderView::ResizeToContents );
+
+ myTable->verticalHeader()->setSectionResizeMode( QHeaderView::ResizeToContents );
+
// Layout
// buttons
QHBoxLayout* aButtonsLayout = new QHBoxLayout();
aButtonsLayout->addWidget( myAdd );
aButtonsLayout->addWidget( myRemove );
aButtonsLayout->addStretch( 1 );
+ aButtonsLayout->addWidget( myClear );
// main
aMainLayout->addLayout( aButtonsLayout );
aMainLayout->addWidget( myTable );
+ // Update controls
+ updateControls();
+
// Connections
connect( myAdd, SIGNAL( clicked() ), this, SLOT( onAddRule() ) );
connect( myRemove, SIGNAL( clicked() ), this, SLOT( onRemoveRule() ) );
+ connect( myClear, SIGNAL( clicked() ), this, SLOT( onClearRules() ) );
+
connect ( myTable->selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ),
this, SLOT( onSelectionChanged() ) );
+
+ connect( aModel, SIGNAL( showError( const QString& ) ), this, SLOT( onShowError( const QString& ) ) );
+ connect( aModel, SIGNAL( ruleChanged() ), this, SIGNAL( ruleChanged() ) );
}
/**
}
/**
- Adds the new rule.
+ Add the new default constructed rule.
*/
void HYDROGUI_PriorityWidget::onAddRule()
{
HYDROGUI_PriorityTableModel* aModel =
dynamic_cast<HYDROGUI_PriorityTableModel*>( myTable->model() );
- if( aModel ) {
- aModel->createNewRule();
+ if ( aModel ) {
+ if (aModel->createNewRule()) {
+ updateControls();
+ emit ruleChanged();
+ }
}
- myTable->resizeColumnsToContents();
- onSelectionChanged();
}
/**
- Removes the selected rule.
+ Remove the selected rule.
*/
void HYDROGUI_PriorityWidget::onRemoveRule()
{
if (aModel) {
QList<int> aRows;
- QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedRows();
+ QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedIndexes();
foreach ( const QModelIndex& anIndex, aSelectedIndexes ) {
- aRows << anIndex.row();
+ int aRowIndex = anIndex.row();
+ if ( !aRows.contains( aRowIndex ) )
+ aRows << aRowIndex;
+ }
+
+ if ( aModel->removeRows( aRows ) ) {
+ updateControls();
+ emit ruleChanged();
}
- aModel->removeRows( aRows );
}
- myTable->resizeColumnsToContents();
- onSelectionChanged();
}
/**
- Set objects.
+ Clear all rules.
+ */
+void HYDROGUI_PriorityWidget::onClearRules()
+{
+ HYDROGUI_PriorityTableModel* aModel =
+ dynamic_cast<HYDROGUI_PriorityTableModel*>( myTable->model() );
+ if ( aModel && aModel->removeAll() ) {
+ updateControls();
+ emit ruleChanged();
+ }
+}
+
+/**
+ Set objects which could be used for rules definition.
+ @param theObjects the ordered list of objects
*/
-void HYDROGUI_PriorityWidget::setObjects( const QList<Handle(HYDROData_Object)>& theObjects )
+void HYDROGUI_PriorityWidget::setObjects( const QList<Handle(HYDROData_Entity)>& theObjects )
{
HYDROGUI_PriorityTableModel* aModel =
dynamic_cast<HYDROGUI_PriorityTableModel*>( myTable->model() );
if( aModel ) {
aModel->setObjects( theObjects );
+ updateControls();
}
}
Set rules.
@param theRules the list of rules
*/
-void HYDROGUI_PriorityWidget::setRules( const HYDROData_ListOfRules& theRules ) const
+void HYDROGUI_PriorityWidget::setRules( const HYDROData_ListOfRules& theRules )
{
HYDROGUI_PriorityTableModel* aModel =
dynamic_cast<HYDROGUI_PriorityTableModel*>( myTable->model() );
if( aModel ) {
aModel->setRules( theRules );
+ updateControls();
}
- myTable->resizeColumnsToContents();
+}
+
+/**
+ Get table view.
+ @return the table view
+ */
+QTableView* HYDROGUI_PriorityWidget::getTable() const
+{
+ return myTable;
}
/**
*/
void HYDROGUI_PriorityWidget::onSelectionChanged()
{
- QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedRows();
+ QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedIndexes();
myRemove->setEnabled( aSelectedIndexes.count() > 0 );
-}
\ No newline at end of file
+}
+
+/**
+ Update GUI controls state.
+ */
+void HYDROGUI_PriorityWidget::updateControls()
+{
+ HYDROGUI_PriorityTableModel* aModel =
+ dynamic_cast<HYDROGUI_PriorityTableModel*>( myTable->model() );
+ if( aModel ) {
+ myAdd->setEnabled( aModel->canCreateNewRule() );
+ bool isTableNotEmpty = aModel->rowCount() > 0;
+ myClear->setEnabled( isTableNotEmpty );
+ }
+ onSelectionChanged();
+}
+
+/**
+ Show error message.
+ */
+void HYDROGUI_PriorityWidget::onShowError( const QString& theMsg ) {
+ SUIT_MessageBox::warning( this, tr( "INCORRECT_INPUT" ), theMsg );
+}
+
+/**
+ Undo last change in priority rules table.
+ */
+void HYDROGUI_PriorityWidget::undoLastChange()
+{
+ HYDROGUI_PriorityTableModel* aModel =
+ dynamic_cast<HYDROGUI_PriorityTableModel*>( myTable->model() );
+ if ( aModel )
+ aModel->undoLastChange();
+}