Salome HOME
Merge branch 'BR_H2018_3' into BR_2018_V8_5
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_PriorityWidget.cxx
index f842733bad178838730b735016613710340e9610..2f84a8229570b92dfa9bd6f83734042a80a5db6f 100644 (file)
@@ -1,12 +1,8 @@
-// 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 <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
@@ -73,11 +54,12 @@ QWidget* HYDROGUI_PriorityWidget::Delegate::createEditor(
       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;
 }
 
@@ -126,6 +108,18 @@ void HYDROGUI_PriorityWidget::Delegate::setModelData(
   }
 }
 
+/**
+ 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.
@@ -150,12 +144,23 @@ HYDROGUI_PriorityWidget::HYDROGUI_PriorityWidget( QWidget* theParent )
   // 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
   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();
@@ -180,6 +185,7 @@ HYDROGUI_PriorityWidget::HYDROGUI_PriorityWidget( QWidget* theParent )
             this, SLOT( onSelectionChanged() ) );
 
   connect( aModel, SIGNAL( showError( const QString& ) ), this, SLOT( onShowError( const QString& ) ) );
+  connect( aModel, SIGNAL( ruleChanged() ), this, SIGNAL( ruleChanged() ) );
 }
 
 /**
@@ -199,6 +205,7 @@ void HYDROGUI_PriorityWidget::onAddRule()
   if ( aModel ) {
     if (aModel->createNewRule()) {
       updateControls();
+      emit ruleChanged();
     }
   }
 }
@@ -214,13 +221,16 @@ 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();
     }
   }
 }
@@ -234,13 +244,15 @@ void HYDROGUI_PriorityWidget::onClearRules()
     dynamic_cast<HYDROGUI_PriorityTableModel*>( myTable->model() );
   if ( aModel && aModel->removeAll() ) {
     updateControls();
+    emit ruleChanged();
   }
 }
 
 /**
-  Set objects.
+  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() );
@@ -281,12 +293,21 @@ void HYDROGUI_PriorityWidget::setRules( const HYDROData_ListOfRules& theRules )
   }
 }
 
+/**
+  Get table view.
+  @return the table view
+ */
+QTableView* HYDROGUI_PriorityWidget::getTable() const
+{
+  return myTable;
+}
+
 /**
  Slot called on table selection change.
 */
 void HYDROGUI_PriorityWidget::onSelectionChanged()
 {
-  QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedRows();
+  QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedIndexes();
   myRemove->setEnabled( aSelectedIndexes.count() > 0 );
 }
 
@@ -301,9 +322,6 @@ void HYDROGUI_PriorityWidget::updateControls()
     myAdd->setEnabled( aModel->canCreateNewRule() );
     bool isTableNotEmpty = aModel->rowCount() > 0;
     myClear->setEnabled( isTableNotEmpty );
-    if ( isTableNotEmpty ) {
-      myTable->resizeColumnsToContents();
-    }
   }
   onSelectionChanged();
 }
@@ -312,5 +330,16 @@ void HYDROGUI_PriorityWidget::updateControls()
  Show error message.
  */
 void HYDROGUI_PriorityWidget::onShowError( const QString& theMsg ) {
-  SUIT_MessageBox::critical( this, tr( "ERROR" ), theMsg );
-}
\ No newline at end of file
+  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();
+}