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(); }
bool MouseNavigator::handleMousePressEvent( QMouseEvent* mouseEvent ) { bool eventUsed = false; if( mouseEvent->button() == Qt::LeftButton ) { ByteArrayTableCursor* tableCursor = mView->tableCursor(); ByteArrayTableRanges* tableRanges = mView->tableRanges(); ByteArrayTableLayout* tableLayout = mView->layout(); const bool oldHasSelection = tableRanges->hasSelection(); mView->pauseCursor(); mView->finishByteEdit(); mLMBPressed = true; // select whole line? if( mTrippleClickTimer->isActive() && (mouseEvent->globalPos()-mDoubleClickPoint).manhattanLength() < QApplication::startDragDistance() ) { mTrippleClickTimer->stop(); const Address indexAtFirstDoubleClickLinePosition = tableLayout->indexAtFirstLinePosition( mDoubleClickLine ); tableRanges->setSelectionStart( indexAtFirstDoubleClickLinePosition ); tableCursor->gotoIndex( indexAtFirstDoubleClickLinePosition ); tableCursor->gotoLineEnd(); tableRanges->setSelectionEnd( mView->cursorPosition() ); mView->updateChanged(); mView->unpauseCursor(); const bool newHasSelection = tableRanges->hasSelection(); emit mView->cursorPositionChanged( mView->cursorPosition() ); emit mView->selectionChanged( tableRanges->selection() ); if( oldHasSelection != newHasSelection ) { if( ! mView->isOverwriteMode() ) emit mView->cutAvailable( newHasSelection ); emit mView->copyAvailable( newHasSelection ); emit mView->hasSelectedDataChanged( newHasSelection ); } } else { // TODO: pos() is now, not at the moment of the event, use globalPos() for that,.says dox const QPoint mousePoint = mView->viewportToColumns( mouseEvent->pos() ); // start of a drag perhaps? if( tableRanges->hasSelection() && tableRanges->selectionIncludes(mView->indexByPoint( mousePoint )) ) { mDragStartPossible = true; mDragStartTimer->start( QApplication::startDragTime() ); mDragStartPoint = mousePoint; } else { mView->placeCursor( mousePoint ); mView->ensureCursorVisible(); const Address realIndex = tableCursor->realIndex(); if( tableRanges->selectionStarted() ) { if( mouseEvent->modifiers() & Qt::SHIFT ) tableRanges->setSelectionEnd( realIndex ); else { tableRanges->removeSelection(); tableRanges->setSelectionStart( realIndex ); } } else // start of a new selection possible { tableRanges->setSelectionStart( realIndex ); if( !mView->isReadOnly() && (mouseEvent->modifiers()&Qt::SHIFT) ) // TODO: why only for readwrite? tableRanges->setSelectionEnd( realIndex ); } tableRanges->removeFurtherSelections(); } if( tableRanges->isModified() ) { mView->updateChanged(); mView->viewport()->setCursor( mView->isReadOnly() ? Qt::ArrowCursor : Qt::IBeamCursor ); } mView->unpauseCursor(); const bool newHasSelection = tableRanges->hasSelection(); emit mView->selectionChanged( tableRanges->selection() ); if( oldHasSelection != newHasSelection ) { if( ! mView->isOverwriteMode() ) emit mView->cutAvailable( newHasSelection ); emit mView->copyAvailable( newHasSelection ); emit mView->hasSelectedDataChanged( newHasSelection ); } } eventUsed = true; } return eventUsed ? true : AbstractMouseController::handleMousePressEvent( mouseEvent ); }
void MouseNavigator::handleMouseMove( const QPoint& point ) // handles the move of the mouse with pressed buttons { ByteArrayTableCursor* tableCursor = mView->tableCursor(); ByteArrayTableRanges* tableRanges = mView->tableRanges(); const bool oldHasSelection = tableRanges->hasSelection(); const int yOffset = mView->yOffset(); const int behindLastYOffset = yOffset + mView->visibleHeight(); // scrolltimer but inside of viewport? if( mScrollTimer->isActive() ) { if( yOffset <= point.y() && point.y() < behindLastYOffset ) mScrollTimer->stop(); } // no scrolltimer and outside of viewport? else { if( point.y() < yOffset || behindLastYOffset <= point.y() ) mScrollTimer->start( DefaultScrollTimerPeriod ); } mView->pauseCursor(); mView->placeCursor( point ); mView->ensureCursorVisible(); // do wordwise selection? if( mInLMBDoubleClick && tableRanges->hasFirstWordSelection() ) { Address newIndex = tableCursor->realIndex(); const AddressRange firstWordSelection = tableRanges->firstWordSelection(); const WordByteArrayService WBS( mView->byteArrayModel(), mView->charCodec() ); // are we before the selection? if( firstWordSelection.startsBehind(newIndex) ) { tableRanges->ensureWordSelectionForward( false ); newIndex = WBS.indexOfLeftWordSelect( newIndex ); } // or behind? else if( firstWordSelection.endsBefore(newIndex) ) { tableRanges->ensureWordSelectionForward( true ); newIndex = WBS.indexOfRightWordSelect( newIndex ); } // or inside? else { tableRanges->ensureWordSelectionForward( true ); newIndex = firstWordSelection.nextBehindEnd(); } tableCursor->gotoIndex( newIndex ); } if( tableRanges->selectionStarted() ) tableRanges->setSelectionEnd( mView->cursorPosition() ); mView->updateChanged(); mView->unpauseCursor(); const bool newHasSelection = tableRanges->hasSelection(); emit mView->cursorPositionChanged( mView->cursorPosition() ); emit mView->selectionChanged( tableRanges->selection() ); if( oldHasSelection != newHasSelection ) { if( ! mView->isOverwriteMode() ) emit mView->cutAvailable( newHasSelection ); emit mView->copyAvailable( newHasSelection ); emit mView->hasSelectedDataChanged( newHasSelection ); } }