#include "track_resize_handler.h" #include "track_entry.h" #include "track_widget.h" #include "track_content_widget.h" #include "filter_track_widget.h" #include "filter_background_widget.h" #include "tools.h" #include #include #include namespace LtsScriptTimeline { void ResizeHandler::mousePressEvent(QMouseEvent *event) { if (event->buttons() != Qt::LeftButton || !m_possible) return; TrackEntry *te = m_trackContentWidget->getTrackEntryOnPos(event->globalPos()); if (te == nullptr) return; m_oldLength = te->m_length; m_resizing = true; } void ResizeHandler::mouseReleaseEvent(QMouseEvent *) { m_resizing = false; if (!m_trackContentWidget->m_mainSelected) return; QVector vecPreviewTrackEntries = {m_trackContentWidget->m_mainSelected}; bool msg = true; for (TrackContentWidget *tcw : qAsConst(m_tcwCorresponding)) { if (TrackContentWidget::checkForParallelTopics(tcw, vecPreviewTrackEntries, m_trackContentWidget->m_mainSelected->m_startTime)) { if (msg) { LtsWidgets::LtsMessageDialog::showMessage(m_trackContentWidget, TrackContentWidget::parallelError(), QObject::tr("Error")); msg = false; } m_trackContentWidget->m_mainSelected->m_length = m_oldLength; } } } bool ResizeHandler::isCollision(int newLength) const { int startTime = m_trackContentWidget->m_mainSelected->m_startTime; int endTime = startTime + newLength; for (auto i = m_trackContentWidget->m_entryList.constBegin(); i != m_trackContentWidget->m_entryList.constEnd(); ++i) { const TrackEntry *trackEntry = *i; if (!trackEntry || trackEntry == m_trackContentWidget->m_mainSelected) continue; if (LtsScriptTimeline::isCollision2(startTime, endTime, trackEntry)) return true; } const QVector &filterTrackWidgets = m_trackContentWidget->trackWidget()->filterLines(); for (const FilterTrackWidget *filterTrackWidget : qAsConst(filterTrackWidgets)) { for (auto iFilterContentWidget = filterTrackWidget->fbw()->filterContentWidgets().begin(); iFilterContentWidget != filterTrackWidget->fbw()->filterContentWidgets().end(); ++iFilterContentWidget) { int filterContentWidgetTopicId = iFilterContentWidget.key(); if (m_trackContentWidget->m_mainSelected->m_topicId != filterContentWidgetTopicId) continue; TrackContentWidget *filterContentWidget = iFilterContentWidget.value(); for (auto iTrackEntry = filterContentWidget->m_entryList.constBegin(); iTrackEntry != filterContentWidget->m_entryList.end(); ++iTrackEntry) { const TrackEntry *trackEntry = *iTrackEntry; if (!trackEntry || trackEntry == m_trackContentWidget->m_mainSelected) continue; if (endTime < startTime + trackEntry->m_startTime + trackEntry->m_length) return true; } } } return false; } bool ResizeHandler::mouseMoveEvent(QMouseEvent *event) { QPoint pos = m_trackContentWidget->mapFromGlobal(event->globalPos()); int posX = pos.x(); int cursorTime = m_trackContentWidget->m_tools->getTime(posX, m_trackContentWidget->m_isFilter); if (m_resizing && m_trackContentWidget->m_mainSelected) { int newLength = cursorTime - m_trackContentWidget->m_mainSelected->m_startTime; int cursorY = pos.y(); if (cursorY < 0 || cursorY > m_trackContentWidget->height() || newLength < 1 || (m_mainTeLength != -1 && newLength > m_mainTeLength) || isCollision(newLength)) { newLength = m_oldLength; m_trackContentWidget->setCursor(Qt::ForbiddenCursor); } else { m_trackContentWidget->setCursor(m_cursor); } m_trackContentWidget->m_mainSelected->m_length = newLength; m_trackContentWidget->update(); emit m_trackContentWidget->signalChangesMade(); return true; } else { TrackEntry *te = m_trackContentWidget->getTrackEntryOnPos(event->globalPos()); if (m_trackContentWidget->m_isFilter) { TrackEntry *mainTe = m_trackContentWidget->getParentTopicOfFilter(te); if (mainTe != nullptr) m_mainTeLength = mainTe->m_length; else m_mainTeLength = -1; } if (te && (te->m_type == LtsScriptTimeline::TrackEntryType::Audio || te->m_type == LtsScriptTimeline::TrackEntryType::Video)) { m_possible = false; m_trackContentWidget->setCursor(m_cursor = Qt::ArrowCursor); m_trackContentWidget->update(); } else if (te && m_trackContentWidget->m_mainSelected && te == m_trackContentWidget->m_mainSelected && m_trackContentWidget->m_selected.count() == 1 && (cursorTime >= (m_trackContentWidget->m_mainSelected->m_startTime + m_trackContentWidget->m_mainSelected->m_length - 4) && cursorTime <= (m_trackContentWidget->m_mainSelected->m_startTime + m_trackContentWidget->m_mainSelected->m_length))) { m_possible = true; m_trackContentWidget->setCursor(m_cursor = Qt::SizeHorCursor); m_trackContentWidget->update(); } else if (!m_resizing) { m_possible = false; m_trackContentWidget->setCursor(m_cursor = Qt::ArrowCursor); m_trackContentWidget->update(); } } return false; } void ResizeHandler::keyPressEvent(QKeyEvent *event) { if (m_trackContentWidget->m_mainSelected && event->key() == Qt::Key_Escape && m_resizing) { m_trackContentWidget->m_mainSelected->m_length = m_oldLength; m_resizing = false; m_possible = false; m_trackContentWidget->setCursor(Qt::ArrowCursor); m_trackContentWidget->update(); } } }