void QcWaveform::mousePressEvent( QMouseEvent *ev ) { _dragAction = NoDragAction; _dragPoint = ev->pos(); _dragFrame = ev->pos().x() * _fpp + _beg; Qt::KeyboardModifiers mods = ev->modifiers(); Qt::MouseButton btn = ev->button(); #ifdef Q_OS_MAC Qt::KeyboardModifier CTRL = Qt::MetaModifier; #else Qt::KeyboardModifier CTRL = Qt::ControlModifier; #endif if( btn == Qt::LeftButton ) { if( (mods & Qt::ShiftModifier) && ( mods & CTRL ) ) { _dragFrame = _selections[_curSel].start; _dragAction = MoveSelection; } else if( mods & Qt::ShiftModifier ) { _dragAction = Select; const Selection &s = _selections[_curSel]; if( _dragFrame < s.start + (s.size*0.5) ) { setSelectionStart( _curSel, _dragFrame ); _dragFrame = s.start + s.size; } else { setSelectionEnd( _curSel, _dragFrame ); _dragFrame = s.start; } Q_EMIT( action() ); } else { if( !(mods & CTRL) ) { _dragAction = Select; _selections[_curSel].start = _dragFrame; _selections[_curSel].size = 0; update(); Q_EMIT( action() ); } if( _cursorEditable ) { _cursorPos = _dragFrame; if( mods & CTRL ) _dragAction = MoveCursor; update(); Q_EMIT( metaAction() ); } } } else if( btn == Qt::RightButton ) { _dragAction = Navigate; _dragData = ev->pos().x() * _fpp + _beg; _dragData2 = zoom(); } }
bool SelectionModifier::modify(EAlteration alter, SelectionDirection direction, TextGranularity granularity) { DCHECK(!frame()->document()->needsLayoutTreeUpdate()); DocumentLifecycle::DisallowTransitionScope disallowTransition( frame()->document()->lifecycle()); willBeModified(alter, direction); bool wasRange = m_selection.isRange(); VisiblePosition originalStartPosition = m_selection.visibleStart(); VisiblePosition position; switch (direction) { case DirectionRight: if (alter == FrameSelection::AlterationMove) position = modifyMovingRight(granularity); else position = modifyExtendingRight(granularity); break; case DirectionForward: if (alter == FrameSelection::AlterationExtend) position = modifyExtendingForward(granularity); else position = modifyMovingForward(granularity); break; case DirectionLeft: if (alter == FrameSelection::AlterationMove) position = modifyMovingLeft(granularity); else position = modifyExtendingLeft(granularity); break; case DirectionBackward: if (alter == FrameSelection::AlterationExtend) position = modifyExtendingBackward(granularity); else position = modifyMovingBackward(granularity); break; } if (position.isNull()) return false; if (isSpatialNavigationEnabled(frame())) { if (!wasRange && alter == FrameSelection::AlterationMove && position.deepEquivalent() == originalStartPosition.deepEquivalent()) return false; } // Some of the above operations set an xPosForVerticalArrowNavigation. // Setting a selection will clear it, so save it to possibly restore later. // Note: the START position type is arbitrary because it is unused, it would // be the requested position type if there were no // xPosForVerticalArrowNavigation set. LayoutUnit x = lineDirectionPointForBlockDirectionNavigation(START); m_selection.setIsDirectional(shouldAlwaysUseDirectionalSelection(frame()) || alter == FrameSelection::AlterationExtend); switch (alter) { case FrameSelection::AlterationMove: m_selection = createVisibleSelection( SelectionInDOMTree::Builder() .collapse(position.toPositionWithAffinity()) .setIsDirectional(m_selection.isDirectional()) .build()); break; case FrameSelection::AlterationExtend: if (!m_selection.isCaret() && (granularity == WordGranularity || granularity == ParagraphGranularity || granularity == LineGranularity) && frame() && !frame() ->editor() .behavior() .shouldExtendSelectionByWordOrLineAcrossCaret()) { // Don't let the selection go across the base position directly. Needed // to match mac behavior when, for instance, word-selecting backwards // starting with the caret in the middle of a word and then // word-selecting forward, leaving the caret in the same place where it // was, instead of directly selecting to the end of the word. VisibleSelection newSelection = m_selection; newSelection.setExtent(position); if (m_selection.isBaseFirst() != newSelection.isBaseFirst()) position = m_selection.visibleBase(); } // Standard Mac behavior when extending to a boundary is grow the // selection rather than leaving the base in place and moving the // extent. Matches NSTextView. if (!frame() || !frame() ->editor() .behavior() .shouldAlwaysGrowSelectionWhenExtendingToBoundary() || m_selection.isCaret() || !isBoundary(granularity)) { m_selection.setExtent(position); } else { TextDirection textDirection = directionOfEnclosingBlock(); if (direction == DirectionForward || (textDirection == LTR && direction == DirectionRight) || (textDirection == RTL && direction == DirectionLeft)) setSelectionEnd(&m_selection, position); else setSelectionStart(&m_selection, position); } break; } if (granularity == LineGranularity || granularity == ParagraphGranularity) m_xPosForVerticalArrowNavigation = x; return true; }