smesh/src/SMESHGUI/SMESHGUI_MeshOrderDlg.cxx
2013-04-01 13:05:47 +00:00

331 lines
10 KiB
C++

// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
//
// 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.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : SMESHGUI_MeshOrderDlg.cxx
// Author : Pavel TELKOV, Open CASCADE S.A.S.
// SMESH includes
//
#include "SMESHGUI_MeshOrderDlg.h"
// Qt includes
#include <Qt>
#include <QFrame>
#include <QLabel>
#include <QBoxLayout>
#include <QSpacerItem>
#include <QToolButton>
#include <QListWidget>
#include <QListWidgetItem>
#define SPACING 6
#define MARGIN 11
/*!
* Enumeartion of list widget item types (mesh name or separator)
*/
enum MeshOrderItemType { MeshItem = QListWidgetItem::UserType, SeparatorItem };
// =========================================================================================
/*!
* \brief Constructor
*/
// =========================================================================================
SMESHGUI_MeshOrderBox::SMESHGUI_MeshOrderBox(QWidget* theParent)
: QGroupBox( theParent ), myIsChanged( false ), myUpBtn(0), myDownBtn(0)
{
QHBoxLayout* hBoxLayout = new QHBoxLayout(this);
hBoxLayout->setMargin( MARGIN );
hBoxLayout->setSpacing( SPACING );
myMeshNames = new QListWidget(this);
myMeshNames->setSelectionMode(QAbstractItemView::SingleSelection);
myMeshNames->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding ));
hBoxLayout->addWidget(myMeshNames);
QGroupBox* btnGrp = new QGroupBox(this);
hBoxLayout->addWidget(btnGrp);
myUpBtn = new QToolButton(btnGrp);
myDownBtn = new QToolButton(btnGrp);
myUpBtn-> setArrowType( Qt::UpArrow );
myDownBtn->setArrowType( Qt::DownArrow );
QVBoxLayout* vBoxLayout = new QVBoxLayout(btnGrp);
vBoxLayout->addSpacerItem( new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding ) );
vBoxLayout->addWidget( myUpBtn );
vBoxLayout->addWidget( myDownBtn );
vBoxLayout->addSpacerItem( new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding ) );
connect( myUpBtn, SIGNAL( clicked() ), this, SLOT( onMoveItem() ) );
connect( myDownBtn, SIGNAL( clicked() ), this, SLOT( onMoveItem() ) );
connect( myMeshNames, SIGNAL( itemSelectionChanged() ), this, SLOT( onSelectionChanged() ) );
onSelectionChanged();
}
// =========================================================================================
/*!
* \brief Destructor
*/
//=======================================================================
SMESHGUI_MeshOrderBox::~SMESHGUI_MeshOrderBox()
{
}
// =========================================================================================
/*!
* \brief add separator item
*/
// =========================================================================================
static void addSeparator( QListWidget* theList )
{
QListWidgetItem* item = new QListWidgetItem( theList, SeparatorItem );
QFrame* hline = new QFrame( theList );
hline->setFrameStyle( QFrame::HLine | QFrame::Sunken );
theList->addItem( item );
theList->setItemWidget( item, hline );
}
// =========================================================================================
/*!
* \brief add sub-mesh item
*/
// =========================================================================================
static void addMeshItem( QListWidget* theList,
const QString& theName,
const int theId )
{
QListWidgetItem* item = new QListWidgetItem( theName, theList, MeshItem );
item->setData( Qt::UserRole, theId );
theList->addItem( item );
}
// =========================================================================================
/*!
* \brief Clear submesh names and indeces
*/
// =========================================================================================
void SMESHGUI_MeshOrderBox::Clear()
{
myMeshNames->clear();
myIsChanged = false;
}
// =========================================================================================
/*!
* \brief Set submesh names and indeces
*/
// =========================================================================================
void SMESHGUI_MeshOrderBox::SetMeshes(const ListListName& theMeshNames,
const ListListId& theMeshIds)
{
Clear();
ListListName::const_iterator nLIt = theMeshNames.constBegin();
ListListId::const_iterator idLIt = theMeshIds.constBegin();
for ( ; nLIt != theMeshNames.constEnd(); ++nLIt, ++idLIt )
{
const QStringList& names = (*nLIt);
const QList<int>& ids = (*idLIt);
if ( myMeshNames->count() )
addSeparator( myMeshNames );
QStringList::const_iterator nameIt = names.constBegin();
QList<int>::const_iterator idIt = ids.constBegin();
for ( ; nameIt != names.constEnd(); ++nameIt, ++idIt )
addMeshItem( myMeshNames, *nameIt, *idIt );
}
}
// =========================================================================================
/*!
* \brief cehck that item exists and not a separator
*/
// =========================================================================================
static bool checkItem(QListWidgetItem* theItem)
{
return theItem && (int)theItem->type() != (int)SeparatorItem;
}
// =========================================================================================
/*!
* \brief Returns result (ordered by user) mesh names
*/
// =========================================================================================
ListListId SMESHGUI_MeshOrderBox::GetMeshIds() const
{
ListListId aLLIds;
aLLIds.append( QList<int>() );
for ( int i = 0, n = myMeshNames->count(); i < n; i++ )
{
QListWidgetItem* it = myMeshNames->item( i );
if (checkItem( it ))
aLLIds.last().append( it->data( Qt::UserRole ).toInt() );
else // separator before next list of mesh items
aLLIds.append( QList<int>() );
}
return aLLIds;
}
// =========================================================================================
/*!
* \brief Returns result (ordered by user) mesh indeces
*/
// =========================================================================================
ListListName SMESHGUI_MeshOrderBox::GetMeshNames() const
{
ListListName aLLNames;
aLLNames.append( QStringList() );
for ( int i = 0, n = myMeshNames->count(); i < n; i++ )
{
QListWidgetItem* it = myMeshNames->item( i );
if (checkItem( it ))
aLLNames.last().append( it->text() );
else // separator before next list of mesh items
aLLNames.append( QStringList() );
}
return aLLNames;
}
// =========================================================================================
/*!
* \brief update state of arrow buttons according to selection
*/
// =========================================================================================
void SMESHGUI_MeshOrderBox::onSelectionChanged()
{
bool isUp = false;
bool isDown = false;
QList<QListWidgetItem *> items = myMeshNames->selectedItems();
if ( !items.isEmpty() )
{
QListWidgetItem* selItem = (*(items.begin()));
if (checkItem(selItem))
{
const int rowId = myMeshNames->row( selItem );
isUp = checkItem( myMeshNames->item( rowId - 1 ) );
isDown = checkItem( myMeshNames->item( rowId + 1 ) );
}
}
myUpBtn-> setEnabled( isUp );
myDownBtn->setEnabled( isDown );
}
// =========================================================================================
/*!
* \brief move item according to clicked arrow button
*/
// =========================================================================================
void SMESHGUI_MeshOrderBox::onMoveItem()
{
moveItem( sender() == myUpBtn );
}
// =========================================================================================
/*!
* \brief move mesh in order up or down
*/
// =========================================================================================
void SMESHGUI_MeshOrderBox::moveItem(const bool theIsUp)
{
// move selected list item up or down
QList<QListWidgetItem *> items = myMeshNames->selectedItems();
if ( items.isEmpty() )
return;
QListWidgetItem * selItem = (*(items.begin()));
if (!checkItem(selItem))
return;
int rowId = myMeshNames->row( selItem );
if ( rowId == -1 )
return;
// move item in list widget
myIsChanged = true;
myMeshNames->takeItem( rowId );
myMeshNames->insertItem(theIsUp ? rowId-1 : rowId+1, selItem );
// restore selection and current status
selItem->setSelected( true );
myMeshNames->setCurrentItem( selItem );
}
// =========================================================================================
/*!
* \brief returns status is order changed by user
*/
// =========================================================================================
bool SMESHGUI_MeshOrderBox:: IsOrderChanged() const
{
return myIsChanged;
}
// =========================================================================================
/*!
* \brief Constructor
*/
// =========================================================================================
SMESHGUI_MeshOrderDlg::SMESHGUI_MeshOrderDlg(QWidget* theParent)
: SMESHGUI_Dialog( theParent, false, false, OK | Cancel | Help )
{
setWindowTitle( tr( "SMESH_MESHORDER_TITLE") );
QFrame* main = mainFrame();
QVBoxLayout* aDlgLay = new QVBoxLayout (main);
aDlgLay->setMargin( 0 );
aDlgLay->setSpacing( SPACING );
myBox = new SMESHGUI_MeshOrderBox( main );
aDlgLay->addWidget(myBox);
aDlgLay->setStretchFactor(main, 1);
}
// =========================================================================================
/*!
* \brief Destructor
*/
// =========================================================================================
SMESHGUI_MeshOrderDlg::~SMESHGUI_MeshOrderDlg()
{
}
// =========================================================================================
/*!
* \brief return Box widget to show mesh order
*/
// =========================================================================================
SMESHGUI_MeshOrderBox* SMESHGUI_MeshOrderDlg::GetMeshOrderBox() const
{
return myBox;
}