Mercurial > hg > svgui
changeset 753:09e2677e34e7 tonioni
Fix fancy note-editing mode (was not working in new multi-layer world, and shift-click delete was broken)
author | Chris Cannam |
---|---|
date | Tue, 01 Apr 2014 21:18:31 +0100 |
parents | f428bd852580 |
children | 9cfcb2924ee3 785c6f175ccc |
files | layer/FlexiNoteLayer.cpp layer/FlexiNoteLayer.h view/Pane.cpp view/Pane.h |
diffstat | 4 files changed, 82 insertions(+), 58 deletions(-) [+] |
line wrap: on
line diff
--- a/layer/FlexiNoteLayer.cpp Tue Apr 01 16:20:55 2014 +0100 +++ b/layer/FlexiNoteLayer.cpp Tue Apr 01 21:18:31 2014 +0100 @@ -1043,7 +1043,7 @@ m_originalPoint = FlexiNote(m_editingPoint); if (m_editMode == RightBoundary) { - m_dragPointX = v->getXForFrame(m_editingPoint.frame + m_editingPoint.duration); + m_dragPointX = v->getXForFrame(m_editingPoint.frame + m_editingPoint.duration); } else { m_dragPointX = v->getXForFrame(m_editingPoint.frame); } @@ -1079,7 +1079,7 @@ break; } } - std::cerr << "note frame: " << onset << ", left boundary: " << m_greatestLeftNeighbourFrame << ", right boundary: " << m_smallestRightNeighbourFrame << std::endl; + std::cerr << "editStart: mode is " << m_editMode << ", note frame: " << onset << ", left boundary: " << m_greatestLeftNeighbourFrame << ", right boundary: " << m_smallestRightNeighbourFrame << std::endl; } void @@ -1216,41 +1216,50 @@ long frame = v->getFrameForX(e->x()); - splitNotesAt(v, frame); + splitNotesAt(v, frame, e); } void FlexiNoteLayer::splitNotesAt(View *v, int frame) { + splitNotesAt(v, frame, 0); +} + +void +FlexiNoteLayer::splitNotesAt(View *v, int frame, QMouseEvent *e) +{ FlexiNoteModel::PointList onPoints = m_model->getPoints(frame); if (onPoints.empty()) return; FlexiNote note(*onPoints.begin()); - int gap = 0; // MM: I prefer a gap of 0, but we can decide later - - FlexiNote newNote1(note.frame, note.value, - frame - note.frame - gap, - note.level, note.label); - - FlexiNote newNote2(frame, note.value, - note.duration - newNote1.duration, - note.level, note.label); - FlexiNoteModel::EditCommand *command = new FlexiNoteModel::EditCommand (m_model, tr("Edit Point")); command->deletePoint(note); + + if (!e || !(e->modifiers() & Qt::ShiftModifier)) { + + int gap = 0; // MM: I prefer a gap of 0, but we can decide later + + FlexiNote newNote1(note.frame, note.value, + frame - note.frame - gap, + note.level, note.label); + + FlexiNote newNote2(frame, note.value, + note.duration - newNote1.duration, + note.level, note.label); - if (m_intelligentActions) { - if (updateNoteValue(v, newNote1)) { + if (m_intelligentActions) { + if (updateNoteValue(v, newNote1)) { + command->addPoint(newNote1); + } + if (updateNoteValue(v, newNote2)) { + command->addPoint(newNote2); + } + } else { command->addPoint(newNote1); - } - if (updateNoteValue(v, newNote2)) { command->addPoint(newNote2); } - } else { - command->addPoint(newNote1); - command->addPoint(newNote2); } finish(command);
--- a/layer/FlexiNoteLayer.h Tue Apr 01 16:20:55 2014 +0100 +++ b/layer/FlexiNoteLayer.h Tue Apr 01 21:18:31 2014 +0100 @@ -175,6 +175,7 @@ void getRelativeMousePosition(View *v, FlexiNoteModel::Point ¬e, int x, int y, bool &closeToLeft, bool &closeToRight, bool &closeToTop, bool &closeToBottom) const; SparseTimeValueModel *getAssociatedPitchModel(View *v) const; bool updateNoteValue(View *v, FlexiNoteModel::Point ¬e) const; + void splitNotesAt(View *v, int frame, QMouseEvent *e); FlexiNoteModel *m_model; bool m_editing;
--- a/view/Pane.cpp Tue Apr 01 16:20:55 2014 +0100 +++ b/view/Pane.cpp Tue Apr 01 21:18:31 2014 +0100 @@ -344,10 +344,10 @@ } if (layer == getSelectedLayer() && - !shouldIlluminateLocalSelection(discard, b0, b1)) { - - pos = m_identifyPoint; - return m_identifyFeatures; + !shouldIlluminateLocalSelection(discard, b0, b1)) { + + pos = m_identifyPoint; + return m_identifyFeatures; } return false; @@ -364,17 +364,17 @@ !m_manager->getSelections().empty() && !selectionIsBeingEdited()) { - Selection s(getSelectionAt(m_identifyPoint.x(), - closeToLeft, closeToRight)); - - if (!s.isEmpty()) { - if (getSelectedLayer() && getSelectedLayer()->isLayerEditable()) { - - pos = m_identifyPoint; - return true; + Selection s(getSelectionAt(m_identifyPoint.x(), + closeToLeft, closeToRight)); + + if (!s.isEmpty()) { + if (getSelectedLayer() && getSelectedLayer()->isLayerEditable()) { + + pos = m_identifyPoint; + return true; + } } } - } return false; } @@ -1276,6 +1276,18 @@ tr("Shift-click left button and drag to zoom to a rectangular area")); } +Layer * +Pane::getTopFlexiNoteLayer() +{ + for (int i = int(m_layers.size()) - 1; i >= 0; --i) { + if (LayerFactory::getInstance()->getLayerType(m_layers[i]) == + LayerFactory::FlexiNotes) { + return m_layers[i]; + } + } + return 0; +} + void Pane::mousePressEvent(QMouseEvent *e) { @@ -1387,8 +1399,8 @@ } else if (mode == ViewManager::NoteEditMode) { std::cerr << "mouse pressed in note edit mode" << std::endl; - Layer *layer = getSelectedLayer(); - if (layer && layer->isLayerEditable()) { + Layer *layer = getTopFlexiNoteLayer(); + if (layer) { layer->splitStart(this, e); } @@ -1502,11 +1514,22 @@ } else if (mode == ViewManager::NoteEditMode) { //GF: handle mouse release for NoteEditMode (note: works but will need to re-think this a bit later) - Layer *layer = getSelectedLayer(); - if (layer && layer->isLayerEditable()) { + Layer *layer = getTopFlexiNoteLayer(); + + if (layer) { layer->splitEnd(this, e); - update(); } - + update(); + + if (m_editing) { + if (!editSelectionEnd(e)) { + layer->editEnd(this, e); + update(); + } + } + } + + } else if (mode == ViewManager::EditMode) { + if (m_editing) { if (!editSelectionEnd(e)) { Layer *layer = getSelectedLayer(); @@ -1517,19 +1540,6 @@ } } - } else if (mode == ViewManager::EditMode) { - - // GF: edited this previously, but restored to original state - if (m_editing) { - if (!editSelectionEnd(e)) { - Layer *layer = getSelectedLayer(); - if (layer && layer->isLayerEditable()) { - layer->editEnd(this, e); - update(); - } - } - } - } else if (mode == ViewManager::MeasureMode) { Layer *layer = getTopLayer(); @@ -1580,10 +1590,12 @@ // GF: handle mouse move for context sensitive cursor switching in NoteEditMode. // GF: Propagate the event to FlexiNoteLayer. I somehow feel it's best handeled there rather than here, but perhaps not if this will be needed elsewhere too. - if (mode == ViewManager::NoteEditMode && LayerFactory::getInstance()->getLayerType(getTopLayer()) == LayerFactory::FlexiNotes) { - - dynamic_cast<FlexiNoteLayer *>(getTopLayer())->mouseMoveEvent(this, e); - + if (mode == ViewManager::NoteEditMode) { + FlexiNoteLayer *layer = qobject_cast<FlexiNoteLayer *>(getTopFlexiNoteLayer()); + if (layer) { + layer->mouseMoveEvent(this, e); //!!! ew + return; + } } if (mode == ViewManager::SelectMode && hasTopLayerTimeXAxis()) { @@ -1692,8 +1704,8 @@ e->modifiers()); if (!editSelectionStart(&clickEvent)) { - Layer *layer = getSelectedLayer(); - if (layer && layer->isLayerEditable()) { + Layer *layer = getTopFlexiNoteLayer(); + if (layer) { std::cerr << "calling edit start" << std::endl; layer->editStart(this, &clickEvent); }