📄 compositionmodelimpl.cpp
字号:
// point for that hue were taking a value of 255 with the (s < v) // formula, so I added an extra hack to force hues in those two narrow // ranges toward black. Black always looks good, while white washes out // badly against intense yellow, and doesn't look very good against // intense green either... hacky, but this produces pleasant results against // every bizarre extreme of color I could cook up to throw at it, plus // (the real reason for all this convoluted fiddling, it does all that while keeping // white against bright reds and blues, which looks better than black) if ( ((((h > 57) && (h < 66)) || ((h > 93) && (h < 131))) && (s > 127) && (v > 127) ) || (s < v) ) { v = 0; } else { v = 255; } s = 31; h += 180; segColor.setHsv(h, s, v); return segColor;}void CompositionModelImpl::updatePreviewCacheForAudioSegment(const Segment* segment, AudioPreviewData* apData){ if (m_audioPreviewThread) { // std::cerr << "CompositionModelImpl::updatePreviewCacheForAudioSegment() - new audio preview started" << std::endl; CompositionRect segRect = computeSegmentRect(*segment); segRect.setWidth(segRect.getBaseWidth()); // don't use repeating area segRect.moveTopLeft(QPoint(0, 0)); if (apData) apData->setSegmentRect(segRect); if (m_audioPreviewUpdaterMap.find(segment) == m_audioPreviewUpdaterMap.end()) { AudioPreviewUpdater *updater = new AudioPreviewUpdater (*m_audioPreviewThread, m_composition, segment, segRect, this); connect(updater, SIGNAL(audioPreviewComplete(AudioPreviewUpdater*)), this, SLOT(slotAudioPreviewComplete(AudioPreviewUpdater*))); m_audioPreviewUpdaterMap[segment] = updater; } else { m_audioPreviewUpdaterMap[segment]->setDisplayExtent(segRect); } m_audioPreviewUpdaterMap[segment]->update(); } else { RG_DEBUG << "CompositionModelImpl::updatePreviewCacheForAudioSegment() - no audio preview thread set\n"; }}void CompositionModelImpl::slotAudioPreviewComplete(AudioPreviewUpdater* apu){ RG_DEBUG << "CompositionModelImpl::slotAudioPreviewComplete()\n"; AudioPreviewData *apData = getAudioPreviewData(apu->getSegment()); QRect updateRect; if (apData) { RG_DEBUG << "CompositionModelImpl::slotAudioPreviewComplete(" << apu << "): apData contains " << apData->getValues().size() << " values already" << endl; unsigned int channels = 0; const std::vector<float> &values = apu->getComputedValues(channels); if (channels > 0) { RG_DEBUG << "CompositionModelImpl::slotAudioPreviewComplete: set " << values.size() << " samples on " << channels << " channels\n"; apData->setChannels(channels); apData->setValues(values); updateRect = postProcessAudioPreview(apData, apu->getSegment()); } } if (!updateRect.isEmpty()) emit needContentUpdate(updateRect);}QRect CompositionModelImpl::postProcessAudioPreview(AudioPreviewData* apData, const Segment* segment){ // RG_DEBUG << "CompositionModelImpl::postProcessAudioPreview()\n"; AudioPreviewPainter previewPainter(*this, apData, m_composition, segment); previewPainter.paintPreviewImage(); m_audioSegmentPreviewMap[segment] = previewPainter.getPreviewImage(); return previewPainter.getSegmentRect();}void CompositionModelImpl::slotInstrumentParametersChanged(InstrumentId id){ std::cerr << "CompositionModelImpl::slotInstrumentParametersChanged()\n"; const Composition::segmentcontainer& segments = m_composition.getSegments(); Composition::segmentcontainer::iterator segEnd = segments.end(); for (Composition::segmentcontainer::iterator i = segments.begin(); i != segEnd; ++i) { Segment* s = *i; TrackId trackId = s->getTrack(); Track *track = getComposition().getTrackById(trackId); // We need to update the cache for audio segments, because the // instrument playback level is reflected in the audio // preview. And we need to update it for midi segments, // because the preview style differs depending on whether the // segment is on a percussion instrument or not if (track && track->getInstrument() == id) { removePreviewCache(s); emit needContentUpdate(computeSegmentRect(*s)); } }}void CompositionModelImpl::slotAudioFileFinalized(Segment* s){ // RG_DEBUG << "CompositionModelImpl::slotAudioFileFinalized()\n"; removePreviewCache(s);}PixmapArray CompositionModelImpl::getAudioPreviewPixmap(const Segment* s){ getAudioPreviewData(s); return m_audioSegmentPreviewMap[s];}void CompositionModelImpl::eventAdded(const Segment *s, Event *){ // RG_DEBUG << "CompositionModelImpl::eventAdded()\n"; removePreviewCache(s); emit needContentUpdate(computeSegmentRect(*s));}void CompositionModelImpl::eventRemoved(const Segment *s, Event *){ // RG_DEBUG << "CompositionModelImpl::eventRemoved" << endl; removePreviewCache(s); emit needContentUpdate(computeSegmentRect(*s));}void CompositionModelImpl::appearanceChanged(const Segment *s){ // RG_DEBUG << "CompositionModelImpl::appearanceChanged" << endl; clearInCache(s, true); emit needContentUpdate(computeSegmentRect(*s));}void CompositionModelImpl::endMarkerTimeChanged(const Segment *s, bool shorten){ // RG_DEBUG << "CompositionModelImpl::endMarkerTimeChanged(" << shorten << ")" << endl; clearInCache(s, true); if (shorten) { emit needContentUpdate(); // no longer know former segment dimension } else { emit needContentUpdate(computeSegmentRect(*s)); }}void CompositionModelImpl::makePreviewCache(const Segment *s){ if (s->getType() == Segment::Internal) { makeNotationPreviewDataCache(s); } else { makeAudioPreviewDataCache(s); }}void CompositionModelImpl::removePreviewCache(const Segment *s){ if (s->getType() == Segment::Internal) { m_notationPreviewDataCache.remove(const_cast<Segment*>(s)); } else { m_audioPreviewDataCache.remove(const_cast<Segment*>(s)); m_audioSegmentPreviewMap.erase(s); }}void CompositionModelImpl::segmentAdded(const Composition *, Segment *s){ makePreviewCache(s); s->addObserver(this); emit needContentUpdate();}void CompositionModelImpl::segmentRemoved(const Composition *, Segment *s){ QRect r = computeSegmentRect(*s); m_selectedSegments.erase(s); clearInCache(s, true); s->removeObserver(this); m_recordingSegments.erase(s); // this could be a recording segment emit needContentUpdate(r);}void CompositionModelImpl::segmentRepeatChanged(const Composition *, Segment *s, bool){ clearInCache(s); emit needContentUpdate();}void CompositionModelImpl::endMarkerTimeChanged(const Composition *, bool){ emit needSizeUpdate();}void CompositionModelImpl::setSelectionRect(const QRect& r){ m_selectionRect = r.normalize(); m_previousTmpSelectedSegments = m_tmpSelectedSegments; m_tmpSelectedSegments.clear(); const Composition::segmentcontainer& segments = m_composition.getSegments(); Composition::segmentcontainer::iterator segEnd = segments.end(); QRect updateRect = m_selectionRect; for (Composition::segmentcontainer::iterator i = segments.begin(); i != segEnd; ++i) { Segment* s = *i; CompositionRect sr = computeSegmentRect(*s); if (sr.intersects(m_selectionRect)) { m_tmpSelectedSegments.insert(s); updateRect |= sr; } } updateRect = updateRect.normalize(); if (!updateRect.isNull() && !m_previousSelectionUpdateRect.isNull()) { if (m_tmpSelectedSegments != m_previousTmpSelectedSegments) emit needContentUpdate(updateRect | m_previousSelectionUpdateRect); emit needArtifactsUpdate(); } m_previousSelectionUpdateRect = updateRect;}void CompositionModelImpl::finalizeSelectionRect(){ const Composition::segmentcontainer& segments = m_composition.getSegments(); Composition::segmentcontainer::iterator segEnd = segments.end(); for (Composition::segmentcontainer::iterator i = segments.begin(); i != segEnd; ++i) { Segment* s = *i; CompositionRect sr = computeSegmentRect(*s); if (sr.intersects(m_selectionRect)) { setSelected(s); } } m_previousSelectionUpdateRect = m_selectionRect = QRect(); m_tmpSelectedSegments.clear();}QRect CompositionModelImpl::getSelectionContentsRect(){ QRect selectionRect; SegmentSelection sel = getSelectedSegments(); for (SegmentSelection::iterator i = sel.begin(); i != sel.end(); ++i) { Segment* s = *i; CompositionRect sr = computeSegmentRect(*s); selectionRect |= sr; } return selectionRect;}void CompositionModelImpl::addRecordingItem(const CompositionItem& item){ m_recordingSegments.insert(CompositionItemHelper::getSegment(item)); emit needContentUpdate(); RG_DEBUG << "CompositionModelImpl::addRecordingItem: now have " << m_recordingSegments.size() << " recording items\n";}void CompositionModelImpl::removeRecordingItem(const CompositionItem &item){ Segment* s = CompositionItemHelper::getSegment(item); m_recordingSegments.erase(s); clearInCache(s, true); emit needContentUpdate(); RG_DEBUG << "CompositionModelImpl::removeRecordingItem: now have " << m_recordingSegments.size() << " recording items\n";}void CompositionModelImpl::clearRecordingItems(){ for (recordingsegmentset::iterator i = m_recordingSegments.begin(); i != m_recordingSegments.end(); ++i) clearInCache(*i, true); m_recordingSegments.clear(); emit needContentUpdate(); RG_DEBUG << "CompositionModelImpl::clearRecordingItem\n";}bool CompositionModelImpl::isMoving(const Segment* sm) const{ itemcontainer::const_iterator movEnd = m_changingItems.end(); for (itemcontainer::const_iterator i = m_changingItems.begin(); i != movEnd; ++i) { const CompositionItemImpl* ci = dynamic_cast<const CompositionItemImpl*>((_CompositionItem*)(*i)); const Segment* s = ci->getSegment(); if (sm == s) return true; } return false;}bool CompositionModelImpl::isRecording(const Segment* s) const{ return m_recordingSegments.find(const_cast<Segment*>(s)) != m_recordingSegments.end();}CompositionModel::itemcontainer CompositionModelImpl::getItemsAt(const QPoint& point){ itemcontainer res; const Composition::segmentcontainer& segments = m_composition.getSegments(); for (Composition::segmentcontainer::iterator i = segments.begin(); i != segments.end(); ++i) { Segment* s = *i; CompositionRect sr = computeSegmentRect(*s); if (sr.contains(point)) { // RG_DEBUG << "CompositionModelImpl::getItemsAt() adding " << sr << " for segment " << s << endl; CompositionItem item(new CompositionItemImpl(*s, sr)); unsigned int z = computeZForSegment(s); // RG_DEBUG << "CompositionModelImpl::getItemsAt() z = " << z << endl; item->setZ(z); res.insert(item); } else { // RG_DEBUG << "CompositionModelImpl::getItemsAt() skiping " << sr << endl; } } if (res.size() == 1) { // only one segment under click point Segment* s = CompositionItemHelper::getSegment(*(res.begin())); m_segmentOrderer.segmentClicked(s); } return res;}void CompositionModelImpl::setPointerPos(int xPos){ m_pointerTimePos = grid().getRulerScale()->getTimeForX(xPos); for (recordingsegmentset::iterator i = m_recordingSegments.begin(); i != m_recordingSegments.end(); ++i) { emit needContentUpdate(computeSegmentRect(**i)); }}void CompositionModelImpl::setSelected(const CompositionItem& item, bool selected){ const CompositionItemImpl* itemImpl = dynamic_cast<const CompositionItemImpl*>((_CompositionItem*)item); if (itemImpl) { Segment* segment = const_cast<Segment*>(itemImpl->getSegment()); setSelected(segment, selected); }}void CompositionModelImpl::setSelected(const itemcontainer& items){ for (itemcontainer::const_iterator i = items.begin(); i != items.end(); ++i) { setSelected(*i); }}void CompositionModelImpl::setSelected(const Segment* segment, bool selected){ RG_DEBUG << "CompositionModelImpl::setSelected " << segment << " - " << selected << endl; if (selected) { if (!isSelected(segment)) m_selectedSegments.insert(const_cast<Segment*>(segment)); } else { SegmentSelection::iterator i = m_selectedSegments.find(const_cast<Segment*>(segment)); if (i != m_selectedSegments.end()) m_selectedSegments.erase(i); } emit needContentUpdate();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -