📄 compositionview.cpp
字号:
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 + -