void Dropper::handleInternalDrag( QDropEvent* dropEvent, AbstractByteArrayView* sourceByteArrayView ) { // get drag origin AddressRange selection = sourceByteArrayView->tableRanges()->removeSelection(); ByteArrayTableCursor* tableCursor = mByteArrayView->tableCursor(); AbstractByteArrayModel* byteArrayModel = mByteArrayView->byteArrayModel(); Address insertIndex = tableCursor->realIndex(); // is this a move? if( dropEvent->proposedAction() == Qt::MoveAction ) { // ignore the copy hold in the event but only move Address newCursorIndex; // need to swap? if( selection.end() < insertIndex ) { newCursorIndex = insertIndex; const Address firstIndex = selection.start(); selection.set( selection.nextBehindEnd(), insertIndex-1 ); insertIndex = firstIndex; } else newCursorIndex = insertIndex + selection.width(); const bool success = byteArrayModel->swap( insertIndex, selection ); if( success ) { tableCursor->gotoCIndex( newCursorIndex ); emit mByteArrayView->cursorPositionChanged( tableCursor->realIndex() ); } } // is a copy else { // TODO: should this be a method of AbstractByteArrayModel, to reuse piece data? // get data const QByteArray data = dropEvent->mimeData()->data( QLatin1String(DropperOctetStreamFormatName) ); if( !data.isEmpty() ) { if( mByteArrayView->isOverwriteMode() ) { const Size length = mByteArrayView->layout()->length(); if( !tableCursor->isBehind() && length > 0 ) { AddressRange overwriteRange = AddressRange::fromWidth( insertIndex, data.size() ); overwriteRange.restrictEndTo( length-1 ); if( overwriteRange.isValid() ) byteArrayModel->replace( overwriteRange, reinterpret_cast<const Byte*>(data.constData()), overwriteRange.width() ); } } else byteArrayModel->insert( insertIndex, reinterpret_cast<const Byte*>(data.constData()), data.size() ); } } }
void KNavigator::moveCursor( KMoveAction action, bool select ) { mView->pauseCursor(); mView->finishByteEdit(); ByteArrayTableCursor* tableCursor = mView->tableCursor(); ByteArrayTableRanges* tableRanges = mView->tableRanges(); if( select ) { if( !tableRanges->selectionStarted() ) tableRanges->setSelectionStart( tableCursor->realIndex() ); } else tableRanges->removeSelection(); switch( action ) { case MoveBackward: tableCursor->gotoPreviousByte(); break; case MoveWordBackward: { const Okteta::WordByteArrayService WBS( mView->byteArrayModel(), mView->charCodec() ); const int newIndex = WBS.indexOfPreviousWordStart( tableCursor->realIndex() ); tableCursor->gotoIndex( newIndex ); } break; case MoveForward: tableCursor->gotoNextByte(); break; case MoveWordForward: { const Okteta::WordByteArrayService WBS( mView->byteArrayModel(), mView->charCodec() ); const int newIndex = WBS.indexOfNextWordStart( tableCursor->realIndex() ); tableCursor->gotoCIndex( newIndex ); } break; case MoveUp: tableCursor->gotoUp(); break; case MovePgUp: tableCursor->gotoPageUp(); break; case MoveDown: tableCursor->gotoDown(); break; case MovePgDown: tableCursor->gotoPageDown(); break; case MoveLineStart: tableCursor->gotoLineStart(); break; case MoveHome: tableCursor->gotoStart(); break; case MoveLineEnd: tableCursor->gotoLineEnd(); break; case MoveEnd: tableCursor->gotoEnd(); break; } if( select ) tableRanges->setSelectionEnd( tableCursor->realIndex() ); if( tableRanges->isModified() ) mView->emitSelectionSignals(); // TODO: can this be moved somewhere emit mView->cursorPositionChanged( tableCursor->realIndex() ); mView->updateChanged(); mView->ensureCursorVisible(); mView->unpauseCursor(); }