Changeset View
Changeset View
Standalone View
Standalone View
src/timeline2/model/modelupdater.cpp
Context not available. | |||||
158 | } | 158 | } | ||
---|---|---|---|---|---|
159 | if (!isFirstOperationInsert) { | 159 | if (!isFirstOperationInsert) { | ||
160 | result_clean.emplace_back(new DeleteUpdate(itemId, sourceTimeline, sourceTrackId, sourcePos, isClip)); | 160 | result_clean.emplace_back(new DeleteUpdate(itemId, sourceTimeline, sourceTrackId, sourcePos, isClip)); | ||
161 | return result_clean; | ||||
162 | } else { | ||||
163 | // We insert clip then delete it, so do nothing | ||||
164 | return result_clean; | ||||
161 | } | 165 | } | ||
162 | } | 166 | } | ||
163 | return result; | 167 | return result; | ||
Context not available. | |||||
236 | } | 240 | } | ||
237 | 241 | | |||
238 | // Then, we simplify updates element by element | 242 | // Then, we simplify updates element by element | ||
239 | | ||||
240 | std::vector<std::shared_ptr<AbstractUpdate>> res; | 243 | std::vector<std::shared_ptr<AbstractUpdate>> res; | ||
241 | for (const auto &u : updatesByItem) { | 244 | for (const auto &u : updatesByItem) { | ||
242 | auto curated = mergeChanges(mergeMoves(mergeDeleteInsert(u.second))); | 245 | auto curated = mergeChanges(mergeMoves(mergeDeleteInsert(u.second))); | ||
Context not available. | |||||
309 | }; | 312 | }; | ||
310 | return [ list, getCurrentRow = std::move(getCurrentRow), getTentativeRow = std::move(getTentativeRow) ]() | 313 | return [ list, getCurrentRow = std::move(getCurrentRow), getTentativeRow = std::move(getTentativeRow) ]() | ||
311 | { | 314 | { | ||
315 | QMap <int,int> trackRowOffset; | ||||
316 | for (const auto &u : list) { | ||||
317 | if (u->isInsert()) { | ||||
318 | auto ins = std::static_pointer_cast<InsertUpdate>(u); | ||||
319 | int trackId = ins->getTrackId(); | ||||
320 | if (trackRowOffset.contains(trackId)) { | ||||
321 | int offset = trackRowOffset.value(trackId); | ||||
322 | trackRowOffset[trackId] = offset + 1; | ||||
323 | } else { | ||||
324 | trackRowOffset[trackId] = 0; | ||||
325 | } | ||||
326 | } | ||||
327 | } | ||||
312 | for (const auto &u : list) { | 328 | for (const auto &u : list) { | ||
313 | if (u->isDelete()) { | 329 | if (u->isDelete()) { | ||
314 | auto del = std::static_pointer_cast<DeleteUpdate>(u); | 330 | auto del = std::static_pointer_cast<DeleteUpdate>(u); | ||
Context not available. | |||||
325 | if (auto timeline = ins->getTimeline().lock()) { | 341 | if (auto timeline = ins->getTimeline().lock()) { | ||
326 | int trackId = ins->getTrackId(), itemId = ins->getItemId(); | 342 | int trackId = ins->getTrackId(), itemId = ins->getItemId(); | ||
327 | int row = getTentativeRow(timeline, trackId, itemId, ins->isClip()); | 343 | int row = getTentativeRow(timeline, trackId, itemId, ins->isClip()); | ||
328 | timeline->_beginInsertRows(timeline->makeTrackIndexFromID(trackId), row, row); | 344 | //HACK: workaround for the getTentativeRow that does not work in case of multiple insert in one track | ||
345 | int offset = trackRowOffset.value(trackId); | ||||
346 | if (offset >= 0) { | ||||
347 | timeline->_beginInsertRows(timeline->makeTrackIndexFromID(trackId), row, row + offset); | ||||
348 | trackRowOffset[trackId] = -1; | ||||
349 | } | ||||
329 | } else { | 350 | } else { | ||
330 | qDebug() << "ERROR: impossible to lock timeline"; | 351 | qDebug() << "ERROR: impossible to lock timeline"; | ||
331 | Q_ASSERT(false); | 352 | Q_ASSERT(false); | ||
Context not available. | |||||
334 | auto move = std::static_pointer_cast<MoveUpdate>(u); | 355 | auto move = std::static_pointer_cast<MoveUpdate>(u); | ||
335 | if (auto sTimeline = move->getSourceTimeline().lock()) { | 356 | if (auto sTimeline = move->getSourceTimeline().lock()) { | ||
336 | if (auto tTimeline = move->getTargetTimeline().lock()) { | 357 | if (auto tTimeline = move->getTargetTimeline().lock()) { | ||
337 | int sTrackId = move->getSourceTrackId(), itemId = move->getItemId(); | 358 | int sTrackId = move->getSourceTrackId(); | ||
359 | int itemId = move->getItemId(); | ||||
338 | int tTrackId = move->getTargetTrackId(); | 360 | int tTrackId = move->getTargetTrackId(); | ||
339 | int sRow = getCurrentRow(sTimeline, sTrackId, itemId); | 361 | int sRow = getCurrentRow(sTimeline, sTrackId, itemId); | ||
340 | int tRow = getTentativeRow(tTimeline, tTrackId, itemId, sTimeline->isClip(itemId)); | 362 | int tRow = getTentativeRow(tTimeline, tTrackId, itemId, sTimeline->isClip(itemId)); | ||
Context not available. | |||||
369 | Fun ModelUpdater::postApply_lambda(const std::vector<std::shared_ptr<AbstractUpdate>> &list) | 391 | Fun ModelUpdater::postApply_lambda(const std::vector<std::shared_ptr<AbstractUpdate>> &list) | ||
370 | { | 392 | { | ||
371 | return [list]() { | 393 | return [list]() { | ||
394 | bool insertSent = false; | ||||
372 | for (const auto &u : list) { | 395 | for (const auto &u : list) { | ||
373 | if (u->isDelete()) { | 396 | if (u->isDelete()) { | ||
374 | auto del = std::static_pointer_cast<DeleteUpdate>(u); | 397 | auto del = std::static_pointer_cast<DeleteUpdate>(u); | ||
Context not available. | |||||
379 | Q_ASSERT(false); | 402 | Q_ASSERT(false); | ||
380 | } | 403 | } | ||
381 | } else if (u->isInsert()) { | 404 | } else if (u->isInsert()) { | ||
405 | if (insertSent) { | ||||
406 | continue; | ||||
407 | } | ||||
382 | auto ins = std::static_pointer_cast<InsertUpdate>(u); | 408 | auto ins = std::static_pointer_cast<InsertUpdate>(u); | ||
383 | if (auto timeline = ins->getTimeline().lock()) { | 409 | if (auto timeline = ins->getTimeline().lock()) { | ||
384 | timeline->_endInsertRows(); | 410 | timeline->_endInsertRows(); | ||
411 | insertSent = true; | ||||
385 | } else { | 412 | } else { | ||
386 | qDebug() << "ERROR: impossible to lock timeline"; | 413 | qDebug() << "ERROR: impossible to lock timeline"; | ||
387 | Q_ASSERT(false); | 414 | Q_ASSERT(false); | ||
Context not available. | |||||
434 | } | 461 | } | ||
435 | auto updates = simplify(list); | 462 | auto updates = simplify(list); | ||
436 | auto rev_updates = reverse(updates); | 463 | auto rev_updates = reverse(updates); | ||
437 | | ||||
438 | // firstly, we need to undo the action | 464 | // firstly, we need to undo the action | ||
439 | bool undone = undo(); | 465 | bool undone = undo(); | ||
440 | Q_ASSERT(undone); | 466 | Q_ASSERT(undone); | ||
Context not available. | |||||
588 | 614 | | |||
589 | std::shared_ptr<AbstractUpdate> MoveUpdate::reverse() | 615 | std::shared_ptr<AbstractUpdate> MoveUpdate::reverse() | ||
590 | { | 616 | { | ||
591 | return std::make_shared<MoveUpdate>(m_itemId, m_targetTimeline, m_targetTrackId, m_targetPos, m_targetTimeline, m_targetTrackId, m_targetPos); | 617 | return std::make_shared<MoveUpdate>(m_itemId, m_targetTimeline, m_targetTrackId, m_targetPos, m_sourceTimeline, m_sourceTrackId, m_sourcePos); | ||
592 | } | 618 | } | ||
593 | 619 | | |||
594 | void MoveUpdate::print() const | 620 | void MoveUpdate::print() const | ||
Context not available. | |||||
633 | case TimelineModel::NameRole: | 659 | case TimelineModel::NameRole: | ||
634 | qDebug() << "NameRole"; | 660 | qDebug() << "NameRole"; | ||
635 | break; | 661 | break; | ||
662 | case TimelineModel::TrackIdRole: | ||||
663 | qDebug() << "TrackIdRole"; | ||||
664 | break; | ||||
636 | case TimelineModel::ResourceRole: | 665 | case TimelineModel::ResourceRole: | ||
637 | qDebug() << "ResourceRole"; | 666 | qDebug() << "ResourceRole"; | ||
638 | break; | 667 | break; | ||
Context not available. |