Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Multimedia
Kdenlive
Commits
7a71de20
Commit
7a71de20
authored
Mar 24, 2019
by
Nicolas Carion
Browse files
[FuzzBug9] Fix edge cases in suggestClipMove
parent
eae6045d
Pipeline
#1848
passed with stage
in 18 minutes and 43 seconds
Changes
3
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
src/timeline2/model/timelinefunctions.cpp
View file @
7a71de20
...
...
@@ -165,7 +165,7 @@ bool TimelineFunctions::requestClipCut(const std::shared_ptr<TimelineItemModel>
std
::
unordered_set
<
int
>
clips
;
for
(
int
cid
:
clipselect
)
{
int
tk
=
timeline
->
getClipTrackId
(
cid
);
if
(
!
timeline
->
getTrackById_const
(
tk
)
->
isLocked
())
{
if
(
tk
!=
-
1
&&
!
timeline
->
getTrackById_const
(
tk
)
->
isLocked
())
{
clips
.
insert
(
cid
);
}
}
...
...
src/timeline2/model/timelinemodel.cpp
View file @
7a71de20
...
...
@@ -85,13 +85,14 @@ RTTR_REGISTRATION
.
method
(
"requestSetSelection"
,
select_overload
<
bool
(
const
std
::
unordered_set
<
int
>
&
)
>
(
&
TimelineModel
::
requestSetSelection
))(
parameter_names
(
"itemIds"
))
.
method
(
"requestFakeClipMove"
,
select_overload
<
bool
(
int
,
int
,
int
,
bool
,
bool
,
bool
)
>
(
&
TimelineModel
::
requestFakeClipMove
))(
parameter_names
(
"clipId"
,
"trackId"
,
"position"
,
"updateView"
,
"logUndo"
,
"invalidateTimeline"
))
.
method
(
"requestFakeGroupMove"
,
select_overload
<
bool
(
int
,
int
,
int
,
int
,
bool
,
bool
)
>
(
&
TimelineModel
::
requestFakeGroupMove
))
.
method
(
"requestFakeGroupMove"
,
select_overload
<
bool
(
int
,
int
,
int
,
int
,
bool
,
bool
)
>
(
&
TimelineModel
::
requestFakeGroupMove
))(
parameter_names
(
"clipId"
,
"groupId"
,
"delta_track"
,
"delta_pos"
,
"updateView"
,
"logUndo"
))
// (parameter_names("clipId", "groupId", "delta_track", "delta_pos", "updateView" "logUndo"))
.
method
(
"suggestClipMove"
,
&
TimelineModel
::
suggestClipMove
)(
parameter_names
(
"clipId"
,
"trackId"
,
"position"
,
"cursorPosition"
,
"snapDistance"
))
.
method
(
"suggestCompositionMove"
,
&
TimelineModel
::
suggestCompositionMove
)(
parameter_names
(
"compoId"
,
"trackId"
,
"position"
,
"cursorPosition"
,
"snapDistance"
))
.
method
(
"addSnap"
,
&
TimelineModel
::
addSnap
)(
parameter_names
(
"pos"
))
.
method
(
"removeSnap"
,
&
TimelineModel
::
addSnap
)(
parameter_names
(
"pos"
))
//
.method("addSnap", &TimelineModel::addSnap)(parameter_names("pos"))
//
.method("removeSnap", &TimelineModel::addSnap)(parameter_names("pos"))
// .method("requestCompositionInsertion", select_overload<bool(const QString &, int, int, int, std::unique_ptr<Mlt::Properties>, int &, bool)>(
// &TimelineModel::requestCompositionInsertion))(
// parameter_names("transitionId", "trackId", "position", "length", "transProps", "id", "logUndo"))
...
...
@@ -717,10 +718,15 @@ int TimelineModel::suggestClipMove(int clipId, int trackId, int position, int cu
TRACE_RES
(
position
);
return
position
;
}
if
(
sourceTrackId
==
-
1
)
{
// not clear what to do hear, if the current move doesn't work. We could try to find empty space, but it might end up being far away...
TRACE_RES
(
currentPos
);
return
currentPos
;
}
// Find best possible move
if
(
!
m_groups
->
isInGroup
(
clipId
))
{
// Try same track move
if
(
trackId
!=
sourceTrackId
)
{
if
(
trackId
!=
sourceTrackId
&&
sourceTrackId
!=
-
1
)
{
qDebug
()
<<
"// TESTING SAME TRACVK MOVE: "
<<
trackId
<<
" = "
<<
sourceTrackId
;
trackId
=
sourceTrackId
;
possible
=
requestClipMove
(
clipId
,
trackId
,
position
,
true
,
false
,
false
);
...
...
tests/regressions.cpp
View file @
7a71de20
...
...
@@ -1131,3 +1131,55 @@ TEST_CASE("FuzzBug8")
}
pCore
->
m_projectManager
=
nullptr
;
}
TEST_CASE
(
"FuzzBug9"
)
{
auto
binModel
=
pCore
->
projectItemModel
();
binModel
->
clean
();
std
::
shared_ptr
<
DocUndoStack
>
undoStack
=
std
::
make_shared
<
DocUndoStack
>
(
nullptr
);
std
::
shared_ptr
<
MarkerListModel
>
guideModel
=
std
::
make_shared
<
MarkerListModel
>
(
undoStack
);
TimelineModel
::
next_id
=
0
;
{
Mock
<
ProjectManager
>
pmMock
;
When
(
Method
(
pmMock
,
undoStack
)).
AlwaysReturn
(
undoStack
);
ProjectManager
&
mocked
=
pmMock
.
get
();
pCore
->
m_projectManager
=
&
mocked
;
TimelineItemModel
tim_0
(
&
reg_profile
,
undoStack
);
Mock
<
TimelineItemModel
>
timMock_0
(
tim_0
);
auto
timeline_0
=
std
::
shared_ptr
<
TimelineItemModel
>
(
&
timMock_0
.
get
(),
[](...)
{});
TimelineItemModel
::
finishConstruct
(
timeline_0
,
guideModel
);
Fake
(
Method
(
timMock_0
,
adjustAssetRange
));
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
undo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
redo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
createProducer
(
reg_profile
,
"60"
,
binModel
,
1
,
true
);
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
undo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
redo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
TrackModel
::
construct
(
timeline_0
,
-
1
,
-
1
,
""
,
false
);
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
undo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
redo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
ClipModel
::
construct
(
timeline_0
,
"2"
,
2
,
PlaylistState
::
Disabled
,
1
);
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
undo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
redo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
{
int
res
=
timeline_0
->
suggestClipMove
(
2
,
1
,
-
34
,
0
,
0
);
}
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
undo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
undoStack
->
redo
();
REQUIRE
(
timeline_0
->
checkConsistency
());
}
pCore
->
m_projectManager
=
nullptr
;
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment