#include "HYDROGUI_ZLevelsDlg.h"
#include "HYDROGUI_ZLevelsModel.h"
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+
#include <QCheckBox>
#include <QLayout>
#include <QListView>
#include <QPushButton>
+#include <QToolButton>
#include <QSignalMapper>
#include <QSortFilterProxyModel>
HYDROGUI_ZLevelsDlg::HYDROGUI_ZLevelsDlg( QWidget* theParent )
: QDialog( theParent )
{
+ setWindowTitle( tr( "CHANGE_LAYER_ORDER" ) );
+
QVBoxLayout* aMainLayout = new QVBoxLayout( this );
aMainLayout->setMargin( 5 );
myList->setModel( aFilteredModel );
- myTop = new QPushButton( tr("TOP") );
- myUp = new QPushButton( tr("UP") );
- myDown = new QPushButton( tr("DOWN") );
- myBottom = new QPushButton( tr("BOTTOM") );
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+ myTop = new QToolButton;
+ myTop->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_TOP_ICO" ) ) );
+ myTop->setIconSize( QSize( 32, 32 ) );
+ myUp = new QToolButton;
+ myUp->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_UP_ICO" ) ) );
+ myUp->setIconSize( myTop->iconSize() );
+ myDown = new QToolButton;
+ myDown->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_DOWN_ICO" ) ) );
+ myDown->setIconSize( myTop->iconSize() );
+ myBottom = new QToolButton;
+ myBottom->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_BOTTOM_ICO" ) ) );
+ myBottom->setIconSize( myTop->iconSize() );
QVBoxLayout* aListButtonsLayout = new QVBoxLayout();
aListButtonsLayout->addWidget( myTop );
aListButtonsLayout->addWidget( myUp );
//
#include "HYDROGUI_ZLevelsModel.h"
+
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+
#include <QMimeData>
const QString OBJ_LIST_MIME_TYPE = "application/hydro.objects.list";
HYDROGUI_ZLevelsModel::HYDROGUI_ZLevelsModel( QObject* theParent )
: QAbstractListModel( theParent )
{
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+
myEmpty = QPixmap( 16, 16 );
myEmpty.fill( Qt::white );
- myEye = QPixmap( "eye.png" );//TODO: loading from resources
+ myEye = aResMgr->loadPixmap( "HYDRO", tr( "EYE_ICO" ) );
setSupportedDragActions( Qt::MoveAction | Qt::CopyAction );
}
aStream >> anId;
anIdsList << anId;
}
- move( anIdsList, DragAndDrop, aDropItemId );
+ qSort( anIdsList ); // TODO should be moved?
+ move( anIdsList, DragAndDrop, false, aDropItemId ); //TODO set visibility?
return true;
}
}
int aDestinationIndex = -1;
+ bool isInsertBefore = false;
switch ( theType ) {
case Up:
+ isInsertBefore = true;
if ( theItem > 0 ) {
aDestinationIndex = theItem - 1;
if ( theIsVisibleOnly ) {
}
break;
case Top:
+ isInsertBefore = true;
if ( theItem > 0 ) {
aDestinationIndex = 0;
}
aDestinationIndex = myObjects.count() - 1;
}
break;
+ case DragAndDrop:
+ if ( theItem > theDropItem ) {
+ isInsertBefore = true;
+ aDestinationIndex = theDropItem;
+ } else {
+ aDestinationIndex = theDropItem - 1;
+ }
+ break;
}
if ( aDestinationIndex >= 0 && aDestinationIndex < myObjects.count() ) {
- int aDestinationRow = (theType == Up || theType == Top) ? aDestinationIndex : aDestinationIndex + 1;
+ int aDestinationRow = isInsertBefore ? aDestinationIndex : aDestinationIndex + 1;
if ( beginMoveRows( QModelIndex(), theItem, theItem, QModelIndex(), aDestinationRow ) ) {
myObjects.move( theItem, aDestinationIndex );
endMoveRows();
{
bool aRes = true;
- bool isReverse = theType == Top || theType == Down;
QListIterator<int> anIt( theItems );
- int aShift = 0;
- if ( isReverse ) {
- anIt.toBack();
- while ( anIt.hasPrevious() ) {
- int anId = anIt.previous();
- if ( theType == Top ) {
- anId += aShift;
- aShift++;
- }
- if ( !move( anId, theType, theIsVisibleOnly, theDropItem ) ) {
- aRes = false;
- break;
+ int aDragShift = 0;
+
+ switch ( theType ) {
+ case Top:
+ case Down:
+ // reverse order
+ anIt.toBack();
+ while ( anIt.hasPrevious() ) {
+ int anId = anIt.previous();
+ if ( theType == Top ) {
+ anId += aDragShift;
+ aDragShift++;
+ }
+ if ( !move( anId, theType, theIsVisibleOnly, theDropItem ) ) {
+ aRes = false;
+ break;
+ }
}
- }
- } else {
- while ( anIt.hasNext() ) {
- int anId = anIt.next();
- if ( theType == Bottom ) {
- anId -= aShift;
- aShift++;
+ break;
+ case Bottom:
+ case Up:
+ // direct order
+ while ( anIt.hasNext() ) {
+ int anId = anIt.next();
+ if ( theType == Bottom ) {
+ anId -= aDragShift;
+ aDragShift++;
+ }
+ if ( !move( anId, theType, theIsVisibleOnly, theDropItem ) ) {
+ aRes = false;
+ break;
+ }
}
- if ( !move( anId, theType, theIsVisibleOnly, theDropItem ) ) {
- aRes = false;
- break;
+ break;
+ case DragAndDrop:
+ // direct order
+ aRes = isDragAndDropAllowed( theItems, theDropItem );
+ if ( aRes ) {
+ int aDropShift = 0;
+ int aDropItem = theDropItem;
+ while ( anIt.hasNext() ) {
+ int anId = anIt.next();
+ aDropItem = theDropItem + aDropShift;
+ if ( anId > aDropItem ) {
+ aDragShift = 0;
+ aDropShift++;
+ } else {
+ anId -= aDragShift;
+ if ( ( aDropItem - anId ) != 1 ) {
+ aDragShift++;
+ }
+ }
+ move( anId, theType, theIsVisibleOnly, aDropItem );
+ }
}
- }
+ break;
+ default:
+ aRes = false;
}
-
- // reset(); //TODO dataChanged?
-
+
return aRes;
}
+bool HYDROGUI_ZLevelsModel::isDragAndDropAllowed( const QList<int>& theItems,
+ const int theDropItem ) const
+{
+ bool isAllowed = false;
+
+ if ( theDropItem >= 0 && theDropItem < myObjects.count() &&
+ !theItems.empty() && theItems.count() < myObjects.count() &&
+ !theItems.contains( theDropItem )) {
+ isAllowed = true;
+ }
+
+ return isAllowed;
+}
{
HYDROGUI_Operation::startOperation();
- // TODO
- abort();
+ HYDROGUI_ZLevelsModel::Object2VisibleList anObject2VisibleList;
+
+ // Get the document
+ Handle(HYDROData_Document) aDoc = doc();
+ if( !aDoc.IsNull() ) {
+ // Get active OCC view id
+ size_t anActiveOCCViewId = HYDROGUI_Tool::GetActiveOCCViewId( module() );
+
+ // Get objects list
+ HYDROData_SequenceOfObjects aSeqOfObjects = aDoc->GetObjectsLayerOrder( Standard_True );
+ HYDROData_SequenceOfObjects::Iterator anIter( aSeqOfObjects );
+ for ( ; anIter.More(); anIter.Next() ) {
+ Handle(HYDROData_Entity) anObject = anIter.Value();
+ if ( !anObject.IsNull() ) {
+ bool isVisible = module()->isObjectVisible( anActiveOCCViewId, anObject );
+ anObject2VisibleList << HYDROGUI_ZLevelsModel::Object2Visible( anObject, isVisible );
+ }
+ }
+ }
+
+ // Show the dialog
+ myZLevelsDlg = new HYDROGUI_ZLevelsDlg( module()->getApp()->desktop() );
+ myZLevelsDlg->setModal( true );
+ myZLevelsDlg->setObjects( anObject2VisibleList );
+
+ //TODO: reimplement
+ connect( myZLevelsDlg, SIGNAL( accepted() ), this, SLOT( commit() ) );
+ connect( myZLevelsDlg, SIGNAL( rejected() ), this, SLOT( abort() ) );
+
+ myZLevelsDlg->exec();
}
bool HYDROGUI_ZLevelsOp::processApply( int& theUpdateFlags,