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

📄 chordnameruler.cpp

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