📄 segmentselector.cpp
字号:
timeT itemEndTime = itemStartTime + segment->getEndMarkerTime() - segment->getStartTime(); command->addSegment(segment, itemStartTime, itemEndTime, itemTrackId); } addCommandToHistory(command); } m_canvas->getModel()->endChange(); m_canvas->slotUpdateSegmentsDrawBuffer(); } // if we've just finished a quick copy then drop the Z level back if (m_segmentQuickCopyDone) { m_segmentQuickCopyDone = false; // m_currentItem->setZ(2); // see SegmentItem::setSelected --?? } setChangeMade(false); m_selectionMoveStarted = false; m_currentItem = CompositionItem(); setContextHelpFor(e->pos());}intSegmentSelector::handleMouseMove(QMouseEvent *e){ if (!m_buttonPressed) { setContextHelpFor(e->pos(), (e->state() & Qt::ControlButton)); return RosegardenCanvasView::NoFollow; } if (m_dispatchTool) { return m_dispatchTool->handleMouseMove(e); } if (!m_currentItem) { // RG_DEBUG << "SegmentSelector::handleMouseMove: no current item\n"; // do a bounding box QRect selectionRect = m_canvas->getSelectionRect(); m_canvas->setDrawSelectionRect(true); // same as for notation view int w = int(e->pos().x() - selectionRect.x()); int h = int(e->pos().y() - selectionRect.y()); if (w > 0) ++w; else --w; if (h > 0) ++h; else --h; // Translate these points // m_canvas->setSelectionRectSize(w, h); m_canvas->getModel()->signalSelection(); return RosegardenCanvasView::FollowHorizontal | RosegardenCanvasView::FollowVertical; } m_canvas->viewport()->setCursor(Qt::sizeAllCursor); if (m_segmentCopyMode && !m_segmentQuickCopyDone) { KMacroCommand *mcommand = new KMacroCommand (SegmentQuickCopyCommand::getGlobalName()); SegmentSelection selectedItems = m_canvas->getSelectedSegments(); SegmentSelection::iterator it; for (it = selectedItems.begin(); it != selectedItems.end(); it++) { SegmentQuickCopyCommand *command = new SegmentQuickCopyCommand(*it); mcommand->addCommand(command); } addCommandToHistory(mcommand); // generate SegmentItem // m_canvas->updateContents(); m_segmentQuickCopyDone = true; } m_canvas->setSnapGrain(true); if (m_canvas->getModel()->isSelected(m_currentItem)) { if (!m_canvas->isFineGrain()) { setContextHelp(i18n("Hold Shift to avoid snapping to beat grid")); } else { clearContextHelp(); } // RG_DEBUG << "SegmentSelector::handleMouseMove: current item is selected\n"; if (!m_selectionMoveStarted) { // start move on selected items only once m_canvas->getModel()->startChangeSelection(CompositionModel::ChangeMove); m_selectionMoveStarted = true; } CompositionModel::itemcontainer& changingItems = m_canvas->getModel()->getChangingItems(); setCurrentItem(CompositionItemHelper::findSiblingCompositionItem(changingItems, m_currentItem)); CompositionModel::itemcontainer::iterator it; int guideX = 0; int guideY = 0; for (it = changingItems.begin(); it != changingItems.end(); ++it) { // RG_DEBUG << "SegmentSelector::handleMouseMove() : movingItem at " // << (*it)->rect().x() << "," << (*it)->rect().y() << endl; int dx = e->pos().x() - m_clickPoint.x(), dy = e->pos().y() - m_clickPoint.y(); const int inertiaDistance = m_canvas->grid().getYSnap() / 3; if (!m_passedInertiaEdge && (dx < inertiaDistance && dx > -inertiaDistance) && (dy < inertiaDistance && dy > -inertiaDistance)) { return RosegardenCanvasView::NoFollow; } else { m_passedInertiaEdge = true; } timeT newStartTime = m_canvas->grid().snapX((*it)->savedRect().x() + dx); int newX = int(m_canvas->grid().getRulerScale()->getXForTime(newStartTime)); int newY = m_canvas->grid().snapY((*it)->savedRect().y() + dy); // Make sure we don't set a non-existing track if (newY < 0) { newY = 0; } TrackId trackPos = m_canvas->grid().getYBin(newY); // RG_DEBUG << "SegmentSelector::handleMouseMove: orig y " << (*it)->rect().y() // << ", dy " << dy << ", newY " << newY << ", track " << track << endl; // Make sure we don't set a non-existing track (c'td) // TODO: make this suck less. Either the tool should // not allow it in the first place, or we automatically // create new tracks - might make undo very tricky though // if (trackPos >= m_doc->getComposition().getNbTracks()) trackPos = m_doc->getComposition().getNbTracks() - 1; newY = m_canvas->grid().getYBinCoordinate(trackPos); (*it)->moveTo(newX, newY); setChangeMade(true); } if (changeMade()) m_canvas->getModel()->signalContentChange(); guideX = m_currentItem->rect().x(); guideY = m_currentItem->rect().y(); m_canvas->setGuidesPos(guideX, guideY); timeT currentItemStartTime = m_canvas->grid().snapX(m_currentItem->rect().x()); Composition &comp = m_doc->getComposition(); RealTime time = comp.getElapsedRealTime(currentItemStartTime); QString ms; ms.sprintf("%03d", time.msec()); int bar, beat, fraction, remainder; comp.getMusicalTimeForAbsoluteTime(currentItemStartTime, bar, beat, fraction, remainder); QString posString = QString("%1.%2s (%3, %4, %5)") .arg(time.sec).arg(ms) .arg(bar + 1).arg(beat).arg(fraction); m_canvas->setTextFloat(guideX + 10, guideY - 30, posString); m_canvas->updateContents(); } else { // RG_DEBUG << "SegmentSelector::handleMouseMove: current item not selected\n"; } return RosegardenCanvasView::FollowHorizontal | RosegardenCanvasView::FollowVertical;}void SegmentSelector::setContextHelpFor(QPoint p, bool ctrlPressed){ kapp->config()->setGroup(GeneralOptionsConfigGroup); if (!kapp->config()->readBoolEntry("toolcontexthelp", true)) return; CompositionItem item = m_canvas->getFirstItemAt(p); if (!item) { setContextHelp(i18n("Click and drag to select segments; middle-click and drag to draw an empty segment")); } else { // Same logic as in handleMouseButtonPress to establish // whether we'd be moving or resizing int threshold = int(float(item->rect().width()) * 0.15); if (threshold == 0) threshold = 1; if (threshold > 10) threshold = 10; bool start = false; if ((!m_segmentAddMode || !m_canvas->getModel()->haveSelection()) && SegmentResizer::cursorIsCloseEnoughToEdge(item, p, threshold, start)) { if (!ctrlPressed) { setContextHelp(i18n("Click and drag to resize a segment; hold Ctrl as well to rescale its contents")); } else { setContextHelp(i18n("Click and drag to rescale segment")); } } else { if (m_canvas->getModel()->haveMultipleSelection()) { if (!ctrlPressed) { setContextHelp(i18n("Click and drag to move segments; hold Ctrl as well to copy them")); } else { setContextHelp(i18n("Click and drag to copy segments")); } } else { if (!ctrlPressed) { setContextHelp(i18n("Click and drag to move segment; hold Ctrl as well to copy it; double-click to edit")); } else { setContextHelp(i18n("Click and drag to copy segment")); } } } }}const QString SegmentSelector::ToolName = "segmentselector";}#include "SegmentSelector.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -