Compare commits

..

317 Commits

Author SHA1 Message Date
Andreas Sturmlechner
173ce96285 Port to QtWebEngineWidgets
Fixes https://invent.kde.org/multimedia/kdenlive/-/issues/775

Signed-off-by: Andreas Sturmlechner <asturm@gentoo.org>
2020-11-05 09:47:24 +00:00
l10n daemon script
ddae45aebb GIT_SILENT made messages (after extraction) 2020-11-05 02:24:30 +01:00
Jean-Baptiste Mardelle
94303d6531 Fix audio mix same track transition crossfade
Related to #796
2020-11-03 20:59:06 +01:00
Jean-Baptiste Mardelle
136ad56966 Fix on monitor mess and possible crash with several transform effects 2020-11-03 17:10:24 +01:00
l10n daemon script
15045192d5 GIT_SILENT made messages (after extraction) 2020-11-01 02:24:00 +01:00
Christoph Feck
31a9b0424e GIT_SILENT Update Appstream for new release
(cherry picked from commit 3884687b86)
2020-10-31 18:14:39 +01:00
l10n daemon script
a1fd4d7330 GIT_SILENT made messages (after extraction) 2020-10-30 02:28:50 +01:00
l10n daemon script
9de5447253 GIT_SILENT made messages (after extraction) 2020-10-29 02:28:20 +01:00
l10n daemon script
daf3ee8c4a GIT_SILENT made messages (after extraction) 2020-10-28 02:24:57 +01:00
Jean-Baptiste Mardelle
bc69822889 When moving a clip outside a mix, correctly resize the clip.
Relate to #796
2020-10-27 14:23:01 +01:00
Jean-Baptiste Mardelle
f6c87416c4 Fix audio thumbs not reloaded on profile fps changed 2020-10-27 14:09:44 +01:00
l10n daemon script
d84dacb54f GIT_SILENT made messages (after extraction) 2020-10-27 02:24:20 +01:00
Jean-Baptiste Mardelle
735bf84b17 Fix some compile warnings 2020-10-23 23:38:06 +02:00
Jean-Baptiste Mardelle
8f43cbb7c7 Try to improve default OpenGL format for monitor view 2020-10-23 23:37:36 +02:00
Jean-Baptiste Mardelle
5dae30174d Fix on monitor displayed fps with high fps values 2020-10-23 23:34:51 +02:00
Jean-Baptiste Mardelle
93a40647ad Remove icons that are included in Breeze icon theme by default 2020-10-23 21:12:07 +02:00
Jean-Baptiste Mardelle
0748c3c4a3 Merge branch 'sametrack'
implement #796
2020-10-23 12:54:05 +02:00
Jean-Baptiste Mardelle
0e57fe1e8f Merge branch 'lintondawson/kdenlive-multiple-track-deletion' 2020-10-23 12:04:19 +02:00
Pushkar Kukde
c92da2590d Fixed ui dsiplay box and undo redo stack 2020-10-23 09:54:27 +00:00
Pushkar Kukde
970df3918a Fixed indentation 2020-10-23 09:54:27 +00:00
Pushkar Kukde
708592573f Removed unnecessary code 2020-10-23 09:54:27 +00:00
Pushkar Kukde
791e2d060b Added multiple track deletion feature 2020-10-23 09:54:27 +00:00
Jean-Baptiste Mardelle
3af486f289 Correctly reload mix params on project opening 2020-10-23 11:00:47 +02:00
Jean-Baptiste Mardelle
d8f08ed37c Ensure mix parenting is updated in case of clip cut 2020-10-23 10:28:58 +02:00
Jean-Baptiste Mardelle
20311cb59d Add new option to apply bin tag color to timeline clips, enabled by default 2020-10-23 09:49:31 +02:00
Jean-Baptiste Mardelle
65cba8aa09 small update in mix look 2020-10-22 22:43:47 +02:00
Jean-Baptiste Mardelle
2f9edda61c Ensure timeline ruler is correctly updated on profile switch.
Related to #819
2020-10-22 21:08:19 +02:00
Jean-Baptiste Mardelle
f8cd54b2e4 Add missing include for some frameworks versions 2020-10-22 19:40:45 +02:00
Jean-Baptiste Mardelle
9c9c327bdb Move audio max level to a job (was causing ui hang on project opening)
Remove audio balance filter in projects with > 2 audio channels
2020-10-22 19:37:15 +02:00
Jean-Baptiste Mardelle
a12ba6dfa4 When switching project profile and there is only 1 clip in timeline, update the timeline clip duration accordingly to profile change.
Fixes #819
2020-10-22 10:25:37 +02:00
Jean-Baptiste Mardelle
9b615fca5e Show tooltip for clip fade corner hotspot 2020-10-22 08:38:24 +02:00
Jean-Baptiste Mardelle
453cf95a62 Remove deprecated KF5 call 2020-10-22 08:38:00 +02:00
Jean-Baptiste Mardelle
978b4225ae Fix compilation 2020-10-22 00:05:34 +02:00
Jean-Baptiste Mardelle
9e077005c7 Project archiving: check after each file if archiving works, add option to use zip instead of tar.gz
CCBUG: 421565
2020-10-22 00:01:35 +02:00
Jean-Baptiste Mardelle
c18bf45a70 Fix opening project files with missing version number
CCBUG: 420494
2020-10-21 21:17:47 +02:00
Jean-Baptiste Mardelle
76b9492d05 Don't enforce stereo output on playback
Related to #754
2020-10-20 20:46:22 +02:00
Jean-Baptiste Mardelle
356cb41704 Refactor rendering timecode overlay feature.
Fixes #815
2020-10-20 18:50:12 +02:00
Jean-Baptiste Mardelle
b65689cb15 Fix duplicated audio from previous commit.
Related to #816
2020-10-20 18:00:20 +02:00
Jean-Baptiste Mardelle
8e3163b260 Fix playlist clips have no audio regression.
Fixes #816
2020-10-20 17:39:31 +02:00
Jean-Baptiste Mardelle
ed5e0ed3dc Fix keyframeable effect params left enabled when selecting a clip, leading to possible crash 2020-10-20 16:36:35 +02:00
Jean-Baptiste Mardelle
3986e1b48e Don't allow removing the only keyframe in an effect (was possible from the on monitor toolbar and crashing) 2020-10-19 11:16:43 +02:00
Jean-Baptiste Mardelle
aaa02ac8d0 Add build status to README.md 2020-10-18 21:10:19 +00:00
Jean-Baptiste Mardelle
b748efa0e4 Fix rotoscoping points not reset when adding a second rotoscoping effect to a clip 2020-10-18 22:51:25 +02:00
Jean-Baptiste Mardelle
7b1d44c411 Ensure only wanted items are really archived.
Related to #561
2020-10-18 14:29:33 +02:00
Jean-Baptiste Mardelle
71c7f6c11f Merge branch 'lintondawson/kdenlive-timeline-archive' 2020-10-18 14:28:21 +02:00
Jean-Baptiste Mardelle
a7c7e98db0 Fix tests, improve mix behavior with resize undo/redo 2020-10-18 14:15:01 +02:00
Camille Moulin
d143ef0a11 Fix typo in header because it breaks parser 2020-10-18 10:50:03 +00:00
l10n daemon script
97503c9b4f SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2020-10-18 09:59:31 +02:00
Jean-Baptiste Mardelle
9da3b3d18d Update to org.kde.Sdk 5.15 2020-10-18 09:59:31 +02:00
Jean-Baptiste Mardelle
5bfa3af4db qtcrop effect: make radius animated.
Related to #806
2020-10-18 09:59:31 +02:00
Jean-Baptiste Mardelle
273c0b34bf When editing a title clip, hide it from timeline so that it doesn't appear on background frame.
Fixes #805
2020-10-18 09:59:31 +02:00
Vivek Yadav
a1909bd3f6 Update effectlistwidget.cpp 2020-10-18 09:48:10 +02:00
Vivek Yadav
1463649578 Update effectlistwidget.cpp 2020-10-18 09:48:10 +02:00
Vivek Yadav
695c6b3bff Update effecttreemodel.cpp 2020-10-18 09:48:10 +02:00
Vivek Yadav
ec97c5646b Update effectlistwidget.cpp 2020-10-18 09:48:10 +02:00
Vivek Yadav
33758be44b Update assettreemodel.cpp 2020-10-18 09:48:10 +02:00
Vivek Yadav
d9c7dcb55f Delete effectlistwidget.cpp.autosave 2020-10-18 09:48:10 +02:00
vivek yadav
5cc52f5126 improved last commit 2020-10-18 09:48:10 +02:00
vivek yadav
d8c42f4aec edit name and description of custom effects 2020-10-18 09:48:10 +02:00
Vincent Pinon
ab00a0414e Render widget: avoid misuse of parallel processing 2020-10-18 09:48:10 +02:00
Pushkar Kukde
c8b8909a5a Implemented enhancement suggestion #561 2020-10-18 02:48:58 +05:30
Jean-Baptiste Mardelle
4a3a55e83b Fix qml overlay offset on monitor zoom (transform/rotoscoping) 2020-10-17 21:50:57 +02:00
Jean-Baptiste Mardelle
0547233f23 Merge branch 'vivekkde/kdenlive-master' 2020-10-16 18:46:42 +02:00
Jean-Baptiste Mardelle
eeada05539 Make folder to store titles and scripts configurable in Kdenlive Settings
Don't create the kdenlive-renderqueue folder if not necessary, and delete it if no script is stored.
Fixes #812
2020-10-16 17:59:53 +02:00
Vivek Yadav
70223d6626 Update effectlistwidget.cpp 2020-10-16 11:23:17 +00:00
Jean-Baptiste Mardelle
76d87f66b2 Fix crash inserting zone over grouped clips in same track 2020-10-16 10:26:53 +02:00
Pushkar Kukde
68e2dcfb7e Titlewidget 2020-10-15 23:23:37 +05:30
Pushkar Kukde
9c9672d541 Merge branch 'master' of https://invent.kde.org/multimedia/kdenlive into timeline-archive 2020-10-15 23:16:22 +05:30
Pushkar Kukde
18d09e2f26 Timeline Archive, QCheckBox problem 2020-10-15 23:09:22 +05:30
Vincent Pinon
b4895a069e Merge branch 'release/20.08' into master 2020-10-15 02:12:56 +00:00
Vincent Pinon
3b9595bd99 Fix previous commit 2020-10-15 02:10:49 +00:00
Vincent Pinon
b7ab436a3c check ffmpeg setting points to a file, not just isn't empty
FIX: 388709
2020-10-14 20:15:37 +00:00
Vincent Pinon
7cf1ac94dc check ffmpeg setting points to a file, not just isn't empty
FIX: 388709
2020-10-14 21:14:12 +02:00
Jean-Baptiste Mardelle
4403ee204e Allow custom comments in effect groups 2020-10-14 10:48:42 +02:00
Jean-Baptiste Mardelle
c9fda75cfc Add effect's MLT tag to effect description, not Kdenlive's id, makes it easier to understand which effect is implied 2020-10-14 09:37:53 +02:00
Jean-Baptiste Mardelle
f4f92defbe qtcrop effect: make radius animated.
Related to #806
2020-10-13 18:15:05 +02:00
Jean-Baptiste Mardelle
a10b527701 Merge branch 'master' of invent.kde.org:multimedia/kdenlive 2020-10-13 18:13:50 +02:00
Jean-Baptiste Mardelle
f11aae7d69 qtcrop effect: make radius animated.
Related to #806
2020-10-13 18:13:31 +02:00
l10n daemon script
fa18eb5fc1 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2020-10-13 06:17:41 +02:00
Vivek Yadav
b5c0883123 Update effectlistwidget.cpp 2020-10-12 22:31:50 +00:00
Vivek Yadav
9ee0157aeb Update effectlistwidget.cpp 2020-10-12 22:24:10 +00:00
Vivek Yadav
513534e28b resolved edit custom effect description issue 2020-10-12 21:10:26 +00:00
Jean-Baptiste Mardelle
47982916a7 Update to org.kde.Sdk 5.15 2020-10-12 14:07:32 +00:00
Jean-Baptiste Mardelle
946c9e912f When editing a title clip, hide it from timeline so that it doesn't appear on background frame.
Fixes #805
2020-10-11 23:56:10 +02:00
Jean-Baptiste Mardelle
5ce4e575f6 Merge branch 'vivekkde/kdenlive-master' 2020-10-11 18:47:26 +02:00
Vivek Yadav
c75ac2a8d2 Update effectlistwidget.cpp 2020-10-11 08:48:29 +00:00
Vivek Yadav
03743f32d7 Update effectlistwidget.cpp 2020-10-11 08:39:35 +00:00
Vivek Yadav
7b17322c07 Update effecttreemodel.cpp 2020-10-11 08:32:53 +00:00
Vivek Yadav
c396a58e44 Update effectlistwidget.cpp 2020-10-11 08:28:01 +00:00
Vivek Yadav
95585239b6 Update assettreemodel.cpp 2020-10-10 20:42:18 +00:00
Pushkar Kukde
a8279d49c1 Fixed titlewidget.cpp again 2020-10-11 00:57:10 +05:30
Pushkar Kukde
e50ed4e1e4 Fixed titlewidget.cpp 2020-10-11 00:53:06 +05:30
Jean-Baptiste Mardelle
fc586019f4 Start showing parameters for same track mixes 2020-10-09 23:20:40 +02:00
Vivek Yadav
e2dd30d50e Delete effectlistwidget.cpp.autosave 2020-10-09 19:44:44 +00:00
vivek yadav
4e7f7498d5 improved last commit 2020-10-10 01:04:11 +05:30
Jean-Baptiste Mardelle
ec6bd612b3 Merge branch 'master' into work/sametrack 2020-10-09 18:12:17 +02:00
vivek yadav
8ccda514d6 edit name and description of custom effects 2020-10-09 18:19:12 +05:30
Vincent Pinon
4f51bc3e2b Merge branch 'release/20.08' 2020-10-09 13:04:03 +02:00
Vincent Pinon
a155503246 Render widget: avoid misuse of parallel processing 2020-10-09 13:03:06 +02:00
Jean-Baptiste Mardelle
7df43a547f Fix compilation with Qt < 5.15 2020-10-09 12:45:26 +02:00
Jean-Baptiste Mardelle
ac7fc97372 Fix some deprecation warnings 2020-10-09 11:39:51 +02:00
Jean-Baptiste Mardelle
2ab1fcb014 Merge branch '2008' 2020-10-09 11:14:31 +02:00
Jean-Baptiste Mardelle
6ec0e30868 Fix resizing clip loses focus if mouse cursor did not get outside of clip boundaries.
Fixes #803
2020-10-09 11:12:42 +02:00
Jean-Baptiste Mardelle
86266b4ae2 Fix rounding error sometimes hiding last keyframe in effectstack.
Fixes #758
2020-10-09 11:01:50 +02:00
l10n daemon script
6412954786 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2020-10-09 10:16:34 +02:00
l10n daemon script
4e0e85dbf9 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2020-10-09 06:31:14 +02:00
Pushkar Kukde
097b3ad60f Implemented suggestion #795 2020-10-08 20:22:52 +00:00
Jean-Baptiste Mardelle
bb3b42654b Ensure last frame of the project is rendered (with some audio codecs like aac, last frame will be duplicated because of a bug in MLT). 2020-10-07 11:16:53 +02:00
Jean-Baptiste Mardelle
508a4b7760 Add method to easily reload a custom effect 2020-10-07 11:10:41 +02:00
Jean-Baptiste Mardelle
4d93def3c5 Comment out non working code 2020-10-07 10:40:24 +02:00
Jean-Baptiste Mardelle
d10c66c5db Merge branch '2008' 2020-10-07 10:39:59 +02:00
Jean-Baptiste Mardelle
45c4e5e6a8 Fix freeze on memory usage loading invalid clips 2020-10-05 22:54:32 +02:00
Pushkar Kukde
f8af6b85f1 Implemented suggestion #795 2020-10-05 14:23:19 +05:30
Jean-Baptiste Mardelle
25ba5eaa1b Fix track insertion in mixed view mode.
CCBUG: 403443
2020-10-04 12:06:06 +02:00
Jean-Baptiste Mardelle
568cf02fcb Fix track order in mixed track view 2020-10-04 11:11:39 +02:00
Jean-Baptiste Mardelle
e053e1d0b8 Fix compilation 2020-10-04 08:44:19 +02:00
Jean-Baptiste Mardelle
ab2691e8f6 Fix monitor preview messing monitor zoom 2020-10-04 08:05:58 +02:00
Jean-Baptiste Mardelle
eadb5bb1fe Restore toolbars in default editing layout.
Fixes #776
2020-10-03 23:27:04 +02:00
Jean-Baptiste Mardelle
6b93a37431 Fix saving lift/gamma/gain effect results in broken ui.
Fixes #790
2020-10-03 23:12:28 +02:00
Christoph Feck
838bf7a622 GIT_SILENT Update Appstream for new release
(cherry picked from commit 6623b5cfe9)
2020-10-03 14:37:20 +02:00
Jean-Baptiste Mardelle
1b9e07254a Add some checks to max audio level calculation 2020-10-03 13:41:00 +02:00
Jean-Baptiste Mardelle
3770fe8063 Add xml for qtcrop filter 2020-10-03 13:35:25 +02:00
Jean-Baptiste Mardelle
5b84846013 Remove testing stuff 2020-10-02 23:38:21 +02:00
Jean-Baptiste Mardelle
3d8eac623d Fix incorrect "search aborted" message and tooltip for recovered missing clips.
Related to #779
2020-10-02 23:34:12 +02:00
Jean-Baptiste Mardelle
12ba744532 Add option in track headers to disable normalizing of audio thumbnails.
Related to #798
2020-10-02 23:04:26 +02:00
Jean-Baptiste Mardelle
41e8726071 Fix audio mixer track effects applied twice when reopening project, leading to incorrect volume.
Fixes #792
2020-10-02 17:23:16 +02:00
Jean-Baptiste Mardelle
9a94ca4e7d Store color theme in a localized neutral way.
Should fix #732
2020-10-02 14:30:27 +02:00
Jean-Baptiste Mardelle
0df40f210d Fix various cases where it was not easy to find correct location of missing clips (slideshows, or clips with proxies)
Related to #779
2020-10-02 13:30:12 +02:00
Jean-Baptiste Mardelle
88980a0641 Fix mem leak when another process was writing a clip that is included in a project.
A reload operation was performed every 2 seconds while the clip was still being written, leading to
corrupt clip duration and huge memory consumption leading to system freeze
2020-10-01 22:59:05 +02:00
Jean-Baptiste Mardelle
d9dc98a9f5 Merge branch 'lintondawson/kdenlive-auto-scene-split' 2020-10-01 13:26:27 +02:00
Pushkar Kukde
a6ea3608f3 Fixed automatic scene split (bug #421772) 2020-09-30 21:52:03 +05:30
Jean-Baptiste Mardelle
42d2c4320d Remove deprecated line 2020-09-30 09:41:47 +02:00
Jean-Baptiste Mardelle
9c40769bc9 Merge branch 'vivekkde/kdenlive-master' 2020-09-30 09:39:52 +02:00
Jean-Baptiste Mardelle
a81e510b72 Correctly display Proxy status in timeline for clips with missing source 2020-09-30 08:36:42 +02:00
Jean-Baptiste Mardelle
042ce94bf7 On project opening, fix detection of proxied clips with missing source and proxy 2020-09-30 08:36:04 +02:00
Jean-Baptiste Mardelle
ba76788bf7 Small cleanup, make placeholder timeline clips visible and allow reloading missing clip if source file is available
Fixes #785
2020-09-29 23:07:14 +02:00
Jean-Baptiste Mardelle
af0bd4f7e1 Comment out libva stuff for CI AppImage 2020-09-29 09:08:59 +02:00
Jean-Baptiste Mardelle
58fd31a5e2 Add some extra checks for mixes 2020-09-29 09:07:26 +02:00
Jean-Baptiste Mardelle
18fae08380 Make mix cut pos snap in timeline
Related to #796
2020-09-28 23:04:46 +02:00
Jean-Baptiste Mardelle
5d6e7e810d Ensure we use correct subplaylist producer when replacing a clip in timeline (eg. when proxying) 2020-09-27 18:41:19 +02:00
Jean-Baptiste Mardelle
45fbb03cb4 Fix appimage creation 2020-09-27 18:32:19 +02:00
vivek yadav
51275f6cff Custom effect Comments feature 2020-09-27 20:09:13 +05:30
vivek yadav
ae7a2b56ba Merge branch 'master' of https://invent.kde.org/vivekkde/kdenlive 2020-09-27 19:51:03 +05:30
vivek yadav
be57dcdab4 added comments feature in custom effects 2020-09-27 16:40:46 +05:30
Jean-Baptiste Mardelle
37ddf5edb4 Fix crash on undo mix deletion, use different producer for subplaylists (fixes slow transitions) 2020-09-27 12:42:26 +02:00
Jean-Baptiste Mardelle
640664e2a2 Nicer visual for mix, fix resizing grouped mix didn't update grouped mix cut position.
Allow easy add of a mix by double clicking a clip's resize handle
2020-09-26 23:47:02 +02:00
David Faure
13120af540 Fix PreviewJob memory leak
setAutoDelete(false) means that it won't be deleted when
merely doing kill() and forgetting the pointer (so manual "delete" in
this file won't happen).

Found by looking for code that uses KJob::setAutoDelete(false)
2020-09-26 22:52:33 +02:00
Jean-Baptiste Mardelle
1432dd62d1 Fix mix deletion when deleting first clip of a mix 2020-09-26 14:02:31 +02:00
Jean-Baptiste Mardelle
dbd4ae024f Fix group of clips with mix broken after reloading project 2020-09-25 23:32:33 +02:00
Jean-Baptiste Mardelle
378c4c72fe Merge branch 'master' into work/sametrack 2020-09-25 22:56:03 +02:00
Jean-Baptiste Mardelle
b1df9fd348 Fix incorrect hash check causing incorrect reload dialog on project opening 2020-09-25 22:41:12 +02:00
Jean-Baptiste Mardelle
73503106e4 Merge branch 'master' into work/sametrack 2020-09-25 22:26:06 +02:00
Jean-Baptiste Mardelle
12467f19d9 Fix speed change effect lost when opening project with missing clip, and broken handling of missing proxied clips with speed effect 2020-09-25 22:25:52 +02:00
Ömer Fadıl Usta
565a6c1cbd Fix calling methods on null objects
Some object methods were calling without checking if the object
exist or not.
2020-09-25 22:25:52 +02:00
Jean-Baptiste Mardelle
a3fe8a8eaa Ensure we check file hash on every project opening to ensure clips have not changed and an incorrect hash is not stored. 2020-09-25 22:25:52 +02:00
l10n daemon script
704c16118f GIT_SILENT made messages (after extraction) 2020-09-25 22:25:52 +02:00
Jean-Baptiste Mardelle
dff5f70938 Fix corrupted slowmotion clips on document opening 2020-09-25 22:20:49 +02:00
Jean-Baptiste Mardelle
663fcc92e5 Fix speed change effect lost when opening project with missing clip, and broken handling of missing proxied clips with speed effect 2020-09-25 18:33:59 +02:00
Jean-Baptiste Mardelle
02e8c3edc4 Fix moving clip groups with a mix 2020-09-25 15:58:56 +02:00
Jean-Baptiste Mardelle
f2bf7f16af Merge branch 'work/usta_fix_null_calls' 2020-09-25 14:53:06 +02:00
Jean-Baptiste Mardelle
0430805f0a Ensure we check file hash on every project opening to ensure clips have not changed and an incorrect hash is not stored. 2020-09-25 10:39:41 +02:00
l10n daemon script
1d5899fb39 GIT_SILENT made messages (after extraction) 2020-09-25 02:17:18 +02:00
Jean-Baptiste Mardelle
d7c68402f1 Fix av clip mix 2020-09-24 09:48:35 +02:00
Jean-Baptiste Mardelle
0f144df5e3 Ensure a mixed clip cannot be moved further than its counterpart mix clip 2020-09-23 22:31:19 +02:00
Jean-Baptiste Mardelle
c69bc854ec Correctly load and save mix cut position 2020-09-23 22:01:01 +02:00
Jean-Baptiste Mardelle
827c2a6e62 Merge branch 'work/sametrack' of invent.kde.org:multimedia/kdenlive into sametrack 2020-09-23 15:31:14 +02:00
Jean-Baptiste Mardelle
5c0f642aa8 Easy selection and deletion of clip mix 2020-09-23 15:30:54 +02:00
Jean-Baptiste Mardelle
4f81b7514a Warn user if not enough frames in the clip to create a mix
Related to #796
2020-09-20 11:53:44 +02:00
Jean-Baptiste Mardelle
7f3f3365f5 Merge branch 'master' into sametrack 2020-09-19 22:54:55 +02:00
Jean-Baptiste Mardelle
0aa315c21e Ensure mix is always on top of clips 2020-09-19 22:54:16 +02:00
Jean-Baptiste Mardelle
62c5aa6b0e Update AppImage scripts for FFmpeg hw accel 2020-09-19 18:34:36 +02:00
Farid Abdelnour
7e8a90aea0 [Experimental] Added GPU profiles for rendering proxies and timeline preview ... 2020-09-19 16:07:38 +00:00
Jean-Baptiste Mardelle
40085a0463 Fix creating mix between color clip and AV clip 2020-09-19 18:02:17 +02:00
Albert Astals Cid
8a08988797 Remove unused krandomsequence.h include 2020-09-18 21:53:02 +02:00
Jean-Baptiste Mardelle
9705c94332 Fix compilation 2020-09-18 21:09:05 +02:00
Jean-Baptiste Mardelle
99db241c7f Fix crash on some projects opening
BUG: 409477
2020-09-18 16:48:59 +02:00
Jean-Baptiste Mardelle
c3155b94e7 Add mix clip action in timeline menu, fix undo resize on mixed clip 2020-09-17 22:39:02 +02:00
Jean-Baptiste Mardelle
a976d33fc9 More fixes and tests for chained mixes 2020-09-17 18:23:57 +02:00
Ömer Fadıl Usta
153688e196 Fix calling methods on null objects
Some object methods were calling without checking if the object
exist or not.
2020-09-17 09:26:54 +03:00
Jean-Baptiste Mardelle
a3bc1439ab Another batch of tests and fixes for same track transitions on grouped clips 2020-09-16 17:25:26 +02:00
Jean-Baptiste Mardelle
0378f6d146 More tests and fixes for same track transitions 2020-09-16 11:29:16 +02:00
Jean-Baptiste Mardelle
1e3707f129 More fixes for same track composition clips move and resize 2020-09-15 23:36:17 +02:00
Vincent Pinon
f049619c47 Fix OTIO error display 2020-09-14 19:57:03 +00:00
Jean-Baptiste Mardelle
8991e0ee1b Make same track transition correcty resize on clip resize 2020-09-14 18:48:08 +02:00
Jean-Baptiste Mardelle
38a21d0e3f Fix possible crash detected by tests 2020-09-13 12:01:58 +02:00
Jean-Baptiste Mardelle
bc9de7c403 Make resizing mix work, fix crash on clip deletion 2020-09-13 11:53:53 +02:00
Jean-Baptiste Mardelle
3c0a8db4ac Correctly load same track transitions when opening project 2020-09-12 23:09:38 +02:00
Alexander Lohnau
baa3c0de78 Fix deprecated install location 2020-09-12 08:01:30 +02:00
Jean-Baptiste Mardelle
f371478aeb Fix remaining bugs in mix move 2020-09-12 07:19:20 +02:00
Jean-Baptiste Mardelle
fc5f133ac4 Moving clip with mixes should now work correctly 2020-09-11 19:48:31 +02:00
Jean-Baptiste Mardelle
ee8fb1c29c Implement moving left clip in a mix transition 2020-09-10 10:32:50 +02:00
Jean-Baptiste Mardelle
e98818026b Merge branch '2008' 2020-09-09 05:55:46 +02:00
Jean-Baptiste Mardelle
0ca2d507bf Merge branch '2008' 2020-09-08 22:02:38 +02:00
Jean-Baptiste Mardelle
5d1a81b627 Fix mix test 2020-09-08 13:12:15 +02:00
Jean-Baptiste Mardelle
47fcbb2a96 Fix group move with same track transition 2020-09-08 08:51:40 +02:00
Jean-Baptiste Mardelle
d06ec3cd0f More fixes and tests for moving a clip with same track transition 2020-09-07 21:53:07 +02:00
Jean-Baptiste Mardelle
2ea5bdcde3 Start implementing clip move when same track transition is active 2020-09-07 17:42:06 +02:00
Jean-Baptiste Mardelle
c008bf1a74 Tests: also check same track transition undo 2020-09-07 07:38:07 +02:00
Jean-Baptiste Mardelle
2faff23e99 Add first test for same track compositing 2020-09-07 07:32:18 +02:00
Jean-Baptiste Mardelle
7620569d47 Merge branch 'work/sametrack' of invent.kde.org:multimedia/kdenlive into sametrack 2020-09-05 22:10:36 +02:00
Jean-Baptiste Mardelle
f33a8cb451 Mix all parts of grouped clips 2020-09-05 22:10:05 +02:00
Jean-Baptiste Mardelle
e8510ee16e Make same track composition undoable 2020-09-04 23:52:03 +02:00
Jean-Baptiste Mardelle
df125d294b Merge branch 'master' into work/sametrack 2020-09-04 15:00:36 +02:00
Jean-Baptiste Mardelle
665bfe92e5 Merge branch '2008' 2020-09-04 14:46:50 +02:00
Jean-Baptiste Mardelle
5e00c87cec Ensure default layout names are translatable 2020-09-04 14:18:02 +02:00
Jean-Baptiste Mardelle
4912477068 Delay locale reset to allow correct ui translation
Related to #787
2020-09-04 09:59:35 +02:00
Jean-Baptiste Mardelle
a76b042226 Add Appimage and source download links in appdata 2020-09-03 14:28:11 +02:00
Jean-Baptiste Mardelle
4ec4cedbe2 Fix clicking on clip marker label moving timeline cursor to approximate position
preventing edit/delete of the marker.
Related to #788
2020-09-03 13:47:41 +02:00
Stephen Fluin
571f59e1ec update readme with GPL link and canonical spelling 2020-09-03 11:25:18 +00:00
Jean-Baptiste Mardelle
406c56ccbd Fix tests :) 2020-09-03 10:14:55 +02:00
Jean-Baptiste Mardelle
24f6b42d31 Use another ref on the producer when saving project (might help in case another operation is performed on the producer) 2020-09-02 22:42:07 +02:00
Jean-Baptiste Mardelle
305a67853f Merge branch 'master' of invent.kde.org:multimedia/kdenlive 2020-09-02 22:17:40 +02:00
Jean-Baptiste Mardelle
2dac8e6440 Add corruption check before creating backup file 2020-09-02 22:17:23 +02:00
Jean-Baptiste Mardelle
4de7f1e455 Fix overwrite sometimes not working on clips with multiple streams 2020-09-01 07:39:41 +02:00
Laurent Montel
6660206349 Port away from deprecated Qt::MidButton 2020-08-31 21:09:22 +02:00
Christoph Feck
e29668a248 GIT_SILENT Update Appstream for new release
(cherry picked from commit 1c923e8862)
2020-08-31 21:08:23 +02:00
Jean-Baptiste Mardelle
75e57704e0 Attempt to mimic Shotcut's locale handling
Related to #780
2020-08-31 14:06:59 +02:00
Jean-Baptiste Mardelle
45cbc45593 Another attempt to fix #780 2020-08-31 08:55:06 +02:00
Jean-Baptiste Mardelle
e7e73f9dfe Merge branch '2008' 2020-08-30 22:30:58 +02:00
Jean-Baptiste Mardelle
a610f581cc Another attempt to fix Windows locale corruption on Windows
related to #780
2020-08-30 15:33:41 +02:00
Jean-Baptiste Mardelle
865042c81d Enforce C Locale on Windows on rendering.
Related to #780
2020-08-30 06:55:21 +02:00
Jean-Baptiste Mardelle
74aa66e249 Merge branch '2008' 2020-08-29 22:01:25 +02:00
Jean-Baptiste Mardelle
575a0f4882 Merge branch '2008' 2020-08-29 18:33:26 +02:00
Jean-Baptiste Mardelle
9b08d73ee6 Update mainwindow.cpp 2020-08-29 11:00:04 +00:00
Jean-Baptiste Mardelle
8f8f79363a Merge branch '2008' 2020-08-29 07:12:55 +02:00
Jean-Baptiste Mardelle
aba9b0771d Merge branch '2008' 2020-08-28 23:51:55 +02:00
Jean-Baptiste Mardelle
5eb539aad6 Merge branch '2008' 2020-08-28 21:37:13 +02:00
Jean-Baptiste Mardelle
03cf97450d Same track mix update: resize both clips and create a mix in between 2020-08-28 20:08:31 +02:00
Jean-Baptiste Mardelle
761393e4ee Fix some corruption in same track composition 2020-08-28 17:12:32 +02:00
Jean-Baptiste Mardelle
604b850745 Add icon in timeline toolbar for same track mix 2020-08-28 16:26:58 +02:00
Jean-Baptiste Mardelle
ba564eda44 Initial commit for same track transitions 2020-08-28 14:51:11 +02:00
Farid Abdelnour
f8654e66ce Add missing "=" symbol in GPU profile 2020-08-26 17:49:42 +00:00
Jean-Baptiste Mardelle
e83f8dc0ca Correctly update project duration on group move
Fixes #628
2020-08-26 11:17:16 +02:00
Jean-Baptiste Mardelle
e80ba1811a Sort insertion order using int instead of string.
Related to #583
2020-08-26 10:20:15 +02:00
Jean-Baptiste Mardelle
1e00ab87b4 Raise Project Bin when a clip is dropped in timeline or created through the menu.
Fixes #772
2020-08-26 08:55:00 +02:00
Jean-Baptiste Mardelle
2d61ef598a Fix frame number in rendering progress.
Fixes #784
2020-08-26 08:36:37 +02:00
Jean-Baptiste Mardelle
4d13c79f95 Merge branch 'master' of invent.kde.org:multimedia/kdenlive 2020-08-25 00:00:49 +02:00
Jean-Baptiste Mardelle
2526f7af48 Effect Stack: focus active effect when switching between clips 2020-08-24 23:58:35 +02:00
Jean-Baptiste Mardelle
3b7dc65e5b Merge branch '2008' 2020-08-23 21:51:50 +02:00
Vincent Pinon
fc6c822ff0 more progress info during render 2020-08-22 22:37:23 +02:00
Pino Toscano
48b183a2ff Merge remote-tracking branch 'origin/release/20.08' into master 2020-08-20 08:27:32 +02:00
Farid Abdelnour
b6f8400db9 Add GPU profiles provided by Constantin Aanicai. https://kdenlive.org/en/2020/08/kdenlive-20-08-is-out/#comment-5089
Related to #504
2020-08-19 14:46:43 +00:00
Jean-Baptiste Mardelle
7466caef97 Fix shift click for multiple selection broken in Bin 2020-08-18 08:41:48 +02:00
Jean-Baptiste Mardelle
d9fc8628cc Allow automatic keyframes on transform like effects
Related to #451
2020-08-12 08:10:42 +02:00
Jean-Baptiste Mardelle
e27d3f481e Don't allow adding unique effect (like fades) twice 2020-08-11 23:28:41 +02:00
Jean-Baptiste Mardelle
e9baf89529 Fix crash removing a fade effect added twice.
BUG: 425175
2020-08-11 23:26:54 +02:00
Jean-Baptiste Mardelle
35acc60960 Enforce wasapi as default audio backend on Windows.
Related to #774
2020-08-11 08:25:24 +02:00
Jean-Baptiste Mardelle
f7137493d5 Fix regression in project notes from clip monitor(incorrect clazy fix) 2020-08-09 21:59:46 +02:00
Jean-Baptiste Mardelle
44ce7aeadc Fix clip monitor zoom not reset when changing clip, and zone incorrect on zoom 2020-08-06 07:18:15 +02:00
Jean-Baptiste Mardelle
7c8de1f60d Add MLT's Pillar Echo effect 2020-08-05 12:02:12 +02:00
Jean-Baptiste Mardelle
7d0b60c931 Restore increased range for volume effect, only limit the visible range in timeline
Related to #770
2020-08-05 12:02:12 +02:00
Tércio Martins
186c2793f5 Appimage: during image creation, delete libxcb and libxcb-dri{2,3} libraries
Currently, the script "build-image.sh" deletes all libraries that begin with the name "libxcb..."
Systems that do not have the "libxcb-keysyms.so.1" library are unable to start Kdenlive. The terminal displays this message when starting the program:
"error while loading shared libraries: libxcb-keysyms.so.1: cannot open shared object file: No such file or directory"

This prevents the program from starting on computers that only have GNOME applications installed, for example.
<https://ubuntu.pkgs.org/20.04/ubuntu-main-amd64/libxcb-keysyms1_0.4.0-1build1_amd64.deb.html>
<https://www.archlinux.org/packages/extra/x86_64/xcb-util-keysyms/>

The Appimage documentation recommends deleting only the "libxcb.so", "libxcb-dri2.so" and "libxcb-dri3.so" libraries:
<https://github.com/AppImage/pkg2appimage/blob/master/excludelist>

The "build-image.sh" script has been changed to delete only those files, allowing more users to run the program.
2020-08-05 08:07:26 +00:00
Christoph Feck
e0be8f3a08 Merge branch 'master' of invent.kde.org:multimedia/kdenlive 2020-08-05 10:01:03 +02:00
Christoph Feck
6f46e728c1 GIT_SILENT Update Appstream for new release
(cherry picked from commit 9a053d651a)
2020-08-05 09:59:36 +02:00
Jean-Baptiste Mardelle
e17e4f2196 Missing fix for FreeBSD in last commit (fix broken localization) 2020-08-03 22:03:15 +02:00
Jean-Baptiste Mardelle
143bf1697e Attempt to fix UI translations broken.
CCBUG: 424967
2020-08-03 21:25:42 +02:00
Jean-Baptiste Mardelle
997a9abd3f Reduce range of volume effect (limit to -50 - +50 dB), and use logarithmic scale in timeline.
Related to #770
2020-08-03 18:40:22 +02:00
Jean-Baptiste Mardelle
68914726d9 Rotoscoping: add Auto keyframe button in monitor toolbar to automatically add a keyframe when moving a point 2020-08-02 01:09:02 +02:00
Jean-Baptiste Mardelle
f4a1cdf603 Don't cache empty audio data (fixes missing audio thumbs on video clips) 2020-07-31 15:50:03 +02:00
Jean-Baptiste Mardelle
9ba6eaa954 Various fixes for audio thumb management, should slightly improve memory usage/performnace.
Related to #102
2020-07-31 15:40:54 +02:00
Jean-Baptiste Mardelle
a0db1142d3 Rewrite audio thumbnails to only use FFmpeg's data and optimize memory usage on creation.
Related to #102
2020-07-31 12:35:26 +02:00
Jean-Baptiste Mardelle
3d5c3cebd3 Merge branch '2008' 2020-07-31 00:19:08 +02:00
Jean-Baptiste Mardelle
587461abe6 Add avfilter eq filter (allowing to adjust image brightness, contrast, saturation, gamma all in one effect 2020-07-31 00:18:35 +02:00
Jean-Baptiste Mardelle
64eb4da1ad Refactor clip monitor audio thumbnails to use same data as timeline thumbnail.
We now just need to also use this data to generate the bin thumbnail and memory usage should get back to normal
Related to #102
2020-07-30 23:29:48 +02:00
Jean-Baptiste Mardelle
b205949e01 Merge branch '2008' 2020-07-30 22:30:59 +02:00
Jean-Baptiste Mardelle
9c44105456 Merge branch '2008' 2020-07-29 23:41:41 +02:00
Jean-Baptiste Mardelle
8f29a8fced Drop deprecated QApplication attribute 2020-07-29 10:51:27 +02:00
Jean-Baptiste Mardelle
91176f622d Merge branch '2008' 2020-07-29 10:19:41 +02:00
Yuri Chornoivan
60fdc1e996 Avoid confusion for one-letter translations 2020-07-29 08:51:07 +03:00
Farid Abdelnour
caa2910969 Update Audio, Editing and Color layouts 2020-07-28 20:18:21 +00:00
Farid Abdelnour
8b2caa64cd Add Effects layout 2020-07-28 18:17:16 +00:00
Jean-Baptiste Mardelle
8705e0f190 Merge branch '2008' 2020-07-28 12:46:16 +02:00
Julius Künzel
dbb3b68e7b Improve audiomixer layout 2020-07-28 05:09:23 +00:00
Jean-Baptiste Mardelle
fcc9957062 Merge branch '2008' 2020-07-28 01:11:14 +02:00
Jean-Baptiste Mardelle
2b423244a5 Merge branch '2008' 2020-07-27 17:25:57 +02:00
Jean-Baptiste Mardelle
423523c75c Merge branch '2008' 2020-07-24 19:18:43 +02:00
Jean-Baptiste Mardelle
f5394aae07 Merge branch '2008' 2020-07-24 17:38:44 +02:00
Jean-Baptiste Mardelle
436ad5e0ba Update AppImage dependency build scripts 2020-07-24 15:22:30 +02:00
Jean-Baptiste Mardelle
0551fda203 Merge branch '2008' 2020-07-24 11:01:46 +02:00
Farid Abdelnour
4719f469e5 Logging UI proposal 2020-07-24 08:47:41 +00:00
Jean-Baptiste Mardelle
f289997215 Merge branch '2008' 2020-07-24 10:38:48 +02:00
Jean-Baptiste Mardelle
7fd976cab4 Merge branch '2008' 2020-07-23 23:21:15 +02:00
Jean-Baptiste Mardelle
87dc2b1d9f When trying to play a monitor that is hidden, display an info message allowing to show the monitor.
Fixes #762
2020-07-23 08:42:10 +02:00
Jean-Baptiste Mardelle
d722dc28b5 Merge branch 'master' of invent.kde.org:multimedia/kdenlive 2020-07-23 00:40:23 +02:00
Jean-Baptiste Mardelle
7ddcef6e35 Merge branch '2008' 2020-07-23 00:40:01 +02:00
Vincent Pinon
3b9d8bfd49 Manually fix clazy warnings 2020-07-22 22:32:55 +00:00
Jean-Baptiste Mardelle
d265f63589 Merge branch '2008' 2020-07-22 23:58:34 +02:00
Jean-Baptiste Mardelle
06079c8b36 Merge branch '2008' 2020-07-22 12:04:53 +02:00
Jean-Baptiste Mardelle
ff1cbac448 Merge branch '2008' 2020-07-21 21:54:07 +02:00
Jean-Baptiste Mardelle
f17339a441 Merge branch '2008' 2020-07-21 17:36:46 +02:00
Jean-Baptiste Mardelle
568dbcbb52 Merge branch '2008' 2020-07-21 17:00:27 +02:00
Vincent Pinon
a71dddbaa5 Apply clazy fixes (range-loop) 2020-07-20 21:08:57 +00:00
Jean-Baptiste Mardelle
6199a1de9c Merge branch '2008' 2020-07-20 18:59:19 +02:00
Jean-Baptiste Mardelle
7bf0981665 Merge branch '2008' 2020-07-17 10:32:07 +02:00
Jean-Baptiste Mardelle
b1f50cb245 Merge branch '2008' 2020-07-16 23:47:07 +02:00
Jean-Baptiste Mardelle
1da913941b Merge branch 'master' of invent.kde.org:multimedia/kdenlive 2020-07-16 17:07:39 +02:00
Jean-Baptiste Mardelle
7559f08a3c Merge branch '2008' 2020-07-16 17:06:28 +02:00
Jean-Baptiste Mardelle
c15b6032be Merge branch '2008' 2020-07-16 08:00:03 +02:00
Yuri Chornoivan
1301d057c8 Remove needless window title 2020-07-16 08:46:05 +03:00
Jean-Baptiste Mardelle
9e136ee931 Merge branch '2008' 2020-07-15 11:33:30 +02:00
l10n daemon script
b961406e8b SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2020-07-15 05:44:19 +02:00
l10n daemon script
991c46f910 GIT_SILENT made messages (after extraction) 2020-07-15 02:14:23 +02:00
Jean-Baptiste Mardelle
3e10acb49d Merge branch '2008' 2020-07-14 07:54:18 +02:00
Jean-Baptiste Mardelle
26f6352bf1 Merge branch '2008' 2020-07-14 07:04:35 +02:00
Jean-Baptiste Mardelle
78e4acad5e Merge branch '2008' 2020-07-13 09:37:05 +02:00
Jean-Baptiste Mardelle
a4e44d7296 Merge branch '2008' 2020-07-13 07:45:52 +02:00
Jean-Baptiste Mardelle
d9208074f8 When dragging a clip in insert mode, don't allow leaving empty space in timeline.
Related to #673
2020-07-12 15:00:20 +02:00
Jean-Baptiste Mardelle
e6d2c20598 Restore seek in clip monitor on Shift + move mouse 2020-07-12 14:26:40 +02:00
Jean-Baptiste Mardelle
b72f28b972 Don't show monitor overlay (fpt, timecode, ...) in audio seek bar 2020-07-12 12:49:58 +02:00
Jean-Baptiste Mardelle
5736dfe8c7 Timeline: don't allow moving a keyframe at same pos as another one.
Related to #686
2020-07-12 12:44:10 +02:00
Jean-Baptiste Mardelle
f0e73b312d In insert mode, deleting a clip should perform an extract operation.
Related to #673
2020-07-12 11:32:57 +02:00
Jean-Baptiste Mardelle
a5e5af96dd Fix clip url not correctly updated when opening project with missing clips.
Related to #536
2020-07-12 11:03:06 +02:00
Jean-Baptiste Mardelle
fdaa4321b1 When dropping a folder from a file manager to bin, don't create folders that contain no valid clip 2020-07-12 10:24:53 +02:00
Jean-Baptiste Mardelle
304e5a0935 Expand/collapse all bin folders with Shift+click
Related to #287
2020-07-12 10:15:33 +02:00
Jean-Baptiste Mardelle
c42d254375 Merge branch 'master' of invent.kde.org:multimedia/kdenlive 2020-07-11 22:38:52 +02:00
Jean-Baptiste Mardelle
6e5bb1f5cc Save folder status (expanded or not).
Related to #287
2020-07-11 22:38:30 +02:00
Albert Astals Cid
d76712628f GIT_SILENT Upgrade release service version to 20.11.70. 2020-07-11 12:31:09 +02:00
292 changed files with 5990 additions and 2356 deletions

View File

@@ -5,8 +5,8 @@ cmake_minimum_required(VERSION 3.0)
# KDE Application Version, managed by release script
set (RELEASE_SERVICE_VERSION_MAJOR "20")
set (RELEASE_SERVICE_VERSION_MINOR "08")
set (RELEASE_SERVICE_VERSION_MICRO "2")
set (RELEASE_SERVICE_VERSION_MINOR "11")
set (RELEASE_SERVICE_VERSION_MICRO "70")
set(KDENLIVE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
@@ -71,7 +71,7 @@ if(WIN32)
set(MLT_PREFIX "..")
else()
set(MLT_PREFIX ${MLT_ROOT_DIR})
find_package(Qt5 OPTIONAL_COMPONENTS WebKitWidgets QUIET)
find_package(Qt5 OPTIONAL_COMPONENTS WebEngineWidgets QUIET)
endif()
if(KF5FileMetaData_FOUND)

View File

@@ -1,8 +1,13 @@
![](data/pics/kdenlive-logo.png)
| Jenkins CI Name | Master | Stable |
| --------------- | ------ | ------ |
| OpenSuse Qt 5.14 | [![Build Status](https://build.kde.org/job/Applications/job/kdenlive/job/kf5-qt5%20SUSEQt5.14/badge/icon)](https://build.kde.org/job/Applications/job/kdenlive/job/kf5-qt5%20SUSEQt5.14//) |[![Build Status](https://build.kde.org/job/Applications/job/kdenlive/job/stable-kf5-qt5%20SUSEQt5.14/badge/icon)](https://build.kde.org/job/Applications/job/kdenlive/job/stable-kf5-qt5%20SUSEQt5.14/)|
| FreeBSD Qt 5.15 | [![Build Status](https://build.kde.org/job/Applications/job/kdenlive/job/kf5-qt5%20FreeBSDQt5.15/badge/icon)](https://build.kde.org/job/Applications/job/kdenlive/job/kf5-qt5%20FreeBSDQt5.15/) |[![Build Status](https://build.kde.org/job/Applications/job/kdenlive/job/stable-kf5-qt5%20FreeBSDQt5.15/badge/icon)](https://build.kde.org/job/Applications/job/kdenlive/job/stable-kf5-qt5%20FreeBSDQt5.15/)|
# About Kdenlive
[Kdenlive](https://kdenlive.org) is a Free and Open Source video editing application, based on MLT Framework and KDE Frameworks 5. It is distributed under the GNU General Public Licence Version 2.
[Kdenlive](https://kdenlive.org) is a Free and Open Source video editing application, based on MLT Framework and KDE Frameworks 5. It is distributed under the [GNU General Public License Version 2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
# Building from source

View File

@@ -12,7 +12,6 @@ install(FILES
banner.png
encodingprofiles.rc
externalproxies.rc
metadata.properties
meta_ffmpeg.png
meta_libav.png
meta_magiclantern.png

View File

@@ -106,7 +106,6 @@ avfilter.drawbox
avfilter.drawgraph
avfilter.drawgrid
avfilter.elbg
avfilter.eq
avfilter.floodfill
avfilter.fspp
avfilter.gblur

View File

@@ -28,6 +28,7 @@ mute.xml
normalise.xml
oldfilm.xml
pan_zoom.xml
pillar_echo.xml
obscure.xml
region.xml
rotation.xml

View File

@@ -50,6 +50,11 @@ The rest:
- tag "comment": (optional) description of the parameter (support HTML formatting) (not yet supported by all widgets)
- attribute "name": MLT filter parameter name
- attribute "paramprefix": a string to be prepended to the parameter value before passing it to MLT
- attribute "suffix": a string to be appended to the parameter (for UI display only)
- attribute "min": the minimal accepted value
- attribute "max": the maximal accepted value
- attribute "visualmin": the minimal value displayed in timeline keyframes (can be > than min)
- attribute "visualmax": the maximal value displayed in timeline keyframes (can be < than max)
- attribute "default": initial value, format depends on parameter type
- attribute "optional": if it is set, it means that this parameter can have an empty value. So then loading a project, don't set its value to default
- attribute "type": widget (GUI) to use

View File

@@ -7,5 +7,6 @@ selectivecolor.xml
avfilter_lut3d.xml
unsharp.xml
subtitles.xml
eq.xml
equalizer.xml
DESTINATION ${DATA_INSTALL_DIR}/kdenlive/effects)

View File

@@ -0,0 +1,31 @@
<!DOCTYPE kpartgui>
<effect tag="avfilter.eq">
<name>Video Equalizer</name>
<description>Adjust Brightness, contrast, gamma, saturation</description>
<author>libavfilter</author>
<parameter type="constant" name="av.contrast" max="3" min="-3" default="1" decimals="2">
<name>Contrast</name>
</parameter>
<parameter type="constant" name="av.brightness" max="1" min="-1" default="0" decimals="2">
<name>Brightness</name>
</parameter>
<parameter type="constant" name="av.saturation" max="5" min="0" default="1" decimals="2">
<name>Saturation</name>
</parameter>
<parameter type="constant" name="av.gamma" max="3" min="0" default="1" decimals="2">
<name>Gamma</name>
</parameter>
<parameter type="constant" name="av.gamma_r" max="3" min="0" default="1" decimals="2">
<name>Red Gamma</name>
</parameter>
<parameter type="constant" name="av.gamma_g" max="3" min="0" default="1" decimals="2">
<name>Green Gamma</name>
</parameter>
<parameter type="constant" name="av.gamma_b" max="3" min="0" default="1" decimals="2">
<name>Blue Gamma</name>
</parameter>
<parameter type="constant" name="av.gamma_weight" max="1" min="0" default="1" decimals="2">
<name>Gamma Weight</name>
</parameter>
</effect>

View File

@@ -0,0 +1,12 @@
<!DOCTYPE kpartgui>
<effect tag="pillar_echo" id="pillar_echo">
<name>Pillar Echo</name>
<description>Create an echo effect (blur) outside of an area of interest.</description>
<author>Meltytech, LLC</author>
<parameter type="animatedrect" name="rect" default="25% 0% 50% 100%" fixed="1" opacity="false">
<name>Rectangle</name>
</parameter>
<parameter type="constant" name="blur" max="50" min="0" default="4" suffix="%">
<name>Blur</name>
</parameter>
</effect>

View File

@@ -6,12 +6,12 @@
<parameter type="animatedrect" name="rect" default="0 0 %width %height" opacity="false">
<name>Rectangle</name>
</parameter>
<parameter type="animated" name="radius" default="0" min="0" max="1" decimals="2">
<name>Radius</name>
</parameter>
<parameter type="bool" name="circle" default="0">
<name>Circle</name>
</parameter>
<parameter type="constant" name="radius" default="0" min="0" max="1" decimals="2">
<name>Radius</name>
</parameter>
<parameter type="color" name="color" default="0x00000000" alpha="1">
<name>Padding Color</name>
</parameter>

View File

@@ -3,7 +3,7 @@
<name>Volume (keyframable)</name>
<description>Adjust audio volume with keyframes</description>
<author>Dan Dennedy</author>
<parameter type="animated" name="level" default="0" max="60" min="-100" suffix="dB" scale="-1">
<parameter type="animated" name="level" default="0" max="50" min="-100" visualmax="50" visualmin="-50" suffix="dB" scale="-1">
<name>Gain</name>
</parameter>
</effect>

View File

@@ -390,7 +390,7 @@ Name[tr]=Hata
Name[ug]=خاتالىق
Name[uk]=Помилка
Name[x-test]=xxErrorxx
Name[zh_CN]=误
Name[zh_CN]=
Name[zh_TW]=錯誤
Comment=An error occurred in Kdenlive
Comment[ar]=حدث خطأ في «كدينلايڤ»

View File

@@ -22,6 +22,7 @@ Name[pl]=Układy klawiatur Kdenlive
Name[pt]=Esquemas de Teclado do Kdenlive
Name[pt_BR]=Esquemas de teclado do Kdenlive
Name[ru]=Схемы горячих клавиш
Name[sk]=Schémy klávesnice Kdenlive
Name[sl]=Sheme tipkovnic Kdenlive
Name[sv]=Kdenlive-tangentbordsinställningar
Name[uk]=Схеми клавіатурних скорочень Kdenlive

View File

@@ -1,16 +0,0 @@
# data_show filters
timecode=region
.description=TimecodeOSD
.properties.markup=filter[1].producer.text
.composite.geometry=10/10:150x30
.filter[0]=watermark
.filter[0].resource=colour:0x000000A0
.filter[0].composite.titles=1
.filter[1]=watermark
.filter[1].resource=pango:
.filter[1].producer.text=
.filter[1].producer.family=Monospace
.filter[1].producer.size=24
.filter[1].composite.titles=1
.filter[1].composite.halign=right

View File

@@ -267,10 +267,33 @@
</ul>
</description>
<releases>
<release version="20.08.3" date="2020-11-05"/>
<release version="20.08.2" date="2020-10-08"/>
<release version="20.08.1" date="2020-09-03"/>
<release version="20.08.1" date="2020-09-03">
<artifacts>
<artifact type="source">
<location>https://download.kde.org/stable/release-service/20.08.1/src/kdenlive-20.08.1.tar.xz</location>
<checksum type="sha256">f99e3f22c3d5e41a3ca251299d010ac2bc44933091c25d360104d562a1090873</checksum>
<size type="download">11367852</size>
</artifact>
</artifacts>
</release>
<release version="20.08.0" date="2020-08-13">
<artifacts>
<artifact type="binary" platform="x86_64-appimage">
<location>https://files.kde.org/kdenlive/release/kdenlive-20.08.0-x86_64.appimage</location>
<checksum type="sha256">3e0174a00c0c0c6599b5de249947b32ce86bde5d0703273c7d5212f01743bb5c</checksum>
<size type="download">220790824</size>
<bundle type="appimage">kdenlive-20.08.0</bundle>
</artifact>
<artifact type="source">
<location>https://download.kde.org/stable/release-service/20.08.0/src/kdenlive-20.08.0.tar.xz</location>
<checksum type="sha256">89914ee37f5bbdd16051b0db4a6cfb6f8c3d748f47c9e28e5349920ca133c0bd</checksum>
<size type="download">11367912</size>
</artifact>
</artifacts>
</release>
<release version="20.08.0" date="2020-08-13"/>
<release date="2020-04-15" version="20.07.70"/>
</releases>
<url type="homepage">https://kdenlive.org/</url>
<url type="bugtracker">https://bugs.kde.org</url>

View File

@@ -2,73 +2,36 @@
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-kdenlive">
<comment>Kdenlive video project document</comment>
<comment xml:lang="ar">مستند مشروع «كدينلايڤ» ڤديوهيّ</comment>
<comment xml:lang="bs">Kdenlive video projekt dokument</comment>
<comment xml:lang="ca">document de projecte de vídeo del Kdenlive</comment>
<comment xml:lang="ca@valencia">document de projecte de vídeo del Kdenlive</comment>
<comment xml:lang="cs">Dokument video projektu Kdenlive</comment>
<comment xml:lang="da">Kdenlive videoprojekt-dokument</comment>
<comment xml:lang="de">Kdenlive-Videoprojektdokument</comment>
<comment xml:lang="el">Έγγραφο έργου βίντεο Kdenlive</comment>
<comment xml:lang="en_GB">Kdenlive video project document</comment>
<comment xml:lang="es">Documento de proyecto de video de Kdenlive</comment>
<comment xml:lang="et">Kdenlive'i videoprojekti dokument</comment>
<comment xml:lang="eu">Kdenlive bideo proiektu dokumentua</comment>
<comment xml:lang="fi">Kdenlive-videoprojektitiedosto</comment>
<comment xml:lang="fr">Projet Kdenlive</comment>
<comment xml:lang="gl">Documento dun proxecto de vídeo de Kdenlive</comment>
<comment xml:lang="id">Dokumen projek video Kdenlive</comment>
<comment xml:lang="it">Progetto video Kdenlive</comment>
<comment xml:lang="ko">Kdenlive 동영상 프로젝트 문서</comment>
<comment xml:lang="ca">Document de projecte de vídeo del Kdenlive</comment>
<comment xml:lang="ca@valencia">Document de projecte de vídeo del Kdenlive</comment>
<comment xml:lang="eu">Kdenlive-ko bideo-proiektuaren dokumentua</comment>
<comment xml:lang="fr">Document de projet vidéo pour Kdenlive</comment>
<comment xml:lang="it">Progetto video di Kdenlive</comment>
<comment xml:lang="lt">Kdenlive video projekto dokumentas</comment>
<comment xml:lang="nl">Video projectdocument van Kdenlive</comment>
<comment xml:lang="nn">Kdenlive-videoprosjektdokument</comment>
<comment xml:lang="pl">Dokument projektowy filmu w Kdenlive</comment>
<comment xml:lang="pt">Documento de projecto de vídeo do Kdenlive</comment>
<comment xml:lang="pt_BR">Documento de projeto de vídeo do Kdenlive</comment>
<comment xml:lang="ru">Видеопроект Kdenlive</comment>
<comment xml:lang="sk">Dokument video projektu Kdenlive</comment>
<comment xml:lang="sl">Dokument video projekta Kdenlive</comment>
<comment xml:lang="sv">Kdenlive-videoprojektdokument</comment>
<comment xml:lang="tr">Kdenlive video proje belgesi</comment>
<comment xml:lang="uk">документ відеопроєкту Kdenlive</comment>
<comment xml:lang="zh_CN">Kdenlive 视频项目文档</comment>
<comment xml:lang="zh_TW">Kdenlive 影片專案文件</comment>
<sub-class-of type="video/mlt-playlist"/>
<glob pattern="*.kdenlive"/>
</mime-type>
<mime-type type="application/x-kdenlivetitle">
<comment>Kdenlive video title</comment>
<comment xml:lang="ar">عنوان «كدينلايڤ» ڤديوهيّ</comment>
<comment xml:lang="bs">Kdenlive video naslov</comment>
<comment xml:lang="ca">títol de vídeo del Kdenlive</comment>
<comment xml:lang="ca@valencia">títol de vídeo del Kdenlive</comment>
<comment xml:lang="cs">Název videa Kdenlive</comment>
<comment xml:lang="da">Kdenlive videotitel</comment>
<comment xml:lang="de">Kdenlive-Videotitel</comment>
<comment xml:lang="el">Τίτλος βίντεο Kdenlive</comment>
<comment xml:lang="en_GB">Kdenlive video title</comment>
<comment xml:lang="es">Título de video de Kdenlive</comment>
<comment xml:lang="et">Kdenlive'i videotiitel</comment>
<comment xml:lang="eu">Kdenlive video izenburua</comment>
<comment xml:lang="fi">Kdenlive-video-otsikko</comment>
<comment xml:lang="fr">Titre Kdenlive</comment>
<comment xml:lang="gl">Título de vídeo de Kdenlive</comment>
<comment xml:lang="id">Judul video Kdenlive</comment>
<comment xml:lang="it">Titolo video Kdenlive</comment>
<comment xml:lang="ko">Kdenlive 동영상 타이틀</comment>
<comment xml:lang="ca">Títol de vídeo del Kdenlive</comment>
<comment xml:lang="ca@valencia">Títol de vídeo del Kdenlive</comment>
<comment xml:lang="eu">Kdenlive-ko bideo-izenburua</comment>
<comment xml:lang="fr">Titre de vidéo pour Kdenlive</comment>
<comment xml:lang="it">Titolo video di Kdenlive</comment>
<comment xml:lang="nl">Titel van Kdenlive-video</comment>
<comment xml:lang="nn">Kdenlive-videotittel</comment>
<comment xml:lang="pl">Tytuł filmu w Kdenlive</comment>
<comment xml:lang="pt">Título de vídeo do Kdenlive</comment>
<comment xml:lang="pt_BR">Título de vídeo do Kdenlive</comment>
<comment xml:lang="ru">Видеотитры Kdenlive</comment>
<comment xml:lang="sk">Názov videa Kdenlive</comment>
<comment xml:lang="sl">Naslov videa Kdenlive</comment>
<comment xml:lang="sv">Kdenlive-video</comment>
<comment xml:lang="tr">Kdenlive video başlığı</comment>
<comment xml:lang="uk">заголовок відео Kdenlive</comment>
<comment xml:lang="zh_CN">Kdenlive 视频标题</comment>
<comment xml:lang="zh_TW">Kdenlive 影片標題</comment>
<sub-class-of type="application/xml"/>
<glob pattern="*.kdenlivetitle"/>
</mime-type>

View File

@@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="22" width="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<path fill="currentColor" fill-opacity=".498" stroke="currentColor" stroke-linecap="square" d="M3.5 3.5h15v15h-15z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 376 B

View File

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="22" width="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<path fill="none" stroke="currentColor" stroke-linecap="square" d="M3.5 3.5h15v15h-15z" class="ColorScheme-Text"/>
<path opacity=".5" fill="currentColor" d="M5 5h4v4H5zm4 4h4v4H9zm-4 4h4v4H5zm8 0h4v4h-4zm0-8h4v4h-4z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 481 B

View File

@@ -1,18 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="22" width="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<path
fill="none"
stroke="currentColor"
stroke-linecap="square"
d="M3.5 3.5h15v15h-15z"
class="ColorScheme-Text"
id="path4209" />
<path
style="fill:currentColor;fill-opacity:0.5;stroke:none;"
d="M 11 5 L 11 11 L 17 11 L 17 5 L 11 5 z M 11 11 L 5 11 L 5 17 L 11 17 L 11 11 z "
id="rect4757" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 584 B

View File

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<path fill="currentColor" class="ColorScheme-Text" d="M4 16h24v12H4z"/>
<path fill="currentColor" class="ColorScheme-Text" d="M16 4h12v13.73H16z"/>
</svg>

Before

Width:  |  Height:  |  Size: 405 B

View File

@@ -1,11 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path d="M12 4L9.523 9.266 4 10.11l4 4.1L7.055 20 12 17.266 16.945 20 16 14.21l4-4.1-5.523-.844L12 4z" fill="currentColor" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 387 B

View File

@@ -1,13 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 11,3 C 8.784,3 7,4.784 7,7 l 0,4 -2,0 c 0,2.666667 0,5.333333 0,8 4,0 8,0 12,0 l 0,-8 c -0.666667,0 -1.333333,0 -2,0 L 15,7 C 15,4.784 13.216,3 11,3 m 0,1 c 1.662,0 3,1.561 3,3.5 L 14,11 8,11 8,7.5 C 8,5.561 9.338,4 11,4"
class="ColorScheme-Text"
/>
</svg>

Before

Width:  |  Height:  |  Size: 558 B

View File

@@ -1,14 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
d="m11 3c-2.216 0-4 1.784-4 4v1h1v-.5c0-1.939 1.338-3.5 3-3.5 1.662 0 3 1.561 3 3.5v3.5h-5-1-1-1-1v1 7h1 10 1v-8h-1-1v-4c0-2.216-1.784-4-4-4m-5 9h10v6h-10v-6"
class="ColorScheme-Text"
/>
</svg>

Before

Width:  |  Height:  |  Size: 491 B

View File

@@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<path d="M28 4v24H4z" fill="currentColor" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 322 B

View File

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M7 11l-3 3 3 3 0-6zM15 11l0 6 3-3-3-3zM6.0234375 4.9941406L6.0234375 8.9941406 5.0234375 8.9941406 5.0234375 6.9941406 4.0234375 6.9941406 4.0234375 8.9941406 3.0234375 8.9941406 3.0234375 9.9941406 19.023438 9.9941406 19.023438 8.9941406 19 8.9941406 19 7 18 7 18 8.9941406 17.023438 8.9941406 17.023438 4.9941406 16.023438 4.9941406 16.023438 8.9941406 15.023438 8.9941406 15.023438 6.9941406 14.023438 6.9941406 14.023438 8.9941406 13.023438 8.9941406 13.023438 6.9941406 12.023438 6.9941406 12.023438 8.9941406 11.023438 8.9941406 11.023438 6.9941406 10.023438 6.9941406 10.023438 8.9941406 9.0234375 8.9941406 9.0234375 6.9941406 8.0234375 6.9941406 8.0234375 8.9941406 7.0234375 8.9941406 7.0234375 4.9941406 6.0234375 4.9941406zM10.5 11.5l0 2-2 0 0 1 2 0 0 2 1 0 0-2 2 0 0-1-2 0 0-2-1 0zM3 11H4V17H3zM18 11H19V17H18z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" id="svg2">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<path style="color:currentColor;fill:currentColor;" class="ColorScheme-Text" d="m 6.0234375,4.9941406 0,4 -1,0 0,-2 -1,0 0,2 -1,0 0,1 16.0000005,0 0,-1 -0.02344,0 L 19,7 l -1,0 0,1.9941406 -0.976562,0 0,-4 -1,0 0,4 -1,0 0,-2 -1,0 0,2 -1,0 0,-2 -1,0 0,2 -1,0 0,-2 -1,0 0,2 -1.0000005,0 0,-2 -1,0 0,2 -1,0 0,-4 -1,0 z" id="path6"/>
<path style="fill:#da4453" d="M 9.207,11.5 8.5,12.207 10.293,14 8.5,15.793 9.207,16.5 11,14.707 12.793,16.5 13.5,15.793 11.707,14 13.5,12.207 12.793,11.5 11,13.293 9.207,11.5 Z" class="ColorScheme-Text" id="path8"/>
</svg>

Before

Width:  |  Height:  |  Size: 792 B

View File

@@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M7 11l-3 3 3 3 0-6zM15 11l0 6 3-3-3-3zM6.0234375 4.9941406L6.0234375 8.9941406 5.0234375 8.9941406 5.0234375 6.9941406 4.0234375 6.9941406 4.0234375 8.9941406 3.0234375 8.9941406 3.0234375 9.9941406 19.023438 9.9941406 19.023438 8.9941406 19 8.9941406 19 7 18 7 18 8.9941406 17.023438 8.9941406 17.023438 4.9941406 16.023438 4.9941406 16.023438 8.9941406 15.023438 8.9941406 15.023438 6.9941406 14.023438 6.9941406 14.023438 8.9941406 13.023438 8.9941406 13.023438 6.9941406 12.023438 6.9941406 12.023438 8.9941406 11.023438 8.9941406 11.023438 6.9941406 10.023438 6.9941406 10.023438 8.9941406 9.0234375 8.9941406 9.0234375 6.9941406 8.0234375 6.9941406 8.0234375 8.9941406 7.0234375 8.9941406 7.0234375 4.9941406 6.0234375 4.9941406z" class="ColorScheme-Text"/>
<path style="fill:#da4453" d="M 9.207,11.5 8.5,12.207 10.293,14 8.5,15.793 9.207,16.5 11,14.707 12.793,16.5 13.5,15.793 11.707,14 13.5,12.207 12.793,11.5 11,13.293 9.207,11.5 Z" class="ColorScheme-Text"/>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M3 11H4V17H3zM18 11H19V17H18z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M 11 3 A 8 8 0 0 0 3 11 A 8 8 0 0 0 4.3945312 15.5 L 5.1171875 14.777344 A 7 7 0 0 1 4 11 A 7 7 0 0 1 11 4 A 7 7 0 0 1 14.773438 5.1210938 L 15.494141 4.4003906 A 8 8 0 0 0 11 3 z M 16.291016 5.0175781 L 15.582031 5.7265625 A 7 7 0 0 1 16.277344 6.4160156 L 16.988281 5.7050781 A 8 8 0 0 0 16.291016 5.0175781 z M 17.611328 6.4960938 L 16.890625 7.2167969 A 7 7 0 0 1 16.890625 7.21875 A 7 7 0 0 1 18 11 A 7 7 0 0 1 11 18 A 7 7 0 0 1 7.2226562 16.884766 L 6.5019531 17.605469 A 8 8 0 0 0 11 19 A 8 8 0 0 0 19 11 A 8 8 0 0 0 17.611328 6.4960938 z M 11 8 L 11 8.8945312 L 11.511719 8.3828125 L 11 8 z M 12.320312 8.9882812 L 11 10.308594 L 11 11.693359 L 13.111328 9.5820312 L 12.320312 8.9882812 z M 13.917969 10.189453 L 11 13.107422 L 11 14 L 15 11 L 13.917969 10.189453 z M 5.7246094 15.583984 L 5.0195312 16.289062 A 8 8 0 0 0 5.7070312 16.986328 L 6.4121094 16.28125 A 7 7 0 0 1 5.7246094 15.583984 z" class="ColorScheme-Text"/>
<path style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#da4453;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 10 8 A 3 3 0 0 0 7 11 A 3 3 0 0 0 7.4003906 12.494141 L 10 9.8945312 L 10 8 z M 10 11.308594 L 8.0410156 13.267578 A 3 3 0 0 0 8.9003906 13.791016 L 10 12.691406 L 10 11.308594 z" class="ColorScheme-Text"/>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;marker:none;marker-start:none;marker-mid:none;marker-end:none;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M 18.29297,2.9999999 3,18.293 3.70703,19 19,3.7069999 l -0.70703,-0.707 z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path d="m 11,3 c -4.432,0 -8,3.568 -8,8 0,4.432 3.568,8 8,8 4.432,0 8,-3.568 8,-8 0,-4.432 -3.568,-8 -8,-8 z m 0,1 c 3.878,0 7,3.122 7,7 0,3.878 -3.122,7 -7,7 C 7.122,18 4,14.878 4,11 4,7.122 7.122,4 11,4 Z" style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" class="ColorScheme-Text"/>
<path d="M 9,14 13,11 9,8 Z" style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" transform="translate(2)" class="ColorScheme-Text"/>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:#da4453;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 10,8 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 l 0,-6 z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,16 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" id="svg3760">
<defs id="defs3762">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}.ColorScheme-Background{color:#eff0f1}.ColorScheme-Highlight{color:#3daee9}.ColorScheme-ViewText{color:#31363b}.ColorScheme-ViewBackground{color:#fcfcfc}.ColorScheme-ViewHover{color:#93cee9}.ColorScheme-ViewFocus{color:#3daee9}.ColorScheme-ButtonText{color:#31363b}.ColorScheme-ButtonBackground{color:#eff0f1}.ColorScheme-ButtonHover{color:#93cee9}.ColorScheme-ButtonFocus{color:#3daee9}
</style>
</defs>
<g id="layer1" class="ColorScheme-Text">
<path d="M19 15l-1.614.574.735 1.547-1.545-.733L16 18l-.574-1.614-1.547.735.733-1.545L13 15l1.614-.574-.735-1.547 1.545.733L16 12l.574 1.614 1.547-.735-.733 1.545z" id="path4160-0" style="isolation:auto;mix-blend-mode:normal" color="#000" overflow="visible" fill="#fdbc4b" stroke-width="1.795"/>
<path style="isolation:auto;mix-blend-mode:normal" d="M3 4v3h17V4H3zm1 1h1v1H4V5zm2 0h1v1H6V5zm2 0h1v1H8V5zm2 0h1v1h-1V5zm2 0h1v1h-1V5zm2 0h1v1h-1V5zm2 0h1v1h-1V5zm2 0h1v1h-1V5z" id="rect4146" color="currentColor" overflow="visible" fill="currentColor" stroke-width="2.8" stroke-opacity=".55"/>
<path style="isolation:auto;mix-blend-mode:normal" d="M3 15v3h10v-1h-1v-2H3zm1 1h1v1H4v-1zm2 0h1v1H6v-1zm2 0h1v1H8v-1zm2 0h1v1h-1v-1z" id="rect4146-2" color="currentColor" overflow="visible" fill="currentColor" stroke-width="2.8" stroke-opacity=".55"/>
<path style="isolation:auto;mix-blend-mode:normal" id="rect4212" color="currentColor" overflow="visible" fill="currentColor" stroke-width="2.8" stroke-opacity=".55" d="M4 6h1v10H4z"/>
<path style="isolation:auto;mix-blend-mode:normal" id="rect4214" color="currentColor" overflow="visible" fill="currentColor" stroke-width="2.8" stroke-opacity=".55" d="M11 6h1v10h-1z"/>
<path style="isolation:auto;mix-blend-mode:normal" id="rect4214-1" color="currentColor" overflow="visible" fill="currentColor" stroke-width="2.8" stroke-opacity=".55" d="M18 6h1v6h-1z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,20 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="22" width="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<g transform="translate(-284.053 -142.61)" fill="currentColor" class="ColorScheme-Text">
<circle r="1" cy="147.701" cx="289.125"/>
<path d="M291.93 146.7h8.124v2h-8.125z"/>
</g>
<g transform="translate(-284.053 -136.165)" fill="currentColor" class="ColorScheme-Text">
<circle r="1" cy="147.701" cx="289.125"/>
<path d="M291.93 146.7h8.124v2h-8.125z"/>
</g>
<g fill="currentColor" transform="translate(-551.286 -607.648)" class="ColorScheme-Text">
<circle cx="556.358" cy="625.628" r="1"/>
<path d="M559.162 624.628h8.125v2h-8.125z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 840 B

View File

@@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="22" width="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<g fill="currentColor" class="ColorScheme-Text">
<path d="M5.428 5.98h11v11h-11z"/>
<path d="M6.46 4.512h1.28v2H6.46zm2.416 0h1.28v2h-1.28zm2.416 0h1.28v2h-1.28zm2.418 0h1.28v2h-1.28zm-7.22 12h1.28v2H6.49zm2.417 0h1.28v2h-1.28zm2.417 0h1.28v2h-1.28zm2.416 0h1.28v2h-1.28zM5.882 7.215v1.28h-2v-1.28zm0 2.417v1.28h-2v-1.28zm0 2.418v1.28h-2v-1.28zm0 2.415v1.28h-2v-1.28zM17.913 7.06v1.28h-2V7.06zm0 2.416v1.28h-2v-1.28zm0 2.417v1.28h-2v-1.28zm0 2.417v1.28h-2v-1.28z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 724 B

View File

@@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<path fill="currentColor" class="ColorScheme-Text" d="M28 4v24H4c.995-12.86 6.892-22.32 24-24z"/>
</svg>

Before

Width:  |  Height:  |  Size: 351 B

View File

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:currentColor}
</style>
</defs>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M3 11H7V15H3z" class="ColorScheme-Text"/>
<path style="fill:#da4453" d="M 8.707,10.5 8,11.207 9.793,13 8,14.793 8.707,15.5 10.5,13.707 12.293,15.5 13,14.793 11.207,13 13,11.207 12.293,10.5 10.5,12.293 8.707,10.5 Z" class="ColorScheme-Text"/>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M17 11l0-2-4 4 4 4 0-2 2 0 0-4zM6 10H7V11H6z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,11 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:currentColor}
</style>
</defs>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M2 11H6V15H2z" class="ColorScheme-Text"/>
<path d="m 7,9 6,0 0,5 -6,0 z" style="fill:#1d99f3"/>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:#1d99f3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 7,5 10,8 13,5 7,5 Z" class="ColorScheme-Text"/>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="m 16,11 0,-2 4,4 -4,4 0,-2 -2,0 0,-4 z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<path d="m 3,11 0,4 4,0 0,-4 -4,0 z m 12,0 0,4 4,0 0,-4 -4,0 z" style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;marker:none;marker-start:none;marker-mid:none;marker-end:none;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" class="ColorScheme-Text"/>
<path style="fill:#da4453" d="M 9.207,10.5 8.5,11.207 10.293,13 8.5,14.793 9.207,15.5 11,13.707 12.793,15.5 13.5,14.793 11.707,13 13.5,11.207 12.793,10.5 11,12.293 9.207,10.5 Z"/>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M6 10H7V11H6zM15 10H16V11H15z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text{color:#4d4d4d}
</style>
</defs>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M3 11H19V15H3z" class="ColorScheme-Text"/>
<path fill="#1d99f3" d="M8 8h6v5H8z" class="ColorScheme-Text"/>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:#1d99f3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 8,4 3.000001,3 3,-3 L 8,4 Z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M6.0234375 4.9941406l0 4-1 0 0-2-1 0 0 2-1 0 0 1 6.8613281 0 1.1386724-1.1386718 0-1.8613282-1 0 0 2-1.0000005 0 0-2-1 0 0 2-1 0 0-4-1 0zM12.023438 6.9941406l0 .8613282.861328-.8613282-.861328 0zM18 7l0 1.9941406-.976562 0 0-1.8964844-1 1 0 .8964844-.896485 0-1 1 4.896485 0 0-1-.02344 0L19 7 18 7zM7 11L4 14 4.9394531 14.939453 7 12.878906 7 11zM15 11l0 6 3-3-3-3z" class="ColorScheme-Text"/>
<path style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;marker:none;marker-start:none;marker-mid:none;marker-end:none;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M 18.271261,2.9991929 2.9782908,18.292193 l 0.70703,0.707 15.2929702,-15.2930001 -0.70703,-0.707 z" class="ColorScheme-Text"/>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M18 11H19V17H18zM3 11L3 16.857422 4 15.857422 4 11 3 11z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="color:currentColor;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:currentColor;solid-opacity:1;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M7 11l-3 3 3 3 0-6zM15 11l0 6 3-3-3-3zM6.0234375 4.9941406L6.0234375 8.9941406 5.0234375 8.9941406 5.0234375 6.9941406 4.0234375 6.9941406 4.0234375 8.9941406 3.0234375 8.9941406 3.0234375 9.9941406 19.023438 9.9941406 19.023438 8.9941406 19 8.9941406 19 7 18 7 18 8.9941406 17.023438 8.9941406 17.023438 4.9941406 16.023438 4.9941406 16.023438 8.9941406 15.023438 8.9941406 15.023438 6.9941406 14.023438 6.9941406 14.023438 8.9941406 13.023438 8.9941406 13.023438 6.9941406 12.023438 6.9941406 12.023438 8.9941406 11.023438 8.9941406 11.023438 6.9941406 10.023438 6.9941406 10.023438 8.9941406 9.0234375 8.9941406 9.0234375 6.9941406 8.0234375 6.9941406 8.0234375 8.9941406 7.0234375 8.9941406 7.0234375 4.9941406 6.0234375 4.9941406zM3 11H4V17H3zM18 11H19V17H18z" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,14 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<g fill="currentColor" color="currentColor" class="ColorScheme-Text">
<path style="isolation:auto;mix-blend-mode:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M3 3v16h16V3zm1 4h14v11H4z" overflow="visible" class="ColorScheme-Text"/>
<path style="isolation:auto;mix-blend-mode:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0" d="M11 7v1h1V7h-1zm0 2v1h1V9h-1zm0 2v1h1v-1h-1zm0 2v1h1v-1h-1zm0 2v1h1v-1h-1zm0 2v1h1v-1h-1zM9.494 7.998l-1.685 3.37H4.996l2.248 2.247-.562 3.373 2.81-1.685.506.302V9.01l-.507-1.012z" overflow="visible"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 830 B

View File

@@ -1,15 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<g fill="currentColor" class="ColorScheme-Text">
<path d="M12.738 6.905l-.397-.397-3.438 3.44L7.85 11 8.9 12.053l3.44 3.44.396-.398-3.44-3.44L8.644 11l.656-.656 3.438-3.44z" stroke-width="0"/>
<path d="M5.605 3v12.545h-1V3zM17.78 11.276h-7.44v-.593h7.44z"/>
</g>
<circle cx="5.097" cy="16.907" r="1.642" fill="none" stroke="currentColor" stroke-width=".892" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 644 B

View File

@@ -1,15 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<g fill="currentColor" class="ColorScheme-Text">
<path d="M9.255 6.905l.397-.397 3.44 3.44L14.144 11l-1.052 1.053-3.44 3.44-.397-.398 3.44-3.44.655-.655-.655-.656-3.44-3.44z" stroke-width="0"/>
<path d="M16.39 3v12.545h1V3zM4.215 11.276h7.438v-.593H4.215z"/>
</g>
<circle cx="-16.896" cy="16.907" r="1.642" transform="scale(-1 1)" fill="none" stroke="currentColor" stroke-width=".892" class="ColorScheme-Text"/>
</svg>

Before

Width:  |  Height:  |  Size: 669 B

View File

@@ -1,4 +1,14 @@
<!DOCTYPE kpartgui>
<transition tag="luma" id="luma" type="hidden">
<name>Luma</name>
<description>Applies a stationary transition between the current and next frames.</description>
<author>Dan Dennedy</author>
<parameter type="list" name="resource" default="" paramlist="%lumaPaths" optional="1">
<paramlistdisplay>%lumaNames</paramlistdisplay>
<name>Wipe Method</name>
</parameter>
<parameter type="double" name="softness" max="100" min="0" default="0" factor="100">
<name>Softness</name>
</parameter>
</transition>

View File

@@ -96,11 +96,14 @@ add_subdirectory( ext_fftw3 )
add_subdirectory( ext_fftw3f )
add_subdirectory( ext_sdl2 )
add_subdirectory( ext_sox )
add_subdirectory( ext_jack )
add_subdirectory( ext_jack )
add_subdirectory( ext_ladspa )
add_subdirectory( ext_x264 )
add_subdirectory( ext_x265 )
add_subdirectory( ext_libvpx )
add_subdirectory( ext_nv-codec-headers )
add_subdirectory( ext_amf )
add_subdirectory( ext_mfx )
add_subdirectory( ext_ffmpeg )
add_subdirectory( ext_cairo )
add_subdirectory( ext_pango )

View File

@@ -0,0 +1,13 @@
ExternalProject_Add(
ext_amf
DOWNLOAD_DIR ${EXT_DOWNLOAD_DIR}
GIT_REPOSITORY https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git
GIT_TAG master
CONFIGURE_COMMAND rm -rf <SOURCE_DIR>/Thirdparty
BUILD_ALWAYS TRUE
BUILD_IN_SOURCE 1
BUILD_COMMAND mkdir -p ${EXT_INSTALL_DIR}/include/AMF
INSTALL_COMMAND cp -av <SOURCE_DIR>/amf/public/include/. ${EXT_INSTALL_DIR}/include/AMF
)

View File

@@ -7,7 +7,7 @@ ExternalProject_Add(
UPDATE_COMMAND git checkout debian/7%4.3-3
# PATCH_COMMAND rm <SOURCE_DIR>/tests/ref/fate/sub-scc
GIT_TAG debian/master
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${EXT_INSTALL_DIR} --extra-ldflags="-L${EXT_INSTALL_DIR}/lib -lstdc++ -lm -lrt -ldl" --extra-cflags="-I$EXT_INSTALL_DIR/include" --enable-shared --enable-avfilter --enable-gpl --enable-avresample --enable-libx265 --enable-libvpx --enable-libx264 --disable-doc --enable-libmp3lame --enable-libopus --enable-libvorbis
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${EXT_INSTALL_DIR} --extra-ldflags="-L${EXT_INSTALL_DIR}/lib -lstdc++ -lm -lrt -ldl" --extra-cflags="-I$EXT_INSTALL_DIR/include" --enable-shared --enable-avfilter --enable-gpl --enable-avresample --enable-libx265 --enable-libvpx --enable-libx264 --disable-doc --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-nvenc --enable-libmfx --enable-vaapi
BUILD_ALWAYS TRUE
BUILD_IN_SOURCE 1
BUILD_COMMAND $(MAKE) clean

View File

@@ -195,11 +195,11 @@ function(InstallKF5Component
endfunction()
if(MINGW)
set(KF5_VERSION 5.71) # we have Qt 5.14.2 available.
set(KF5_VERSION 5.74) # we have Qt 5.14.2 available.
elseif(APPLE)
set(KF5_VERSION 5.71) # we have Qt 5.14.1 available.
set(KF5_VERSION 5.74) # we have Qt 5.14.1 available.
else()
set(KF5_VERSION 5.71) # we have Qt 5.14.2 available.
set(KF5_VERSION 5.74) # we have Qt 5.14.2 available.
endif()
if(APPLE)
@@ -244,20 +244,21 @@ InstallKF5Component(attica ${KF5_VERSION} ""
InstallKF5Component(kio ${KF5_VERSION} "" "")
InstallKF5Component(frameworkintegration ${KF5_VERSION} "" "")
InstallKF5Component(qqc2-desktop-style ${KF5_VERSION} "" "")
InstallKF5Component(plasma-framework ${KF5_VERSION} "" "")
ExternalProject_Add(
ext_kdecoration
DOWNLOAD_DIR ${EXT_DOWNLOAD_DIR}
URL http://download.kde.org/stable/plasma/5.18.3/kdecoration-5.18.3.tar.xz
URL_MD5 150da856a2dab8e28f76011638f23869
URL http://download.kde.org/stable/plasma/5.19.5/kdecoration-5.19.5.tar.xz
URL_MD5 3cc5be057c571dc20775ac52a6af2908
CMAKE_ARGS ${CMAKE_GLOBAL_PROFILE}
)
ExternalProject_Add(
ext_breeze
DOWNLOAD_DIR ${EXT_DOWNLOAD_DIR}
URL http://download.kde.org/stable/plasma/5.18.3/breeze-5.18.3.tar.xz
URL_MD5 09018228efdfc18be6cc11092290b183
URL http://download.kde.org/stable/plasma/5.19.5/breeze-5.19.5.tar.xz
URL_MD5 f664f181d10c4cbbe4b385068c75539a
CMAKE_ARGS ${CMAKE_GLOBAL_PROFILE}
DEPENDS ext_kdecoration
)

View File

@@ -0,0 +1,14 @@
ExternalProject_Add(
ext_mfx
DOWNLOAD_DIR ${EXT_DOWNLOAD_DIR}
GIT_REPOSITORY git://github.com/lu-zero/mfx_dispatch.git
GIT_TAG master
CONFIGURE_COMMAND autoreconf -fiv
COMMAND ./configure --prefix=${EXT_INSTALL_DIR}
BUILD_ALWAYS TRUE
BUILD_IN_SOURCE 1
BUILD_COMMAND $(MAKE)
INSTALL_COMMAND $(MAKE) install
)

View File

@@ -0,0 +1,11 @@
ExternalProject_Add(
ext_nv-codec-headers
DOWNLOAD_DIR ${EXT_DOWNLOAD_DIR}
GIT_REPOSITORY git://github.com/FFmpeg/nv-codec-headers.git
GIT_TAG master
CONFIGURE_COMMAND sed -i s,/usr/local,${EXT_INSTALL_DIR}, <SOURCE_DIR>/Makefile
BUILD_ALWAYS TRUE
BUILD_IN_SOURCE 1
BUILD_COMMAND $(MAKE)
INSTALL_COMMAND $(MAKE) install
)

View File

@@ -6,18 +6,25 @@ set -e
# Be verbose
set -x
# Make sure the base dependencies are installed
#apt-get -y install build-essential perl python git '^libxcb.*-dev' libx11-xcb-dev \
# libglu1-mesa-dev libxrender-dev libxi-dev flex bison gperf libicu-dev ruby
#apt-get -y install cmake3 wget tar bzip2 xz-utils libtool libfile-which-perl automake gcc-4.8 patch \
# g++-4.8 zlib1g-dev libglib2.0-dev libc6-dev libeigen3-dev libssl-dev \
# libcppunit-dev libstdc++-4.8-dev libfreetype6-dev libfontconfig1-dev liblcms2-dev \
# mesa-common-dev libaio-dev lzma liblzma-dev\
# libpulse-dev libsox-dev liblist-moreutils-perl libxml-parser-perl \
# libjack-dev autopoint language-pack-en-base
#apt-get update && apt-get install -y apt-transport-https ca-certificates gnupg software-properties-common wget
#wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | apt-key add -
#add-apt-repository -y ppa:openjdk-r/ppa && apt-add-repository 'deb https://apt.kitware.com/ubuntu/ xenial main'
## Update the system and bring in our core operating requirements
#apt-get update && apt-get upgrade -y && apt-get install -y openssh-server openjdk-8-jre-headless
## Some software demands a newer GCC because they're using C++14 stuff, which is just insane
## We do this after the general system update to ensure it doesn't bring in any unnecessary updates
#add-apt-repository -y ppa:ubuntu-toolchain-r/test && apt-get update
## Now install the general dependencies we need for builds
#apt-get install -y build-essential cmake git-core locales automake gcc-6 g++-6 libxml-parser-perl libpq-dev libaio-dev bison gettext gperf libasound2-dev libatkmm-1.6-dev libbz2-dev libcairo-perl libcap-dev libcups2-dev libdbus-1-dev libdrm-dev libegl1-mesa-dev libfontconfig1-dev libfreetype6-dev libgcrypt11-dev libgl1-mesa-dev libglib-perl libgsl0-dev libgsl0-dev gstreamer1.0-alsa libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgtk2-perl libjpeg-dev libnss3-dev libpci-dev libpng12-dev libpulse-dev libssl-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly libtiff5-dev libudev-dev libwebp-dev flex libmysqlclient-dev libx11-dev libxkbcommon-x11-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-util0-dev libxcb-res0-dev libxcb1-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxext-dev libxfixes-dev libxi-dev libxrandr-dev libxrender-dev libxss-dev libxtst-dev mesa-common-dev liblist-moreutils-perl libtool libpixman-1-dev subversion
#apt-get -y install libpixman-1-dev docbook-xml docbook-xsl libattr1-dev
## Required for vaapi gpu encoding
#apt-get -y install libva-dev
# Read in our parameters
export BUILD_PREFIX=$1
export KDENLIVE_SOURCES=$2
@@ -109,13 +116,16 @@ cmake --build . --target ext_x265 -j$CPU_CORES
export CC=/usr/bin/gcc
export CXX=/usr/bin/g++
#cmake --build . --target ext_libvpx -j$CPU_CORES
cmake --build . --target ext_libvpx -j$CPU_CORES
export CC=/usr/bin/gcc-6
export CXX=/usr/bin/g++-6
cmake --build . --target ext_opus -j$CPU_CORES
cmake --build . --target ext_nv-codec-headers -j$CPU_CORES
cmake --build . --target ext_amf -j$CPU_CORES
cmake --build . --target ext_mfx -j$CPU_CORES
cmake --build . --target ext_ffmpeg -j$CPU_CORES
cmake --build . --target ext_sox -j$CPU_CORES
cmake --build . --target ext_jack -j$CPU_CORES
@@ -134,9 +144,9 @@ export CC=/usr/bin/gcc-6
export CXX=/usr/bin/g++-6
#cmake --build . --target ext_movit
cmake --build . --target ext_frameworks
##cmake --build . --target ext_movit
cmake --build . --target ext_frameworks
cmake --build . --config RelWithDebInfo --target ext_extra-cmake-modules -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_kconfig -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_breeze-icons -- -j$CPU_CORES
@@ -168,13 +178,12 @@ cmake --build . --config RelWithDebInfo --target ext_kio -- -j$C
cmake --build . --config RelWithDebInfo --target ext_knotifyconfig -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_kpackage -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_knewstuff -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_knotifications -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_kdeclarative -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_kservice -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_kimageformats -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_knotifications -- -j$CPU_CORES
#cmake --build . --config RelWithDebInfo --target ext_frameworkintegration -- -j$CPU_CORES
cmake --build . --config RelWithDebInfo --target ext_frameworkintegration -- -j$CPU_CORES
cmake --build . --target ext_breeze
#cmake --build . --target ext_kwayland
#cmake --build . --target ext_plasma-framework
#cmake --build . --target ext_ruby

View File

@@ -16,6 +16,7 @@ export APPIMAGEPLUGINS=$APPDIR/usr/plugins/
mkdir -p $APPDIR
mkdir -p $APPDIR/usr/share/kdenlive
mkdir -p $APPDIR/usr/lib
mkdir -p $APPDIR/usr/lib/va
mkdir -p $PLUGINS
mkdir -p $APPDIR/usr/plugins
@@ -43,11 +44,11 @@ cd $BUILD_PREFIX
# Step 1: Copy over all the resources provided by dependencies that we need
cp -r $DEPS_INSTALL_PREFIX/share/kf5 $APPDIR/usr/share
cp -r $DEPS_INSTALL_PREFIX/share/kstyle $APPDIR/usr/share
cp -r $DEPS_INSTALL_PREFIX/share/plasma $APPDIR/usr/share
#cp -r $DEPS_INSTALL_PREFIX/share/kstyle $APPDIR/usr/share
#cp -r $DEPS_INSTALL_PREFIX/share/plasma $APPDIR/usr/share
cp -r $DEPS_INSTALL_PREFIX/share/alsa $APPDIR/usr/share
cp -r $DEPS_INSTALL_PREFIX/share/kservices5 $APPDIR/usr/share
cp -r $DEPS_INSTALL_PREFIX/share/qt5 $APPDIR/usr/share
#cp -r $DEPS_INSTALL_PREFIX/share/qt5 $APPDIR/usr/share
cp -r $DEPS_INSTALL_PREFIX/share/mime $APPDIR/usr/share
if [ -d $DEPS_INSTALL_PREFIX/share/color-schemes ] ; then
@@ -73,15 +74,19 @@ cp -r $DEPS_INSTALL_PREFIX/bin/ffmpeg $APPDIR/usr/bin
cp -r $DEPS_INSTALL_PREFIX/bin/ffplay $APPDIR/usr/bin
cp -r $DEPS_INSTALL_PREFIX/bin/ffprobe $APPDIR/usr/bin
cp -r $DEPS_INSTALL_PREFIX/plugins/kf5 $APPIMAGEPLUGINS
cp -r $DEPS_INSTALL_PREFIX/plugins/styles $APPIMAGEPLUGINS
#cp -r $DEPS_INSTALL_PREFIX/plugins/styles $APPIMAGEPLUGINS
cp -r $DEPS_INSTALL_PREFIX/plugins/audio $APPIMAGEPLUGINS
cp -r $DEPS_INSTALL_PREFIX/plugins/org.kde.kdecoration2 $APPIMAGEPLUGINS
cp -r $DEPS_INSTALL_PREFIX/plugins/kstyle_breeze_config.so $APPIMAGEPLUGINS
#cp -r $DEPS_INSTALL_PREFIX/plugins/org.kde.kdecoration2 $APPIMAGEPLUGINS
#cp -r $DEPS_INSTALL_PREFIX/plugins/kstyle_breeze_config.so $APPIMAGEPLUGINS
mkdir -p $APPDIR/usr/libexec
cp -r $DEPS_INSTALL_PREFIX/lib/x86_64-linux-gnu/libexec/kf5/* $APPDIR/usr/libexec/
#libva accel
cp -r /usr/lib/x86_64-linux-gnu/libva* $APPDIR/usr/lib || true
cp -r /usr/lib/x86_64-linux-gnu/dri/*_drv_video.so $APPDIR/usr/lib/va || true
cp $(ldconfig -p | grep libGL.so.1 | cut -d ">" -f 2 | xargs) $APPDIR/usr/lib/
#cp $(ldconfig -p | grep libGLU.so.1 | cut -d ">" -f 2 | xargs) $APPDIR/usr/lib/
@@ -101,22 +106,32 @@ for lib in $APPIMAGEPLUGINS/audio/*.so*; do
patchelf --set-rpath '$ORIGIN/../../lib' $lib;
done
for lib in $APPIMAGEPLUGINS/styles/*.so*; do
patchelf --set-rpath '$ORIGIN/../../lib' $lib;
done
#for lib in $APPIMAGEPLUGINS/styles/*.so*; do
# patchelf --set-rpath '$ORIGIN/../../lib' $lib;
#done
for lib in $APPIMAGEPLUGINS/kf5/*.so*; do
patchelf --set-rpath '$ORIGIN/../../lib' $lib;
done
for lib in $APPIMAGEPLUGINS/org.kde.kdecoration2/*.so*; do
patchelf --set-rpath '$ORIGIN/../../lib' $lib;
done
#for lib in $APPIMAGEPLUGINS/org.kde.kdecoration2/*.so*; do
# patchelf --set-rpath '$ORIGIN/../../lib' $lib;
#done
for lib in $APPDIR/usr/lib/mlt/*.so*; do
patchelf --set-rpath '$ORIGIN/..' $lib;
done
#for lib in $APPDIR/usr/lib/libva*.so*; do
# patchelf --set-rpath '$ORIGIN' $lib;
#done
#for lib in $APPDIR/usr/lib/va/*.so*; do
# patchelf --set-rpath '$ORIGIN/..' $lib;
#done
### GSTREAMER
# Requires gstreamer1.0-plugins-good
GST_PLUGIN_SRC_DIR=/usr/lib/x86_64-linux-gnu/
@@ -153,6 +168,12 @@ cp $APPDIR/usr/share/icons/breeze/apps/48/kdenlive.svg $APPDIR
#linuxdeployqt $APPDIR/usr/bin/ffplay
#linuxdeployqt $APPDIR/usr/bin/ffprobe
#linuxdeployqt $APPDIR/usr/bin/melt
#linuxdeployqt -executable $APPDIR/usr/lib/va/*.so
# -executable=$APPDIR/usr/lib/libva.so \
# -executable=$APPDIR/usr/lib/libva-drm.so \
# -executable=$APPDIR/usr/lib/libva-x11.so \
linuxdeployqt $APPDIR/usr/share/applications/org.kde.kdenlive.desktop \
-executable=$APPDIR/usr/bin/kdenlive \
@@ -168,8 +189,9 @@ rm $APPDIR/usr/lib/libGL.so.1 || true
rm $APPDIR/usr/lib/libasound.so.2 || true
# libxcb should be removed
rm $APPDIR/usr/lib/libxcb* || true
# libxcb and libxcb-dri{2,3} should be removed
rm $APPDIR/usr/lib/libxcb.so* || true
rm $APPDIR/usr/lib/libxcb-dri{2,3}.so* || true
rm $APPDIR/usr/lib/libgcrypt.so.20 || true
@@ -193,6 +215,7 @@ export MLT_REPOSITORY=\$DIR/usr/lib/mlt/
export MLT_DATA=\$DIR/usr/share/mlt/
export MLT_ROOT_DIR=\$DIR/usr/
export LADSPA_PATH=\$DIR/usr/lib/ladspa
export LIBVA_DRIVERS_PATH=\$DIR/usr/lib/va
export FREI0R_PATH=\$DIR/usr/lib/frei0r-1
export MLT_PROFILES_PATH=\$DIR/usr/share/mlt/profiles/
export MLT_PRESETS_PATH=\$DIR/usr/share/mlt/presets/

View File

@@ -2,7 +2,7 @@
"app-id": "org.kde.kdenlive",
"default-branch": "master",
"runtime": "org.kde.Platform",
"runtime-version": "5.13",
"runtime-version": "5.15",
"sdk": "org.kde.Sdk",
"command": "kdenlive",
"rename-icon": "kdenlive",

View File

@@ -29,7 +29,6 @@ int main(int argc, char **argv)
QApplication app(argc, argv);
QStringList args = app.arguments();
QStringList preargs;
QString locale;
if (args.count() >= 4) {
// Remove program name
args.removeFirst();
@@ -90,9 +89,9 @@ int main(int argc, char **argv)
}
const char *localename = prod.get_lcnumeric();
QLocale::setDefault(QLocale(localename));
for (const QString &frame : chunks) {
for (const QString &frame : qAsConst(chunks)) {
fprintf(stderr, "START:%d \n", frame.toInt());
QString fileName = QStringLiteral("%1.%2").arg(frame).arg(extension);
QString fileName = QStringLiteral("%1.%2").arg(frame,extension);
if (baseFolder.exists(fileName)) {
// Don't overwrite an existing file
fprintf(stderr, "DONE:%d \n", frame.toInt());
@@ -101,7 +100,7 @@ int main(int argc, char **argv)
QScopedPointer<Mlt::Producer> playlst(prod.cut(frame.toInt(), frame.toInt() + chunkSize));
QScopedPointer<Mlt::Consumer> cons(
new Mlt::Consumer(profile, QString("avformat:%1").arg(baseFolder.absoluteFilePath(fileName)).toUtf8().constData()));
for (const QString &param : consumerParams) {
for (const QString &param : qAsConst(consumerParams)) {
if (param.contains(QLatin1Char('='))) {
cons->set(param.section(QLatin1Char('='), 0, 0).toUtf8().constData(), param.section(QLatin1Char('='), 1).toUtf8().constData());
}

View File

@@ -43,10 +43,12 @@ RenderJob::RenderJob(const QString &render, const QString &scenelist, const QStr
, m_jobUiserver(nullptr)
, m_kdenliveinterface(nullptr)
, m_usekuiserver(true)
, m_logfile(scenelist.startsWith(QStringLiteral("xml:")) ? scenelist.section(QLatin1Char(':'), 1).section(QLatin1Char('?'), 0, -2) + QStringLiteral(".txt") : scenelist + QStringLiteral(".txt"))
, m_logfile(target + QStringLiteral(".log"))
, m_erase(scenelist.startsWith(QDir::tempPath()) || scenelist.startsWith(QString("xml:%2").arg(QDir::tempPath())))
, m_seconds(0)
, m_frame(0)
, m_frame(in)
, m_framein(in)
, m_frameout(out)
, m_pid(pid)
, m_dualpass(false)
{
@@ -93,9 +95,7 @@ void RenderJob::slotAbort()
m_renderProcess->kill();
if (m_kdenliveinterface) {
m_dbusargs[1] = -3;
m_dbusargs.append(QString());
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingFinished"), m_dbusargs);
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingFinished"), {m_dest, -3, QString()});
}
if (m_jobUiserver) {
m_jobUiserver->call(QStringLiteral("terminate"), QString());
@@ -115,41 +115,46 @@ void RenderJob::receivedStderr()
QString result = QString::fromLocal8Bit(m_renderProcess->readAllStandardError()).simplified();
if (!result.startsWith(QLatin1String("Current Frame"))) {
m_errorMessage.append(result + QStringLiteral("<br>"));
m_logstream << result;
} else {
m_logstream << "melt: " << result << "\n";
int pro = result.section(QLatin1Char(' '), -1).toInt();
if (pro <= m_progress || pro <= 0 || pro > 100) {
int progress = result.section(QLatin1Char(' '), -1).toInt();
int frame = result.section(QLatin1Char(','), 0, 0).section(QLatin1Char(' '), -1).toInt();
if (progress <= m_progress || progress <= 0 || progress > 100) {
return;
}
m_progress = pro;
m_progress = progress;
if (m_args.contains(QStringLiteral("pass=1"))) {
m_progress /= 2.0;
} else if (m_args.contains(QStringLiteral("pass=2"))) {
m_progress = 50 + m_progress / 2.0;
}
int frame = result.section(QLatin1Char(','), 1).section(QLatin1Char(' '), -1).toInt();
if ((m_kdenliveinterface != nullptr) && m_kdenliveinterface->isValid()) {
m_dbusargs[1] = m_progress;
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingProgress"), m_dbusargs);
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingProgress"), {m_dest, m_progress, frame});
}
qint64 elapsedTime = m_startTime.secsTo(QDateTime::currentDateTime());
if (elapsedTime == m_seconds) {
return;
}
int speed = (frame - m_frame) / (elapsedTime - m_seconds);
if (m_jobUiserver) {
m_jobUiserver->call(QStringLiteral("setPercent"), (uint)m_progress);
int seconds = m_startTime.secsTo(QTime::currentTime());
if (seconds < 0) {
// 1 day offset, add seconds in a day
seconds += 86400;
qint64 remaining = elapsedTime * (100 - progress) / progress;
int days = int(remaining / 86400);
int remainingSecs = int(remaining % 86400);
QTime when = QTime(0, 0, 0, 0).addSecs(remainingSecs);
QString est = tr("Remaining time ");
if (days > 0) {
est.append(tr("%n day(s) ", "", days));
}
seconds = (int)(seconds * (100 - m_progress) / m_progress);
if (seconds == m_seconds) {
return;
}
m_jobUiserver->call(QStringLiteral("setDescriptionField"), (uint)0, QString(),
tr("Remaining time: ") + QTime(0, 0, 0).addSecs(seconds).toString(QStringLiteral("hh:mm:ss")));
// m_jobUiserver->call(QStringLiteral("setSpeed"), (frame - m_frame) / (seconds - m_seconds));
// m_jobUiserver->call("setSpeed", (frame - m_frame) / (seconds - m_seconds));
m_frame = frame;
m_seconds = seconds;
est.append(when.toString(QStringLiteral("hh:mm:ss")));
m_jobUiserver->call(QStringLiteral("setPercent"), uint(m_progress));
m_jobUiserver->call(QStringLiteral("setDescriptionField"), 0, QString(), est);
m_jobUiserver->call(QStringLiteral("setProcessedAmount"), qulonglong(frame - m_framein), tr("frames"));
m_jobUiserver->call(QStringLiteral("setSpeed"), qulonglong(speed));
}
m_seconds = elapsedTime;
m_frame = frame;
m_logstream << QStringLiteral("%1\t%2\t%3\t%4\n").arg(m_seconds).arg(m_frame).arg(m_progress).arg(speed);
}
}
@@ -181,12 +186,13 @@ void RenderJob::start()
QString dbusView = QStringLiteral("org.kde.JobViewV2");
m_jobUiserver = new QDBusInterface(QStringLiteral("org.kde.JobViewServer"), reply, dbusView);
if ((m_jobUiserver != nullptr) && m_jobUiserver->isValid()) {
m_startTime = QTime::currentTime();
m_startTime = QDateTime::currentDateTime();
if (!m_args.contains(QStringLiteral("pass=2"))) {
m_jobUiserver->call(QStringLiteral("setPercent"), (uint)0);
}
m_jobUiserver->call(QStringLiteral("setInfoMessage"), tr("Rendering %1").arg(QFileInfo(m_dest).fileName()));
m_jobUiserver->call(QStringLiteral("setTotalAmount"), m_frameout);
QDBusConnection::sessionBus().connect(QStringLiteral("org.kde.JobViewServer"), reply, dbusView, QStringLiteral("cancelRequested"), this,
SLOT(slotAbort()));
}
@@ -205,7 +211,6 @@ void RenderJob::start()
// Because of the logging, we connect to stderr in all cases.
connect(m_renderProcess, &QProcess::readyReadStandardError, this, &RenderJob::receivedStderr);
m_renderProcess->start(m_prog, m_args);
qDebug() << "Started render process: " << m_prog << ' ' << m_args.join(QLatin1Char(' '));
m_logstream << "Started render process: " << m_prog << ' ' << m_args.join(QLatin1Char(' ')) << "\n";
m_logstream.flush();
}
@@ -227,7 +232,6 @@ void RenderJob::initKdenliveDbusInterface()
break;
}
}
m_dbusargs.clear();
if (kdenliveId.isEmpty()) {
return;
}
@@ -235,10 +239,8 @@ void RenderJob::initKdenliveDbusInterface()
new QDBusInterface(kdenliveId, QStringLiteral("/kdenlive/MainWindow_1"), QStringLiteral("org.kde.kdenlive.rendering"), connection, this);
if (m_kdenliveinterface) {
m_dbusargs.append(m_dest);
m_dbusargs.append((int)0);
if (!m_args.contains(QStringLiteral("pass=2"))) {
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingProgress"), m_dbusargs);
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingProgress"), {m_dest, 0, 0});
}
connect(m_kdenliveinterface, SIGNAL(abortRenderJob(QString)), this, SLOT(slotAbort(QString)));
}
@@ -260,9 +262,7 @@ void RenderJob::slotIsOver(QProcess::ExitStatus status, bool isWritable)
if (!isWritable) {
QString error = tr("Cannot write to %1, check permissions.").arg(m_dest);
if (m_kdenliveinterface) {
m_dbusargs[1] = (int)-2;
m_dbusargs.append(error);
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingFinished"), m_dbusargs);
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingFinished"), {m_dest, -2, error});
}
QProcess::startDetached(QStringLiteral("kdialog"), {QStringLiteral("--error"), error});
m_logstream << error << "\n";
@@ -275,21 +275,20 @@ void RenderJob::slotIsOver(QProcess::ExitStatus status, bool isWritable)
if (status == QProcess::CrashExit || m_renderProcess->error() != QProcess::UnknownError || m_renderProcess->exitCode() != 0) {
// rendering crashed
if (m_kdenliveinterface) {
m_dbusargs[1] = (int)-2;
m_dbusargs.append(m_errorMessage);
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingFinished"), m_dbusargs);
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingFinished"), {m_dest, -2, m_errorMessage});
}
QStringList args;
QString error = tr("Rendering of %1 aborted, resulting video will probably be corrupted.").arg(m_dest);
if (m_frame > 0) {
error += QLatin1Char('\n') + tr("Frame: ") + m_frame;
}
args << QStringLiteral("--error") << error;
m_logstream << error << "\n";
QProcess::startDetached(QStringLiteral("kdialog"), args);
emit renderingFinished();
} else {
if (!m_dualpass && (m_kdenliveinterface != nullptr)) {
m_dbusargs[1] = (int)-1;
m_dbusargs.append(QString());
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingFinished"), m_dbusargs);
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, QStringLiteral("setRenderingFinished"), {m_dest, -1, QString()});
}
m_logstream << "Rendering of " << m_dest << " finished" << "\n";
if (!m_dualpass && m_player.length() > 3 && m_player.contains(QLatin1Char(' '))) {

View File

@@ -23,7 +23,7 @@
#include <QDBusInterface>
#include <QObject>
#include <QProcess>
#include <QTime>
#include <QDateTime>
#include <QFile>
// Testing
#include <QTextStream>
@@ -60,13 +60,15 @@ private:
bool m_erase;
int m_seconds;
int m_frame;
int m_framein;
int m_frameout;
/** @brief The process id of the Kdenlive instance, used to get the dbus service. */
int m_pid;
bool m_dualpass;
QProcess *m_renderProcess;
QString m_errorMessage;
QList<QVariant> m_dbusargs;
QTime m_startTime;
QDateTime m_startTime;
QStringList m_args;
/** @brief Used to write to the log file. */
QTextStream m_logstream;

View File

@@ -65,7 +65,7 @@ add_subdirectory(transitions)
add_subdirectory(utils)
add_subdirectory(widgets)
add_subdirectory(xml)
if(Qt5WebKitWidgets_FOUND)
if(Qt5WebEngineWidgets_FOUND)
add_subdirectory(qt-oauth-lib)
endif()
## top_SRCS
@@ -178,12 +178,12 @@ if(KF5_PURPOSE)
target_link_libraries(kdenliveLib KF5::Purpose KF5::PurposeWidgets)
endif()
if(Qt5WebKitWidgets_FOUND)
message(STATUS "Found Qt5 WebKitWidgets. You can use your Freesound.org credentials to download files")
target_compile_definitions(kdenliveLib PRIVATE -DQT5_USE_WEBKIT)
target_link_libraries(kdenliveLib Qt5::WebKitWidgets)
if(Qt5WebEngineWidgets_FOUND)
message(STATUS "Found Qt5 WebEngineWidgets. You can use your Freesound.org credentials to download files")
target_compile_definitions(kdenliveLib PRIVATE -DQT5_USE_WEBENGINE)
target_link_libraries(kdenliveLib Qt5::WebEngineWidgets)
else()
message(STATUS "Qt5 WebKitWidgets not found. You cannot use your Freesound.org credentials, only preview files can be downloaded from the Online Resources Widget")
message(STATUS "Qt5 WebEngineWidgets not found. You cannot use your Freesound.org credentials, only preview files can be downloaded from the Online Resources Widget")
endif()
if(Q_WS_X11)

View File

@@ -49,6 +49,9 @@ public:
/* @brief Return type of asset */
AssetType getType(const QString &assetId) const;
/* @brief Return type of asset */
bool isUnique(const QString &assetId) const;
/* @brief Return name of asset */
Q_INVOKABLE QString getName(const QString &assetId) const;

View File

@@ -85,7 +85,7 @@ template <typename AssetType> void AbstractAssetsRepository<AssetType>::init()
QDir current_dir(dir);
QStringList filter {QStringLiteral("*.xml")};
QStringList fileList = current_dir.entryList(filter, QDir::Files);
for (const auto &file : fileList) {
for (const auto &file : qAsConst(fileList)) {
QString path = current_dir.absoluteFilePath(file);
parseCustomAssetFile(path, customAssets);
}
@@ -286,6 +286,14 @@ template <typename AssetType> AssetType AbstractAssetsRepository<AssetType>::get
return m_assets.at(assetId).type;
}
template <typename AssetType> bool AbstractAssetsRepository<AssetType>::isUnique(const QString &assetId) const
{
if (m_assets.count(assetId) > 0) {
return m_assets.at(assetId).xml.hasAttribute(QStringLiteral("unique"));
}
return false;
}
template <typename AssetType> QString AbstractAssetsRepository<AssetType>::getName(const QString &assetId) const
{
Q_ASSERT(m_assets.count(assetId) > 0);
@@ -326,7 +334,7 @@ template <typename AssetType> bool AbstractAssetsRepository<AssetType>::parseInf
// Update description if the xml provide one
QString description = Xml::getSubTagContent(currentAsset, QStringLiteral("description"));
if (!description.isEmpty()) {
res.description = i18n(description.toUtf8().constData()) + QString(" (%1)").arg(res.id);
res.description = i18n(description.toUtf8().constData()) + QString(" (%1)").arg(res.mltId);
}
// Update name if the xml provide one

View File

@@ -88,6 +88,7 @@ QString AssetTreeModel::getDescription(bool isEffect, const QModelIndex &index)
return QString();
}
QVariant AssetTreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) {

View File

@@ -49,6 +49,7 @@ public:
virtual void reloadAssetMenu(QMenu *effectsMenu, KActionCategory *effectActions) = 0;
virtual void setFavorite(const QModelIndex &index, bool favorite, bool isEffect) = 0;
virtual void deleteEffect(const QModelIndex &index) = 0;
virtual void editCustomAsset( const QString newName,const QString newDescription,const QModelIndex &index) = 0;
// for convenience, we store the column of each data field
static int nameCol, idCol, favCol, typeCol, preferredCol;

View File

@@ -54,7 +54,8 @@ public:
/* @brief Delete a custom effect */
void deleteCustomEffect(const QModelIndex &index);
virtual void reloadCustomEffectIx(const QModelIndex &index) = 0;
virtual void editCustomAsset(const QModelIndex &index) = 0;
/* @brief Returns the description of the asset given its model index */
QString getDescription(bool isEffect, const QModelIndex &index) const;

View File

@@ -283,9 +283,10 @@ Rectangle {
sel.setCurrentIndex(styleData.index, ItemSelectionModel.ClearAndSelect)
if (mouse.button === Qt.LeftButton) {
drag.target = parent
parent.grabToImage(function(result) {
// grabToImage does not work on QQuickWidget from AssetListWidget. We should use QQuickView + QWidget::createWindowContainer
/*parent.grabToImage(function(result) {
parent.Drag.imageSource = result.url
})
})*/
} else {
drag.target = undefined
assetContextMenu.isItemFavorite = assetThumb.isFavorite
@@ -329,6 +330,22 @@ Rectangle {
assetlist.deleteCustomEffect(sel.currentIndex)
}
}
MenuItem {
id: reloadMenu
text: i18n("Reload custom effect")
visible: isEffectList && assetContextMenu.isCustom
onTriggered: {
assetlist.reloadCustomEffectIx(sel.currentIndex)
}
}
MenuItem {
id: editMenu
text: i18n("Edit Info")
visible: isEffectList && assetContextMenu.isCustom
onTriggered: {
assetlist.editCustomEffectInfo(sel.currentIndex)
}
}
}
TableViewColumn { role: "identifier"; title: i18n("Name"); }

View File

@@ -30,6 +30,7 @@
#include "transitions/transitionsrepository.hpp"
#include "effects/effectsrepository.hpp"
#include "transitions/view/transitionstackview.hpp"
#include "transitions/view/mixstackview.hpp"
#include "view/assetparameterview.hpp"
@@ -54,6 +55,7 @@ AssetPanel::AssetPanel(QWidget *parent)
, m_assetTitle(new KSqueezedTextLabel(this))
, m_container(new QWidget(this))
, m_transitionWidget(new TransitionStackView(this))
, m_mixWidget(new MixStackView(this))
, m_effectStackWidget(new EffectStackView(this))
{
auto *buttonToolbar = new QToolBar(this);
@@ -65,10 +67,10 @@ AssetPanel::AssetPanel(QWidget *parent)
m_switchCompoButton = new QComboBox(this);
m_switchCompoButton->setFrame(false);
auto allTransitions = TransitionsRepository::get()->getNames();
for (const auto &transition : allTransitions) {
for (const auto &transition : qAsConst(allTransitions)) {
m_switchCompoButton->addItem(transition.second, transition.first);
}
connect(m_switchCompoButton, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), [&]() {
connect(m_switchCompoButton, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, [&]() {
if (m_transitionWidget->stackOwner().first == ObjectType::TimelineComposition) {
emit switchCurrentComposition(m_transitionWidget->stackOwner().second, m_switchCompoButton->currentData().toString());
}
@@ -120,6 +122,7 @@ AssetPanel::AssetPanel(QWidget *parent)
auto *lay = new QVBoxLayout(m_container);
lay->setContentsMargins(0, 0, 0, 0);
lay->addWidget(m_transitionWidget);
lay->addWidget(m_mixWidget);
lay->addWidget(m_effectStackWidget);
m_sc = new QScrollArea;
m_sc->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
@@ -135,13 +138,15 @@ AssetPanel::AssetPanel(QWidget *parent)
m_infoMessage->hide();
m_sc->setWidget(m_container);
m_transitionWidget->setVisible(false);
m_mixWidget->setVisible(false);
m_effectStackWidget->setVisible(false);
updatePalette();
connect(m_effectStackWidget, &EffectStackView::checkScrollBar, this, &AssetPanel::slotCheckWheelEventFilter);
connect(m_effectStackWidget, &EffectStackView::scrollView, this, &AssetPanel::scrollTo);
connect(m_effectStackWidget, &EffectStackView::seekToPos, this, &AssetPanel::seekToPos);
connect(m_effectStackWidget, &EffectStackView::reloadEffect, this, &AssetPanel::reloadEffect);
connect(m_transitionWidget, &TransitionStackView::seekToTransPos, this, &AssetPanel::seekToPos);
connect(m_effectStackWidget, &EffectStackView::updateEnabledState, [this]() { m_enableStackButton->setActive(m_effectStackWidget->isStackEnabled()); });
connect(m_effectStackWidget, &EffectStackView::updateEnabledState, this, [this]() { m_enableStackButton->setActive(m_effectStackWidget->isStackEnabled()); });
}
void AssetPanel::showTransition(int tid, const std::shared_ptr<AssetParameterModel> &transitionModel)
@@ -164,6 +169,28 @@ void AssetPanel::showTransition(int tid, const std::shared_ptr<AssetParameterMod
m_transitionWidget->setModel(transitionModel, QSize(), true);
}
void AssetPanel::showMix(int cid, const std::shared_ptr<AssetParameterModel> &transitionModel)
{
if (cid == -1) {
clear();
return;
}
ObjectId id = {ObjectType::TimelineMix, cid};
if (m_mixWidget->stackOwner() == id) {
// already on this effect stack, do nothing
return;
}
clear();
m_switchAction->setVisible(false);
m_titleAction->setVisible(false);
m_assetTitle->clear();
m_mixWidget->setVisible(true);
m_timelineButton->setVisible(false);
m_enableStackButton->setVisible(false);
m_mixWidget->setModel(transitionModel, QSize(), true);
}
void AssetPanel::showEffectStack(const QString &itemName, const std::shared_ptr<EffectStackModel> &effectsModel, QSize frameSize, bool showKeyframes)
{
if (effectsModel == nullptr) {
@@ -217,7 +244,7 @@ void AssetPanel::showEffectStack(const QString &itemName, const std::shared_ptr<
m_enableStackButton->setActive(effectsModel->isStackEnabled());
if (showSplit) {
m_splitButton->setEnabled(effectsModel->rowCount() > 0);
QObject::connect(effectsModel.get(), &EffectStackModel::dataChanged, [&]() {
QObject::connect(effectsModel.get(), &EffectStackModel::dataChanged, this, [&]() {
if (m_effectStackWidget->isEmpty()) {
m_splitButton->setActive(false);
}
@@ -259,11 +286,14 @@ void AssetPanel::clear()
m_switchAction->setVisible(false);
m_transitionWidget->setVisible(false);
m_transitionWidget->unsetModel();
m_mixWidget->setVisible(false);
m_mixWidget->unsetModel();
m_effectStackWidget->setVisible(false);
m_splitButton->setVisible(false);
m_timelineButton->setVisible(false);
m_switchBuiltStack->setVisible(false);
m_effectStackWidget->unsetModel();
m_assetTitle->setText(QString());
}
@@ -394,7 +424,7 @@ void AssetPanel::enableStack(bool enable)
void AssetPanel::deleteCurrentEffect()
{
if (m_effectStackWidget->isVisible()) {
m_effectStackWidget->removeCurrentEffect();
emit m_effectStackWidget->removeCurrentEffect();
}
}
@@ -405,6 +435,13 @@ void AssetPanel::collapseCurrentEffect()
}
}
void AssetPanel::scrollTo(QRect rect)
{
// Ensure the scrollview widget adapted its height to the effectstackview height change
m_sc->widget()->adjustSize();
m_sc->ensureVisible(0, rect.y(), 0, rect.height());
}
void AssetPanel::slotCheckWheelEventFilter()
{
// If the effect stack widget has no scrollbar, we will not filter the
@@ -414,7 +451,7 @@ void AssetPanel::slotCheckWheelEventFilter()
// widget has scroll bar,
blockWheel = true;
}
m_effectStackWidget->blockWheenEvent(blockWheel);
emit m_effectStackWidget->blockWheenEvent(blockWheel);
}
void AssetPanel::assetPanelWarning(const QString service, const QString /*id*/, const QString message)

View File

@@ -44,6 +44,7 @@ class AssetParameterView;
class EffectStackModel;
class EffectStackView;
class TransitionStackView;
class MixStackView;
class QLabel;
class AssetPanel : public QWidget
@@ -55,6 +56,8 @@ public:
/* @brief Shows the parameters of the given transition model */
void showTransition(int tid, const std::shared_ptr<AssetParameterModel> &transition_model);
/* @brief Shows the parameters of the given mix model */
void showMix(int cid, const std::shared_ptr<AssetParameterModel> &transitionModel);
/* @brief Shows the parameters of the given effect stack model */
void showEffectStack(const QString &itemName, const std::shared_ptr<EffectStackModel> &effectsModel, QSize frameSize, bool showKeyframes);
@@ -85,6 +88,7 @@ protected:
KSqueezedTextLabel *m_assetTitle;
QWidget *m_container;
TransitionStackView *m_transitionWidget;
MixStackView *m_mixWidget;
EffectStackView *m_effectStackWidget;
private:
@@ -104,6 +108,8 @@ private slots:
void showKeyframes(bool enable);
/** Enable / disable effect stack */
void enableStack(bool enable);
/** Scroll effects view */
void scrollTo(QRect rect);
signals:
void doSplitEffect(bool);

View File

@@ -51,9 +51,8 @@ void CornersHelper::slotUpdateFromMonitorData(const QVariantList &v)
void CornersHelper::refreshParams(int pos)
{
QVariantList points{QPointF(), QPointF(), QPointF(), QPointF()};
QList<double> coords;
QSize frameSize = pCore->getCurrentFrameSize();
for (const auto &ix : m_indexes) {
for (const auto &ix : qAsConst(m_indexes)) {
auto type = m_model->data(ix, AssetParameterModel::TypeRole).value<ParamType>();
if (type != ParamType::KeyframeParam) {
continue;

View File

@@ -236,7 +236,7 @@ bool KeyframeModel::offsetKeyframes(int oldPos, int pos, bool logUndo)
times << m.first;
}
bool res = true;
for (const auto &t : times) {
for (const auto &t : qAsConst(times)) {
res &= moveKeyframe(t, t + diff, QVariant(), undo, redo);
}
if (res && logUndo) {
@@ -298,16 +298,20 @@ bool KeyframeModel::updateKeyframe(int pos, double newVal)
{
GenTime Pos(pos, pCore->getCurrentFps());
if (auto ptr = m_model.lock()) {
double min = ptr->data(m_index, AssetParameterModel::MinRole).toDouble();
double max = ptr->data(m_index, AssetParameterModel::MaxRole).toDouble();
double min = ptr->data(m_index, AssetParameterModel::VisualMinRole).toDouble();
double max = ptr->data(m_index, AssetParameterModel::VisualMaxRole).toDouble();
if (qFuzzyIsNull(min) && qFuzzyIsNull(max)) {
min = ptr->data(m_index, AssetParameterModel::MinRole).toDouble();
max = ptr->data(m_index, AssetParameterModel::MaxRole).toDouble();
}
double factor = ptr->data(m_index, AssetParameterModel::FactorRole).toDouble();
double norm = ptr->data(m_index, AssetParameterModel::DefaultRole).toDouble();
int logRole = ptr->data(m_index, AssetParameterModel::ScaleRole).toInt();
double realValue;
if (logRole == -1) {
// Logarythmic scale for lower than norm values
// Logarythmic scale
if (newVal >= 0.5) {
realValue = norm + (2 * (newVal - 0.5) * (max / factor - norm));
realValue = norm + pow(2 * (newVal - 0.5), 10.0 / 6) * (max / factor - norm);
} else {
realValue = norm - pow(2 * (0.5 - newVal), 10.0 / 6) * (norm - min / factor);
}
@@ -454,18 +458,23 @@ QVariant KeyframeModel::data(const QModelIndex &index, int role) const
double val = it->second.second.toDouble();
if (auto ptr = m_model.lock()) {
Q_ASSERT(m_index.isValid());
double min = ptr->data(m_index, AssetParameterModel::MinRole).toDouble();
double max = ptr->data(m_index, AssetParameterModel::MaxRole).toDouble();
double min = ptr->data(m_index, AssetParameterModel::VisualMinRole).toDouble();
double max = ptr->data(m_index, AssetParameterModel::VisualMaxRole).toDouble();
if (qFuzzyIsNull(min) && qFuzzyIsNull(max)) {
min = ptr->data(m_index, AssetParameterModel::MinRole).toDouble();
max = ptr->data(m_index, AssetParameterModel::MaxRole).toDouble();
}
double factor = ptr->data(m_index, AssetParameterModel::FactorRole).toDouble();
double norm = ptr->data(m_index, AssetParameterModel::DefaultRole).toDouble();
int logRole = ptr->data(m_index, AssetParameterModel::ScaleRole).toInt();
double linear = val * factor;
if (logRole == -1) {
// Logarythmic scale for lower than norm values
if (linear >= norm) {
return 0.5 + (linear - norm) / (max * factor - norm) * 0.5;
}
// Logarythmic scale
// transform current value to 0..1 scale
if (linear >= norm) {
double scaled = (linear - norm) / (max * factor - norm);
return 0.5 + pow(scaled, 0.6) * 0.5;
}
double scaled = (linear - norm) / (min * factor - norm);
// Log scale
return 0.5 - pow(scaled, 0.6) * 0.5;
@@ -862,7 +871,6 @@ void KeyframeModel::parseRotoProperty(const QString &prop)
QJsonDocument doc = QJsonDocument::fromJson(prop.toLatin1(), &jsonError);
QVariant data = doc.toVariant();
if (data.canConvert(QVariant::Map)) {
QList<int> keyframes;
QMap<QString, QVariant> map = data.toMap();
QMap<QString, QVariant>::const_iterator i = map.constBegin();
while (i != map.constEnd()) {
@@ -890,16 +898,20 @@ QVariant KeyframeModel::updateInterpolated(const QVariant &interpValue, double v
QVariant KeyframeModel::getNormalizedValue(double newVal) const
{
if (auto ptr = m_model.lock()) {
double min = ptr->data(m_index, AssetParameterModel::MinRole).toDouble();
double max = ptr->data(m_index, AssetParameterModel::MaxRole).toDouble();
double min = ptr->data(m_index, AssetParameterModel::VisualMinRole).toDouble();
double max = ptr->data(m_index, AssetParameterModel::VisualMaxRole).toDouble();
if (qFuzzyIsNull(min) && qFuzzyIsNull(max)) {
min = ptr->data(m_index, AssetParameterModel::MinRole).toDouble();
max = ptr->data(m_index, AssetParameterModel::MaxRole).toDouble();
}
double factor = ptr->data(m_index, AssetParameterModel::FactorRole).toDouble();
double norm = ptr->data(m_index, AssetParameterModel::DefaultRole).toDouble();
int logRole = ptr->data(m_index, AssetParameterModel::ScaleRole).toInt();
double realValue;
if (logRole == -1) {
// Logarythmic scale for lower than norm values
// Logarythmic scale
if (newVal >= 0.5) {
realValue = norm + (2 * (newVal - 0.5) * (max / factor - norm));
realValue = norm + pow(2 * (newVal - 0.5), 10.0 / 6) * (max / factor - norm);
} else {
realValue = norm - pow(2 * (0.5 - newVal), 10.0 / 6) * (norm - min / factor);
}

View File

@@ -49,6 +49,22 @@ ObjectId KeyframeModelList::getOwnerId() const
return {};
}
const QString KeyframeModelList::getAssetId()
{
if (auto ptr = m_model.lock()) {
return ptr->getAssetId();
}
return {};
}
const QString KeyframeModelList::getAssetRow()
{
if (auto ptr = m_model.lock()) {
return ptr->getAssetMltId();
}
return QString();
}
void KeyframeModelList::addParameter(const QModelIndex &index)
{
std::shared_ptr<KeyframeModel> parameter(new KeyframeModel(m_model, index, m_undoStack));
@@ -363,7 +379,7 @@ void KeyframeModelList::resizeKeyframes(int oldIn, int oldOut, int in, int out,
QVariant value = param.second->getInterpolatedValue(new_in);
param.second->updateKeyframe(old_in, value, undo, redo);
}
for (auto frame : positions) {
for (auto frame : qAsConst(positions)) {
if (new_in > GenTime()) {
if (frame > new_in) {
param.second->moveKeyframe(frame, frame - new_in, QVariant(), undo, redo);
@@ -455,7 +471,7 @@ void KeyframeModelList::resizeKeyframes(int oldIn, int oldOut, int in, int out,
for (const auto &param : m_parameters) {
QVariant value = param.second->getInterpolatedValue(new_out);
param.second->addKeyframe(new_out, type, value, true, undo, redo);
for (auto frame : positions) {
for (auto frame : qAsConst(positions)) {
param.second->removeKeyframe(frame, undo, redo);
}
}

View File

@@ -135,6 +135,9 @@ public:
KeyframeModel *getKeyModel(const QPersistentModelIndex &index);
/** @brief Returns parent asset owner id*/
ObjectId getOwnerId() const;
/** @brief Returns parent asset id*/
const QString getAssetId();
const QString getAssetRow();
/** @brief Parent item size change, update keyframes*/
void resizeKeyframes(int oldIn, int oldOut, int in, int out, int offset, bool adjustFromEnd, Fun &undo, Fun &redo);

View File

@@ -60,7 +60,7 @@ void KeyframeMonitorHelper::refreshParams(int /* pos */ )
QVariantList points;
QVariantList types;
std::shared_ptr<KeyframeModelList> keyframes = m_model->getKeyframeModel();
for (const auto &ix : m_indexes) {
for (const auto &ix : qAsConst(m_indexes)) {
auto type = m_model->data(ix, AssetParameterModel::TypeRole).value<ParamType>();
if (type != ParamType::AnimatedRect) {
continue;
@@ -96,7 +96,7 @@ void KeyframeMonitorHelper::slotUpdateFromMonitorData(const QVariantList &center
qDebug() << "* * * *CENTER POINTS MISMATCH, aborting edit";
return;
}
for (const auto &ix : m_indexes) {
for (const auto &ix : qAsConst(m_indexes)) {
auto type = m_model->data(ix, AssetParameterModel::TypeRole).value<ParamType>();
if (type != ParamType::AnimatedRect) {
continue;
@@ -130,3 +130,4 @@ void KeyframeMonitorHelper::slotUpdateFromMonitorData(const QVariantList &center
break;
}
}

View File

@@ -65,14 +65,14 @@ void RotoHelper::refreshParams(int pos)
if (!keyframes->isEmpty()) {
QVariant splineData = keyframes->getInterpolatedValue(pos, m_indexes.first());
QList<BPoint> p = getPoints(splineData, pCore->getCurrentFrameSize());
for (const auto &i : p) {
for (const auto &i : qAsConst(p)) {
centerPoints << QVariant(i.p);
controlPoints << QVariant(i.h1);
controlPoints << QVariant(i.h2);
}
if (m_monitor) {
m_monitor->setUpEffectGeometry(QRect(), centerPoints, controlPoints);
}
}
if (m_monitor) {
m_monitor->setUpEffectGeometry(QRect(), centerPoints, controlPoints);
}
}

View File

@@ -25,6 +25,7 @@
#include <QMouseEvent>
#include <QApplication>
#include <QStylePainter>
#include <QtMath>
#include <KColorScheme>
#include <QFontDatabase>
@@ -112,6 +113,11 @@ void KeyframeView::slotAddKeyframe(int pos)
m_model->addKeyframe(GenTime(pos + offset, pCore->getCurrentFps()), (KeyframeType)KdenliveSettings::defaultkeyframeinterp());
}
const QString KeyframeView::getAssetId()
{
return m_model->getAssetId();
}
void KeyframeView::slotAddRemove()
{
emit activateEffect();
@@ -133,6 +139,11 @@ void KeyframeView::slotEditType(int type, const QPersistentModelIndex &index)
void KeyframeView::slotRemoveKeyframe(int pos)
{
if (m_model->singleKeyframe()) {
// Don't allow zero keyframe
pCore->displayMessage(i18n("Cannot remove the last keyframe"), MessageType::InformationMessage, 500);
return;
}
if (pos < 0) {
pos = m_position;
}
@@ -414,8 +425,8 @@ void KeyframeView::paintEvent(QPaintEvent *event)
int headOffset = m_lineHeight / 2;
int offset = pCore->getItemIn(m_model->getOwnerId());
m_zoomStart = m_zoomHandle.x() * maxWidth;
double zoomEnd = m_zoomHandle.y() * maxWidth;
m_zoomFactor = maxWidth / (zoomEnd - m_zoomStart);
m_zoomFactor = maxWidth / (m_zoomHandle.y() * maxWidth - m_zoomStart);
int zoomEnd = qCeil(m_zoomHandle.y() * maxWidth);
/* ticks */
double fps = pCore->getCurrentFps();
int displayedLength = m_duration / m_zoomFactor / fps;
@@ -470,15 +481,15 @@ void KeyframeView::paintEvent(QPaintEvent *event)
for (const auto &keyframe : *m_model.get()) {
int pos = keyframe.first.frames(fps) - offset;
if (pos < 0) continue;
double scaledPos = pos * m_scale;
if (scaledPos < m_zoomStart || qFloor(scaledPos) > zoomEnd) {
continue;
}
if (pos == m_currentKeyframe || pos == m_hoverKeyframe) {
p.setBrush(m_colSelected);
} else {
p.setBrush(m_colKeyframe);
}
double scaledPos = pos * m_scale;
if (scaledPos < m_zoomStart || scaledPos > zoomEnd) {
continue;
}
scaledPos -= m_zoomStart;
scaledPos *= m_zoomFactor;
scaledPos += m_offset;
@@ -515,7 +526,7 @@ void KeyframeView::paintEvent(QPaintEvent *event)
*/
if (m_position >= 0 && m_position < m_duration) {
double scaledPos = m_position * m_scale;
if (scaledPos >= m_zoomStart && scaledPos <= zoomEnd) {
if (scaledPos >= m_zoomStart && qFloor(scaledPos) <= zoomEnd) {
scaledPos -= m_zoomStart;
scaledPos *= m_zoomFactor;
scaledPos += m_offset;

View File

@@ -34,6 +34,7 @@ class KeyframeView : public QWidget
public:
explicit KeyframeView(std::shared_ptr<KeyframeModelList> model, int duration, QWidget *parent = nullptr);
void setDuration(int dur);
const QString getAssetId();
public slots:
/* @brief moves the current position*/

View File

@@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2017 by by Jean-Baptiste Mardelle *
* Copyright (C) 2017 by Jean-Baptiste Mardelle *
* This file is part of Kdenlive. See www.kdenlive.org. *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -87,7 +87,7 @@ AssetMultiCommand::AssetMultiCommand(const std::shared_ptr<AssetParameterModel>
} else if (TransitionsRepository::get()->exists(id)) {
setText(i18n("Edit %1", TransitionsRepository::get()->getName(id)));
}
for (QModelIndex ix : m_indexes) {
for (QModelIndex ix : qAsConst(m_indexes)) {
QVariant previousVal = m_model->data(ix, AssetParameterModel::ValueRole);
m_oldValues << previousVal.toString();
}
@@ -97,7 +97,7 @@ void AssetMultiCommand::undo()
{
int indx = 0;
int max = m_indexes.size() - 1;
for (const QModelIndex &ix : m_indexes) {
for (const QModelIndex &ix : qAsConst(m_indexes)) {
m_model->setParameter(m_model->data(ix, AssetParameterModel::NameRole).toString(), m_oldValues.at(indx), indx == max, ix);
indx++;
}
@@ -107,7 +107,7 @@ void AssetMultiCommand::redo()
{
int indx = 0;
int max = m_indexes.size() - 1;
for (const QModelIndex &ix : m_indexes) {
for (const QModelIndex &ix : qAsConst(m_indexes)) {
m_model->setParameter(m_model->data(ix, AssetParameterModel::NameRole).toString(), m_values.at(indx), m_updateView && indx == max, ix);
indx++;
}

View File

@@ -39,6 +39,7 @@ AssetParameterModel::AssetParameterModel(std::unique_ptr<Mlt::Properties> asset,
, monitorId(ownerId.first == ObjectType::BinClip ? Kdenlive::ClipMonitor : Kdenlive::ProjectMonitor)
, m_assetId(assetId)
, m_ownerId(ownerId)
, m_active(false)
, m_asset(std::move(asset))
, m_keyframes(nullptr)
{
@@ -217,14 +218,14 @@ AssetParameterModel::AssetParameterModel(std::unique_ptr<Mlt::Properties> asset,
}
qDebug() << "END parsing of " << assetId << ". Number of found parameters" << m_rows.size();
emit modelChanged();
modelChanged();
}
void AssetParameterModel::prepareKeyframes()
{
if (m_keyframes) return;
int ix = 0;
for (const auto &name : m_rows) {
for (const auto &name : qAsConst(m_rows)) {
if (m_params.at(name).type == ParamType::KeyframeParam || m_params.at(name).type == ParamType::AnimatedRect ||
m_params.at(name).type == ParamType::Roto_spline) {
addKeyframeParam(index(ix, 0));
@@ -446,6 +447,10 @@ QVariant AssetParameterModel::data(const QModelIndex &index, int role) const
return parseAttribute(m_ownerId, QStringLiteral("decimals"), element);
case OddRole:
return element.attribute(QStringLiteral("odd")) == QLatin1String("1");
case VisualMinRole:
return parseAttribute(m_ownerId, QStringLiteral("visualmin"), element);
case VisualMaxRole:
return parseAttribute(m_ownerId, QStringLiteral("visualmax"), element);
case DefaultRole:
return parseAttribute(m_ownerId, QStringLiteral("default"), element);
case FilterRole:
@@ -546,7 +551,7 @@ ParamType AssetParameterModel::paramTypeFromStr(const QString &type)
return ParamType::Switch;
} else if (type == QLatin1String("simplekeyframe")) {
return ParamType::KeyframeParam;
} else if (type == QLatin1String("animatedrect")) {
} else if (type == QLatin1String("animatedrect") || type == QLatin1String("rect")) {
return ParamType::AnimatedRect;
} else if (type == QLatin1String("geometry")) {
return ParamType::Geometry;
@@ -630,8 +635,30 @@ QVariant AssetParameterModel::parseAttribute(const ObjectId &owner, const QStrin
.replace(QLatin1String("%height"), QString::number(height))
.replace(QLatin1String("%out"), QString::number(out))
.replace(QLatin1String("%fade"), QString::number(frame_duration));
if (type == ParamType::Double || type == ParamType::Hidden) {
if (type == ParamType::AnimatedRect && attribute == QLatin1String("default")) {
if (content.contains(QLatin1Char('%'))) {
// This is a generic default like: "25% 0% 50% 100%". Parse values
QStringList numbers = content.split(QLatin1Char(' '));
content.clear();
int ix = 0;
for ( QString &val : numbers) {
if (val.endsWith(QLatin1Char('%'))) {
val.chop(1);
double n = val.toDouble()/100.;
if (ix %2 == 0) {
n *= width;
} else {
n *= height;
}
ix++;
content.append(QString("%1 ").arg(qRound(n)));
} else {
content.append(QString("%1 ").arg(val));
}
}
}
}
else if (type == ParamType::Double || type == ParamType::Hidden) {
// Use a Mlt::Properties to parse mathematical operators
Mlt::Properties p;
p.set("eval", content.prepend(QLatin1Char('@')).toLatin1().constData());
@@ -685,6 +712,21 @@ QString AssetParameterModel::getAssetId() const
return m_assetId;
}
const QString AssetParameterModel::getAssetMltId()
{
return m_asset->get("id");
}
void AssetParameterModel::setActive(bool active)
{
m_active = active;
}
bool AssetParameterModel::isActive() const
{
return m_active;
}
QVector<QPair<QString, QVariant>> AssetParameterModel::getAllParameters() const
{
QVector<QPair<QString, QVariant>> res;
@@ -775,7 +817,7 @@ void AssetParameterModel::deletePreset(const QString &presetFile, const QString
toDelete << i;
}
}
for (int i : toDelete) {
for (int i : qAsConst(toDelete)) {
array.removeAt(i);
}
} else if (loadDoc.isObject()) {
@@ -825,7 +867,7 @@ void AssetParameterModel::savePreset(const QString &presetFile, const QString &p
toDelete << i;
}
}
for (int i : toDelete) {
for (int i : qAsConst(toDelete)) {
array.removeAt(i);
}
} else if (loadDoc.isObject()) {
@@ -977,3 +1019,8 @@ void AssetParameterModel::passProperties(Mlt::Properties &target)
target.set("_profile", pCore->getCurrentProfile()->get_profile(), 0);
target.set_lcnumeric(m_asset->get_lcnumeric());
}
Mlt::Properties *AssetParameterModel::getAsset()
{
return m_asset.get();
}

View File

@@ -91,6 +91,8 @@ public:
CommentRole,
AlternateNameRole,
MinRole,
VisualMinRole,
VisualMaxRole,
MaxRole,
DefaultRole,
SuffixRole,
@@ -138,6 +140,9 @@ public:
/* @brief Returns the id of the asset represented by this object */
QString getAssetId() const;
const QString getAssetMltId();
void setActive(bool active);
bool isActive() const;
/* @brief Set the parameter with given name to the given value
*/
@@ -185,6 +190,9 @@ public:
/** @brief Returns the current value of an effect parameter */
const QString getParam(const QString &paramName);
/** @brief Returns the current asset */
Mlt::Properties *getAsset();
protected:
/* @brief Helper function to retrieve the type of a parameter given the string corresponding to it*/
@@ -215,6 +223,7 @@ protected:
QString m_assetId;
ObjectId m_ownerId;
bool m_active;
std::vector<QString> m_paramOrder; // Keep track of parameter order, important for sox
std::unordered_map<QString, ParamRow> m_params; // Store all parameters by name
std::unordered_map<QString, QVariant> m_fixedParams; // We store values of fixed parameters aside

View File

@@ -26,6 +26,7 @@
#include "assets/view/widgets/abstractparamwidget.hpp"
#include "assets/view/widgets/keyframewidget.hpp"
#include "core.h"
#include "monitor/monitor.h"
#include <QActionGroup>
#include <QDebug>
@@ -58,7 +59,7 @@ void AssetParameterView::setModel(const std::shared_ptr<AssetParameterModel> &mo
const QString paramTag = model->getAssetId();
QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QStringLiteral("/effects/presets/"));
const QString presetFile = dir.absoluteFilePath(QString("%1.json").arg(paramTag));
connect(this, &AssetParameterView::updatePresets, [this, presetFile](const QString &presetName) {
connect(this, &AssetParameterView::updatePresets, this, [this, presetFile](const QString &presetName) {
m_presetMenu->clear();
m_presetGroup.reset(new QActionGroup(this));
m_presetGroup->setExclusive(true);
@@ -73,7 +74,7 @@ void AssetParameterView::setModel(const std::shared_ptr<AssetParameterModel> &mo
updatePreset->setEnabled(false);
deletePreset->setEnabled(false);
}
for (const QString &pName : presets) {
for (const QString &pName : qAsConst(presets)) {
QAction *ac = m_presetMenu->addAction(pName, this, SLOT(slotLoadPreset()));
m_presetGroup->addAction(ac);
ac->setData(pName);
@@ -92,7 +93,7 @@ void AssetParameterView::setModel(const std::shared_ptr<AssetParameterModel> &mo
connect(w, &AbstractParamWidget::valuesChanged, this, &AssetParameterView::commitMultipleChanges);
connect(w, &AbstractParamWidget::valueChanged, this, &AssetParameterView::commitChanges);
m_lay->addWidget(w);
connect(w, &AbstractParamWidget::updateHeight, [&](int h) {
connect(w, &AbstractParamWidget::updateHeight, this, [&](int h) {
setFixedHeight(h + m_lay->contentsMargins().bottom());
emit updateHeight();
});
@@ -113,7 +114,7 @@ void AssetParameterView::setModel(const std::shared_ptr<AssetParameterModel> &mo
connect(w, &AbstractParamWidget::valueChanged, this, &AssetParameterView::commitChanges);
connect(w, &AbstractParamWidget::seekToPos, this, &AssetParameterView::seekToPos);
connect(w, &AbstractParamWidget::activateEffect, this, &AssetParameterView::activateEffect);
connect(w, &AbstractParamWidget::updateHeight, [&]() {
connect(w, &AbstractParamWidget::updateHeight, this, [&]() {
setFixedHeight(contentHeight());
emit updateHeight();
});
@@ -131,6 +132,9 @@ void AssetParameterView::setModel(const std::shared_ptr<AssetParameterModel> &mo
if (addSpacer) {
m_lay->addStretch();
}
// Ensure effect parameters are adjusted to current position
Monitor *monitor = pCore->getMonitor(m_model->monitorId);
emit monitor->seekPosition(monitor->position());
}
QVector<QPair<QString, QVariant>> AssetParameterView::getDefaultValues() const

View File

@@ -94,6 +94,9 @@ protected:
QMenu *m_presetMenu;
std::shared_ptr<QActionGroup> m_presetGroup;
private:
QVector<QPair<QString, QVariant>> getDefaultValues() const;
private slots:
/** @brief Apply a change of parameter sent by the view
@param index is the index corresponding to the modified param
@@ -102,7 +105,6 @@ private slots:
*/
void commitChanges(const QModelIndex &index, const QString &value, bool storeUndo);
void commitMultipleChanges(const QList <QModelIndex> indexes, const QStringList &values, bool storeUndo);
QVector<QPair<QString, QVariant>> getDefaultValues() const;
signals:
void seekToPos(int);

View File

@@ -41,7 +41,7 @@ BoolParamWidget::BoolParamWidget(std::shared_ptr<AssetParameterModel> model, QMo
slotRefresh();
// emit the signal of the base class when appropriate
connect(this->m_checkBox, &QCheckBox::stateChanged, [this](int state) {
connect(this->m_checkBox, &QCheckBox::stateChanged, this, [this](int state) {
emit valueChanged(m_index, QString::number(state), true); });
}

View File

@@ -56,7 +56,7 @@ ButtonParamWidget::ButtonParamWidget(std::shared_ptr<AssetParameterModel> model,
#endif
QString conditionalInfo;
for (const QVariant &jobElement : filterData) {
for (const QVariant &jobElement : qAsConst(filterData)) {
QStringList d = jobElement.toStringList();
if (d.size() == 2) {
if (d.at(0) == QLatin1String("conditionalinfo")) {
@@ -68,7 +68,7 @@ ButtonParamWidget::ButtonParamWidget(std::shared_ptr<AssetParameterModel> model,
}
QVector<QPair<QString, QVariant>> filterParams = m_model->getAllParameters();
m_displayConditional = true;
for (const auto &param : filterParams) {
for (const auto &param : qAsConst(filterParams)) {
if (param.first == m_keyParam) {
if (!param.second.toString().isEmpty()) {
m_displayConditional = false;
@@ -89,7 +89,7 @@ ButtonParamWidget::ButtonParamWidget(std::shared_ptr<AssetParameterModel> model,
setMinimumHeight(m_button->sizeHint().height() + (m_label != nullptr ? m_label->sizeHint().height() : 0));
// emit the signal of the base class when appropriate
connect(this->m_button, &QPushButton::clicked, [&, filterData, filterAddedParams, consumerParams]() {
connect(this->m_button, &QPushButton::clicked, this, [&, filterData, filterAddedParams, consumerParams]() {
// Trigger job
if (!m_displayConditional) {
QVector<QPair<QString, QVariant>> values;
@@ -123,7 +123,7 @@ ButtonParamWidget::ButtonParamWidget(std::shared_ptr<AssetParameterModel> model,
if (d.size() == 2)
fData.insert({d.at(0), d.at(1)});
}
for (const auto &param : filterLastParams) {
for (const auto &param : qAsConst(filterLastParams)) {
if (param.first != m_keyParam) {
fParams.insert({param.first, param.second});
}
@@ -133,7 +133,7 @@ ButtonParamWidget::ButtonParamWidget(std::shared_ptr<AssetParameterModel> model,
fParams.insert({fparam.section(QLatin1Char('='), 0, 0), fparam.section(QLatin1Char('='), 1)});
}
}
pCore->jobManager()->startJob<FilterClipJob>({binId}, -1, QString(), owner, m_model, assetId, in, out, assetId, fParams, fData, consumerParams);
emit pCore->jobManager()->startJob<FilterClipJob>({binId}, -1, QString(), owner, m_model, assetId, in, out, assetId, fParams, fData, consumerParams);
if (m_label) {
m_label->setVisible(false);
}
@@ -153,7 +153,7 @@ void ButtonParamWidget::slotRefresh()
{
QVector<QPair<QString, QVariant>> filterParams = m_model->getAllParameters();
m_displayConditional = true;
for (const auto &param : filterParams) {
for (const auto &param : qAsConst(filterParams)) {
if (param.first == m_keyParam && !param.second.isNull()) {
m_displayConditional = false;
break;

View File

@@ -38,7 +38,6 @@ ClickableLabelParamWidget::ClickableLabelParamWidget(std::shared_ptr<AssetParame
{
// setup the comment
m_displayName = m_model->data(m_index, Qt::DisplayRole).toString();
QString name = m_model->data(m_index, AssetParameterModel::NameRole).toString();
QString comment = m_model->data(m_index, AssetParameterModel::CommentRole).toString();
setToolTip(comment);
auto *layout = new QHBoxLayout(this);
@@ -50,12 +49,12 @@ ClickableLabelParamWidget::ClickableLabelParamWidget(std::shared_ptr<AssetParame
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(m_tb);
layout->addWidget(m_label);
connect(m_tb, &QToolButton::clicked, [&]() {
connect(m_tb, &QToolButton::clicked, this, [&]() {
QClipboard *clipboard = QApplication::clipboard();
QString value = m_model->data(m_index, AssetParameterModel::ValueRole).toString();
clipboard->setText(value);
});
connect(m_label, &QLabel::linkActivated, [&](const QString &result) {
connect(m_label, &QLabel::linkActivated, this, [&](const QString &result) {
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(result);
});

View File

@@ -218,7 +218,11 @@ QSize WheelContainer::minimumSizeHint() const
void WheelContainer::wheelEvent(QWheelEvent *event)
{
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
if (m_sliderRegion.contains(event->pos())) {
# else
if (m_sliderRegion.contains(event->position().toPoint())) {
#endif
double y = m_color.valueF();
if (event->modifiers() & Qt::ShiftModifier) {
y += event->angleDelta().y() > 0 ? 0.002 : -0.002;
@@ -519,7 +523,7 @@ ColorWheel::ColorWheel(QString id, QString name, NegQColor color, QWidget *paren
hb->setContentsMargins(0, 0, 0, 0);
lay->addLayout(hb);
m_container->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
connect(m_container, &WheelContainer::colorChange, [&] (const NegQColor &col) {
connect(m_container, &WheelContainer::colorChange, this, [&] (const NegQColor &col) {
QList <double> vals = m_container->getNiceParamValues();
m_redEdit->blockSignals(true);
m_greenEdit->blockSignals(true);
@@ -532,13 +536,13 @@ ColorWheel::ColorWheel(QString id, QString name, NegQColor color, QWidget *paren
m_blueEdit->blockSignals(false);
emit colorChange(col);
});
connect(m_redEdit, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [&]() {
connect(m_redEdit, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, [&]() {
m_container->setRedColor(m_redEdit->value());
});
connect(m_greenEdit, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [&]() {
connect(m_greenEdit, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, [&]() {
m_container->setGreenColor(m_greenEdit->value());
});
connect(m_blueEdit, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [&]() {
connect(m_blueEdit, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, [&]() {
m_container->setBlueColor(m_blueEdit->value());
});
setMinimumHeight(m_wheelName->height() + m_container->minimumHeight() + m_redEdit->height());
@@ -555,7 +559,6 @@ NegQColor ColorWheel::color() const
void ColorWheel::setColor(QList<double> values)
{
m_container->setColor(values);
QList <double> vals = m_container->getNiceParamValues();
m_redEdit->blockSignals(true);
m_greenEdit->blockSignals(true);
m_blueEdit->blockSignals(true);

View File

@@ -404,7 +404,7 @@ void KisCubicCurve::removePoint(int idx)
const QString KisCubicCurve::toString() const
{
QString sCurve;
for (const QPointF &pair : d->data->points) {
for (const QPointF &pair : qAsConst(d->data->points)) {
sCurve += QString::number(pair.x());
sCurve += QStringLiteral("/");
sCurve += QString::number(pair.y());

View File

@@ -49,7 +49,7 @@ DoubleParamWidget::DoubleParamWidget(std::shared_ptr<AssetParameterModel> model,
setMinimumHeight(m_doubleWidget->height());
// Connect signal
connect(m_doubleWidget, &DoubleWidget::valueChanged, [this](double val) { emit valueChanged(m_index, QString::number(val, 'f'), true); });
connect(m_doubleWidget, &DoubleWidget::valueChanged, this, [this](double val) { emit valueChanged(m_index, QString::number(val, 'f'), true); });
slotRefresh();
}

View File

@@ -38,7 +38,7 @@ FontParamWidget::FontParamWidget(std::shared_ptr<AssetParameterModel> model, QMo
slotRefresh();
setMinimumHeight(fontfamilywidget->sizeHint().height());
// emit the signal of the base class when appropriate
connect(this->fontfamilywidget, &QFontComboBox::currentFontChanged, [this](const QFont &font) { emit valueChanged(m_index, font.family(), true); });
connect(this->fontfamilywidget, &QFontComboBox::currentFontChanged, this, [this](const QFont &font) { emit valueChanged(m_index, font.family(), true); });
}
void FontParamWidget::slotShowComment(bool show)

View File

@@ -57,7 +57,7 @@ GeometryEditWidget::GeometryEditWidget(std::shared_ptr<AssetParameterModel> mode
setFixedHeight(m_geom->sizeHint().height());
// emit the signal of the base class when appropriate
connect(this->m_geom, &GeometryWidget::valueChanged, [this](const QString val) { emit valueChanged(m_index, val, true); });
connect(this->m_geom, &GeometryWidget::valueChanged, this, [this](const QString val) { emit valueChanged(m_index, val, true); });
setToolTip(comment);
}

View File

@@ -104,7 +104,7 @@ KeyframeImport::KeyframeImport(const QString &animData, std::shared_ptr<AssetPar
}
auto list = json.array();
int ix = 0;
for (const auto &entry : list) {
for (const auto &entry : qAsConst(list)) {
if (!entry.isObject()) {
qDebug() << "Warning : Skipping invalid marker data";
continue;
@@ -372,7 +372,6 @@ void KeyframeImport::updateDestinationRange()
m_destMin.setEnabled(true);
m_destMax.setEnabled(true);
m_limitRange->setEnabled(true);
QString tag = m_targetCombo->currentData().toString();
double min = m_model->data(m_targetCombo->currentData().toModelIndex(), AssetParameterModel::MinRole).toDouble();
double max = m_model->data(m_targetCombo->currentData().toModelIndex(), AssetParameterModel::MaxRole).toDouble();
m_destMin.setRange(min, max);
@@ -648,7 +647,7 @@ void KeyframeImport::importSelectedData()
int finalAlign = m_alignCombo->currentIndex();
QLocale locale; // Import from clipboard OK to use locale here?
locale.setNumberOptions(QLocale::OmitGroupSeparator);
for (const auto &ix : m_indexes) {
for (const auto &ix : qAsConst(m_indexes)) {
// update keyframes in other indexes
KeyframeModel *km = kfrModel->getKeyModel(ix);
qDebug()<<"== "<<ix<<" = "<<m_targetCombo->currentData().toModelIndex();

View File

@@ -52,7 +52,6 @@ KeyframeWidget::KeyframeWidget(std::shared_ptr<AssetParameterModel> model, QMode
, m_sourceFrameSize(frameSize.isValid() && !frameSize.isNull() ? frameSize : pCore->getCurrentFrameSize())
, m_baseHeight(0)
, m_addedHeight(0)
, m_effectIsSelected(false)
{
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
m_lay = new QVBoxLayout(this);
@@ -144,7 +143,7 @@ KeyframeWidget::KeyframeWidget(std::shared_ptr<AssetParameterModel> model, QMode
break;
}
connect(kfType, static_cast<void (KSelectAction::*)(QAction *)>(&KSelectAction::triggered),
[&](QAction *ac) { KdenliveSettings::setDefaultkeyframeinterp(ac->data().toInt()); });
this, [&](QAction *ac) { KdenliveSettings::setDefaultkeyframeinterp(ac->data().toInt()); });
auto *container = new QMenu(this);
container->addAction(copy);
container->addAction(paste);
@@ -163,10 +162,9 @@ KeyframeWidget::KeyframeWidget(std::shared_ptr<AssetParameterModel> model, QMode
m_lay->addWidget(m_keyframeview);
m_lay->addWidget(m_toolbar);
monitorSeek(monitor->position());
connect(m_time, &TimecodeDisplay::timeCodeEditingFinished, [&]() { slotSetPosition(-1, true); });
connect(m_keyframeview, &KeyframeView::seekToPos, [&](int p) { slotSetPosition(p, true); });
connect(m_time, &TimecodeDisplay::timeCodeEditingFinished, this, [&]() { slotSetPosition(-1, true); });
connect(m_keyframeview, &KeyframeView::seekToPos, this, [&](int p) { slotSetPosition(p, true); });
connect(m_keyframeview, &KeyframeView::atKeyframe, this, &KeyframeWidget::slotAtKeyframe);
connect(m_keyframeview, &KeyframeView::modified, this, &KeyframeWidget::slotRefreshParams);
connect(m_keyframeview, &KeyframeView::activateEffect, this, &KeyframeWidget::activateEffect);
@@ -179,10 +177,6 @@ KeyframeWidget::KeyframeWidget(std::shared_ptr<AssetParameterModel> model, QMode
m_baseHeight = m_keyframeview->height() + m_toolbar->sizeHint().height() + mrg.top() + mrg.bottom();
setFixedHeight(m_baseHeight);
addParameter(index);
connect(monitor, &Monitor::seekToNextKeyframe, m_keyframeview, &KeyframeView::slotGoToNext, Qt::UniqueConnection);
connect(monitor, &Monitor::seekToPreviousKeyframe, m_keyframeview, &KeyframeView::slotGoToPrev, Qt::UniqueConnection);
connect(monitor, &Monitor::addRemoveKeyframe, m_keyframeview, &KeyframeView::slotAddRemove, Qt::UniqueConnection);
}
KeyframeWidget::~KeyframeWidget()
@@ -199,8 +193,8 @@ void KeyframeWidget::monitorSeek(int pos)
int in = pCore->getItemPosition(m_model->getOwnerId());
int out = in + pCore->getItemDuration(m_model->getOwnerId());
bool isInRange = pos >= in && pos < out;
connectMonitor(isInRange && m_model->isActive());
m_buttonAddDelete->setEnabled(isInRange && pos > in);
connectMonitor(isInRange);
int framePos = qBound(in, pos, out) - in;
if (isInRange && framePos != m_time->getValue()) {
slotSetPosition(framePos, false);
@@ -211,7 +205,7 @@ void KeyframeWidget::slotEditKeyframeType(QAction *action)
{
int type = action->data().toInt();
m_keyframeview->slotEditType(type, m_index);
activateEffect();
emit activateEffect();
}
void KeyframeWidget::slotRefreshParams()
@@ -244,7 +238,7 @@ void KeyframeWidget::slotRefreshParams()
((GeometryWidget *)w.second)->setValue(rect, opacity);
}
}
if (m_monitorHelper && m_effectIsSelected) {
if (m_monitorHelper && m_model->isActive()) {
m_monitorHelper->refreshParams(pos);
return;
}
@@ -357,9 +351,14 @@ void KeyframeWidget::addParameter(const QPersistentModelIndex &index)
GeometryWidget *geomWidget = new GeometryWidget(pCore->getMonitor(m_model->monitorId), range, rect, opacity, m_sourceFrameSize, false,
m_model->data(m_index, AssetParameterModel::OpacityRole).toBool(), integerOpacity, this);
connect(geomWidget, &GeometryWidget::valueChanged,
[this, index](const QString v) {
activateEffect();
this, [this, index](const QString v) {
emit activateEffect();
m_keyframes->updateKeyframe(GenTime(getPosition(), pCore->getCurrentFps()), QVariant(v), index); });
connect(geomWidget, &GeometryWidget::updateMonitorGeometry, [this, index](const QRect r) {
if (m_model->isActive()) {
pCore->getMonitor(m_model->monitorId)->setUpEffectGeometry(r);
}
});
paramWidget = geomWidget;
} else if (type == ParamType::Roto_spline) {
m_monitorHelper = new RotoHelper(pCore->getMonitor(m_model->monitorId), m_model, index, this);
@@ -391,8 +390,8 @@ void KeyframeWidget::addParameter(const QPersistentModelIndex &index)
factor = qFuzzyIsNull(factor) ? 1 : factor;
auto doubleWidget = new DoubleWidget(name, value, min, max, factor, defaultValue, comment, -1, suffix, decimals, m_model->data(index, AssetParameterModel::OddRole).toBool(), this);
connect(doubleWidget, &DoubleWidget::valueChanged,
[this, index](double v) {
activateEffect();
this, [this, index](double v) {
emit activateEffect();
m_keyframes->updateKeyframe(GenTime(getPosition(), pCore->getCurrentFps()), QVariant(v), index);
});
paramWidget = doubleWidget;
@@ -408,7 +407,6 @@ void KeyframeWidget::addParameter(const QPersistentModelIndex &index)
void KeyframeWidget::slotInitMonitor(bool active)
{
Monitor *monitor = pCore->getMonitor(m_model->monitorId);
m_effectIsSelected = active;
if (m_keyframeview) {
m_keyframeview->initKeyframePos();
connect(monitor, &Monitor::updateScene, m_keyframeview, &KeyframeView::slotModelChanged, Qt::UniqueConnection);
@@ -419,10 +417,20 @@ void KeyframeWidget::slotInitMonitor(bool active)
void KeyframeWidget::connectMonitor(bool active)
{
if (m_monitorHelper) {
if (m_monitorHelper->connectMonitor(active) && m_effectIsSelected) {
if (m_monitorHelper->connectMonitor(active) && m_model->isActive()) {
slotRefreshParams();
}
}
Monitor *monitor = pCore->getMonitor(m_model->monitorId);
if (active) {
connect(monitor, &Monitor::seekToNextKeyframe, m_keyframeview, &KeyframeView::slotGoToNext, Qt::UniqueConnection);
connect(monitor, &Monitor::seekToPreviousKeyframe, m_keyframeview, &KeyframeView::slotGoToPrev, Qt::UniqueConnection);
connect(monitor, &Monitor::addRemoveKeyframe, m_keyframeview, &KeyframeView::slotAddRemove, Qt::UniqueConnection);
} else {
disconnect(monitor, &Monitor::seekToNextKeyframe, m_keyframeview, &KeyframeView::slotGoToNext);
disconnect(monitor, &Monitor::seekToPreviousKeyframe, m_keyframeview, &KeyframeView::slotGoToPrev);
disconnect(monitor, &Monitor::addRemoveKeyframe, m_keyframeview, &KeyframeView::slotAddRemove);
}
for (const auto &w : m_parameters) {
auto type = m_model->data(w.first, AssetParameterModel::TypeRole).value<ParamType>();
if (type == ParamType::AnimatedRect) {
@@ -434,7 +442,7 @@ void KeyframeWidget::connectMonitor(bool active)
void KeyframeWidget::slotUpdateKeyframesFromMonitor(const QPersistentModelIndex &index, const QVariant &res)
{
activateEffect();
emit activateEffect();
if (m_keyframes->isEmpty()) {
GenTime pos(pCore->getItemIn(m_model->getOwnerId()) + m_time->getValue(), pCore->getCurrentFps());
if (m_time->getValue() > 0) {
@@ -446,6 +454,9 @@ void KeyframeWidget::slotUpdateKeyframesFromMonitor(const QPersistentModelIndex
m_keyframes->updateKeyframe(pos, res, index);
} else if (m_keyframes->hasKeyframe(getPosition()) || m_keyframes->singleKeyframe()) {
GenTime pos(getPosition(), pCore->getCurrentFps());
if (m_keyframes->singleKeyframe() && KdenliveSettings::autoKeyframe() && m_neededScene == MonitorSceneType::MonitorSceneRoto) {
m_keyframes->addKeyframe(pos, KeyframeType::Linear);
}
m_keyframes->updateKeyframe(pos, res, index);
}
}

View File

@@ -100,7 +100,6 @@ private:
std::unordered_map<QPersistentModelIndex, QWidget *> m_parameters;
int m_baseHeight;
int m_addedHeight;
bool m_effectIsSelected;
signals:
void addIndex(QPersistentModelIndex ix);

View File

@@ -28,7 +28,6 @@ KeywordParamWidget::KeywordParamWidget(std::shared_ptr<AssetParameterModel> mode
setupUi(this);
// setup the comment
QString name = m_model->data(m_index, AssetParameterModel::NameRole).toString();
QString comment = m_model->data(m_index, AssetParameterModel::CommentRole).toString();
setToolTip(comment);
@@ -39,7 +38,7 @@ KeywordParamWidget::KeywordParamWidget(std::shared_ptr<AssetParameterModel> mode
QStringList kwrdNames = m_model->data(m_index, AssetParameterModel::ListNamesRole).toStringList();
comboboxwidget->addItems(kwrdNames);
int i = 0;
for (const QString &keywordVal : kwrdValues) {
for (const QString &keywordVal : qAsConst(kwrdValues)) {
if (i >= comboboxwidget->count()) {
break;
}
@@ -53,11 +52,11 @@ KeywordParamWidget::KeywordParamWidget(std::shared_ptr<AssetParameterModel> mode
setMinimumHeight(comboboxwidget->sizeHint().height());
// emit the signal of the base class when appropriate
connect(lineeditwidget, &QLineEdit::editingFinished, [this]() {
connect(lineeditwidget, &QLineEdit::editingFinished, this, [this]() {
emit valueChanged(m_index, lineeditwidget->text(), true);
});
connect(comboboxwidget, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
[this](int ix) {
this, [this](int ix) {
if (ix > 0) {
QString comboval = comboboxwidget->itemData(ix).toString();
this->lineeditwidget->insert(comboval);

View File

@@ -30,7 +30,6 @@ ListParamWidget::ListParamWidget(std::shared_ptr<AssetParameterModel> model, QMo
setupUi(this);
// Get data from model
QString name = m_model->data(m_index, AssetParameterModel::NameRole).toString();
QString comment = m_model->data(m_index, AssetParameterModel::CommentRole).toString();
// setup the comment
@@ -47,7 +46,7 @@ ListParamWidget::ListParamWidget(std::shared_ptr<AssetParameterModel> model, QMo
// emit the signal of the base class when appropriate
// The connection is ugly because the signal "currentIndexChanged" is overloaded in QComboBox
connect(this->m_list, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
[this](int) {
this, [this](int) {
emit valueChanged(m_index, m_list->itemData(m_list->currentIndex()).toString(), true);
});
}

View File

@@ -51,7 +51,7 @@ PositionEditWidget::PositionEditWidget(std::shared_ptr<AssetParameterModel> mode
connect(m_slider, &QAbstractSlider::valueChanged, this, &PositionEditWidget::valueChanged);
// emit the signal of the base class when appropriate
connect(this->m_slider, &QAbstractSlider::valueChanged, [this](int val) {
connect(this->m_slider, &QAbstractSlider::valueChanged, this, [this](int val) {
if (m_inverted) {
val = m_model->data(m_index, AssetParameterModel::ParentInRole).toInt() + m_model->data(m_index, AssetParameterModel::ParentDurationRole).toInt() - 1 -
val;

View File

@@ -25,7 +25,6 @@ SlideWidget::SlideWidget(std::shared_ptr<AssetParameterModel> model, QModelIndex
{
// setup the comment
setupUi(this);
QString name = m_model->data(m_index, AssetParameterModel::NameRole).toString();
QString comment = m_model->data(m_index, AssetParameterModel::CommentRole).toString();
slotRefresh();

View File

@@ -28,7 +28,6 @@ SwitchParamWidget::SwitchParamWidget(std::shared_ptr<AssetParameterModel> model,
setupUi(this);
// setup the comment
QString name = m_model->data(m_index, AssetParameterModel::NameRole).toString();
QString comment = m_model->data(m_index, AssetParameterModel::CommentRole).toString();
setToolTip(comment);
m_labelComment->setText(comment);
@@ -42,7 +41,7 @@ SwitchParamWidget::SwitchParamWidget(std::shared_ptr<AssetParameterModel> model,
slotRefresh();
// emit the signal of the base class when appropriate
connect(this->m_checkBox, &QCheckBox::stateChanged, [this](int state) {
connect(this->m_checkBox, &QCheckBox::stateChanged, this, [this](int state) {
emit valueChanged(m_index,
(state == Qt::Checked ? m_model->data(m_index, AssetParameterModel::MaxRole).toString()
: m_model->data(m_index, AssetParameterModel::MinRole).toString()),

View File

@@ -30,7 +30,6 @@ UrlParamWidget::UrlParamWidget(std::shared_ptr<AssetParameterModel> model, QMode
setupUi(this);
// setup the comment
QString name = m_model->data(m_index, AssetParameterModel::NameRole).toString();
QString comment = m_model->data(m_index, AssetParameterModel::CommentRole).toString();
labelComment->setText(comment);
setToolTip(comment);
@@ -49,7 +48,7 @@ UrlParamWidget::UrlParamWidget(std::shared_ptr<AssetParameterModel> model, QMode
slotRefresh();
// emit the signal of the base class when appropriate
connect(this->urlwidget, &KUrlRequester::textChanged, [this]() {
connect(this->urlwidget, &KUrlRequester::textChanged, this, [this]() {
QFileInfo info(urlwidget->url().toLocalFile());
if (info.exists() && info.isFile()) {
emit valueChanged(m_index, this->urlwidget->url().toLocalFile(), true);

View File

@@ -74,7 +74,7 @@ void MixerManager::registerTrack(int tid, std::shared_ptr<Mlt::Tractor> service,
return;
}
std::shared_ptr<MixerWidget> mixer(new MixerWidget(tid, service, trackTag, this));
connect(mixer.get(), &MixerWidget::muteTrack, [&](int id, bool mute) {
connect(mixer.get(), &MixerWidget::muteTrack, this, [&](int id, bool mute) {
m_model->setTrackProperty(id, "hide", mute ? QStringLiteral("1") : QStringLiteral("3"));
});
if (m_visibleMixerManager) {
@@ -82,10 +82,10 @@ void MixerManager::registerTrack(int tid, std::shared_ptr<Mlt::Tractor> service,
}
connect(this, &MixerManager::updateLevels, mixer.get(), &MixerWidget::updateAudioLevel);
connect(this, &MixerManager::clearMixers, mixer.get(), &MixerWidget::clear);
connect(mixer.get(), &MixerWidget::toggleSolo, [&](int trid, bool solo) {
connect(mixer.get(), &MixerWidget::toggleSolo, this, [&](int trid, bool solo) {
if (!solo) {
// unmute
for (int id : m_soloMuted) {
for (int id : qAsConst(m_soloMuted)) {
if (m_mixers.count(id) > 0) {
m_model->setTrackProperty(id, "hide", QStringLiteral("1"));
}
@@ -94,14 +94,14 @@ void MixerManager::registerTrack(int tid, std::shared_ptr<Mlt::Tractor> service,
} else {
if (!m_soloMuted.isEmpty()) {
// Another track was solo, discard first
for (int id : m_soloMuted) {
for (int id : qAsConst(m_soloMuted)) {
if (m_mixers.count(id) > 0) {
m_model->setTrackProperty(id, "hide", QStringLiteral("1"));
}
}
m_soloMuted.clear();
}
for (auto item : m_mixers) {
for (const auto &item : m_mixers) {
if (item.first != trid && !item.second->isMute()) {
m_model->setTrackProperty(item.first, "hide", QStringLiteral("3"));
m_soloMuted << item.first;
@@ -145,7 +145,7 @@ void MixerManager::setModel(std::shared_ptr<TimelineItemModel> model)
{
// Insert master mixer
m_model = model;
connect(m_model.get(), &TimelineItemModel::dataChanged, [&](const QModelIndex &topLeft, const QModelIndex &, const QVector<int> &roles) {
connect(m_model.get(), &TimelineItemModel::dataChanged, this, [&](const QModelIndex &topLeft, const QModelIndex &, const QVector<int> &roles) {
if (roles.contains(TimelineModel::IsDisabledRole)) {
int id = (int) topLeft.internalId();
if (m_mixers.count(id) > 0) {
@@ -162,7 +162,7 @@ void MixerManager::setModel(std::shared_ptr<TimelineItemModel> model)
m_masterBox->removeWidget(m_masterMixer.get());
}
m_masterMixer.reset(new MixerWidget(-1, service, i18n("Master"), this));
connect(m_masterMixer.get(), &MixerWidget::muteTrack, [&](int /*id*/, bool mute) {
connect(m_masterMixer.get(), &MixerWidget::muteTrack, this, [&](int /*id*/, bool mute) {
m_model->tractor()->set("hide", mute ? 3 : 1);
});
if (m_visibleMixerManager) {
@@ -186,7 +186,7 @@ void MixerManager::recordStateChanged(int tid, bool recording)
void MixerManager::connectMixer(bool doConnect)
{
m_visibleMixerManager = doConnect;
for (auto item : m_mixers) {
for (const auto &item : m_mixers) {
item.second->connectMixer(m_visibleMixerManager && !KdenliveSettings::mixerCollapse());
}
if (m_masterMixer != nullptr) {
@@ -226,7 +226,7 @@ QSize MixerManager::sizeHint() const
void MixerManager::pauseMonitoring(bool pause)
{
for (auto item : m_mixers) {
for (const auto &item : m_mixers) {
item.second->pauseMonitoring(pause);
}
if (m_masterMixer != nullptr) {

View File

@@ -107,6 +107,7 @@ MixerWidget::MixerWidget(int tid, std::shared_ptr<Mlt::Tractor> service, const Q
, m_monitorFilter(nullptr)
, m_balanceFilter(nullptr)
, m_channels(pCore->audioChannels())
, m_balanceSlider(nullptr)
, m_maxLevels(qMax(30, (int)(service->get_fps() * 1.5)))
, m_solo(nullptr)
, m_record(nullptr)
@@ -126,6 +127,7 @@ MixerWidget::MixerWidget(int tid, Mlt::Tractor *service, const QString &trackTag
, m_monitorFilter(nullptr)
, m_balanceFilter(nullptr)
, m_channels(pCore->audioChannels())
, m_balanceSlider(nullptr)
, m_maxLevels(qMax(30, (int)(service->get_fps() * 1.5)))
, m_solo(nullptr)
, m_record(nullptr)
@@ -165,27 +167,31 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
m_volumeSpin->setSuffix(i18n("dB"));
m_volumeSpin->setFrame(false);
connect(m_volumeSpin, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [&](double val) {
connect(m_volumeSpin, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, [&](double val) {
m_volumeSlider->setValue(fromDB(val));
});
m_balanceSlider = new QSlider(Qt::Horizontal,this);
m_balanceSlider->setRange(-50, 50);
m_balanceSlider->setValue(0);
m_balanceSlider->setTickPosition(QSlider::TicksBelow);
m_balanceSlider->setTickInterval(50);
m_balanceSlider->setToolTip(i18n("Balance"));
QLabel *labelLeft = nullptr;
QLabel *labelRight = nullptr;
if (m_channels == 2) {
m_balanceSlider = new QSlider(Qt::Horizontal,this);
m_balanceSlider->setRange(-50, 50);
m_balanceSlider->setValue(0);
m_balanceSlider->setTickPosition(QSlider::TicksBelow);
m_balanceSlider->setTickInterval(50);
m_balanceSlider->setToolTip(i18n("Balance"));
QLabel *labelLeft = new QLabel(i18n("L"), this);
labelLeft->setAlignment(Qt::AlignHCenter);
QLabel *labelRight = new QLabel(i18n("R"), this);
labelLeft->setAlignment(Qt::AlignHCenter);
labelLeft = new QLabel(i18nc("Left", "L"), this);
labelLeft->setAlignment(Qt::AlignHCenter);
labelRight = new QLabel(i18nc("Right", "R"), this);
labelRight->setAlignment(Qt::AlignHCenter);
m_balanceSpin = new QSpinBox(this);
m_balanceSpin->setRange(-50, 50);
m_balanceSpin->setValue(0);
m_balanceSpin->setFrame(false);
m_balanceSpin->setToolTip(i18n("Balance"));
m_balanceSpin = new QSpinBox(this);
m_balanceSpin->setRange(-50, 50);
m_balanceSpin->setValue(0);
m_balanceSpin->setFrame(false);
m_balanceSpin->setToolTip(i18n("Balance"));
}
// Check if we already have build-in filters for this tractor
int max = service->filter_count();
@@ -203,7 +209,7 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
double volume = m_levelFilter->get_double("level");
m_volumeSpin->setValue(volume);
m_volumeSlider->setValue(fromDB(volume));
} else if (filterService == QLatin1String("panner")) {
} else if (m_channels == 2 && filterService == QLatin1String("panner")) {
m_balanceFilter = fl;
int val = m_balanceFilter->get_double("start") * 100 - 50;
m_balanceSpin->setValue(val);
@@ -219,7 +225,7 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
service->attach(*m_levelFilter.get());
}
}
if (m_balanceFilter == nullptr) {
if (m_balanceFilter == nullptr && m_channels == 2) {
m_balanceFilter.reset(new Mlt::Filter(service->get_profile(), "panner"));
if (m_balanceFilter->is_valid()) {
m_balanceFilter->set("internal_added", 237);
@@ -245,9 +251,11 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
m_muteAction->setActiveIcon(QIcon::fromTheme(QStringLiteral("kdenlive-hide-audio")));
m_muteAction->setInactiveIcon(QIcon::fromTheme(QStringLiteral("kdenlive-show-audio")));
connect(m_balanceSlider, &QSlider::valueChanged, m_balanceSpin, &QSpinBox::setValue);
if (m_balanceSlider) {
connect(m_balanceSlider, &QSlider::valueChanged, m_balanceSpin, &QSpinBox::setValue);
}
connect(m_muteAction, &KDualAction::activeChangedByUser, [&](bool active) {
connect(m_muteAction, &KDualAction::activeChangedByUser, this, [&](bool active) {
if (m_tid == -1) {
// Muting master, special case
if (m_levelFilter) {
@@ -271,7 +279,6 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
mute->setAutoRaise(true);
// Setup default width
QFontMetrics fm(font());
setFixedWidth(3 * mute->sizeHint().width());
if (m_tid > -1) {
@@ -281,7 +288,7 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
m_solo->setIcon(QIcon::fromTheme("headphones"));
m_solo->setToolTip(i18n("Solo mode"));
m_solo->setAutoRaise(true);
connect(m_solo, &QToolButton::toggled, [&](bool toggled) {
connect(m_solo, &QToolButton::toggled, this, [&](bool toggled) {
emit toggleSolo(m_tid, toggled);
updateLabel();
});
@@ -290,8 +297,8 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
m_record->setToolTip(i18n("Record"));
m_record->setCheckable(true);
m_record->setAutoRaise(true);
connect(m_record, &QToolButton::clicked, [&]() {
m_manager->recordAudio(m_tid);
connect(m_record, &QToolButton::clicked, this, [&]() {
emit m_manager->recordAudio(m_tid);
});
} else {
m_collapse = new QToolButton(this);
@@ -300,7 +307,7 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
m_collapse->setCheckable(true);
m_collapse->setAutoRaise(true);
m_collapse->setChecked(KdenliveSettings::mixerCollapse() );
connect(m_collapse, &QToolButton::clicked, [&]() {
connect(m_collapse, &QToolButton::clicked, this, [&]() {
KdenliveSettings::setMixerCollapse(m_collapse->isChecked());
m_collapse->setIcon(m_collapse->isChecked() ? QIcon::fromTheme("arrow-left") : QIcon::fromTheme("arrow-right"));
m_manager->collapseMixers();
@@ -309,6 +316,7 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
QToolButton *showEffects = new QToolButton(this);
showEffects->setIcon(QIcon::fromTheme("autocorrection"));
showEffects->setToolTip(i18n("Open Effect Stack"));
showEffects->setAutoRaise(true);
connect(showEffects, &QToolButton::clicked, this, [&]() {
emit m_manager->showEffectStack(m_tid);
@@ -319,7 +327,7 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
if (m_recording) {
m_volumeSpin->setValue(value);
KdenliveSettings::setAudiocapturevolume(value);
m_manager->updateRecVolume();
emit m_manager->updateRecVolume();
//TODO update capture volume
} else if (m_levelFilter != nullptr) {
double dbValue = 0;
@@ -333,21 +341,23 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
m_levelFilter->set("level", dbValue);
m_levelFilter->set("disable", value == 60 ? 1 : 0);
m_levels.clear();
m_manager->purgeCache();
pCore->setDocumentModified();
}
});
connect(m_balanceSpin, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, [&](int value) {
QSignalBlocker bk(m_balanceSlider);
m_balanceSlider->setValue(value);
if (m_balanceFilter != nullptr) {
m_balanceFilter->set("start", (value + 50) / 100.);
m_balanceFilter->set("disable", value == 0 ? 1 : 0);
m_levels.clear();
m_manager->purgeCache();
emit m_manager->purgeCache();
pCore->setDocumentModified();
}
});
if (m_balanceSlider) {
connect(m_balanceSpin, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, [&](int value) {
QSignalBlocker bk(m_balanceSlider);
m_balanceSlider->setValue(value);
if (m_balanceFilter != nullptr) {
m_balanceFilter->set("start", (value + 50) / 100.);
m_balanceFilter->set("disable", value == 0 ? 1 : 0);
m_levels.clear();
emit m_manager->purgeCache();
pCore->setDocumentModified();
}
});
}
QVBoxLayout *lay = new QVBoxLayout;
setContentsMargins(0, 0, 0, 0);
lay->setContentsMargins(0, 0, 0, 0);
@@ -367,12 +377,14 @@ void MixerWidget::buildUI(Mlt::Tractor *service, const QString &trackTag)
}
buttonslay->addWidget(showEffects);
lay->addLayout(buttonslay);
QGridLayout *balancelay = new QGridLayout;
balancelay->addWidget(m_balanceSlider, 0, 0, 1, 3);
balancelay->addWidget(labelLeft, 1, 0, 1, 1);
balancelay->addWidget(m_balanceSpin, 1, 1, 1, 1);
balancelay->addWidget(labelRight, 1, 2, 1, 1);
lay->addLayout(balancelay);
if (m_balanceSlider) {
QGridLayout *balancelay = new QGridLayout;
balancelay->addWidget(m_balanceSlider, 0, 0, 1, 3);
balancelay->addWidget(labelLeft, 1, 0, 1, 1);
balancelay->addWidget(m_balanceSpin, 1, 1, 1, 1);
balancelay->addWidget(labelRight, 1, 2, 1, 1);
lay->addLayout(balancelay);
}
QHBoxLayout *hlay = new QHBoxLayout;
hlay->addWidget(m_audioMeterWidget.get());
hlay->addWidget(m_volumeSlider);
@@ -418,7 +430,7 @@ void MixerWidget::updateLabel()
m_trackLabel->setPalette(pal);
} else if (m_muteAction->isActive()) {
QPalette pal = m_trackLabel->palette();
pal.setColor(QPalette::Window, QColor("#ff8c00"));
pal.setColor(QPalette::Window, QColor(0xff8c00));
m_trackLabel->setPalette(pal);
} else if (m_solo && m_solo->isChecked()) {
QPalette pal = m_trackLabel->palette();

Some files were not shown because too many files have changed in this diff Show More