📄 editviewbase.cpp
字号:
m_needUpdate = false; // Scan all segments and check if they've been modified. // // If we have more than one segment modified, we need to update // them all at once with the same time range, otherwise we can run // into problems when the layout of one depends on the others. So // we use updateStart/End to calculate a bounding range for all // modifications. timeT updateStart = 0, updateEnd = 0; int segmentsToUpdate = 0; Segment *singleSegment = 0; for (unsigned int i = 0; i < m_segments.size(); ++i) { Segment* segment = m_segments[i]; unsigned int refreshStatusId = m_segmentsRefreshStatusIds[i]; SegmentRefreshStatus &refreshStatus = segment->getRefreshStatus(refreshStatusId); if (refreshStatus.needsRefresh() && isCompositionModified()) { // if composition is also modified, relayout everything refreshSegment(0); segmentsToUpdate = 0; break; } else if (m_timeSigNotifier->hasTimeSigChanged()) { // not exactly optimal! refreshSegment(0); segmentsToUpdate = 0; m_timeSigNotifier->reset(); break; } else if (refreshStatus.needsRefresh()) { timeT startTime = refreshStatus.from(), endTime = refreshStatus.to(); if (segmentsToUpdate == 0 || startTime < updateStart) { updateStart = startTime; } if (segmentsToUpdate == 0 || endTime > updateEnd) { updateEnd = endTime; } singleSegment = segment; ++segmentsToUpdate; refreshStatus.setNeedsRefresh(false); m_needUpdate = true; } } if (segmentsToUpdate > 1) { refreshSegment(0, updateStart, updateEnd); } else if (segmentsToUpdate > 0) { refreshSegment(singleSegment, updateStart, updateEnd); } if (e) KMainWindow::paintEvent(e); // moved this to the end of the method so that things called // from this method can still test whether the composition had // been modified (it's sometimes useful to know whether e.g. // any time signatures have changed) setCompositionModified(false); //!!! m_inPaintEvent = false; /* if (m_havePendingPaintEvent) { e = m_pendingPaintEvent; m_havePendingPaintEvent = false; m_pendingPaintEvent = 0; paintEvent(e); delete e; } */}void EditViewBase::closeEvent(QCloseEvent* e){ RG_DEBUG << "EditViewBase::closeEvent()\n"; if (isInCtor()) { RG_DEBUG << "EditViewBase::closeEvent() : is in ctor, ignoring close event\n"; e->ignore(); } else { KMainWindow::closeEvent(e); }}void EditViewBase::addCommandToHistory(KCommand *command){ getCommandHistory()->addCommand(command);}void EditViewBase::setTool(EditTool* tool){ if (m_tool) m_tool->stow(); m_tool = tool; if (m_tool) m_tool->ready();}void EditViewBase::slotCloseWindow(){ close();}void EditViewBase::slotToggleToolBar(){ KTmpStatusMsg msg(i18n("Toggle the toolbar..."), this); if (toolBar()->isVisible()) toolBar()->hide(); else toolBar()->show();}void EditViewBase::slotToggleStatusBar(){ KTmpStatusMsg msg(i18n("Toggle the statusbar..."), this); if (statusBar()->isVisible()) statusBar()->hide(); else statusBar()->show();}void EditViewBase::slotStatusMsg(const QString &text){ /////////////////////////////////////////////////////////////////// // change status message permanently statusBar()->clear(); statusBar()->changeItem(text, ID_STATUS_MSG);}void EditViewBase::slotStatusHelpMsg(const QString &text){ /////////////////////////////////////////////////////////////////// // change status message of whole statusbar temporary (text, msec) statusBar()->message(text, 2000);}void EditViewBase::initSegmentRefreshStatusIds(){ for (unsigned int i = 0; i < m_segments.size(); ++i) { unsigned int rid = m_segments[i]->getNewRefreshStatusId(); m_segmentsRefreshStatusIds.push_back(rid); }}bool EditViewBase::isCompositionModified(){ return getDocument()->getComposition().getRefreshStatus (m_compositionRefreshStatusId).needsRefresh();}void EditViewBase::setCompositionModified(bool c){ getDocument()->getComposition().getRefreshStatus (m_compositionRefreshStatusId).setNeedsRefresh(c);}bool EditViewBase::getSegmentsOnlyRestsAndClefs(){ using Rosegarden::Segment; for (unsigned int i = 0; i < m_segments.size(); ++i) { Segment* segment = m_segments[i]; for (Segment::iterator iter = segment->begin(); iter != segment->end(); ++iter) { if (((*iter)->getType() != Note::EventRestType) && ((*iter)->getType() != Clef::EventType)) return false; } } return true;}void EditViewBase::toggleWidget(QWidget* widget, const QString& toggleActionName){ KToggleAction* toggleAction = getToggleAction(toggleActionName); if (!toggleAction) { RG_DEBUG << "!!! Unknown toggle action : " << toggleActionName << endl; return ; } widget->setShown(toggleAction->isChecked());}voidEditViewBase::slotTestClipboard(){ if (getDocument()->getClipboard()->isEmpty()) { RG_DEBUG << "EditViewBase::slotTestClipboard(): empty" << endl; stateChanged("have_clipboard", KXMLGUIClient::StateReverse); stateChanged("have_clipboard_single_segment", KXMLGUIClient::StateReverse); } else { RG_DEBUG << "EditViewBase::slotTestClipboard(): not empty" << endl; stateChanged("have_clipboard", KXMLGUIClient::StateNoReverse); stateChanged("have_clipboard_single_segment", (getDocument()->getClipboard()->isSingleSegment() ? KXMLGUIClient::StateNoReverse : KXMLGUIClient::StateReverse)); }}voidEditViewBase::slotToggleSolo(){ KToggleAction* toggleSoloAction = getToggleAction("toggle_solo"); if (!toggleSoloAction) return ; bool newSoloState = toggleSoloAction->isChecked(); RG_DEBUG << "EditViewBase::slotToggleSolo() : solo = " << newSoloState << endl; emit toggleSolo(newSoloState); if (newSoloState) { emit selectTrack(getCurrentSegment()->getTrack()); }}voidEditViewBase::slotStateChanged(const QString& s, bool noReverse){ RG_DEBUG << "EditViewBase::slotStateChanged " << s << ", " << noReverse << endl; stateChanged(s, noReverse ? KXMLGUIClient::StateNoReverse : KXMLGUIClient::StateReverse);}voidEditViewBase::slotSetSegmentStartTime(){ Segment *s = getCurrentSegment(); if (!s) return ; TimeDialog dialog(this, i18n("Segment Start Time"), &getDocument()->getComposition(), s->getStartTime(), false); if (dialog.exec() == QDialog::Accepted) { SegmentReconfigureCommand *command = new SegmentReconfigureCommand(i18n("Set Segment Start Time")); command->addSegment (s, dialog.getTime(), s->getEndMarkerTime() - s->getStartTime() + dialog.getTime(), s->getTrack()); addCommandToHistory(command); }}voidEditViewBase::slotSetSegmentDuration(){ Segment *s = getCurrentSegment(); if (!s) return ; TimeDialog dialog(this, i18n("Segment Duration"), &getDocument()->getComposition(), s->getStartTime(), s->getEndMarkerTime() - s->getStartTime(), false); if (dialog.exec() == QDialog::Accepted) { SegmentReconfigureCommand *command = new SegmentReconfigureCommand(i18n("Set Segment Duration")); command->addSegment (s, s->getStartTime(), s->getStartTime() + dialog.getTime(), s->getTrack()); addCommandToHistory(command); }}void EditViewBase::slotCompositionStateUpdate(){ // update state of 'solo' toggle // KToggleAction* toggleSolo = getToggleAction("toggle_solo"); if (!toggleSolo) return ; if (getDocument()->getComposition().isSolo()) { bool s = m_segments[0]->getTrack() == getDocument()->getComposition().getSelectedTrack(); RG_DEBUG << "EditViewBase::slotCompositionStateUpdate() : set solo to " << s << endl; toggleSolo->setChecked(s); } else { toggleSolo->setChecked(false); RG_DEBUG << "EditViewBase::slotCompositionStateUpdate() : set solo to false\n"; } // update the window caption // updateViewCaption();}voidEditViewBase::windowActivationChange(bool oldState){ if (isActiveWindow()) { emit windowActivated(); }}voidEditViewBase::handleEventRemoved(Event *event){ if (m_tool) m_tool->handleEventRemoved(event);}MultiViewCommandHistory* EditViewBase::getCommandHistory(){ return getDocument()->getCommandHistory();}KToggleAction* EditViewBase::getToggleAction(const QString& actionName){ return dynamic_cast<KToggleAction*>(actionCollection()->action(actionName));}}#include "EditViewBase.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -