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

📄 compositionview.cpp

📁 LINUX下的混音软件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
            if (!ri.isEmpty()) {                CompositionModel::rectcontainer::iterator t = std::find(intersections.begin(),                        intersections.end(), ri);                if (t == intersections.end()) {                    ri.setBrush(mixBrushes(testRect.getBrush(), i->getBrush()));                    ri.setSelected(testRect.isSelected() || i->isSelected());                    intersections.push_back(ri);                }            }        }    }    //    // draw this level of intersections then compute and draw further ones    //    int intersectionLvl = 1;    while (!intersections.empty()) {        for (CompositionModel::rectcontainer::iterator intIter = intersections.begin();                intIter != intersections.end(); ++intIter) {            CompositionRect r = *intIter;            drawCompRect(r, p, clipRect, intersectionLvl);        }        if (intersections.size() > 10)            break; // put a limit on how many intersections we can compute and draw - this grows exponentially        ++intersectionLvl;        CompositionModel::rectcontainer intersections2;        CompositionModel::rectcontainer::iterator i = intersections.begin(),                j = intersections.begin();        for (; j != intersections.end(); ++j) {            CompositionRect testRect = *j;            i = j;            ++i; // set i to pos after j            if (i == intersections.end())                break;            for (; i != intersections.end(); ++i) {                CompositionRect ri = testRect.intersect(*i);                if (!ri.isEmpty() && ri != *i) {                    CompositionModel::rectcontainer::iterator t = std::find(intersections2.begin(),                            intersections2.end(), ri);                    if (t == intersections2.end())                        ri.setBrush(mixBrushes(testRect.getBrush(), i->getBrush()));                    intersections2.push_back(ri);                }            }        }        intersections = intersections2;    }}void CompositionView::drawPointer(QPainter *p, const QRect& clipRect){    //     RG_DEBUG << "CompositionView::drawPointer: clipRect "    // 	     << clipRect.x() << "," << clipRect.y() << " " << clipRect.width()    // 	     << "x" << clipRect.height() << " pointer pos is " << m_pointerPos << endl;    if (m_pointerPos >= clipRect.x() && m_pointerPos <= (clipRect.x() + clipRect.width())) {        p->save();        p->setPen(m_pointerPen);        p->drawLine(m_pointerPos, clipRect.y(), m_pointerPos, clipRect.y() + clipRect.height());        p->restore();    }}void CompositionView::drawTextFloat(QPainter *p, const QRect& clipRect){    QFontMetrics metrics(p->fontMetrics());    QRect bound = p->boundingRect(0, 0, 300, metrics.height() + 6, AlignAuto, m_textFloatText);    p->save();    bound.setLeft(bound.left() - 2);    bound.setRight(bound.right() + 2);    bound.setTop(bound.top() - 2);    bound.setBottom(bound.bottom() + 2);    QPoint pos(m_textFloatPos);    if (pos.y() < 0 && getModel()) {        if (pos.y() + bound.height() < 0) {            pos.setY(pos.y() + getModel()->grid().getYSnap() * 3);        } else {            pos.setY(pos.y() + getModel()->grid().getYSnap() * 2);        }    }    bound.moveTopLeft(pos);    if (bound.intersects(clipRect)) {        p->setBrush(CompositionColourCache::getInstance()->RotaryFloatBackground);        drawRect(bound, p, clipRect, false, 0, true);        p->setPen(CompositionColourCache::getInstance()->RotaryFloatForeground);        p->drawText(pos.x() + 2, pos.y() + 3 + metrics.ascent(), m_textFloatText);    }    p->restore();}bool CompositionView::event(QEvent* e){    if (e->type() == AudioPreviewThread::AudioPreviewQueueEmpty) {        RG_DEBUG << "CompositionView::event - AudioPreviewQueueEmpty\n";        slotSegmentsDrawBufferNeedsRefresh();        viewport()->update();        return true;    }    return RosegardenScrollView::event(e);}void CompositionView::enterEvent(QEvent *e){    kapp->config()->setGroup(GeneralOptionsConfigGroup);    if (!kapp->config()->readBoolEntry("toolcontexthelp", true)) return;    emit showContextHelp(m_toolContextHelp);    m_contextHelpShown = true;}void CompositionView::leaveEvent(QEvent *e){    emit showContextHelp("");    m_contextHelpShown = false;}void CompositionView::slotToolHelpChanged(const QString &text){    if (m_toolContextHelp == text) return;    m_toolContextHelp = text;    kapp->config()->setGroup(GeneralOptionsConfigGroup);    if (!kapp->config()->readBoolEntry("toolcontexthelp", true)) return;    if (m_contextHelpShown) emit showContextHelp(text);}void CompositionView::contentsMousePressEvent(QMouseEvent* e){    Qt::ButtonState bs = e->state();    slotSetSelectCopy((bs & Qt::ControlButton) != 0);    slotSetSelectAdd((bs & Qt::ShiftButton) != 0);    slotSetFineGrain((bs & Qt::ShiftButton) != 0);    switch (e->button()) {    case LeftButton:    case MidButton:        startAutoScroll();        if (m_tool)            m_tool->handleMouseButtonPress(e);        else            RG_DEBUG << "CompositionView::contentsMousePressEvent() :"            << this << " no tool\n";        break;    case RightButton:        if (m_tool)            m_tool->handleRightButtonPress(e);        else            RG_DEBUG << "CompositionView::contentsMousePressEvent() :"            << this << " no tool\n";        break;    default:        break;    }}void CompositionView::contentsMouseReleaseEvent(QMouseEvent* e){    RG_DEBUG << "CompositionView::contentsMouseReleaseEvent()\n";    stopAutoScroll();    if (!m_tool)        return ;    if (e->button() == LeftButton ||        e->button() == MidButton )        m_tool->handleMouseButtonRelease(e);}void CompositionView::contentsMouseDoubleClickEvent(QMouseEvent* e){    m_currentItem = getFirstItemAt(e->pos());    if (!m_currentItem) {        RG_DEBUG << "CompositionView::contentsMouseDoubleClickEvent - no currentItem\n";        RulerScale *ruler = grid().getRulerScale();        if (ruler) emit setPointerPosition(ruler->getTimeForX(e->pos().x()));        return ;    }    RG_DEBUG << "CompositionView::contentsMouseDoubleClickEvent - have currentItem\n";    CompositionItemImpl* itemImpl = dynamic_cast<CompositionItemImpl*>((_CompositionItem*)m_currentItem);    if (m_currentItem->isRepeating()) {        timeT time = getModel()->getRepeatTimeAt(e->pos(), m_currentItem);        RG_DEBUG << "editRepeat at time " << time << endl;        if (time > 0)            emit editRepeat(itemImpl->getSegment(), time);        else            emit editSegment(itemImpl->getSegment());    } else {        emit editSegment(itemImpl->getSegment());    }}void CompositionView::contentsMouseMoveEvent(QMouseEvent* e){    if (!m_tool)        return ;    Qt::ButtonState bs = e->state();    slotSetFineGrain((bs & Qt::ShiftButton) != 0);    int follow = m_tool->handleMouseMove(e);    setScrollDirectionConstraint(follow);    if (follow != RosegardenCanvasView::NoFollow) {        doAutoScroll();        if (follow & RosegardenCanvasView::FollowHorizontal) {            slotScrollHorizSmallSteps(e->pos().x());            // enlarge composition if needed            if (horizontalScrollBar()->value() == horizontalScrollBar()->maxValue()) {                resizeContents(contentsWidth() + m_stepSize, contentsHeight());                setContentsPos(contentsX() + m_stepSize, contentsY());                getModel()->setLength(contentsWidth());                slotUpdateSize();            }        }        if (follow & RosegardenCanvasView::FollowVertical)            slotScrollVertSmallSteps(e->pos().y());    }}void CompositionView::releaseCurrentItem(){    m_currentItem = CompositionItem();}void CompositionView::setPointerPos(int pos){    //     RG_DEBUG << "CompositionView::setPointerPos(" << pos << ")\n";    int oldPos = m_pointerPos;    if (oldPos == pos)        return ;    m_pointerPos = pos;    getModel()->setPointerPos(pos);    // automagically grow contents width if pointer position goes beyond right end    //    if (pos >= (contentsWidth() - m_stepSize)) {        resizeContents(pos + m_stepSize, contentsHeight());        // grow composition too, if needed (it may not be the case if        if (getModel()->getLength() < contentsWidth())            getModel()->setLength(contentsWidth());    }    // interesting -- isAutoScrolling() never seems to return true?    //     RG_DEBUG << "CompositionView::setPointerPos(" << pos << "), isAutoScrolling " << isAutoScrolling() << ", contentsX " << contentsX() << ", m_lastPointerRefreshX " << m_lastPointerRefreshX << ", contentsHeight " << contentsHeight() << endl;    if (contentsX() != m_lastPointerRefreshX) {        m_lastPointerRefreshX = contentsX();        // We'll need to shift the whole canvas anyway, so        slotArtifactsDrawBufferNeedsRefresh();        return ;    }    int deltaW = abs(m_pointerPos - oldPos);    if (deltaW <= m_pointerPen.width() * 2) { // use one rect instead of two separate ones        QRect updateRect        (std::min(m_pointerPos, oldPos) - m_pointerPen.width(), 0,         deltaW + m_pointerPen.width() * 2, contentsHeight());        slotArtifactsDrawBufferNeedsRefresh(updateRect);    } else {        slotArtifactsDrawBufferNeedsRefresh        (QRect(m_pointerPos - m_pointerPen.width(), 0,               m_pointerPen.width() * 2, contentsHeight()));        slotArtifactsDrawBufferNeedsRefresh        (QRect(oldPos - m_pointerPen.width(), 0,               m_pointerPen.width() * 2, contentsHeight()));    }}void CompositionView::setGuidesPos(int x, int y){    m_topGuidePos = x;    m_foreGuidePos = y;    slotArtifactsDrawBufferNeedsRefresh();}void CompositionView::setGuidesPos(const QPoint& p){    m_topGuidePos = p.x();    m_foreGuidePos = p.y();    slotArtifactsDrawBufferNeedsRefresh();}void CompositionView::setDrawGuides(bool d){    m_drawGuides = d;    slotArtifactsDrawBufferNeedsRefresh();}void CompositionView::setTmpRect(const QRect& r){    setTmpRect(r, m_tmpRectFill);}void CompositionView::setTmpRect(const QRect& r, const QColor &c){    QRect pRect = m_tmpRect;    m_tmpRect = r;    m_tmpRectFill = c;    slotUpdateSegmentsDrawBuffer(m_tmpRect | pRect);}void CompositionView::setTextFloat(int x, int y, const QString &text){    m_textFloatPos.setX(x);    m_textFloatPos.setY(y);    m_textFloatText = text;    m_drawTextFloat = true;    slotArtifactsDrawBufferNeedsRefresh();    // most of the time when the floating text is drawn    // we want to update a larger part of the view    // so don't update here    //     QRect r = fontMetrics().boundingRect(x, y, 300, 40, AlignAuto, m_textFloatText);    //     slotUpdateSegmentsDrawBuffer(r);    //    rgapp->slotSetStatusMessage(text);}void CompositionView::slotSetFineGrain(bool value){    m_fineGrain = value;}voidCompositionView::slotTextFloatTimeout(){    hideTextFloat();    slotArtifactsDrawBufferNeedsRefresh();    //    rgapp->slotSetStatusMessage(QString::null);}}#include "CompositionView.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -