Back to index

salome-smesh  6.5.0
SMESHGUI_MeshOrderDlg.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // This library is free software; you can redistribute it and/or
00004 // modify it under the terms of the GNU Lesser General Public
00005 // License as published by the Free Software Foundation; either
00006 // version 2.1 of the License.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // Lesser General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU Lesser General Public
00014 // License along with this library; if not, write to the Free Software
00015 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00016 //
00017 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00018 //
00019 
00020 // File   : SMESHGUI_MeshOrderDlg.cxx
00021 // Author : Pavel TELKOV, Open CASCADE S.A.S.
00022 // SMESH includes
00023 //
00024 #include "SMESHGUI_MeshOrderDlg.h"
00025 
00026 // Qt includes
00027 #include <Qt>
00028 #include <QFrame>
00029 #include <QLabel>
00030 #include <QBoxLayout>
00031 #include <QSpacerItem>
00032 #include <QToolButton>
00033 #include <QListWidget>
00034 #include <QListWidgetItem>
00035 
00036 #define SPACING 6
00037 #define MARGIN  11
00038 
00042 enum MeshOrderItemType { MeshItem = QListWidgetItem::UserType, SeparatorItem };
00043 
00044 // =========================================================================================
00048 // =========================================================================================
00049 
00050 SMESHGUI_MeshOrderBox::SMESHGUI_MeshOrderBox(QWidget* theParent)
00051 : QGroupBox( theParent ), myIsChanged( false ), myUpBtn(0), myDownBtn(0)
00052 {
00053   QHBoxLayout* hBoxLayout = new QHBoxLayout(this);
00054   hBoxLayout->setMargin( MARGIN );
00055   hBoxLayout->setSpacing( SPACING );
00056   
00057   myMeshNames = new QListWidget(this);
00058   myMeshNames->setSelectionMode(QAbstractItemView::SingleSelection);
00059   myMeshNames->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding ));
00060   hBoxLayout->addWidget(myMeshNames);
00061   
00062   QGroupBox* btnGrp = new QGroupBox(this);
00063   hBoxLayout->addWidget(btnGrp);
00064 
00065   myUpBtn   = new QToolButton(btnGrp);
00066   myDownBtn = new QToolButton(btnGrp);
00067   myUpBtn->  setArrowType( Qt::UpArrow );
00068   myDownBtn->setArrowType( Qt::DownArrow );
00069   
00070   QVBoxLayout* vBoxLayout = new QVBoxLayout(btnGrp);
00071   vBoxLayout->addSpacerItem( new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding ) );
00072   vBoxLayout->addWidget( myUpBtn );
00073   vBoxLayout->addWidget( myDownBtn );
00074   vBoxLayout->addSpacerItem( new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding ) );
00075 
00076   connect( myUpBtn,   SIGNAL( clicked() ), this, SLOT( onMoveItem() ) );
00077   connect( myDownBtn, SIGNAL( clicked() ), this, SLOT( onMoveItem() ) );
00078   connect( myMeshNames, SIGNAL( itemSelectionChanged() ), this, SLOT( onSelectionChanged() ) );
00079   
00080   onSelectionChanged();
00081 }
00082 
00083 // =========================================================================================
00087 //=======================================================================
00088 
00089 SMESHGUI_MeshOrderBox::~SMESHGUI_MeshOrderBox()
00090 {
00091 }
00092 
00093 // =========================================================================================
00097 // =========================================================================================
00098 
00099 static void addSeparator( QListWidget* theList )
00100 {
00101   QListWidgetItem* item = new QListWidgetItem( theList, SeparatorItem );
00102   QFrame* hline = new QFrame( theList );
00103   hline->setFrameStyle( QFrame::HLine | QFrame::Sunken );
00104   theList->addItem( item );
00105   theList->setItemWidget( item, hline );
00106 }
00107 
00108 // =========================================================================================
00112 // =========================================================================================
00113 
00114 static void addMeshItem( QListWidget* theList,
00115                          const QString& theName,
00116                          const int      theId )
00117 {
00118   QListWidgetItem* item = new QListWidgetItem( theName, theList, MeshItem );
00119   item->setData( Qt::UserRole, theId );
00120   theList->addItem( item );
00121 }
00122 
00123 // =========================================================================================
00127 // =========================================================================================
00128 
00129 void SMESHGUI_MeshOrderBox::Clear()
00130 {
00131   myMeshNames->clear();
00132   myIsChanged = false;
00133 }
00134 
00135 // =========================================================================================
00139 // =========================================================================================
00140 
00141 void SMESHGUI_MeshOrderBox::SetMeshes(const ListListName& theMeshNames,
00142                                       const ListListId&   theMeshIds)
00143 {
00144   Clear();
00145   ListListName::const_iterator nLIt = theMeshNames.constBegin();
00146   ListListId::const_iterator idLIt  = theMeshIds.constBegin();
00147   for ( ; nLIt != theMeshNames.constEnd(); ++nLIt, ++idLIt )
00148   {
00149     const QStringList& names = (*nLIt);
00150     const QList<int>& ids = (*idLIt);
00151     if ( myMeshNames->count() )
00152       addSeparator( myMeshNames );
00153     QStringList::const_iterator nameIt = names.constBegin();
00154     QList<int>::const_iterator idIt = ids.constBegin();
00155     for ( ; nameIt != names.constEnd(); ++nameIt, ++idIt )
00156       addMeshItem( myMeshNames, *nameIt, *idIt );
00157   }
00158 }
00159 
00160 // =========================================================================================
00164 // =========================================================================================
00165 
00166 static bool checkItem(QListWidgetItem* theItem)
00167 {
00168   return theItem && (int)theItem->type() != (int)SeparatorItem;
00169 }
00170 
00171 // =========================================================================================
00175 // =========================================================================================
00176 
00177 ListListId SMESHGUI_MeshOrderBox::GetMeshIds() const
00178 {
00179   ListListId aLLIds;
00180   aLLIds.append( QList<int>() );
00181   for ( int i = 0, n = myMeshNames->count(); i < n; i++ )
00182   {
00183     QListWidgetItem* it = myMeshNames->item( i );
00184     if (checkItem( it ))
00185       aLLIds.last().append( it->data( Qt::UserRole ).toInt() );
00186     else // separator before next list of mesh items
00187       aLLIds.append( QList<int>() );
00188   }
00189   return aLLIds;
00190 }
00191 
00192 // =========================================================================================
00196 // =========================================================================================
00197 
00198 ListListName SMESHGUI_MeshOrderBox::GetMeshNames() const
00199 {
00200   ListListName aLLNames;
00201   aLLNames.append( QStringList() );
00202   for ( int i = 0, n = myMeshNames->count(); i < n; i++ )
00203   {
00204     QListWidgetItem* it = myMeshNames->item( i );
00205     if (checkItem( it ))
00206       aLLNames.last().append( it->text() );
00207     else // separator before next list of mesh items
00208       aLLNames.append( QStringList() );
00209   }
00210   return aLLNames;
00211 }
00212 
00213 // =========================================================================================
00217 // =========================================================================================
00218 
00219 void SMESHGUI_MeshOrderBox::onSelectionChanged()
00220 {
00221   bool isUp = false;
00222   bool isDown = false;
00223   QList<QListWidgetItem *> items = myMeshNames->selectedItems();
00224   if ( !items.isEmpty() )
00225   {
00226     QListWidgetItem* selItem = (*(items.begin()));
00227     if (checkItem(selItem))
00228     {
00229       const int rowId = myMeshNames->row( selItem );
00230       isUp   = checkItem( myMeshNames->item( rowId - 1 ) );
00231       isDown = checkItem( myMeshNames->item( rowId + 1 ) );
00232     }
00233   }
00234   myUpBtn->  setEnabled( isUp );
00235   myDownBtn->setEnabled( isDown );
00236 }
00237 
00238 // =========================================================================================
00242 // =========================================================================================
00243 
00244 void SMESHGUI_MeshOrderBox::onMoveItem()
00245 {
00246   moveItem( sender() == myUpBtn );
00247 }
00248 
00249 // =========================================================================================
00253 // =========================================================================================
00254 
00255 void SMESHGUI_MeshOrderBox::moveItem(const bool theIsUp)
00256 {
00257   // move selected list item up or down
00258   QList<QListWidgetItem *> items = myMeshNames->selectedItems();
00259   if ( items.isEmpty() )
00260     return;
00261   QListWidgetItem * selItem = (*(items.begin()));
00262   if (!checkItem(selItem))
00263     return;
00264   int rowId = myMeshNames->row( selItem );
00265   if ( rowId == -1 )
00266     return;
00267 
00268   // move item in list widget
00269   myIsChanged = true;
00270   myMeshNames->takeItem( rowId );
00271   myMeshNames->insertItem(theIsUp ? rowId-1 : rowId+1, selItem );
00272 
00273   // restore selection and current status
00274   selItem->setSelected( true );
00275   myMeshNames->setCurrentItem( selItem );
00276 }
00277 
00278 // =========================================================================================
00282 // =========================================================================================
00283 
00284 bool SMESHGUI_MeshOrderBox:: IsOrderChanged() const
00285 {
00286   return myIsChanged;
00287 }
00288 
00289 // =========================================================================================
00293 // =========================================================================================
00294 
00295 SMESHGUI_MeshOrderDlg::SMESHGUI_MeshOrderDlg(QWidget* theParent)
00296 : SMESHGUI_Dialog( theParent, false, false, OK | Cancel | Help )
00297 {
00298   setWindowTitle( tr( "SMESH_MESHORDER_TITLE") );
00299   QFrame* main = mainFrame();
00300 
00301   QVBoxLayout* aDlgLay = new QVBoxLayout (main);
00302   aDlgLay->setMargin( 0 );
00303   aDlgLay->setSpacing( SPACING );
00304 
00305   myBox = new SMESHGUI_MeshOrderBox( main );
00306 
00307   aDlgLay->addWidget(myBox);
00308   aDlgLay->setStretchFactor(main, 1);
00309 }
00310 
00311 // =========================================================================================
00315 // =========================================================================================
00316 
00317 SMESHGUI_MeshOrderDlg::~SMESHGUI_MeshOrderDlg()
00318 {
00319 }
00320 
00321 // =========================================================================================
00325 // =========================================================================================
00326 
00327 SMESHGUI_MeshOrderBox* SMESHGUI_MeshOrderDlg::GetMeshOrderBox() const
00328 {
00329   return myBox;
00330 }