//
#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;
+}