Compare commits
317 Commits
v20.08.2
...
work/qtweb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
173ce96285 | ||
|
|
ddae45aebb | ||
|
|
94303d6531 | ||
|
|
136ad56966 | ||
|
|
15045192d5 | ||
|
|
31a9b0424e | ||
|
|
a1fd4d7330 | ||
|
|
9de5447253 | ||
|
|
daf3ee8c4a | ||
|
|
bc69822889 | ||
|
|
f6c87416c4 | ||
|
|
d84dacb54f | ||
|
|
735bf84b17 | ||
|
|
8f43cbb7c7 | ||
|
|
5dae30174d | ||
|
|
93a40647ad | ||
|
|
0748c3c4a3 | ||
|
|
0e57fe1e8f | ||
|
|
c92da2590d | ||
|
|
970df3918a | ||
|
|
708592573f | ||
|
|
791e2d060b | ||
|
|
3af486f289 | ||
|
|
d8f08ed37c | ||
|
|
20311cb59d | ||
|
|
65cba8aa09 | ||
|
|
2f9edda61c | ||
|
|
f8cd54b2e4 | ||
|
|
9c9c327bdb | ||
|
|
a12ba6dfa4 | ||
|
|
9b615fca5e | ||
|
|
453cf95a62 | ||
|
|
978b4225ae | ||
|
|
9e077005c7 | ||
|
|
c18bf45a70 | ||
|
|
76b9492d05 | ||
|
|
356cb41704 | ||
|
|
b65689cb15 | ||
|
|
8e3163b260 | ||
|
|
ed5e0ed3dc | ||
|
|
3986e1b48e | ||
|
|
aaa02ac8d0 | ||
|
|
b748efa0e4 | ||
|
|
7b1d44c411 | ||
|
|
71c7f6c11f | ||
|
|
a7c7e98db0 | ||
|
|
d143ef0a11 | ||
|
|
97503c9b4f | ||
|
|
9da3b3d18d | ||
|
|
5bfa3af4db | ||
|
|
273c0b34bf | ||
|
|
a1909bd3f6 | ||
|
|
1463649578 | ||
|
|
695c6b3bff | ||
|
|
ec97c5646b | ||
|
|
33758be44b | ||
|
|
d9c7dcb55f | ||
|
|
5cc52f5126 | ||
|
|
d8c42f4aec | ||
|
|
ab00a0414e | ||
|
|
c8b8909a5a | ||
|
|
4a3a55e83b | ||
|
|
0547233f23 | ||
|
|
eeada05539 | ||
|
|
70223d6626 | ||
|
|
76d87f66b2 | ||
|
|
68e2dcfb7e | ||
|
|
9c9672d541 | ||
|
|
18d09e2f26 | ||
|
|
b4895a069e | ||
|
|
3b9595bd99 | ||
|
|
b7ab436a3c | ||
|
|
7cf1ac94dc | ||
|
|
4403ee204e | ||
|
|
c9fda75cfc | ||
|
|
f4f92defbe | ||
|
|
a10b527701 | ||
|
|
f11aae7d69 | ||
|
|
fa18eb5fc1 | ||
|
|
b5c0883123 | ||
|
|
9ee0157aeb | ||
|
|
513534e28b | ||
|
|
47982916a7 | ||
|
|
946c9e912f | ||
|
|
5ce4e575f6 | ||
|
|
c75ac2a8d2 | ||
|
|
03743f32d7 | ||
|
|
7b17322c07 | ||
|
|
c396a58e44 | ||
|
|
95585239b6 | ||
|
|
a8279d49c1 | ||
|
|
e50ed4e1e4 | ||
|
|
fc586019f4 | ||
|
|
e2dd30d50e | ||
|
|
4e7f7498d5 | ||
|
|
ec6bd612b3 | ||
|
|
8ccda514d6 | ||
|
|
4f51bc3e2b | ||
|
|
a155503246 | ||
|
|
7df43a547f | ||
|
|
ac7fc97372 | ||
|
|
2ab1fcb014 | ||
|
|
6ec0e30868 | ||
|
|
86266b4ae2 | ||
|
|
6412954786 | ||
|
|
4e0e85dbf9 | ||
|
|
097b3ad60f | ||
|
|
bb3b42654b | ||
|
|
508a4b7760 | ||
|
|
4d93def3c5 | ||
|
|
d10c66c5db | ||
|
|
45c4e5e6a8 | ||
|
|
f8af6b85f1 | ||
|
|
25ba5eaa1b | ||
|
|
568cf02fcb | ||
|
|
e053e1d0b8 | ||
|
|
ab2691e8f6 | ||
|
|
eadb5bb1fe | ||
|
|
6b93a37431 | ||
|
|
838bf7a622 | ||
|
|
1b9e07254a | ||
|
|
3770fe8063 | ||
|
|
5b84846013 | ||
|
|
3d8eac623d | ||
|
|
12ba744532 | ||
|
|
41e8726071 | ||
|
|
9a94ca4e7d | ||
|
|
0df40f210d | ||
|
|
88980a0641 | ||
|
|
d9dc98a9f5 | ||
|
|
a6ea3608f3 | ||
|
|
42d2c4320d | ||
|
|
9c40769bc9 | ||
|
|
a81e510b72 | ||
|
|
042ce94bf7 | ||
|
|
ba76788bf7 | ||
|
|
af0bd4f7e1 | ||
|
|
58fd31a5e2 | ||
|
|
18fae08380 | ||
|
|
5d6e7e810d | ||
|
|
45fbb03cb4 | ||
|
|
51275f6cff | ||
|
|
ae7a2b56ba | ||
|
|
be57dcdab4 | ||
|
|
37ddf5edb4 | ||
|
|
640664e2a2 | ||
|
|
13120af540 | ||
|
|
1432dd62d1 | ||
|
|
dbd4ae024f | ||
|
|
378c4c72fe | ||
|
|
b1df9fd348 | ||
|
|
73503106e4 | ||
|
|
12467f19d9 | ||
|
|
565a6c1cbd | ||
|
|
a3fe8a8eaa | ||
|
|
704c16118f | ||
|
|
dff5f70938 | ||
|
|
663fcc92e5 | ||
|
|
02e8c3edc4 | ||
|
|
f2bf7f16af | ||
|
|
0430805f0a | ||
|
|
1d5899fb39 | ||
|
|
d7c68402f1 | ||
|
|
0f144df5e3 | ||
|
|
c69bc854ec | ||
|
|
827c2a6e62 | ||
|
|
5c0f642aa8 | ||
|
|
4f81b7514a | ||
|
|
7f3f3365f5 | ||
|
|
0aa315c21e | ||
|
|
62c5aa6b0e | ||
|
|
7e8a90aea0 | ||
|
|
40085a0463 | ||
|
|
8a08988797 | ||
|
|
9705c94332 | ||
|
|
99db241c7f | ||
|
|
c3155b94e7 | ||
|
|
a976d33fc9 | ||
|
|
153688e196 | ||
|
|
a3bc1439ab | ||
|
|
0378f6d146 | ||
|
|
1e3707f129 | ||
|
|
f049619c47 | ||
|
|
8991e0ee1b | ||
|
|
38a21d0e3f | ||
|
|
bc9de7c403 | ||
|
|
3c0a8db4ac | ||
|
|
baa3c0de78 | ||
|
|
f371478aeb | ||
|
|
fc5f133ac4 | ||
|
|
ee8fb1c29c | ||
|
|
e98818026b | ||
|
|
0ca2d507bf | ||
|
|
5d1a81b627 | ||
|
|
47fcbb2a96 | ||
|
|
d06ec3cd0f | ||
|
|
2ea5bdcde3 | ||
|
|
c008bf1a74 | ||
|
|
2faff23e99 | ||
|
|
7620569d47 | ||
|
|
f33a8cb451 | ||
|
|
e8510ee16e | ||
|
|
df125d294b | ||
|
|
665bfe92e5 | ||
|
|
5e00c87cec | ||
|
|
4912477068 | ||
|
|
a76b042226 | ||
|
|
4ec4cedbe2 | ||
|
|
571f59e1ec | ||
|
|
406c56ccbd | ||
|
|
24f6b42d31 | ||
|
|
305a67853f | ||
|
|
2dac8e6440 | ||
|
|
4de7f1e455 | ||
|
|
6660206349 | ||
|
|
e29668a248 | ||
|
|
75e57704e0 | ||
|
|
45cbc45593 | ||
|
|
e7e73f9dfe | ||
|
|
a610f581cc | ||
|
|
865042c81d | ||
|
|
74aa66e249 | ||
|
|
575a0f4882 | ||
|
|
9b08d73ee6 | ||
|
|
8f8f79363a | ||
|
|
aba9b0771d | ||
|
|
5eb539aad6 | ||
|
|
03cf97450d | ||
|
|
761393e4ee | ||
|
|
604b850745 | ||
|
|
ba564eda44 | ||
|
|
f8654e66ce | ||
|
|
e83f8dc0ca | ||
|
|
e80ba1811a | ||
|
|
1e00ab87b4 | ||
|
|
2d61ef598a | ||
|
|
4d13c79f95 | ||
|
|
2526f7af48 | ||
|
|
3b7dc65e5b | ||
|
|
fc6c822ff0 | ||
|
|
48b183a2ff | ||
|
|
b6f8400db9 | ||
|
|
7466caef97 | ||
|
|
d9fc8628cc | ||
|
|
e27d3f481e | ||
|
|
e9baf89529 | ||
|
|
35acc60960 | ||
|
|
f7137493d5 | ||
|
|
44ce7aeadc | ||
|
|
7c8de1f60d | ||
|
|
7d0b60c931 | ||
|
|
186c2793f5 | ||
|
|
e0be8f3a08 | ||
|
|
6f46e728c1 | ||
|
|
e17e4f2196 | ||
|
|
143bf1697e | ||
|
|
997a9abd3f | ||
|
|
68914726d9 | ||
|
|
f4a1cdf603 | ||
|
|
9ba6eaa954 | ||
|
|
a0db1142d3 | ||
|
|
3d5c3cebd3 | ||
|
|
587461abe6 | ||
|
|
64eb4da1ad | ||
|
|
b205949e01 | ||
|
|
9c44105456 | ||
|
|
8f29a8fced | ||
|
|
91176f622d | ||
|
|
60fdc1e996 | ||
|
|
caa2910969 | ||
|
|
8b2caa64cd | ||
|
|
8705e0f190 | ||
|
|
dbb3b68e7b | ||
|
|
fcc9957062 | ||
|
|
2b423244a5 | ||
|
|
423523c75c | ||
|
|
f5394aae07 | ||
|
|
436ad5e0ba | ||
|
|
0551fda203 | ||
|
|
4719f469e5 | ||
|
|
f289997215 | ||
|
|
7fd976cab4 | ||
|
|
87dc2b1d9f | ||
|
|
d722dc28b5 | ||
|
|
7ddcef6e35 | ||
|
|
3b9d8bfd49 | ||
|
|
d265f63589 | ||
|
|
06079c8b36 | ||
|
|
ff1cbac448 | ||
|
|
f17339a441 | ||
|
|
568dbcbb52 | ||
|
|
a71dddbaa5 | ||
|
|
6199a1de9c | ||
|
|
7bf0981665 | ||
|
|
b1f50cb245 | ||
|
|
1da913941b | ||
|
|
7559f08a3c | ||
|
|
c15b6032be | ||
|
|
1301d057c8 | ||
|
|
9e136ee931 | ||
|
|
b961406e8b | ||
|
|
991c46f910 | ||
|
|
3e10acb49d | ||
|
|
26f6352bf1 | ||
|
|
78e4acad5e | ||
|
|
a4e44d7296 | ||
|
|
d9208074f8 | ||
|
|
e6d2c20598 | ||
|
|
b72f28b972 | ||
|
|
5736dfe8c7 | ||
|
|
f0e73b312d | ||
|
|
a5e5af96dd | ||
|
|
fdaa4321b1 | ||
|
|
304e5a0935 | ||
|
|
c42d254375 | ||
|
|
6e5bb1f5cc | ||
|
|
d76712628f |
@@ -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)
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||

|
||||
|
||||
| Jenkins CI Name | Master | Stable |
|
||||
| --------------- | ------ | ------ |
|
||||
| OpenSuse Qt 5.14 | [](https://build.kde.org/job/Applications/job/kdenlive/job/kf5-qt5%20SUSEQt5.14//) |[](https://build.kde.org/job/Applications/job/kdenlive/job/stable-kf5-qt5%20SUSEQt5.14/)|
|
||||
| FreeBSD Qt 5.15 | [](https://build.kde.org/job/Applications/job/kdenlive/job/kf5-qt5%20FreeBSDQt5.15/) |[](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
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@ install(FILES
|
||||
banner.png
|
||||
encodingprofiles.rc
|
||||
externalproxies.rc
|
||||
metadata.properties
|
||||
meta_ffmpeg.png
|
||||
meta_libav.png
|
||||
meta_magiclantern.png
|
||||
|
||||
@@ -106,7 +106,6 @@ avfilter.drawbox
|
||||
avfilter.drawgraph
|
||||
avfilter.drawgrid
|
||||
avfilter.elbg
|
||||
avfilter.eq
|
||||
avfilter.floodfill
|
||||
avfilter.fspp
|
||||
avfilter.gblur
|
||||
|
||||
@@ -28,6 +28,7 @@ mute.xml
|
||||
normalise.xml
|
||||
oldfilm.xml
|
||||
pan_zoom.xml
|
||||
pillar_echo.xml
|
||||
obscure.xml
|
||||
region.xml
|
||||
rotation.xml
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -7,5 +7,6 @@ selectivecolor.xml
|
||||
avfilter_lut3d.xml
|
||||
unsharp.xml
|
||||
subtitles.xml
|
||||
eq.xml
|
||||
equalizer.xml
|
||||
DESTINATION ${DATA_INSTALL_DIR}/kdenlive/effects)
|
||||
|
||||
31
data/effects/avfilter/eq.xml
Normal 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>
|
||||
|
||||
12
data/effects/pillar_echo.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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]=حدث خطأ في «كدينلايڤ»
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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>
|
||||
|
||||
|
||||
5
packaging/appimage/3rdparty/CMakeLists.txt
vendored
@@ -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 )
|
||||
|
||||
13
packaging/appimage/3rdparty/ext_amf/CMakeLists.txt
vendored
Normal 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
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
14
packaging/appimage/3rdparty/ext_mfx/CMakeLists.txt
vendored
Normal 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
|
||||
)
|
||||
11
packaging/appimage/3rdparty/ext_nv-codec-headers/CMakeLists.txt
vendored
Normal 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
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 ¶m : consumerParams) {
|
||||
for (const QString ¶m : qAsConst(consumerParams)) {
|
||||
if (param.contains(QLatin1Char('='))) {
|
||||
cons->set(param.section(QLatin1Char('='), 0, 0).toUtf8().constData(), param.section(QLatin1Char('='), 1).toUtf8().constData());
|
||||
}
|
||||
|
||||
@@ -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(' '))) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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"); }
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 ¶m : 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 ¢er
|
||||
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 ¢er
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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++;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 ¶mName);
|
||||
|
||||
/** @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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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); });
|
||||
}
|
||||
|
||||
|
||||
@@ -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 ¶m : filterParams) {
|
||||
for (const auto ¶m : 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 ¶m : filterLastParams) {
|
||||
for (const auto ¶m : 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 ¶m : filterParams) {
|
||||
for (const auto ¶m : qAsConst(filterParams)) {
|
||||
if (param.first == m_keyParam && !param.second.isNull()) {
|
||||
m_displayConditional = false;
|
||||
break;
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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()),
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||