⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 segmentselector.cpp

📁 LINUX下的混音软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                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 + -