Skip to content

Commit

Permalink
Markers refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
rodlie committed Jun 30, 2024
1 parent 3f787b4 commit 5d3f340
Show file tree
Hide file tree
Showing 8 changed files with 104 additions and 48 deletions.
4 changes: 2 additions & 2 deletions src/app/GUI/keysview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -194,15 +194,15 @@ bool KeysView::hasFrameIn(const int frame)
{
if (!mCurrentScene) { return false; }
const auto frameIn = mCurrentScene->getFrameIn();
if (frameIn.first && frame == frameIn.second) { return true; }
if (frameIn.enabled && frame == frameIn.frame) { return true; }
return false;
}

bool KeysView::hasFrameOut(const int frame)
{
if (!mCurrentScene) { return false; }
const auto frameOut = mCurrentScene->getFrameOut();
if (frameOut.first && frame == frameOut.second) { return true; }
if (frameOut.enabled && frame == frameOut.frame) { return true; }
return false;
}

Expand Down
16 changes: 9 additions & 7 deletions src/app/GUI/timelinedockwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,8 @@ void TimelineDockWidget::updateSettingsForCurrentCanvas(Canvas* const canvas)
});
connect(canvas, &Canvas::currentFrameChanged,
this, &TimelineDockWidget::handleCurrentFrameChanged);

update(); // needed for loaded markers
}

void TimelineDockWidget::stopPreview()
Expand All @@ -560,10 +562,10 @@ void TimelineDockWidget::setIn()
const auto scene = *mDocument.fActiveScene;
if (!scene) { return; }
const auto frame = scene->getCurrentFrame();
if (scene->getFrameOut().first) {
if (frame >= scene->getFrameOut().second) { return; }
if (scene->getFrameOut().enabled) {
if (frame >= scene->getFrameOut().frame) { return; }
}
bool apply = (scene->getFrameIn().second != frame);
bool apply = (scene->getFrameIn().frame != frame);
scene->setFrameIn(apply, frame);
}

Expand All @@ -572,10 +574,10 @@ void TimelineDockWidget::setOut()
const auto scene = *mDocument.fActiveScene;
if (!scene) { return; }
const auto frame = scene->getCurrentFrame();
if (scene->getFrameIn().first) {
if (frame <= scene->getFrameIn().second) { return; }
if (scene->getFrameIn().enabled) {
if (frame <= scene->getFrameIn().frame) { return; }
}
bool apply = (scene->getFrameOut().second != frame);
bool apply = (scene->getFrameOut().frame != frame);
scene->setFrameOut(apply, frame);
}

Expand All @@ -584,5 +586,5 @@ void TimelineDockWidget::setMarker()
const auto scene = *mDocument.fActiveScene;
if (!scene) { return; }
const auto frame = scene->getCurrentFrame();
scene->setMarker(tr("Marker"), frame);
scene->setMarker(frame);
}
12 changes: 6 additions & 6 deletions src/app/renderhandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,10 @@ void RenderHandler::renderPreview() {
const auto fIn = mCurrentScene->getFrameIn();
const auto fOut = mCurrentScene->getFrameOut();

mMinRenderFrame = mLoop ? (fIn.first? fIn.second : mCurrentScene->getMinFrame()) - 1:
(fIn.first ? fIn.second : mSavedCurrentFrame);
mMinRenderFrame = mLoop ? (fIn.enabled? fIn.frame : mCurrentScene->getMinFrame()) - 1:
(fIn.enabled ? fIn.frame : mSavedCurrentFrame);

mMaxRenderFrame = fOut.first ? fOut.second : mCurrentScene->getMaxFrame();
mMaxRenderFrame = fOut.enabled ? fOut.frame : mCurrentScene->getMaxFrame();

mCurrentRenderFrame = mMinRenderFrame;
mCurrRenderRange = {mCurrentRenderFrame, mCurrentRenderFrame};
Expand Down Expand Up @@ -285,11 +285,11 @@ void RenderHandler::playPreview() {
TaskScheduler::sClearAllFinishedFuncs();
const auto fIn = mCurrentScene->getFrameIn();
const auto fOut = mCurrentScene->getFrameOut();
const int minPreviewFrame = fIn.first? fIn.second : mSavedCurrentFrame;
const int minPreviewFrame = fIn.enabled? fIn.frame : mSavedCurrentFrame;
const int maxPreviewFrame = qMin(mMaxRenderFrame, mCurrentRenderFrame);
if(minPreviewFrame >= maxPreviewFrame) return;
mMinPreviewFrame = mLoop ? (fIn.first? fIn.second : mCurrentScene->getMinFrame()) : (fIn.first? fIn.second : minPreviewFrame);
mMaxPreviewFrame = fOut.first ? fOut.second : maxPreviewFrame;
mMinPreviewFrame = mLoop ? (fIn.enabled? fIn.frame : mCurrentScene->getMinFrame()) : (fIn.enabled? fIn.frame : minPreviewFrame);
mMaxPreviewFrame = fOut.enabled ? fOut.frame : maxPreviewFrame;
mCurrentPreviewFrame = minPreviewFrame;
mCurrentScene->setSceneFrame(mCurrentPreviewFrame);

Expand Down
1 change: 1 addition & 0 deletions src/core/ReadWrite/evformat.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ namespace EvFormat {
transformEffects2 = 25,
codecProfile = 26,
effectCustomName = 27,
markers = 28,

nextVersion
};
Expand Down
75 changes: 59 additions & 16 deletions src/core/canvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -431,46 +431,48 @@ void Canvas::setFrameRange(const FrameRange &range)
void Canvas::setFrameIn(const bool enabled,
const int frameIn)
{
mIn.first = enabled;
mIn.second = frameIn;
mIn.enabled = enabled;
mIn.frame = frameIn;
emit newFrameRange(mRange);
}

void Canvas::setFrameOut(const bool enabled,
const int frameOut)
{
mOut.first = enabled;
mOut.second = frameOut;
mOut.enabled = enabled;
mOut.frame = frameOut;
emit newFrameRange(mRange);
}

const QPair<bool, int> Canvas::getFrameIn()
const FrameMarker Canvas::getFrameIn()
{
return mIn;
}

const QPair<bool, int> Canvas::getFrameOut()
const FrameMarker Canvas::getFrameOut()
{
return mOut;
}

void Canvas::setMarker(const QString &text,
void Canvas::setMarker(const QString &title,
const int frame)
{
if (hasMarker(frame, true)) { return; }
QString marker = text;
if (marker.isEmpty()) { marker = tr("Marker"); }
mMarkers.push_back({marker, frame});
mMarkers.push_back({title.isEmpty() ? tr("Marker") : title, true, frame});
emit newFrameRange(mRange);
}

void Canvas::setMarker(const int frame)
{
setMarker(tr("Marker"), frame);
}

bool Canvas::hasMarker(const int frame,
const bool removeExists)
{
const auto markers = getMarkers();
int index = 0;
for (const auto &mark: markers) {
if (mark.second == frame) {
for (const auto &mark: mMarkers) {
if (mark.frame == frame) {
if (removeExists) {
mMarkers.erase(mMarkers.begin() + index);
emit newFrameRange(mRange);
Expand All @@ -482,7 +484,7 @@ bool Canvas::hasMarker(const int frame,
return false;
}

const std::vector<QPair<QString, int> > Canvas::getMarkers()
const std::vector<FrameMarker> Canvas::getMarkers()
{
return mMarkers;
}
Expand Down Expand Up @@ -1136,16 +1138,23 @@ void Canvas::writeSettings(eWriteStream& dst) const
dst << mHeight;
dst << mFps;
dst << mRange;

writeMarkers(dst);
}

void Canvas::readSettings(eReadStream& src)
{
int currFrame; src >> currFrame;
int currFrame;
src >> currFrame;
src >> mClipToCanvasSize;
src >> mWidth;
src >> mHeight;
src >> mFps;
FrameRange range; src >> range;
FrameRange range;
src >> range;
if (src.evFileVersion() >= EvFormat::markers) {
readMarkers(src);
}
setFrameRange(range);
anim_setAbsFrame(currFrame);
}
Expand All @@ -1167,6 +1176,40 @@ void Canvas::readBoundingBox(eReadStream& src)
clearGradientRWIds();
}

void Canvas::writeMarkers(eWriteStream &dst) const
{
dst << mIn.enabled;
dst << mIn.frame;
dst << mOut.enabled;
dst << mOut.frame;
QStringList markers;
for (auto &marker: mMarkers) {
QString title = marker.title.isEmpty() ? tr("Marker") : marker.title;
markers << QString("%1:%2").arg(title, QString::number(marker.frame));
}
dst << markers.join(",").toUtf8();
}

void Canvas::readMarkers(eReadStream &src)
{
src >> mIn.enabled;
src >> mIn.frame;
src >> mOut.enabled;
src >> mOut.frame;
QByteArray markerData;
src >> markerData;
mMarkers.clear();
const auto markers = QString::fromUtf8(markerData).split(",");
for (auto &marker: markers) {
const auto content = marker.split(":");
if (content.size() != 2) { continue; }
QString title = content.at(0).isEmpty() ? tr("Marker") : content.at(0);
int frame = content.at(1).toInt();
if (hasMarker(frame)) { continue; }
mMarkers.push_back({title, true, frame});
}
}

void Canvas::writeBoxOrSoundXEV(const stdsptr<XevZipFileSaver>& xevFileSaver,
const RuntimeIdToWriteId& objListIdConv,
const QString& path) const
Expand Down
19 changes: 11 additions & 8 deletions src/core/canvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -357,16 +357,18 @@ class CORE_EXPORT Canvas : public CanvasBase
const int frameIn);
void setFrameOut(const bool enabled,
const int frameOut);
const QPair<bool,int> getFrameIn();
const QPair<bool,int> getFrameOut();
const FrameMarker getFrameIn();
const FrameMarker getFrameOut();

void setMarker(const QString &text,
void setMarker(const QString &title,
const int frame);
void setMarker(const int frame);
bool hasMarker(const int frame,
const bool removeExists = false);
const std::vector<QPair<QString,int>> getMarkers();
const std::vector<FrameMarker> getMarkers();
void clearMarkers();


ColorAnimator *getBgColorAnimator()
{
return mBackgroundColor.get();
Expand Down Expand Up @@ -552,6 +554,8 @@ class CORE_EXPORT Canvas : public CanvasBase
void readSettings(eReadStream &src);
void writeBoundingBox(eWriteStream& dst) const;
void readBoundingBox(eReadStream& src);
void writeMarkers(eWriteStream &dst) const;
void readMarkers(eReadStream &src);

void writeBoxOrSoundXEV(const stdsptr<XevZipFileSaver> &xevFileSaver,
const RuntimeIdToWriteId &objListIdConv,
Expand Down Expand Up @@ -799,10 +803,9 @@ class CORE_EXPORT Canvas : public CanvasBase

std::map<int, stdsptr<ConnContextObjList<GraphAnimator*>>> mSelectedForGraph;

QPair<bool,int> mIn{false, 0};
QPair<bool,int> mOut{false, 0};

std::vector<QPair<QString,int>> mMarkers;
FrameMarker mIn{tr("In"), false, 0};
FrameMarker mOut{tr("Out"), false, 0};
std::vector<FrameMarker> mMarkers;

void handleMovePointMousePressEvent(const eMouseEvent &e);
void handleMovePointMouseMove(const eMouseEvent &e);
Expand Down
7 changes: 7 additions & 0 deletions src/core/framerange.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@
#include <QtCore>

#define TEN_MIL 10000000

struct CORE_EXPORT FrameMarker {
QString title;
bool enabled;
int frame;
};

//! @brief Inclusive range
struct CORE_EXPORT iValueRange {
static int EMIN;
Expand Down
18 changes: 9 additions & 9 deletions src/ui/widgets/framescrollbar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,15 +198,15 @@ bool FrameScrollBar::hasFrameIn(const int frame)
{
if (!mCurrentCanvas) { return false; }
const auto frameIn = mCurrentCanvas->getFrameIn();
if ((frameIn.first && frame == frameIn.second)) { return true; }
if ((frameIn.enabled && frame == frameIn.frame)) { return true; }
return false;
}

bool FrameScrollBar::hasFrameOut(const int frame)
{
if (!mCurrentCanvas) { return false; }
const auto frameOut = mCurrentCanvas->getFrameOut();
if ((frameOut.first && frame == frameOut.second)) { return true; }
if ((frameOut.enabled && frame == frameOut.frame)) { return true; }
return false;
}

Expand Down Expand Up @@ -321,24 +321,24 @@ void FrameScrollBar::mousePressEvent(QMouseEvent *event)
} else if (selectedAction == setFrameInAct) {
if (mCurrentCanvas) {
const auto frame = mCurrentCanvas->getCurrentFrame();
if (mCurrentCanvas->getFrameOut().first) {
if (frame >= mCurrentCanvas->getFrameOut().second) { return; }
if (mCurrentCanvas->getFrameOut().enabled) {
if (frame >= mCurrentCanvas->getFrameOut().frame) { return; }
}
bool apply = (mCurrentCanvas->getFrameIn().second != frame);
bool apply = (mCurrentCanvas->getFrameIn().frame != frame);
mCurrentCanvas->setFrameIn(apply, frame);
}
} else if (selectedAction == setFrameOutAct) {
if (mCurrentCanvas) {
const auto frame = mCurrentCanvas->getCurrentFrame();
if (mCurrentCanvas->getFrameIn().first) {
if (frame <= mCurrentCanvas->getFrameIn().second) { return; }
if (mCurrentCanvas->getFrameIn().enabled) {
if (frame <= mCurrentCanvas->getFrameIn().frame) { return; }
}
bool apply = (mCurrentCanvas->getFrameOut().second != frame);
bool apply = (mCurrentCanvas->getFrameOut().frame != frame);
mCurrentCanvas->setFrameOut(apply, frame);
}
} else if (selectedAction == setMarkerAct) {
if (mCurrentCanvas) {
mCurrentCanvas->setMarker(tr("Marker"), mCurrentCanvas->getCurrentFrame());
mCurrentCanvas->setMarker(mCurrentCanvas->getCurrentFrame());
}
} else if (selectedAction == clearMarkersAct) {
if (mCurrentCanvas) {
Expand Down

0 comments on commit 5d3f340

Please sign in to comment.