183 lines
5.5 KiB
C++
Executable File
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();
|
|
}
|
|
}
|
|
}
|