Files
qt6-migration-pipeline/Lts/Common/LtsScriptTimeline/track_resize_handler.cpp
T

183 lines
5.5 KiB
C++
Executable File

#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 <LtsWidgets/lts_message_dialog.h>
#include <QMouseEvent>
#include <QDebug>
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<TrackEntry *> 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<FilterTrackWidget *> &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();
}
}
}