Mercurial > hg > svapp
diff framework/MainWindowBase.cpp @ 184:f701c0c686e5
* Add "Insert Item at Selection" (wording could be improved!)
author | Chris Cannam |
---|---|
date | Mon, 28 Sep 2009 10:39:13 +0000 |
parents | da514e36839a |
children | 9f49d0f1bd20 |
line wrap: on
line diff
--- a/framework/MainWindowBase.cpp Wed Sep 23 11:19:43 2009 +0000 +++ b/framework/MainWindowBase.cpp Mon Sep 28 10:39:13 2009 +0000 @@ -34,6 +34,8 @@ #include "layer/SliceLayer.h" #include "layer/SliceableLayer.h" #include "layer/ImageLayer.h" +#include "layer/NoteLayer.h" +#include "layer/RegionLayer.h" #include "widgets/ListInputDialog.h" #include "widgets/CommandHistory.h" @@ -371,6 +373,10 @@ bool haveCurrentTimeInstantsLayer = (haveCurrentLayer && dynamic_cast<TimeInstantLayer *>(currentLayer)); + bool haveCurrentDurationLayer = + (haveCurrentLayer && + (dynamic_cast<NoteLayer *>(currentLayer) || + dynamic_cast<RegionLayer *>(currentLayer))); bool haveCurrentColour3DPlot = (haveCurrentLayer && dynamic_cast<Colour3DPlotLayer *>(currentLayer)); @@ -404,6 +410,7 @@ emit canPaste(haveClipboardContents); emit canInsertInstant(haveCurrentPane); emit canInsertInstantsAtBoundaries(haveCurrentPane && haveSelection); + emit canInsertItemAtSelection(haveCurrentPane && haveSelection && haveCurrentDurationLayer); emit canRenumberInstants(haveCurrentTimeInstantsLayer && haveSelection); emit canPlaySelection(haveMainModel && havePlayTarget && haveSelection); emit canClearSelection(haveSelection); @@ -753,8 +760,8 @@ size_t start = i->getStartFrame(); size_t end = i->getEndFrame(); if (start != end) { - insertInstantAt(i->getStartFrame()); - insertInstantAt(i->getEndFrame()); + insertInstantAt(start); + insertInstantAt(end); } } } @@ -847,6 +854,84 @@ } void +MainWindowBase::insertItemAtSelection() +{ + MultiSelection::SelectionList selections = m_viewManager->getSelections(); + for (MultiSelection::SelectionList::iterator i = selections.begin(); + i != selections.end(); ++i) { + size_t start = i->getStartFrame(); + size_t end = i->getEndFrame(); + if (start < end) { + insertItemAt(start, end - start); + } + } +} + +void +MainWindowBase::insertItemAt(size_t frame, size_t duration) +{ + Pane *pane = m_paneStack->getCurrentPane(); + if (!pane) { + return; + } + + // ugh! + + size_t alignedStart = pane->alignFromReference(frame); + size_t alignedEnd = pane->alignFromReference(frame + duration); + if (alignedStart >= alignedEnd) return; + size_t alignedDuration = alignedEnd - alignedStart; + + Command *c = 0; + + QString name = tr("Add Item at %1 s") + .arg(RealTime::frame2RealTime + (alignedStart, + getMainModel()->getSampleRate()) + .toText(false).c_str()); + + Layer *layer = pane->getSelectedLayer(); + if (!layer) return; + + RegionModel *rm = dynamic_cast<RegionModel *>(layer->getModel()); + if (rm) { + RegionModel::Point point(alignedStart, + rm->getValueMinimum(), + alignedDuration, + ""); + RegionModel::EditCommand *command = + new RegionModel::EditCommand(rm, tr("Add Point")); + command->addPoint(point); + command->setName(name); + c = command->finish(); + } + + if (c) { + CommandHistory::getInstance()->addCommand(c, false); + return; + } + + NoteModel *nm = dynamic_cast<NoteModel *>(layer->getModel()); + if (nm) { + NoteModel::Point point(alignedStart, + rm->getValueMinimum(), + alignedDuration, + 1.f, + ""); + NoteModel::EditCommand *command = + new NoteModel::EditCommand(nm, tr("Add Point")); + command->addPoint(point); + command->setName(name); + c = command->finish(); + } + + if (c) { + CommandHistory::getInstance()->addCommand(c, false); + return; + } +} + +void MainWindowBase::renumberInstants() { Pane *pane = m_paneStack->getCurrentPane();