📄 chordnameruler.cpp
字号:
ss.insert(*ci); } std::vector<SegmentRefreshMap::iterator> eraseThese; for (SegmentRefreshMap::iterator si = m_segments.begin(); si != m_segments.end(); ++si) { if (ss.find(si->first) == ss.end()) { eraseThese.push_back(si); level = RecalcWhole; NOTATION_DEBUG << "Segment deleted, updating (now have " << m_segments.size() << " segments)" << endl; } } for (std::vector<SegmentRefreshMap::iterator>::iterator ei = eraseThese.begin(); ei != eraseThese.end(); ++ei) { m_segments.erase(*ei); } for (SegmentSelection::iterator si = ss.begin(); si != ss.end(); ++si) { if (m_segments.find(*si) == m_segments.end()) { m_segments.insert(SegmentRefreshMap::value_type (*si, (*si)->getNewRefreshStatusId())); level = RecalcWhole; NOTATION_DEBUG << "Segment created, adding (now have " << m_segments.size() << " segments)" << endl; } } if (m_currentSegment && ss.find(m_currentSegment) == ss.end()) { m_currentSegment = 0; level = RecalcWhole; } } if (!m_chordSegment) m_chordSegment = new Segment(); if (m_segments.empty()) return ; SegmentRefreshStatus overallStatus; overallStatus.setNeedsRefresh(false); for (SegmentRefreshMap::iterator i = m_segments.begin(); i != m_segments.end(); ++i) { SegmentRefreshStatus &status = i->first->getRefreshStatus(i->second); if (status.needsRefresh()) { overallStatus.push(status.from(), status.to()); } } // We now have the overall area affected by these changes, across // all segments. If it's entirely within our displayed area, just // recalculate the displayed area; if it overlaps, calculate the // union of the two areas; if it's entirely without, calculate // nothing. if (level == RecalcNone) { if (from == to) { NOTATION_DEBUG << "ChordNameRuler::recalculate: from==to, recalculating all" << endl; level = RecalcWhole; } else if (overallStatus.from() == overallStatus.to()) { NOTATION_DEBUG << "ChordNameRuler::recalculate: overallStatus.from==overallStatus.to, ignoring" << endl; level = RecalcNone; } else if (overallStatus.from() >= from && overallStatus.to() <= to) { NOTATION_DEBUG << "ChordNameRuler::recalculate: change is " << overallStatus.from() << "->" << overallStatus.to() << ", I show " << from << "->" << to << ", recalculating visible area" << endl; level = RecalcVisible; } else if (overallStatus.from() >= to || overallStatus.to() <= from) { NOTATION_DEBUG << "ChordNameRuler::recalculate: change is " << overallStatus.from() << "->" << overallStatus.to() << ", I show " << from << "->" << to << ", ignoring" << endl; level = RecalcNone; } else { NOTATION_DEBUG << "ChordNameRuler::recalculate: change is " << overallStatus.from() << "->" << overallStatus.to() << ", I show " << from << "->" << to << ", recalculating whole" << endl; level = RecalcWhole; } } if (level == RecalcNone) return ; for (SegmentRefreshMap::iterator i = m_segments.begin(); i != m_segments.end(); ++i) { i->first->getRefreshStatus(i->second).setNeedsRefresh(false); } if (!m_currentSegment) { //!!! arbitrary, must do better //!!! need a segment starting at zero or so with a clef and key in it! m_currentSegment = m_segments.begin()->first; } /*!!! for (Composition::iterator ci = m_composition->begin(); ci != m_composition->end(); ++ci) { if ((*ci)->getEndMarkerTime() >= from && ((*ci)->getStartTime() <= from || (clefKeySegment && (*ci)->getStartTime() < clefKeySegment->getStartTime()))) { clefKeySegment = *ci; } } if (!clefKeySegment) return; } */ if (level == RecalcWhole) { m_chordSegment->clear(); timeT clefKeyTime = m_currentSegment->getStartTime(); //(from < m_currentSegment->getStartTime() ? // m_currentSegment->getStartTime() : from); Clef clef = m_currentSegment->getClefAtTime(clefKeyTime); m_chordSegment->insert(clef.getAsEvent( -1)); ::Rosegarden::Key key = m_currentSegment->getKeyAtTime(clefKeyTime); m_chordSegment->insert(key.getAsEvent( -1)); from = 0; to = 0; } else { Segment::iterator i = m_chordSegment->findTime(from); Segment::iterator j = m_chordSegment->findTime(to); m_chordSegment->erase(i, j); } SegmentSelection selection; for (SegmentRefreshMap::iterator si = m_segments.begin(); si != m_segments.end(); ++si) { selection.insert(si->first); } CompositionTimeSliceAdapter adapter(m_composition, &selection, from, to); AnalysisHelper helper; helper.labelChords(adapter, *m_chordSegment, m_composition->getNotationQuantizer());}voidChordNameRuler::paintEvent(QPaintEvent* e){ if (!m_composition || !m_ready) return ; NOTATION_DEBUG << "*** Chord Name Ruler: paintEvent" << endl; Profiler profiler1("ChordNameRuler::paintEvent (whole)"); QPainter paint(this); paint.setPen(GUIPalette::getColour(GUIPalette::ChordNameRulerForeground)); paint.setClipRegion(e->region()); paint.setClipRect(e->rect().normalize()); QRect clipRect = paint.clipRegion().boundingRect(); timeT from = m_rulerScale->getTimeForX (clipRect.x() - m_currentXOffset - m_xorigin - 50); timeT to = m_rulerScale->getTimeForX (clipRect.x() + clipRect.width() - m_currentXOffset - m_xorigin + 50); recalculate(from, to); if (!m_chordSegment) return ; Profiler profiler2("ChordNameRuler::paintEvent (paint)"); QRect boundsForHeight = m_fontMetrics.boundingRect("^j|lM"); int fontHeight = boundsForHeight.height(); int textY = (height() - 6) / 2 + fontHeight / 2; double prevX = 0; timeT keyAt = from - 1; std::string keyText; NOTATION_DEBUG << "*** Chord Name Ruler: paint " << from << " -> " << to << endl; for (Segment::iterator i = m_chordSegment->findTime(from); i != m_chordSegment->findTime(to); ++i) { NOTATION_DEBUG << "type " << (*i)->getType() << " at " << (*i)->getAbsoluteTime() << endl; if (!(*i)->isa(Text::EventType) || !(*i)->has(Text::TextPropertyName) || !(*i)->has(Text::TextTypePropertyName)) continue; std::string text((*i)->get <String>(Text::TextPropertyName)); if ((*i)->get <String>(Text::TextTypePropertyName) == Text::KeyName) { timeT myTime = (*i)->getAbsoluteTime(); if (myTime == keyAt && text == keyText) continue; else { keyAt = myTime; keyText = text; } } double x = m_rulerScale->getXForTime((*i)->getAbsoluteTime()); (*i)->set <Int>(TEXT_FORMAL_X, (long)x); QRect textBounds = m_fontMetrics.boundingRect(strtoqstr(text)); int width = textBounds.width(); x -= width / 2; if (prevX >= x - 3) x = prevX + 3; (*i)->set <Int>(TEXT_ACTUAL_X, long(x)); prevX = x + width; } for (Segment::iterator i = m_chordSegment->findTime(from); i != m_chordSegment->findTime(to); ++i) { if (!(*i)->isa(Text::EventType)) continue; std::string text((*i)->get <String>(Text::TextPropertyName)); std::string type((*i)->get <String>(Text::TextTypePropertyName)); if (!(*i)->has(TEXT_FORMAL_X)) continue; long formalX = (*i)->get <Int>(TEXT_FORMAL_X); long actualX = (*i)->get <Int>(TEXT_ACTUAL_X); formalX += m_currentXOffset + long(m_xorigin); actualX += m_currentXOffset + long(m_xorigin); paint.drawLine(formalX, height() - 4, formalX, height()); if (type == Text::KeyName) { paint.setFont(m_boldFont); } else { paint.setFont(m_font); } paint.drawText(actualX, textY, strtoqstr(text)); }}}#include "ChordNameRuler.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -