diff -Nru kdenlive-0.7.7/CMakeLists.txt kdenlive-0.7.7.1/CMakeLists.txt --- kdenlive-0.7.7/CMakeLists.txt 2010-02-17 08:07:53.000000000 +0000 +++ kdenlive-0.7.7.1/CMakeLists.txt 2010-02-26 21:44:41.000000000 +0000 @@ -1,6 +1,6 @@ project(kdenlive) -SET(BASE_VERSION 0.7.7) +SET(BASE_VERSION 0.7.7.1) OPTION(RELEASE_BUILD "Remove compilation date to version, use for stable releases (default off)" ON) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ) diff -Nru kdenlive-0.7.7/debian/changelog kdenlive-0.7.7.1/debian/changelog --- kdenlive-0.7.7/debian/changelog 2010-02-28 17:48:15.000000000 +0000 +++ kdenlive-0.7.7.1/debian/changelog 2010-02-28 17:48:15.000000000 +0000 @@ -1,3 +1,9 @@ +kdenlive (0.7.7.1-karmic~ppa1) karmic; urgency=low + + * New upstream release + + -- Philip Johnsson Sun, 28 Feb 2010 18:21:11 +0100 + kdenlive (0.7.7-karmic~ppa2) karmic; urgency=low * debian/control - force depend on mlt >= 0.5.0 diff -Nru kdenlive-0.7.7/effects/channelcopy.xml~ kdenlive-0.7.7.1/effects/channelcopy.xml~ --- kdenlive-0.7.7/effects/channelcopy.xml~ 2010-02-17 08:07:54.000000000 +0000 +++ kdenlive-0.7.7.1/effects/channelcopy.xml~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,6 +0,0 @@ - - - Mono to stereo - Copy the left channel to the right - Dan Dennedy - diff -Nru kdenlive-0.7.7/.kdev4/kdenlive.kdev4 kdenlive-0.7.7.1/.kdev4/kdenlive.kdev4 --- kdenlive-0.7.7/.kdev4/kdenlive.kdev4 2010-02-17 08:07:50.000000000 +0000 +++ kdenlive-0.7.7.1/.kdev4/kdenlive.kdev4 1970-01-01 01:00:00.000000000 +0100 @@ -1,14 +0,0 @@ -[Buildset] -BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x10\x00k\x00d\x00e\x00n\x00l\x00i\x00v\x00e) - -[CMake] -BuildDirs=/home/one/downloads/svn/kdenlive/build -CMakeDir=/usr/share/cmake-2.6/Modules -Current CMake Binary=file:///usr/bin/cmake -CurrentBuildDir=file:///home/one/downloads/svn/kdenlive/build -CurrentBuildType= -CurrentInstallDir= -ProjectRootRelative=./ - -[Project] -VersionControlSupport=kdevsubversion diff -Nru kdenlive-0.7.7/po/pl/kdenlive.po kdenlive-0.7.7.1/po/pl/kdenlive.po --- kdenlive-0.7.7/po/pl/kdenlive.po 2010-02-17 08:07:48.000000000 +0000 +++ kdenlive-0.7.7.1/po/pl/kdenlive.po 2010-02-26 21:44:41.000000000 +0000 @@ -2,13 +2,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Mariusz Pluciński , 2009. +# Pluciński Mariusz, 2010. msgid "" msgstr "" "Project-Id-Version: kdenlive\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-01 23:51+0200\n" -"PO-Revision-Date: 2009-10-03 17:59+0200\n" -"Last-Translator: Mariusz Pluciński \n" +"POT-Creation-Date: 2010-02-23 21:31+0200\n" +"PO-Revision-Date: 2010-02-24 22:00+0100\n" +"Last-Translator: Pluciński Mariusz\n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,139 +18,142 @@ "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -#: src/titlewidget.cpp:69 rc.cpp:1828 rc.cpp:3746 rc.cpp:5225 -#, no-c-format +#: rc.cpp:1166 rc.cpp:1172 rc.cpp:2715 rc.cpp:2721 +msgid " frames" +msgstr "klatki" + +#: src/titlewidget.cpp:140 msgid "%" msgstr "%" -#: src/titlewidget.cpp:1077 rc.cpp:1524 rc.cpp:3442 rc.cpp:4921 +#: src/documentchecker.cpp:171 +msgid "%1 will be replaced by %2" +msgstr "%1 zostanie zastąpione przez %2" + +#: src/titlewidget.cpp:1348 rc.cpp:1097 rc.cpp:2646 msgid "+X" msgstr "+X" -#: src/titlewidget.cpp:1102 rc.cpp:1527 rc.cpp:3445 rc.cpp:4924 +#: src/titlewidget.cpp:1373 rc.cpp:1100 rc.cpp:2649 msgid "+Y" msgstr "+Y" -#: rc.cpp:632 rc.cpp:720 rc.cpp:723 rc.cpp:978 rc.cpp:984 rc.cpp:990 -#: rc.cpp:996 rc.cpp:1005 rc.cpp:1080 rc.cpp:1083 rc.cpp:1092 rc.cpp:1095 -#: rc.cpp:1104 rc.cpp:1107 rc.cpp:1458 rc.cpp:1461 rc.cpp:1494 rc.cpp:1497 -#: rc.cpp:1554 rc.cpp:1557 rc.cpp:1560 rc.cpp:1563 rc.cpp:1566 rc.cpp:1569 -#: rc.cpp:1572 rc.cpp:1590 rc.cpp:1593 rc.cpp:1596 rc.cpp:1599 rc.cpp:1602 -#: rc.cpp:1605 rc.cpp:1882 rc.cpp:1885 rc.cpp:1915 rc.cpp:2550 rc.cpp:2638 -#: rc.cpp:2641 rc.cpp:2896 rc.cpp:2902 rc.cpp:2908 rc.cpp:2914 rc.cpp:2923 -#: rc.cpp:2998 rc.cpp:3001 rc.cpp:3010 rc.cpp:3013 rc.cpp:3022 rc.cpp:3025 -#: rc.cpp:3376 rc.cpp:3379 rc.cpp:3412 rc.cpp:3415 rc.cpp:3472 rc.cpp:3475 -#: rc.cpp:3478 rc.cpp:3481 rc.cpp:3484 rc.cpp:3487 rc.cpp:3490 rc.cpp:3508 -#: rc.cpp:3511 rc.cpp:3514 rc.cpp:3517 rc.cpp:3520 rc.cpp:3523 rc.cpp:3800 -#: rc.cpp:3803 rc.cpp:4029 rc.cpp:4117 rc.cpp:4120 rc.cpp:4375 rc.cpp:4381 -#: rc.cpp:4387 rc.cpp:4393 rc.cpp:4402 rc.cpp:4477 rc.cpp:4480 rc.cpp:4489 -#: rc.cpp:4492 rc.cpp:4501 rc.cpp:4504 rc.cpp:4855 rc.cpp:4858 rc.cpp:4891 -#: rc.cpp:4894 rc.cpp:4951 rc.cpp:4954 rc.cpp:4957 rc.cpp:4960 rc.cpp:4963 -#: rc.cpp:4966 rc.cpp:4969 rc.cpp:4987 rc.cpp:4990 rc.cpp:4993 rc.cpp:4996 -#: rc.cpp:4999 rc.cpp:5002 rc.cpp:5279 rc.cpp:5282 +#: rc.cpp:646 rc.cpp:649 rc.cpp:721 rc.cpp:724 rc.cpp:733 rc.cpp:736 +#: rc.cpp:745 rc.cpp:748 rc.cpp:757 rc.cpp:760 rc.cpp:1019 rc.cpp:1022 +#: rc.cpp:1031 rc.cpp:1034 rc.cpp:1130 rc.cpp:1133 rc.cpp:1136 rc.cpp:1139 +#: rc.cpp:1142 rc.cpp:1145 rc.cpp:1232 rc.cpp:1235 rc.cpp:1241 rc.cpp:1244 +#: rc.cpp:1247 rc.cpp:1250 rc.cpp:1253 rc.cpp:1526 rc.cpp:1544 rc.cpp:1547 +#: rc.cpp:1724 rc.cpp:1739 rc.cpp:1970 rc.cpp:1976 rc.cpp:1982 rc.cpp:1988 +#: rc.cpp:1997 rc.cpp:2195 rc.cpp:2198 rc.cpp:2270 rc.cpp:2273 rc.cpp:2282 +#: rc.cpp:2285 rc.cpp:2294 rc.cpp:2297 rc.cpp:2306 rc.cpp:2309 rc.cpp:2568 +#: rc.cpp:2571 rc.cpp:2580 rc.cpp:2583 rc.cpp:2679 rc.cpp:2682 rc.cpp:2685 +#: rc.cpp:2688 rc.cpp:2691 rc.cpp:2694 rc.cpp:2781 rc.cpp:2784 rc.cpp:2790 +#: rc.cpp:2793 rc.cpp:2796 rc.cpp:2799 rc.cpp:2802 rc.cpp:3075 rc.cpp:3093 +#: rc.cpp:3096 rc.cpp:3273 rc.cpp:3288 rc.cpp:3519 rc.cpp:3525 rc.cpp:3531 +#: rc.cpp:3537 rc.cpp:3546 msgid "..." msgstr "..." -#: rc.cpp:789 rc.cpp:795 rc.cpp:801 rc.cpp:2707 rc.cpp:2713 rc.cpp:2719 -#: rc.cpp:4186 rc.cpp:4192 rc.cpp:4198 +#: rc.cpp:682 rc.cpp:688 rc.cpp:694 rc.cpp:2231 rc.cpp:2237 rc.cpp:2243 msgid "/" msgstr "/" -#: rc.cpp:1248 rc.cpp:3166 rc.cpp:4645 +#: rc.cpp:1331 rc.cpp:2880 msgid "/dev/dsp" msgstr "/dev/dsp" -#: rc.cpp:1269 rc.cpp:3187 rc.cpp:4666 +#: rc.cpp:1352 rc.cpp:2901 msgid "/dev/video0" msgstr "/dev/video0" -#: rc.cpp:1650 rc.cpp:3568 rc.cpp:5047 +#: rc.cpp:2000 rc.cpp:3549 msgid "0" msgstr "0" -#: rc.cpp:656 rc.cpp:1800 rc.cpp:2574 rc.cpp:3718 rc.cpp:4053 rc.cpp:5197 +#: rc.cpp:772 rc.cpp:905 rc.cpp:2321 rc.cpp:2454 msgid "1" msgstr "1" -#: src/clipproperties.cpp:508 src/slideshowclip.cpp:130 +#: src/slideshowclip.cpp:131 src/clipproperties.cpp:647 msgid "1 image found" msgid_plural "%1 images found" msgstr[0] "1 obraz znaleziony" msgstr[1] "%1 obrazów znalezionych" msgstr[2] "%1 obrazów znalezionych" -#: src/geometryval.cpp:89 rc.cpp:1628 rc.cpp:3546 rc.cpp:5025 +#: src/geometryval.cpp:90 rc.cpp:1195 rc.cpp:2744 #, no-c-format msgid "100%" msgstr "100%" -#: rc.cpp:1305 rc.cpp:3223 rc.cpp:4702 +#: rc.cpp:1388 rc.cpp:2937 msgid "11250" msgstr "11250" -#: rc.cpp:1803 rc.cpp:3721 rc.cpp:5200 +#: rc.cpp:908 rc.cpp:2457 msgid "2" msgstr "2" -#: src/geometryval.cpp:90 rc.cpp:1632 rc.cpp:3550 rc.cpp:5029 +#: src/geometryval.cpp:91 rc.cpp:1199 rc.cpp:2748 #, no-c-format msgid "200%" msgstr "200%" -#: rc.cpp:1302 rc.cpp:3220 rc.cpp:4699 +#: rc.cpp:1385 rc.cpp:2934 msgid "22500" msgstr "22500" -#: rc.cpp:1425 rc.cpp:3343 rc.cpp:3861 rc.cpp:4822 rc.cpp:5340 +#: rc.cpp:1580 rc.cpp:1865 rc.cpp:3129 rc.cpp:3414 msgid "25/1" msgstr "25/1" -#: rc.cpp:1299 rc.cpp:3217 rc.cpp:4696 +#: rc.cpp:263 +msgid "3 point balance" +msgstr "3 punktowy balans" + +#: rc.cpp:1382 rc.cpp:2931 msgid "32000" msgstr "32000" -#: rc.cpp:1275 rc.cpp:3193 rc.cpp:4672 +#: rc.cpp:1358 rc.cpp:2907 msgid "320x240" msgstr "320x240" -#: rc.cpp:1437 rc.cpp:3355 rc.cpp:3873 rc.cpp:4834 rc.cpp:5352 +#: rc.cpp:1592 rc.cpp:1877 rc.cpp:3141 rc.cpp:3426 msgid "4/3" msgstr "4/3" -#: rc.cpp:1296 rc.cpp:3214 rc.cpp:4693 +#: rc.cpp:1379 rc.cpp:2928 msgid "41000" msgstr "41000" -#: rc.cpp:1293 rc.cpp:3211 rc.cpp:4690 +#: rc.cpp:1376 rc.cpp:2925 msgid "48000" msgstr "48000" -#: src/geometryval.cpp:88 rc.cpp:1624 rc.cpp:3542 rc.cpp:5021 +#: src/geometryval.cpp:89 rc.cpp:1191 rc.cpp:2740 #, no-c-format msgid "50%" msgstr "50%" -#: rc.cpp:1431 rc.cpp:3349 rc.cpp:3867 rc.cpp:4828 rc.cpp:5346 +#: rc.cpp:1586 rc.cpp:1871 rc.cpp:3135 rc.cpp:3420 msgid "59/54" msgstr "59/54" -#: rc.cpp:1419 rc.cpp:3337 rc.cpp:3855 rc.cpp:4816 rc.cpp:5334 +#: rc.cpp:1574 rc.cpp:1859 rc.cpp:3123 rc.cpp:3408 msgid "720x576" msgstr "720x576" -#: rc.cpp:891 rc.cpp:1077 rc.cpp:1089 rc.cpp:1101 rc.cpp:1359 rc.cpp:1371 -#: rc.cpp:1398 rc.cpp:1407 rc.cpp:1455 rc.cpp:1491 rc.cpp:1581 rc.cpp:1680 -#: rc.cpp:1695 rc.cpp:1749 rc.cpp:1758 rc.cpp:1834 rc.cpp:1861 rc.cpp:2809 -#: rc.cpp:2995 rc.cpp:3007 rc.cpp:3019 rc.cpp:3277 rc.cpp:3289 rc.cpp:3316 -#: rc.cpp:3325 rc.cpp:3373 rc.cpp:3409 rc.cpp:3499 rc.cpp:3598 rc.cpp:3613 -#: rc.cpp:3667 rc.cpp:3676 rc.cpp:3752 rc.cpp:3779 rc.cpp:4288 rc.cpp:4474 -#: rc.cpp:4486 rc.cpp:4498 rc.cpp:4756 rc.cpp:4768 rc.cpp:4795 rc.cpp:4804 -#: rc.cpp:4852 rc.cpp:4888 rc.cpp:4978 rc.cpp:5077 rc.cpp:5092 rc.cpp:5146 -#: rc.cpp:5155 rc.cpp:5231 rc.cpp:5258 +#: rc.cpp:718 rc.cpp:730 rc.cpp:742 rc.cpp:754 rc.cpp:800 rc.cpp:854 +#: rc.cpp:863 rc.cpp:935 rc.cpp:1028 rc.cpp:1115 rc.cpp:1277 rc.cpp:1541 +#: rc.cpp:1838 rc.cpp:1847 rc.cpp:1928 rc.cpp:1940 rc.cpp:2009 rc.cpp:2168 +#: rc.cpp:2267 rc.cpp:2279 rc.cpp:2291 rc.cpp:2303 rc.cpp:2349 rc.cpp:2403 +#: rc.cpp:2412 rc.cpp:2484 rc.cpp:2577 rc.cpp:2664 rc.cpp:2826 rc.cpp:3090 +#: rc.cpp:3387 rc.cpp:3396 rc.cpp:3477 rc.cpp:3489 rc.cpp:3558 rc.cpp:3717 msgid "99:99:99:99; " msgstr "99:99:99:99; " -#: rc.cpp:1401 rc.cpp:3319 rc.cpp:4798 +#: rc.cpp:1841 rc.cpp:3390 msgid ":::" msgstr ":::" @@ -225,7 +229,7 @@ msgid "No additional information available for this character." msgstr "Brak dodatkowych informacji dla tego znaku." -#: src/kdenlivesettingsdialog.cpp:179 +#: src/kdenlivesettingsdialog.cpp:183 msgid "" "Recordmydesktop utility not found, please install it for " "screen grabs" @@ -233,7 +237,7 @@ "Nie znaleziono programu Recordmydesktop. Jest on niezbędny " "do przechwytywania z ekranu" -#: src/kdenlivesettingsdialog.cpp:173 +#: src/kdenlivesettingsdialog.cpp:177 msgid "" "dvgrab utility not found, please install it for firewire " "capture" @@ -249,16 +253,16 @@ msgid "Program %1 or %2 is required for the DVD wizard." msgstr "Program %1 lub %2 jest wymagany przez kreator DVD." -#: src/renderwidget.cpp:1422 +#: src/renderwidget.cpp:1479 msgid "Rendering of %1 crashed
" msgstr "Renderowanie %1 nie powiodło się
" -#: rc.cpp:699 rc.cpp:714 rc.cpp:2617 rc.cpp:2632 rc.cpp:3828 rc.cpp:3918 -#: rc.cpp:4096 rc.cpp:4111 rc.cpp:5307 rc.cpp:5397 +#: rc.cpp:1013 rc.cpp:1508 rc.cpp:2084 rc.cpp:2144 rc.cpp:2562 rc.cpp:3057 +#: rc.cpp:3633 rc.cpp:3693 msgid "A" msgstr "A" -#: src/customtrackview.cpp:4020 +#: src/customtrackview.cpp:4499 msgid "A guide already exists at position %1" msgstr "Wskaźnik już istnieje na pozycji %1" @@ -270,96 +274,104 @@ "Profil o tej samej nazwie już istnieje wśród domyślnych profili MLT, proszę " "wybrać inny opis do własnego profilu." -#: src/kdenlivesettingsdialog.cpp:217 rc.cpp:1308 rc.cpp:3226 rc.cpp:4705 +#: src/kdenlivesettingsdialog.cpp:221 rc.cpp:1391 rc.cpp:2940 msgid "ALSA" msgstr "ALSA" -#: src/kdenlivesettingsdialog.cpp:221 +#: src/kdenlivesettingsdialog.cpp:225 msgid "ARTS daemon" msgstr "Demon ARTS" -#: src/cliptranscode.cpp:119 rc.cpp:966 rc.cpp:2884 rc.cpp:4363 +#: src/cliptranscode.cpp:125 rc.cpp:1793 rc.cpp:3342 msgid "Abort" msgstr "Przerwij " -#: src/renderwidget.cpp:1456 rc.cpp:623 rc.cpp:2541 rc.cpp:4020 +#: src/renderwidget.cpp:1521 rc.cpp:1730 rc.cpp:3279 msgid "Abort Job" msgstr "Przerwij zadanie" -#: rc.cpp:1662 rc.cpp:3580 rc.cpp:5059 +#: rc.cpp:2105 rc.cpp:3654 msgid "Activate crash recovery (auto save)" msgstr "Aktywuj odzyskiwanie po awarii (auto-zapis)" -#: src/customtrackview.cpp:1466 src/customtrackview.cpp:1510 -#: src/addeffectcommand.cpp:38 +#: src/addeffectcommand.cpp:38 src/customtrackview.cpp:1636 +#: src/customtrackview.cpp:1680 msgid "Add %1" msgstr "Dodaj %1" -#: rc.cpp:5448 +#: rc.cpp:3774 msgid "Add Audio Effect" msgstr "Dodaj efekt audio" -#: src/mainwindow.cpp:1121 +#: src/mainwindow.cpp:1309 msgid "Add Clip" msgstr "Dodaj klip" -#: src/mainwindow.cpp:1125 +#: src/mainwindow.cpp:1152 +msgid "Add Clip To Selection" +msgstr "Dodaj klip do zaznaczenia" + +#: src/mainwindow.cpp:1313 msgid "Add Color Clip" msgstr "Dodaj klip z kolorem" -#: rc.cpp:5451 +#: rc.cpp:3777 msgid "Add Custom Effect" msgstr "Dodaj inny efekt" -#: src/customruler.cpp:76 src/mainwindow.cpp:1051 src/customtrackview.cpp:4035 +#: src/customruler.cpp:77 src/mainwindow.cpp:1239 src/customtrackview.cpp:4514 msgid "Add Guide" msgstr "Dodaj wskaźnik " -#: src/titlewidget.cpp:221 +#: src/titlewidget.cpp:349 msgid "Add Image" msgstr "Dodaj obraz" -#: src/clipproperties.cpp:297 src/mainwindow.cpp:989 src/mainwindow.cpp:2030 +#: src/mainwindow.cpp:1177 src/mainwindow.cpp:2228 src/clipproperties.cpp:427 msgid "Add Marker" msgstr "Dodaj znacznik" -#: rc.cpp:1846 rc.cpp:3764 rc.cpp:5243 +#: rc.cpp:2045 rc.cpp:3594 msgid "Add Profile" msgstr "Dodaj profil" -#: src/titlewidget.cpp:215 +#: src/titlewidget.cpp:343 msgid "Add Rectangle" msgstr "Dodaj prostokąt" -#: src/mainwindow.cpp:1129 src/slideshowclip.cpp:35 +#: src/slideshowclip.cpp:35 src/mainwindow.cpp:1317 msgid "Add Slideshow Clip" msgstr "Dodaj klip pokazu slajdów" -#: src/mainwindow.cpp:1137 +#: src/mainwindow.cpp:1325 msgid "Add Template Title" msgstr "Dodaj szablonowy tytuł" -#: src/titlewidget.cpp:209 +#: src/titlewidget.cpp:337 msgid "Add Text" msgstr "Dodaj tekst" -#: src/mainwindow.cpp:1133 +#: src/mainwindow.cpp:1321 msgid "Add Title Clip" msgstr "Dodaj klip tytułowy" -#: src/mainwindow.cpp:321 +#: src/mainwindow.cpp:380 msgid "Add Transition" msgstr "Dodaj przejście" -#: rc.cpp:5445 +#: src/mainwindow.cpp:1167 +msgid "Add Transition To Selection" +msgstr "Dodaj przejście do zaznaczenia" + +#: rc.cpp:3771 msgid "Add Video Effect" msgstr "Dodaj efekt wideo" -#: src/clipitem.cpp:871 src/clipitem.cpp:878 +#: src/clipitem.cpp:869 src/clipitem.cpp:878 msgid "Add audio fade" msgstr "Dodaj zgłaśnianie/ściszanie dźwięku" -#: rc.cpp:762 rc.cpp:2680 rc.cpp:4159 +#: rc.cpp:2150 rc.cpp:3699 msgid "Add chapter" msgstr "Dodaj rozdział" @@ -367,14 +379,18 @@ msgid "Add clip" msgstr "Dodaj klip" -#: src/cliptranscode.cpp:36 rc.cpp:861 rc.cpp:2779 rc.cpp:4258 +#: src/addclipcutcommand.cpp:35 +msgid "Add clip cut" +msgstr "Dodaj cięcie klipu" + +#: src/cliptranscode.cpp:36 rc.cpp:1064 rc.cpp:2613 msgid "Add clip to project" msgid_plural "Add clips to project" msgstr[0] "Dodaj klip do projektu" msgstr[1] "Dodaj klipy do projektu" msgstr[2] "Dodaj klipy do projektu" -#: src/clipmanager.cpp:258 +#: src/clipmanager.cpp:262 msgid "Add clips" msgstr "Dodaj klipy" @@ -386,20 +402,20 @@ msgid "Add guide" msgstr "Dodaj wskaźnik " -#: src/complexparameter.cpp:44 src/geometryval.cpp:74 -#: src/editkeyframecommand.cpp:38 +#: src/complexparameter.cpp:44 src/editkeyframecommand.cpp:38 +#: src/keyframeedit.cpp:45 src/geometryval.cpp:75 msgid "Add keyframe" msgstr "Dodaj klatkę kluczową" -#: src/clipproperties.cpp:244 src/addmarkercommand.cpp:33 +#: src/clipproperties.cpp:274 src/addmarkercommand.cpp:33 msgid "Add marker" msgstr "Dodaj znacznik" -#: rc.cpp:1891 rc.cpp:3809 rc.cpp:5288 +#: rc.cpp:655 rc.cpp:2204 msgid "Add movie file" msgstr "Dodaj plik filmowy" -#: src/dvdwizardmenu.cpp:43 +#: src/dvdwizardmenu.cpp:44 msgid "Add new button" msgstr "Dodaj nowy przycisk" @@ -411,15 +427,15 @@ msgid "Add new video file" msgstr "Dodaj nowy plik wideo" -#: rc.cpp:1230 rc.cpp:3148 rc.cpp:4627 +#: rc.cpp:1313 rc.cpp:2862 msgid "Add recording time to captured file name" msgstr "Dodaj czas nagrywania do nazwy przechwyconego pliku" -#: rc.cpp:1488 rc.cpp:3406 rc.cpp:4885 +#: rc.cpp:1538 rc.cpp:3087 msgid "Add space" msgstr "Dodaj odstęp" -#: src/addtimelineclipcommand.cpp:36 src/customtrackview.cpp:1962 +#: src/addtimelineclipcommand.cpp:38 src/customtrackview.cpp:2187 msgid "Add timeline clip" msgstr "Dodaj klip linii czasu" @@ -427,7 +443,7 @@ msgid "Add track" msgstr "Dodaj ścieżkę" -#: src/clipitem.cpp:885 src/clipitem.cpp:888 +#: src/clipitem.cpp:887 src/clipitem.cpp:890 msgid "Add transition" msgstr "Dodaj przejście" @@ -435,7 +451,7 @@ msgid "Add transition to clip" msgstr "Dodaj przejście do klipu" -#: rc.cpp:1918 +#: rc.cpp:1529 rc.cpp:3078 msgid "Additional Information" msgstr "Dodatkowe informacje" @@ -443,91 +459,101 @@ msgid "Additional Settings" msgstr "Dodatkowe ustawienia" -#: rc.cpp:521 rc.cpp:2439 +#: rc.cpp:601 msgid "Adjust audio volume with keyframes" msgstr "Dostosuj głośność dzwięku na klatkach kluczowych" -#: src/changespeedcommand.cpp:36 +#: src/changespeedcommand.cpp:37 msgid "Adjust clip length" msgstr "Dostosuj długość klipu" -#: rc.cpp:353 rc.cpp:2271 +# levels of what? +#: rc.cpp:213 +msgid "Adjust levels" +msgstr "Dostosuj poziomy " + +#: rc.cpp:437 msgid "Adjust size and position of clip" msgstr "Dostosuj rozmiar i położenie klipu" -#: rc.cpp:221 rc.cpp:2139 +#: rc.cpp:305 msgid "Adjust the audio volume without keyframes" msgstr "Dostosuj głośność dźwięku bez klatek kluczowych" -#: rc.cpp:132 rc.cpp:2050 +#: rc.cpp:134 msgid "Adjust the white balance / color temperature" msgstr "Dostosuj balans bieli / temperaturę kolorów" -#: rc.cpp:140 rc.cpp:2058 +# winietowanie??? +#: rc.cpp:587 +msgid "Adjustable Vignette" +msgstr "Regulowane Vignette" + +#: rc.cpp:142 msgid "Adjusts the brightness of a source image" msgstr "Dostosuj jasność obrazu źródłowego" -#: rc.cpp:151 rc.cpp:2069 +#: rc.cpp:153 msgid "Adjusts the contrast of a source image" msgstr "Dostosuj kontrast obrazu źródłowego" -#: rc.cpp:179 rc.cpp:2097 +#: rc.cpp:233 msgid "Adjusts the saturation of a source image" msgstr "Dostosuj nasycenie obrazu źródłowego" -#: rc.cpp:1806 rc.cpp:3724 rc.cpp:5203 +#: rc.cpp:911 rc.cpp:2460 msgid "Advanced" msgstr "Zaawansowane" -#: src/titlewidget.cpp:161 +#: src/titlewidget.cpp:253 msgid "Align center" msgstr "Wyrównaj do środka" -#: src/titlewidget.cpp:182 +#: src/titlewidget.cpp:308 msgid "Align item horizontally" msgstr "Wyrównaj element w poziomie" -#: src/titlewidget.cpp:188 +#: src/titlewidget.cpp:314 msgid "Align item to bottom" msgstr "Wyrównaj element do dołu" -#: src/titlewidget.cpp:192 +#: src/titlewidget.cpp:318 msgid "Align item to left" msgstr "Wyrównaj element do lewej" -#: src/titlewidget.cpp:190 +#: src/titlewidget.cpp:316 msgid "Align item to right" msgstr "Wyrównaj element do prawej" -#: src/titlewidget.cpp:186 +#: src/titlewidget.cpp:312 msgid "Align item to top" msgstr "Wyrównaj element do góry" -#: src/titlewidget.cpp:184 +#: src/titlewidget.cpp:310 msgid "Align item vertically" msgstr "Wyrównaj element w pionie" -#: src/titlewidget.cpp:160 +#: src/titlewidget.cpp:252 msgid "Align left" msgstr "Wyrównaj do lewej" -#: src/titlewidget.cpp:159 +#: src/titlewidget.cpp:251 msgid "Align right" msgstr "Wyrównaj do prawej" -#: src/geometryval.cpp:94 +#: src/geometryval.cpp:95 msgid "Align..." msgstr "Wyrównaj..." -#: rc.cpp:1897 rc.cpp:3815 rc.cpp:5294 +#: rc.cpp:1262 rc.cpp:2811 msgid "All" msgstr "Wszystkie" -#: src/projectlist.cpp:679 +#: src/projectlist.cpp:927 msgid "All Files" msgstr "Wszystkie Pliki" -#: src/projectlist.cpp:679 +#: src/projectlist.cpp:927 msgid "All Supported Files" msgstr "Wszystkie obsługiwane pliki" @@ -543,19 +569,19 @@ msgid "Allow vertical moves" msgstr "Pozwól na ruch w pionie" -#: rc.cpp:165 rc.cpp:2083 +#: rc.cpp:199 msgid "Allows compensation of lens distortion" msgstr "Dodaj kompensację zniekształcenia obiektywu" -#: rc.cpp:211 rc.cpp:2129 +#: rc.cpp:295 msgid "Alpha blending with zoomed and rotated images" msgstr "Przezroczystość przy powiększonych i obróconych obrazach" -#: src/renderwidget.cpp:786 src/renderwidget.cpp:1554 +#: src/renderwidget.cpp:819 src/renderwidget.cpp:1623 msgid "Already running" msgstr "Już uruchomiono" -#: rc.cpp:159 rc.cpp:529 rc.cpp:2077 rc.cpp:2447 +#: rc.cpp:193 rc.cpp:609 msgid "Amplitude" msgstr "Amplituda" @@ -563,105 +589,109 @@ msgid "An open source video editor." msgstr "Edytor wideo o otartym źródle" -#: rc.cpp:367 rc.cpp:2285 +#: rc.cpp:451 msgid "Animate Rotate X" msgstr "Animacja obrotu X" -#: rc.cpp:369 rc.cpp:2287 +#: rc.cpp:453 msgid "Animate Rotate Y" msgstr "Animacja obrotu Y" -#: rc.cpp:371 rc.cpp:2289 +#: rc.cpp:455 msgid "Animate Rotate Z" msgstr "Animacja obrotu Z" -#: rc.cpp:377 rc.cpp:2295 +#: rc.cpp:461 msgid "Animate Shear X" msgstr "Animacja wygięcia X" -#: rc.cpp:379 rc.cpp:2297 +#: rc.cpp:463 msgid "Animate Shear Y" msgstr "Animacja wygjęcia Y" -#: rc.cpp:1611 rc.cpp:3529 rc.cpp:5008 +#: rc.cpp:1178 rc.cpp:2727 msgid "Animation" msgstr "Animacja" -#: src/kdenlivesettingsdialog.cpp:243 +#: src/kdenlivesettingsdialog.cpp:247 msgid "Ascii art library" msgstr "Biblioteka ASCII-art" -#: rc.cpp:1428 rc.cpp:3346 rc.cpp:4825 +#: rc.cpp:1868 rc.cpp:3417 msgid "Aspect ratio:" msgstr "Współczynnik proporcji:" -#: rc.cpp:1116 rc.cpp:1722 rc.cpp:1903 rc.cpp:3034 rc.cpp:3640 rc.cpp:3821 -#: rc.cpp:3891 rc.cpp:4513 rc.cpp:5119 rc.cpp:5300 rc.cpp:5370 +#: src/effectslistwidget.cpp:91 rc.cpp:827 rc.cpp:1268 rc.cpp:1610 rc.cpp:2021 +#: rc.cpp:2376 rc.cpp:2817 rc.cpp:3159 rc.cpp:3570 msgid "Audio" msgstr "Audio" -#: rc.cpp:669 rc.cpp:2587 rc.cpp:4066 +#: rc.cpp:785 rc.cpp:2334 msgid "Audio Codecs" msgstr "Kodeki audio" -#: src/mainwindow.cpp:1009 +#: src/mainwindow.cpp:1197 msgid "Audio Only" msgstr "Tylko audio" -#: src/mainwindow.cpp:1019 src/customtrackview.cpp:4985 +#: src/mainwindow.cpp:1207 src/customtrackview.cpp:5548 msgid "Audio and Video" msgstr "Audio i wideo" -#: rc.cpp:1287 rc.cpp:3205 rc.cpp:4684 +#: rc.cpp:1370 rc.cpp:2919 msgid "Audio channels" msgstr "Kanały audio" -#: src/projectitem.cpp:188 src/documentchecker.cpp:89 +#: src/documentchecker.cpp:139 src/projectitem.cpp:165 msgid "Audio clip" msgstr "Klip audio" -#: rc.cpp:1725 rc.cpp:3643 rc.cpp:5122 +#: rc.cpp:830 rc.cpp:2379 msgid "Audio codec" msgstr "Kodek audio" -#: rc.cpp:1254 rc.cpp:3172 rc.cpp:4651 +#: rc.cpp:621 +msgid "Audio correction" +msgstr "Korekcja audio" + +#: rc.cpp:1337 rc.cpp:2886 msgid "Audio device" msgstr "Urządzenie audio" -#: rc.cpp:1158 rc.cpp:3076 rc.cpp:4555 +#: rc.cpp:1082 rc.cpp:2631 msgid "Audio device:" msgstr "Urządzenie audio:" -#: rc.cpp:1155 rc.cpp:3073 rc.cpp:4552 +#: rc.cpp:1079 rc.cpp:2628 msgid "Audio driver:" msgstr "Sterownik audio:" -#: rc.cpp:1041 rc.cpp:2959 rc.cpp:4438 +#: rc.cpp:1487 rc.cpp:3036 msgid "Audio editing" msgstr "Montaż audio" -#: src/clipitem.cpp:872 src/clipitem.cpp:879 -#, c-format +#: src/clipitem.cpp:871 src/clipitem.cpp:880 +#, no-c-format msgid "Audio fade duration: %1s" msgstr "Czas zgłaśniania/ściszania dźwięku: %1s" -#: rc.cpp:1290 rc.cpp:3208 rc.cpp:4687 +#: rc.cpp:1373 rc.cpp:2922 msgid "Audio frequency" msgstr "Częstotliwość audio" -#: rc.cpp:1818 rc.cpp:3736 rc.cpp:5215 +#: rc.cpp:923 rc.cpp:2472 msgid "Audio index" msgstr "Indeks audio" -#: src/renderwidget.cpp:1108 src/customtrackview.cpp:4960 +#: src/renderwidget.cpp:1163 src/customtrackview.cpp:5523 msgid "Audio only" msgstr "Tylko audio" -#: rc.cpp:1068 rc.cpp:2986 rc.cpp:4465 +#: rc.cpp:971 rc.cpp:2520 msgid "Audio track" msgstr "Ścieżka audio" -#: rc.cpp:1446 rc.cpp:3364 rc.cpp:3882 rc.cpp:4843 rc.cpp:5361 +#: rc.cpp:1601 rc.cpp:1886 rc.cpp:3150 rc.cpp:3435 msgid "Audio tracks" msgstr "Ścieżki audio" @@ -669,39 +699,43 @@ msgid "Author:" msgstr "Autor:" -#: src/transitionsettings.cpp:74 rc.cpp:572 rc.cpp:2490 rc.cpp:3969 +#: src/transitionsettings.cpp:78 rc.cpp:1676 rc.cpp:3225 msgid "Auto" msgstr "Auto" -#: rc.cpp:2 rc.cpp:1920 +#: rc.cpp:2 msgid "Auto Mask" msgstr "Auto maska" -#: rc.cpp:678 rc.cpp:2596 rc.cpp:4075 +#: rc.cpp:1442 rc.cpp:2991 msgid "Auto add" msgstr "Dodaj automatycznie" -#: src/mainwindow.cpp:1450 +#: src/mainwindow.cpp:1640 msgid "Auto-saved files exist. Do you want to recover them now?" msgstr "Znaleziono pliki zapisane automatycznie. Czy chcesz je odzyskać?" -#: src/kdenlivesettingsdialog.cpp:214 src/kdenlivesettingsdialog.cpp:233 +#: src/kdenlivesettingsdialog.cpp:218 src/kdenlivesettingsdialog.cpp:237 msgid "Automatic" msgstr "Automatyczny" -#: src/mainwindow.cpp:970 +#: src/mainwindow.cpp:1123 msgid "Automatic Transition" msgstr "Przejście automatyczne" -#: rc.cpp:1227 rc.cpp:3145 rc.cpp:4624 +#: rc.cpp:74 +msgid "Automatic center-crop" +msgstr "Automatycznie wycentruj pojawienie" + +#: rc.cpp:1310 rc.cpp:2859 msgid "Automatically start a new file on scene cut" msgstr "Automatycznie rozpocznij nowy plik przy cięciu sceny" -#: rc.cpp:1125 rc.cpp:3043 rc.cpp:4522 +#: rc.cpp:2030 rc.cpp:3579 msgid "Autoscroll while playing" msgstr "Przewijanie automatyczne podczas odtwarzania" -#: rc.cpp:660 rc.cpp:2578 rc.cpp:4057 +#: rc.cpp:776 rc.cpp:2325 msgid "Available Codecs (avformat)" msgstr "Dostępne kodeki (avformat)" @@ -709,20 +743,27 @@ msgid "Avformat module (FFmpeg)" msgstr "Moduł Avformat (FFmpeg)" -#: rc.cpp:741 rc.cpp:2659 rc.cpp:4138 +#: rc.cpp:992 rc.cpp:2541 msgid "Back to menu" msgstr "Powrót do menu" -#: rc.cpp:744 rc.cpp:747 rc.cpp:1608 rc.cpp:2662 rc.cpp:2665 rc.cpp:3526 -#: rc.cpp:4141 rc.cpp:4144 rc.cpp:5005 +#: rc.cpp:995 rc.cpp:998 rc.cpp:1175 rc.cpp:2544 rc.cpp:2547 rc.cpp:2724 msgid "Background" msgstr "Tło" -#: src/titlewidget.cpp:179 -msgid "Background Transparency" -msgstr "Przezroczystość tła" +#: src/titlewidget.cpp:102 +msgid "Background color opacity" +msgstr "Nieprzezroczystość koloru tła" + +#: src/titlewidget.cpp:305 +msgid "Background opacity" +msgstr "Nieprzezroczystość tła" + +#: rc.cpp:265 +msgid "Balances colors along with 3 points" +msgstr "Balansuje kolory zgodnie z 3 punktami" -#: src/renderwidget.cpp:263 +#: src/renderwidget.cpp:269 msgid "Beginning" msgstr "Początek" @@ -730,62 +771,89 @@ msgid "Bigger tracks" msgstr "Większe ścieżki" -#: src/titlewidget.cpp:144 -msgctxt "Font style" +# properly, it should probably be 'średnia bitowa', but this is rarely used +#: rc.cpp:1430 rc.cpp:2979 +msgid "Bit rate" +msgstr "Bit rate" + +#: src/transitionsettings.cpp:85 msgid "Black" msgstr "Czarny" -#: src/transitionsettings.cpp:78 +#: src/titlewidget.cpp:236 +msgctxt "Font style" msgid "Black" msgstr "Czarny" -#: rc.cpp:46 rc.cpp:1964 +#: rc.cpp:267 +msgid "Black color" +msgstr "Kolor czarny" + +#: rc.cpp:223 +msgid "Black output" +msgstr "Czarne wyjście" + +#: rc.cpp:54 msgid "Blue Screen" msgstr "Niebieski ekran" -#: rc.cpp:16 rc.cpp:1934 +# previously 'Wypal' +#: src/titlewidget.cpp:178 +msgid "Blur" +msgstr "Rozmycie" + +# not 100% sure +#: rc.cpp:627 +msgid "Blur & hide" +msgstr "Rozmycie z ukryciem" + +#: rc.cpp:16 msgid "Blur factor" msgstr "Współczynnik rozmycia" -#: rc.cpp:14 rc.cpp:1932 +#: rc.cpp:14 msgid "Blur image with keyframes" msgstr "Rozmycie obrazu na klatkach kluczowych" -#: src/titlewidget.cpp:143 +#: src/titlewidget.cpp:235 msgctxt "Font style" msgid "Bold" msgstr "Pogrubiony" -#: rc.cpp:1545 rc.cpp:3463 rc.cpp:4942 +#: rc.cpp:1223 rc.cpp:2772 msgid "Border color" msgstr "Kolor krawędzi" -#: src/titlewidget.cpp:174 -msgid "Border transparency" -msgstr "Przezroczystość krawędzi" +#: src/titlewidget.cpp:132 src/titlewidget.cpp:300 +msgid "Border opacity" +msgstr "Nieprzezroczystość krawędzi" + +#: src/titlewidget.cpp:138 +msgid "Border width" +msgstr "Szerokość krawędzi" -#: src/geometryval.cpp:102 rc.cpp:70 rc.cpp:1988 +#: src/geometryval.cpp:103 rc.cpp:70 msgid "Bottom" msgstr "Dół" # better translation possible -#: rc.cpp:12 rc.cpp:1930 +#: rc.cpp:12 msgid "Box Blur" msgstr "Rozmycie typu box" -#: rc.cpp:138 rc.cpp:142 rc.cpp:175 rc.cpp:2056 rc.cpp:2060 rc.cpp:2093 +#: rc.cpp:140 rc.cpp:144 rc.cpp:209 msgid "Brightness" msgstr "Jasność" -#: rc.cpp:22 rc.cpp:1940 +#: rc.cpp:22 msgid "Brightness (keyframable)" msgstr "Jasność (na klatkach kluczowych)" -#: src/trackview.cpp:559 +#: src/trackview.cpp:613 msgid "Broken clip producer %1" msgstr "Uszkodzony producent klipu %1" -#: rc.cpp:1311 rc.cpp:1320 rc.cpp:3229 rc.cpp:3238 rc.cpp:4708 rc.cpp:4717 +#: rc.cpp:1394 rc.cpp:1403 rc.cpp:2943 rc.cpp:2952 msgid "Buffer" msgstr "Bufor" @@ -793,7 +861,7 @@ msgid "Bug fixing, etc." msgstr "Poprawki błędów itp." -#: rc.cpp:960 rc.cpp:2878 rc.cpp:4357 +#: rc.cpp:1787 rc.cpp:3336 msgid "Burn" msgstr "Wypal" @@ -801,150 +869,163 @@ msgid "Burn with %1" msgstr "Wypal z %1" -#: rc.cpp:726 rc.cpp:2644 rc.cpp:4123 +#: rc.cpp:977 rc.cpp:2526 msgid "Button" msgstr "Przycisk" -#: rc.cpp:1182 rc.cpp:3100 rc.cpp:4579 +#: rc.cpp:2123 rc.cpp:3672 msgid "Button 1" msgstr "Przycisk 1" -#: rc.cpp:1185 rc.cpp:3103 rc.cpp:4582 +#: rc.cpp:2126 rc.cpp:3675 msgid "Button 2" msgstr "Przycisk 2" -#: rc.cpp:1188 rc.cpp:3106 rc.cpp:4585 +#: rc.cpp:2129 rc.cpp:3678 msgid "Button 3" msgstr "Przycisk 3" -#: rc.cpp:1191 rc.cpp:3109 rc.cpp:4588 +#: rc.cpp:2132 rc.cpp:3681 msgid "Button 4" msgstr "Przycisk 4" -#: rc.cpp:1194 rc.cpp:3112 rc.cpp:4591 +#: rc.cpp:2135 rc.cpp:3684 msgid "Button 5" msgstr "Przycisk 5" -#: rc.cpp:738 rc.cpp:2656 rc.cpp:4135 +#: rc.cpp:989 rc.cpp:2538 msgid "Button colors" msgstr "Kolory przycisku" -#: rc.cpp:810 rc.cpp:2728 rc.cpp:4207 +# or 'Zachodzenie przycisków na siebie', but that's too long +#: src/dvdwizardmenu.cpp:150 +msgid "Buttons overlapping" +msgstr "Zachodzenie przycisków" + +#: rc.cpp:703 rc.cpp:2252 msgid "C" msgstr "C" -#: src/customtrackview.cpp:1531 +#: src/customtrackview.cpp:1711 msgid "Cannot add a video effect to this clip" msgstr "Nie można dodać efektu wideo do tego klipu" -#: src/customtrackview.cpp:1525 +#: src/customtrackview.cpp:1705 msgid "Cannot add an audio effect to this clip" msgstr "Nie można dodać efektu audio do tego klipu" -#: src/customtrackview.cpp:978 src/customtrackview.cpp:1007 -#: src/customtrackview.cpp:1796 src/customtrackview.cpp:1822 -#: src/customtrackview.cpp:1848 src/customtrackview.cpp:1872 +#: src/customtrackview.cpp:1098 src/customtrackview.cpp:1131 +#: src/customtrackview.cpp:2015 src/customtrackview.cpp:2041 +#: src/customtrackview.cpp:2067 src/customtrackview.cpp:2091 msgid "Cannot add transition" msgstr "Nie można dodać przejścia" -#: src/customtrackview.cpp:4941 src/customtrackview.cpp:4966 -#: src/customtrackview.cpp:4991 +#: src/customtrackview.cpp:5504 src/customtrackview.cpp:5529 +#: src/customtrackview.cpp:5554 msgid "Cannot change grouped clips" msgstr "Nie można zmienić grupy klipów" -#: src/customtrackview.cpp:864 src/customtrackview.cpp:3237 +#: src/customtrackview.cpp:980 src/customtrackview.cpp:3710 msgid "Cannot cut a clip in a group" msgstr "Nie można ciąć klipu w grupie" -#: src/customtrackview.cpp:859 +#: src/customtrackview.cpp:975 msgid "Cannot cut a transition" msgstr "Nie można ciąć przejścia" -#: src/customtrackview.cpp:3214 +#: src/customtrackview.cpp:3683 msgid "Cannot find clip for speed change" msgstr "Nie znaleziono klipu do zmiany prędkości" -#: src/customtrackview.cpp:1428 +#: src/customtrackview.cpp:1599 msgid "Cannot find clip to add effect" msgstr "Nie znaleziono klipu do dodania efektu" -#: src/mainwindow.cpp:2025 +#: src/mainwindow.cpp:2223 msgid "Cannot find clip to add marker" msgstr "Nie znaleziono klipu do dodania znacznika" -#: src/customtrackview.cpp:1676 +#: src/customtrackview.cpp:1888 msgid "Cannot find clip to cut" msgstr "Nie znaleziono klipu do cięcia" -#: src/mainwindow.cpp:2053 src/mainwindow.cpp:2080 src/mainwindow.cpp:2103 +#: src/mainwindow.cpp:2251 src/mainwindow.cpp:2278 src/mainwindow.cpp:2301 msgid "Cannot find clip to remove marker" msgstr "Nie znaleziono klipu do usunięcia znacznika" -#: src/customtrackview.cpp:1725 +#: src/customtrackview.cpp:1940 msgid "Cannot find clip to uncut" msgstr "Nie znaleziono klipu do cofnięcią cięcia" -#: src/customtrackview.cpp:1226 +#: src/customtrackview.cpp:1354 msgid "Cannot find clip with keyframe" msgstr "Nie znaleziono klipu z klatką kluczową" -#: src/mainwindow.cpp:1572 src/renderwidget.cpp:618 +#: src/renderwidget.cpp:651 src/mainwindow.cpp:1763 msgid "Cannot find the melt program required for rendering (part of Mlt)" msgstr "Nie znaleziono programu melt wymaganego do renderowania (część Mlt)" -#: src/mainwindow.cpp:1557 +#: src/mainwindow.cpp:1748 msgid "Cannot find your Mlt profiles, please give the path" msgstr "Nie znaleziono twojego profilu Mlt, podaj ścieżkę dostępu" -#: src/customtrackview.cpp:1984 +#: src/customtrackview.cpp:1419 src/customtrackview.cpp:2211 msgid "Cannot insert clip in timeline" msgstr "Nie można wstawić klipu na linię czasu" -#: src/customtrackview.cpp:2338 +#: src/customtrackview.cpp:2721 msgid "Cannot insert space in a track with a group" msgstr "Nie można wstawić odstępu na ścieżce z grupą" -#: src/customtrackview.cpp:2392 +#: src/customtrackview.cpp:2775 msgid "Cannot move clip at position %1, track %2" msgstr "Nie można przenieść klipu na pozycię %1, ścieżka %2" -#: src/customtrackview.cpp:3480 src/customtrackview.cpp:3686 +#: src/customtrackview.cpp:3959 src/customtrackview.cpp:4164 msgid "Cannot move clip at time: %1 on track %2" msgstr "Nie można przenieść klipu na czas %1 na ścieżce %2" -#: src/customtrackview.cpp:2683 src/customtrackview.cpp:3516 +#: src/customtrackview.cpp:3103 src/customtrackview.cpp:3995 msgid "Cannot move clip to position %1" msgstr "Nie można przenieść klipu do pozycji %1" -#: src/customtrackview.cpp:1643 +#: src/customtrackview.cpp:1855 msgid "Cannot move effect" msgstr "Nie można przenieść efektu" -#: src/customtrackview.cpp:2691 +#: src/customtrackview.cpp:3112 msgid "Cannot move transition" msgstr "Nie można przenieść przejścia" -#: src/customtrackview.cpp:2407 +#: src/customtrackview.cpp:2790 msgid "Cannot move transition at position %1, track %2" msgstr "Nie można przenieść przejścia na pozycję %1, ścieżka %2" -#: src/customtrackview.cpp:3638 +#: src/customtrackview.cpp:4115 msgid "Cannot move transition at time: %1 on track %2" msgstr "Nie można przenieść przejścia na czas: %1 na ściezce %2" -#: src/customtrackview.cpp:4370 +#: src/mainwindow.cpp:1680 +msgid "" +"Cannot open file %1.\n" +"Project is corrupted." +msgstr "" +"Nie można otworzyć pliku %1.\n" +"Projekt jest uszkodzony." + +#: src/customtrackview.cpp:4868 msgid "Cannot paste clip to selected place" msgstr "Nie można wkleić klipu w wybrane miejsce" -#: src/customtrackview.cpp:4342 src/customtrackview.cpp:4354 +#: src/customtrackview.cpp:4840 src/customtrackview.cpp:4852 msgid "Cannot paste selected clips" msgstr "Nie można wkleić wybranych klipów" -#: src/customtrackview.cpp:4381 +#: src/customtrackview.cpp:4882 msgid "Cannot paste transition to selected place" msgstr "Nie można wkleić przejścia w wybrane miejsce" -#: src/renderwidget.cpp:622 +#: src/renderwidget.cpp:655 msgid "" "Cannot play video after rendering because the default video player " "application is not set.\n" @@ -954,7 +1035,7 @@ "nie jest ustawiona.\n" "Ustaw domyślną aplikację w ustawieniach Kdenlive." -#: src/recmonitor.cpp:268 +#: src/recmonitor.cpp:270 msgid "" "Cannot read from device %1\n" "Please check drivers and access rights." @@ -962,37 +1043,41 @@ "Nie można czytać z urządzenia %1\n" "Sprawdź sterowniki i prawa dostępu" -#: src/customtrackview.cpp:2291 +#: src/customtrackview.cpp:2674 msgid "Cannot remove space in a track with a group" msgstr "Nie można usunąć odstępu w ścieżce z grupą" -#: src/customtrackview.cpp:2865 src/customtrackview.cpp:2957 +#: src/customtrackview.cpp:3298 src/customtrackview.cpp:3390 msgid "Cannot resize transition" msgstr "Nie można zmienić rozmiaru przejścia" -#: src/customtrackview.cpp:4843 +#: src/customtrackview.cpp:5406 msgid "Cannot split audio of grouped clips" msgstr "Nie można dzielić audio w grupie klipów" -#: src/customtrackview.cpp:2083 src/customtrackview.cpp:2155 -#: src/customtrackview.cpp:3368 src/customtrackview.cpp:4886 -#: src/customtrackview.cpp:4889 src/customtrackview.cpp:4915 -#: src/customtrackview.cpp:5013 src/customtrackview.cpp:5020 -#: src/customtrackview.cpp:5027 +#: src/customtrackview.cpp:2463 src/customtrackview.cpp:2535 +#: src/customtrackview.cpp:3841 src/customtrackview.cpp:5449 +#: src/customtrackview.cpp:5452 src/customtrackview.cpp:5478 +#: src/customtrackview.cpp:5576 src/customtrackview.cpp:5583 +#: src/customtrackview.cpp:5590 msgid "Cannot update clip (time: %1, track: %2)" msgstr "Nie można uaktualnić klipu (czas: %1, ścieżka %2)" -#: src/customtrackview.cpp:799 +#: src/customtrackview.cpp:900 +msgid "Cannot use spacer in a locked track" +msgstr "Nie można użyć narzędzia odstępów na zablokowanej ścieżce" + +#: src/customtrackview.cpp:910 msgid "Cannot use spacer in a track with a group" msgstr "Nie można użyć narzędzia odstępów na ścieżce z grupą" -#: src/kdenlivedoc.cpp:568 src/kdenlivedoc.cpp:574 src/titlewidget.cpp:1464 +#: src/renderwidget.cpp:422 src/renderwidget.cpp:539 src/renderwidget.cpp:545 +#: src/renderwidget.cpp:605 src/renderwidget.cpp:784 src/renderwidget.cpp:796 +#: src/renderwidget.cpp:1705 src/renderwidget.cpp:1728 #: src/profilesdialog.cpp:166 src/profilesdialog.cpp:172 -#: src/profilesdialog.cpp:439 src/profilesdialog.cpp:445 -#: src/renderwidget.cpp:399 src/renderwidget.cpp:499 src/renderwidget.cpp:505 -#: src/renderwidget.cpp:565 src/renderwidget.cpp:751 src/renderwidget.cpp:763 -#: src/renderwidget.cpp:1633 src/renderwidget.cpp:1656 src/dvdwizard.cpp:682 -#: src/dvdwizard.cpp:688 +#: src/profilesdialog.cpp:439 src/profilesdialog.cpp:445 src/dvdwizard.cpp:701 +#: src/dvdwizard.cpp:707 src/kdenlivedoc.cpp:486 src/kdenlivedoc.cpp:575 +#: src/kdenlivedoc.cpp:581 src/titlewidget.cpp:1777 msgid "Cannot write to file %1" msgstr "Nie można pisać do pliku %1" @@ -1000,23 +1085,23 @@ msgid "Capture" msgstr "Przechwytywanie" -#: rc.cpp:1284 rc.cpp:3202 rc.cpp:4681 +#: rc.cpp:1367 rc.cpp:2916 msgid "Capture audio" msgstr "Przechwytywanie audio" -#: src/recmonitor.cpp:586 +#: src/recmonitor.cpp:591 msgid "Capture crashed, please check your parameters" msgstr "Przechwytywanie nie powiodło się, sprawdź parametry" -#: rc.cpp:1233 rc.cpp:3151 rc.cpp:4630 +#: rc.cpp:1316 rc.cpp:2865 msgid "Capture file name" msgstr "Nazwa przechwyconego pliku" -#: rc.cpp:1029 rc.cpp:2947 rc.cpp:4426 +#: rc.cpp:1475 rc.cpp:3024 msgid "Capture folder" msgstr "Katalog przechwytywania" -#: rc.cpp:1212 rc.cpp:3130 rc.cpp:4609 +#: rc.cpp:1295 rc.cpp:2844 msgid "Capture format" msgstr "Format przechwytywania" @@ -1024,40 +1109,39 @@ msgid "Capture is not yet available on OS X." msgstr "Przechwytywanie nie jest jeszcze dostępne na OS X." -#: rc.cpp:1257 rc.cpp:3175 rc.cpp:4654 +#: rc.cpp:1340 rc.cpp:2889 msgid "Capture params" msgstr "Parametry przechwytywania" -#: rc.cpp:1506 rc.cpp:3424 rc.cpp:4903 +#: rc.cpp:2069 rc.cpp:3618 msgid "Captured files" msgstr "Przechwycone pliki" -#: src/recmonitor.cpp:167 src/recmonitor.cpp:168 +#: src/recmonitor.cpp:168 src/recmonitor.cpp:169 msgid "Capturing" msgstr "Przechwytywanie" -#: src/geometryval.cpp:96 +#: src/geometryval.cpp:97 msgid "Center" msgstr "Środek" -#: rc.cpp:411 rc.cpp:2329 +#: rc.cpp:479 msgid "Center Frequency" msgstr "Wycentruj częstotliwość" -#: rc.cpp:171 rc.cpp:2089 +#: rc.cpp:205 msgid "Center correction" msgstr "Wycentruj poprawkę" -#: rc.cpp:1038 rc.cpp:1044 rc.cpp:1050 rc.cpp:2956 rc.cpp:2962 rc.cpp:2968 -#: rc.cpp:4435 rc.cpp:4441 rc.cpp:4447 +#: rc.cpp:1484 rc.cpp:1490 rc.cpp:1496 rc.cpp:3033 rc.cpp:3039 rc.cpp:3045 msgid "Change" msgstr "Zmień" -#: src/mainwindow.cpp:1047 +#: src/mainwindow.cpp:1235 msgid "Change Track" msgstr "Zmień ścieżkę" -#: src/customtrackview.cpp:4664 src/headertrack.cpp:84 +#: src/headertrack.cpp:90 src/customtrackview.cpp:5226 msgid "Change Track Type" msgstr "Zmień typ ścieżki" @@ -1065,15 +1149,15 @@ msgid "Change clip type" msgstr "Zmień typ klipu" -#: rc.cpp:227 rc.cpp:2145 +#: rc.cpp:311 msgid "Change gamma color value" msgstr "Zmień wartość gamma koloru" -#: rc.cpp:24 rc.cpp:1942 +#: rc.cpp:24 msgid "Change image brightness with keyframes" msgstr "Zmień jasność obrazu na klatkach kluczowych" -#: src/customtrackview.cpp:4659 +#: src/customtrackview.cpp:5221 msgid "Change track" msgstr "Zmień ścieżkę" @@ -1081,7 +1165,7 @@ msgid "Change track type" msgstr "Zmień typ ścieżki" -#: src/projectsettings.cpp:144 +#: src/projectsettings.cpp:186 msgid "" "Changing the profile of your project cannot be undone.\n" "It is recommended to save your project before attempting this operation that " @@ -1093,47 +1177,27 @@ "może ona uszkodzić przejścia.\n" " Czy na pewno chcesz kontynuować?" -#: rc.cpp:395 rc.cpp:2313 -msgid "Channel 1" -msgstr "Kanał 1" - -#: rc.cpp:397 rc.cpp:2315 -msgid "Channel 2" -msgstr "Kanał 2" - -#: rc.cpp:399 rc.cpp:2317 -msgid "Channel 3" -msgstr "Kanał 3" - -#: rc.cpp:401 rc.cpp:2319 -msgid "Channel 4" -msgstr "Kanał 4" - -#: rc.cpp:403 rc.cpp:2321 -msgid "Channel 5" -msgstr "Kanał 5" - -#: rc.cpp:405 rc.cpp:2323 -msgid "Channel 6" -msgstr "Kanał 6" +#: rc.cpp:161 rc.cpp:215 +msgid "Channel" +msgstr "Kanał " -#: rc.cpp:1728 rc.cpp:3646 rc.cpp:5125 +#: rc.cpp:833 rc.cpp:2382 msgid "Channels" -msgstr "Kanał 7" +msgstr "Kanał y" -#: rc.cpp:32 rc.cpp:1950 +#: rc.cpp:32 msgid "Charcoal" msgstr "Węgiel" -#: rc.cpp:34 rc.cpp:1952 +#: rc.cpp:34 msgid "Charcoal drawing effect" msgstr "Efekt rysowania węglem" -#: src/kdenlivedoc.cpp:134 +#: src/kdenlivedoc.cpp:137 msgid "Check missing clips" -msgstr "Sprawdź brakujące klpiy" +msgstr "Sprawdzanie brakujących klipów" -#: rc.cpp:672 rc.cpp:2590 rc.cpp:4069 +#: rc.cpp:1763 rc.cpp:3312 msgid "CheckBox" msgstr "CheckBox" @@ -1145,174 +1209,184 @@ msgid "Checking system" msgstr "Sprawdzanie systemu" -#: rc.cpp:54 rc.cpp:1972 +#: rc.cpp:46 msgid "Chroma Hold" msgstr "Utrzymanie chrominacji" -#: rc.cpp:387 rc.cpp:2305 +#: rc.cpp:471 msgid "Chrominance U" msgstr "Chrominacja U" -#: rc.cpp:389 rc.cpp:2307 +#: rc.cpp:473 msgid "Chrominance V" msgstr "Chrominacja V" -#: src/mainwindow.cpp:214 +#: src/mainwindow.cpp:224 msgid "Clean" msgstr "Wyczyść" -#: src/mainwindow.cpp:856 +#: src/mainwindow.cpp:974 msgid "Clean Project" msgstr "Wyczyść projekt" -#: rc.cpp:635 rc.cpp:2553 rc.cpp:4032 +#: rc.cpp:1742 rc.cpp:3291 msgid "Clean Up" msgstr "Uprzątnij" -#: src/mainwindow.cpp:1709 +#: src/mainwindow.cpp:1898 src/projectsettings.cpp:103 msgid "Clean up project" msgstr "Wyczyść cały projekt" -#: rc.cpp:840 rc.cpp:2758 rc.cpp:3909 rc.cpp:4237 rc.cpp:5388 +#: rc.cpp:1628 rc.cpp:3177 msgid "Clear cache" msgstr "Wyczyść pamięć podręczną (cache)" -#: src/mainwindow.cpp:2435 +#: src/mainwindow.cpp:2728 msgid "Click on a clip to cut it" msgstr "Kliknij na klipie aby go przeciąć" -#: rc.cpp:5430 +#: src/projectlistview.cpp:49 rc.cpp:3750 msgid "Clip" msgstr "Klip" -#: src/kdenlivedoc.cpp:877 src/kdenlivedoc.cpp:885 +#: src/kdenlivedoc.cpp:884 src/kdenlivedoc.cpp:892 msgid "Clip %1
is invalid or missing, what do you want to do?" msgstr "" "Klip %1
jest nieprawidłowy lub nie istnieje, co chesz zrobić?" -#: src/kdenlivedoc.cpp:874 +#: src/kdenlivedoc.cpp:881 msgid "Clip %1
is invalid, what do you want to do?" msgstr "Klip %1
jest nieprawidłowy, co chcesz zrobić?" -#: src/projectlist.cpp:701 +#: src/projectlist.cpp:960 msgid "Clip %1
is invalid, will be removed from project." msgstr "Klip %1
jest nieprawidłowy i zostanie usunięty z projektu." -#: src/projectlist.cpp:703 +#: src/projectlist.cpp:962 msgid "Clip %1
is missing or invalid. Remove it from project?" msgstr "" "Klip %1
jest nieprawidłowy lub nie istnieje. Usunąć go z projektu?" -#: rc.cpp:1674 rc.cpp:3592 rc.cpp:5071 +#: rc.cpp:2162 rc.cpp:3711 msgid "Clip Color" msgstr "Kolor klipu" -#: src/mainwindow.cpp:186 +#: src/mainwindow.cpp:196 msgid "Clip Monitor" msgstr "Monitor klipu" -#: src/mainwindow.cpp:1145 rc.cpp:1683 rc.cpp:3601 rc.cpp:5080 +#: src/mainwindow.cpp:1333 rc.cpp:788 rc.cpp:2337 msgid "Clip Properties" msgstr "Właściwości klipu" -#: rc.cpp:193 rc.cpp:2111 +#: rc.cpp:247 msgid "Clip bottom" msgstr "Klip w dół" -#: rc.cpp:1831 rc.cpp:3749 rc.cpp:5228 -msgid "Clip duration" -msgstr "Czas trwania klipu" - -#: src/clipitem.cpp:882 -#, c-format +#: src/clipitem.cpp:884 +#, no-c-format msgid "Clip duration: %1s" msgstr "Czas trwania klipu: %1s" -#: src/customtrackview.cpp:3956 +#: src/customtrackview.cpp:4435 msgid "Clip has no markers" msgstr "Klip nie ma znaczników" -#: rc.cpp:187 rc.cpp:2105 +#: rc.cpp:241 msgid "Clip left" msgstr "Klip w lewo" -#: rc.cpp:189 rc.cpp:2107 +#: rc.cpp:243 msgid "Clip right" msgstr "Klip w prawo" -#: rc.cpp:1824 rc.cpp:3742 rc.cpp:5221 -msgid "Clip speed" -msgstr "Prędkość klipu" - -#: rc.cpp:191 rc.cpp:2109 +#: rc.cpp:245 msgid "Clip top" msgstr "Klip w górę" -#: src/documentchecker.cpp:145 +#: src/documentchecker.cpp:227 msgid "Clips folder" msgstr "Katalog klipów" -#: rc.cpp:828 rc.cpp:2746 rc.cpp:3897 rc.cpp:4225 rc.cpp:5376 +#: rc.cpp:1616 rc.cpp:3165 msgid "Clips used in project:" msgstr "Klipy używane w projekcie" -#: src/titlewidget.cpp:335 +#: src/titlewidget.cpp:481 msgid "Clone" msgstr "Klonuj" -#: src/cliptranscode.cpp:137 rc.cpp:611 rc.cpp:626 rc.cpp:650 rc.cpp:2529 -#: rc.cpp:2544 rc.cpp:2568 rc.cpp:4008 rc.cpp:4023 rc.cpp:4047 +#: src/cliptranscode.cpp:143 rc.cpp:1715 rc.cpp:1733 rc.cpp:1760 rc.cpp:3264 +#: rc.cpp:3282 rc.cpp:3309 msgid "Close" msgstr "Zamknij" -#: src/statusbarmessagelabel.cpp:53 +#: src/statusbarmessagelabel.cpp:54 msgctxt "@action:button" msgid "Close" msgstr "Zamknij" -#: rc.cpp:864 rc.cpp:2782 rc.cpp:4261 +#: rc.cpp:1067 rc.cpp:2616 msgid "Close after transcode" msgstr "Zamknij po przekodowaniu" -#: src/mainwindow.cpp:136 +#: src/mainwindow.cpp:146 msgid "Close the current tab" msgstr "Zamknij aktualną zakładkę" -#: rc.cpp:285 rc.cpp:2203 +#: rc.cpp:363 msgid "Co-efficient" msgstr "Współczynnik" -#: rc.cpp:750 rc.cpp:1734 rc.cpp:1737 rc.cpp:2668 rc.cpp:3652 rc.cpp:3655 -#: rc.cpp:4147 rc.cpp:5131 rc.cpp:5134 +#: rc.cpp:839 rc.cpp:842 rc.cpp:1001 rc.cpp:1157 rc.cpp:2388 rc.cpp:2391 +#: rc.cpp:2550 rc.cpp:2706 msgid "Color" msgstr "Kolor" -#: src/projectlist.cpp:720 +#: src/projectlist.cpp:979 src/projectlist.cpp:980 msgid "Color Clip" msgstr "Klip koloru" -#: rc.cpp:144 rc.cpp:2062 +# not sure +#: rc.cpp:146 msgid "Color Distance" -msgstr "Długość koloru" +msgstr "Negatyw" -#: src/projectitem.cpp:197 +#: src/projectitem.cpp:174 msgid "Color clip" msgstr "Klip koloru" -#: rc.cpp:1395 rc.cpp:3313 rc.cpp:4792 +#: rc.cpp:1835 rc.cpp:3384 msgid "Color clips" msgstr "Klipy kolorów" -#: rc.cpp:50 rc.cpp:58 rc.cpp:1968 rc.cpp:1976 +# wtf is this??? +#: rc.cpp:159 +msgid "Color curves adjustment" +msgstr "Dostosuj krzywe kolorów" + +#: rc.cpp:50 rc.cpp:58 msgid "Color key" msgstr "Kolor kluczowy" -#: src/projectlistview.cpp:71 +#: src/titlewidget.cpp:126 +msgid "Color opacity" +msgstr "Nieprzezroczystość koloru" + +#: rc.cpp:617 +msgid "Colour" +msgstr "Kolor" + +#: rc.cpp:615 +msgid "Colour correction" +msgstr "Korekcja barw" + +#: src/projectlistview.cpp:73 msgctxt "@title:menu" msgid "Columns" msgstr "Kolumny" -#: rc.cpp:1464 rc.cpp:1785 rc.cpp:3382 rc.cpp:3703 rc.cpp:4861 rc.cpp:5182 +#: rc.cpp:890 rc.cpp:1037 rc.cpp:2439 rc.cpp:2586 msgid "Comment" msgstr "Komentarz" @@ -1320,23 +1394,23 @@ msgid "Config Wizard" msgstr "Kreator konfiguracji" -#: src/recmonitor.cpp:89 +#: src/recmonitor.cpp:90 msgid "Configure" msgstr "Konfiguracja" -#: src/projectsettings.cpp:144 +#: src/projectsettings.cpp:186 msgid "Confirm profile change" msgstr "Potwierdź zmianę profilu" -#: src/recmonitor.cpp:68 src/recmonitor.cpp:574 +#: src/recmonitor.cpp:69 src/recmonitor.cpp:579 msgid "Connect" msgstr "Połącz" -#: rc.cpp:153 rc.cpp:2071 +#: rc.cpp:155 msgid "Contrast" msgstr "Kontrast" -#: rc.cpp:149 rc.cpp:2067 +#: rc.cpp:151 msgid "Contrast0r" msgstr "Contrast0r" @@ -1349,7 +1423,11 @@ "\"http://en.wikipedia.org/wiki/Control_character\">Wikipedia:" "Control_character (ang.)" -#: rc.cpp:30 rc.cpp:1948 +#: src/renderwidget.cpp:85 +msgid "Copy profile to favorites" +msgstr "Skopiuj profil do ulubionych" + +#: rc.cpp:30 msgid "Copy the left channel to the right" msgstr "Skopiuj lewy kanał do prawego" @@ -1357,7 +1435,8 @@ msgid "Copyright (c) 2009 Development team" msgstr "Copyright (c) 2009 Zespół kdenlive" -#: src/renderer.cpp:1113 src/renderer.cpp:1183 +# is it need to be updated? +#: src/renderer.cpp:1142 msgid "" "Could not create the video preview window.\n" "There is something wrong with your Kdenlive install or your driver settings, " @@ -1367,11 +1446,11 @@ "Może to być spowodowane błędną instalacją Kdenlive lub nieprawidłowymi " "ustawieniami sterownika. Sprawdź konfigurację i/lub przeinstaluj Kdenlive." -#: rc.cpp:321 rc.cpp:2239 +#: rc.cpp:405 msgid "Crackle" msgstr "Trzeszczenie" -#: rc.cpp:1386 rc.cpp:3304 rc.cpp:4783 +#: rc.cpp:1826 rc.cpp:3375 msgid "Crash recovery (automatic backup)" msgstr "Odzyskiwanie po awarii (automatyczne kopie zapasowe)" @@ -1379,27 +1458,27 @@ msgid "Create DVD Menu" msgstr "Utwórz menu DVD" -#: src/mainwindow.cpp:1141 +#: src/mainwindow.cpp:1329 msgid "Create Folder" msgstr "Utwórz katalog" -#: rc.cpp:963 rc.cpp:2881 rc.cpp:4360 +#: rc.cpp:1790 rc.cpp:3339 msgid "Create ISO image" msgstr "Utwórz obraz ISO" -#: src/mainwindow.cpp:2790 +#: src/mainwindow.cpp:3099 msgid "Create Render Script" msgstr "Utwórz skrypt renderowania" -#: rc.cpp:711 rc.cpp:2629 rc.cpp:4108 +#: rc.cpp:974 rc.cpp:2523 msgid "Create basic menu" msgstr "Utwórz podstawowe menu" -#: rc.cpp:617 rc.cpp:2535 rc.cpp:4014 +#: rc.cpp:1721 rc.cpp:3270 msgid "Create chapter file based on guides" msgstr "Utwórz rozdział bazując na wskaźnikach" -#: src/profilesdialog.cpp:46 src/renderwidget.cpp:79 +#: src/renderwidget.cpp:79 src/profilesdialog.cpp:46 msgid "Create new profile" msgstr "Utwórz nowy profil" @@ -1407,83 +1486,98 @@ msgid "Creating DVD Image" msgstr "Tworznie obrazu DVD" -#: rc.cpp:948 rc.cpp:2866 rc.cpp:4345 +#: rc.cpp:1775 rc.cpp:3324 msgid "Creating dvd structure" msgstr "Tworzenie struktury DVD" -#: rc.cpp:951 rc.cpp:2869 rc.cpp:4348 +#: rc.cpp:1778 rc.cpp:3327 msgid "Creating iso file" msgstr "Tworzenie pliku ISO" -#: rc.cpp:942 rc.cpp:2860 rc.cpp:4339 +#: rc.cpp:1769 rc.cpp:3318 msgid "Creating menu background" msgstr "Tworzenie tła menu" -#: rc.cpp:939 rc.cpp:2857 rc.cpp:4336 +#: rc.cpp:1766 rc.cpp:3315 msgid "Creating menu images" msgstr "Tworzenie obrazów menu" -#: rc.cpp:945 rc.cpp:2863 rc.cpp:4342 +#: rc.cpp:1772 rc.cpp:3321 msgid "Creating menu movie" msgstr "Tworzenie filmu do menu" -#: src/kthumb.cpp:404 src/kthumb.cpp:409 +#: src/kthumb.cpp:411 src/kthumb.cpp:416 msgid "Creating thumbnail for %1" msgstr "Tworzenie miniatury dla %1" -#: rc.cpp:62 rc.cpp:1980 +#: rc.cpp:62 msgid "Crop" msgstr "Przytnij" +#: rc.cpp:619 +msgid "Crop & scale" +msgstr "Przycinanie i skalowanie" + +#: rc.cpp:751 rc.cpp:2300 +msgid "Crop end" +msgstr "Koniec przycięcia" + #: src/clipitem.cpp:875 -#, c-format +#, no-c-format msgid "Crop from start: %1s" msgstr "Przytnij od początku: %1s" -#: rc.cpp:1086 rc.cpp:3004 rc.cpp:4483 +#: rc.cpp:727 rc.cpp:2276 msgid "Crop start" msgstr "Początek przycięcia" -#: src/mainwindow.cpp:2432 +#: src/mainwindow.cpp:2725 msgid "Ctrl + click to use spacer on current track only" msgstr "" "Ctrl + kliknięcie aby użyć narzędzia odstępów tylko na bieżącej ścieżce" -#: src/geometryval.cpp:92 src/renderwidget.cpp:328 src/renderwidget.cpp:360 -#: src/renderwidget.cpp:431 src/renderwidget.cpp:467 src/renderwidget.cpp:1183 -#: src/renderwidget.cpp:1228 src/renderwidget.cpp:1308 rc.cpp:1906 rc.cpp:3824 -#: rc.cpp:5303 +#: rc.cpp:167 +msgid "Curve point number" +msgstr "Numer punktu krzywej" + +#: rc.cpp:157 +msgid "Curves" +msgstr "Krzywe" + +#: src/renderwidget.cpp:338 src/renderwidget.cpp:348 src/renderwidget.cpp:441 +#: src/renderwidget.cpp:471 src/renderwidget.cpp:507 src/renderwidget.cpp:1239 +#: src/renderwidget.cpp:1284 src/renderwidget.cpp:1364 +#: src/effectslistwidget.cpp:95 src/geometryval.cpp:93 rc.cpp:1271 rc.cpp:2820 msgid "Custom" msgstr "Własny" -#: src/kdenlivesettingsdialog.cpp:111 +#: src/kdenlivesettingsdialog.cpp:115 msgid "Cut" msgstr "Wytnij" -#: src/mainwindow.cpp:984 +#: src/mainwindow.cpp:1172 msgid "Cut Clip" msgstr "Wytnij klip" -#: rc.cpp:566 rc.cpp:702 rc.cpp:717 rc.cpp:816 rc.cpp:930 rc.cpp:1794 -#: rc.cpp:2484 rc.cpp:2620 rc.cpp:2635 rc.cpp:2734 rc.cpp:2848 rc.cpp:3712 -#: rc.cpp:3831 rc.cpp:3963 rc.cpp:4099 rc.cpp:4114 rc.cpp:4213 rc.cpp:4327 -#: rc.cpp:5191 rc.cpp:5310 +#: rc.cpp:709 rc.cpp:899 rc.cpp:953 rc.cpp:1016 rc.cpp:1511 rc.cpp:1670 +#: rc.cpp:2087 rc.cpp:2258 rc.cpp:2448 rc.cpp:2502 rc.cpp:2565 rc.cpp:3060 +#: rc.cpp:3219 rc.cpp:3636 msgid "D" msgstr "D" -#: rc.cpp:1479 rc.cpp:3397 rc.cpp:4876 +#: rc.cpp:1958 rc.cpp:3507 msgid "DV" msgstr "DV" -#: rc.cpp:1218 rc.cpp:3136 rc.cpp:4615 +#: rc.cpp:1301 rc.cpp:2850 msgid "DV AVI type 1" msgstr "DV AVI typ 1" -#: rc.cpp:1221 rc.cpp:3139 rc.cpp:4618 +#: rc.cpp:1304 rc.cpp:2853 msgid "DV AVI type 2" msgstr "DV AVI typ 2" -#: rc.cpp:1215 rc.cpp:3133 rc.cpp:4612 +#: rc.cpp:1298 rc.cpp:2847 msgid "DV Raw" msgstr "DV Raw" @@ -1491,7 +1585,7 @@ msgid "DV module (libdv)" msgstr "Moduł DV (libdv)" -#: src/renderwidget.cpp:1107 +#: src/renderwidget.cpp:1162 msgid "DVD" msgstr "DVD" @@ -1499,35 +1593,35 @@ msgid "DVD Chapters" msgstr "Rozdziały DVD" -#: rc.cpp:972 rc.cpp:2890 rc.cpp:4369 +#: rc.cpp:1799 rc.cpp:3348 msgid "DVD ISO image" msgstr "Obraz ISO DVD" -#: src/dvdwizard.cpp:587 +#: src/dvdwizard.cpp:608 msgid "DVD ISO image %1 successfully created." msgstr "Obraz ISO DVD %1 pomyślnie utworzony." -#: src/dvdwizard.cpp:574 +#: src/dvdwizard.cpp:595 msgid "DVD ISO is broken" msgstr "Obraz ISO DVD jest uszkodzony" -#: src/mainwindow.cpp:878 src/dvdwizard.cpp:47 +#: src/dvdwizard.cpp:47 src/mainwindow.cpp:996 msgid "DVD Wizard" msgstr "Kreator DVD" -#: rc.cpp:1888 rc.cpp:3806 rc.cpp:5285 +#: rc.cpp:652 rc.cpp:2201 msgid "DVD format" msgstr "Format DVD" -#: src/dvdwizard.cpp:500 +#: src/dvdwizard.cpp:520 msgid "DVD structure broken" msgstr "Struktura DVD uszkodzona" -#: src/dvdwizard.cpp:478 +#: src/dvdwizard.cpp:498 msgid "DVDAuthor process crashed." msgstr "Proces DVDAuthor zakończony niepowodzeniem." -#: rc.cpp:299 rc.cpp:309 rc.cpp:2217 rc.cpp:2227 +#: rc.cpp:383 rc.cpp:393 msgid "Damping" msgstr "Tłumienie" @@ -1535,111 +1629,115 @@ msgid "Dan Dennedy" msgstr "Dan Dennedy" -#: rc.cpp:8 rc.cpp:1926 +#: rc.cpp:8 msgid "Debug" msgstr "Debugowanie" -#: rc.cpp:433 rc.cpp:445 rc.cpp:465 rc.cpp:2351 rc.cpp:2363 rc.cpp:2383 +#: rc.cpp:501 rc.cpp:513 rc.cpp:533 msgid "Decay" msgstr "Rozpad" -#: rc.cpp:239 rc.cpp:2157 +#: rc.cpp:323 msgid "Declipper" msgstr "Usuwanie przesterowania" -#: rc.cpp:1812 rc.cpp:3730 rc.cpp:5209 +#: rc.cpp:917 rc.cpp:2466 msgid "Decoding threads" msgstr "Wątki dekodowania" -#: src/kdenlivesettingsdialog.cpp:247 src/kdenlivesettingsdialog.cpp:248 +#: src/mainwindow.cpp:267 src/kdenlivesettingsdialog.cpp:251 +#: src/kdenlivesettingsdialog.cpp:252 msgid "Default" msgstr "Domyślne" -#: rc.cpp:1392 rc.cpp:3310 rc.cpp:4789 +#: rc.cpp:1832 rc.cpp:3381 msgid "Default Durations" msgstr "Domyślne czasy trwania" -#: rc.cpp:1410 rc.cpp:3328 rc.cpp:4807 +#: rc.cpp:1850 rc.cpp:3399 msgid "Default Profile" msgstr "Domyślny profil" -#: rc.cpp:1032 rc.cpp:2950 rc.cpp:4429 +#: rc.cpp:1478 rc.cpp:3027 msgid "Default apps" msgstr "Domyślne aplikacje" -#: rc.cpp:1197 rc.cpp:3115 rc.cpp:4594 +#: rc.cpp:1280 rc.cpp:2829 msgid "Default capture device" msgstr "Domyśle urządzenie przechwytywania" -#: rc.cpp:1653 rc.cpp:3571 rc.cpp:5050 +#: rc.cpp:2096 rc.cpp:3645 msgid "Default folder for project files" msgstr "Domyśliny katalog na pliki projektów" -#: rc.cpp:1020 rc.cpp:2938 rc.cpp:4417 +#: rc.cpp:1466 rc.cpp:3015 msgid "Default folders" msgstr "Domyślne katalogi" -#: rc.cpp:431 rc.cpp:443 rc.cpp:463 rc.cpp:485 rc.cpp:2349 rc.cpp:2361 -#: rc.cpp:2381 rc.cpp:2403 +#: rc.cpp:499 rc.cpp:511 rc.cpp:531 rc.cpp:553 rc.cpp:1163 rc.cpp:2712 msgid "Delay" msgstr "Opóźnienie" -#: rc.cpp:307 rc.cpp:2225 +#: rc.cpp:391 msgid "Delay (s/10)" msgstr "Opóźnienie (s/10)" -#: src/addeffectcommand.cpp:39 +#: src/addeffectcommand.cpp:39 src/customtrackview.cpp:1749 msgid "Delete %1" msgstr "Usuń %1" -#: src/customruler.cpp:82 src/mainwindow.cpp:1063 +#: src/customruler.cpp:83 src/mainwindow.cpp:1251 msgid "Delete All Guides" msgstr "Usuń wszystkie wskaźniki" -#: src/mainwindow.cpp:997 +#: src/mainwindow.cpp:1185 msgid "Delete All Markers" msgstr "Usuń wszystkie znaczniki" -#: src/projectlist.cpp:430 src/mainwindow.cpp:1157 +#: src/mainwindow.cpp:1345 src/projectlist.cpp:625 msgid "Delete Clip" msgstr "Usuń klip" -#: src/projectlist.cpp:433 src/projectlist.cpp:525 +#: src/projectlist.cpp:602 +msgid "Delete Clip Zone" +msgstr "Usuń strefę klipu" + +#: src/projectlist.cpp:616 src/projectlist.cpp:741 msgid "Delete Folder" msgstr "Usuń katalog" -#: src/customruler.cpp:80 src/mainwindow.cpp:1055 src/customtrackview.cpp:199 +#: src/customruler.cpp:81 src/mainwindow.cpp:1243 src/customtrackview.cpp:223 msgid "Delete Guide" msgstr "Usuń wskaźnik" -#: src/mainwindow.cpp:993 +#: src/mainwindow.cpp:1181 msgid "Delete Marker" msgstr "Usuń znacznik " -#: rc.cpp:1849 rc.cpp:3767 rc.cpp:5246 +#: rc.cpp:2048 rc.cpp:3597 msgid "Delete Profile" msgstr "Usuń profil" -#: rc.cpp:647 rc.cpp:2565 rc.cpp:4044 +#: rc.cpp:1757 rc.cpp:3306 msgid "Delete Script" msgstr "Usuń skrypt" -#: src/mainwindow.cpp:956 +#: src/mainwindow.cpp:1109 msgid "Delete Selected Item" msgstr "Usuń wybrany element" -#: src/mainwindow.cpp:1043 src/customtrackview.cpp:4643 src/headertrack.cpp:80 +#: src/mainwindow.cpp:1231 src/headertrack.cpp:86 src/customtrackview.cpp:5205 msgid "Delete Track" msgstr "Usuń ścieżkę" -#: src/clipmanager.cpp:154 src/addclipcommand.cpp:34 +#: src/clipmanager.cpp:156 src/addclipcommand.cpp:34 msgid "Delete clip" msgid_plural "Delete clips" msgstr[0] "Usuń klip" msgstr[1] "Usuń klipy" msgstr[2] "Usuń klipy" -#: src/projectlist.cpp:430 +#: src/projectlist.cpp:625 msgid "Delete clip %2?
This will also remove the clip in timeline" msgid_plural "" "Delete clip %2?
This will also remove its %1 clips in timeline" @@ -1653,19 +1751,19 @@ "Usunąć klip %2?
Spowoduje to skasowanie również %1 klipów na linii " "czasu" -#: src/dvdwizardmenu.cpp:44 +#: src/dvdwizardmenu.cpp:45 msgid "Delete current button" msgstr "Usuń aktualny przycisk" -#: rc.cpp:1515 rc.cpp:3433 rc.cpp:4912 +#: rc.cpp:2078 rc.cpp:3627 msgid "Delete current file" msgstr "Usuń aktualny plik" -#: src/effectslistview.cpp:49 src/effectstackview.cpp:58 +#: src/effectstackview.cpp:58 src/effectslistview.cpp:50 msgid "Delete effect" msgstr "Usuń efekt" -#: rc.cpp:834 rc.cpp:2752 rc.cpp:3903 rc.cpp:4231 rc.cpp:5382 +#: rc.cpp:1622 rc.cpp:3171 msgid "Delete files" msgstr "Usuń pliki" @@ -1673,7 +1771,7 @@ msgid "Delete folder" msgstr "Usuń katalog" -#: src/projectlist.cpp:433 +#: src/projectlist.cpp:616 msgid "" "Delete folder %2?
This will also remove the clip in that folder" msgid_plural "" @@ -1692,55 +1790,56 @@ msgid "Delete guide" msgstr "Usuń wskaźnik" -#: src/geometryval.cpp:76 src/editkeyframecommand.cpp:37 +#: src/editkeyframecommand.cpp:37 src/keyframeedit.cpp:47 +#: src/geometryval.cpp:77 msgid "Delete keyframe" msgstr "Usuń klatkę kluczową" -#: src/clipproperties.cpp:248 src/addmarkercommand.cpp:32 +#: src/clipproperties.cpp:278 src/addmarkercommand.cpp:32 msgid "Delete marker" msgstr "Usuń znacznik" -#: src/profilesdialog.cpp:42 src/renderwidget.cpp:71 +#: src/renderwidget.cpp:71 src/profilesdialog.cpp:42 msgid "Delete profile" msgstr "Usuń profil" -#: src/customtrackview.cpp:3172 +#: src/customtrackview.cpp:3641 msgid "Delete selected clip" msgid_plural "Delete selected clips" msgstr[0] "Usuń wybrany klip" msgstr[1] "Usuń wybrane klipy" msgstr[2] "Usuń wybrane klipy" -#: src/customtrackview.cpp:3170 +#: src/customtrackview.cpp:3639 msgid "Delete selected group" msgid_plural "Delete selected groups" msgstr[0] "Usuń wybraną grupę" msgstr[1] "Usuń wybrane grupy" msgstr[2] "Usuń wybrane grupy" -#: src/customtrackview.cpp:3175 +#: src/customtrackview.cpp:3644 msgid "Delete selected items" msgstr "Usuń wybrane elementy" -#: src/customtrackview.cpp:3174 +#: src/customtrackview.cpp:3643 msgid "Delete selected transition" msgid_plural "Delete selected transitions" msgstr[0] "Usuń wybrane przejście" msgstr[1] "Usuń wybrane przejścia" msgstr[2] "Usuń wybrane przejścia" -#: src/mainwindow.cpp:415 +#: src/mainwindow.cpp:477 msgid "Delete them" msgstr "Usuń to" -#: src/addtimelineclipcommand.cpp:37 src/customtrackview.cpp:2449 +#: src/addtimelineclipcommand.cpp:39 src/customtrackview.cpp:2832 msgid "Delete timeline clip" msgid_plural "Delete timeline clips" msgstr[0] "Usuń klip z lini czasu" msgstr[1] "Usuń klipy z lini czasu" msgstr[2] "Usuń klipy z lini czasu" -#: src/customtrackview.cpp:4638 src/addtrackcommand.cpp:34 +#: src/addtrackcommand.cpp:34 src/customtrackview.cpp:5200 msgid "Delete track" msgstr "Usuń ścieżkę" @@ -1748,35 +1847,41 @@ msgid "Delete transition from clip" msgstr "Usuń przejście z klipu" -#: src/projectsettings.cpp:91 +#: src/projectsettings.cpp:108 msgid "Delete unused clips" msgstr "Usuń nieużywane klipy" -#: src/titlewidget.cpp:142 +#: src/titlewidget.cpp:234 msgctxt "Font style" msgid "Demi-Bold" msgstr "Częściowo pogrubiony" -#: rc.cpp:269 rc.cpp:2187 +#: rc.cpp:353 msgid "Depth" msgstr "Głębokość" -#: src/projectlistview.cpp:46 rc.cpp:777 rc.cpp:1689 rc.cpp:2695 rc.cpp:3607 -#: rc.cpp:4174 rc.cpp:5086 +#: src/projectlistview.cpp:49 rc.cpp:670 rc.cpp:794 rc.cpp:2219 rc.cpp:2343 msgid "Description" msgstr "Opis" -#: src/mainwindow.cpp:2583 +#: src/mainwindow.cpp:2876 msgid "Description:" msgstr "Opis:" -# "Desktop Search" - maybe possible translation -#: rc.cpp:1008 rc.cpp:2926 rc.cpp:4405 +#: src/mainwindow.cpp:1147 +msgid "Deselect Clip" +msgstr "Odznacz klip" + +#: src/mainwindow.cpp:1162 +msgid "Deselect Transition" +msgstr "Odznacz przejście" + +# "Desktop Search" - wtf is this, and how to translate it??? +#: rc.cpp:1454 rc.cpp:3003 msgid "Desktop search integration" msgstr "Integracja z Desktop Search" -#: rc.cpp:542 rc.cpp:849 rc.cpp:1134 rc.cpp:2460 rc.cpp:2767 rc.cpp:3052 -#: rc.cpp:3939 rc.cpp:4246 rc.cpp:4531 +#: rc.cpp:1052 rc.cpp:1646 rc.cpp:1805 rc.cpp:2601 rc.cpp:3195 rc.cpp:3354 msgid "Destination" msgstr "Cel" @@ -1784,70 +1889,72 @@ msgid "Destination folder" msgstr "Katalog docelowy" -#: rc.cpp:1179 rc.cpp:3097 rc.cpp:4576 +#: rc.cpp:2120 rc.cpp:3669 msgid "Device" msgstr "Urządzenie" -#: rc.cpp:1176 rc.cpp:3094 rc.cpp:4573 +#: rc.cpp:2117 rc.cpp:3666 msgid "Device configuration" msgstr "Konfiguracja urządzenia" -#: rc.cpp:536 rc.cpp:825 rc.cpp:843 rc.cpp:870 rc.cpp:1053 rc.cpp:1668 -#: rc.cpp:1821 rc.cpp:2454 rc.cpp:2743 rc.cpp:2761 rc.cpp:2788 rc.cpp:2971 -#: rc.cpp:3586 rc.cpp:3739 rc.cpp:3933 rc.cpp:4222 rc.cpp:4240 rc.cpp:4267 -#: rc.cpp:4450 rc.cpp:5065 rc.cpp:5218 +#: rc.cpp:956 rc.cpp:1046 rc.cpp:1640 rc.cpp:2051 rc.cpp:2156 rc.cpp:2505 +#: rc.cpp:2595 rc.cpp:3189 rc.cpp:3600 rc.cpp:3705 msgid "Dialog" msgstr "Dialog" -#: src/kdenlivesettingsdialog.cpp:240 +#: src/kdenlivesettingsdialog.cpp:244 msgid "Direct FB" msgstr "Direct FB" -#: rc.cpp:233 rc.cpp:2151 +#: rc.cpp:317 msgid "Discard color information" msgstr "Porzuć informacje o kolorze" +#: src/recmonitor.cpp:284 +msgid "Disconnect" +msgstr "Rozłącz" + #: src/wizard.cpp:57 msgid "Discover the features of this Kdenlive release" msgstr "Odkryj możliwości tego wydania Kdenlive" -#: src/recmonitor.cpp:282 -msgid "Disonnect" -msgstr "Rozłącz" - #: src/kdenlivesettingsdialog.cpp:59 msgid "Display" msgstr "Wyświetlanie" -#: rc.cpp:798 rc.cpp:2716 rc.cpp:4195 +#: rc.cpp:691 rc.cpp:2240 msgid "Display aspect ratio" msgstr "Proporcje wyświetlania" -#: src/wizard.cpp:481 rc.cpp:3870 rc.cpp:5349 +#: src/wizard.cpp:493 rc.cpp:1589 rc.cpp:3138 msgid "Display aspect ratio:" msgstr "Proporcje wyświetlania: " -#: rc.cpp:1122 rc.cpp:3040 rc.cpp:4519 +#: rc.cpp:2027 rc.cpp:3576 msgid "Display clip markers comments" msgstr "Wyświetl komentarze do znaczników w klipie" -#: rc.cpp:1434 rc.cpp:3352 rc.cpp:4831 +#: rc.cpp:1874 rc.cpp:3423 msgid "Display ratio:" msgstr "Współczynnik wyświetlania:" -#: rc.cpp:1368 rc.cpp:1755 rc.cpp:3286 rc.cpp:3673 rc.cpp:4765 rc.cpp:5152 +#: rc.cpp:860 rc.cpp:1937 rc.cpp:2409 rc.cpp:3486 msgid "Dissolve" msgstr "Płynnie" -#: rc.cpp:155 rc.cpp:2073 +#: rc.cpp:631 +msgid "Distort" +msgstr "Zniekształć" + +#: rc.cpp:189 msgid "Distort0r" msgstr "Distort0r" -#: src/kdenlivesettingsdialog.cpp:109 +#: src/kdenlivesettingsdialog.cpp:113 msgid "Do nothing" msgstr "Nie rób nic" -#: src/kdenlivedoc.cpp:210 +#: src/kdenlivedoc.cpp:212 msgid "Document project folder is invalid, setting it to the default one: %1" msgstr "Katalog dokumentów projektu jest nieprawidłowy, ustawianie go na: %1" @@ -1855,40 +1962,41 @@ msgid "Document to open" msgstr "Dokument do otwarcia" -#: src/mainwindow.cpp:1452 +#: src/mainwindow.cpp:1642 msgid "Don't recover" msgstr "Nie odzyskuj" -#: src/mainwindow.cpp:841 +#: src/mainwindow.cpp:957 msgid "Download New Project Profiles..." msgstr "Pobierz nowe profile projektu..." -#: src/mainwindow.cpp:839 +#: src/mainwindow.cpp:955 msgid "Download New Render Profiles..." msgstr "Pobierz nowe profile renderowania..." -#: src/mainwindow.cpp:837 +#: src/mainwindow.cpp:959 +msgid "Download New Title Templates..." +msgstr "Pobierz nowe szablony tytułowe..." + +#: src/mainwindow.cpp:953 msgid "Download New Wipes..." msgstr "Pobierz nowe przejścia..." -#: rc.cpp:1167 rc.cpp:3085 rc.cpp:4564 +#: rc.cpp:1091 rc.cpp:2640 msgid "Drop B frames on H.264 clips" msgstr "Porzuć klatki B w klipach H.264" -#: rc.cpp:78 rc.cpp:90 rc.cpp:103 rc.cpp:113 rc.cpp:1071 rc.cpp:1098 -#: rc.cpp:1503 rc.cpp:1578 rc.cpp:1677 rc.cpp:1692 rc.cpp:1876 rc.cpp:1996 -#: rc.cpp:2008 rc.cpp:2021 rc.cpp:2031 rc.cpp:2989 rc.cpp:3016 rc.cpp:3421 -#: rc.cpp:3496 rc.cpp:3595 rc.cpp:3610 rc.cpp:3794 rc.cpp:4468 rc.cpp:4495 -#: rc.cpp:4900 rc.cpp:4975 rc.cpp:5074 rc.cpp:5089 rc.cpp:5273 +#: rc.cpp:80 rc.cpp:93 rc.cpp:103 rc.cpp:114 rc.cpp:640 rc.cpp:712 rc.cpp:739 +#: rc.cpp:797 rc.cpp:1112 rc.cpp:1553 rc.cpp:2165 rc.cpp:2189 rc.cpp:2261 +#: rc.cpp:2288 rc.cpp:2346 rc.cpp:2661 rc.cpp:3102 rc.cpp:3714 msgid "Duration" msgstr "Czas trwania" -#: rc.cpp:921 rc.cpp:2839 rc.cpp:4318 +#: rc.cpp:944 rc.cpp:2493 msgid "Dw" msgstr "Dw" -#: rc.cpp:560 rc.cpp:927 rc.cpp:1791 rc.cpp:2478 rc.cpp:2845 rc.cpp:3709 -#: rc.cpp:3957 rc.cpp:4324 rc.cpp:5188 +#: rc.cpp:896 rc.cpp:950 rc.cpp:1664 rc.cpp:2445 rc.cpp:2499 rc.cpp:3213 msgid "E" msgstr "E" @@ -1896,44 +2004,52 @@ msgid "EMAIL OF TRANSLATORS" msgstr "vshader@gmail.com" -#: rc.cpp:173 rc.cpp:2091 +#: rc.cpp:207 msgid "Edges correction" msgstr "Poprawianie krawędzi" -#: src/mainwindow.cpp:1151 +#: src/mainwindow.cpp:1339 msgid "Edit Clip" msgstr "Edytuj klip" -#: src/customtrackview.cpp:3195 +#: src/customtrackview.cpp:3664 msgid "Edit Clip Speed" msgstr "Edytuj prędkość klipu" -#: src/customruler.cpp:78 src/mainwindow.cpp:1059 src/customtrackview.cpp:203 -#: src/customtrackview.cpp:4061 src/customtrackview.cpp:4073 +#: src/customruler.cpp:79 src/mainwindow.cpp:1247 src/customtrackview.cpp:227 +#: src/customtrackview.cpp:4540 src/customtrackview.cpp:4552 msgid "Edit Guide" msgstr "Edytuj wskaźnik" -#: rc.cpp:1855 rc.cpp:3773 rc.cpp:5252 +#: rc.cpp:2003 rc.cpp:3552 msgid "Edit Keyframe" msgstr "Edytuj klatkę kluczową" -#: src/clipproperties.cpp:309 src/mainwindow.cpp:1001 src/mainwindow.cpp:2115 +#: src/mainwindow.cpp:1189 src/mainwindow.cpp:2313 src/clipproperties.cpp:439 msgid "Edit Marker" msgstr "Edytuj znacznik" -#: src/renderwidget.cpp:438 +#: src/renderwidget.cpp:478 msgid "Edit Profile" msgstr "Edytuj profil" -#: src/editclipcommand.cpp:33 src/customtrackview.cpp:1185 +#: src/customtrackview.cpp:1313 src/editclipcommand.cpp:33 msgid "Edit clip" msgstr "Edytuj klip" +#: src/editclipcutcommand.cpp:35 +msgid "Edit clip cut" +msgstr "Edytuj cięcie klipu" + +#: src/mainwindow.cpp:2631 +msgid "Edit clips" +msgstr "Edytuj klipy" + #: src/editeffectcommand.cpp:40 msgid "Edit effect %1" msgstr "Edytuj efekt %1" -#: rc.cpp:1617 rc.cpp:3535 rc.cpp:5014 +#: rc.cpp:1184 rc.cpp:2733 msgid "Edit end" msgstr "Koniec edycji" @@ -1941,11 +2057,11 @@ msgid "Edit guide" msgstr "Edytuj wskaźnik" -#: src/geometryval.cpp:84 src/editkeyframecommand.cpp:36 +#: src/editkeyframecommand.cpp:36 src/geometryval.cpp:85 msgid "Edit keyframe" msgstr "Edytuj klatkę kluczową" -#: src/clipproperties.cpp:246 src/addmarkercommand.cpp:34 +#: src/clipproperties.cpp:276 src/addmarkercommand.cpp:34 msgid "Edit marker" msgstr "Edytuj znacznik" @@ -1953,7 +2069,7 @@ msgid "Edit profile" msgstr "Edytuj profil" -#: rc.cpp:1614 rc.cpp:3532 rc.cpp:5011 +#: rc.cpp:1181 rc.cpp:2730 msgid "Edit start" msgstr "Początek edycji" @@ -1961,20 +2077,24 @@ msgid "Edit transition %1" msgstr "Edytuj przejście %1" -#: src/trackview.cpp:632 +#: rc.cpp:1148 rc.cpp:2697 +msgid "Effect" +msgstr "Efekt" + +#: src/trackview.cpp:689 msgid "Effect %1:%2 not found in MLT, it was removed from this project\n" msgstr "" "Efekt %1:%2 nie został znaleziony w MLT, zostanie usunięty z tego projektu\n" -#: src/mainwindow.cpp:158 +#: src/mainwindow.cpp:168 msgid "Effect List" msgstr "Lista efektów" -#: src/mainwindow.cpp:166 +#: src/mainwindow.cpp:176 msgid "Effect Stack" msgstr "Stos efektów" -#: src/customtrackview.cpp:1480 src/customtrackview.cpp:1536 +#: src/customtrackview.cpp:1650 src/customtrackview.cpp:1716 msgid "Effect already present in clip" msgstr "Efekt jest już zastosowany na tym klipie" @@ -2003,40 +2123,40 @@ msgid "En Space (width of an n)" msgstr "En odstęp (szer. n, szer. 0,5 firetu)" -#: rc.cpp:1170 rc.cpp:3088 rc.cpp:4567 +#: rc.cpp:2111 rc.cpp:3660 msgid "Enable Jog Shuttle device" msgstr "Włącz urządzenie Jog Shuttle" -#: src/recmonitor.cpp:438 +#: src/recmonitor.cpp:440 msgid "Encoding captured video..." msgstr "Kodowanie przechwyconego wideo..." -#: rc.cpp:1260 rc.cpp:3178 rc.cpp:4657 +#: rc.cpp:1343 rc.cpp:2892 msgid "Encoding params" msgstr "Parametry kodowania" -#: src/renderwidget.cpp:281 rc.cpp:84 rc.cpp:96 rc.cpp:2002 rc.cpp:2014 -#: rc.cpp:3927 rc.cpp:5406 +#: src/renderwidget.cpp:287 src/titlewidget.cpp:2031 rc.cpp:86 rc.cpp:120 +#: rc.cpp:2177 rc.cpp:3726 msgid "End" msgstr "Koniec" -#: rc.cpp:107 rc.cpp:118 rc.cpp:2025 rc.cpp:2036 +#: rc.cpp:97 rc.cpp:108 msgid "End Gain" msgstr "Koniec zysku" -#: src/kdenlivedoc.cpp:1087 +#: src/kdenlivedoc.cpp:1085 msgid "Enter Template Path" msgstr "Wprowadź Ścieżkę Szablonu" -#: rc.cpp:1909 +#: rc.cpp:1520 rc.cpp:3069 msgid "Enter Unicode value" msgstr "Wprowadź wartość Unicode" -#: src/documentchecker.cpp:227 +#: src/documentchecker.cpp:313 msgid "Enter new location for file" msgstr "Wprowadź nową lokalizację pliku" -#: src/trackview.cpp:872 +#: src/trackview.cpp:937 msgid "Enter new name" msgstr "Wprowadź wartość Unicode" @@ -2048,106 +2168,116 @@ msgid "Environment" msgstr "Środowisko" -#: rc.cpp:243 rc.cpp:2161 +#: rc.cpp:327 msgid "Equalizer" msgstr "Korektor graficzny" -#: rc.cpp:629 rc.cpp:2547 rc.cpp:4026 +# previously it was 'Log Błędów', but it may be confusing for not technical user +#: rc.cpp:1736 rc.cpp:3285 msgid "Error Log" -msgstr "Log Błędów" +msgstr "Komunikaty błędów" -#: src/customtrackview.cpp:1730 src/customtrackview.cpp:2729 -#: src/customtrackview.cpp:3088 +#: src/customtrackview.cpp:1945 src/customtrackview.cpp:3154 +#: src/customtrackview.cpp:3545 msgid "Error removing clip at %1 on track %2" msgstr "Błąd przy usuwaniu klipu przy %1 na ścieżce %2" #: src/wizard.cpp:157 msgid "Error starting MLT's command line player (melt)" -msgstr "Błąd przy uruchamianiu odtwarzacza linii koment MLT (melt)" +msgstr "Błąd przy uruchamianiu odtwarzacza linii komend MLT (melt)" -#: src/wizard.cpp:541 +#: src/wizard.cpp:553 msgid "Error starting MLT's command line player (melt)." -msgstr "Błąd przy uruchamianiu odtwarzacza linii koment MLT (melt)" +msgstr "Błąd przy uruchamianiu odtwarzacza linii komend MLT (melt)" -#: src/customtrackview.cpp:1753 src/customtrackview.cpp:2858 -#: src/customtrackview.cpp:2950 src/customtrackview.cpp:3705 -#: src/customtrackview.cpp:3713 +#: src/customtrackview.cpp:1970 src/customtrackview.cpp:3288 +#: src/customtrackview.cpp:3383 src/customtrackview.cpp:4183 +#: src/customtrackview.cpp:4191 msgid "Error when resizing clip" msgstr "Błąd podczas zmiany rozmiaru klipu" -#: src/kdenlivesettingsdialog.cpp:220 +#: src/kdenlivesettingsdialog.cpp:224 msgid "Esound daemon" msgstr "Demon Esound" -#: src/renderwidget.cpp:1386 +#: src/renderwidget.cpp:1443 msgid "Estimated time %1" msgstr "Szacowany czas %1" -#: src/kdenlivedoc.cpp:674 +#: src/kdenlivedoc.cpp:681 msgid "Existing Profile" msgstr "Istniejący profil" -#: rc.cpp:581 rc.cpp:2499 rc.cpp:3978 +#: rc.cpp:1685 rc.cpp:3234 msgid "Export audio" msgstr "Eksport audio" -#: rc.cpp:1143 rc.cpp:3061 rc.cpp:4540 +#: rc.cpp:1814 rc.cpp:3363 msgid "Extension" msgstr "Rozszerzenie" -#: rc.cpp:5412 +#: rc.cpp:3732 msgid "Extra Toolbar" msgstr "Dodatkowy Pasek Narzędzi" -#: src/monitor.cpp:203 +#: src/monitor.cpp:201 msgid "Extract frame" msgstr "Wypakuj klatkę" -#: src/wizard.cpp:311 +#: src/wizard.cpp:323 msgid "FFmpeg & ffplay" msgstr "FFmpeg & ffplay" -#: rc.cpp:852 rc.cpp:1843 rc.cpp:2770 rc.cpp:3761 rc.cpp:4249 rc.cpp:5240 +#: rc.cpp:1055 rc.cpp:2042 rc.cpp:2604 rc.cpp:3591 msgid "FFmpeg parameters" msgstr "Parametry FFmpeg" -#: rc.cpp:491 rc.cpp:2409 +#: rc.cpp:559 msgid "Factor" msgstr "Współczynnik" -#: rc.cpp:74 rc.cpp:1992 +# no better idea :/ +#: rc.cpp:623 +msgid "Fade" +msgstr "Przejście głośności" + +#: rc.cpp:76 msgid "Fade from Black" msgstr "Wyjście z czerni" -#: rc.cpp:98 rc.cpp:2016 +#: rc.cpp:88 msgid "Fade in" msgstr "Zwiększanie głośności" -#: rc.cpp:100 rc.cpp:111 rc.cpp:2018 rc.cpp:2029 +#: rc.cpp:90 rc.cpp:101 msgid "Fade in audio track" msgstr "Zwiększanie głośności na ścieżce audio" -#: rc.cpp:109 rc.cpp:2027 +#: rc.cpp:99 msgid "Fade out" msgstr "Zmniejszanie głośności" -#: rc.cpp:86 rc.cpp:2004 +#: rc.cpp:110 msgid "Fade to Black" msgstr "Wejście w czerń" -#: rc.cpp:76 rc.cpp:1994 +#: rc.cpp:78 msgid "Fade video from black" msgstr "Wyjście wideo z czerni" -#: rc.cpp:88 rc.cpp:2006 +#: rc.cpp:112 msgid "Fade video to black" msgstr "Wejście wideo w czerń" -#: src/wizard.cpp:549 +#: src/wizard.cpp:561 msgid "Fatal Error" msgstr "Poważny błąd" -#: rc.cpp:271 rc.cpp:2189 +#: src/renderwidget.cpp:1161 +msgid "Favorites" +msgstr "Ulubione" + +#: rc.cpp:355 msgid "Feedback" msgstr "Sprzężenie zwrotne" @@ -2159,11 +2289,11 @@ "Niełamliwy odstęp. Ma szerokość cyfry, o ile cyfry mają taką samą szerokość " "w danej czcionce." -#: src/renderwidget.cpp:161 rc.cpp:1873 rc.cpp:3791 rc.cpp:5270 +#: src/renderwidget.cpp:167 rc.cpp:637 rc.cpp:2186 msgid "File" msgstr "Plik" -#: src/cliptranscode.cpp:114 +#: src/cliptranscode.cpp:120 msgid "" "File %1 already exists.\n" "Do you want to overwrite it?" @@ -2171,19 +2301,19 @@ "Plik %1 już istnieje.\n" "Czy chcesz go nadpisać?" -#: src/kdenlivedoc.cpp:91 +#: src/kdenlivedoc.cpp:94 msgid "File %1 is not a Kdenlive project file" msgstr "Plik %1 nie jest plikiem projektu Kdenlive." -#: src/dvdwizard.cpp:704 +#: src/dvdwizard.cpp:723 msgid "File %1 is not a Kdenlive project file." msgstr "Plik %1 nie jest plikiem projektu Kdenlive." -#: src/mainwindow.cpp:1451 +#: src/mainwindow.cpp:1641 msgid "File Recovery" msgstr "Odzyskiwanie pliku" -#: src/mainwindow.cpp:1383 src/effectstackview.cpp:105 +#: src/effectstackview.cpp:106 src/mainwindow.cpp:1573 msgid "" "File already exists.\n" "Do you want to overwrite it?" @@ -2191,56 +2321,51 @@ "Plik już istnieje.\n" "Czy chcesz go nadpisać?" -#: src/renderwidget.cpp:645 +#: src/renderwidget.cpp:678 msgid "File has no extension. Add extension (%1)?" msgstr "Plik nie ma rozszerzenia. Dodać rozszerzenie (%1)?" -#: rc.cpp:1509 rc.cpp:3427 rc.cpp:4906 +#: rc.cpp:2072 rc.cpp:3621 msgid "File name" msgstr "Nazwa pliku" -#: src/kdenlivedoc.cpp:874 src/kdenlivedoc.cpp:877 src/kdenlivedoc.cpp:885 +#: src/kdenlivedoc.cpp:881 src/kdenlivedoc.cpp:884 src/kdenlivedoc.cpp:892 msgid "File not found" msgstr "Plik nie znaleziony" -#: src/renderwidget.cpp:1106 +#: src/renderwidget.cpp:1160 msgid "File rendering" msgstr "Renderowanie pliku" -#: rc.cpp:1701 rc.cpp:3619 rc.cpp:5098 +#: rc.cpp:806 rc.cpp:2355 msgid "File size" msgstr "Rozmiar pliku" -#: src/projectlistview.cpp:46 -msgid "Filename" -msgstr "Nazwa pliku" - -#: rc.cpp:1542 rc.cpp:3460 rc.cpp:4939 +#: rc.cpp:1220 rc.cpp:2769 msgid "Fill color" msgstr "Wypełnij kolorem" -#: src/titlewidget.cpp:173 -msgid "Fill transparency" -msgstr "Wypełnij przezroczystym" +#: src/titlewidget.cpp:299 +msgid "Fill opacity" +msgstr "Nieprzezroczystość wypełnienia" -#: src/mainwindow.cpp:822 +#: src/mainwindow.cpp:938 msgid "Find" msgstr "Znajdź" -#: src/mainwindow.cpp:827 +#: src/mainwindow.cpp:943 msgid "Find Next" msgstr "Znajdź następny" -#: src/mainwindow.cpp:2502 +#: src/mainwindow.cpp:2795 msgid "Find stopped" msgstr "Szukanie wstrzymane" -#: rc.cpp:681 rc.cpp:1200 rc.cpp:1209 rc.cpp:2599 rc.cpp:3118 rc.cpp:3127 -#: rc.cpp:4078 rc.cpp:4597 rc.cpp:4606 +#: rc.cpp:1283 rc.cpp:1292 rc.cpp:1445 rc.cpp:2832 rc.cpp:2841 rc.cpp:2994 msgid "Firewire" msgstr "FireWire" -#: src/renderer.cpp:1437 +#: src/renderer.cpp:1464 msgid "" "Firewire is not enabled on your system.\n" " Please install Libiec61883 and recompile Kdenlive" @@ -2248,70 +2373,90 @@ "FireWire jest wyłączone w twoim systemie.\n" "Zainstaluj Libiec61883 i przekompiluj Kdenlive" -#: src/titlewidget.cpp:177 +#: src/titlewidget.cpp:303 msgid "Fit zoom" msgstr "Dopasuj powiększenie" -#: src/mainwindow.cpp:735 +#: src/mainwindow.cpp:848 msgid "Fit zoom to project" msgstr "Dopasuj powiększenie do projektu" -#: rc.cpp:327 rc.cpp:2245 +#: rc.cpp:411 msgid "Flip your image in any direction" msgstr "Odbij swój obraz w dowolnym kierunku" -#: src/projectlist.cpp:482 src/projectlist.cpp:554 src/projectitem.cpp:43 -#: rc.cpp:1353 rc.cpp:3271 rc.cpp:4750 +#: src/folderprojectitem.cpp:37 src/projectlist.cpp:692 +#: src/projectlist.cpp:770 rc.cpp:1922 rc.cpp:3471 msgid "Folder" msgstr "Katalog" -#: src/dvdwizard.cpp:632 +#: src/dvdwizard.cpp:651 msgid "Folder %1 already exists. Overwrite?" msgstr "Katalog %1 już istnieje. Nadpisać?" -#: rc.cpp:1329 rc.cpp:3247 rc.cpp:4726 +#: rc.cpp:1412 rc.cpp:2961 msgid "Follow mouse" msgstr "Podążaj za myszą" -#: rc.cpp:735 rc.cpp:2653 rc.cpp:4132 +#: rc.cpp:986 rc.cpp:1229 rc.cpp:2535 rc.cpp:2778 msgid "Font" msgstr "Czcionka" -#: src/titlewidget.cpp:145 +#: src/titlewidget.cpp:84 +msgid "Font color opacity" +msgstr "Nieprzezroczystość koloru czcionki" + +#: src/titlewidget.cpp:237 msgid "Font weight" msgstr "Grubość czcionki" -#: rc.cpp:578 rc.cpp:2496 rc.cpp:3975 +#: rc.cpp:1637 rc.cpp:3186 +msgid "Fonts" +msgstr "Czcionki" + +#: rc.cpp:1682 rc.cpp:3231 msgid "Force Interlaced" msgstr "Wymuś przeplot" # what progressive? -#: rc.cpp:575 rc.cpp:2493 rc.cpp:3972 +#: rc.cpp:1679 rc.cpp:3228 msgid "Force Progressive" msgstr "Wymuś progresywny" -#: rc.cpp:1809 rc.cpp:3727 rc.cpp:5206 +#: rc.cpp:932 rc.cpp:2481 +msgid "Force duration" +msgstr "Wymuś czas trwania" + +#: rc.cpp:929 rc.cpp:2478 +msgid "Force frame rate" +msgstr "Wymuś ilość klatek na sekundę" + +#: rc.cpp:914 rc.cpp:2463 msgid "Force pixel aspect ratio" msgstr "Wymuś proporcje pikseli" -#: rc.cpp:551 rc.cpp:1242 rc.cpp:1251 rc.cpp:2469 rc.cpp:3160 rc.cpp:3169 -#: rc.cpp:3948 rc.cpp:4639 rc.cpp:4648 +# what progressive? +#: rc.cpp:926 rc.cpp:2475 +msgid "Force progressive" +msgstr "Wymuś progresywny" + +#: rc.cpp:1325 rc.cpp:1334 rc.cpp:1655 rc.cpp:2874 rc.cpp:2883 rc.cpp:3204 msgid "Format" msgstr "Format" -#: rc.cpp:663 rc.cpp:2581 rc.cpp:4060 +#: rc.cpp:779 rc.cpp:2328 msgid "Formats" msgstr "Formaty" -#: src/monitor.cpp:90 src/mainwindow.cpp:916 src/recmonitor.cpp:80 +#: src/recmonitor.cpp:81 src/mainwindow.cpp:1059 src/monitor.cpp:90 msgid "Forward" msgstr "Dalej" -#: src/mainwindow.cpp:941 +#: src/mainwindow.cpp:1094 msgid "Forward 1 Frame" msgstr "Dalej o 1 klatkę" -#: src/mainwindow.cpp:946 +#: src/mainwindow.cpp:1099 msgid "Forward 1 Second" msgstr "Dalej o 1 sekundę" @@ -2319,7 +2464,7 @@ msgid "Forward 1 frame" msgstr "Dalej o 1 klatkę" -#: src/mainwindow.cpp:2479 src/mainwindow.cpp:2490 +#: src/mainwindow.cpp:2772 src/mainwindow.cpp:2783 msgid "Found: %1" msgstr "Znaleziono: %1" @@ -2327,184 +2472,203 @@ msgid "Four-Per-Em Space. Width: 1/4 of one em" msgstr "Odstęp cztery-na-Em. Szerokość: 1/4 jednego em (firetu)" -#: rc.cpp:1356 rc.cpp:3274 rc.cpp:4753 +#: rc.cpp:1925 rc.cpp:3474 msgid "Frame Duration" msgstr "Czas Trwania Klatki" -#: src/geometryval.cpp:540 +#: src/geometryval.cpp:545 msgid "Frame Geometry" msgstr "Geometria klatki" -#: rc.cpp:1746 rc.cpp:3664 rc.cpp:5143 +#: rc.cpp:851 rc.cpp:2400 msgid "Frame duration" msgstr "Czas trwania klatki" -#: rc.cpp:786 rc.cpp:1278 rc.cpp:1341 rc.cpp:1716 rc.cpp:2704 rc.cpp:3196 -#: rc.cpp:3259 rc.cpp:3634 rc.cpp:4183 rc.cpp:4675 rc.cpp:4738 rc.cpp:5113 +#: rc.cpp:679 rc.cpp:821 rc.cpp:1361 rc.cpp:1427 rc.cpp:2228 rc.cpp:2370 +#: rc.cpp:2910 rc.cpp:2976 msgid "Frame rate" msgstr "Klatek na sekundę" -#: src/wizard.cpp:481 rc.cpp:1422 rc.cpp:3340 rc.cpp:3858 rc.cpp:4819 -#: rc.cpp:5337 +#: src/wizard.cpp:493 rc.cpp:1577 rc.cpp:1862 rc.cpp:3126 rc.cpp:3411 msgid "Frame rate:" msgstr "Klatek na sekundę:" -#: rc.cpp:1713 rc.cpp:3631 rc.cpp:5110 +#: rc.cpp:818 rc.cpp:2367 msgid "Frame size" msgstr "Rozmiar klatki" -#: src/wizard.cpp:481 +#: src/wizard.cpp:493 msgid "Frame size:" msgstr "Rozmiar klatki:" -#: src/kdenlivesettingsdialog.cpp:239 +#: src/kdenlivesettingsdialog.cpp:243 msgid "Framebuffer console" msgstr "Bufor ramki konsoli" -#: src/clipproperties.cpp:166 src/mainwindow.cpp:677 src/slideshowclip.cpp:59 +#: src/slideshowclip.cpp:60 src/mainwindow.cpp:746 src/clipproperties.cpp:190 msgid "Frames" msgstr "Klatki" -#: src/recmonitor.cpp:663 +#: src/recmonitor.cpp:668 msgid "Free space: %1" msgstr "Wolne miejsce: %1" -#: rc.cpp:120 rc.cpp:2038 +#: rc.cpp:122 msgid "Freeze" msgstr "Zamrożenie" -#: rc.cpp:128 rc.cpp:2046 +#: rc.cpp:130 msgid "Freeze After" msgstr "Zamrożenie po" -#: rc.cpp:126 rc.cpp:2044 +#: rc.cpp:128 msgid "Freeze Before" msgstr "Zamrożenie przed" -#: rc.cpp:124 rc.cpp:2042 +#: rc.cpp:126 msgid "Freeze at" msgstr "Zamrożenie na" -#: rc.cpp:122 rc.cpp:2040 +#: rc.cpp:124 msgid "Freeze video on a chosen frame" msgstr "Zamrożenie wideo na wybranej klatce" -#: rc.cpp:161 rc.cpp:421 rc.cpp:1731 rc.cpp:2079 rc.cpp:2339 rc.cpp:3649 -#: rc.cpp:5128 +#: rc.cpp:195 rc.cpp:489 rc.cpp:836 rc.cpp:2385 msgid "Frequency" msgstr "Częstotliwość" -#: rc.cpp:605 rc.cpp:2523 rc.cpp:4002 +#: rc.cpp:1709 rc.cpp:3258 msgid "From" msgstr "Od" -#: rc.cpp:596 rc.cpp:2514 rc.cpp:3993 +#: rc.cpp:1700 rc.cpp:3249 msgid "Full project" msgstr "Cały projekt" -#: rc.cpp:1323 rc.cpp:3241 rc.cpp:4720 +#: rc.cpp:1406 rc.cpp:2955 msgid "Full screen capture" msgstr "Przechwytywanie całego ekranu" -#: rc.cpp:1344 rc.cpp:3262 rc.cpp:4741 +#: rc.cpp:1436 rc.cpp:2985 msgid "Full shots" msgstr "Pełne zrzuty" -#: rc.cpp:219 rc.cpp:223 rc.cpp:337 rc.cpp:343 rc.cpp:419 rc.cpp:453 -#: rc.cpp:523 rc.cpp:2137 rc.cpp:2141 rc.cpp:2255 rc.cpp:2261 rc.cpp:2337 -#: rc.cpp:2371 rc.cpp:2441 +# ? +#: rc.cpp:625 +msgid "Fun" +msgstr "Zabawa" + +#: rc.cpp:303 rc.cpp:307 rc.cpp:421 rc.cpp:427 rc.cpp:487 rc.cpp:521 +#: rc.cpp:603 msgid "Gain" msgstr "Zysk" -#: rc.cpp:427 rc.cpp:439 rc.cpp:459 rc.cpp:2345 rc.cpp:2357 rc.cpp:2377 +#: rc.cpp:495 rc.cpp:507 rc.cpp:527 msgid "Gain In" msgstr "Wzrost zysku" -#: rc.cpp:429 rc.cpp:441 rc.cpp:461 rc.cpp:2347 rc.cpp:2359 rc.cpp:2379 +#: rc.cpp:497 rc.cpp:509 rc.cpp:529 msgid "Gain Out" msgstr "Spadek zysku" -#: rc.cpp:481 rc.cpp:2399 +#: rc.cpp:549 msgid "Gain out" msgstr "Spadek zysku" -#: rc.cpp:225 rc.cpp:229 rc.cpp:2143 rc.cpp:2147 +#: rc.cpp:221 rc.cpp:309 rc.cpp:313 msgid "Gamma" msgstr "Gamma" -#: src/kdenlivesettingsdialog.cpp:242 +#: src/kdenlivesettingsdialog.cpp:246 msgid "General graphics interface" msgstr "Ogólny interfejs graficzny" -#: src/renderwidget.cpp:95 +#: src/renderwidget.cpp:98 msgid "Generate Script" msgstr "Generuj skrypt" -#: rc.cpp:5421 +#: rc.cpp:3741 msgid "Generators" msgstr "Generatory" -#: rc.cpp:6 rc.cpp:1924 +#: rc.cpp:6 msgid "Geometry" msgstr "Geometria" -#: rc.cpp:5457 +#: rc.cpp:3783 msgid "Go To" msgstr "Idź do" -#: src/mainwindow.cpp:926 +#: src/mainwindow.cpp:1069 msgid "Go to Clip End" msgstr "Idź do końca klipu" -#: src/mainwindow.cpp:921 +#: src/mainwindow.cpp:1064 msgid "Go to Clip Start" msgstr "Idź do początku klipu" -#: src/mainwindow.cpp:951 +#: src/mainwindow.cpp:1104 msgid "Go to Next Snap Point" msgstr "Idź do kolejnego cięcia" -#: src/mainwindow.cpp:911 +#: src/mainwindow.cpp:1054 msgid "Go to Previous Snap Point" msgstr "Idź do poprzedniego cięcia" -#: src/mainwindow.cpp:936 +#: src/mainwindow.cpp:1089 msgid "Go to Project End" msgstr "Idź do końca projektu" -#: src/mainwindow.cpp:931 +#: src/mainwindow.cpp:1084 msgid "Go to Project Start" msgstr "Idź do początku projektu" -#: src/monitor.cpp:103 +#: src/mainwindow.cpp:1079 +msgid "Go to Zone End" +msgstr "Idź do końca strefy" + +#: src/mainwindow.cpp:1074 +msgid "Go to Zone Start" +msgstr "Idź do początku strefy" + +#: src/monitor.cpp:103 src/customtrackview.cpp:203 msgid "Go to marker..." msgstr "Idź do znacznika..." -#: src/geometryval.cpp:70 +#: src/geometryval.cpp:71 msgid "Go to next keyframe" msgstr "Idź do kolejnej klatki kluczowej" -#: src/geometryval.cpp:72 +#: src/geometryval.cpp:73 msgid "Go to previous keyframe" msgstr "Idź do poprzedniej klatki kluczowej" -#: rc.cpp:999 rc.cpp:2917 rc.cpp:4396 +# ??? +#: rc.cpp:165 +msgid "Graph position" +msgstr "Pozycja wykresu" + +#: rc.cpp:1991 rc.cpp:3540 msgid "GraphView" msgstr "Widok Graficzny" -#: rc.cpp:136 rc.cpp:2054 +#: rc.cpp:269 +msgid "Gray color" +msgstr "Kolor szary" + +#: rc.cpp:138 msgid "Green Tint" msgstr "Odcień zieleni" -#: rc.cpp:231 rc.cpp:2149 +#: rc.cpp:315 msgid "Greyscale" msgstr "Skala odcieni szarości" -#: rc.cpp:1137 rc.cpp:3055 rc.cpp:4534 +#: rc.cpp:1808 rc.cpp:3357 msgid "Group" msgstr "Grupa" -#: src/mainwindow.cpp:973 +#: src/mainwindow.cpp:1126 msgid "Group Clips" msgstr "Grupuj klipy" @@ -2512,27 +2676,27 @@ msgid "Group clips" msgstr "Grupuj klipy" -#: rc.cpp:1867 rc.cpp:3785 rc.cpp:5264 +#: rc.cpp:1820 rc.cpp:3369 msgid "GroupBox" msgstr "Grupa" -#: src/customtrackview.cpp:4034 +#: src/customtrackview.cpp:4513 msgid "Guide" msgstr "Wskaźnik" -#: rc.cpp:602 rc.cpp:2520 rc.cpp:3999 +#: rc.cpp:1706 rc.cpp:3255 msgid "Guide zone" msgstr "Strefa wskaźnika" -#: rc.cpp:5439 +#: rc.cpp:3765 msgid "Guides" msgstr "Wskaźniki" -#: rc.cpp:1533 rc.cpp:3451 rc.cpp:4930 +#: rc.cpp:1106 rc.cpp:2655 msgid "H" msgstr "H" -#: rc.cpp:1224 rc.cpp:1482 rc.cpp:3142 rc.cpp:3400 rc.cpp:4621 rc.cpp:4879 +#: rc.cpp:1307 rc.cpp:1961 rc.cpp:2856 rc.cpp:3510 msgid "HDV" msgstr "HDV" @@ -2540,95 +2704,104 @@ msgid "Hair Space. Thinner than U+2009." msgstr "Cienki odstęp (Hair Space). Cieńszy od U+2009" -#: rc.cpp:882 rc.cpp:2800 rc.cpp:4279 +#: rc.cpp:2063 rc.cpp:3612 msgid "Height" msgstr "Wysokość" -#: rc.cpp:251 rc.cpp:2169 +#: rc.cpp:335 msgid "Hi gain" msgstr "Wysoki zysk" -#: rc.cpp:347 rc.cpp:2265 +#: rc.cpp:431 msgid "Hide a region of the clip" msgstr "Ukryj region klipu" -#: rc.cpp:4 rc.cpp:1922 +#: rc.cpp:4 msgid "Hide a selected zone and follow its movements" msgstr "Ukryj wybraną strefę i podążaj za jej ruchem" -#: rc.cpp:1332 rc.cpp:3250 rc.cpp:4729 +#: rc.cpp:1418 rc.cpp:2967 +msgid "Hide cursor" +msgstr "Ukryj kursor" + +#: rc.cpp:1415 rc.cpp:2964 msgid "Hide frame" msgstr "Ukryj klatkę" -#: src/headertrack.cpp:43 +#: src/headertrack.cpp:44 msgid "Hide track" msgstr "Ukryj ścieżkę" -#: src/geometryval.cpp:97 +# or 'Histogram pozycji', but it has less sense +#: rc.cpp:229 +msgid "Histogram position" +msgstr "Pozycja historgramu" + +#: src/geometryval.cpp:98 msgid "Hor. Center" msgstr "Wycentruj w poziomie" -#: rc.cpp:167 rc.cpp:2085 +#: rc.cpp:201 msgid "Horizontal center" msgstr "Wycentruj w poziomie" -#: rc.cpp:531 rc.cpp:2449 +#: rc.cpp:611 msgid "Horizontal factor" msgstr "Współczynnik poziomy" -#: rc.cpp:18 rc.cpp:1936 +#: rc.cpp:18 msgid "Horizontal multiplicator" msgstr "Mnożnik poziomy" -#: rc.cpp:36 rc.cpp:1954 +#: rc.cpp:36 msgid "Horizontal scatter" msgstr "Rozrzut poziomy" -#: rc.cpp:548 rc.cpp:2466 rc.cpp:3945 +#: rc.cpp:1652 rc.cpp:3201 msgid "I" msgstr "I" -#: src/dvdwizard.cpp:547 +#: src/dvdwizard.cpp:568 msgid "ISO creation process crashed." msgstr "Proces tworzenia ISO zakończony niepowodzeniem" -#: rc.cpp:753 rc.cpp:1770 rc.cpp:2671 rc.cpp:3688 rc.cpp:4150 rc.cpp:5167 +#: rc.cpp:875 rc.cpp:1004 rc.cpp:2424 rc.cpp:2553 msgid "Image" msgstr "Obraz" -#: rc.cpp:1362 rc.cpp:3280 rc.cpp:4759 +#: rc.cpp:1931 rc.cpp:3480 msgid "Image Type" msgstr "Typ obrazu" -#: src/projectitem.cpp:200 src/documentchecker.cpp:95 +#: src/documentchecker.cpp:145 src/projectitem.cpp:177 msgid "Image clip" msgstr "Klip obrazu" -#: rc.cpp:1404 rc.cpp:3322 rc.cpp:4801 +#: rc.cpp:1844 rc.cpp:3393 msgid "Image clips" msgstr "Kilpy obrazów" -#: rc.cpp:1035 rc.cpp:2953 rc.cpp:4432 +#: rc.cpp:1481 rc.cpp:3030 msgid "Image editing" msgstr "Montaż obrazów" -#: src/dvdwizard.cpp:634 +#: src/dvdwizard.cpp:653 msgid "Image file %1 already exists. Overwrite?" msgstr "Plik obrazu %1 już istnieje. Nadpisać?" -#: rc.cpp:1467 rc.cpp:1704 rc.cpp:3385 rc.cpp:3622 rc.cpp:4864 rc.cpp:5101 +#: rc.cpp:809 rc.cpp:1040 rc.cpp:2358 rc.cpp:2589 msgid "Image preview" msgstr "Podgląd obrazu" -#: rc.cpp:1272 rc.cpp:1773 rc.cpp:3190 rc.cpp:3691 rc.cpp:4669 rc.cpp:5170 +#: rc.cpp:878 rc.cpp:1355 rc.cpp:2427 rc.cpp:2904 msgid "Image size" msgstr "Rozmiar obrazu" -#: rc.cpp:1743 rc.cpp:3661 rc.cpp:5140 +#: rc.cpp:848 rc.cpp:2397 msgid "Image type" msgstr "Typ obrazu" -#: rc.cpp:80 rc.cpp:1998 +#: rc.cpp:82 msgid "In" msgstr "W" @@ -2644,101 +2817,133 @@ "Informacje o znakach Unicode: http://" "decodeunicode.org" -#: src/recmonitor.cpp:409 src/recmonitor.cpp:527 +#: src/recmonitor.cpp:411 src/recmonitor.cpp:532 msgid "Initialising..." msgstr "Inicjowanie..." -#: rc.cpp:257 rc.cpp:2175 +#: rc.cpp:217 +msgid "Input black level" +msgstr "Wejściowy poziom czerni" + +#: rc.cpp:341 msgid "Input gain (dB)" msgstr "Zysk wejściowy (dB)" -#: src/customtrackview.cpp:4609 +#: rc.cpp:219 +msgid "Input white level" +msgstr "Wejściowy poziom bieli" + +#: src/mainwindow.cpp:1137 +msgid "Insert Clip Zone in Timeline (Overwrite)" +msgstr "Wstaw strefę klipu na taśmę czasu (nadpisz)" + +#: src/customtrackview.cpp:5171 msgid "Insert New Track" msgstr "Wstaw nową ścieżkę" -#: src/mainwindow.cpp:1031 +#: src/mainwindow.cpp:1219 msgid "Insert Space" msgstr "Wstaw odstęp" -#: src/mainwindow.cpp:1039 src/headertrack.cpp:76 +#: src/mainwindow.cpp:1227 src/headertrack.cpp:82 msgid "Insert Track" msgstr "Wstaw ścieżkę" -#: src/titlewidget.cpp:165 +#: src/titlewidget.cpp:257 msgid "Insert Unicode character" msgstr "Wstaw znak Unicode" +#: src/customtrackview.cpp:5841 +msgid "Insert clip" +msgstr "Wstaw klip" + +#: src/mainwindow.cpp:774 +msgid "Insert mode" +msgstr "Tryb wstawiania" + #: src/insertspacecommand.cpp:35 msgid "Insert space" msgstr "Wstaw odstęp" -#: src/customtrackview.cpp:4606 rc.cpp:1056 rc.cpp:2974 rc.cpp:4453 +#: src/customtrackview.cpp:5168 rc.cpp:959 rc.cpp:2508 msgid "Insert track" msgstr "Wstaw ścieżkę" -#: rc.cpp:1665 rc.cpp:3583 rc.cpp:5062 +#: src/mainwindow.cpp:1020 +msgid "Insert zone in project tree" +msgstr "Wstaw strefę w drzewie projektu" + +#: src/mainwindow.cpp:1025 +msgid "Insert zone in timeline" +msgstr "Wstaw strefę na linii czasu" + +#: rc.cpp:3762 +msgid "Insertion" +msgstr "Wstawienie" + +#: rc.cpp:2108 rc.cpp:3657 msgid "Install extra video mimetypes" msgstr "Zainstaluj dodatkowe typy MIME wideo" -#: rc.cpp:653 rc.cpp:2571 rc.cpp:4050 +#: rc.cpp:769 rc.cpp:2318 msgid "Installed modules" msgstr "Zainstalowane moduły" -#: rc.cpp:26 rc.cpp:1944 +#: rc.cpp:26 msgid "Intensity" msgstr "Intensywność" -#: src/kdenlivesettingsdialog.cpp:503 src/projectsettings.cpp:156 rc.cpp:1440 -#: rc.cpp:3358 rc.cpp:3876 rc.cpp:4837 rc.cpp:5355 +#: src/kdenlivesettingsdialog.cpp:507 src/projectsettings.cpp:198 rc.cpp:1595 +#: rc.cpp:1880 rc.cpp:3144 rc.cpp:3429 msgid "Interlaced" msgstr "Przeplot" -#: rc.cpp:1870 rc.cpp:3788 rc.cpp:5267 +#: rc.cpp:634 rc.cpp:2183 msgid "Intro movie" msgstr "Sekwencja początkowa" -#: src/customtrackview.cpp:4481 src/customtrackview.cpp:4487 -#: src/customtrackview.cpp:4512 src/customtrackview.cpp:4517 +#: src/customtrackview.cpp:5037 src/customtrackview.cpp:5043 +#: src/customtrackview.cpp:5069 src/customtrackview.cpp:5075 msgid "Invalid action" msgstr "Nieprawidłowa akcja" -#: src/projectlist.cpp:703 src/customtrackview.cpp:3226 +#: src/customtrackview.cpp:3699 src/projectlist.cpp:962 msgid "Invalid clip" msgstr "Nieprawidłowy klip" -#: src/trackview.cpp:207 +#: src/trackview.cpp:220 msgid "Invalid clip producer %1\n" msgstr "Nieprawidłowy producent klipu %1\n" -#: src/trackview.cpp:521 +#: src/trackview.cpp:575 msgid "Invalid clip removed from track %1 at %2\n" msgstr "Nieprawidłowy klip usunięty ze ścieżki %1 przy %2\n" -#: src/customtrackview.cpp:1856 src/customtrackview.cpp:4379 +#: src/customtrackview.cpp:2075 src/customtrackview.cpp:4880 msgid "Invalid transition" msgstr "Nieprawidłowe przejście" -#: rc.cpp:44 rc.cpp:235 rc.cpp:331 rc.cpp:1962 rc.cpp:2153 rc.cpp:2249 +#: rc.cpp:44 rc.cpp:319 rc.cpp:415 msgid "Invert" msgstr "Odwróć" -#: rc.cpp:237 rc.cpp:2155 +#: rc.cpp:321 msgid "Invert colors" msgstr "Odwróć kolory" -#: src/titlewidget.cpp:169 +#: src/titlewidget.cpp:295 msgid "Invert x axis and change 0 point" msgstr "Odwróć oś X i zmień punkt 0" -#: src/titlewidget.cpp:170 +#: src/titlewidget.cpp:296 msgid "Invert y axis and change 0 point" msgstr "Odwróć oś Y i zmień punkt 0" -#: rc.cpp:1539 rc.cpp:3457 rc.cpp:4936 +#: rc.cpp:1217 rc.cpp:2766 msgid "Item Properties" msgstr "Właściwości elementu" -#: rc.cpp:1314 rc.cpp:3232 rc.cpp:4711 +#: rc.cpp:1397 rc.cpp:2946 msgid "Jack" msgstr "Jack" @@ -2754,15 +2959,15 @@ msgid "Jean-Michel Poure" msgstr "Jean-Michel Poure" -#: rc.cpp:620 rc.cpp:2538 rc.cpp:4017 +#: rc.cpp:1727 rc.cpp:3276 msgid "Job Queue" msgstr "Kolejka zadań" -#: rc.cpp:855 rc.cpp:2773 rc.cpp:4252 +#: rc.cpp:1058 rc.cpp:2607 msgid "Job status" msgstr "Status zadania" -#: rc.cpp:1173 rc.cpp:3091 rc.cpp:4570 +#: rc.cpp:2114 rc.cpp:3663 msgid "Jog Shuttle device disabled." msgstr "Urządzenie Jog Shuttle wyłączone." @@ -2775,83 +2980,85 @@ msgstr "Kdenlive" # placeholder -#: src/kdenlivedoc.cpp:874 src/kdenlivedoc.cpp:877 src/kdenlivedoc.cpp:885 +#: src/kdenlivedoc.cpp:881 src/kdenlivedoc.cpp:884 src/kdenlivedoc.cpp:892 msgid "Keep as placeholder" msgstr "Utrzymaj jako zastępstwo" -#: rc.cpp:1635 rc.cpp:3553 rc.cpp:5032 +#: rc.cpp:1202 rc.cpp:2751 msgid "Keep aspect ratio" msgstr "Utrzymaj współczynnik proporcji" -#: rc.cpp:207 rc.cpp:2125 +#: rc.cpp:261 msgid "Kernel size" msgstr "Rozmiar jądra" -#: rc.cpp:277 rc.cpp:2195 +#: rc.cpp:367 msgid "LADSPA change pitch audio effect" msgstr "Efekt audio LADSPA - zmień pitch" -#: rc.cpp:241 rc.cpp:2159 +#: rc.cpp:325 msgid "LADSPA declipper audio effect" msgstr "Efekt audio LADSPA - usuwanie przesterowania" -#: rc.cpp:245 rc.cpp:2163 +#: rc.cpp:329 msgid "LADSPA equalizer audio effect" msgstr "Efekt audio LADSPA - korektor graficzny" -#: rc.cpp:255 rc.cpp:2173 +#: rc.cpp:339 msgid "LADSPA limiter audio effect" msgstr "Efekt audio LADSPA - ogranicznik" -#: rc.cpp:265 rc.cpp:2183 +#: rc.cpp:349 msgid "LADSPA phaser audio effect" msgstr "Efekt audio LADSPA - fazer" -# same english and polish -#: rc.cpp:283 rc.cpp:2201 +# is it possible to translate 'pitch'? +#: rc.cpp:361 msgid "LADSPA pitch scale audio effect" msgstr "Efekt audio LADSPA - skalowanie pitch" -#: rc.cpp:289 rc.cpp:2207 +#: rc.cpp:373 msgid "LADSPA rate scale audio effect" msgstr "Efekt audio LADSPA - skaluj tempo" -#: rc.cpp:295 rc.cpp:2213 +#: rc.cpp:379 msgid "LADSPA reverb audio effect" msgstr "Efekt audio LADSPA - pogłos" -#: rc.cpp:303 rc.cpp:2221 +#: rc.cpp:387 msgid "LADSPA room reverb audio effect" msgstr "Efekt audio LADSPA - pokojowy pogłos" -#: src/geometryval.cpp:100 rc.cpp:68 rc.cpp:1986 +#: src/geometryval.cpp:101 rc.cpp:68 msgid "Left" msgstr "Lewo" -#: rc.cpp:163 rc.cpp:2081 +#: rc.cpp:197 msgid "Lens Correction" msgstr "Poprawa obiektywu" -#: src/titlewidget.cpp:140 +#: rc.cpp:211 +msgid "Levels" +msgstr "Poziomy" + +#: src/titlewidget.cpp:232 msgctxt "Font style" msgid "Light" msgstr "Światło" -#: rc.cpp:259 rc.cpp:2177 +#: rc.cpp:343 msgid "Limit (dB)" msgstr "Limit (dB)" -#: rc.cpp:253 rc.cpp:2171 +#: rc.cpp:337 msgid "Limiter" msgstr "Ogranicznik" #: src/unicodedialog.cpp:128 msgid "Line Feed (newline character, \\\\n)" -msgstr "" -"Wysuw wiersza (znak nowej linii, \\\n" -")" +msgstr "Wysuw wiersza (znak nowej linii, \\\n)" -#: rc.cpp:247 rc.cpp:2165 +#: rc.cpp:331 msgid "Lo gain" msgstr "Niski zysk" @@ -2859,52 +3066,62 @@ msgid "Load" msgstr "Ładuj" -#: src/titlewidget.cpp:407 +#: src/titlewidget.cpp:621 msgid "Load Image" msgstr "Ładuj obraz" -#: src/titlewidget.cpp:1408 +#: src/titlewidget.cpp:1721 msgid "Load Title" msgstr "Ładuj tytuł" -#: src/kdenlivedoc.cpp:100 +#: src/kdenlivedoc.cpp:103 msgid "Loading" msgstr "Ładowanie" -#: src/projectlist.cpp:952 +#: src/projectlist.cpp:1252 msgid "Loading clips" msgstr "Ładowanie klipów" -#: src/projectlist.cpp:890 +#: src/projectlist.cpp:1164 msgid "Loading thumbnails" msgstr "Ładowanie miniatur" -#: src/locktrackcommand.cpp:31 src/headertrack.cpp:47 +#: src/headertrack.cpp:48 src/locktrackcommand.cpp:31 msgid "Lock track" msgstr "Blokada ścieżki" -#: src/kdenlivedoc.cpp:879 src/kdenlivedoc.cpp:887 +#: src/kdenlivedoc.cpp:886 src/kdenlivedoc.cpp:894 msgid "Looking for %1" msgstr "Szukanie %1" -#: rc.cpp:1365 rc.cpp:1752 rc.cpp:3283 rc.cpp:3670 rc.cpp:4762 rc.cpp:5149 +#: rc.cpp:857 rc.cpp:1010 rc.cpp:1934 rc.cpp:2406 rc.cpp:2559 rc.cpp:3483 msgid "Loop" msgstr "Pętla" -#: src/mainwindow.cpp:873 +#: src/mainwindow.cpp:991 msgid "Loop Zone" msgstr "Pętla w strefie" -#: src/renderwidget.cpp:1111 +#: src/renderwidget.cpp:1166 msgid "Lossless / HQ" msgstr "Bezstratny / HQ" +# ? +#: src/titlewidget.cpp:269 +msgid "Lower object" +msgstr "Niższy obiekt" + +# ? +#: src/titlewidget.cpp:284 +msgid "Lower object to bottom" +msgstr "Niższy obiekt na spód" + # is luma == "luminacja" ? -#: src/documentchecker.cpp:69 +#: src/documentchecker.cpp:120 msgid "Luma file" msgstr "Plik luminacji" -#: rc.cpp:690 rc.cpp:2608 rc.cpp:4087 +#: rc.cpp:1499 rc.cpp:3048 msgid "M" msgstr "M" @@ -2912,7 +3129,7 @@ msgid "MLT Connection, Transition, Effect, Timeline Developer" msgstr "Programista współpracy z MLT, przejść, efektów oraz linii czasu" -#: rc.cpp:1011 rc.cpp:2929 rc.cpp:4408 +#: rc.cpp:1457 rc.cpp:3006 msgid "MLT environment" msgstr "Środowisko MLT" @@ -2920,7 +3137,7 @@ msgid "MLT porting, KDE 4 porting, Main developer" msgstr "Portowanie MLT, portowanie KDE4, główny deweloper" -#: rc.cpp:1014 rc.cpp:2932 rc.cpp:4411 +#: rc.cpp:1460 rc.cpp:3009 msgid "MLT profiles folder" msgstr "Katalog profili MLT" @@ -2932,7 +3149,7 @@ msgid "MLT version: %1" msgstr "Wersja MLT: %1" -#: src/wizard.cpp:546 +#: src/wizard.cpp:558 msgid "" "MLT's SDL module not found. Please check your MLT install. Kdenlive will not " "work until this issue is fixed." @@ -2940,44 +3157,56 @@ "Moduł SDL dla MLT nie znaleziony. Proszę sprawdzić instalację MLT. Kdenlive " "nie będzie działał dopóki ten problem nie zostanie zlikwidowany." -#: rc.cpp:503 rc.cpp:2421 +#: rc.cpp:571 msgid "Make clip play faster or slower" msgstr "Sprawia, że klip jest odtwarzany wolniej lub szybciej" -#: rc.cpp:56 rc.cpp:1974 +#: rc.cpp:48 msgid "Make image greyscale except for chosen color" msgstr "Ustawia obraz na skalę odcieni szarości z wyjątkiem wybranego koloru" -#: rc.cpp:513 rc.cpp:2431 +#: rc.cpp:579 msgid "Make monochrome clip" msgstr "Czyni klip monochromatycznym" -#: rc.cpp:48 rc.cpp:1966 +#: rc.cpp:56 msgid "Make selected color transparent" msgstr "Czyni wybrany kolor przezroczystym" -#: rc.cpp:527 rc.cpp:2445 +#: rc.cpp:607 msgid "Make waves on your clip with keyframes" msgstr "Tworzy fale na twoim klipie na klatkach kluczowych" -#: src/mainwindow.cpp:833 +#: src/mainwindow.cpp:949 msgid "Manage Project Profiles" msgstr "Zarządzanie profilami projektu" +#: rc.cpp:287 +msgid "Map black to" +msgstr "Mapuj czarny do" + +#: rc.cpp:289 +msgid "Map white to" +msgstr "Mapuj biały do" + +#: rc.cpp:285 +msgid "Maps source image luminance between two colors specified" +msgstr "Mapuj luminację obrazu wejściowego pomiędzy dwa wybrane kolory" + #: src/main.cpp:39 msgid "Marco Gittler" msgstr "Marco Gittler" -#: src/definitions.h:151 src/clipproperties.cpp:296 src/mainwindow.cpp:2029 -#: src/docclipbase.cpp:349 rc.cpp:1452 rc.cpp:3370 rc.cpp:4849 +#: src/mainwindow.cpp:2227 src/definitions.h:153 src/clipproperties.cpp:426 +#: src/docclipbase.cpp:361 rc.cpp:1025 rc.cpp:2574 msgid "Marker" msgstr "Znacznik" -#: rc.cpp:1779 rc.cpp:3697 rc.cpp:5176 rc.cpp:5433 +#: rc.cpp:884 rc.cpp:2433 rc.cpp:3753 msgid "Markers" msgstr "Znaczniki" -#: src/renderwidget.cpp:1110 +#: src/renderwidget.cpp:1165 msgid "Media players" msgstr "Odtwarzacze multimediów" @@ -2985,19 +3214,19 @@ msgid "Melt" msgstr "Melt" -#: rc.cpp:1017 rc.cpp:2935 rc.cpp:4414 +#: rc.cpp:1463 rc.cpp:3012 msgid "Melt path" msgstr "Ścieżka Melt" -#: src/dvdwizard.cpp:329 +#: src/dvdwizard.cpp:340 msgid "Menu job timed out" msgstr "Przekroczony czas na zadanie menu" -#: rc.cpp:1797 rc.cpp:3715 rc.cpp:5194 +#: rc.cpp:902 rc.cpp:2451 msgid "Metadata" msgstr "Metadane" -#: rc.cpp:249 rc.cpp:2167 +#: rc.cpp:333 msgid "Mid gain" msgstr "Średni zysk" @@ -3005,64 +3234,76 @@ msgid "Minus sign. For numbers: −42" msgstr "Znak minus. Dla liczb: −42" -#: rc.cpp:325 rc.cpp:2243 +#: rc.cpp:409 msgid "Mirror" msgstr "Odbicie lustrzane" -#: rc.cpp:329 rc.cpp:2247 +#: rc.cpp:413 msgid "Mirroring direction" msgstr "Kierunek odbicia lustrzanego" -#: src/kdenlivesettingsdialog.cpp:52 +#: src/effectslistwidget.cpp:87 src/kdenlivesettingsdialog.cpp:52 msgid "Misc" msgstr "Różne" -#: src/monitor.cpp:96 src/geometryval.cpp:78 +#: src/monitor.cpp:96 src/geometryval.cpp:79 msgid "Misc..." msgstr "Różne..." -#: src/kdenlivedoc.cpp:653 src/kdenlivedoc.cpp:669 src/kdenlivedoc.cpp:684 +#: src/projectitem.cpp:162 +msgid "Missing" +msgstr "Brakuje" + +#: src/kdenlivedoc.cpp:660 src/kdenlivedoc.cpp:676 src/kdenlivedoc.cpp:691 msgid "Missing Profile" msgstr "Brakujący profil" -#: rc.cpp:897 rc.cpp:2815 rc.cpp:4294 +#: src/dvdwizardmenu.cpp:169 +msgid "Missing background image" +msgstr "Brakujący obraz tła" + +#: rc.cpp:1898 rc.cpp:3447 msgid "Missing clips" msgstr "Brakujące klipy" -#: rc.cpp:42 rc.cpp:1960 +#: rc.cpp:42 msgid "Mix" msgstr "Mix" -#: src/renderwidget.cpp:1112 +#: src/renderwidget.cpp:1167 msgid "Mobile devices" msgstr "Urządzenia przenośne" -#: rc.cpp:213 rc.cpp:2131 +#: rc.cpp:297 msgid "Mode" msgstr "Tryb" -#: rc.cpp:5454 +#: rc.cpp:3780 msgid "Monitor" msgstr "Monitor" # not 100% sure -#: rc.cpp:1164 rc.cpp:3082 rc.cpp:4561 +#: rc.cpp:1088 rc.cpp:2637 msgid "Monitor Preview Speedup Settings" msgstr "Ustawienia przyspieszania monitora podglądu" -#: rc.cpp:1161 rc.cpp:3079 rc.cpp:4558 +#: rc.cpp:1085 rc.cpp:2634 msgid "Monitor background color (requires restart)" msgstr "Kolor tła monitora (wymaga restartu)" -#: src/monitor.cpp:217 +#: src/monitor.cpp:215 msgid "Monitor overlay infos" msgstr "Monitoruj informacje o warstwach" -#: rc.cpp:28 rc.cpp:1946 +#: rc.cpp:28 msgid "Mono to stereo" msgstr "Mono na stereo" -#: src/moveclipcommand.cpp:33 src/customtrackview.cpp:2607 +#: rc.cpp:629 +msgid "Motion" +msgstr "Ruch" + +#: src/moveclipcommand.cpp:33 src/customtrackview.cpp:2989 msgid "Move clip" msgstr "Przesuń klip" @@ -3078,7 +3319,7 @@ msgid "Move effect up" msgstr "Przesuń efekt w górę" -#: src/movegroupcommand.cpp:35 +#: src/movegroupcommand.cpp:35 src/customtrackview.cpp:3135 msgid "Move group" msgstr "Przesuń grupę" @@ -3086,32 +3327,31 @@ msgid "Move guide" msgstr "Przesuń wskaźnik " -#: src/movetransitioncommand.cpp:30 +#: src/movetransitioncommand.cpp:30 src/customtrackview.cpp:3116 msgid "Move transition" msgstr "Przesuń przejście" -#: rc.cpp:759 rc.cpp:2677 rc.cpp:4156 +#: rc.cpp:2147 rc.cpp:3696 msgid "Movie file" msgstr "Plik filmowy" -#: rc.cpp:333 rc.cpp:2251 +#: rc.cpp:417 msgid "Mute" msgstr "Wycisz" -#: rc.cpp:335 rc.cpp:2253 +#: rc.cpp:419 msgid "Mute clip" msgstr "Wycisz klip" -#: src/headertrack.cpp:45 +#: src/headertrack.cpp:46 msgid "Mute track" msgstr "Wycisz ścieżkę" -#: src/projectitem.cpp:191 src/documentchecker.cpp:86 +#: src/documentchecker.cpp:136 src/projectitem.cpp:168 msgid "Mute video clip" msgstr "Wycisz klip wideo" -#: rc.cpp:696 rc.cpp:915 rc.cpp:1788 rc.cpp:2614 rc.cpp:2833 rc.cpp:3706 -#: rc.cpp:4093 rc.cpp:4312 rc.cpp:5185 +#: rc.cpp:893 rc.cpp:938 rc.cpp:1505 rc.cpp:2442 rc.cpp:2487 rc.cpp:3054 msgid "N" msgstr "N" @@ -3119,7 +3359,7 @@ msgid "NAME OF TRANSLATORS" msgstr "Mariusz Pluciński" -#: rc.cpp:557 rc.cpp:2475 rc.cpp:3954 +#: rc.cpp:1661 rc.cpp:3210 msgid "NTSC" msgstr "NTSC" @@ -3131,28 +3371,28 @@ msgid "NTSC 4:3" msgstr "NTSC 4:3" -#: src/kdenlivesettingsdialog.cpp:548 rc.cpp:1350 rc.cpp:1671 rc.cpp:1840 -#: rc.cpp:3268 rc.cpp:3589 rc.cpp:3758 rc.cpp:4747 rc.cpp:5068 rc.cpp:5237 +#: src/kdenlivesettingsdialog.cpp:552 rc.cpp:1919 rc.cpp:2039 rc.cpp:2159 +#: rc.cpp:3468 rc.cpp:3588 rc.cpp:3708 msgid "Name" msgstr "Nazwa" -#: src/effectstackview.cpp:101 +#: src/effectstackview.cpp:102 msgid "Name for saved effect: " msgstr "Nazwa dla zapisanego efektu:" -#: src/kdenlivesettingsdialog.cpp:238 +#: src/kdenlivesettingsdialog.cpp:242 msgid "Nano X" msgstr "Nano X" -#: rc.cpp:134 rc.cpp:2052 +#: rc.cpp:136 msgid "Neutral Color" msgstr "Kolor neutralny" -#: src/trackview.cpp:872 +#: src/trackview.cpp:937 msgid "New Track Name" msgstr "Nazwa nowej ścieżki" -#: src/customtrackview.cpp:3195 +#: src/customtrackview.cpp:3664 msgid "New speed (percents)" msgstr "Nowa szybkość (procenty)" @@ -3160,7 +3400,7 @@ msgid "Next Unicode character (Arrow Down)" msgstr "Następny znak Unicode (Strzałka w dół)" -#: src/titlewidget.cpp:158 +#: src/titlewidget.cpp:250 msgid "No alignment" msgstr "Bez wyrównania" @@ -3168,89 +3408,102 @@ msgid "No burning program found (K3b, Brasero)" msgstr "Nie znaleziono programu nagrywającego (K3b, Brasero)" -#: src/customtrackview.cpp:3327 src/customtrackview.cpp:4335 +#: src/dvdwizardmenu.cpp:161 +msgid "No button in menu" +msgstr "Brak przycisku w menu" + +#: src/customtrackview.cpp:3800 src/customtrackview.cpp:4833 msgid "No clip copied" msgstr "Nie skopiowano klipów" -#: src/projectsettings.cpp:88 -msgid "No clip to delete" -msgstr "Nie ma klipów do usunięcia" +#: src/mainwindow.cpp:3063 +msgid "No clip to transcode" +msgstr "Nie ma klipów do przekodowania" -#: src/customtrackview.cpp:4875 +#: src/customtrackview.cpp:5438 msgid "No empty space to put clip audio" msgstr "Nie ma wolnego miejsca na klip audio" -#: src/customtrackview.cpp:4010 src/customtrackview.cpp:4056 -#: src/customtrackview.cpp:4094 +#: src/customtrackview.cpp:4489 src/customtrackview.cpp:4535 +#: src/customtrackview.cpp:4573 msgid "No guide at cursor time" msgstr "Brak wskaźnika na wybranym czasie" -#: rc.cpp:1380 rc.cpp:1767 rc.cpp:3298 rc.cpp:3685 rc.cpp:4777 rc.cpp:5164 +#: src/clipproperties.cpp:642 rc.cpp:872 rc.cpp:1949 rc.cpp:2421 rc.cpp:3498 msgid "No image found" msgstr "Nie znaleziono obrazów" -#: src/mainwindow.cpp:2060 src/mainwindow.cpp:2110 +#: src/mainwindow.cpp:2258 src/mainwindow.cpp:2308 msgid "No marker found at cursor time" msgstr "Brak znacznika na wybranym czasie" +#: src/dvdwizardmenu.cpp:181 +msgid "No menu entry for %1" +msgstr "Brak wpisu menu dla %1" + #: src/unicodedialog.cpp:132 msgid "No-break space. &nbsp; in HTML. See U+2009 and U+0020." msgstr "Niełamliwy odstęp. &nbsp; w HTML. Zobacz U+2009 i U+0020." -#: src/initeffects.cpp:69 src/initeffects.cpp:648 +#: src/titlewidget.cpp:176 src/titlewidget.cpp:527 src/initeffects.cpp:69 +#: src/initeffects.cpp:648 msgid "None" msgstr "Brak" -#: src/titlewidget.cpp:141 +#: src/titlewidget.cpp:233 msgctxt "Font style" msgid "Normal" msgstr "Normalny" -#: rc.cpp:339 rc.cpp:2257 +#: src/mainwindow.cpp:762 +msgid "Normal mode" +msgstr "Tryb normalny" + +#: rc.cpp:423 msgid "Normalise" msgstr "Normalizuj" -#: rc.cpp:1119 rc.cpp:3037 rc.cpp:4516 +#: rc.cpp:2024 rc.cpp:3573 msgid "Normalise audio for thumbnails" msgstr "Normalizuj dźwięk dla miniatur" -#: rc.cpp:341 rc.cpp:2259 +#: rc.cpp:425 msgid "Normalise audio volume" msgstr "Normalizuj głośność dźwięku" -#: src/recmonitor.cpp:588 rc.cpp:675 rc.cpp:2593 rc.cpp:4072 +#: src/recmonitor.cpp:593 rc.cpp:1439 rc.cpp:2988 msgid "Not connected" msgstr "Nie podłączony" -#: src/mainwindow.cpp:2493 +#: src/mainwindow.cpp:2786 msgid "Not found: %1" msgstr "Nie znaleziono: %1" -#: src/kdenlivesettingsdialog.cpp:216 +#: src/kdenlivesettingsdialog.cpp:220 msgid "OSS" msgstr "OSS" -#: src/kdenlivesettingsdialog.cpp:219 +#: src/kdenlivesettingsdialog.cpp:223 msgid "OSS with DMA access" msgstr "OSS z dostępem DMA" -#: rc.cpp:10 rc.cpp:345 rc.cpp:1928 rc.cpp:2263 +#: rc.cpp:10 rc.cpp:429 msgid "Obscure" msgstr "Zamaskowanie" -#: rc.cpp:1335 rc.cpp:3253 rc.cpp:4732 +#: rc.cpp:1160 rc.cpp:1421 rc.cpp:2709 rc.cpp:2970 msgid "Offset" msgstr "Przesunięcie" -#: rc.cpp:708 rc.cpp:2626 rc.cpp:4105 +#: rc.cpp:1517 rc.cpp:3066 msgid "Opacity" msgstr "Nieprzezroczystość" -#: src/titlewidget.cpp:226 +#: src/titlewidget.cpp:354 msgid "Open Document" msgstr "Otwórz plik" -#: rc.cpp:614 rc.cpp:2532 rc.cpp:4011 +#: rc.cpp:1718 rc.cpp:3267 msgid "Open Dvd wizard after rendering" msgstr "Otwórz kreator DVD po renderowaniu" @@ -3259,19 +3512,19 @@ msgid "Open box; stands for a space." msgstr "Otwarty przedział; oznacza odstęp" -#: rc.cpp:590 rc.cpp:2508 rc.cpp:3987 +#: rc.cpp:1694 rc.cpp:3243 msgid "Open browser window after export" msgstr "Otwórz okno przeglądarki po eksporcie" -#: rc.cpp:1383 rc.cpp:3301 rc.cpp:4780 +#: rc.cpp:1823 rc.cpp:3372 msgid "Open last project on startup" msgstr "Otwórz ostatni projekt przy uruchamianiu" -#: rc.cpp:1389 rc.cpp:3307 rc.cpp:4786 +#: rc.cpp:1829 rc.cpp:3378 msgid "Open projects in new tabs" msgstr "Otwieraj projekty w nowych zakładkach" -#: src/mainwindow.cpp:1464 +#: src/mainwindow.cpp:1654 msgid "Opening file %1" msgstr "Otwieranie pliku %1" @@ -3279,15 +3532,15 @@ msgid "Original KDE 3 version author (not active anymore)" msgstr "Autor oryginalnej wersji dla KDE3 (nie jest już aktywny)" -#: src/geometryval.cpp:91 +#: src/geometryval.cpp:92 msgid "Original size" msgstr "Oryginalny rozmiar" -#: src/titlewidget.cpp:176 +#: src/titlewidget.cpp:302 msgid "Original size (1:1)" msgstr "Oryginalny rozmiar (1:1)" -#: rc.cpp:92 rc.cpp:2010 +#: rc.cpp:116 msgid "Out" msgstr "Na zewnątrz" @@ -3295,19 +3548,36 @@ msgid "Out Point" msgstr "Punkt na zewnątrz" -#: rc.cpp:545 rc.cpp:2463 rc.cpp:3942 +# or 'Szkic' +#: rc.cpp:1238 rc.cpp:2787 +msgid "Outline" +msgstr "Obrys" + +#: src/titlewidget.cpp:90 +msgid "Outline color opacity" +msgstr "Nieprzezroczystość koloru obrysu" + +#: src/titlewidget.cpp:96 +msgid "Outline width" +msgstr "Szerokość obrysu" + +#: rc.cpp:1649 rc.cpp:3198 msgid "Output file" msgstr "Plik wynikowy" -#: src/renderwidget.cpp:652 +#: src/renderwidget.cpp:685 msgid "Output file already exists. Do you want to overwrite it?" msgstr "Plik wynikowy już istnieje. Czy chcesz go nadpisać?" -#: rc.cpp:693 rc.cpp:2611 rc.cpp:4090 +#: src/mainwindow.cpp:768 +msgid "Overwrite mode" +msgstr "Tryb nadpisywania" + +#: rc.cpp:1502 rc.cpp:3051 msgid "P" msgstr "P" -#: rc.cpp:554 rc.cpp:2472 rc.cpp:3951 +#: rc.cpp:1658 rc.cpp:3207 msgid "PAL" msgstr "PAL" @@ -3319,11 +3589,11 @@ msgid "PAL 4:3" msgstr "PAL 4:3" -#: rc.cpp:351 rc.cpp:381 rc.cpp:2269 rc.cpp:2299 +#: rc.cpp:435 rc.cpp:465 msgid "Pan and Zoom" msgstr "Przesunięcie i powiększenie" -#: rc.cpp:894 rc.cpp:2812 rc.cpp:4291 +#: rc.cpp:1535 rc.cpp:3084 msgid "Param" msgstr "Parametr" @@ -3331,31 +3601,31 @@ msgid "Parameter info" msgstr "Informacje o parametrze" -#: src/kdenlivesettingsdialog.cpp:548 rc.cpp:1146 rc.cpp:3064 rc.cpp:4543 +#: src/kdenlivesettingsdialog.cpp:552 rc.cpp:1817 rc.cpp:3366 msgid "Parameters" msgstr "Parametry" -#: src/mainwindow.cpp:1067 +#: src/mainwindow.cpp:1255 msgid "Paste Effects" msgstr "Wklej efekty" -#: rc.cpp:903 rc.cpp:1686 rc.cpp:2821 rc.cpp:3604 rc.cpp:4300 rc.cpp:5083 +#: rc.cpp:791 rc.cpp:1904 rc.cpp:2340 rc.cpp:3453 msgid "Path" msgstr "Ścieżka" -#: rc.cpp:215 rc.cpp:2133 +#: rc.cpp:299 msgid "Phase Increment" msgstr "Zwiększ fazę" -#: rc.cpp:263 rc.cpp:2181 +#: rc.cpp:347 msgid "Phaser" msgstr "Fazer" -#: rc.cpp:281 rc.cpp:2199 +#: rc.cpp:359 msgid "Pitch Scaler" msgstr "Skalowanie pitch" -#: rc.cpp:275 rc.cpp:2193 +#: rc.cpp:365 msgid "Pitch Shift" msgstr "Przesuwanie pitch" @@ -3363,36 +3633,36 @@ msgid "Pixbuf module" msgstr "Moduł pixbuf" -#: rc.cpp:792 rc.cpp:1719 rc.cpp:2710 rc.cpp:3637 rc.cpp:4189 rc.cpp:5116 +#: rc.cpp:685 rc.cpp:824 rc.cpp:2234 rc.cpp:2373 msgid "Pixel aspect ratio" msgstr "Proporcje pikseli" -#: src/wizard.cpp:481 rc.cpp:3864 rc.cpp:5343 +#: src/wizard.cpp:493 rc.cpp:1583 rc.cpp:3132 msgid "Pixel aspect ratio:" msgstr "Proporcje pikseli:" -#: rc.cpp:157 rc.cpp:2075 +#: rc.cpp:191 msgid "Plasma" msgstr "Plasma" -#: src/dvdwizardmenu.cpp:31 src/monitor.cpp:81 src/mainwindow.cpp:860 -#: src/recmonitor.cpp:74 +#: src/recmonitor.cpp:75 src/mainwindow.cpp:978 src/monitor.cpp:81 +#: src/dvdwizardmenu.cpp:32 msgid "Play" msgstr "Odtwarzaj" -#: src/kdenlivesettingsdialog.cpp:110 +#: src/kdenlivesettingsdialog.cpp:114 msgid "Play / Pause" msgstr "Odtwarzanie / Pauza" -#: src/dvdwizardmenu.cpp:287 +#: src/dvdwizardmenu.cpp:307 msgid "Play All" msgstr "Odtwórz wszystko" -#: src/mainwindow.cpp:868 +#: src/mainwindow.cpp:986 msgid "Play Zone" msgstr "Odtwórz strefę" -#: rc.cpp:593 rc.cpp:2511 rc.cpp:3990 +#: rc.cpp:1697 rc.cpp:3246 msgid "Play after render" msgstr "Odtwórz po renderowaniu" @@ -3400,11 +3670,11 @@ msgid "Play..." msgstr "Odtwórz..." -#: src/kdenlivesettingsdialog.cpp:99 +#: src/kdenlivesettingsdialog.cpp:103 msgid "Playback" msgstr "Odtwarzanie" -#: src/projectitem.cpp:213 src/documentchecker.cpp:92 +#: src/documentchecker.cpp:142 src/projectitem.cpp:190 msgid "Playlist clip" msgstr "Klipy listy odtwarzania" @@ -3420,16 +3690,16 @@ msgid "Please report bugs to http://kdenlive.org/mantis" msgstr "Proszę zgłaszać błędy do http://kdenlive.org/mantis" -#: src/projectlist.cpp:211 +#: src/projectlist.cpp:295 msgid "" "Please set a default application to open audio files in the Settings dialog" msgstr "Ustaw domyślną aplikację do otwierania plików audio w oknie Ustawienia" -#: src/projectlist.cpp:207 +#: src/projectlist.cpp:291 msgid "Please set a default application to open images in the Settings dialog" msgstr "Ustaw domyślną aplikację do otwierania obrazów w oknie Ustawienia" -#: rc.cpp:1473 rc.cpp:3391 rc.cpp:4870 +#: rc.cpp:1952 rc.cpp:3501 msgid "Please set your default video profile" msgstr "Ustaw swój domyślny profil wideo" @@ -3437,7 +3707,7 @@ msgid "Please upgrade to the latest MLT version" msgstr "Zaaktualizuj MLT do najnowszej wersji" -#: src/recmonitor.cpp:239 +#: src/recmonitor.cpp:240 msgid "" "Plug your camcorder and\n" "press connect button\n" @@ -3451,25 +3721,68 @@ "Pliki zostaną zapisane w:\n" "%1" -#: rc.cpp:1317 rc.cpp:3235 rc.cpp:4714 +#: rc.cpp:169 +msgid "Point 1 input value" +msgstr "Wartość wejściowa punktu 1" + +#: rc.cpp:171 +msgid "Point 1 output value" +msgstr "Wartość wyjściowa punktu 1" + +#: rc.cpp:173 +msgid "Point 2 input value" +msgstr "Wartość wejściowa punktu 2" + +#: rc.cpp:175 +msgid "Point 2 output value" +msgstr "Wartość wyjściowa punktu 2" + +#: rc.cpp:177 +msgid "Point 3 input value" +msgstr "Wartość wejściowa punktu 3" + +#: rc.cpp:179 +msgid "Point 3 output value" +msgstr "Wartość wyjściowa punktu 3" + +#: rc.cpp:181 +msgid "Point 4 input value" +msgstr "Wartość wejściowa punktu 4" + +#: rc.cpp:183 +msgid "Point 4 output value" +msgstr "Wartość wyjściowa punktu 4" + +#: rc.cpp:185 +msgid "Point 5 input value" +msgstr "Wartość wejściowa punktu 5" + +#: rc.cpp:187 +msgid "Point 5 output value" +msgstr "Wartość wyjściowa punktu 5" + +#: rc.cpp:1400 rc.cpp:2949 msgid "Ports:" msgstr "Porty:" -#: rc.cpp:705 rc.cpp:2623 rc.cpp:3834 rc.cpp:4102 rc.cpp:5313 +#: rc.cpp:1514 rc.cpp:3063 msgid "Pos" msgstr "Poz." -#: src/keyframeedit.cpp:38 rc.cpp:888 rc.cpp:1074 rc.cpp:1470 rc.cpp:1858 -#: rc.cpp:2806 rc.cpp:2992 rc.cpp:3388 rc.cpp:3776 rc.cpp:4285 rc.cpp:4471 -#: rc.cpp:4867 rc.cpp:5255 +#: rc.cpp:715 rc.cpp:1043 rc.cpp:1274 rc.cpp:2006 rc.cpp:2093 rc.cpp:2264 +#: rc.cpp:2592 rc.cpp:2823 rc.cpp:3555 rc.cpp:3642 msgid "Position" msgstr "Pozycja" -#: rc.cpp:1575 rc.cpp:3493 rc.cpp:4972 +#: src/customruler.cpp:202 src/customruler.cpp:203 src/smallruler.cpp:120 +msgid "Position: %1" +msgstr "Pozycja: %1" + +#: rc.cpp:1256 rc.cpp:2805 msgid "Preserve aspect ratio" msgstr "Chroń współczynnik proporcji" -#: src/recmonitor.cpp:271 +#: src/recmonitor.cpp:273 msgid "" "Press play or record button\n" "to start video capture\n" @@ -3481,7 +3794,7 @@ "Pliki zostaną zapisane w:\n" "%1" -#: src/recmonitor.cpp:193 src/recmonitor.cpp:589 +#: src/recmonitor.cpp:194 src/recmonitor.cpp:594 msgid "" "Press record button\n" "to start screen capture\n" @@ -3493,7 +3806,7 @@ "Pliki zostaną zapisane w:\n" "%1" -#: rc.cpp:957 rc.cpp:2875 rc.cpp:4354 +#: rc.cpp:1784 rc.cpp:3333 msgid "Preview" msgstr "Podgląd" @@ -3501,90 +3814,93 @@ msgid "Previous Unicode character (Arrow Up)" msgstr "Poprzedni znak Unicode (Strzałka w górę)" -#: src/customtrackview.cpp:1395 src/customtrackview.cpp:1406 -#: src/customtrackview.cpp:1426 +#: src/customtrackview.cpp:1572 src/customtrackview.cpp:1583 +#: src/customtrackview.cpp:1597 msgid "Problem adding effect to clip" msgstr "Problem przy dodawaniu efektu do klipu" -#: src/customtrackview.cpp:1388 src/customtrackview.cpp:1448 -#: src/customtrackview.cpp:1603 +#: src/customtrackview.cpp:1565 src/customtrackview.cpp:1618 msgid "Problem deleting effect" msgstr "Problem przy usuwaniu efektu" -#: src/customtrackview.cpp:1605 src/customtrackview.cpp:3748 -#: src/customtrackview.cpp:3766 src/customtrackview.cpp:3788 -#: src/customtrackview.cpp:3806 +#: src/customtrackview.cpp:1783 src/customtrackview.cpp:1817 +#: src/customtrackview.cpp:4227 src/customtrackview.cpp:4245 +#: src/customtrackview.cpp:4267 src/customtrackview.cpp:4285 msgid "Problem editing effect" msgstr "Problem przy edycji efektu" -#: rc.cpp:771 rc.cpp:867 rc.cpp:1413 rc.cpp:2689 rc.cpp:2785 rc.cpp:3331 -#: rc.cpp:3849 rc.cpp:4168 rc.cpp:4264 rc.cpp:4810 rc.cpp:5328 +#: rc.cpp:664 rc.cpp:1070 rc.cpp:1568 rc.cpp:1853 rc.cpp:2213 rc.cpp:2619 +#: rc.cpp:3117 rc.cpp:3402 msgid "Profile" msgstr "Profil" -#: src/renderwidget.cpp:371 src/renderwidget.cpp:478 +#: src/renderwidget.cpp:401 src/renderwidget.cpp:518 msgid "Profile already exists" msgstr "Profil już istnieje" -#: rc.cpp:1140 rc.cpp:3058 rc.cpp:4537 +#: rc.cpp:1811 rc.cpp:3360 msgid "Profile name" msgstr "Nazwa profilu" -#: rc.cpp:768 rc.cpp:2686 rc.cpp:4165 +#: rc.cpp:661 rc.cpp:2210 msgid "Profiles" msgstr "Profile" -#: src/renderwidget.cpp:161 +#: src/renderwidget.cpp:167 msgid "Progress" msgstr "Postęp" -#: src/kdenlivesettingsdialog.cpp:504 src/projectsettings.cpp:157 rc.cpp:804 -#: rc.cpp:2722 rc.cpp:4201 +#: src/kdenlivesettingsdialog.cpp:508 src/projectsettings.cpp:199 rc.cpp:697 +#: rc.cpp:2246 msgid "Progressive" msgstr "Progresywny" -#: rc.cpp:5415 +#: rc.cpp:3735 msgid "Project" msgstr "Projekt" -#: rc.cpp:3894 rc.cpp:5373 +#: rc.cpp:1613 rc.cpp:3162 msgid "Project Files" msgstr "Pliki projektu" -#: src/mainwindow.cpp:193 +#: src/mainwindow.cpp:203 msgid "Project Monitor" msgstr "Monitor projektu" -#: src/mainwindow.cpp:847 rc.cpp:3837 rc.cpp:5316 +#: src/mainwindow.cpp:965 rc.cpp:1556 rc.cpp:3105 msgid "Project Settings" msgstr "Ustawienia projektu" -#: src/mainwindow.cpp:149 +#: src/mainwindow.cpp:159 msgid "Project Tree" msgstr "Drzewo projektu" -#: rc.cpp:1023 rc.cpp:2941 rc.cpp:3843 rc.cpp:4420 rc.cpp:5322 +#: rc.cpp:1631 rc.cpp:3180 +msgid "Project files" +msgstr "Pliki projektu" + +#: rc.cpp:1469 rc.cpp:1562 rc.cpp:3018 rc.cpp:3111 msgid "Project folder" msgstr "Katalog projektu" -#: src/kdenlivedoc.cpp:669 +#: src/kdenlivedoc.cpp:676 msgid "Project profile not found, replacing with existing one: %1" msgstr "Profil projektu nie znaleziony, zastępowanie przez istniejący: %1" -#: src/kdenlivedoc.cpp:684 +#: src/kdenlivedoc.cpp:691 msgid "Project profile was not found, it will be added to your system now." msgstr "" "Profil projektu nie znaleziony, zostanie dodany do twojego sytemu teraz." -#: src/kdenlivedoc.cpp:653 +#: src/kdenlivedoc.cpp:660 msgid "Project profile was not found, using default profile." msgstr "Profil projektu nie znaleziony, użycie domyślnego profilu." -#: rc.cpp:774 rc.cpp:2692 rc.cpp:4171 +#: rc.cpp:667 rc.cpp:2216 msgid "Properties" msgstr "Właściwości" -#: src/kdenlivesettingsdialog.cpp:218 +#: src/kdenlivesettingsdialog.cpp:222 msgid "PulseAudio" msgstr "PulseAudio" @@ -3608,6 +3924,10 @@ msgid "QImage module" msgstr "Moduł QImage" +#: rc.cpp:1433 rc.cpp:2982 +msgid "Quality" +msgstr "Jakość" + #: src/unicodedialog.cpp:168 msgid "" "Quarter note (Am.) or crochet (Brit.). See Wikipedia:Quarter_note (ang.)" -#: rc.cpp:924 rc.cpp:2842 rc.cpp:4321 +#: rc.cpp:947 rc.cpp:2496 msgid "R" msgstr "R" -#: rc.cpp:317 rc.cpp:2235 +#: rc.cpp:401 msgid "RPM" msgstr "RPM" -#: rc.cpp:291 rc.cpp:2209 +# what's that? +#: rc.cpp:1151 rc.cpp:1154 rc.cpp:2700 rc.cpp:2703 +msgid "Radius" +msgstr "Promień" + +# what's that? +#: src/titlewidget.cpp:263 +msgid "Raise object" +msgstr "Przenieś obiekt" + +# what's that? +#: src/titlewidget.cpp:277 +msgid "Raise object to top" +msgstr "Przenieś obiekt na wierzch" + +#: rc.cpp:375 msgid "Rate" msgstr "Tempo" -#: rc.cpp:267 rc.cpp:2185 +#: rc.cpp:351 msgid "Rate (Hz)" msgstr "Tempo (Hz)" -#: rc.cpp:287 rc.cpp:2205 +#: rc.cpp:371 msgid "Rate Scaler" msgstr "Skalowanie tempa" -#: src/projectlistview.cpp:46 +#: src/projectlistview.cpp:49 msgid "Rating" msgstr "Ocena" @@ -3644,35 +3979,35 @@ msgid "Ray Lehtiniemi" msgstr "Ray Lehtiniemi" -#: src/razorclipcommand.cpp:32 +#: src/razorclipcommand.cpp:33 msgid "Razor clip" msgstr "Cięcie klipu" -#: src/mainwindow.cpp:699 +#: src/mainwindow.cpp:799 msgid "Razor tool" msgstr "Narzędzie cięcia" -#: src/mainwindow.cpp:2481 +#: src/mainwindow.cpp:2774 msgid "Reached end of project" msgstr "Osiągnięto koniec projektu" -#: src/monitor.cpp:222 +#: src/monitor.cpp:220 msgid "Real time (drop frames)" msgstr "Czas rzeczywisty (porzucanie klatek)" -#: src/recmonitor.cpp:83 +#: src/recmonitor.cpp:84 msgid "Record" msgstr "Rekord" -#: src/mainwindow.cpp:200 +#: src/mainwindow.cpp:210 msgid "Record Monitor" msgstr "Monitor rekordu" -#: src/kdenlivesettingsdialog.cpp:180 +#: src/kdenlivesettingsdialog.cpp:184 msgid "Recordmydesktop found at: %1" msgstr "Recordmydesktop znaleziony w: %1" -#: src/recmonitor.cpp:190 +#: src/recmonitor.cpp:191 msgid "" "Recordmydesktop utility not found,\n" " please install it for screen grabs" @@ -3680,51 +4015,51 @@ "Program Recordmydesktop nie znaleziony,\n" "zainstaluj go aby wykonywać zrzuty ekranu" -#: src/mainwindow.cpp:1452 +#: src/mainwindow.cpp:1642 msgid "Recover" msgstr "Odzyskiwanie" -#: rc.cpp:355 rc.cpp:2273 +#: rc.cpp:439 msgid "Rectangle" msgstr "Prostokąt" -#: rc.cpp:349 rc.cpp:2267 +#: rc.cpp:433 msgid "Region" msgstr "Region" -#: rc.cpp:1326 rc.cpp:3244 rc.cpp:4723 +#: rc.cpp:1409 rc.cpp:2958 msgid "Region capture" msgstr "Region przechwytywania" -#: rc.cpp:261 rc.cpp:2179 +#: rc.cpp:345 msgid "Release time (s)" msgstr "Czas opuszczony (s)" -#: src/mainwindow.cpp:1163 +#: src/mainwindow.cpp:1351 msgid "Reload Clip" msgstr "Przeładuj klip" -#: src/renderwidget.cpp:1457 +#: src/renderwidget.cpp:1524 msgid "Remove Job" msgstr "Usuń zadanie" -#: src/mainwindow.cpp:1035 src/customtrackview.cpp:2265 +#: src/mainwindow.cpp:1223 src/customtrackview.cpp:2648 msgid "Remove Space" msgstr "Usuń odstęp" -#: rc.cpp:765 rc.cpp:2683 rc.cpp:4162 +#: rc.cpp:2153 rc.cpp:3702 msgid "Remove chapter" msgstr "Usuń rozdział" -#: src/documentchecker.cpp:350 +#: src/documentchecker.cpp:473 msgid "Remove clips" msgstr "Usuń klipy" -#: rc.cpp:1894 rc.cpp:3812 rc.cpp:5291 +#: rc.cpp:658 rc.cpp:2207 msgid "Remove file" msgstr "Usuń plik" -#: rc.cpp:912 rc.cpp:2830 rc.cpp:4309 +#: rc.cpp:1913 rc.cpp:3462 msgid "Remove selected clips" msgstr "Usuń wybrane klipy " @@ -3732,11 +4067,15 @@ msgid "Remove space" msgstr "Usuń odstęp" -#: src/trackview.cpp:351 +#: src/trackview.cpp:311 msgid "Removed invalid transition: %1" msgstr "Usunięto nieprawidłowe przejście: %1" -#: src/headertrack.cpp:88 +#: src/trackview.cpp:386 +msgid "Removed invalid transition: (%1, %2, %3)" +msgstr "Usunięto nieprawidłowe przejście: (%1, %2, %3)" + +#: src/headertrack.cpp:94 msgid "Rename Track" msgstr "Zmień nazwę ścieżki" @@ -3744,15 +4083,15 @@ msgid "Rename folder" msgstr "Zmień nazwę katalogu" -#: src/mainwindow.cpp:851 +#: src/mainwindow.cpp:969 msgid "Render" msgstr "Renderowanie" -#: rc.cpp:539 rc.cpp:2457 rc.cpp:3936 +#: rc.cpp:1643 rc.cpp:3192 msgid "Render Project" msgstr "Renderowanie projektu" -#: src/renderwidget.cpp:93 +#: src/renderwidget.cpp:96 msgid "Render to File" msgstr "Renderuj do pliku" @@ -3760,23 +4099,23 @@ msgid "Rendering" msgstr "Renderowanie" -#: src/renderwidget.cpp:845 +#: src/renderwidget.cpp:888 msgid "Rendering %1 started" msgstr "Renderowanie %1 rozpoczęte" -#: src/renderwidget.cpp:1428 +#: src/renderwidget.cpp:1485 msgid "Rendering aborted" msgstr "Renderowanie przerwane" -#: src/renderwidget.cpp:842 src/renderwidget.cpp:850 src/renderwidget.cpp:1419 +#: src/renderwidget.cpp:885 src/renderwidget.cpp:893 src/renderwidget.cpp:1476 msgid "Rendering crashed" msgstr "Renderowanie nie powiodło się" -#: src/renderwidget.cpp:1408 +#: src/renderwidget.cpp:1465 msgid "Rendering finished in %1" msgstr "Renderowanie zakończone w %1" -#: src/dvdwizard.cpp:245 +#: src/dvdwizard.cpp:252 msgid "Rendering job timed out" msgstr "Przekroczony czas na zadanie renderowania" @@ -3784,19 +4123,19 @@ msgid "Rendering profiles customization" msgstr "Dostosowywanie profili renderowania" -#: src/trackview.cpp:562 +#: src/trackview.cpp:616 msgid "Replaced wrong clip producer %1 with %2" msgstr "Zastąpiono nieprawidłowego producenta klipu %1 przez %2" -#: src/wizard.cpp:334 +#: src/wizard.cpp:346 msgid "Required for creation of DVD" msgstr "Wymagane do utworzenia DVD" -#: src/wizard.cpp:341 +#: src/wizard.cpp:353 msgid "Required for creation of DVD ISO images" msgstr "Wymagane do utworzenia obrazów DVD ISO" -#: src/wizard.cpp:327 +#: src/wizard.cpp:339 msgid "Required for firewire capture" msgstr "Wymagane do przechwytywania FireWire" @@ -3804,11 +4143,11 @@ msgid "Required for rendering (part of MLT package)" msgstr "Wymagane do renderowania (część pakietu MLT)" -#: src/wizard.cpp:321 +#: src/wizard.cpp:333 msgid "Required for screen capture" msgstr "Wymagane do przechwytywania z ekranu" -#: src/wizard.cpp:312 +#: src/wizard.cpp:324 msgid "Required for webcam capture" msgstr "Wymagane do przechwytywania z kamerki" @@ -3821,15 +4160,19 @@ msgid "Required to work with images" msgstr "Wymagane do pracy z obrazami" +#: src/wizard.cpp:305 +msgid "Required to work with titles" +msgstr "Wymagane do pracy z tytułami" + #: src/wizard.cpp:165 msgid "Required to work with various video formats (hdv, mpeg, flash, ...)" msgstr "Wymagane do pracy z różnymi formatami wideo (hdv, mpeg, flash, ...)" -#: rc.cpp:584 rc.cpp:2502 rc.cpp:3981 +#: rc.cpp:1688 rc.cpp:3237 msgid "Rescale" msgstr "Przeskaluj" -#: rc.cpp:885 rc.cpp:2803 rc.cpp:4282 +#: rc.cpp:2066 rc.cpp:3615 msgid "Reset" msgstr "Resetuj" @@ -3837,7 +4180,7 @@ msgid "Reset effect" msgstr "Resetuj efekt" -#: rc.cpp:1620 rc.cpp:3538 rc.cpp:5017 +#: rc.cpp:1187 rc.cpp:2736 msgid "Resize" msgstr "Zmień rozmiar" @@ -3849,44 +4192,48 @@ msgid "Resize (50%)" msgstr "Zmień rozmiar (50%)" -#: src/resizeclipcommand.cpp:34 src/customtrackview.cpp:2799 -#: src/customtrackview.cpp:2892 +#: src/mainwindow.cpp:1034 +msgid "Resize Item End" +msgstr "Zmień rozmiar końca elementu" + +#: src/mainwindow.cpp:1029 +msgid "Resize Item Start" +msgstr "Zmień rozmiar początku elementu" + +#: src/resizeclipcommand.cpp:34 src/customtrackview.cpp:3226 +#: src/customtrackview.cpp:3325 msgid "Resize clip" msgstr "Zmień rozmiar klipu" -#: src/geometryval.cpp:86 src/geometryval.cpp:297 +#: src/geometryval.cpp:87 src/geometryval.cpp:300 msgid "Resize..." msgstr "Zmień rozmiar..." -#: rc.cpp:293 rc.cpp:2211 +#: rc.cpp:377 msgid "Reverb" msgstr "Pogłos" -#: rc.cpp:483 rc.cpp:2401 +#: rc.cpp:551 msgid "Reverb Time" msgstr "Czas pogłosu" -#: rc.cpp:297 rc.cpp:2215 +#: rc.cpp:381 msgid "Reverb time" msgstr "Czas pogłosu" -#: rc.cpp:509 rc.cpp:2427 -msgid "Reverse playing" -msgstr "Odtwarzanie w przeciwnym kierunku" - -#: src/mainwindow.cpp:2878 +#: src/mainwindow.cpp:3188 msgid "Revert to last saved version" msgstr "Powrót do ostatniej zapisanej wersji" -#: src/monitor.cpp:76 src/mainwindow.cpp:896 src/recmonitor.cpp:71 +#: src/recmonitor.cpp:72 src/mainwindow.cpp:1039 src/monitor.cpp:76 msgid "Rewind" msgstr "Cofnij" -#: src/mainwindow.cpp:901 +#: src/mainwindow.cpp:1044 msgid "Rewind 1 Frame" msgstr "Cofnij 1 klatkę" -#: src/mainwindow.cpp:906 +#: src/mainwindow.cpp:1049 msgid "Rewind 1 Second" msgstr "Cofnij 1 sekundę" @@ -3894,59 +4241,79 @@ msgid "Rewind 1 frame" msgstr "Cofnij 1 klatkę" -#: src/geometryval.cpp:99 rc.cpp:72 rc.cpp:1990 +#: src/geometryval.cpp:100 rc.cpp:72 msgid "Right" msgstr "Prawo" -#: rc.cpp:301 rc.cpp:2219 +#: rc.cpp:385 msgid "Room Reverb" msgstr "Pogłos pokojowy" -#: rc.cpp:305 rc.cpp:2223 +#: rc.cpp:389 msgid "Room size (m)" msgstr "Rozmiar pokoju (m)" -#: rc.cpp:361 rc.cpp:2279 +#: rc.cpp:445 msgid "Rotate X" msgstr "Obrót X" -#: rc.cpp:363 rc.cpp:2281 +#: rc.cpp:1121 rc.cpp:2670 +msgid "Rotate X:" +msgstr "Obrót X:" + +#: rc.cpp:447 msgid "Rotate Y" msgstr "Obrót Y" -#: rc.cpp:365 rc.cpp:2283 +#: rc.cpp:1124 rc.cpp:2673 +msgid "Rotate Y:" +msgstr "Obrót Y:" + +#: rc.cpp:449 msgid "Rotate Z" msgstr "Obrót Z" -#: rc.cpp:357 rc.cpp:2275 +#: rc.cpp:1127 rc.cpp:2676 +msgid "Rotate Z:" +msgstr "Obrót Z:" + +#: rc.cpp:441 msgid "Rotate and Shear" msgstr "Obrót i Wygięcie" -#: rc.cpp:359 rc.cpp:2277 +#: rc.cpp:443 msgid "Rotate clip in any 3 directions" msgstr "Obrót klipu w dowolnym z 3 kierunków" -#: rc.cpp:1587 rc.cpp:3505 rc.cpp:4984 -msgid "Rotate:" -msgstr "Obrót:" +#: src/titlewidget.cpp:108 +msgid "Rotation around the X axis" +msgstr "Obrót wokół osi X" + +#: src/titlewidget.cpp:114 +msgid "Rotation around the Y axis" +msgstr "Obrót wokół osi Y" + +#: src/titlewidget.cpp:120 +msgid "Rotation around the Z axis" +msgstr "Obrót wokół osi Z" -#: src/mainwindow.cpp:843 +#: src/mainwindow.cpp:961 msgid "Run Config Wizard" msgstr "Uruchom kreatora konfiguracji" -#: rc.cpp:563 rc.cpp:813 rc.cpp:2481 rc.cpp:2731 rc.cpp:3960 rc.cpp:4210 +#: rc.cpp:706 rc.cpp:1667 rc.cpp:2255 rc.cpp:3216 msgid "S" msgstr "S" -#: src/kdenlivesettingsdialog.cpp:241 +#: src/kdenlivesettingsdialog.cpp:245 msgid "SVGAlib" msgstr "SVGAlib" -#: rc.cpp:177 rc.cpp:2095 +#: rc.cpp:231 msgid "Saturat0r" msgstr "Saturat0r" -#: rc.cpp:181 rc.cpp:2099 +#: rc.cpp:235 msgid "Saturation" msgstr "Nasycenie" @@ -3954,27 +4321,27 @@ msgid "Save" msgstr "Zapisz" -#: src/titlewidget.cpp:231 +#: src/titlewidget.cpp:359 msgid "Save As" msgstr "Zapisz jako" -#: src/dvdwizard.cpp:655 +#: src/dvdwizard.cpp:674 msgid "Save DVD Project" msgstr "Zapisz projekt DVD" -#: src/effectstackview.cpp:101 +#: src/effectstackview.cpp:102 msgid "Save Effect" msgstr "Zapisz efekt" -#: rc.cpp:1131 rc.cpp:3049 rc.cpp:4528 +#: rc.cpp:1802 rc.cpp:3351 msgid "Save Profile" msgstr "Zapisz profil" -#: src/mainwindow.cpp:431 src/mainwindow.cpp:1315 +#: src/mainwindow.cpp:493 src/mainwindow.cpp:1503 msgid "Save changes to document?" msgstr "Zapisać zmiany w dokumencie?" -#: src/mainwindow.cpp:2577 +#: src/mainwindow.cpp:2870 msgid "Save clip zone as:" msgstr "Zapisz strefę klipu jako:" @@ -3986,83 +4353,99 @@ msgid "Save profile" msgstr "Zapisz profil" -#: src/monitor.cpp:201 +#: src/monitor.cpp:199 msgid "Save zone" msgstr "Zapisz strefę" -#: src/geometryval.cpp:297 rc.cpp:40 rc.cpp:1958 +#: src/geometryval.cpp:300 rc.cpp:40 msgid "Scale" msgstr "Skaluj" -#: rc.cpp:195 rc.cpp:2113 +#: rc.cpp:249 msgid "Scale X" msgstr "Skaluj X" -#: rc.cpp:197 rc.cpp:2115 +#: rc.cpp:251 msgid "Scale Y" msgstr "Skaluj Y" -#: rc.cpp:183 rc.cpp:2101 +#: rc.cpp:237 msgid "Scale0tilt" msgstr "Scale0tilt (skalowanie/przemieszczanie)" -#: rc.cpp:185 rc.cpp:2103 +#: rc.cpp:239 msgid "Scales, Tilts and Crops an Image" msgstr "Skaluje, Nachyla i Przycina Obraz" -#: rc.cpp:569 rc.cpp:2487 rc.cpp:3966 +#: rc.cpp:1673 rc.cpp:3222 msgid "Scanning" msgstr "Skanowanie" -#: rc.cpp:1206 rc.cpp:1281 rc.cpp:3124 rc.cpp:3199 rc.cpp:4603 rc.cpp:4678 +#: rc.cpp:1289 rc.cpp:1364 rc.cpp:2838 rc.cpp:2913 msgid "Screen Grab" msgstr "Przechwytywanie z ekranu" -#: rc.cpp:687 rc.cpp:2605 rc.cpp:4084 +#: rc.cpp:1451 rc.cpp:3000 msgid "Screen grab" msgstr "Przechwytywanie z ekranu" -#: src/renderwidget.cpp:176 +#: src/renderwidget.cpp:182 msgid "Script Files" msgstr "Pliki skryptu" -#: src/renderwidget.cpp:1511 src/renderwidget.cpp:1515 +#: src/renderwidget.cpp:1580 src/renderwidget.cpp:1584 msgid "Script contains wrong command: %1" msgstr "Skrypt zawiera błędne polecenie: %1" -#: src/mainwindow.cpp:2795 +#: src/mainwindow.cpp:3104 msgid "Script file already exists. Do you want to overwrite it?" msgstr "Plik skryptu już istnieje. Czy chcesz go nadpisać?" -#: src/mainwindow.cpp:2790 +#: src/mainwindow.cpp:3099 msgid "Script name (will be saved in: %1)" msgstr "Nazwa skryptu (będzie zapisana w: %1)" -#: rc.cpp:641 rc.cpp:2559 rc.cpp:4038 +#: rc.cpp:1751 rc.cpp:3300 msgid "Scripts" msgstr "Skrypty" -#: src/kdenlivedoc.cpp:874 +#: rc.cpp:1634 rc.cpp:3183 +msgid "Search" +msgstr "Znajdź" + +#: src/kdenlivedoc.cpp:881 msgid "Search automatically" msgstr "Znajdź automatycznie" -#: src/kdenlivedoc.cpp:877 src/kdenlivedoc.cpp:885 +#: src/kdenlivedoc.cpp:884 src/kdenlivedoc.cpp:892 msgid "Search manually" msgstr "Znajdź ręcznie" -#: rc.cpp:906 rc.cpp:2824 rc.cpp:4303 +#: rc.cpp:1907 rc.cpp:3456 msgid "Search recursively" msgstr "Znajdź rekursywnie" +#: rc.cpp:2090 rc.cpp:3639 +msgid "Seek to active keyframe" +msgstr "Przeskocz do aktywnej klatki" + +#: src/mainwindow.cpp:1142 +msgid "Select Clip" +msgstr "Wybierz klip" + #: src/dvdwizard.cpp:50 msgid "Select Files For Your DVD" msgstr "Wybierz pliki do swojego DVD" -#: src/customtrackview.cpp:4254 +#: src/mainwindow.cpp:1157 +msgid "Select Transition" +msgstr "Wybierz przejście" + +#: src/customtrackview.cpp:4748 msgid "Select a clip before copying" msgstr "Wybierz klip przed kopiowaniem" -#: src/customtrackview.cpp:1516 +#: src/customtrackview.cpp:1686 msgid "Select a clip if you want to apply an effect" msgstr "Wybierz klip do którego chcesz zastosować efekt" @@ -4074,68 +4457,72 @@ "Wybierz obszar przy użyciu myszy. Aby wykonać zdjęcie, wciśnij klawisz " "Enter. Naciśnij Esc aby wyjść." -#: src/titlewidget.cpp:178 +#: src/titlewidget.cpp:304 msgid "Select background color" msgstr "Wybierz kolor tła" -#: src/titlewidget.cpp:172 +#: src/titlewidget.cpp:298 msgid "Select border color" msgstr "Wybierz kolor obramowania" -#: src/customtrackview.cpp:3183 +#: src/customtrackview.cpp:3652 msgid "Select clip to change speed" msgstr "Wybierz klip do zmiany szybkości" -#: src/customtrackview.cpp:1881 src/customtrackview.cpp:3118 +#: src/customtrackview.cpp:2100 src/customtrackview.cpp:3587 msgid "Select clip to delete" msgstr "Wybierz klip do usunięcia" -#: src/kdenlivesettingsdialog.cpp:351 +#: src/kdenlivesettingsdialog.cpp:355 msgid "Select default audio editor" msgstr "Wybierz domyślny edytor audio" -#: src/kdenlivesettingsdialog.cpp:362 +#: src/kdenlivesettingsdialog.cpp:366 msgid "Select default image editor" msgstr "Wybierz domyślny edytor obrazów" -#: src/kdenlivesettingsdialog.cpp:340 +#: src/kdenlivesettingsdialog.cpp:344 msgid "Select default video player" msgstr "Wybierz domyślny odtwarzacz wideo" -#: src/titlewidget.cpp:171 +#: src/titlewidget.cpp:297 msgid "Select fill color" msgstr "Wybierz kolor wypełnienia." -#: rc.cpp:599 rc.cpp:2517 rc.cpp:3996 +#: rc.cpp:1703 rc.cpp:3252 msgid "Selected zone" msgstr "Wybrana strefa" -#: src/titlewidget.cpp:203 +#: rc.cpp:3759 +msgid "Selection" +msgstr "Wybór" + +#: src/titlewidget.cpp:331 msgid "Selection Tool" msgstr "Narzędzie wyboru" -#: src/mainwindow.cpp:693 +#: src/mainwindow.cpp:793 msgid "Selection tool" msgstr "Narzędzie wyboru" -#: rc.cpp:383 rc.cpp:2301 +#: rc.cpp:467 msgid "Sepia" msgstr "Sepia" -#: src/mainwindow.cpp:887 -msgid "Set In Point" -msgstr "Ustaw punkt wewnątrz" - -#: src/mainwindow.cpp:892 -msgid "Set Out Point" -msgstr "Ustaw punkt na zewnątrz" +#: src/mainwindow.cpp:1005 +msgid "Set Zone In" +msgstr "Ustaw strefę w" + +#: src/mainwindow.cpp:1010 +msgid "Set Zone Out" +msgstr "Ustaw strefę poza" -#: src/monitor.cpp:213 +#: src/monitor.cpp:211 msgid "Set current image as thumbnail" msgstr "Ustaw obecny obraz jako miniaturkę" #: src/main.cpp:53 -msgid "Set the path for MLT environnement" +msgid "Set the path for MLT environment" msgstr "Ustaw ścieżkę do środowiska MLT" #: src/monitor.cpp:73 @@ -4146,23 +4533,23 @@ msgid "Set zone start" msgstr "Ustaw początek strefy" -#: rc.cpp:3840 rc.cpp:5319 +#: rc.cpp:1559 rc.cpp:3108 msgid "Settings" msgstr "Ustawienia" -#: rc.cpp:373 rc.cpp:2291 +#: rc.cpp:457 msgid "Shear X" msgstr "Wygięcie X" -#: rc.cpp:375 rc.cpp:2293 +#: rc.cpp:459 msgid "Shear Y" msgstr "Wygięcie Y" -#: rc.cpp:279 rc.cpp:473 rc.cpp:2197 rc.cpp:2391 +#: rc.cpp:369 rc.cpp:541 msgid "Shift" msgstr "Przesunięcie" -#: src/mainwindow.cpp:2438 +#: src/mainwindow.cpp:2731 msgid "" "Shift + click to create a selection rectangle, Ctrl + click to add an item " "to selection" @@ -4170,35 +4557,43 @@ "Shift + kliknięcie aby utworzyć prostokąt wyboru, Ctrl + kliknięcie aby " "dodać element do wyboru" -#: rc.cpp:1485 rc.cpp:3403 rc.cpp:4882 +#: rc.cpp:1964 rc.cpp:3513 msgid "Show All" msgstr "Pokaż wszystkie" -#: src/mainwindow.cpp:1072 +#: src/mainwindow.cpp:1260 msgid "Show Timeline" msgstr "Pokaż linię czasu" -#: src/mainwindow.cpp:758 rc.cpp:1659 rc.cpp:3577 rc.cpp:5056 +#: src/mainwindow.cpp:871 rc.cpp:2102 rc.cpp:3651 msgid "Show audio thumbnails" msgstr "Pokaż miniatury audio" -#: rc.cpp:1647 rc.cpp:3565 rc.cpp:5044 +#: rc.cpp:1214 rc.cpp:2763 msgid "Show background" msgstr "Pokaż tło" +#: rc.cpp:163 +msgid "Show curves" +msgstr "Pokaż krzywe" + +#: rc.cpp:227 +msgid "Show histogram" +msgstr "Pokaż histogram" + #: src/complexparameter.cpp:40 msgid "Show keyframes in timeline" msgstr "Pokaż klatki kluczowe na linii czasu" -#: src/mainwindow.cpp:764 +#: src/mainwindow.cpp:877 msgid "Show markers comments" msgstr "Pokaż komentarze do znaczników" -#: src/mainwindow.cpp:752 rc.cpp:1656 rc.cpp:3574 rc.cpp:5053 +#: src/mainwindow.cpp:865 rc.cpp:2099 rc.cpp:3648 msgid "Show video thumbnails" msgstr "Pokaż miniatury wideo" -#: rc.cpp:638 rc.cpp:2556 rc.cpp:4035 +#: rc.cpp:1745 rc.cpp:3294 msgid "Shutdown computer after renderings" msgstr "Wyłącz komputer po zakończeniu renderowania" @@ -4206,7 +4601,7 @@ msgid "Simon A. Eugster" msgstr "Simon A. Eugster" -#: rc.cpp:313 rc.cpp:2231 +#: rc.cpp:397 msgid "Simulates a vinyl audio player - LADSPA audio effect" msgstr "Efekt audio LADSPA - symuluj winylowy odtwarzacz audio" @@ -4224,26 +4619,24 @@ "\"http://en.wikipedia.org/wiki/Sixteenth_note\">Wikipedia:Sixteenth_note " "(ang.)" -#: rc.cpp:780 rc.cpp:1338 rc.cpp:1512 rc.cpp:1551 rc.cpp:1879 rc.cpp:2698 -#: rc.cpp:3256 rc.cpp:3430 rc.cpp:3469 rc.cpp:3797 rc.cpp:4177 rc.cpp:4735 -#: rc.cpp:4909 rc.cpp:4948 rc.cpp:5276 +#: rc.cpp:643 rc.cpp:673 rc.cpp:1424 rc.cpp:2075 rc.cpp:2192 rc.cpp:2222 +#: rc.cpp:2973 rc.cpp:3624 msgid "Size" msgstr "Rozmiar" -#: rc.cpp:1416 rc.cpp:1698 rc.cpp:3334 rc.cpp:3616 rc.cpp:3852 rc.cpp:4813 -#: rc.cpp:5095 rc.cpp:5331 +#: rc.cpp:803 rc.cpp:1571 rc.cpp:1856 rc.cpp:2352 rc.cpp:3120 rc.cpp:3405 msgid "Size:" msgstr "Rozmiar:" -#: rc.cpp:1740 rc.cpp:3658 rc.cpp:5137 +#: rc.cpp:845 rc.cpp:2394 msgid "Slideshow" msgstr "Pokaz slajdów" -#: src/slideshowclip.cpp:37 rc.cpp:1347 rc.cpp:3265 rc.cpp:4744 +#: src/slideshowclip.cpp:37 rc.cpp:1916 rc.cpp:3465 msgid "Slideshow Clip" msgstr "Klip pokazu slajdów" -#: src/projectitem.cpp:207 src/documentchecker.cpp:98 +#: src/documentchecker.cpp:148 src/projectitem.cpp:184 msgid "Slideshow clip" msgstr "Klip pokazu slajdów" @@ -4252,15 +4645,15 @@ msgstr "Mniejsze ścieżki" # i'm not sure how it works -#: src/mainwindow.cpp:770 +#: src/mainwindow.cpp:883 msgid "Snap" msgstr "Zrzuty" -#: rc.cpp:1377 rc.cpp:1764 rc.cpp:3295 rc.cpp:3682 rc.cpp:4774 rc.cpp:5161 +#: rc.cpp:869 rc.cpp:1946 rc.cpp:2418 rc.cpp:3495 msgid "Softness" msgstr "Miękkość" -#: src/documentvalidator.cpp:692 +#: src/documentvalidator.cpp:724 msgid "" "Some of your text clips were saved with size in points, which means " "different sizes on different displays. Do you want to convert them to pixel " @@ -4273,7 +4666,7 @@ "swoje klipy przenośnymi? Zalecane jest wykonanie tego na tym samym " "komputerze na którym je tworzono, albo dopasowanie wymiarów ręcznie." -#: src/titledocument.cpp:234 +#: src/titledocument.cpp:281 msgid "" "Some of your text clips were saved with size in points, which means " "different sizes on different displays. They will be converted to pixel size, " @@ -4285,132 +4678,132 @@ "twoje klipy przenośnymi. Może być konieczne dopasowanie ich rozmiarów " "ręcznie." -#: rc.cpp:846 rc.cpp:2764 rc.cpp:4243 +#: rc.cpp:1049 rc.cpp:2598 msgid "Source" msgstr "Źródło" -#: rc.cpp:147 rc.cpp:2065 +#: rc.cpp:149 msgid "Source Color" msgstr "Kolor źródłowy" -#: rc.cpp:391 rc.cpp:2309 -msgid "Sox Balance" -msgstr "Sox Balance" +#: rc.cpp:275 +msgid "Source image on left side" +msgstr "Obraz źródłowy z lewej strony" -#: rc.cpp:407 rc.cpp:2325 +#: rc.cpp:475 msgid "Sox Band" msgstr "Sox Band" -#: rc.cpp:415 rc.cpp:2333 +#: rc.cpp:483 msgid "Sox Bass" msgstr "Sox Bass" -#: rc.cpp:423 rc.cpp:2341 +#: rc.cpp:491 msgid "Sox Echo" msgstr "Sox Echo" -#: rc.cpp:435 rc.cpp:2353 +#: rc.cpp:503 msgid "Sox Flanger" msgstr "Sox Flanger" -#: rc.cpp:449 rc.cpp:2367 +#: rc.cpp:517 msgid "Sox Gain" msgstr "Sox Gain" -#: rc.cpp:455 rc.cpp:2373 +#: rc.cpp:523 msgid "Sox Phaser" msgstr "Sox Phaser" -#: rc.cpp:469 rc.cpp:2387 +#: rc.cpp:537 msgid "Sox Pitch Shift" msgstr "Sox Pitch Shift" -#: rc.cpp:477 rc.cpp:2395 +#: rc.cpp:545 msgid "Sox Reverb" msgstr "Sox Reverb" -#: rc.cpp:487 rc.cpp:2405 +#: rc.cpp:555 msgid "Sox Stretch" msgstr "Sox Stretch" -#: rc.cpp:495 rc.cpp:2413 +#: rc.cpp:563 msgid "Sox Vibro" msgstr "Sox Vibro" -#: rc.cpp:409 rc.cpp:2327 +#: rc.cpp:477 msgid "Sox band audio effect" msgstr "Efekt audio Sox - orkiestra" -#: rc.cpp:417 rc.cpp:2335 +#: rc.cpp:485 msgid "Sox bass audio effect" msgstr "Efekt audio Sox - bas" -#: rc.cpp:393 rc.cpp:2311 -msgid "Sox change audio balance" -msgstr "Efekt audio Sox - zmiana balansu dźwięku" - -#: rc.cpp:471 rc.cpp:2389 +#: rc.cpp:539 msgid "Sox change pitch audio effect" msgstr "Efekt audio Sox - zmiana pitch" -#: rc.cpp:425 rc.cpp:2343 +#: rc.cpp:493 msgid "Sox echo audio effect" msgstr "Efekt audio Sox - echo" -#: rc.cpp:437 rc.cpp:2355 +#: rc.cpp:505 msgid "Sox flanger audio effect" msgstr "Efekt audio Sox - flanger" -#: rc.cpp:451 rc.cpp:2369 +#: rc.cpp:519 msgid "Sox gain audio effect" msgstr "Efekt audio Sox - zysk" -#: rc.cpp:457 rc.cpp:2375 +#: rc.cpp:525 msgid "Sox phaser audio effect" msgstr "Efekt audio Sox - fazer" -#: rc.cpp:479 rc.cpp:2397 +#: rc.cpp:547 msgid "Sox reverb audio effect" msgstr "Efekt audio Sox - pogłos" -#: rc.cpp:489 rc.cpp:2407 +#: rc.cpp:557 msgid "Sox stretch audio effect" msgstr "Efekt audio Sox - rozciąganie" -#: rc.cpp:497 rc.cpp:2415 +#: rc.cpp:565 msgid "Sox vibro audio effect" msgstr "Efekt audio Sox - wibracje" -#: rc.cpp:5442 +#: rc.cpp:3768 msgid "Space" msgstr "Odstęp " -#: src/mainwindow.cpp:705 +#: src/mainwindow.cpp:805 msgid "Spacer tool" msgstr "Narzędzie odstępów " -#: rc.cpp:447 rc.cpp:467 rc.cpp:499 rc.cpp:501 rc.cpp:505 rc.cpp:2365 -#: rc.cpp:2385 rc.cpp:2417 rc.cpp:2419 rc.cpp:2423 +#: rc.cpp:515 rc.cpp:535 rc.cpp:567 rc.cpp:569 rc.cpp:573 msgid "Speed" msgstr "Szybkość" -#: src/mainwindow.cpp:1005 +#: src/mainwindow.cpp:1193 msgid "Split Audio" msgstr "Oddziel Audio" -#: src/splitaudiocommand.cpp:32 src/customtrackview.cpp:4837 +#: src/splitaudiocommand.cpp:32 src/customtrackview.cpp:5400 msgid "Split audio" msgstr "Oddziel audio" -#: src/monitor.cpp:208 +# not sure +#: rc.cpp:273 +msgid "Split screen preview" +msgstr "Podgląd cięcia" + +#: src/monitor.cpp:206 msgid "Split view" msgstr "Widok cięcia" -#: rc.cpp:273 rc.cpp:2191 +#: rc.cpp:357 msgid "Spread" msgstr "Rozpościerać" -#: rc.cpp:203 rc.cpp:2121 +#: rc.cpp:257 msgid "Square Blur" msgstr "Kwadratowe rozmycie" @@ -4422,93 +4815,110 @@ "Standardowy znak odstępu. (Inne znaki odstępu: U+00a0, U+2000–200b, U" "+202f)" -#: src/mainwindow.cpp:2843 rc.cpp:82 rc.cpp:94 rc.cpp:858 rc.cpp:2000 -#: rc.cpp:2012 rc.cpp:2776 rc.cpp:3921 rc.cpp:4255 rc.cpp:5400 +#: src/mainwindow.cpp:3152 src/titlewidget.cpp:2030 rc.cpp:84 rc.cpp:118 +#: rc.cpp:1061 rc.cpp:2171 rc.cpp:2610 rc.cpp:3720 msgid "Start" msgstr "Start" -#: rc.cpp:105 rc.cpp:116 rc.cpp:2023 rc.cpp:2034 +#: rc.cpp:95 rc.cpp:106 msgid "Start Gain" msgstr "Początek zysku" -#: src/renderwidget.cpp:92 +#: rc.cpp:1748 rc.cpp:3297 +msgid "Start Job" +msgstr "Rozpocznij zadanie" + +#: src/renderwidget.cpp:95 msgid "Start Rendering" msgstr "Rozpocznij renderowanie" -#: rc.cpp:644 rc.cpp:2562 rc.cpp:4041 +#: rc.cpp:1754 rc.cpp:3303 msgid "Start Script" msgstr "Rozpocznij wykonywanie skryptu" -#: src/mainwindow.cpp:415 +#: rc.cpp:1169 rc.cpp:2718 +msgid "Start at" +msgstr "Początek przy" + +#: src/mainwindow.cpp:477 msgid "Start them now" msgstr "Uruchom je teraz" # wtf? -#: src/mainwindow.cpp:2471 +#: src/mainwindow.cpp:2764 msgid "Starting -- find text as you type" msgstr "Rozpoczynianie -- szukanie tekstu który wpiszesz" -#: rc.cpp:954 rc.cpp:2872 rc.cpp:4351 +#: rc.cpp:1781 rc.cpp:3330 msgid "Status" msgstr "Status" -#: src/recmonitor.cpp:77 +#: src/recmonitor.cpp:78 msgid "Stop" msgstr "Stop" -#: rc.cpp:507 rc.cpp:2425 +#: rc.cpp:575 msgid "Stroboscope" msgstr "Stroboskop" -#: rc.cpp:1837 rc.cpp:3755 rc.cpp:5234 -msgid "Stroboscope effect" -msgstr "Efekt stroboskopu" - -#: rc.cpp:319 rc.cpp:2237 +#: rc.cpp:403 msgid "Surface warping" msgstr "Wypaczenia powierzchni" -#: src/geometryval.cpp:105 +#: src/mainwindow.cpp:1015 +msgid "Switch monitor" +msgstr "Przełącz monitor" + +#: src/geometryval.cpp:106 msgid "Sync timeline cursor" msgstr "Synchronizuj z kursorem linii czasu" -#: rc.cpp:732 rc.cpp:2650 rc.cpp:4129 +# don't know what is this +#: src/customtrackview.cpp:5828 +msgid "TRACTOR" +msgstr "TRACTOR" + +#: rc.cpp:983 rc.cpp:2532 msgid "Target" msgstr "Cel" -#: rc.cpp:819 rc.cpp:2737 rc.cpp:4216 +#: rc.cpp:1892 rc.cpp:3441 msgid "Template" msgstr "Szablon" -#: src/projectitem.cpp:203 +#: src/projectitem.cpp:180 msgid "Template text clip" msgstr "Szablon klipu tekstowego" -#: src/kdenlivedoc.cpp:1093 +#: src/kdenlivedoc.cpp:1091 msgid "Template title clip" msgstr "Szablon klipu tytułowego" -#: rc.cpp:969 rc.cpp:2887 rc.cpp:4366 +#: rc.cpp:1259 rc.cpp:2808 +msgid "Template:" +msgstr "Szablon:" + +#: rc.cpp:1796 rc.cpp:3345 msgid "Temporary data folder" msgstr "Katalog danych tymczasowych" -#: rc.cpp:1026 rc.cpp:2944 rc.cpp:4423 +#: rc.cpp:1472 rc.cpp:3021 msgid "Temporary files" msgstr "Tymczasowe pliki" -#: rc.cpp:729 rc.cpp:822 rc.cpp:2647 rc.cpp:2740 rc.cpp:4126 rc.cpp:4219 +#: rc.cpp:980 rc.cpp:1895 rc.cpp:2529 rc.cpp:3444 msgid "Text" msgstr "Tekst" -#: src/titledocument.cpp:234 +#: src/titledocument.cpp:281 msgid "Text Clips Updated" msgstr "Tekst kilpów zaktualizowany" -#: src/projectitem.cpp:204 +#: src/projectitem.cpp:181 msgid "Text clip" msgstr "Tekst klipu" -#: rc.cpp:1852 rc.cpp:3770 rc.cpp:5249 +#: rc.cpp:1532 rc.cpp:3081 msgid "TextLabel" msgstr "EtykieraTekstu" @@ -4516,7 +4926,11 @@ msgid "The custom profile was modified, do you want to save it?" msgstr "Profil został zmodyfikowany, czy chcesz go zapisać?" -#: src/renderwidget.cpp:786 src/renderwidget.cpp:1554 +#: rc.cpp:3789 +msgid "Themes" +msgstr "Tematy" + +#: src/renderwidget.cpp:819 src/renderwidget.cpp:1623 msgid "" "There is already a job writing file:
%1
Abort the job if you " "want to overwrite it..." @@ -4524,7 +4938,7 @@ "Zadanie zapisujące plik:
%1
już istnieje. Przerwij zadanie " "jeżeli chcesz go nadpisać..." -#: src/renderer.cpp:1444 +#: src/renderer.cpp:1471 msgid "There is no clip, cannot extract frame." msgstr "Nie ma klipu, nie można wypakować klatki" @@ -4557,31 +4971,32 @@ "podstawowe ustawienia. Za klika sekund będziesz gotów do montażu swojego " "pierwszego filmu..." -#: src/renderwidget.cpp:371 src/renderwidget.cpp:478 +#: src/renderwidget.cpp:401 src/renderwidget.cpp:518 msgid "" "This profile name already exists. Change the name if you don't want to " "overwrite it." msgstr "" "Profil o tej nazwie już istnieje. Zmień ją jeżeli nie chcesz napisać tamtego." -#: src/documentvalidator.cpp:144 +#: src/documentvalidator.cpp:176 msgid "This project type is unsupported (version %1) and can't be loaded." msgstr "" "Typ projektu nie jest obsługiwany (wersja %1) i nie może zostać załadowany." -#: src/documentvalidator.cpp:137 +#: src/documentvalidator.cpp:169 msgid "" "This project type is unsupported (version %1) and can't be loaded.\n" -"Please consider upgrading you Kdenlive version." +"Please consider upgrading your Kdenlive version." msgstr "" -"Typ projektu nie jest obsługiwany (wersja %1) i nie może zostać załadowany\n" -"Rozważ aktualizację do najnowszej wersji Kdenlive" +"Ten typ projektu nie jest obsługiwany (wersja %1) i nie może zostać " +"załadowany.\n" +"Proszę rozważyć aktualizację Kdenlive." -#: src/titledocument.cpp:196 +#: src/titledocument.cpp:243 msgid "This title clip was created with a different frame size." msgstr "Ten klip tytułowy został utworzony z innym rozmiarem klatki" -#: src/mainwindow.cpp:2878 +#: src/mainwindow.cpp:3188 msgid "" "This will delete all changes made since you last saved your project. Are you " "sure you want to continue?" @@ -4589,11 +5004,11 @@ "Ta akcja usunie wszystkie zmiany wprowadzone od czasu ostatniego zapisu " "projektu. Czy na pewno chcesz kontynuować?" -#: src/mainwindow.cpp:1709 +#: src/mainwindow.cpp:1898 src/projectsettings.cpp:103 msgid "This will remove all unused clips from your project." msgstr "Zostaną usunięte wszystkie nieużywane klipy z projektu" -#: src/projectsettings.cpp:91 +#: src/projectsettings.cpp:108 msgid "" "This will remove the following files from your hard drive.\n" "This action cannot be undone, only use if you know what you are doing.\n" @@ -4603,7 +5018,7 @@ "Tego działania nie można cofnąć, używaj tylko jeżeli wiesz co robisz.\n" "Czy na pewno chcesz kontynuować?" -#: src/documentchecker.cpp:350 +#: src/documentchecker.cpp:473 msgid "This will remove the selected clip from this project" msgid_plural "This will remove the selected clips from this project" msgstr[0] "Z projektu zostanie usunięty wybrany klip" @@ -4614,95 +5029,130 @@ msgid "Three-Per-Em Space. Width: 1/3 of one em" msgstr "Odstęp trzy-na-em. Szerokość: 1/3 jednego em (firetu)" -#: rc.cpp:511 rc.cpp:2429 +#: rc.cpp:281 rc.cpp:577 msgid "Threshold" msgstr "Próg" -#: rc.cpp:515 rc.cpp:2433 +#: rc.cpp:581 msgid "Threshold value" msgstr "Wartość progowa" -#: src/projectlistview.cpp:46 -msgid "Thumbnail" -msgstr "Miniaturka" +#: rc.cpp:277 +msgid "Threshold0r" +msgstr "Threshold0r" + +# or 'Obraz wejściowy wartości progowej' +#: rc.cpp:279 +msgid "Thresholds a source image" +msgstr "Wartość progowa obrazu wejściowego" -#: rc.cpp:1110 rc.cpp:3028 rc.cpp:4507 +#: rc.cpp:2015 rc.cpp:3564 msgid "Thumbnails" -msgstr "Miniaturki" +msgstr "Miniatury" -#: rc.cpp:837 rc.cpp:2755 rc.cpp:3906 rc.cpp:4234 rc.cpp:5385 +#: rc.cpp:1625 rc.cpp:3174 msgid "Thumbnails cache:" msgstr "Pamięć podręczna (cache) miniatur:" -#: rc.cpp:3885 rc.cpp:5364 +#: rc.cpp:1604 rc.cpp:3153 msgid "Thumbnails:" -msgstr "Miniaturki:" +msgstr "Miniatury:" -#: rc.cpp:199 rc.cpp:2117 +#: rc.cpp:253 msgid "Tilt X" msgstr "Nachylenie X" -#: rc.cpp:201 rc.cpp:2119 +#: rc.cpp:255 msgid "Tilt Y" msgstr "Nachylenie Y" -#: rc.cpp:1782 rc.cpp:3700 rc.cpp:5179 +#: rc.cpp:887 rc.cpp:2436 msgid "Time" msgstr "Czas" -#: rc.cpp:475 rc.cpp:2393 +#: rc.cpp:543 msgid "Time window (ms)" msgstr "Czas okna (ms)" -#: rc.cpp:587 rc.cpp:2505 rc.cpp:3984 +#: rc.cpp:1691 rc.cpp:3240 msgid "Timecode overlay" msgstr "Warstwa kodu czasu" -#: rc.cpp:5436 +#: rc.cpp:3756 msgid "Timeline" msgstr "Linia czasu" -#: src/titlewidget.cpp:335 +#: rc.cpp:291 +msgid "Tint amount" +msgstr "Zakres zabarwienia" + +#: rc.cpp:283 +msgid "Tint0r" +msgstr "Tint0r" + +#: src/titlewidget.cpp:481 msgid "Title" msgstr "Tytuł" -#: rc.cpp:1521 rc.cpp:3439 rc.cpp:4918 +#: rc.cpp:1094 rc.cpp:2643 msgid "Title Clip" msgstr "Klip tytułowy" -#: src/titledocument.cpp:196 +#: src/documentchecker.cpp:154 +msgid "Title Font" +msgstr "Czcionka tytułowa" + +#: src/documentchecker.cpp:151 +msgid "Title Image" +msgstr "Obraz tytułowy" + +#: src/titledocument.cpp:243 msgid "Title Profile" msgstr "Profil tytułu" -#: src/kdenlivedoc.cpp:1076 +#: src/kdenlivedoc.cpp:1074 msgid "Title clip" -msgstr "Tytuł klipu" +msgstr "Klip tytułowy" + +#: src/wizard.cpp:304 +msgid "Title module" +msgstr "Moduł tytułowy" + +#: src/titlewidget.cpp:554 +msgid "" +"Title was changed !\n" +"Do you really want to load a new template?\n" +"All changes in this document are lost !!" +msgstr "" +"Tytuł został zmieniony!\n" +"Czy na pewno chcesz załadować nowy szablon?\n" +"Wszystkie zmiany w tym dokumencie zostaną utracone !!" -#: rc.cpp:1518 rc.cpp:3436 rc.cpp:4915 +#: rc.cpp:2081 rc.cpp:3630 msgid "Toggle selection" msgstr "Przełącz wybór" -#: rc.cpp:5427 +#: rc.cpp:3747 msgid "Tool" msgstr "Narzędzie" -#: src/geometryval.cpp:101 rc.cpp:66 rc.cpp:1984 +#: src/geometryval.cpp:102 rc.cpp:66 msgid "Top" msgstr "Góra" -#: src/customtrackview.cpp:2265 rc.cpp:1500 rc.cpp:3418 rc.cpp:4897 +#: src/customtrackview.cpp:2648 rc.cpp:1550 rc.cpp:3099 msgid "Track" msgstr "Ścieżka" -#: rc.cpp:1128 rc.cpp:3046 rc.cpp:4525 +#: rc.cpp:2033 rc.cpp:3582 msgid "Track height" msgstr "Wysokość ścieżki" -#: rc.cpp:5424 +#: rc.cpp:3744 msgid "Tracks" msgstr "Ścieżki" -#: src/kdenlivesettingsdialog.cpp:103 rc.cpp:5418 +#: src/kdenlivesettingsdialog.cpp:107 rc.cpp:3738 msgid "Transcode" msgstr "Transkodowanie" @@ -4710,55 +5160,63 @@ msgid "Transcode Clip" msgstr "Transkodowany klip" -#: src/mainwindow.cpp:882 +#: src/mainwindow.cpp:1000 msgid "Transcode Clips" msgstr "Transkoduj klipy" -#: src/cliptranscode.cpp:157 +#: src/cliptranscode.cpp:163 msgid "Transcoding FAILED!" msgstr "Transkodowanie nie powiodło się!" -#: src/cliptranscode.cpp:141 +#: src/cliptranscode.cpp:147 msgid "Transcoding finished." msgstr "Transkodowanie zakończone." -#: src/mainwindow.cpp:172 +#: src/mainwindow.cpp:182 msgid "Transition" msgstr "Przejście" -#: rc.cpp:3924 rc.cpp:3930 rc.cpp:5403 rc.cpp:5409 +#: src/trackview.cpp:291 src/trackview.cpp:299 +msgid "Transition %1 had an invalid track: %2 > %3" +msgstr "Przejście %1 ma nieprawidłową ścieżkę: %2 > %3" + +#: rc.cpp:2174 rc.cpp:2180 rc.cpp:3723 rc.cpp:3729 msgid "Transparency" msgstr "Przezroczystość" -#: rc.cpp:1776 rc.cpp:3694 rc.cpp:5173 +#: rc.cpp:881 rc.cpp:2430 msgid "Transparent background" msgstr "Tło przezroczystości" -#: rc.cpp:64 rc.cpp:1982 +#: rc.cpp:64 msgid "Trim the edges of a clip" msgstr "Przytnij krawędzie klipu" -#: rc.cpp:385 rc.cpp:2303 +#: rc.cpp:469 msgid "Turn clip colors to sepia" msgstr "Przełącz kolory klipu w sepię" -#: rc.cpp:900 rc.cpp:933 rc.cpp:2818 rc.cpp:2851 rc.cpp:4297 rc.cpp:4330 +#: rc.cpp:763 rc.cpp:1901 rc.cpp:2312 rc.cpp:3450 msgid "Type" msgstr "Typ" -#: src/documentvalidator.cpp:137 src/documentvalidator.cpp:144 +#: src/titlewidget.cpp:177 +msgid "Typewriter" +msgstr "Maszyna do pisania" + +#: src/documentvalidator.cpp:169 src/documentvalidator.cpp:176 msgid "Unable to open project" msgstr "Nie można otworzyć projektu" -#: src/renderwidget.cpp:392 src/renderwidget.cpp:559 src/renderwidget.cpp:1197 +#: src/renderwidget.cpp:416 src/renderwidget.cpp:599 src/renderwidget.cpp:1253 msgid "Unable to write to file %1" msgstr "Nie można pisać do pliku %1" -#: src/mainwindow.cpp:210 +#: src/mainwindow.cpp:220 msgid "Undo History" msgstr "Historia operacji (cofania)" -#: src/mainwindow.cpp:978 +#: src/mainwindow.cpp:1131 msgid "Ungroup Clips" msgstr "Rozgrupuj klipy" @@ -4766,7 +5224,7 @@ msgid "Ungroup clips" msgstr "Rozgrupuj klipy" -#: src/projectitem.cpp:216 +#: src/projectitem.cpp:193 msgid "Unknown clip" msgstr "Nieznany klip" @@ -4774,115 +5232,114 @@ msgid "Unlock track" msgstr "Odblokuj ścieżkę" -#: src/renderwidget.cpp:993 +#: src/renderwidget.cpp:1039 msgid "Unsupported audio codec: %1" msgstr "Nieobsługiwany kodek audio: %1" -#: src/renderwidget.cpp:1010 +#: src/renderwidget.cpp:1056 msgid "Unsupported video codec: %1" msgstr "Nieobsługiwany kodek wideo: %1" -#: src/renderwidget.cpp:977 +#: src/renderwidget.cpp:1023 msgid "Unsupported video format: %1" msgstr "Nieobsługiwany format wideo: %1" -#: src/kdenlivedoc.cpp:847 +#: src/kdenlivedoc.cpp:854 msgid "Untitled" msgstr "Bez tytułu" -#: rc.cpp:831 rc.cpp:2749 rc.cpp:3900 rc.cpp:4228 rc.cpp:5379 +#: rc.cpp:1619 rc.cpp:3168 msgid "Unused clips:" msgstr "Nieużywane klipy:" -#: rc.cpp:918 rc.cpp:2836 rc.cpp:4315 +#: rc.cpp:941 rc.cpp:2490 msgid "Up" msgstr "Góra" -#: src/documentvalidator.cpp:692 +#: src/documentvalidator.cpp:724 msgid "Update Text Clips" msgstr "Aktualizuj tekst w klipach" -#: rc.cpp:1449 rc.cpp:3367 rc.cpp:4846 +#: rc.cpp:1889 rc.cpp:3438 msgid "Use KDE job tracking for render jobs" msgstr "Użyj śledzenia zadań KDE dla zadań renderowania" -#: rc.cpp:807 rc.cpp:2725 rc.cpp:4204 +#: rc.cpp:700 rc.cpp:2249 msgid "Use as default" msgstr "Użyj jako domyślne" # placeholder -#: rc.cpp:909 rc.cpp:2827 rc.cpp:4306 +#: rc.cpp:1910 rc.cpp:3459 msgid "Use placeholders for missing clips" msgstr "Użyj zastępstw dla brakujących klipów" -#: rc.cpp:517 rc.cpp:2435 +#: rc.cpp:583 msgid "Use transparency" msgstr "Użyj przezroczystości" -#: rc.cpp:1638 rc.cpp:1641 rc.cpp:3556 rc.cpp:3559 rc.cpp:3912 rc.cpp:3915 -#: rc.cpp:5035 rc.cpp:5038 rc.cpp:5391 rc.cpp:5394 +#: rc.cpp:1205 rc.cpp:1208 rc.cpp:2138 rc.cpp:2141 rc.cpp:2754 rc.cpp:2757 +#: rc.cpp:3687 rc.cpp:3690 msgid "V" msgstr "V" -#: src/kdenlivedoc.cpp:86 +#: src/kdenlivedoc.cpp:89 msgid "Validating" msgstr "Sprawdzanie" -#: src/keyframeedit.cpp:38 rc.cpp:1864 rc.cpp:3782 rc.cpp:5261 +#: rc.cpp:2012 rc.cpp:3561 msgid "Value" msgstr "Wartość" -#: rc.cpp:205 rc.cpp:2123 +#: rc.cpp:259 msgid "Variable-size square blur (frei0r.squareblur)" msgstr "Zmienny rozmiar rozmycia kwadratowego (frei0r.squareblur)" -#: rc.cpp:52 rc.cpp:60 rc.cpp:1970 rc.cpp:1978 +#: rc.cpp:52 rc.cpp:60 msgid "Variance" msgstr "Zmienność" -#: src/geometryval.cpp:98 +#: src/geometryval.cpp:99 msgid "Vert. Center" msgstr "Wycentruj w pionie" -#: rc.cpp:169 rc.cpp:2087 +#: rc.cpp:203 msgid "Vertical center" msgstr "Wycentrowanie w pionie" -#: rc.cpp:533 rc.cpp:2451 +#: rc.cpp:613 msgid "Vertical factor" msgstr "Współczynnik pionowy" -#: rc.cpp:20 rc.cpp:1938 +#: rc.cpp:20 msgid "Vertical multiplicator" msgstr "Mnożnik pionowy" -#: rc.cpp:38 rc.cpp:1956 +#: rc.cpp:38 msgid "Vertical scatter" msgstr "Rozrzut pionowy" -#: rc.cpp:209 rc.cpp:2127 +#: rc.cpp:293 msgid "Vertigo" msgstr "Zawroty głowy" -#: rc.cpp:756 rc.cpp:1113 rc.cpp:1707 rc.cpp:1900 rc.cpp:2674 rc.cpp:3031 -#: rc.cpp:3625 rc.cpp:3818 rc.cpp:3888 rc.cpp:4153 rc.cpp:4510 rc.cpp:5104 -#: rc.cpp:5297 rc.cpp:5367 +#: rc.cpp:812 rc.cpp:1007 rc.cpp:1265 rc.cpp:1607 rc.cpp:2018 rc.cpp:2361 +#: rc.cpp:2556 rc.cpp:2814 rc.cpp:3156 rc.cpp:3567 msgid "Video" msgstr "Wideo" -#: rc.cpp:666 rc.cpp:2584 rc.cpp:4063 +#: rc.cpp:782 rc.cpp:2331 msgid "Video Codecs" msgstr "Kodeki wideo" -#: src/mainwindow.cpp:1014 +#: src/mainwindow.cpp:1202 msgid "Video Only" msgstr "Tylko wideo" -#: rc.cpp:3846 rc.cpp:5325 +#: rc.cpp:1565 rc.cpp:3114 msgid "Video Profile" msgstr "Profil wideo" -#: rc.cpp:1476 rc.cpp:3394 rc.cpp:4873 +#: rc.cpp:1955 rc.cpp:3504 msgid "Video Resolution" msgstr "Rozdzielczość wideo" @@ -4890,74 +5347,78 @@ msgid "Video Standard" msgstr "Standard wideo" -#: src/projectitem.cpp:194 src/documentchecker.cpp:83 -#: src/documentchecker.cpp:101 +#: src/documentchecker.cpp:133 src/documentchecker.cpp:157 +#: src/projectitem.cpp:171 msgid "Video clip" msgstr "Klip wideo" -#: rc.cpp:1710 rc.cpp:3628 rc.cpp:5107 +#: rc.cpp:815 rc.cpp:2364 msgid "Video codec" msgstr "Kodek wideo" -#: rc.cpp:1245 rc.cpp:3163 rc.cpp:4642 +#: rc.cpp:1328 rc.cpp:2877 msgid "Video device" msgstr "Urządzenie wideo" -#: rc.cpp:1152 rc.cpp:3070 rc.cpp:4549 +#: rc.cpp:1076 rc.cpp:2625 msgid "Video driver:" msgstr "Sterownik wideo:" -#: rc.cpp:1815 rc.cpp:3733 rc.cpp:5212 +#: rc.cpp:920 rc.cpp:2469 msgid "Video index" msgstr "Indeks wideo" -#: src/customtrackview.cpp:4935 +#: src/customtrackview.cpp:5498 msgid "Video only" msgstr "Tylko wideo" -#: rc.cpp:1047 rc.cpp:2965 rc.cpp:4444 +#: rc.cpp:1493 rc.cpp:3042 msgid "Video player" msgstr "Odtwarzacz wideo" -#: rc.cpp:1065 rc.cpp:2983 rc.cpp:4462 +#: rc.cpp:968 rc.cpp:2517 msgid "Video track" msgstr "Ścieżka wideo" -#: rc.cpp:1443 rc.cpp:3361 rc.cpp:3879 rc.cpp:4840 rc.cpp:5358 +#: rc.cpp:1598 rc.cpp:1883 rc.cpp:3147 rc.cpp:3432 msgid "Video tracks" msgstr "Ścieżki wideo" -#: rc.cpp:684 rc.cpp:1203 rc.cpp:1239 rc.cpp:2602 rc.cpp:3121 rc.cpp:3157 -#: rc.cpp:4081 rc.cpp:4600 rc.cpp:4636 +#: rc.cpp:1286 rc.cpp:1322 rc.cpp:1448 rc.cpp:2835 rc.cpp:2871 rc.cpp:2997 msgid "Video4Linux" msgstr "Video4Linux" -#: rc.cpp:5460 +#: rc.cpp:3786 msgid "View" msgstr "Widok" -#: rc.cpp:311 rc.cpp:2229 +# Vignette? +#: rc.cpp:585 +msgid "Vignette Effect" +msgstr "Efekt Vignette" + +#: rc.cpp:395 msgid "Vinyl" msgstr "Winyl" -#: src/projectitem.cpp:210 +#: src/projectitem.cpp:187 msgid "Virtual clip" msgstr "Wirtualny klip" -#: rc.cpp:519 rc.cpp:2437 +#: rc.cpp:599 msgid "Volume (keyframable)" msgstr "Głośność (po klatkach kluczowych)" -#: rc.cpp:1530 rc.cpp:3448 rc.cpp:4927 +#: rc.cpp:1103 rc.cpp:2652 msgid "W" msgstr "W" -#: src/renderwidget.cpp:795 src/renderwidget.cpp:1373 -#: src/renderwidget.cpp:1562 +#: src/renderwidget.cpp:828 src/renderwidget.cpp:1430 +#: src/renderwidget.cpp:1631 msgid "Waiting..." msgstr "Czekaj..." -#: rc.cpp:1149 rc.cpp:3067 rc.cpp:4546 +#: rc.cpp:1073 rc.cpp:2622 msgid "" "Warning: changes to the drivers and devices can make Kdenlive unstable. " "Change only if you know what you do." @@ -4965,15 +5426,15 @@ "Ostrzeżenie: zmiany w sterownikach i urządzeniach mogą uczynić Kdenlive " "niestabilnym. Zmieniaj tylko jeżeli wiesz co robisz." -#: rc.cpp:525 rc.cpp:2443 +#: rc.cpp:605 msgid "Wave" msgstr "Fala" -#: rc.cpp:323 rc.cpp:2241 +#: rc.cpp:407 msgid "Wear" msgstr "Materiał" -#: src/renderwidget.cpp:1109 +#: src/renderwidget.cpp:1164 msgid "Web sites" msgstr "Strony internetowe" @@ -4981,48 +5442,55 @@ msgid "Welcome" msgstr "Witaj" -#: rc.cpp:130 rc.cpp:2048 +#: rc.cpp:132 msgid "White Balance" msgstr "Balans bieli" -#: rc.cpp:413 rc.cpp:879 rc.cpp:1548 rc.cpp:2331 rc.cpp:2797 rc.cpp:3466 -#: rc.cpp:4276 rc.cpp:4945 +#: rc.cpp:271 +msgid "White color" +msgstr "Kolor biały" + +#: rc.cpp:225 +msgid "White output" +msgstr "Wyjście białe" + +#: rc.cpp:481 rc.cpp:1226 rc.cpp:2060 rc.cpp:2775 rc.cpp:3609 msgid "Width" msgstr "Szerokość" -#: rc.cpp:493 rc.cpp:2411 +#: rc.cpp:561 msgid "Window" msgstr "Okno" -#: rc.cpp:1374 rc.cpp:1761 rc.cpp:3292 rc.cpp:3679 rc.cpp:4771 rc.cpp:5158 +#: rc.cpp:866 rc.cpp:1943 rc.cpp:2415 rc.cpp:3492 msgid "Wipe" msgstr "Płynnie z kształtem" -#: rc.cpp:873 rc.cpp:2791 rc.cpp:4270 +#: rc.cpp:2054 rc.cpp:3603 msgid "X" msgstr "X" -#: src/kdenlivesettingsdialog.cpp:236 +#: src/kdenlivesettingsdialog.cpp:240 msgid "X11" msgstr "X11" -#: src/kdenlivesettingsdialog.cpp:237 +#: src/kdenlivesettingsdialog.cpp:241 msgid "XFree86 DGA 2.0" msgstr "XFree86 DGA 2.0" -#: src/kdenlivesettingsdialog.cpp:235 +#: src/kdenlivesettingsdialog.cpp:239 msgid "XVideo" msgstr "XVideo" -#: rc.cpp:876 rc.cpp:2794 rc.cpp:4273 +#: rc.cpp:2057 rc.cpp:3606 msgid "Y" msgstr "Y" -#: rc.cpp:315 rc.cpp:2233 +#: rc.cpp:399 msgid "Year" msgstr "Rok" -#: src/mainwindow.cpp:415 +#: src/mainwindow.cpp:477 msgid "" "You have 1 rendering job waiting in the queue.\n" "What do you want to do with this job?" @@ -5039,7 +5507,7 @@ "Masz %1 zadań renderowania oczekujących w kolejce.\n" "Co chcesz z nimi zrobić?" -#: src/kdenlivedoc.cpp:600 +#: src/kdenlivedoc.cpp:607 msgid "" "You have changed the project folder. Do you want to copy the cached data " "from %1 to the new folder %2?" @@ -5047,33 +5515,29 @@ "Zmieniłeś katalog projektu. Czy chcesz skopiować dane pamięci podręcznej " "(cache) z %1 do nowego katalogu %2?" -#: src/customtrackview.cpp:2274 +#: src/customtrackview.cpp:2657 src/customtrackview.cpp:2663 msgid "You must be in an empty space to remove space (time: %1, track: %2)" msgstr "Musisz być w pustym odstępie aby usunąć odstęp (czas: %1, ścieżka: %2)" -#: src/customtrackview.cpp:2280 -msgid "You must be in an empty space to remove space (time: %1, track:%2)" -msgstr "Musisz być w pustym odstępie aby usunąć odstęp (czas: %1, ścieżka:%2)" - -#: src/customtrackview.cpp:4390 +#: src/customtrackview.cpp:4891 msgid "You must copy exactly one clip before pasting effects" msgstr "Musisz skopiować dokładnie jeden klip przed wklejaniem efektów" -#: src/customtrackview.cpp:4472 src/customtrackview.cpp:4503 -#: src/customtrackview.cpp:4833 src/customtrackview.cpp:4931 -#: src/customtrackview.cpp:4956 src/customtrackview.cpp:4981 +#: src/customtrackview.cpp:5028 src/customtrackview.cpp:5059 +#: src/customtrackview.cpp:5396 src/customtrackview.cpp:5494 +#: src/customtrackview.cpp:5519 src/customtrackview.cpp:5544 msgid "You must select one clip for this action" msgstr "Musisz wybrać jeden klip dla tej akcji" -#: src/customtrackview.cpp:4730 +#: src/customtrackview.cpp:5292 msgid "You must select one transition for this action" msgstr "Musisz wybrać jedno przejście dla tej akcji" -#: src/dvdwizard.cpp:609 +#: src/dvdwizard.cpp:628 msgid "You need program %1 to perform this action" msgstr "Potrzebujesz programu %1 aby wykonać tą operację" -#: src/recmonitor.cpp:167 +#: src/recmonitor.cpp:168 msgid "" "You need to disconnect and reconnect in the capture monitor to apply your " "changes" @@ -5081,7 +5545,7 @@ "Musisz odłączyć i ponownie podłączyć w Monitorze przechwytywania aby " "wprowadzić zmiany" -#: src/recmonitor.cpp:168 +#: src/recmonitor.cpp:169 msgid "You need to stop capture before your changes can be applied" msgstr "Zmiany nie zostaną wprowadzone do czasu zatrzymania przechwytywania" @@ -5093,7 +5557,7 @@ "Twoja wersja Kdenlive została zaktualizowana do %1. Proszę, poświęć chwilę " "czasu na przejrzenie podstawowych ustawień." -#: src/wizard.cpp:526 +#: src/wizard.cpp:538 msgid "" "Your MLT installation cannot be found. Install MLT and restart Kdenlive.\n" msgstr "" @@ -5104,7 +5568,7 @@ msgid "Your MLT version is unsupported!!!" msgstr "Twoja wersja MLT jest nieobsługiwana!!!" -#: src/trackview.cpp:398 +#: src/trackview.cpp:433 msgid "" "Your project file was upgraded to the latest Kdenlive document version, it " "was not possible to create a backup copy." @@ -5112,17 +5576,17 @@ "Twój plik projektu został uaktualniony do użycia w najnowszej wersji " "Kdenlive, nie udało się jednak utworzyć kopii zapasowej." -#: src/trackview.cpp:397 +#: src/trackview.cpp:432 msgid "" "Your project file was upgraded to the latest Kdenlive document version.\n" -" To make sure you don't loose data, a backup copy called: %1 was created." +" To make sure you don't lose data, a backup copy called %1 was created." msgstr "" "Twój plik projektu został uaktualniony do użycia w najnowszej wersji " "Kdenlive.\n" "Aby zabezpieczyć cię przed potencjalną utratą danych, utworzony został plik " "kopii zapasowej o nazwie: %1" -#: src/kdenlivedoc.cpp:674 +#: src/kdenlivedoc.cpp:681 msgid "" "Your project uses an unknown profile.\n" "It uses an existing profile name: %1.\n" @@ -5132,87 +5596,80 @@ "Używa istniejącego profilu o nazwie %1.\n" "Wybierz nową nazwę by go zapisać" -#: rc.cpp:1536 rc.cpp:3454 rc.cpp:4933 +#: rc.cpp:1109 rc.cpp:2658 msgid "Z-Index:" msgstr "Z-Indeks:" -#: src/customruler.cpp:197 +#: src/customruler.cpp:198 src/customruler.cpp:199 src/smallruler.cpp:119 msgid "Zone duration: %1" msgstr "Długość strefy: %1" -#: src/customruler.cpp:194 +#: src/customruler.cpp:194 src/customruler.cpp:195 src/smallruler.cpp:117 msgid "Zone end: %1" msgstr "Koniec strefy: %1" -#: src/customruler.cpp:191 +#: src/customruler.cpp:190 src/customruler.cpp:191 src/smallruler.cpp:115 msgid "Zone start: %1" msgstr "Początek strefy: %1" -#: src/titlewidget.cpp:175 +#: src/titlewidget.cpp:301 msgid "Zoom" msgstr "Powiększenie" -#: src/mainwindow.cpp:812 +#: src/mainwindow.cpp:928 msgid "Zoom In" msgstr "Powiększ" -#: src/mainwindow.cpp:817 +#: src/mainwindow.cpp:933 msgid "Zoom Out" msgstr "Pomniejsz" -#: rc.cpp:217 rc.cpp:2135 +#: rc.cpp:301 msgid "Zoom Rate" msgstr "Tempo powiększania" -#: rc.cpp:1584 rc.cpp:3502 rc.cpp:4981 +# ? +#: rc.cpp:2036 rc.cpp:3585 +msgid "Zoom using vertical drag in ruler" +msgstr "Powiększ używając poziomego przytrzymania linijki" + +#: rc.cpp:1118 rc.cpp:2667 msgid "Zoom:" msgstr "Powiększenie:" -#: src/titlewidget.cpp:1075 +#: src/titlewidget.cpp:1346 msgid "\\u2212X" msgstr "\\u2212X" -#: src/titlewidget.cpp:1100 +#: src/titlewidget.cpp:1371 msgid "\\u2212Y" msgstr "\\u2212Y" -#: _translatorinfo.cpp:3 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "vshader@gmail.com" - -#: _translatorinfo.cpp:1 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Mariusz Pluciński" - -#: rc.cpp:1062 rc.cpp:2980 rc.cpp:4459 +#: rc.cpp:965 rc.cpp:2514 msgid "after" msgstr "po" -#: rc.cpp:1059 rc.cpp:2977 rc.cpp:4456 +#: rc.cpp:962 rc.cpp:2511 msgid "before" msgstr "przed" -#: rc.cpp:993 rc.cpp:2911 rc.cpp:4390 +#: rc.cpp:1985 rc.cpp:3534 msgid "create new points" msgstr "tworzenie nowych punktów" -#: src/dvdwizardvob.cpp:55 src/wizard.cpp:333 +#: src/dvdwizardvob.cpp:55 src/wizard.cpp:345 msgid "dvdauthor" msgstr "dvdauthor" -#: src/wizard.cpp:326 +#: src/wizard.cpp:338 msgid "dvgrab" msgstr "dvgrab" -#: rc.cpp:1236 rc.cpp:3154 rc.cpp:4633 +#: rc.cpp:1319 rc.cpp:2868 msgid "dvgrab additional parameters" msgstr "Dodatkowe parametry dvgrab" -#: src/recmonitor.cpp:216 +#: src/recmonitor.cpp:217 msgid "" "dvgrab utility not found,\n" " please install it for firewire capture" @@ -5220,17 +5677,21 @@ "Program dvgrab nie znaleziony,\n" "Zainstaluj go do przechwytywania FireWire" -#: src/kdenlivesettingsdialog.cpp:172 +#: src/kdenlivesettingsdialog.cpp:176 msgid "dvgrab version %1 at %2" msgstr "dvgrab wersja %1 na %2" -#: src/editeffectcommand.cpp:39 src/edittransitioncommand.cpp:35 -#: src/customtrackview.cpp:1465 src/customtrackview.cpp:1509 -#: src/addeffectcommand.cpp:37 +#: src/addeffectcommand.cpp:37 src/edittransitioncommand.cpp:35 +#: src/customtrackview.cpp:1635 src/customtrackview.cpp:1679 +#: src/customtrackview.cpp:1748 src/editeffectcommand.cpp:39 msgid "effect" msgstr "efekt" -#: src/timecode.cpp:159 +#: src/customtrackview.cpp:5828 +msgid "error" +msgstr "błąd" + +#: src/timecode.cpp:177 msgid "frames" msgstr "klatki" @@ -5238,15 +5699,15 @@ msgid "genisoimage" msgstr "genisoimage" -#: src/wizard.cpp:340 +#: src/wizard.cpp:352 msgid "genisoimage or mkisofs" msgstr "genisoimage lub mkisofs" -#: src/clipproperties.cpp:165 src/mainwindow.cpp:676 src/slideshowclip.cpp:58 +#: src/slideshowclip.cpp:59 src/mainwindow.cpp:745 src/clipproperties.cpp:189 msgid "hh:mm:ss::ff" msgstr "hh:mm:ss::ff" -#: src/timecode.cpp:138 +#: src/timecode.cpp:156 msgid "hour" msgstr "godzina" @@ -5254,12 +5715,12 @@ msgid "import" msgstr "import" -#: src/mainwindow.cpp:706 +#: src/mainwindow.cpp:806 msgctxt "Spacer tool shortcut" msgid "m" msgstr "m" -#: src/timecode.cpp:146 +#: src/timecode.cpp:164 msgid "min." msgstr "min." @@ -5267,76 +5728,165 @@ msgid "mkisofs" msgstr "mkisofs" -#: rc.cpp:975 rc.cpp:2893 rc.cpp:4372 +#: rc.cpp:1967 rc.cpp:3516 msgid "move on X axis" msgstr "przesuń na oś X" -#: rc.cpp:981 rc.cpp:2899 rc.cpp:4378 +#: rc.cpp:1973 rc.cpp:3522 msgid "move on Y axis" msgstr "przesuń na oś Y" -#: rc.cpp:1263 rc.cpp:3181 rc.cpp:4660 +#: src/mainwindow.cpp:763 +msgctxt "Normal editing" +msgid "n" +msgstr "n" + +#: rc.cpp:597 +msgid "opacity" +msgstr "nieprzezroczystość" + +#: rc.cpp:1346 rc.cpp:2895 msgid "oss" msgstr "oss" -#: rc.cpp:1002 rc.cpp:2920 rc.cpp:4399 +#: rc.cpp:1994 rc.cpp:3543 msgid "parameter description" msgstr "opis parametru" -#: src/wizard.cpp:320 +#: rc.cpp:591 +msgid "radius" +msgstr "promień" + +#: src/wizard.cpp:332 msgid "recordmydesktop" msgstr "recordmydesktop" -#: src/mainwindow.cpp:694 +#: src/mainwindow.cpp:794 msgctxt "Selection tool shortcut" msgid "s" msgstr "s" -#: src/renderwidget.cpp:1675 +#: src/renderwidget.cpp:1747 msgid "script" msgstr "skrypt" -#: src/timecode.cpp:154 +#: src/timecode.cpp:172 msgid "sec." msgstr "sec." -#: src/abstractclipitem.cpp:273 +#: src/abstractclipitem.cpp:316 msgid "seconds" msgstr "sekundy" -#: rc.cpp:608 rc.cpp:2526 rc.cpp:4005 +#: rc.cpp:589 +msgid "smooth" +msgstr "wygładzony" + +#: rc.cpp:1712 rc.cpp:3261 msgid "to" msgstr "do" -#: src/renderwidget.cpp:1034 +#: src/renderwidget.cpp:1082 msgid "untitled" msgstr "Bez tytułu" -#: rc.cpp:987 rc.cpp:2905 rc.cpp:4384 +#: rc.cpp:1979 rc.cpp:3528 msgid "update values in timeline" msgstr "aktualizacja wartości na linii czasu" -#: rc.cpp:1266 rc.cpp:3184 rc.cpp:4663 +#: rc.cpp:1349 rc.cpp:2898 msgid "video4linux2" msgstr "video4linux2" -#: rc.cpp:936 rc.cpp:2854 rc.cpp:4333 +#: rc.cpp:766 rc.cpp:2315 msgid "with track" msgstr "ze ścieżką" -#: src/mainwindow.cpp:700 +#: src/mainwindow.cpp:800 msgctxt "Razor tool shortcut" msgid "x" msgstr "x" -#: rc.cpp:783 rc.cpp:2701 rc.cpp:4180 +#: rc.cpp:593 rc.cpp:676 rc.cpp:2225 msgid "x" msgstr "x" -#: rc.cpp:1644 rc.cpp:3562 rc.cpp:5041 +#: rc.cpp:1211 rc.cpp:2760 msgid "x1" msgstr "x1" +#: rc.cpp:595 +msgid "y" +msgstr "y" + +#~ msgid "Channel 1" +#~ msgstr "Kanał 1" + +#~ msgid "Channel 2" +#~ msgstr "Kanał 2" + +#~ msgid "Channel 3" +#~ msgstr "Kanał 3" + +#~ msgid "Channel 4" +#~ msgstr "Kanał 4" + +#~ msgid "Channel 5" +#~ msgstr "Kanał 5" + +#~ msgid "Channel 6" +#~ msgstr "Kanał 6" + +#~ msgid "Clip duration" +#~ msgstr "Czas trwania klipu" + +#~ msgid "Clip speed" +#~ msgstr "Prędkość klipu" + +#~ msgid "Filename" +#~ msgstr "Nazwa pliku" + +#~ msgid "Fill transparency" +#~ msgstr "Wypełnij przezroczystym" + +#~ msgid "Reverse playing" +#~ msgstr "Odtwarzanie w przeciwnym kierunku" + +#~ msgid "Rotate:" +#~ msgstr "Obrót:" + +#~ msgid "Set In Point" +#~ msgstr "Ustaw punkt wewnątrz" + +#~ msgid "Set Out Point" +#~ msgstr "Ustaw punkt na zewnątrz" + +#~ msgid "Sox Balance" +#~ msgstr "Sox Balance" + +#~ msgid "Sox change audio balance" +#~ msgstr "Efekt audio Sox - zmiana balansu dźwięku" + +#~ msgid "Stroboscope effect" +#~ msgstr "Efekt stroboskopu" + +#~ msgid "Thumbnail" +#~ msgstr "Miniaturka" + +#~ msgid "You must be in an empty space to remove space (time: %1, track:%2)" +#~ msgstr "" +#~ "Musisz być w pustym odstępie aby usunąć odstęp (czas: %1, ścieżka:%2)" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "vshader@gmail.com" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "Mariusz Pluciński" + #~ msgid "Dvdauthor" #~ msgstr "Dvdauthor" diff -Nru kdenlive-0.7.7/po/pt_BR/kdenlive.po kdenlive-0.7.7.1/po/pt_BR/kdenlive.po --- kdenlive-0.7.7/po/pt_BR/kdenlive.po 2010-02-17 08:07:48.000000000 +0000 +++ kdenlive-0.7.7.1/po/pt_BR/kdenlive.po 2010-02-26 21:44:41.000000000 +0000 @@ -1,20 +1,22 @@ # Copyright (C) 2008 THE kdenlive's COPYRIGHT HOLDER # This file is distributed under the same license as the kdenlive package. -# , 2008. , 2008. # # +# , 2008. , 2008. +# Marcelo Soares Souza , 2010. msgid "" msgstr "" "Project-Id-Version: kdenlive\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-02 18:20+0200\n" -"PO-Revision-Date: 2010-02-07 19:57-0300\n" -"Last-Translator: Wille Marcel \n" -"Language-Team: Portuguese/Brazil \n" +"PO-Revision-Date: 2010-02-18 10:39-0400\n" +"Last-Translator: Marcelo Soares Souza \n" +"Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.0\n" #: rc.cpp:1136 #: rc.cpp:1142 @@ -938,7 +940,7 @@ #: src/titlewidget.cpp:174 msgid "Blur" -msgstr "" +msgstr "Blur" #: rc.cpp:16 msgid "Blur factor" @@ -995,7 +997,7 @@ #: rc.cpp:2895 #: rc.cpp:2904 msgid "Buffer" -msgstr "" +msgstr "Buffer" #: src/main.cpp:41 #: src/main.cpp:42 @@ -1640,7 +1642,7 @@ #: src/main.cpp:37 msgid "Copyright (c) 2009 Development team" -msgstr "Copyright (c) 2008 Equipe de desenvolvimento" +msgstr "Copyright (c) 2009 Equipe de desenvolvimento" #: src/renderer.cpp:1142 msgid "" @@ -2099,7 +2101,7 @@ #: src/titlewidget.cpp:231 msgctxt "Font style" msgid "Demi-Bold" -msgstr "" +msgstr "Demi-Bold" #: rc.cpp:353 msgid "Depth" @@ -2288,7 +2290,7 @@ #: src/main.cpp:47 msgid "EMAIL OF TRANSLATORS" -msgstr "soares.souza@gmail.com, wille@riseup.net" +msgstr "soares.souza@gmail.com, wille@riseup.net, filhosdaweb@gmail.com" #: rc.cpp:207 msgid "Edges correction" @@ -2443,7 +2445,7 @@ #: src/kdenlivedoc.cpp:1088 msgid "Enter Template Path" -msgstr "Insira o Caminho do Template" +msgstr "Insira o Caminho do Modelo" #: rc.cpp:1487 #: rc.cpp:3021 @@ -2909,7 +2911,7 @@ #: rc.cpp:1403 #: rc.cpp:2937 msgid "Full shots" -msgstr "" +msgstr "Tomadas inteiras" #: rc.cpp:303 #: rc.cpp:307 @@ -3791,7 +3793,7 @@ #: src/main.cpp:47 msgid "NAME OF TRANSLATORS" -msgstr "Marcelo Soares Souza, Wille Marcel" +msgstr "Marcelo Soares Souza, Wille Marcel, Thiago Lima de Sousa" #: rc.cpp:1628 #: rc.cpp:3162 @@ -5074,11 +5076,11 @@ #: rc.cpp:457 msgid "Shear X" -msgstr "" +msgstr "Cortar X" #: rc.cpp:459 msgid "Shear Y" -msgstr "" +msgstr "Cortar Y" #: rc.cpp:369 #: rc.cpp:541 @@ -5087,7 +5089,7 @@ #: src/mainwindow.cpp:2718 msgid "Shift + click to create a selection rectangle, Ctrl + click to add an item to selection" -msgstr "" +msgstr "Shift + clique para criar uma seleção retangular, Ctrl + clique para adicionar o item selecionado" #: rc.cpp:1931 #: rc.cpp:3465 @@ -5434,11 +5436,11 @@ #: src/projectitem.cpp:182 msgid "Template text clip" -msgstr "" +msgstr "Modelo de clipe de texto" #: src/kdenlivedoc.cpp:1094 msgid "Template title clip" -msgstr "" +msgstr "Modelo de clipe de titulo" #: rc.cpp:1763 #: rc.cpp:3297 @@ -5583,11 +5585,11 @@ #: rc.cpp:253 msgid "Tilt X" -msgstr "" +msgstr "Inclinar X" #: rc.cpp:255 msgid "Tilt Y" -msgstr "" +msgstr "Inclinar Y" #: rc.cpp:857 #: rc.cpp:2391 diff -Nru kdenlive-0.7.7/README kdenlive-0.7.7.1/README --- kdenlive-0.7.7/README 2010-02-17 08:07:55.000000000 +0000 +++ kdenlive-0.7.7.1/README 2010-02-26 21:46:13.000000000 +0000 @@ -1,4 +1,4 @@ -Kdenlive 0.7.7 +Kdenlive 0.7.7.1 by Jean-Baptiste Mardelle and the Kdenlive team Kdenlive is a video editing application for KDE 4. diff -Nru kdenlive-0.7.7/src/abstractgroupitem.cpp~ kdenlive-0.7.7.1/src/abstractgroupitem.cpp~ --- kdenlive-0.7.7/src/abstractgroupitem.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/abstractgroupitem.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,398 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Marco Gittler (g.marco@freenet.de) * - * Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - -#include "abstractgroupitem.h" -#include "abstractclipitem.h" -#include "kdenlivesettings.h" -#include "customtrackscene.h" -#include "customtrackview.h" - -#include - -#include -#include -#include -#include -#include - -AbstractGroupItem::AbstractGroupItem(double /* fps */) : - QObject(), - QGraphicsItemGroup() -{ - setZValue(1); - setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); -#if QT_VERSION >= 0x040600 - setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); -#endif - setAcceptDrops(true); -} - -int AbstractGroupItem::type() const -{ - return GROUPWIDGET; -} - -int AbstractGroupItem::track() const -{ - return (int)(scenePos().y() / KdenliveSettings::trackheight()); -} - -void AbstractGroupItem::setItemLocked(bool locked) -{ - if (locked) { - setSelected(false); - setFlag(QGraphicsItem::ItemIsMovable, false); - setFlag(QGraphicsItem::ItemIsSelectable, false); - } else { - setFlag(QGraphicsItem::ItemIsMovable, true); - setFlag(QGraphicsItem::ItemIsSelectable, true); - } -} - -bool AbstractGroupItem::isItemLocked() const -{ - return !(flags() & (QGraphicsItem::ItemIsSelectable)); -} - -CustomTrackScene* AbstractGroupItem::projectScene() -{ - if (scene()) return static_cast (scene()); - return NULL; -} - -QPainterPath AbstractGroupItem::clipGroupShape(QPointF offset) const -{ - QPainterPath path; - QList children = childItems(); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == AVWIDGET) { - QRectF r(children.at(i)->sceneBoundingRect()); - r.translate(offset); - path.addRect(r); - } - else if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - for (int j = 0; j < subchildren.count(); j++) { - if (subchildren.at(j)->type() == AVWIDGET) { - QRectF r(subchildren.at(j)->sceneBoundingRect()); - r.translate(offset); - path.addRect(r); - } - } - } - } - return path; -} - -QPainterPath AbstractGroupItem::transitionGroupShape(QPointF offset) const -{ - QPainterPath path; - QList children = childItems(); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == TRANSITIONWIDGET) { - QRectF r(children.at(i)->sceneBoundingRect()); - r.translate(offset); - path.addRect(r); - } - else if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - for (int j = 0; j < subchildren.count(); j++) { - if (subchildren.at(j)->type() == TRANSITIONWIDGET) { - QRectF r(subchildren.at(j)->sceneBoundingRect()); - r.translate(offset); - path.addRect(r); - } - } - } - } - return path; -} - -void AbstractGroupItem::addItem(QGraphicsItem * item) -{ - addToGroup(item); - //fixItemRect(); -} - -void AbstractGroupItem::fixItemRect() -{ - QPointF start = boundingRect().topLeft(); - if (start != QPointF(0, 0)) { - translate(0 - start.x(), 0 - start.y()); - setPos(start); - } -} - -/*ItemInfo AbstractGroupItem::info() const { - ItemInfo itemInfo; - itemInfo.startPos = m_startPos; - itemInfo.track = m_track; - return itemInfo; -}*/ - -// virtual -void AbstractGroupItem::paint(QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *) -{ - const double scale = option->matrix.m11(); - QColor bgcolor(100, 100, 200, 100); - QRectF bound = option->exposedRect.adjusted(0, 0, 1, 1); - p->setClipRect(bound); - p->fillRect(option->exposedRect, bgcolor); - QPen pen = p->pen(); - pen.setColor(QColor(200, 90, 90)); - pen.setStyle(Qt::DashLine); - pen.setWidthF(0.0); - //pen.setCosmetic(true); - p->setPen(pen); - p->drawRect(boundingRect().adjusted(0, 0, - 1 / scale, 0)); -} - -//virtual -QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant &value) -{ - if (change == QGraphicsItem::ItemSelectedChange) { - if (value.toBool()) setZValue(10); - else setZValue(1); - } - if (change == ItemPositionChange && scene()/* && parentItem() == 0*/) { - // calculate new position. - const int trackHeight = KdenliveSettings::trackheight(); - QPointF start = sceneBoundingRect().topLeft(); - QPointF newPos = value.toPointF(); - int xpos = projectScene()->getSnapPointForPos((int)(start.x() + newPos.x() - pos().x()), KdenliveSettings::snaptopoints()); - - xpos = qMax(xpos, 0); - //kDebug()<<"GRP XPOS:"<tracksCount() - (int)(boundingRect().height() + 5) / trackHeight); - correctedTrack = qMax(correctedTrack, 0); - - proposedTrack += (correctedTrack - realTrack); - - // Check if top item is a clip or a transition - int offset = 0; - int topTrack = -1; - QList children = childItems(); - for (int i = 0; i < children.count(); i++) { - int currentTrack = (int)(children.at(i)->scenePos().y() / trackHeight); - if (children.at(i)->type() == AVWIDGET) { - if (topTrack == -1 || currentTrack <= topTrack) { - offset = 0; - topTrack = currentTrack; - } - } else if (children.at(i)->type() == TRANSITIONWIDGET) { - if (topTrack == -1 || currentTrack < topTrack) { - offset = (int)(trackHeight / 3 * 2 - 1); - topTrack = currentTrack; - } - } else if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - bool clipGroup = false; - for (int j = 0; j < subchildren.count(); j++) { - if (subchildren.at(j)->type() == AVWIDGET) { - clipGroup = true; - break; - } - } - if (clipGroup) { - if (topTrack == -1 || currentTrack <= topTrack) { - offset = 0; - topTrack = currentTrack; - } - } else { - if (topTrack == -1 || currentTrack < topTrack) { - offset = (int)(trackHeight / 3 * 2 - 1); - topTrack = currentTrack; - } - } - } - } - newPos.setY((int)((proposedTrack) * trackHeight) + offset); - //if (newPos == start) return start; - - /*if (newPos.x() < 0) { - // If group goes below 0, adjust position to 0 - return QPointF(pos().x() - start.x(), pos().y()); - }*/ - - QList collidingItems; - QPainterPath shape; - if (projectScene()->editMode() == NORMALEDIT) { - shape = clipGroupShape(newPos - pos()); - collidingItems = scene()->items(shape, Qt::IntersectsItemShape); - collidingItems.removeAll(this); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - for (int j = 0; j < subchildren.count(); j++) { - collidingItems.removeAll(subchildren.at(j)); - } - } - collidingItems.removeAll(children.at(i)); - } - } - if (!collidingItems.isEmpty()) { - bool forwardMove = xpos > start.x(); - int offset = 0; - for (int i = 0; i < collidingItems.count(); i++) { - QGraphicsItem *collision = collidingItems.at(i); - if (collision->type() == AVWIDGET) { - // Collision - if (newPos.y() != pos().y()) { - // Track change results in collision, restore original position - return pos(); - } - AbstractClipItem *item = static_cast (collision); - if (forwardMove) { - // Moving forward, determine best pos - QPainterPath clipPath; - clipPath.addRect(item->sceneBoundingRect()); - QPainterPath res = shape.intersected(clipPath); - offset = qMax(offset, (int)(res.boundingRect().width() + 0.5)); - } else { - // Moving backward, determine best pos - QPainterPath clipPath; - clipPath.addRect(item->sceneBoundingRect()); - QPainterPath res = shape.intersected(clipPath); - offset = qMax(offset, (int)(res.boundingRect().width() + 0.5)); - } - } - } - if (offset > 0) { - if (forwardMove) { - newPos.setX(newPos.x() - offset); - } else { - newPos.setX(newPos.x() + offset); - } - // If there is still a collision after our position adjust, restore original pos - collidingItems = scene()->items(clipGroupShape(newPos - pos()), Qt::IntersectsItemShape); - collidingItems.removeAll(this); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - for (int j = 0; j < subchildren.count(); j++) { - collidingItems.removeAll(subchildren.at(j)); - } - } - collidingItems.removeAll(children.at(i)); - } - for (int i = 0; i < collidingItems.count(); i++) - if (collidingItems.at(i)->type() == AVWIDGET) return pos(); - } - } - - if (projectScene()->editMode() == NORMALEDIT) { - shape = transitionGroupShape(newPos - pos()); - collidingItems = scene()->items(shape, Qt::IntersectsItemShape); - collidingItems.removeAll(this); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - for (int j = 0; j < subchildren.count(); j++) { - collidingItems.removeAll(subchildren.at(j)); - } - } - collidingItems.removeAll(children.at(i)); - } - } - if (collidingItems.isEmpty()) return newPos; - else { - bool forwardMove = xpos > start.x(); - int offset = 0; - for (int i = 0; i < collidingItems.count(); i++) { - QGraphicsItem *collision = collidingItems.at(i); - if (collision->type() == TRANSITIONWIDGET) { - // Collision - if (newPos.y() != pos().y()) { - // Track change results in collision, restore original position - return pos(); - } - AbstractClipItem *item = static_cast (collision); - if (forwardMove) { - // Moving forward, determine best pos - QPainterPath clipPath; - clipPath.addRect(item->sceneBoundingRect()); - QPainterPath res = shape.intersected(clipPath); - offset = qMax(offset, (int)(res.boundingRect().width() + 0.5)); - } else { - // Moving backward, determine best pos - QPainterPath clipPath; - clipPath.addRect(item->sceneBoundingRect()); - QPainterPath res = shape.intersected(clipPath); - offset = qMax(offset, (int)(res.boundingRect().width() + 0.5)); - } - } - } - if (offset > 0) { - if (forwardMove) { - newPos.setX(newPos.x() - offset); - } else { - newPos.setX(newPos.x() + offset); - } - // If there is still a collision after our position adjust, restore original pos - collidingItems = scene()->items(transitionGroupShape(newPos - pos()), Qt::IntersectsItemShape); - for (int i = 0; i < children.count(); i++) { - collidingItems.removeAll(children.at(i)); - } - for (int i = 0; i < collidingItems.count(); i++) - if (collidingItems.at(i)->type() == TRANSITIONWIDGET) return pos(); - } - } - return newPos; - } - return QGraphicsItemGroup::itemChange(change, value); -} - -//virtual -void AbstractGroupItem::dropEvent(QGraphicsSceneDragDropEvent * event) -{ - QString effects = QString(event->mimeData()->data("kdenlive/effectslist")); - QDomDocument doc; - doc.setContent(effects, true); - QDomElement e = doc.documentElement(); - CustomTrackView *view = (CustomTrackView *) scene()->views()[0]; - if (view) view->slotAddGroupEffect(e, this); -} - -//virtual -void AbstractGroupItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event) -{ - event->setAccepted(event->mimeData()->hasFormat("kdenlive/effectslist")); -} - -void AbstractGroupItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event) -{ - Q_UNUSED(event); -} - -// virtual -void AbstractGroupItem::mousePressEvent(QGraphicsSceneMouseEvent * event) -{ - if (event->modifiers() & Qt::ShiftModifier) { - // User want to do a rectangle selection, so ignore the event to pass it to the view - event->ignore(); - } else QGraphicsItem::mousePressEvent(event); -} diff -Nru kdenlive-0.7.7/src/clipitem.cpp~ kdenlive-0.7.7.1/src/clipitem.cpp~ --- kdenlive-0.7.7/src/clipitem.cpp~ 2010-02-17 08:07:50.000000000 +0000 +++ kdenlive-0.7.7.1/src/clipitem.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,1707 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "clipitem.h" -#include "customtrackview.h" -#include "customtrackscene.h" -#include "renderer.h" -#include "docclipbase.h" -#include "transition.h" -#include "kdenlivesettings.h" -#include "kthumb.h" -#include "profilesdialog.h" - -#include -#include - -#include -#include -#include -#include -#include - -ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, int strobe, bool generateThumbs) : - AbstractClipItem(info, QRectF(), fps), - m_clip(clip), - m_startFade(0), - m_endFade(0), - m_audioOnly(false), - m_videoOnly(false), - m_startPix(QPixmap()), - m_endPix(QPixmap()), - m_hasThumbs(false), - m_selectedEffect(-1), - m_timeLine(0), - m_startThumbRequested(false), - m_endThumbRequested(false), - //m_hover(false), - m_speed(speed), - m_strobe(strobe), - m_framePixelWidth(0) -{ - setZValue(2); - setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (double)(KdenliveSettings::trackheight() - 2)); - setPos(info.startPos.frames(fps), (double)(info.track * KdenliveSettings::trackheight()) + 1); - - // set speed independant info - m_speedIndependantInfo = m_info; - m_speedIndependantInfo.cropStart = GenTime((int)(m_info.cropStart.frames(m_fps) * m_speed), m_fps); - m_speedIndependantInfo.cropDuration = GenTime((int)(m_info.cropDuration.frames(m_fps) * m_speed), m_fps); - - m_videoPix = KIcon("kdenlive-show-video").pixmap(QSize(16, 16)); - m_audioPix = KIcon("kdenlive-show-audio").pixmap(QSize(16, 16)); - - if (m_speed == 1.0) m_clipName = m_clip->name(); - else { - m_clipName = m_clip->name() + " - " + QString::number(m_speed * 100, 'f', 0) + '%'; - } - m_producer = m_clip->getId(); - m_clipType = m_clip->clipType(); - //m_cropStart = info.cropStart; - m_maxDuration = m_clip->maxDuration(); - setAcceptDrops(true); - m_audioThumbReady = m_clip->audioThumbCreated(); - //setAcceptsHoverEvents(true); - connect(this , SIGNAL(prepareAudioThumb(double, int, int, int)) , this, SLOT(slotPrepareAudioThumb(double, int, int, int))); - - if (m_clipType == VIDEO || m_clipType == AV || m_clipType == SLIDESHOW || m_clipType == PLAYLIST) { - m_baseColor = QColor(141, 166, 215); - if (!m_clip->isPlaceHolder()) { - m_hasThumbs = true; - m_startThumbTimer.setSingleShot(true); - connect(&m_startThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetStartThumb())); - m_endThumbTimer.setSingleShot(true); - connect(&m_endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb())); - - connect(this, SIGNAL(getThumb(int, int)), m_clip->thumbProducer(), SLOT(extractImage(int, int))); - - connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QImage)), this, SLOT(slotThumbReady(int, QImage))); - connect(m_clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData())); - if (generateThumbs) QTimer::singleShot(200, this, SLOT(slotFetchThumbs())); - } - - } else if (m_clipType == COLOR) { - QString colour = m_clip->getProperty("colour"); - colour = colour.replace(0, 2, "#"); - m_baseColor = QColor(colour.left(7)); - } else if (m_clipType == IMAGE || m_clipType == TEXT) { - m_baseColor = QColor(141, 166, 215); - if (m_clipType == TEXT) { - connect(this, SIGNAL(getThumb(int, int)), m_clip->thumbProducer(), SLOT(extractImage(int, int))); - connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QImage)), this, SLOT(slotThumbReady(int, QImage))); - } - //m_startPix = KThumb::getImage(KUrl(clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight()); - } else if (m_clipType == AUDIO) { - m_baseColor = QColor(141, 215, 166); - connect(m_clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData())); - } -} - - -ClipItem::~ClipItem() -{ - blockSignals(true); - if (scene()) scene()->removeItem(this); - if (m_clipType == VIDEO || m_clipType == AV || m_clipType == SLIDESHOW || m_clipType == PLAYLIST) { - //disconnect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QImage)), this, SLOT(slotThumbReady(int, QImage))); - //disconnect(m_clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData())); - } - delete m_timeLine; -} - -ClipItem *ClipItem::clone(ItemInfo info) const -{ - ClipItem *duplicate = new ClipItem(m_clip, info, m_fps, m_speed, m_strobe); - if (m_clipType == IMAGE || m_clipType == TEXT) duplicate->slotSetStartThumb(m_startPix); - else if (m_clipType != COLOR) { - if (info.cropStart == m_info.cropStart) duplicate->slotSetStartThumb(m_startPix); - if (info.cropStart + (info.endPos - info.startPos) == m_info.cropStart + (m_info.endPos - m_info.startPos)) duplicate->slotSetEndThumb(m_endPix); - } - //kDebug() << "// CLoning clip: " << (info.cropStart + (info.endPos - info.startPos)).frames(m_fps) << ", CURRENT end: " << (cropStart() + duration()).frames(m_fps); - duplicate->setEffectList(m_effectList); - duplicate->setVideoOnly(m_videoOnly); - duplicate->setAudioOnly(m_audioOnly); - //duplicate->setSpeed(m_speed); - return duplicate; -} - -void ClipItem::setEffectList(const EffectsList effectList) -{ - m_effectList.clone(effectList); - m_effectNames = m_effectList.effectNames().join(" / "); - if (!m_effectList.isEmpty()) setSelectedEffect(0); -} - -const EffectsList ClipItem::effectList() const -{ - return m_effectList; -} - -int ClipItem::selectedEffectIndex() const -{ - return m_selectedEffect; -} - -void ClipItem::initEffect(QDomElement effect, int diff) -{ - // the kdenlive_ix int is used to identify an effect in mlt's playlist, should - // not be changed - if (effect.attribute("kdenlive_ix").toInt() == 0) - effect.setAttribute("kdenlive_ix", QString::number(effectsCounter())); - - if (effect.attribute("id") == "freeze" && diff > 0) { - EffectsList::setParameter(effect, "frame", QString::number(diff)); - } - - // Init parameter value & keyframes if required - QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - kDebug() << "// init eff: " << e.attribute("name"); - - // Check if this effect has a variable parameter - if (e.attribute("default").startsWith('%')) { - double evaluatedValue = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("default")); - e.setAttribute("default", evaluatedValue); - if (e.hasAttribute("value") && e.attribute("value").startsWith('%')) { - e.setAttribute("value", evaluatedValue); - } - } - - if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { - QString def = e.attribute("default"); - // Effect has a keyframe type parameter, we need to set the values - if (e.attribute("keyframes").isEmpty()) { - e.setAttribute("keyframes", QString::number(cropStart().frames(m_fps)) + ':' + def + ';' + QString::number((cropStart() + cropDuration()).frames(m_fps) - 1) + ':' + def); - kDebug() << "///// EFFECT KEYFRAMES INITED: " << e.attribute("keyframes"); - //break; - } - } - } - if (effect.attribute("tag") == "volume" || effect.attribute("tag") == "brightness") { - if (effect.attribute("id") == "fadeout" || effect.attribute("id") == "fade_to_black") { - int end = (cropDuration() + cropStart()).frames(m_fps); - int start = end; - if (effect.attribute("id") == "fadeout") { - if (m_effectList.hasEffect(QString(), "fade_to_black") == -1) { - int effectDuration = EffectsList::parameter(effect, "in").toInt(); - if (effectDuration > cropDuration().frames(m_fps)) { - effectDuration = cropDuration().frames(m_fps) / 2; - } - start -= effectDuration; - } else { - QDomElement fadeout = m_effectList.getEffectByTag(QString(), "fade_to_black"); - start -= EffectsList::parameter(fadeout, "out").toInt() - EffectsList::parameter(fadeout, "in").toInt(); - } - } else if (effect.attribute("id") == "fade_to_black") { - if (m_effectList.hasEffect(QString(), "fadeout") == -1) { - int effectDuration = EffectsList::parameter(effect, "in").toInt(); - if (effectDuration > cropDuration().frames(m_fps)) { - effectDuration = cropDuration().frames(m_fps) / 2; - } - start -= effectDuration; - } else { - QDomElement fadeout = m_effectList.getEffectByTag(QString(), "fadeout"); - start -= EffectsList::parameter(fadeout, "out").toInt() - EffectsList::parameter(fadeout, "in").toInt(); - } - } - EffectsList::setParameter(effect, "in", QString::number(start)); - EffectsList::setParameter(effect, "out", QString::number(end)); - } else if (effect.attribute("id") == "fadein" || effect.attribute("id") == "fade_from_black") { - int start = cropStart().frames(m_fps); - int end = start; - if (effect.attribute("id") == "fadein") { - if (m_effectList.hasEffect(QString(), "fade_from_black") == -1) { - int effectDuration = EffectsList::parameter(effect, "out").toInt(); - if (effectDuration > cropDuration().frames(m_fps)) { - effectDuration = cropDuration().frames(m_fps) / 2; - } - end += effectDuration; - } else - end += EffectsList::parameter(m_effectList.getEffectByTag(QString(), "fade_from_black"), "out").toInt(); - } else if (effect.attribute("id") == "fade_from_black") { - if (m_effectList.hasEffect(QString(), "fadein") == -1) { - int effectDuration = EffectsList::parameter(effect, "out").toInt(); - if (effectDuration > cropDuration().frames(m_fps)) { - effectDuration = cropDuration().frames(m_fps) / 2; - } - end += effectDuration; - } else - end += EffectsList::parameter(m_effectList.getEffectByTag(QString(), "fadein"), "out").toInt(); - } - EffectsList::setParameter(effect, "in", QString::number(start)); - EffectsList::setParameter(effect, "out", QString::number(end)); - } - } -} - -bool ClipItem::checkKeyFrames() -{ - bool clipEffectsModified = false; - for (int ix = 0; ix < m_effectList.count(); ix ++) { - QString kfr = keyframes(ix); - if (!kfr.isEmpty()) { - const QStringList keyframes = kfr.split(';', QString::SkipEmptyParts); - QStringList newKeyFrames; - bool cutKeyFrame = false; - bool modified = false; - int lastPos = -1; - double lastValue = -1; - int start = cropStart().frames(m_fps); - int end = (cropStart() + cropDuration()).frames(m_fps); - foreach(const QString &str, keyframes) { - int pos = str.section(':', 0, 0).toInt(); - double val = str.section(':', 1, 1).toDouble(); - if (pos - start < 0) { - // a keyframe is defined before the start of the clip - cutKeyFrame = true; - } else if (cutKeyFrame) { - // create new keyframe at clip start, calculate interpolated value - if (pos > start) { - int diff = pos - lastPos; - double ratio = (double)(start - lastPos) / diff; - double newValue = lastValue + (val - lastValue) * ratio; - newKeyFrames.append(QString::number(start) + ':' + QString::number(newValue)); - modified = true; - } - cutKeyFrame = false; - } - if (!cutKeyFrame) { - if (pos > end) { - // create new keyframe at clip end, calculate interpolated value - int diff = pos - lastPos; - if (diff != 0) { - double ratio = (double)(end - lastPos) / diff; - double newValue = lastValue + (val - lastValue) * ratio; - newKeyFrames.append(QString::number(end) + ':' + QString::number(newValue)); - modified = true; - } - break; - } else { - newKeyFrames.append(QString::number(pos) + ':' + QString::number(val)); - } - } - lastPos = pos; - lastValue = val; - } - if (modified) { - // update KeyFrames - setKeyframes(ix, newKeyFrames.join(";")); - clipEffectsModified = true; - } - } - } - return clipEffectsModified; -} - -void ClipItem::setKeyframes(const int ix, const QString keyframes) -{ - QDomElement effect = getEffectAt(ix); - if (effect.attribute("disable") == "1") return; - QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { - e.setAttribute("keyframes", keyframes); - if (ix == m_selectedEffect) { - m_keyframes.clear(); - double max = e.attribute("max").toDouble(); - double min = e.attribute("min").toDouble(); - m_keyframeFactor = 100.0 / (max - min); - m_keyframeDefault = e.attribute("default").toDouble(); - m_selectedKeyframe = 0; - // parse keyframes - const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts); - foreach(const QString &str, keyframes) { - int pos = str.section(':', 0, 0).toInt(); - double val = str.section(':', 1, 1).toDouble(); - m_keyframes[pos] = val; - } - if (m_keyframes.find(m_editedKeyframe) == m_keyframes.end()) m_editedKeyframe = -1; - if (m_keyframes.find(m_editedKeyframe) == m_keyframes.end()) m_editedKeyframe = -1; - update(); - return; - } - break; - } - } -} - - -void ClipItem::setSelectedEffect(const int ix) -{ - m_selectedEffect = ix; - QDomElement effect = effectAt(m_selectedEffect); - if (effect.isNull() == false) { - QDomNodeList params = effect.elementsByTagName("parameter"); - if (effect.attribute("disable") != "1") - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { - m_keyframes.clear(); - double max = e.attribute("max").toDouble(); - double min = e.attribute("min").toDouble(); - m_keyframeFactor = 100.0 / (max - min); - m_keyframeDefault = e.attribute("default").toDouble(); - m_selectedKeyframe = 0; - - // parse keyframes - const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts); - foreach(const QString &str, keyframes) { - int pos = str.section(':', 0, 0).toInt(); - double val = str.section(':', 1, 1).toDouble(); - m_keyframes[pos] = val; - } - if (m_keyframes.find(m_editedKeyframe) == m_keyframes.end()) m_editedKeyframe = -1; - update(); - return; - } - } - } - if (!m_keyframes.isEmpty()) { - m_keyframes.clear(); - update(); - } -} - -QString ClipItem::keyframes(const int index) -{ - QString result; - QDomElement effect = effectAt(index); - QDomNodeList params = effect.elementsByTagName("parameter"); - - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { - result = e.attribute("keyframes"); - break; - } - } - return result; -} - -void ClipItem::updateKeyframeEffect() -{ - // regenerate xml parameter from the clip keyframes - QDomElement effect = getEffectAt(m_selectedEffect); - if (effect.attribute("disable") == "1") return; - QDomNodeList params = effect.elementsByTagName("parameter"); - - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { - QString keyframes; - if (m_keyframes.count() > 0) { - QMap::const_iterator i = m_keyframes.constBegin(); - while (i != m_keyframes.constEnd()) { - keyframes.append(QString::number(i.key()) + ':' + QString::number(i.value()) + ';'); - ++i; - } - } - // Effect has a keyframe type parameter, we need to set the values - //kDebug() << "::::::::::::::: SETTING EFFECT KEYFRAMES: " << keyframes; - e.setAttribute("keyframes", keyframes); - break; - } - } -} - -QDomElement ClipItem::selectedEffect() -{ - if (m_selectedEffect == -1 || m_effectList.isEmpty()) return QDomElement(); - return effectAt(m_selectedEffect); -} - -void ClipItem::resetThumbs(bool clearExistingThumbs) -{ - if (clearExistingThumbs) { - m_startPix = QPixmap(); - m_endPix = QPixmap(); - m_audioThumbCachePic.clear(); - } - slotFetchThumbs(); -} - - -void ClipItem::refreshClip(bool checkDuration) -{ - if (checkDuration && (m_maxDuration != m_clip->maxDuration())) { - m_maxDuration = m_clip->maxDuration(); - if (m_clipType != IMAGE && m_clipType != TEXT && m_clipType != COLOR) { - if (m_maxDuration != GenTime() && m_info.cropStart + m_info.cropDuration > m_maxDuration) { - // Clip duration changed, make sure to stay in correct range - if (m_info.cropStart > m_maxDuration) { - m_info.cropStart = GenTime(); - m_info.cropDuration = qMin(m_info.cropDuration, m_maxDuration); - updateRectGeometry(); - } else { - m_info.cropDuration = m_maxDuration; - updateRectGeometry(); - } - } - } - } - if (m_clipType == COLOR) { - QString colour = m_clip->getProperty("colour"); - colour = colour.replace(0, 2, "#"); - m_baseColor = QColor(colour.left(7)); - } else resetThumbs(checkDuration); -} - -void ClipItem::slotFetchThumbs() -{ - if (scene() == NULL || m_clipType == AUDIO || m_clipType == COLOR) return; - if (m_clipType == IMAGE) { - if (m_startPix.isNull()) { - m_startPix = KThumb::getImage(KUrl(m_clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight()); - update(); - } - return; - } - - if (m_clipType == TEXT) { - if (m_startPix.isNull()) slotGetStartThumb(); - return; - } - - if (m_endPix.isNull() && m_startPix.isNull()) { - m_startThumbRequested = true; - m_endThumbRequested = true; - emit getThumb((int)m_speedIndependantInfo.cropStart.frames(m_fps), (int)(m_speedIndependantInfo.cropStart + m_speedIndependantInfo.cropDuration).frames(m_fps) - 1); - } else { - if (m_endPix.isNull()) { - slotGetEndThumb(); - } - if (m_startPix.isNull()) { - slotGetStartThumb(); - } - } -} - -void ClipItem::slotGetStartThumb() -{ - m_startThumbRequested = true; - emit getThumb((int)m_speedIndependantInfo.cropStart.frames(m_fps), -1); -} - -void ClipItem::slotGetEndThumb() -{ - m_endThumbRequested = true; - emit getThumb(-1, (int)(m_speedIndependantInfo.cropStart + m_speedIndependantInfo.cropDuration).frames(m_fps) - 1); -} - - -void ClipItem::slotSetStartThumb(QImage img) -{ - if (!img.isNull() && img.format() == QImage::Format_ARGB32) { - QPixmap pix = QPixmap::fromImage(img); - m_startPix = pix; - QRectF r = sceneBoundingRect(); - r.setRight(pix.width() + 2); - update(r); - } -} - -void ClipItem::slotSetEndThumb(QImage img) -{ - if (!img.isNull() && img.format() == QImage::Format_ARGB32) { - QPixmap pix = QPixmap::fromImage(img); - m_endPix = pix; - QRectF r = sceneBoundingRect(); - r.setLeft(r.right() - pix.width() - 2); - update(r); - } -} - -void ClipItem::slotThumbReady(int frame, QImage img) -{ - if (scene() == NULL) return; - QRectF r = boundingRect(); - QPixmap pix = QPixmap::fromImage(img); - double width = pix.width() / projectScene()->scale().x(); - if (m_startThumbRequested && frame == m_speedIndependantInfo.cropStart.frames(m_fps)) { - m_startPix = pix; - m_startThumbRequested = false; - update(r.left(), r.top(), width, pix.height()); - if (m_clipType == IMAGE || m_clipType == TEXT) { - update(r.right() - width, r.top(), width, pix.height()); - } - } else if (m_endThumbRequested && frame == (m_speedIndependantInfo.cropStart + m_speedIndependantInfo.cropDuration).frames(m_fps) - 1) { - m_endPix = pix; - m_endThumbRequested = false; - update(r.right() - width, r.top(), width, pix.height()); - } -} - -void ClipItem::slotSetStartThumb(const QPixmap pix) -{ - m_startPix = pix; -} - -void ClipItem::slotSetEndThumb(const QPixmap pix) -{ - m_endPix = pix; -} - -QPixmap ClipItem::startThumb() const -{ - return m_startPix; -} - -QPixmap ClipItem::endThumb() const -{ - return m_endPix; -} - -void ClipItem::slotGotAudioData() -{ - m_audioThumbReady = true; - if (m_clipType == AV && !isAudioOnly()) { - QRectF r = boundingRect(); - r.setTop(r.top() + r.height() / 2 - 1); - update(r); - } else update(); -} - -int ClipItem::type() const -{ - return AVWIDGET; -} - -DocClipBase *ClipItem::baseClip() const -{ - return m_clip; -} - -QDomElement ClipItem::xml() const -{ - QDomElement xml = m_clip->toXML(); - if (m_speed != 1.0) xml.setAttribute("speed", m_speed); - if (m_strobe > 1) xml.setAttribute("strobe", m_strobe); - if (m_audioOnly) xml.setAttribute("audio_only", 1); - else if (m_videoOnly) xml.setAttribute("video_only", 1); - return xml; -} - -int ClipItem::clipType() const -{ - return m_clipType; -} - -QString ClipItem::clipName() const -{ - return m_clipName; -} - -void ClipItem::setClipName(const QString &name) -{ - m_clipName = name; -} - -const QString ClipItem::clipProducer() const -{ - return m_producer; -} - -void ClipItem::flashClip() -{ - if (m_timeLine == 0) { - m_timeLine = new QTimeLine(750, this); - m_timeLine->setUpdateInterval(80); - m_timeLine->setCurveShape(QTimeLine::EaseInOutCurve); - m_timeLine->setFrameRange(0, 100); - connect(m_timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(animate(qreal))); - } - //m_timeLine->start(); -} - -void ClipItem::animate(qreal /*value*/) -{ - QRectF r = boundingRect(); - r.setHeight(20); - update(r); -} - -// virtual -void ClipItem::paint(QPainter *painter, - const QStyleOptionGraphicsItem *option, - QWidget *) -{ - QColor paintColor; - if (parentItem()) paintColor = QColor(255, 248, 149); - else paintColor = m_baseColor; - if (isSelected() || (parentItem() && parentItem()->isSelected())) paintColor = paintColor.darker(); - - painter->setMatrixEnabled(false); - const QRectF mapped = painter->matrix().mapRect(rect()).adjusted(0.5, 0, 0.5, 0); - const QRectF exposed = option->exposedRect; - painter->setClipRect(mapped); - painter->fillRect(mapped, paintColor); - - // draw thumbnails - if (KdenliveSettings::videothumbnails() && !isAudioOnly()) { - QPen pen = painter->pen(); - pen.setColor(QColor(255, 255, 255, 150)); - painter->setPen(pen); - if ((m_clipType == IMAGE || m_clipType == TEXT) && !m_startPix.isNull()) { - const QPointF top = mapped.topRight() - QPointF(m_startPix.width() - 1, 0); - painter->drawPixmap(top, m_startPix); - QLineF l2(top.x(), mapped.top(), top.x(), mapped.bottom()); - painter->drawLine(l2); - } else if (!m_endPix.isNull()) { - const QPointF top = mapped.topRight() - QPointF(m_endPix.width() - 1, 0); - painter->drawPixmap(top, m_endPix); - QLineF l2(top.x(), mapped.top(), top.x(), mapped.bottom()); - painter->drawLine(l2); - } - if (!m_startPix.isNull()) { - painter->drawPixmap(mapped.topLeft(), m_startPix); - QLineF l2(mapped.left() + m_startPix.width(), mapped.top(), mapped.left() + m_startPix.width(), mapped.bottom()); - painter->drawLine(l2); - } - painter->setPen(Qt::black); - } - - // draw audio thumbnails - if (KdenliveSettings::audiothumbnails() && m_speed == 1.0 && !isVideoOnly() && ((m_clipType == AV && (exposed.bottom() > (rect().height() / 2) || isAudioOnly())) || m_clipType == AUDIO) && m_audioThumbReady) { - - double startpixel = exposed.left(); - if (startpixel < 0) - startpixel = 0; - double endpixel = exposed.right(); - if (endpixel < 0) - endpixel = 0; - //kDebug()<<"/// REPAINTING AUDIO THMBS ZONE: "<matrix().m11(); - int channels = m_clip != NULL ? m_clip->getProperty("channels").toInt() : 0; - if (scale != m_framePixelWidth) - m_audioThumbCachePic.clear(); - double cropLeft = m_info.cropStart.frames(m_fps); - const int clipStart = mappedRect.x(); - const int mappedStartPixel = painter->matrix().map(QPointF(startpixel + cropLeft, 0)).x() - clipStart; - const int mappedEndPixel = painter->matrix().map(QPointF(endpixel + cropLeft, 0)).x() - clipStart; - cropLeft = cropLeft * scale; - - if (channels >= 1) { - emit prepareAudioThumb(scale, mappedStartPixel, mappedEndPixel, channels); - } - - for (int startCache = mappedStartPixel - (mappedStartPixel) % 100; startCache < mappedEndPixel; startCache += 100) { - if (m_audioThumbCachePic.contains(startCache) && !m_audioThumbCachePic[startCache].isNull()) - painter->drawPixmap(clipStart + startCache - cropLeft, mappedRect.y(), m_audioThumbCachePic[startCache]); - } - } - - // Draw effects names - if (!m_effectNames.isEmpty() && mapped.width() > 40) { - QRectF txtBounding = painter->boundingRect(mapped, Qt::AlignLeft | Qt::AlignTop, m_effectNames); - QColor bgColor; - if (m_timeLine && m_timeLine->state() == QTimeLine::Running) { - qreal value = m_timeLine->currentValue(); - txtBounding.setWidth(txtBounding.width() * value); - bgColor.setRgb(50 + 200 *(1.0 - value), 50, 50, 100 + 50 * value); - } else bgColor.setRgb(50, 50, 90, 180); - - QPainterPath rounded; - rounded.moveTo(txtBounding.bottomRight()); - rounded.arcTo(txtBounding.right() - txtBounding.height() - 2, txtBounding.top() - txtBounding.height(), txtBounding.height() * 2, txtBounding.height() * 2, 270, 90); - rounded.lineTo(txtBounding.topLeft()); - rounded.lineTo(txtBounding.bottomLeft()); - painter->fillPath(rounded, bgColor); - painter->setPen(Qt::lightGray); - painter->drawText(txtBounding.adjusted(1, 0, 1, 0), Qt::AlignCenter, m_effectNames); - } - - // Draw clip name - QColor frameColor(paintColor.darker()); - if (isSelected() || (parentItem() && parentItem()->isSelected())) { - frameColor = QColor(Qt::red); - } - frameColor.setAlpha(160); - - const QRectF txtBounding2 = painter->boundingRect(mapped, Qt::AlignHCenter | Qt::AlignVCenter, ' ' + m_clipName + ' '); - //painter->fillRect(txtBounding2, frameColor); - painter->setBrush(frameColor); - painter->setPen(Qt::NoPen); - painter->drawRoundedRect(txtBounding2, 3, 3); - painter->setBrush(QBrush(Qt::NoBrush)); - - //painter->setPen(QColor(0, 0, 0, 180)); - //painter->drawText(txtBounding, Qt::AlignCenter, m_clipName); - if (m_videoOnly) { - painter->drawPixmap(txtBounding2.topLeft() - QPointF(17, -1), m_videoPix); - } else if (m_audioOnly) { - painter->drawPixmap(txtBounding2.topLeft() - QPointF(17, -1), m_audioPix); - } - painter->setPen(Qt::white); - painter->drawText(txtBounding2, Qt::AlignCenter, m_clipName); - - - // draw markers - if (isEnabled() && m_clip) { - QList < CommentedTime > markers = m_clip->commentedSnapMarkers(); - QList < CommentedTime >::Iterator it = markers.begin(); - GenTime pos; - double framepos; - QBrush markerBrush(QColor(120, 120, 0, 140)); - QPen pen = painter->pen(); - pen.setColor(QColor(255, 255, 255, 200)); - pen.setStyle(Qt::DotLine); - - for (; it != markers.end(); ++it) { - pos = GenTime((int)((*it).time().frames(m_fps) / m_speed + 0.5), m_fps) - cropStart(); - if (pos > GenTime()) { - if (pos > cropDuration()) break; - QLineF l(rect().x() + pos.frames(m_fps), rect().y(), rect().x() + pos.frames(m_fps), rect().bottom()); - QLineF l2 = painter->matrix().map(l); - painter->setPen(pen); - painter->drawLine(l2); - if (KdenliveSettings::showmarkers()) { - framepos = rect().x() + pos.frames(m_fps); - const QRectF r1(framepos + 0.04, 10, rect().width() - framepos - 2, rect().height() - 10); - const QRectF r2 = painter->matrix().mapRect(r1); - const QRectF txtBounding3 = painter->boundingRect(r2, Qt::AlignLeft | Qt::AlignTop, ' ' + (*it).comment() + ' '); - painter->setBrush(markerBrush); - painter->setPen(Qt::NoPen); - painter->drawRoundedRect(txtBounding3, 3, 3); - painter->setBrush(QBrush(Qt::NoBrush)); - painter->setPen(Qt::white); - painter->drawText(txtBounding3, Qt::AlignCenter, (*it).comment()); - } - //painter->fillRect(QRect(br.x() + framepos, br.y(), 10, br.height()), QBrush(QColor(0, 0, 0, 150))); - } - } - } - - // draw start / end fades - QBrush fades; - if (isSelected()) { - fades = QBrush(QColor(200, 50, 50, 150)); - } else fades = QBrush(QColor(200, 200, 200, 200)); - - if (m_startFade != 0) { - QPainterPath fadeInPath; - fadeInPath.moveTo(0, 0); - fadeInPath.lineTo(0, rect().height()); - fadeInPath.lineTo(m_startFade, 0); - fadeInPath.closeSubpath(); - QPainterPath f1 = painter->matrix().map(fadeInPath); - painter->fillPath(f1/*.intersected(resultClipPath)*/, fades); - /*if (isSelected()) { - QLineF l(m_startFade * scale, 0, 0, itemHeight); - painter->drawLine(l); - }*/ - } - if (m_endFade != 0) { - QPainterPath fadeOutPath; - fadeOutPath.moveTo(rect().width(), 0); - fadeOutPath.lineTo(rect().width(), rect().height()); - fadeOutPath.lineTo(rect().width() - m_endFade, 0); - fadeOutPath.closeSubpath(); - QPainterPath f1 = painter->matrix().map(fadeOutPath); - painter->fillPath(f1/*.intersected(resultClipPath)*/, fades); - /*if (isSelected()) { - QLineF l(itemWidth - m_endFade * scale, 0, itemWidth, itemHeight); - painter->drawLine(l); - }*/ - } - - - painter->setPen(QPen(Qt::lightGray)); - // draw effect or transition keyframes - if (mapped.width() > 20) drawKeyFrames(painter, exposed); - - //painter->setMatrixEnabled(true); - - // draw clip border - // expand clip rect to allow correct painting of clip border - QPen pen1(frameColor); - painter->setPen(pen1); - painter->setClipping(false); - painter->drawRect(painter->matrix().mapRect(rect())); -} - - -OPERATIONTYPE ClipItem::operationMode(QPointF pos) -{ - if (isItemLocked()) return NONE; - const double scale = projectScene()->scale().x(); - double maximumOffset = 6 / scale; - if (isSelected() || (parentItem() && parentItem()->isSelected())) { - int kf = mouseOverKeyFrames(pos, maximumOffset); - if (kf != -1) { - m_editedKeyframe = kf; - return KEYFRAME; - } - } - QRectF rect = sceneBoundingRect(); - int addtransitionOffset = 10; - // Don't allow add transition if track height is very small - if (rect.height() < 30) addtransitionOffset = 0; - - if (qAbs((int)(pos.x() - (rect.x() + m_startFade))) < maximumOffset && qAbs((int)(pos.y() - rect.y())) < 6) { - if (m_startFade == 0) setToolTip(i18n("Add audio fade")); - // xgettext:no-c-format - else setToolTip(i18n("Audio fade duration: %1s", GenTime(m_startFade, m_fps).seconds())); - return FADEIN; - } else if (pos.x() - rect.x() < maximumOffset && (rect.bottom() - pos.y() > addtransitionOffset)) { - // xgettext:no-c-format - setToolTip(i18n("Crop from start: %1s", cropStart().seconds())); - return RESIZESTART; - } else if (qAbs((int)(pos.x() - (rect.x() + rect.width() - m_endFade))) < maximumOffset && qAbs((int)(pos.y() - rect.y())) < 6) { - if (m_endFade == 0) setToolTip(i18n("Add audio fade")); - // xgettext:no-c-format - else setToolTip(i18n("Audio fade duration: %1s", GenTime(m_endFade, m_fps).seconds())); - return FADEOUT; - } else if ((rect.right() - pos.x() < maximumOffset) && (rect.bottom() - pos.y() > addtransitionOffset)) { - // xgettext:no-c-format - setToolTip(i18n("Clip duration: %1s", cropDuration().seconds())); - return RESIZEEND; - } else if ((pos.x() - rect.x() < 16 / scale) && (rect.bottom() - pos.y() <= addtransitionOffset)) { - setToolTip(i18n("Add transition")); - return TRANSITIONSTART; - } else if ((rect.right() - pos.x() < 16 / scale) && (rect.bottom() - pos.y() <= addtransitionOffset)) { - setToolTip(i18n("Add transition")); - return TRANSITIONEND; - } - setToolTip(QString()); - return MOVE; -} - -QList ClipItem::snapMarkers() const -{ - QList < GenTime > snaps; - QList < GenTime > markers = baseClip()->snapMarkers(); - GenTime pos; - - for (int i = 0; i < markers.size(); i++) { - - pos = GenTime((int)(markers.at(i).frames(m_fps) / m_speed + 0.5), m_fps) - cropStart(); - if (pos > GenTime()) { - if (pos > cropDuration()) break; - else snaps.append(pos + startPos()); - } - } - return snaps; -} - -QList ClipItem::commentedSnapMarkers() const -{ - QList < CommentedTime > snaps; - QList < CommentedTime > markers = baseClip()->commentedSnapMarkers(); - GenTime pos; - - for (int i = 0; i < markers.size(); i++) { - pos = GenTime((int)(markers.at(i).time().frames(m_fps) / m_speed + 0.5), m_fps) - cropStart(); - if (pos > GenTime()) { - if (pos > cropDuration()) break; - else snaps.append(CommentedTime(pos + startPos(), markers.at(i).comment())); - } - } - return snaps; -} - -void ClipItem::slotPrepareAudioThumb(double pixelForOneFrame, int startpixel, int endpixel, int channels) -{ - QRectF re = sceneBoundingRect(); - if (m_clipType == AV && !isAudioOnly()) re.setTop(re.y() + re.height() / 2); - - //kDebug() << "// PREP AUDIO THMB FRMO : scale:" << pixelForOneFrame<< ", from: " << startpixel << ", to: " << endpixel; - //if ( (!audioThumbWasDrawn || framePixelWidth!=pixelForOneFrame ) && !baseClip()->audioFrameChache.isEmpty()){ - - for (int startCache = startpixel - startpixel % 100; startCache < endpixel; startCache += 100) { - //kDebug() << "creating " << startCache; - //if (framePixelWidth!=pixelForOneFrame || - if (m_framePixelWidth == pixelForOneFrame && m_audioThumbCachePic.contains(startCache)) - continue; - if (m_audioThumbCachePic[startCache].isNull() || m_framePixelWidth != pixelForOneFrame) { - m_audioThumbCachePic[startCache] = QPixmap(100, (int)(re.height())); - m_audioThumbCachePic[startCache].fill(QColor(180, 180, 200, 140)); - } - bool fullAreaDraw = pixelForOneFrame < 10; - QMap positiveChannelPaths; - QMap negativeChannelPaths; - QPainter pixpainter(&m_audioThumbCachePic[startCache]); - QPen audiopen; - audiopen.setWidth(0); - pixpainter.setPen(audiopen); - //pixpainter.setRenderHint(QPainter::Antialiasing,true); - //pixpainter.drawLine(0,0,100,re.height()); - // Bail out, if caller provided invalid data - if (channels <= 0) { - kWarning() << "Unable to draw image with " << channels << "number of channels"; - return; - } - - int channelHeight = m_audioThumbCachePic[startCache].height() / channels; - - for (int i = 0; i < channels; i++) { - - positiveChannelPaths[i].moveTo(0, channelHeight*i + channelHeight / 2); - negativeChannelPaths[i].moveTo(0, channelHeight*i + channelHeight / 2); - } - - for (int samples = 0; samples <= 100; samples++) { - double frame = (double)(samples + startCache - 0) / pixelForOneFrame; - int sample = (int)((frame - (int)(frame)) * 20); // AUDIO_FRAME_SIZE - if (frame < 0 || sample < 0 || sample > 19) - continue; - QMap frame_channel_data = baseClip()->m_audioFrameCache[(int)frame]; - - for (int channel = 0; channel < channels && frame_channel_data[channel].size() > 0; channel++) { - - int y = channelHeight * channel + channelHeight / 2; - int delta = (int)(frame_channel_data[channel][sample] - 127 / 2) * channelHeight / 64; - if (fullAreaDraw) { - positiveChannelPaths[channel].lineTo(samples, 0.1 + y + qAbs(delta)); - negativeChannelPaths[channel].lineTo(samples, 0.1 + y - qAbs(delta)); - } else { - positiveChannelPaths[channel].lineTo(samples, 0.1 + y + delta); - negativeChannelPaths[channel].lineTo(samples, 0.1 + y - delta); - } - } - for (int channel = 0; channel < channels ; channel++) - if (fullAreaDraw && samples == 100) { - positiveChannelPaths[channel].lineTo(samples, channelHeight*channel + channelHeight / 2); - negativeChannelPaths[channel].lineTo(samples, channelHeight*channel + channelHeight / 2); - positiveChannelPaths[channel].lineTo(0, channelHeight*channel + channelHeight / 2); - negativeChannelPaths[channel].lineTo(0, channelHeight*channel + channelHeight / 2); - } - - } - pixpainter.setPen(QPen(QColor(0, 0, 0))); - pixpainter.setBrush(QBrush(QColor(60, 60, 60))); - - for (int i = 0; i < channels; i++) { - if (fullAreaDraw) { - //pixpainter.fillPath(positiveChannelPaths[i].united(negativeChannelPaths[i]),QBrush(Qt::SolidPattern));//or singleif looks better - pixpainter.drawPath(positiveChannelPaths[i].united(negativeChannelPaths[i]));//or singleif looks better - } else - pixpainter.drawPath(positiveChannelPaths[i]); - } - } - //audioThumbWasDrawn=true; - m_framePixelWidth = pixelForOneFrame; - - //} -} - -int ClipItem::fadeIn() const -{ - return m_startFade; -} - -int ClipItem::fadeOut() const -{ - return m_endFade; -} - - -void ClipItem::setFadeIn(int pos) -{ - if (pos == m_startFade) return; - int oldIn = m_startFade; - if (pos < 0) pos = 0; - if (pos > cropDuration().frames(m_fps)) pos = (int)(cropDuration().frames(m_fps)); - m_startFade = pos; - QRectF rect = boundingRect(); - update(rect.x(), rect.y(), qMax(oldIn, pos), rect.height()); -} - -void ClipItem::setFadeOut(int pos) -{ - if (pos == m_endFade) return; - int oldOut = m_endFade; - if (pos < 0) pos = 0; - if (pos > cropDuration().frames(m_fps)) pos = (int)(cropDuration().frames(m_fps)); - m_endFade = pos; - QRectF rect = boundingRect(); - update(rect.x() + rect.width() - qMax(oldOut, pos), rect.y(), qMax(oldOut, pos), rect.height()); - -} - -/* -//virtual -void ClipItem::hoverEnterEvent(QGraphicsSceneHoverEvent *e) -{ - //if (e->pos().x() < 20) m_hover = true; - return; - if (isItemLocked()) return; - m_hover = true; - QRectF r = boundingRect(); - double width = 35 / projectScene()->scale().x(); - double height = r.height() / 2; - //WARNING: seems like it generates a full repaint of the clip, maybe not so good... - update(r.x(), r.y() + height, width, height); - update(r.right() - width, r.y() + height, width, height); -} - -//virtual -void ClipItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *) -{ - if (isItemLocked()) return; - m_hover = false; - QRectF r = boundingRect(); - double width = 35 / projectScene()->scale().x(); - double height = r.height() / 2; - //WARNING: seems like it generates a full repaint of the clip, maybe not so good... - update(r.x(), r.y() + height, width, height); - update(r.right() - width, r.y() + height, width, height); -} -*/ - -void ClipItem::resizeStart(int posx) -{ - const int min = (startPos() - cropStart()).frames(m_fps); - if (posx < min) posx = min; - if (posx == startPos().frames(m_fps)) return; - const int previous = cropStart().frames(m_fps); - AbstractClipItem::resizeStart(posx); - - // set speed independant info - m_speedIndependantInfo = m_info; - m_speedIndependantInfo.cropStart = GenTime((int)(m_info.cropStart.frames(m_fps) * m_speed), m_fps); - m_speedIndependantInfo.cropDuration = GenTime((int)(m_info.cropDuration.frames(m_fps) * m_speed), m_fps); - - if ((int) cropStart().frames(m_fps) != previous) { - if (m_hasThumbs && KdenliveSettings::videothumbnails()) { - m_startThumbTimer.start(150); - } - } -} - -void ClipItem::resizeEnd(int posx) -{ - const int max = (startPos() - cropStart() + maxDuration()).frames(m_fps); - if (posx > max && maxDuration() != GenTime()) posx = max; - if (posx == endPos().frames(m_fps)) return; - //kDebug() << "// NEW POS: " << posx << ", OLD END: " << endPos().frames(m_fps); - const int previous = cropDuration().frames(m_fps); - AbstractClipItem::resizeEnd(posx); - - // set speed independant info - m_speedIndependantInfo = m_info; - m_speedIndependantInfo.cropStart = GenTime((int)(m_info.cropStart.frames(m_fps) * m_speed), m_fps); - m_speedIndependantInfo.cropDuration = GenTime((int)(m_info.cropDuration.frames(m_fps) * m_speed), m_fps); - - if ((int) cropDuration().frames(m_fps) != previous) { - if (m_hasThumbs && KdenliveSettings::videothumbnails()) { - m_endThumbTimer.start(150); - } - } -} - - -bool ClipItem::checkEffectsKeyframesPos(const int previous, const int current, bool fromStart) -{ - bool modified = false; - for (int i = 0; i < m_effectList.count(); i++) { - QDomElement effect = m_effectList.at(i); - QDomNodeList params = effect.elementsByTagName("parameter"); - for (int j = 0; j < params.count(); j++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { - // parse keyframes and adjust values - const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts); - QMap kfr; - int pos; - double val; - foreach(const QString &str, keyframes) { - pos = str.section(':', 0, 0).toInt(); - val = str.section(':', 1, 1).toDouble(); - if (pos == previous) { - kfr[current] = val; - modified = true; - } else { - if ((fromStart && pos >= current) || (!fromStart && pos <= current)) { - kfr[pos] = val; - modified = true; - } - } - } - if (modified) { - QString newkfr; - QMap::const_iterator k = kfr.constBegin(); - while (k != kfr.constEnd()) { - newkfr.append(QString::number(k.key()) + ':' + QString::number(k.value()) + ';'); - ++k; - } - e.setAttribute("keyframes", newkfr); - break; - } - } - } - } - if (modified && m_selectedEffect >= 0) setSelectedEffect(m_selectedEffect); - return modified; -} - -//virtual -QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) -{ - if (change == QGraphicsItem::ItemSelectedChange) { - if (value.toBool()) setZValue(10); - else setZValue(2); - } - if (change == ItemPositionChange && scene()) { - // calculate new position. - //if (parentItem()) return pos(); - QPointF newPos = value.toPointF(); - //kDebug() << "/// MOVING CLIP ITEM.------------\n++++++++++"; - int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints()); - xpos = qMax(xpos, 0); - newPos.setX(xpos); - int newTrack = newPos.y() / KdenliveSettings::trackheight(); - newTrack = qMin(newTrack, projectScene()->tracksCount() - 1); - newTrack = qMax(newTrack, 0); - newPos.setY((int)(newTrack * KdenliveSettings::trackheight() + 1)); - // Only one clip is moving - QRectF sceneShape = rect(); - sceneShape.translate(newPos); - QList items; - if (projectScene()->editMode() == NORMALEDIT) - items = scene()->items(sceneShape, Qt::IntersectsItemShape); - items.removeAll(this); - bool forwardMove = newPos.x() > pos().x(); - int offset = 0; - if (!items.isEmpty()) { - for (int i = 0; i < items.count(); i++) { - if (!items.at(i)->isEnabled()) continue; - if (items.at(i)->type() == type()) { - // Collision! - QPointF otherPos = items.at(i)->pos(); - if ((int) otherPos.y() != (int) pos().y()) { - return pos(); - } - if (forwardMove) { - offset = qMax(offset, (int)(newPos.x() - (static_cast < AbstractClipItem* >(items.at(i))->startPos() - cropDuration()).frames(m_fps))); - } else { - offset = qMax(offset, (int)((static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps)) - newPos.x())); - } - - if (offset > 0) { - if (forwardMove) { - sceneShape.translate(QPointF(-offset, 0)); - newPos.setX(newPos.x() - offset); - } else { - sceneShape.translate(QPointF(offset, 0)); - newPos.setX(newPos.x() + offset); - } - QList subitems = scene()->items(sceneShape, Qt::IntersectsItemShape); - subitems.removeAll(this); - for (int j = 0; j < subitems.count(); j++) { - if (!subitems.at(j)->isEnabled()) continue; - if (subitems.at(j)->type() == type()) { - // move was not successful, revert to previous pos - m_info.startPos = GenTime((int) pos().x(), m_fps); - return pos(); - } - } - } - - m_info.track = newTrack; - m_info.startPos = GenTime((int) newPos.x(), m_fps); - - return newPos; - } - } - } - m_info.track = newTrack; - m_info.startPos = GenTime((int) newPos.x(), m_fps); - //kDebug()<<"// ITEM NEW POS: "< m_effectList.count() - 1 || ix < 0 || m_effectList.at(ix).isNull()) return QDomElement(); - return m_effectList.at(ix).cloneNode().toElement(); -} - -QDomElement ClipItem::getEffectAt(int ix) const -{ - if (ix > m_effectList.count() - 1 || ix < 0 || m_effectList.at(ix).isNull()) return QDomElement(); - return m_effectList.at(ix); -} - -void ClipItem::setEffectAt(int ix, QDomElement effect) -{ - if (ix < 0 || ix > (m_effectList.count() - 1) || effect.isNull()) { - kDebug() << "Invalid effect index: " << ix; - return; - } - //kDebug() << "CHange EFFECT AT: " << ix << ", CURR: " << m_effectList.at(ix).attribute("tag") << ", NEW: " << effect.attribute("tag"); - effect.setAttribute("kdenlive_ix", ix + 1); - m_effectList.replace(ix, effect); - m_effectNames = m_effectList.effectNames().join(" / "); - QString id = effect.attribute("id"); - if (id == "fadein" || id == "fadeout" || id == "fade_from_black" || id == "fade_to_black") - update(); - else { - QRectF r = boundingRect(); - r.setHeight(20); - update(r); - } -} - -EffectsParameterList ClipItem::addEffect(const QDomElement effect, bool /*animate*/) -{ - bool needRepaint = false; - int ix; - if (!effect.hasAttribute("kdenlive_ix")) { - ix = effectsCounter(); - } else ix = effect.attribute("kdenlive_ix").toInt(); - if (!m_effectList.isEmpty() && ix <= m_effectList.count()) { - needRepaint = true; - m_effectList.insert(ix - 1, effect); - for (int i = ix; i < m_effectList.count(); i++) { - int index = m_effectList.item(i).attribute("kdenlive_ix").toInt(); - if (index >= ix) m_effectList.item(i).setAttribute("kdenlive_ix", index + 1); - } - } else m_effectList.append(effect); - EffectsParameterList parameters; - parameters.addParam("tag", effect.attribute("tag")); - parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix")); - if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src")); - if (effect.hasAttribute("disable")) parameters.addParam("disable", effect.attribute("disable")); - - - QString effectId = effect.attribute("id"); - if (effectId.isEmpty()) effectId = effect.attribute("tag"); - parameters.addParam("id", effectId); - - QDomNodeList params = effect.elementsByTagName("parameter"); - int fade = 0; - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull()) { - if (e.attribute("type") == "simplekeyframe") { - QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts); - double factor = e.attribute("factor", "1").toDouble(); - if (factor != 1) { - for (int j = 0; j < values.count(); j++) { - QString pos = values.at(j).section(":", 0, 0); - double val = values.at(j).section(":", 1, 1).toDouble() / factor; - values[j] = pos + "=" + QString::number(val); - } - } - parameters.addParam(e.attribute("name"), values.join(";")); - /*parameters.addParam("max", e.attribute("max")); - parameters.addParam("min", e.attribute("min")); - parameters.addParam("factor", );*/ - } else if (e.attribute("type") == "keyframe") { - parameters.addParam("keyframes", e.attribute("keyframes")); - parameters.addParam("max", e.attribute("max")); - parameters.addParam("min", e.attribute("min")); - parameters.addParam("factor", e.attribute("factor", "1")); - parameters.addParam("starttag", e.attribute("starttag", "start")); - parameters.addParam("endtag", e.attribute("endtag", "end")); - } else if (e.attribute("factor", "1") == "1") { - parameters.addParam(e.attribute("name"), e.attribute("value")); - - // check if it is a fade effect - if (effectId == "fadein") { - needRepaint = true; - if (m_effectList.hasEffect(QString(), "fade_from_black") == -1) { - if (e.attribute("name") == "out") fade += e.attribute("value").toInt(); - else if (e.attribute("name") == "in") fade -= e.attribute("value").toInt(); - } else { - QDomElement fadein = m_effectList.getEffectByTag(QString(), "fade_from_black"); - if (fadein.attribute("name") == "out") fade += fadein.attribute("value").toInt(); - else if (fadein.attribute("name") == "in") fade -= fadein.attribute("value").toInt(); - } - } else if (effectId == "fade_from_black") { - needRepaint = true; - if (m_effectList.hasEffect(QString(), "fadein") == -1) { - if (e.attribute("name") == "out") fade += e.attribute("value").toInt(); - else if (e.attribute("name") == "in") fade -= e.attribute("value").toInt(); - } else { - QDomElement fadein = m_effectList.getEffectByTag(QString(), "fadein"); - if (fadein.attribute("name") == "out") fade += fadein.attribute("value").toInt(); - else if (fadein.attribute("name") == "in") fade -= fadein.attribute("value").toInt(); - } - } else if (effectId == "fadeout") { - needRepaint = true; - if (m_effectList.hasEffect(QString(), "fade_to_black") == -1) { - if (e.attribute("name") == "out") fade -= e.attribute("value").toInt(); - else if (e.attribute("name") == "in") fade += e.attribute("value").toInt(); - } else { - QDomElement fadeout = m_effectList.getEffectByTag(QString(), "fade_to_black"); - if (fadeout.attribute("name") == "out") fade -= fadeout.attribute("value").toInt(); - else if (fadeout.attribute("name") == "in") fade += fadeout.attribute("value").toInt(); - } - } else if (effectId == "fade_to_black") { - needRepaint = true; - if (m_effectList.hasEffect(QString(), "fadeout") == -1) { - if (e.attribute("name") == "out") fade -= e.attribute("value").toInt(); - else if (e.attribute("name") == "in") fade += e.attribute("value").toInt(); - } else { - QDomElement fadeout = m_effectList.getEffectByTag(QString(), "fadeout"); - if (fadeout.attribute("name") == "out") fade -= fadeout.attribute("value").toInt(); - else if (fadeout.attribute("name") == "in") fade += fadeout.attribute("value").toInt(); - } - } - } else { - double fact; - if (e.attribute("factor").startsWith('%')) { - fact = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("factor")); - } else fact = e.attribute("factor", "1").toDouble(); - parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact)); - } - } - } - m_effectNames = m_effectList.effectNames().join(" / "); - if (fade > 0) m_startFade = fade; - else if (fade < 0) m_endFade = -fade; - - if (m_selectedEffect == -1) { - setSelectedEffect(0); - } else if (m_selectedEffect == ix - 1) setSelectedEffect(m_selectedEffect); - if (needRepaint) update(boundingRect()); - /*if (animate) { - flashClip(); - } */ - else { /*if (!needRepaint) */ - QRectF r = boundingRect(); - r.setHeight(20); - update(r); - } - return parameters; -} - -EffectsParameterList ClipItem::getEffectArgs(const QDomElement effect) -{ - EffectsParameterList parameters; - parameters.addParam("tag", effect.attribute("tag")); - parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix")); - parameters.addParam("id", effect.attribute("id")); - if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src")); - if (effect.hasAttribute("disable")) parameters.addParam("disable", effect.attribute("disable")); - - QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - //kDebug() << "/ / / /SENDING EFFECT PARAM: " << e.attribute("type") << ", NAME_ " << e.attribute("tag"); - if (e.attribute("type") == "simplekeyframe") { - - QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts); - double factor = e.attribute("factor", "1").toDouble(); - for (int j = 0; j < values.count(); j++) { - QString pos = values.at(j).section(":", 0, 0); - double val = values.at(j).section(":", 1, 1).toDouble() / factor; - values[j] = pos + "=" + QString::number(val); - } - // kDebug() << "/ / / /SENDING KEYFR:" << values; - parameters.addParam(e.attribute("name"), values.join(";")); - /*parameters.addParam(e.attribute("name"), e.attribute("keyframes").replace(":", "=")); - parameters.addParam("max", e.attribute("max")); - parameters.addParam("min", e.attribute("min")); - parameters.addParam("factor", e.attribute("factor", "1"));*/ - } else if (e.attribute("type") == "keyframe") { - kDebug() << "/ / / /SENDING KEYFR EFFECT TYPE"; - parameters.addParam("keyframes", e.attribute("keyframes")); - parameters.addParam("max", e.attribute("max")); - parameters.addParam("min", e.attribute("min")); - parameters.addParam("factor", e.attribute("factor", "1")); - parameters.addParam("starttag", e.attribute("starttag", "start")); - parameters.addParam("endtag", e.attribute("endtag", "end")); - } else if (e.attribute("namedesc").contains(';')) { - QString format = e.attribute("format"); - QStringList separators = format.split("%d", QString::SkipEmptyParts); - QStringList values = e.attribute("value").split(QRegExp("[,:;x]")); - QString neu; - QTextStream txtNeu(&neu); - if (values.size() > 0) - txtNeu << (int)values[0].toDouble(); - for (int i = 0; i < separators.size() && i + 1 < values.size(); i++) { - txtNeu << separators[i]; - txtNeu << (int)(values[i+1].toDouble()); - } - parameters.addParam("start", neu); - } else { - if (e.attribute("factor", "1") != "1") { - double fact; - if (e.attribute("factor").startsWith('%')) { - fact = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("factor")); - } else fact = e.attribute("factor", "1").toDouble(); - parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact)); - } else { - parameters.addParam(e.attribute("name"), e.attribute("value")); - } - } - } - return parameters; -} - -void ClipItem::deleteEffect(QString index) -{ - bool needRepaint = false; - QString ix; - - for (int i = 0; i < m_effectList.count(); ++i) { - ix = m_effectList.at(i).attribute("kdenlive_ix"); - if (ix == index) { - QString effectId = m_effectList.at(i).attribute("id"); - if ((effectId == "fadein" && hasEffect(QString(), "fade_from_black") == -1) || - (effectId == "fade_from_black" && hasEffect(QString(), "fadein") == -1)) { - m_startFade = 0; - needRepaint = true; - } else if ((effectId == "fadeout" && hasEffect(QString(), "fade_to_black") == -1) || - (effectId == "fade_to_black" && hasEffect(QString(), "fadeout") == -1)) { - m_endFade = 0; - needRepaint = true; - } else if (EffectsList::hasKeyFrames(m_effectList.at(i))) needRepaint = true; - m_effectList.removeAt(i); - i--; - } else if (ix.toInt() > index.toInt()) { - m_effectList.item(i).setAttribute("kdenlive_ix", ix.toInt() - 1); - } - } - m_effectNames = m_effectList.effectNames().join(" / "); - - if (m_effectList.isEmpty() || m_selectedEffect + 1 == index.toInt()) { - // Current effect was removed - if (index.toInt() > m_effectList.count() - 1) { - setSelectedEffect(m_effectList.count() - 1); - } else setSelectedEffect(index.toInt()); - } - if (needRepaint) update(boundingRect()); - else { - QRectF r = boundingRect(); - r.setHeight(20); - update(r); - } - //if (!m_effectList.isEmpty()) flashClip(); -} - -double ClipItem::speed() const -{ - return m_speed; -} - -int ClipItem::strobe() const -{ - return m_strobe; -} - -void ClipItem::setSpeed(const double speed, const int strobe) -{ - m_speed = speed; - m_strobe = strobe; - if (m_speed == 1.0) m_clipName = baseClip()->name(); - else m_clipName = baseClip()->name() + " - " + QString::number(speed * 100, 'f', 0) + '%'; - m_info.cropStart = GenTime((int)(m_speedIndependantInfo.cropStart.frames(m_fps) / m_speed + 0.5), m_fps); - m_info.cropDuration = GenTime((int)(m_speedIndependantInfo.cropDuration.frames(m_fps) / m_speed + 0.5), m_fps); - //update(); -} - -GenTime ClipItem::maxDuration() const -{ - return GenTime((int)(m_maxDuration.frames(m_fps) / m_speed + 0.5), m_fps); -} - -GenTime ClipItem::speedIndependantCropStart() const -{ - return m_speedIndependantInfo.cropStart; -} - -GenTime ClipItem::speedIndependantCropDuration() const -{ - return m_speedIndependantInfo.cropDuration; -} - - -const ItemInfo ClipItem::speedIndependantInfo() const -{ - return m_speedIndependantInfo; -} - -//virtual -void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event) -{ - const QString effects = QString(event->mimeData()->data("kdenlive/effectslist")); - QDomDocument doc; - doc.setContent(effects, true); - const QDomElement e = doc.documentElement(); - if (scene() && !scene()->views().isEmpty()) { - event->accept(); - CustomTrackView *view = (CustomTrackView *) scene()->views()[0]; - if (view) view->slotAddEffect(e, m_info.startPos, track()); - } -} - -//virtual -void ClipItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event) -{ - if (isItemLocked()) event->setAccepted(false); - else event->setAccepted(event->mimeData()->hasFormat("kdenlive/effectslist")); -} - -void ClipItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event) -{ - Q_UNUSED(event); -} - -void ClipItem::addTransition(Transition* t) -{ - m_transitionsList.append(t); - //CustomTrackView *view = (CustomTrackView *) scene()->views()[0]; - QDomDocument doc; - QDomElement e = doc.documentElement(); - //if (view) view->slotAddTransition(this, t->toXML() , t->startPos(), track()); -} - -void ClipItem::setVideoOnly(bool force) -{ - m_videoOnly = force; -} - -void ClipItem::setAudioOnly(bool force) -{ - m_audioOnly = force; - if (m_audioOnly) m_baseColor = QColor(141, 215, 166); - else { - if (m_clipType == COLOR) { - QString colour = m_clip->getProperty("colour"); - colour = colour.replace(0, 2, "#"); - m_baseColor = QColor(colour.left(7)); - } else if (m_clipType == AUDIO) m_baseColor = QColor(141, 215, 166); - else m_baseColor = QColor(141, 166, 215); - } - m_audioThumbCachePic.clear(); -} - -bool ClipItem::isAudioOnly() const -{ - return m_audioOnly; -} - -bool ClipItem::isVideoOnly() const -{ - return m_videoOnly; -} - -void ClipItem::insertKeyframe(QDomElement effect, int pos, int val) -{ - if (effect.attribute("disable") == "1") return; - effect.setAttribute("active_keyframe", pos); - m_editedKeyframe = pos; - QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - QString kfr = e.attribute("keyframes"); - const QStringList keyframes = kfr.split(';', QString::SkipEmptyParts); - QStringList newkfr; - bool added = false; - foreach(const QString &str, keyframes) { - int kpos = str.section(':', 0, 0).toInt(); - double newval = str.section(':', 1, 1).toDouble(); - if (kpos < pos) { - newkfr.append(str); - } else if (!added) { - if (i == 0) newkfr.append(QString::number(pos) + ":" + QString::number(val)); - else newkfr.append(QString::number(pos) + ":" + QString::number(newval)); - if (kpos > pos) newkfr.append(str); - added = true; - } else newkfr.append(str); - } - if (!added) newkfr.append(QString::number(pos) + ":" + QString::number(val)); - e.setAttribute("keyframes", newkfr.join(";")); - } -} - -void ClipItem::movedKeyframe(QDomElement effect, int oldpos, int newpos, double value) -{ - if (effect.attribute("disable") == "1") return; - effect.setAttribute("active_keyframe", newpos); - QDomNodeList params = effect.elementsByTagName("parameter"); - int start = cropStart().frames(m_fps); - int end = (cropStart() + cropDuration()).frames(m_fps) - 1; - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - QString kfr = e.attribute("keyframes"); - const QStringList keyframes = kfr.split(';', QString::SkipEmptyParts); - QStringList newkfr; - foreach(const QString &str, keyframes) { - if (str.section(':', 0, 0).toInt() != oldpos) { - newkfr.append(str); - } else if (newpos != -1) { - newpos = qMax(newpos, start); - newpos = qMin(newpos, end); - if (i == 0) newkfr.append(QString::number(newpos) + ":" + QString::number(value)); - else newkfr.append(QString::number(newpos) + ":" + str.section(':', 1, 1)); - } - } - e.setAttribute("keyframes", newkfr.join(";")); - } - - updateKeyframes(effect); - update(); -} - -void ClipItem::updateKeyframes(QDomElement effect) -{ - m_keyframes.clear(); - // parse keyframes - QDomNodeList params = effect.elementsByTagName("parameter"); - QDomElement e = params.item(0).toElement(); - const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts); - foreach(const QString &str, keyframes) { - int pos = str.section(':', 0, 0).toInt(); - double val = str.section(':', 1, 1).toDouble(); - m_keyframes[pos] = val; - } - if (!m_keyframes.contains(m_selectedKeyframe)) m_selectedKeyframe = -1; -} -#include "clipitem.moc" diff -Nru kdenlive-0.7.7/src/clipmanager.cpp~ kdenlive-0.7.7.1/src/clipmanager.cpp~ --- kdenlive-0.7.7/src/clipmanager.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/clipmanager.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,532 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "clipmanager.h" -#include "addclipcommand.h" -#include "kdenlivesettings.h" -#include "docclipbase.h" -#include "kdenlivedoc.h" -#include "abstractclipitem.h" -#include "abstractgroupitem.h" - -#include - -#include -#include -#include - -#include - -ClipManager::ClipManager(KdenliveDoc *doc) : - QObject(), - m_audioThumbsQueue(), - m_doc(doc), - m_audioThumbsEnabled(false), - m_generatingAudioId() -{ - m_clipIdCounter = 1; - m_folderIdCounter = 1; - connect(&m_fileWatcher, SIGNAL(dirty(const QString &)), this, SLOT(slotClipModified(const QString &))); -} - -ClipManager::~ClipManager() -{ - qDeleteAll(m_clipList); - m_clipList.clear(); -} - -void ClipManager::clear() -{ - qDeleteAll(m_clipList); - m_clipList.clear(); - m_clipIdCounter = 1; - m_folderIdCounter = 1; - m_folderList.clear(); - m_audioThumbsQueue.clear(); -} - -void ClipManager::checkAudioThumbs() -{ - if (m_audioThumbsEnabled == KdenliveSettings::audiothumbnails()) return; - m_audioThumbsEnabled = KdenliveSettings::audiothumbnails(); - for (int i = 0; i < m_clipList.count(); i++) { - if (m_audioThumbsEnabled) m_audioThumbsQueue.append(m_clipList.at(i)->getId()); - else m_clipList.at(i)->slotClearAudioCache(); - } - if (m_audioThumbsEnabled) { - if (m_generatingAudioId.isEmpty()) startAudioThumbsGeneration(); - } else { - m_audioThumbsQueue.clear(); - m_generatingAudioId.clear(); - } -} - -void ClipManager::askForAudioThumb(const QString &id) -{ - DocClipBase *clip = getClipById(id); - if (clip && KdenliveSettings::audiothumbnails()) { - m_audioThumbsQueue.append(id); - if (m_generatingAudioId.isEmpty()) startAudioThumbsGeneration(); - } -} - -void ClipManager::startAudioThumbsGeneration() -{ - if (!KdenliveSettings::audiothumbnails()) { - m_audioThumbsQueue.clear(); - m_generatingAudioId.clear(); - return; - } - if (!m_audioThumbsQueue.isEmpty()) { - m_generatingAudioId = m_audioThumbsQueue.takeFirst(); - DocClipBase *clip = getClipById(m_generatingAudioId); - if (!clip || !clip->slotGetAudioThumbs()) - endAudioThumbsGeneration(m_generatingAudioId); - } else { - m_generatingAudioId.clear(); - } -} - -void ClipManager::endAudioThumbsGeneration(const QString &requestedId) -{ - if (!KdenliveSettings::audiothumbnails()) { - m_audioThumbsQueue.clear(); - m_generatingAudioId.clear(); - return; - } - if (!m_audioThumbsQueue.isEmpty()) { - if (m_generatingAudioId == requestedId) { - startAudioThumbsGeneration(); - } - } else { - m_generatingAudioId.clear(); - } -} - -void ClipManager::setThumbsProgress(const QString &message, int progress) -{ - m_doc->setThumbsProgress(message, progress); -} - -QList ClipManager::documentClipList() const -{ - return m_clipList; -} - -QMap ClipManager::documentFolderList() const -{ - return m_folderList; -} - -void ClipManager::addClip(DocClipBase *clip) -{ - m_clipList.append(clip); - if (clip->clipType() == IMAGE || clip->clipType() == AUDIO || (clip->clipType() == TEXT && !clip->fileURL().isEmpty())) { - // listen for file change - m_fileWatcher.addFile(clip->fileURL().path()); - } - const QString id = clip->getId(); - if (id.toInt() >= m_clipIdCounter) m_clipIdCounter = id.toInt() + 1; - const QString gid = clip->getProperty("groupid"); - if (!gid.isEmpty() && gid.toInt() >= m_folderIdCounter) m_folderIdCounter = gid.toInt() + 1; -} - -void ClipManager::slotDeleteClips(QStringList ids) -{ - QUndoCommand *delClips = new QUndoCommand(); - delClips->setText(i18np("Delete clip", "Delete clips", ids.size())); - - for (int i = 0; i < ids.size(); i++) { - DocClipBase *clip = getClipById(ids.at(i)); - if (clip) { - new AddClipCommand(m_doc, clip->toXML(), ids.at(i), false, delClips); - } - } - m_doc->commandStack()->push(delClips); -} - -void ClipManager::deleteClip(const QString &clipId) -{ - for (int i = 0; i < m_clipList.count(); i++) { - if (m_clipList.at(i)->getId() == clipId) { - if (m_clipList.at(i)->clipType() == IMAGE || m_clipList.at(i)->clipType() == AUDIO || (m_clipList.at(i)->clipType() == TEXT && !m_clipList.at(i)->fileURL().isEmpty())) { - // listen for file change - m_fileWatcher.removeFile(m_clipList.at(i)->fileURL().path()); - } - DocClipBase *clip = m_clipList.takeAt(i); - delete clip; - clip = NULL; - break; - } - } -} - -DocClipBase *ClipManager::getClipAt(int pos) -{ - return m_clipList.at(pos); -} - -DocClipBase *ClipManager::getClipById(QString clipId) -{ - //kDebug() << "++++ CLIP MAN, LOOKING FOR CLIP ID: " << clipId; - clipId = clipId.section('_', 0, 0); - for (int i = 0; i < m_clipList.count(); i++) { - if (m_clipList.at(i)->getId() == clipId) { - //kDebug() << "++++ CLIP MAN, FOUND FOR CLIP ID: " << clipId; - return m_clipList.at(i); - } - } - return NULL; -} - -const QList ClipManager::getClipByResource(QString resource) -{ - QList list; - QString clipResource; - for (int i = 0; i < m_clipList.count(); i++) { - clipResource = m_clipList.at(i)->getProperty("resource"); - if (clipResource.isEmpty()) clipResource = m_clipList.at(i)->getProperty("colour"); - if (clipResource == resource) { - list.append(m_clipList.at(i)); - } - } - return list; -} - -void ClipManager::updatePreviewSettings() -{ - for (int i = 0; i < m_clipList.count(); i++) { - if (m_clipList.at(i)->clipType() == AV || m_clipList.at(i)->clipType() == VIDEO) { - if (m_clipList.at(i)->producerProperty("meta.media.0.codec.name") && strcmp(m_clipList.at(i)->producerProperty("meta.media.0.codec.name"), "h264") == 0) { - if (KdenliveSettings::dropbframes()) { - m_clipList[i]->setProducerProperty("skip_loop_filter", "all"); - m_clipList[i]->setProducerProperty("skip_frame", "bidir"); - } else { - m_clipList[i]->setProducerProperty("skip_loop_filter", ""); - m_clipList[i]->setProducerProperty("skip_frame", ""); - } - } - } - } -} - -void ClipManager::clearUnusedProducers() -{ - for (int i = 0; i < m_clipList.count(); i++) { - if (m_clipList.at(i)->numReferences() == 0) m_clipList.at(i)->deleteProducers(); - } -} - -void ClipManager::resetProducersList(const QList prods) -{ - for (int i = 0; i < m_clipList.count(); i++) { - if (m_clipList.at(i)->numReferences() > 0) { - m_clipList.at(i)->clearProducers(); - } - } - QString id; - for (int i = 0; i < prods.count(); i++) { - id = prods.at(i)->get("id"); - kDebug() << "// // // REPLACE CLIP: " << id; - if (id.contains('_')) id = id.section('_', 0, 0); - DocClipBase *clip = getClipById(id); - if (clip) { - clip->setProducer(prods.at(i)); - } - } - emit checkAllClips(); -} - -void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId) -{ - QUndoCommand *addClips = new QUndoCommand(); - addClips->setText(i18n("Add clips")); - - foreach(const KUrl &file, urls) { - if (KIO::NetAccess::exists(file, KIO::NetAccess::SourceSide, NULL)) { - QDomDocument doc; - QDomElement prod = doc.createElement("producer"); - doc.appendChild(prod); - if (!group.isEmpty()) { - prod.setAttribute("groupname", group); - prod.setAttribute("groupid", groupId); - } - prod.setAttribute("resource", file.path()); - uint id = m_clipIdCounter++; - prod.setAttribute("id", QString::number(id)); - KMimeType::Ptr type = KMimeType::findByUrl(file); - if (type->name().startsWith("image/")) { - prod.setAttribute("type", (int) IMAGE); - prod.setAttribute("in", 0); - prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1); - } else if (type->is("application/x-kdenlivetitle")) { - // opening a title file - QDomDocument txtdoc("titledocument"); - QFile txtfile(file.path()); - if (txtfile.open(QIODevice::ReadOnly) && txtdoc.setContent(&txtfile)) { - txtfile.close(); - prod.setAttribute("type", (int) TEXT); - prod.setAttribute("resource", file.path()); - prod.setAttribute("xmldata", txtdoc.toString()); - prod.setAttribute("transparency", 1); - prod.setAttribute("in", 0); - int out = txtdoc.documentElement().attribute("out").toInt(); - if (out > 0) prod.setAttribute("out", out); - else prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1); - } else txtfile.close(); - } - new AddClipCommand(m_doc, doc.documentElement(), QString::number(id), true, addClips); - } - } - m_doc->commandStack()->push(addClips); -} - -void ClipManager::slotAddClipFile(const KUrl url, const QString group, const QString &groupId) -{ - kDebug() << "///// CLIP MANAGER, ADDING CLIP: " << url; - QDomDocument doc; - QDomElement prod = doc.createElement("producer"); - doc.appendChild(prod); - prod.setAttribute("resource", url.path()); - uint id = m_clipIdCounter++; - prod.setAttribute("id", QString::number(id)); - if (!group.isEmpty()) { - prod.setAttribute("groupname", group); - prod.setAttribute("groupid", groupId); - } - KMimeType::Ptr type = KMimeType::findByUrl(url); - if (type->name().startsWith("image/")) { - prod.setAttribute("type", (int) IMAGE); - prod.setAttribute("in", "0"); - prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1); - } else if (type->name() == "application/x-kdenlivetitle") { - // opening a title file - QDomDocument txtdoc("titledocument"); - QFile txtfile(url.path()); - if (txtfile.open(QIODevice::ReadOnly) && txtdoc.setContent(&txtfile)) { - txtfile.close(); - prod.setAttribute("type", (int) TEXT); - prod.setAttribute("resource", QString()); - prod.setAttribute("xmldata", txtdoc.toString()); - GenTime outPos(txtdoc.documentElement().attribute("out").toDouble() / 1000.0); - prod.setAttribute("transparency", 1); - prod.setAttribute("in", 0); - int out = (int) outPos.frames(m_doc->fps()); - if (out > 0) prod.setAttribute("out", out); - else prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1); - } else txtfile.close(); - } - AddClipCommand *command = new AddClipCommand(m_doc, doc.documentElement(), QString::number(id), true); - m_doc->commandStack()->push(command); -} - - -void ClipManager::slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId) -{ - QDomDocument doc; - QDomElement prod = doc.createElement("producer"); - doc.appendChild(prod); - prod.setAttribute("mlt_service", "colour"); - prod.setAttribute("colour", color); - prod.setAttribute("type", (int) COLOR); - uint id = m_clipIdCounter++; - prod.setAttribute("id", QString::number(id)); - prod.setAttribute("in", "0"); - prod.setAttribute("out", m_doc->getFramePos(duration) - 1); - prod.setAttribute("name", name); - if (!group.isEmpty()) { - prod.setAttribute("groupname", group); - prod.setAttribute("groupid", groupId); - } - AddClipCommand *command = new AddClipCommand(m_doc, doc.documentElement(), QString::number(id), true); - m_doc->commandStack()->push(command); -} - -void ClipManager::slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, QString group, const QString &groupId) -{ - QDomDocument doc; - QDomElement prod = doc.createElement("producer"); - doc.appendChild(prod); - prod.setAttribute("resource", path); - prod.setAttribute("type", (int) SLIDESHOW); - uint id = m_clipIdCounter++; - prod.setAttribute("id", QString::number(id)); - prod.setAttribute("in", "0"); - prod.setAttribute("out", m_doc->getFramePos(duration) * count - 1); - prod.setAttribute("ttl", m_doc->getFramePos(duration)); - prod.setAttribute("luma_duration", m_doc->getFramePos(luma_duration)); - prod.setAttribute("name", name); - prod.setAttribute("loop", loop); - prod.setAttribute("fade", fade); - prod.setAttribute("softness", QString::number(softness)); - prod.setAttribute("luma_file", luma_file); - if (!group.isEmpty()) { - prod.setAttribute("groupname", group); - prod.setAttribute("groupid", groupId); - } - AddClipCommand *command = new AddClipCommand(m_doc, doc.documentElement(), QString::number(id), true); - m_doc->commandStack()->push(command); -} - - - -void ClipManager::slotAddTextClipFile(const QString titleName, int out, const QString xml, const QString group, const QString &groupId) -{ - QDomDocument doc; - QDomElement prod = doc.createElement("producer"); - doc.appendChild(prod); - //prod.setAttribute("resource", imagePath); - prod.setAttribute("name", titleName); - prod.setAttribute("xmldata", xml); - uint id = m_clipIdCounter++; - prod.setAttribute("id", QString::number(id)); - if (!group.isEmpty()) { - prod.setAttribute("groupname", group); - prod.setAttribute("groupid", groupId); - } - prod.setAttribute("type", (int) TEXT); - prod.setAttribute("transparency", "1"); - prod.setAttribute("in", "0"); - prod.setAttribute("out", out); - AddClipCommand *command = new AddClipCommand(m_doc, doc.documentElement(), QString::number(id), true); - m_doc->commandStack()->push(command); -} - -void ClipManager::slotAddTextTemplateClip(QString titleName, const KUrl path, const QString group, const QString &groupId) -{ - QDomDocument doc; - QDomElement prod = doc.createElement("producer"); - doc.appendChild(prod); - prod.setAttribute("name", titleName); - prod.setAttribute("resource", path.path()); - uint id = m_clipIdCounter++; - prod.setAttribute("id", QString::number(id)); - if (!group.isEmpty()) { - prod.setAttribute("groupname", group); - prod.setAttribute("groupid", groupId); - } - prod.setAttribute("type", (int) TEXT); - prod.setAttribute("transparency", "1"); - prod.setAttribute("in", "0"); - - int out = 0; - QDomDocument titledoc; - QFile txtfile(path.path()); - if (txtfile.open(QIODevice::ReadOnly) && titledoc.setContent(&txtfile)) { - txtfile.close(); - out = titledoc.documentElement().attribute("out").toInt(); - } else txtfile.close(); - - if (out == 0) out = m_doc->getFramePos(KdenliveSettings::image_duration()) - 1; - prod.setAttribute("out", out); - - AddClipCommand *command = new AddClipCommand(m_doc, doc.documentElement(), QString::number(id), true); - m_doc->commandStack()->push(command); -} - -int ClipManager::getFreeClipId() -{ - return m_clipIdCounter++; -} - -int ClipManager::getFreeFolderId() -{ - return m_folderIdCounter++; -} - -int ClipManager::lastClipId() const -{ - return m_clipIdCounter - 1; -} - -QString ClipManager::projectFolder() const -{ - return m_doc->projectFolder().path(); -} - -void ClipManager::addFolder(const QString &id, const QString &name) -{ - m_folderList.insert(id, name); -} - -void ClipManager::deleteFolder(const QString &id) -{ - m_folderList.remove(id); -} - -AbstractGroupItem *ClipManager::createGroup() -{ - AbstractGroupItem *group = new AbstractGroupItem(m_doc->fps()); - m_groupsList.append(group); - return group; -} - -void ClipManager::removeGroup(AbstractGroupItem *group) -{ - m_groupsList.removeAll(group); -} - -QDomElement ClipManager::groupsXml() const -{ - QDomDocument doc; - QDomElement groups = doc.createElement("groups"); - doc.appendChild(groups); - for (int i = 0; i < m_groupsList.count(); i++) { - QDomElement group = doc.createElement("group"); - groups.appendChild(group); - QList children = m_groupsList.at(i)->childItems(); - for (int j = 0; j < children.count(); j++) { - if (children.at(j)->type() == AVWIDGET || children.at(j)->type() == TRANSITIONWIDGET) { - AbstractClipItem *item = static_cast (children.at(j)); - ItemInfo info = item->info(); - if (item->type() == AVWIDGET) { - QDomElement clip = doc.createElement("clipitem"); - clip.setAttribute("track", info.track); - clip.setAttribute("position", info.startPos.frames(m_doc->fps())); - group.appendChild(clip); - } else if (item->type() == TRANSITIONWIDGET) { - QDomElement clip = doc.createElement("transitionitem"); - clip.setAttribute("track", info.track); - clip.setAttribute("position", info.startPos.frames(m_doc->fps())); - group.appendChild(clip); - } - } - } - } - return doc.documentElement(); -} - - -void ClipManager::slotClipModified(const QString &path) -{ - //kDebug()<<"// CLIP: "< list = getClipByResource(path); - for (int i = 0; i < list.count(); i++) { - DocClipBase *clip = list.at(i); - if (clip != NULL) emit reloadClip(clip->getId()); - } -} - -int ClipManager::clipsCount() const -{ - return m_clipList.count(); -} - - diff -Nru kdenlive-0.7.7/src/clipproperties.cpp~ kdenlive-0.7.7.1/src/clipproperties.cpp~ --- kdenlive-0.7.7/src/clipproperties.cpp~ 2010-02-17 08:07:50.000000000 +0000 +++ kdenlive-0.7.7.1/src/clipproperties.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,691 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "clipproperties.h" -#include "kdenlivesettings.h" -#include "kthumb.h" -#include "markerdialog.h" - -#include -#include -#include - -#include - -static const int VIDEOTAB = 0; -static const int AUDIOTAB = 1; -static const int COLORTAB = 2; -static const int SLIDETAB = 3; -static const int IMAGETAB = 4; -static const int MARKERTAB = 5; -static const int METATAB = 6; -static const int ADVANCEDTAB = 7; - -ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidget * parent) : - QDialog(parent), - m_clip(clip), - m_tc(tc), - m_fps(fps), - m_count(0), - m_clipNeedsRefresh(false), - m_clipNeedsReLoad(false) -{ - setFont(KGlobalSettings::toolBarFont()); - m_view.setupUi(this); - KUrl url = m_clip->fileURL(); - m_view.clip_path->setText(url.path()); - m_view.clip_description->setText(m_clip->description()); - QMap props = m_clip->properties(); - - m_view.clip_force_out->setHidden(true); - m_view.clip_out->setHidden(true); - - if (props.contains("force_aspect_ratio") && props.value("force_aspect_ratio").toDouble() > 0) { - m_view.clip_force_ar->setChecked(true); - m_view.clip_ar->setEnabled(true); - m_view.clip_ar->setValue(props.value("force_aspect_ratio").toDouble()); - } - - if (props.contains("force_fps") && props.value("force_fps").toDouble() > 0) { - m_view.clip_force_framerate->setChecked(true); - m_view.clip_framerate->setEnabled(true); - m_view.clip_framerate->setValue(props.value("force_fps").toDouble()); - } - - if (props.contains("force_progressive")) { - m_view.clip_force_progressive->setChecked(true); - m_view.clip_progressive->setEnabled(true); - m_view.clip_progressive->setValue(props.value("force_progressive").toInt()); - } - - if (props.contains("threads") && props.value("threads").toInt() != 1) { - m_view.clip_force_threads->setChecked(true); - m_view.clip_threads->setEnabled(true); - m_view.clip_threads->setValue(props.value("threads").toInt()); - } - - if (props.contains("video_index") && props.value("video_index").toInt() != 0) { - m_view.clip_force_vindex->setChecked(true); - m_view.clip_vindex->setEnabled(true); - m_view.clip_vindex->setValue(props.value("video_index").toInt()); - } - - if (props.contains("audio_index") && props.value("audio_index").toInt() != 0) { - m_view.clip_force_aindex->setChecked(true); - m_view.clip_aindex->setEnabled(true); - m_view.clip_aindex->setValue(props.value("audio_index").toInt()); - } - - if (props.contains("audio_max")) { - m_view.clip_aindex->setMaximum(props.value("audio_max").toInt()); - } - - if (props.contains("video_max")) { - m_view.clip_vindex->setMaximum(props.value("video_max").toInt()); - } - - // Check for Metadata - QMap meta = m_clip->metadata(); - QMap::const_iterator i = meta.constBegin(); - while (i != meta.constEnd()) { - QTreeWidgetItem *metaitem = new QTreeWidgetItem(m_view.metadata_list); - metaitem->setText(0, i.key()); //i18n(i.key().section('.', 2, 3).toUtf8().data())); - metaitem->setText(1, i.value()); - ++i; - } - - connect(m_view.clip_force_ar, SIGNAL(toggled(bool)), m_view.clip_ar, SLOT(setEnabled(bool))); - connect(m_view.clip_force_framerate, SIGNAL(toggled(bool)), m_view.clip_framerate, SLOT(setEnabled(bool))); - connect(m_view.clip_force_progressive, SIGNAL(toggled(bool)), m_view.clip_progressive, SLOT(setEnabled(bool))); - connect(m_view.clip_force_threads, SIGNAL(toggled(bool)), m_view.clip_threads, SLOT(setEnabled(bool))); - connect(m_view.clip_force_vindex, SIGNAL(toggled(bool)), m_view.clip_vindex, SLOT(setEnabled(bool))); - connect(m_view.clip_force_aindex, SIGNAL(toggled(bool)), m_view.clip_aindex, SLOT(setEnabled(bool))); - - if (props.contains("audiocodec")) - m_view.clip_acodec->setText(props.value("audiocodec")); - if (props.contains("frequency")) - m_view.clip_frequency->setText(props.value("frequency")); - if (props.contains("channels")) - m_view.clip_channels->setText(props.value("channels")); - - CLIPTYPE t = m_clip->clipType(); - if (t != AUDIO && t != AV) { - m_view.clip_force_aindex->setEnabled(false); - } - - if (t != VIDEO && t != AV) { - m_view.clip_force_vindex->setEnabled(false); - } - - if (t == IMAGE) { - m_view.tabWidget->removeTab(SLIDETAB); - m_view.tabWidget->removeTab(COLORTAB); - m_view.tabWidget->removeTab(AUDIOTAB); - m_view.tabWidget->removeTab(VIDEOTAB); - if (props.contains("frame_size")) - m_view.image_size->setText(props.value("frame_size")); - if (props.contains("transparency")) - m_view.image_transparency->setChecked(props.value("transparency").toInt()); - int width = 180.0 * KdenliveSettings::project_display_ratio(); - if (width % 2 == 1) width++; - m_view.clip_thumb->setPixmap(QPixmap(url.path()).scaled(QSize(width, 180), Qt::KeepAspectRatio)); - } else if (t == COLOR) { - m_view.clip_path->setEnabled(false); - m_view.tabWidget->removeTab(METATAB); - m_view.tabWidget->removeTab(IMAGETAB); - m_view.tabWidget->removeTab(SLIDETAB); - m_view.tabWidget->removeTab(AUDIOTAB); - m_view.tabWidget->removeTab(VIDEOTAB); - m_view.clip_thumb->setHidden(true); - m_view.clip_color->setColor(QColor('#' + props.value("colour").right(8).left(6))); - } else if (t == SLIDESHOW) { - m_view.clip_path->setText(url.directory()); - m_view.tabWidget->removeTab(METATAB); - m_view.tabWidget->removeTab(IMAGETAB); - m_view.tabWidget->removeTab(COLORTAB); - m_view.tabWidget->removeTab(AUDIOTAB); - m_view.tabWidget->removeTab(VIDEOTAB); - - //WARNING: Keep in sync with slideshowclip.cpp - m_view.image_type->addItem("JPG (*.jpg)", "jpg"); - m_view.image_type->addItem("JPEG (*.jpeg)", "jpeg"); - m_view.image_type->addItem("PNG (*.png)", "png"); - m_view.image_type->addItem("BMP (*.bmp)", "bmp"); - m_view.image_type->addItem("GIF (*.gif)", "gif"); - m_view.image_type->addItem("TGA (*.tga)", "tga"); - m_view.image_type->addItem("TIFF (*.tiff)", "tiff"); - m_view.image_type->addItem("Open EXR (*.exr)", "exr"); - - m_view.slide_loop->setChecked(props.value("loop").toInt()); - m_view.slide_fade->setChecked(props.value("fade").toInt()); - m_view.luma_softness->setValue(props.value("softness").toInt()); - QString path = props.value("resource"); - QString ext = path.section('.', -1); - for (int i = 0; i < m_view.image_type->count(); i++) { - if (m_view.image_type->itemData(i).toString() == ext) { - m_view.image_type->setCurrentIndex(i); - break; - } - } - m_view.slide_duration->setText(tc.getTimecodeFromFrames(props.value("ttl").toInt())); - - m_view.slide_duration_format->addItem(i18n("hh:mm:ss::ff")); - m_view.slide_duration_format->addItem(i18n("Frames")); - connect(m_view.slide_duration_format, SIGNAL(activated(int)), this, SLOT(slotUpdateDurationFormat(int))); - m_view.slide_duration_frames->setHidden(true); - m_view.luma_duration_frames->setHidden(true); - - parseFolder(); - - m_view.luma_duration->setText(tc.getTimecodeFromFrames(props.value("luma_duration").toInt())); - QString lumaFile = props.value("luma_file"); - - // Check for Kdenlive installed luma files - QStringList filters; - filters << "*.pgm" << "*.png"; - - QStringList customLumas = KGlobal::dirs()->findDirs("appdata", "lumas"); - foreach(const QString &folder, customLumas) { - QStringList filesnames = QDir(folder).entryList(filters, QDir::Files); - foreach(const QString &fname, filesnames) { - QString filePath = KUrl(folder).path(KUrl::AddTrailingSlash) + fname; - m_view.luma_file->addItem(KIcon(filePath), fname, filePath); - } - } - - // Check for MLT lumas - QString profilePath = KdenliveSettings::mltpath(); - QString folder = profilePath.section('/', 0, -3); - folder.append("/lumas/PAL"); // TODO: cleanup the PAL / NTSC mess in luma files - QDir lumafolder(folder); - QStringList filesnames = lumafolder.entryList(filters, QDir::Files); - foreach(const QString &fname, filesnames) { - QString filePath = KUrl(folder).path(KUrl::AddTrailingSlash) + fname; - m_view.luma_file->addItem(KIcon(filePath), fname, filePath); - } - - if (!lumaFile.isEmpty()) { - m_view.slide_luma->setChecked(true); - m_view.luma_file->setCurrentIndex(m_view.luma_file->findData(lumaFile)); - } else m_view.luma_file->setEnabled(false); - slotEnableLuma(m_view.slide_fade->checkState()); - slotEnableLumaFile(m_view.slide_luma->checkState()); - connect(m_view.slide_fade, SIGNAL(stateChanged(int)), this, SLOT(slotEnableLuma(int))); - connect(m_view.slide_luma, SIGNAL(stateChanged(int)), this, SLOT(slotEnableLumaFile(int))); - - connect(m_view.image_type, SIGNAL(currentIndexChanged(int)), this, SLOT(parseFolder())); - } else if (t != AUDIO) { - m_view.tabWidget->removeTab(IMAGETAB); - m_view.tabWidget->removeTab(SLIDETAB); - m_view.tabWidget->removeTab(COLORTAB); - if (props.contains("frame_size")) - m_view.clip_size->setText(props.value("frame_size")); - if (props.contains("videocodec")) - m_view.clip_vcodec->setText(props.value("videocodec")); - if (props.contains("fps")) { - m_view.clip_fps->setText(props.value("fps")); - if (!m_view.clip_framerate->isEnabled()) m_view.clip_framerate->setValue(props.value("fps").toDouble()); - } - if (props.contains("aspect_ratio")) - m_view.clip_ratio->setText(props.value("aspect_ratio")); - int width = 180.0 * KdenliveSettings::project_display_ratio(); - if (width % 2 == 1) width++; - QPixmap pix = m_clip->thumbProducer()->getImage(url, m_clip->getClipThumbFrame(), width, 180); - m_view.clip_thumb->setPixmap(pix); - if (t == IMAGE || t == VIDEO) m_view.tabWidget->removeTab(AUDIOTAB); - } else { - m_view.tabWidget->removeTab(IMAGETAB); - m_view.tabWidget->removeTab(SLIDETAB); - m_view.tabWidget->removeTab(COLORTAB); - m_view.tabWidget->removeTab(VIDEOTAB); - m_view.clip_thumb->setHidden(true); - } - - if (t != SLIDESHOW && t != COLOR) { - KFileItem f(KFileItem::Unknown, KFileItem::Unknown, url, true); - m_view.clip_filesize->setText(KIO::convertSize(f.size())); - } else { - m_view.clip_filesize->setHidden(true); - m_view.label_size->setHidden(true); - } - m_view.clip_duration->setText(tc.getTimecode(m_clip->duration())); - if (t != IMAGE && t != COLOR && t != TEXT) m_view.clip_duration->setReadOnly(true); - else connect(m_view.clip_duration, SIGNAL(editingFinished()), this, SLOT(slotCheckMaxLength())); - - // markers - m_view.marker_new->setIcon(KIcon("document-new")); - m_view.marker_new->setToolTip(i18n("Add marker")); - m_view.marker_edit->setIcon(KIcon("document-properties")); - m_view.marker_edit->setToolTip(i18n("Edit marker")); - m_view.marker_delete->setIcon(KIcon("trash-empty")); - m_view.marker_delete->setToolTip(i18n("Delete marker")); - - slotFillMarkersList(); - connect(m_view.marker_new, SIGNAL(clicked()), this, SLOT(slotAddMarker())); - connect(m_view.marker_edit, SIGNAL(clicked()), this, SLOT(slotEditMarker())); - connect(m_view.marker_delete, SIGNAL(clicked()), this, SLOT(slotDeleteMarker())); - connect(m_view.markers_list, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotEditMarker())); - - //adjustSize(); -} - - -// Used for multiple clips editing -ClipProperties::ClipProperties(QList cliplist, Timecode tc, QMap commonproperties, QWidget * parent) : - QDialog(parent), - m_clip(NULL), - m_tc(tc), - m_fps(0), - m_count(0), - m_clipNeedsRefresh(false), - m_clipNeedsReLoad(false) -{ - setFont(KGlobalSettings::toolBarFont()); - m_view.setupUi(this); - QMap props = cliplist.at(0)->properties(); - m_old_props = commonproperties; - - if (commonproperties.contains("force_aspect_ratio") && !commonproperties.value("force_aspect_ratio").isEmpty() && commonproperties.value("force_aspect_ratio").toDouble() > 0) { - m_view.clip_force_ar->setChecked(true); - m_view.clip_ar->setEnabled(true); - m_view.clip_ar->setValue(commonproperties.value("force_aspect_ratio").toDouble()); - } - - if (commonproperties.contains("force_fps") && !commonproperties.value("force_fps").isEmpty() && commonproperties.value("force_fps").toDouble() > 0) { - m_view.clip_force_framerate->setChecked(true); - m_view.clip_framerate->setEnabled(true); - m_view.clip_framerate->setValue(commonproperties.value("force_fps").toDouble()); - } - - if (commonproperties.contains("force_progressive") && !commonproperties.value("force_progressive").isEmpty()) { - m_view.clip_force_progressive->setChecked(true); - m_view.clip_progressive->setEnabled(true); - m_view.clip_progressive->setValue(commonproperties.value("force_progressive").toInt()); - } - - if (commonproperties.contains("threads") && !commonproperties.value("threads").isEmpty() && commonproperties.value("threads").toInt() != 1) { - m_view.clip_force_threads->setChecked(true); - m_view.clip_threads->setEnabled(true); - m_view.clip_threads->setValue(commonproperties.value("threads").toInt()); - } - - if (commonproperties.contains("video_index") && !commonproperties.value("video_index").isEmpty() && commonproperties.value("video_index").toInt() != 0) { - m_view.clip_force_vindex->setChecked(true); - m_view.clip_vindex->setEnabled(true); - m_view.clip_vindex->setValue(commonproperties.value("video_index").toInt()); - } - - if (commonproperties.contains("audio_index") && !commonproperties.value("audio_index").isEmpty() && commonproperties.value("audio_index").toInt() != 0) { - m_view.clip_force_aindex->setChecked(true); - m_view.clip_aindex->setEnabled(true); - m_view.clip_aindex->setValue(commonproperties.value("audio_index").toInt()); - } - - if (props.contains("audio_max")) { - m_view.clip_aindex->setMaximum(props.value("audio_max").toInt()); - } - - if (props.contains("video_max")) { - m_view.clip_vindex->setMaximum(props.value("video_max").toInt()); - } - - connect(m_view.clip_force_ar, SIGNAL(toggled(bool)), m_view.clip_ar, SLOT(setEnabled(bool))); - connect(m_view.clip_force_progressive, SIGNAL(toggled(bool)), m_view.clip_progressive, SLOT(setEnabled(bool))); - connect(m_view.clip_force_threads, SIGNAL(toggled(bool)), m_view.clip_threads, SLOT(setEnabled(bool))); - connect(m_view.clip_force_vindex, SIGNAL(toggled(bool)), m_view.clip_vindex, SLOT(setEnabled(bool))); - connect(m_view.clip_force_aindex, SIGNAL(toggled(bool)), m_view.clip_aindex, SLOT(setEnabled(bool))); - connect(m_view.clip_force_out, SIGNAL(toggled(bool)), m_view.clip_out, SLOT(setEnabled(bool))); - - m_view.tabWidget->removeTab(METATAB); - m_view.tabWidget->removeTab(MARKERTAB); - m_view.tabWidget->removeTab(IMAGETAB); - m_view.tabWidget->removeTab(SLIDETAB); - m_view.tabWidget->removeTab(COLORTAB); - m_view.tabWidget->removeTab(AUDIOTAB); - m_view.tabWidget->removeTab(VIDEOTAB); - - m_view.clip_path->setHidden(true); - m_view.label_path->setHidden(true); - m_view.label_description->setHidden(true); - m_view.label_size->setHidden(true); - m_view.clip_filesize->setHidden(true); - m_view.clip_filesize->setHidden(true); - m_view.clip_path->setHidden(true); - m_view.clip_description->setHidden(true); - m_view.clip_thumb->setHidden(true); - m_view.label_duration->setHidden(true); - m_view.clip_duration->setHidden(true); - - if (commonproperties.contains("out")) { - if (commonproperties.value("out").toInt() > 0) { - m_view.clip_force_out->setChecked(true); - m_view.clip_out->setText(m_tc.getTimecodeFromFrames(commonproperties.value("out").toInt())); - } else m_view.clip_out->setText(KdenliveSettings::image_duration()); - } else { - m_view.clip_force_out->setHidden(true); - m_view.clip_out->setHidden(true); - } -} - - - -void ClipProperties::slotEnableLuma(int state) -{ - bool enable = false; - if (state == Qt::Checked) enable = true; - m_view.luma_duration->setEnabled(enable); - m_view.luma_duration_frames->setEnabled(enable); - m_view.slide_luma->setEnabled(enable); - if (enable) { - m_view.luma_file->setEnabled(m_view.slide_luma->isChecked()); - } else m_view.luma_file->setEnabled(false); - m_view.label_softness->setEnabled(m_view.slide_luma->isChecked() && enable); - m_view.luma_softness->setEnabled(m_view.label_softness->isEnabled()); -} - -void ClipProperties::slotEnableLumaFile(int state) -{ - bool enable = false; - if (state == Qt::Checked) enable = true; - m_view.luma_file->setEnabled(enable); - m_view.luma_softness->setEnabled(enable); - m_view.label_softness->setEnabled(enable); -} - -void ClipProperties::slotFillMarkersList() -{ - m_view.markers_list->clear(); - QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); - for (int count = 0; count < marks.count(); ++count) { - QString time = m_tc.getTimecode(marks[count].time()); - QStringList itemtext; - itemtext << time << marks[count].comment(); - (void) new QTreeWidgetItem(m_view.markers_list, itemtext); - } -} - -void ClipProperties::slotAddMarker() -{ - CommentedTime marker(GenTime(), i18n("Marker")); - MarkerDialog d(m_clip, marker, m_tc, i18n("Add Marker"), this); - if (d.exec() == QDialog::Accepted) { - emit addMarker(m_clip->getId(), d.newMarker().time(), d.newMarker().comment()); - } - QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); -} - -void ClipProperties::slotEditMarker() -{ - QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); - int pos = m_view.markers_list->currentIndex().row(); - if (pos < 0 || pos > marks.count() - 1) return; - MarkerDialog d(m_clip, marks.at(pos), m_tc, i18n("Edit Marker"), this); - if (d.exec() == QDialog::Accepted) { - emit addMarker(m_clip->getId(), d.newMarker().time(), d.newMarker().comment()); - } - QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); -} - -void ClipProperties::slotDeleteMarker() -{ - QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); - int pos = m_view.markers_list->currentIndex().row(); - if (pos < 0 || pos > marks.count() - 1) return; - emit addMarker(m_clip->getId(), marks.at(pos).time(), QString()); - - QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); -} - -const QString &ClipProperties::clipId() const -{ - return m_clip->getId(); -} - - -QMap ClipProperties::properties() -{ - QMap props; - CLIPTYPE t; - if (m_clip != NULL) { - t = m_clip->clipType(); - m_old_props = m_clip->properties(); - } - - double aspect = m_view.clip_ar->value(); - if (m_view.clip_force_ar->isChecked()) { - if (aspect != m_old_props.value("force_aspect_ratio").toDouble()) { - props["force_aspect_ratio"] = QString::number(aspect); - m_clipNeedsRefresh = true; - } - } else if (m_old_props.contains("force_aspect_ratio")) { - props["force_aspect_ratio"].clear(); - m_clipNeedsRefresh = true; - } - - double fps = m_view.clip_framerate->value(); - if (m_view.clip_force_framerate->isChecked()) { - if (fps != m_old_props.value("force_fps").toDouble()) { - props["force_fps"] = QString::number(fps); - m_clipNeedsRefresh = true; - } - } else if (m_old_props.contains("force_fps")) { - props["force_fps"].clear(); - m_clipNeedsRefresh = true; - } - - int progressive = m_view.clip_progressive->value(); - if (m_view.clip_force_progressive->isChecked()) { - if (progressive != m_old_props.value("force_progressive").toInt()) { - props["force_progressive"] = QString::number(progressive); - } - } else if (m_old_props.contains("force_progressive")) { - props["force_progressive"].clear(); - } - - int threads = m_view.clip_threads->value(); - if (m_view.clip_force_threads->isChecked()) { - if (threads != m_old_props.value("threads").toInt()) { - props["threads"] = QString::number(threads); - } - } else if (m_old_props.contains("threads")) { - props["threads"].clear(); - } - - int vindex = m_view.clip_vindex->value(); - if (m_view.clip_force_vindex->isChecked()) { - if (vindex != m_old_props.value("video_index").toInt()) { - props["video_index"] = QString::number(vindex); - } - } else if (m_old_props.contains("video_index")) { - props["video_index"].clear(); - } - - int aindex = m_view.clip_aindex->value(); - if (m_view.clip_force_aindex->isChecked()) { - if (aindex != m_old_props.value("audio_index").toInt()) { - props["audio_index"] = QString::number(aindex); - } - } else if (m_old_props.contains("audio_index")) { - props["audio_index"].clear(); - } - - // If we adjust several clips, return now - if (m_clip == NULL) { - if (m_view.clip_out->isEnabled()) { - int duration = m_tc.getFrameCount(m_view.clip_out->text()); - if (duration != m_old_props.value("out").toInt()) { - props["out"] = QString::number(duration - 1); - } - } - return props; - } - - if (m_old_props.value("description") != m_view.clip_description->text()) - props["description"] = m_view.clip_description->text(); - - if (t == COLOR) { - QString new_color = m_view.clip_color->color().name(); - if (new_color != QString('#' + m_old_props.value("colour").right(8).left(6))) { - m_clipNeedsRefresh = true; - props["colour"] = "0x" + new_color.right(6) + "ff"; - } - int duration = m_tc.getFrameCount(m_view.clip_duration->text()); - if (duration != m_clip->duration().frames(m_fps)) { - props["out"] = QString::number(duration - 1); - } - } else if (t == IMAGE) { - if ((int) m_view.image_transparency->isChecked() != m_old_props.value("transparency").toInt()) { - props["transparency"] = QString::number((int)m_view.image_transparency->isChecked()); - //m_clipNeedsRefresh = true; - } - int duration = m_tc.getFrameCount(m_view.clip_duration->text()); - if (duration != m_clip->duration().frames(m_fps)) { - props["out"] = QString::number(duration - 1); - } - } else if (t == SLIDESHOW) { - QString value = QString::number((int) m_view.slide_loop->isChecked()); - if (m_old_props.value("loop") != value) props["loop"] = value; - value = QString::number((int) m_view.slide_fade->isChecked()); - if (m_old_props.value("fade") != value) props["fade"] = value; - value = QString::number((int) m_view.luma_softness->value()); - if (m_old_props.value("softness") != value) props["softness"] = value; - - QString extension = "/.all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString(); - QString new_path = m_view.clip_path->text() + extension; - if (new_path != m_old_props.value("resource")) { - m_clipNeedsReLoad = true; - props["resource"] = new_path; - kDebug() << "//// SLIDE EDIT, NEW:" << new_path << ", OLD; " << m_old_props.value("resource"); - } - int duration; - if (m_view.slide_duration_format->currentIndex() == 1) { - // we are in frames mode - duration = m_view.slide_duration_frames->value(); - } else duration = m_tc.getFrameCount(m_view.slide_duration->text()); - if (duration != m_old_props.value("ttl").toInt()) { - m_clipNeedsRefresh = true; - props["ttl"] = QString::number(duration); - props["out"] = QString::number(duration * m_count); - } - - if (duration * m_count - 1 != m_old_props.value("out").toInt()) { - m_clipNeedsRefresh = true; - props["out"] = QString::number(duration * m_count - 1); - } - if (m_view.slide_fade->isChecked()) { - int luma_duration; - if (m_view.slide_duration_format->currentIndex() == 1) { - // we are in frames mode - luma_duration = m_view.luma_duration_frames->value(); - } else luma_duration = m_tc.getFrameCount(m_view.luma_duration->text()); - if (luma_duration != m_old_props.value("luma_duration").toInt()) { - m_clipNeedsRefresh = true; - props["luma_duration"] = QString::number(luma_duration); - } - QString lumaFile; - if (m_view.slide_luma->isChecked()) - lumaFile = m_view.luma_file->itemData(m_view.luma_file->currentIndex()).toString(); - if (lumaFile != m_old_props.value("luma_file")) { - m_clipNeedsRefresh = true; - props["luma_file"] = lumaFile; - } - } else { - if (!m_old_props.value("luma_file").isEmpty()) { - props["luma_file"].clear(); - } - } - - } - return props; -} - -bool ClipProperties::needsTimelineRefresh() const -{ - return m_clipNeedsRefresh; -} - -bool ClipProperties::needsTimelineReload() const -{ - return m_clipNeedsReLoad; -} - -void ClipProperties::parseFolder() -{ - - QDir dir(m_view.clip_path->text()); - QStringList filters; - filters << "*." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString(); - QString extension = "/.all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString(); - - dir.setNameFilters(filters); - QStringList result = dir.entryList(QDir::Files); - m_count = result.count(); - if (m_count == 0) { - // no images, do not accept that - m_view.slide_info->setText(i18n("No image found")); - m_view.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); - return; - } - m_view.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); - m_view.slide_info->setText(i18np("1 image found", "%1 images found", m_count)); - QDomElement xml = m_clip->toXML(); - xml.setAttribute("resource", m_view.clip_path->text() + extension); - int width = 180.0 * KdenliveSettings::project_display_ratio(); - if (width % 2 == 1) width++; - QPixmap pix = m_clip->thumbProducer()->getImage(KUrl(m_view.clip_path->text() + extension), 1, width, 180); - QMap props = m_clip->properties(); - m_view.clip_duration->setText(m_tc.getTimecodeFromFrames(props.value("ttl").toInt() * m_count)); - m_view.clip_thumb->setPixmap(pix); -} - -void ClipProperties::slotCheckMaxLength() -{ - if (m_clip->maxDuration() == GenTime()) return; - int duration = m_tc.getFrameCount(m_view.clip_duration->text()); - if (duration > m_clip->maxDuration().frames(m_fps)) { - m_view.clip_duration->setText(m_tc.getTimecode(m_clip->maxDuration())); - } -} - -void ClipProperties::slotUpdateDurationFormat(int ix) -{ - bool framesFormat = ix == 1; - if (framesFormat) { - // switching to frames count, update widget - m_view.slide_duration_frames->setValue(m_tc.getFrameCount(m_view.slide_duration->text())); - m_view.luma_duration_frames->setValue(m_tc.getFrameCount(m_view.luma_duration->text())); - m_view.slide_duration->setHidden(true); - m_view.luma_duration->setHidden(true); - m_view.slide_duration_frames->setHidden(false); - m_view.luma_duration_frames->setHidden(false); - } else { - // switching to timecode format - m_view.slide_duration->setText(m_tc.getTimecodeFromFrames(m_view.slide_duration_frames->value())); - m_view.luma_duration->setText(m_tc.getTimecodeFromFrames(m_view.luma_duration_frames->value())); - m_view.slide_duration_frames->setHidden(true); - m_view.luma_duration_frames->setHidden(true); - m_view.slide_duration->setHidden(false); - m_view.luma_duration->setHidden(false); - } -} - -#include "clipproperties.moc" - - diff -Nru kdenlive-0.7.7/src/CMakeLists.txt kdenlive-0.7.7.1/src/CMakeLists.txt --- kdenlive-0.7.7/src/CMakeLists.txt 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/CMakeLists.txt 2010-02-26 21:44:41.000000000 +0000 @@ -1,7 +1,7 @@ add_subdirectory( widgets ) add_subdirectory( mimetypes ) -find_package(Nepomuk) +macro_optional_find_package(Nepomuk) if (Nepomuk_FOUND) INCLUDE_DIRECTORIES(NEPOMUK_INCLUDES ) diff -Nru kdenlive-0.7.7/src/CMakeLists.txt~ kdenlive-0.7.7.1/src/CMakeLists.txt~ --- kdenlive-0.7.7/src/CMakeLists.txt~ 1970-01-01 01:00:00.000000000 +0100 +++ kdenlive-0.7.7.1/src/CMakeLists.txt~ 2010-02-26 21:44:41.000000000 +0000 @@ -0,0 +1,238 @@ +add_subdirectory( widgets ) +add_subdirectory( mimetypes ) + +find_package(Nepomuk) + +if (Nepomuk_FOUND) + INCLUDE_DIRECTORIES(NEPOMUK_INCLUDES ) + set( optional_libs ${NEPOMUK_LIBRARIES} ) + add_definitions(-DNEPOMUK) +endif (Nepomuk_FOUND) + + +if (APPLE) + find_package(OpenGL) + set(QT_USE_QTOPENGL TRUE) +endif (APPLE) + +include_directories ( + ${KDE4_INCLUDE_DIR} + ${KDE4_INCLUDE_DIR}/KDE + ${QT_INCLUDES} + ${LIBMLT_INCLUDE_DIR} + ${LIBMLTPLUS_INCLUDE_DIR} + ${QDBUS_INCLUDE_DIRS} + ${CMAKE_SOURCE_DIR} + ${CMAKE_BINARY_DIR} + + ${CMAKE_SOURCE_DIR}/src/widgets +) + +LINK_LIBRARIES( +${LIBMLT_LIBRARY} +${LIBMLTPLUS_LIBRARY} +${optional_libs} +) + + + +kde4_add_ui_files(kdenlive_UI + widgets/timeline_ui.ui + widgets/monitor_ui.ui + widgets/recmonitor_ui.ui + widgets/colorclip_ui.ui + widgets/slideshowclip_ui.ui + widgets/configmisc_ui.ui + widgets/configenv_ui.ui + widgets/configdisplay_ui.ui + widgets/configsdl_ui.ui + widgets/configcapture_ui.ui + widgets/configtranscode_ui.ui + widgets/effectlist_ui.ui + widgets/effectstack_ui.ui + widgets/profiledialog_ui.ui + widgets/projectsettings_ui.ui + widgets/keyframewidget_ui.ui + widgets/constval_ui.ui + widgets/listval_ui.ui + widgets/wipeval_ui.ui + widgets/boolval_ui.ui + widgets/colorval_ui.ui + widgets/positionval_ui.ui + widgets/titlewidget_ui.ui + widgets/unicodedialog_ui.ui + widgets/timelinebuttons_ui.ui + widgets/renderwidget_ui.ui + widgets/saveprofile_ui.ui + widgets/transitionsettings_ui.ui + widgets/configjogshuttle_ui.ui + widgets/trackheader_ui.ui + widgets/clipproperties_ui.ui + widgets/markerdialog_ui.ui + widgets/keyframedialog_ui.ui + widgets/clipdurationdialog_ui.ui + widgets/managecaptures_ui.ui + widgets/geometryval_ui.ui + widgets/wizardstandard_ui.ui + widgets/wizardextra_ui.ui + widgets/wizardcheck_ui.ui + widgets/wizardmltcheck_ui.ui + widgets/spacerdialog_ui.ui + widgets/addtrack_ui.ui + widgets/dvdwizardvob_ui.ui + widgets/dvdwizardmenu_ui.ui + widgets/dvdwizardstatus_ui.ui + widgets/dvdwizardchapters_ui.ui + widgets/missingclips_ui.ui + widgets/cliptranscode_ui.ui + widgets/geometryposition_ui.ui + widgets/templateclip_ui.ui + widgets/keyframeeditor_ui.ui +) + +set(kdenlive_SRCS + addclipcommand.cpp + main.cpp + mainwindow.cpp + customruler.cpp + smallruler.cpp + projectlist.cpp + projectitem.cpp + monitor.cpp + gentime.cpp + renderer.cpp + kdenlivedoc.cpp + projectlistview.cpp + trackview.cpp + docclipbase.cpp + timecode.cpp + monitormanager.cpp + headertrack.cpp + customtrackview.cpp + clipitem.cpp + moveclipcommand.cpp + resizeclipcommand.cpp + razorclipcommand.cpp + addtimelineclipcommand.cpp + addmarkercommand.cpp + kthumb.cpp + clipmanager.cpp + effectslist.cpp + initeffects.cpp + effectslistview.cpp + addeffectcommand.cpp + editeffectcommand.cpp + moveeffectcommand.cpp + effectstackview.cpp + effectstackedit.cpp + parameterplotter.cpp + profilesdialog.cpp + projectsettings.cpp + kdenlivesettingsdialog.cpp + complexparameter.cpp + titlewidget.cpp + unicodedialog.cpp + graphicsscenerectmove.cpp + effectslistwidget.cpp + titledocument.cpp + transition.cpp + renderwidget.cpp + abstractclipitem.cpp + transitionsettings.cpp + recmonitor.cpp + addtransitioncommand.cpp + edittransitioncommand.cpp + addfoldercommand.cpp + editfoldercommand.cpp + clipproperties.cpp + movetransitioncommand.cpp + slideshowclip.cpp + markerdialog.cpp + guide.cpp + editguidecommand.cpp + statusbarmessagelabel.cpp + editkeyframecommand.cpp + clipdurationdialog.cpp + managecapturesdialog.cpp + changespeedcommand.cpp + geometryval.cpp + wizard.cpp + customtrackscene.cpp + abstractgroupitem.cpp + keyframehelper.cpp + editclipcommand.cpp + insertspacecommand.cpp + spacerdialog.cpp + addtrackcommand.cpp + changetrackcommand.cpp + movegroupcommand.cpp + dvdwizardvob.cpp + dvdwizardmenu.cpp + dvdwizard.cpp + locktrackcommand.cpp + groupclipscommand.cpp + splitaudiocommand.cpp + changecliptypecommand.cpp + documentchecker.cpp + dvdwizardchapters.cpp + documentvalidator.cpp + cliptranscode.cpp + keyframeedit.cpp + positionedit.cpp + trackdialog.cpp + subprojectitem.cpp + folderprojectitem.cpp + addclipcutcommand.cpp + editclipcutcommand.cpp + KoSliderCombo.cpp +) + +add_definitions( ${KDE4_DEFINITIONS} ) + +if(NO_JOGSHUTTLE) + add_definitions(-DNO_JOGSHUTTLE) +else(NO_JOGSHUTTLE) + set(kdenlive_SRCS jogshuttle.cpp ${kdenlive_SRCS}) +endif(NO_JOGSHUTTLE) + +if (APPLE) + set(kdenlive_SRCS videoglwidget.cpp ${kdenlive_SRCS}) +endif (APPLE) + +kde4_add_kcfg_files(kdenlive_SRCS kdenlivesettings.kcfgc ) +QT4_ADD_DBUS_ADAPTOR(kdenlive_SRCS org.kdenlive.MainWindow.xml mainwindow.h MainWindow) +kde4_add_executable(kdenlive ${kdenlive_SRCS} ${kdenlive_UI}) + +if (${KDE_VERSION} VERSION_EQUAL 4.3.80 OR ${KDE_VERSION} VERSION_GREATER 4.3.80) + set(KNEWSTUFF_LIBS ${KDE4_KNEWSTUFF3_LIBS}) +else (${KDE_VERSION} VERSION_EQUAL 4.3.80 OR ${KDE_VERSION} VERSION_GREATER 4.3.80) + set(KNEWSTUFF_LIBS ${KDE4_KNEWSTUFF2_LIBS}) +endif (${KDE_VERSION} VERSION_EQUAL 4.3.80 OR ${KDE_VERSION} VERSION_GREATER 4.3.80) + +target_link_libraries(kdenlive + ${KDE4_KDEUI_LIBS} + ${KDE4_KIO_LIBS} + ${KNEWSTUFF_LIBS} + ${LIBMLTPLUS_LIBRARY} + ${LIBMLT_LIBRARY} + ${optional_libs} + ${KDE4_KNOTIFYCONFIG_LIBRARY} + ${KDE4_KROSSUI_LIBS} +) + +if (APPLE) + find_package(SDL REQUIRED) + target_link_libraries(kdenlive ${SDL_LIBRARY}) + target_link_libraries(kdenlive ${QT_QTOPENGL_LIBRARY}) + target_link_libraries(kdenlive ${OPENGL_LIBRARIES}) +endif (APPLE) + +install(TARGETS kdenlive DESTINATION ${BIN_INSTALL_DIR}) +install( FILES kdenliveui.rc kdenlive.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kdenlive ) +install (FILES kdenlivesettings.kcfg DESTINATION ${KCFG_INSTALL_DIR}) +install (FILES kdenlive.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) +kde4_install_icons(${ICON_INSTALL_DIR}) +install( FILES kdenlive_wipes.knsrc kdenlive_renderprofiles.knsrc kdenlive_projectprofiles.knsrc kdenlivetranscodingrc DESTINATION ${CONFIG_INSTALL_DIR} ) +kde4_install_icons( ${ICON_INSTALL_DIR} ) + + diff -Nru kdenlive-0.7.7/src/customtrackview.cpp~ kdenlive-0.7.7.1/src/customtrackview.cpp~ --- kdenlive-0.7.7/src/customtrackview.cpp~ 2010-02-17 08:07:50.000000000 +0000 +++ kdenlive-0.7.7.1/src/customtrackview.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,5854 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "customtrackview.h" -#include "docclipbase.h" -#include "clipitem.h" -#include "definitions.h" -#include "moveclipcommand.h" -#include "movetransitioncommand.h" -#include "resizeclipcommand.h" -#include "editguidecommand.h" -#include "addtimelineclipcommand.h" -#include "addeffectcommand.h" -#include "editeffectcommand.h" -#include "moveeffectcommand.h" -#include "addtransitioncommand.h" -#include "edittransitioncommand.h" -#include "editkeyframecommand.h" -#include "changespeedcommand.h" -#include "addmarkercommand.h" -#include "razorclipcommand.h" -#include "kdenlivesettings.h" -#include "transition.h" -#include "clipmanager.h" -#include "renderer.h" -#include "markerdialog.h" -#include "mainwindow.h" -#include "ui_keyframedialog_ui.h" -#include "clipdurationdialog.h" -#include "abstractgroupitem.h" -#include "insertspacecommand.h" -#include "spacerdialog.h" -#include "addtrackcommand.h" -#include "changetrackcommand.h" -#include "movegroupcommand.h" -#include "ui_addtrack_ui.h" -#include "initeffects.h" -#include "locktrackcommand.h" -#include "groupclipscommand.h" -#include "splitaudiocommand.h" -#include "changecliptypecommand.h" -#include "trackdialog.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - - -#if QT_VERSION >= 0x040600 -#include -#endif - -bool sortGuidesList(const Guide *g1 , const Guide *g2) -{ - return (*g1).position() < (*g2).position(); -} - - -//TODO: -// disable animation if user asked it in KDE's global settings -// http://lists.kde.org/?l=kde-commits&m=120398724717624&w=2 -// needs something like below (taken from dolphin) -// #include -// const bool animate = KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects; -// const int duration = animate ? 1500 : 1; - -CustomTrackView::CustomTrackView(KdenliveDoc *doc, CustomTrackScene* projectscene, QWidget *parent) : - QGraphicsView(projectscene, parent), - m_tracksHeight(KdenliveSettings::trackheight()), - m_projectDuration(0), - m_cursorPos(0), - m_document(doc), - m_scene(projectscene), - m_cursorLine(NULL), - m_operationMode(NONE), - m_moveOpMode(NONE), - m_dragItem(NULL), - m_dragGuide(NULL), - m_visualTip(NULL), - m_animation(NULL), - m_clickPoint(), - m_autoScroll(KdenliveSettings::autoscroll()), - m_pasteEffectsAction(NULL), - m_ungroupAction(NULL), - m_scrollOffset(0), - m_clipDrag(false), - m_findIndex(0), - m_tool(SELECTTOOL), - m_copiedItems(), - m_menuPosition(), - m_blockRefresh(false), - m_selectionGroup(NULL), - m_selectedTrack(0) -{ - if (doc) m_commandStack = doc->commandStack(); - else m_commandStack = NULL; - setMouseTracking(true); - setAcceptDrops(true); - setFrameShape(QFrame::NoFrame); - setLineWidth(0); - //setCacheMode(QGraphicsView::CacheBackground); - //setViewportUpdateMode(QGraphicsView::FullViewportUpdate); - - KdenliveSettings::setTrackheight(m_tracksHeight); - m_animationTimer = new QTimeLine(800); - m_animationTimer->setFrameRange(0, 5); - m_animationTimer->setUpdateInterval(100); - m_animationTimer->setLoopCount(0); - m_tipColor = QColor(0, 192, 0, 200); - QColor border = QColor(255, 255, 255, 100); - m_tipPen.setColor(border); - m_tipPen.setWidth(3); - setContentsMargins(0, 0, 0, 0); - const int maxHeight = m_tracksHeight * m_document->tracksCount(); - setSceneRect(0, 0, sceneRect().width(), maxHeight); - verticalScrollBar()->setMaximum(maxHeight); - m_cursorLine = projectscene->addLine(0, 0, 0, maxHeight); - m_cursorLine->setZValue(1000); - - QPen pen1 = QPen(); - pen1.setWidth(1); - pen1.setColor(palette().text().color()); - m_cursorLine->setPen(pen1); - m_cursorLine->setFlag(QGraphicsItem::ItemIgnoresTransformations, true); - - KIcon razorIcon("edit-cut"); - m_razorCursor = QCursor(razorIcon.pixmap(22, 22)); - - KIcon spacerIcon("kdenlive-spacer-tool"); - m_spacerCursor = QCursor(spacerIcon.pixmap(22, 22)); - verticalScrollBar()->setTracking(true); - // Line below was supposed to scroll guides label with scrollbar, not implemented yet - //connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(slotRefreshGuides())); - connect(&m_scrollTimer, SIGNAL(timeout()), this, SLOT(slotCheckMouseScrolling())); - m_scrollTimer.setInterval(100); - m_scrollTimer.setSingleShot(true); - - connect(&m_thumbsTimer, SIGNAL(timeout()), this, SLOT(slotFetchNextThumbs())); - m_thumbsTimer.setInterval(500); - m_thumbsTimer.setSingleShot(true); -} - -CustomTrackView::~CustomTrackView() -{ - qDeleteAll(m_guides); - m_guides.clear(); - m_waitingThumbs.clear(); -} - -//virtual -void CustomTrackView::keyPressEvent(QKeyEvent * event) -{ - if (event->key() == Qt::Key_Up) { - slotTrackUp(); - event->accept(); - } else if (event->key() == Qt::Key_Down) { - slotTrackDown(); - event->accept(); - } else QWidget::keyPressEvent(event); -} - -void CustomTrackView::setDocumentModified() -{ - m_document->setModified(true); -} - -void CustomTrackView::setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transition, QActionGroup *clipTypeGroup, QMenu *markermenu) -{ - m_timelineContextMenu = timeline; - m_timelineContextClipMenu = clip; - m_clipTypeGroup = clipTypeGroup; - - m_markerMenu = new QMenu(i18n("Go to marker..."), this); - m_markerMenu->setEnabled(false); - markermenu->addMenu(m_markerMenu); - connect(m_markerMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotGoToMarker(QAction *))); - QList list = m_timelineContextClipMenu->actions(); - for (int i = 0; i < list.count(); i++) { - if (list.at(i)->data().toString() == "paste_effects") m_pasteEffectsAction = list.at(i); - else if (list.at(i)->data().toString() == "ungroup_clip") m_ungroupAction = list.at(i); - } - - m_timelineContextTransitionMenu = transition; - list = m_timelineContextTransitionMenu->actions(); - for (int i = 0; i < list.count(); i++) { - if (list.at(i)->data().toString() == "auto") { - m_autoTransition = list.at(i); - break; - } - } - - m_timelineContextMenu->addSeparator(); - m_deleteGuide = new KAction(KIcon("edit-delete"), i18n("Delete Guide"), this); - connect(m_deleteGuide, SIGNAL(triggered()), this, SLOT(slotDeleteTimeLineGuide())); - m_timelineContextMenu->addAction(m_deleteGuide); - - m_editGuide = new KAction(KIcon("document-properties"), i18n("Edit Guide"), this); - connect(m_editGuide, SIGNAL(triggered()), this, SLOT(slotEditTimeLineGuide())); - m_timelineContextMenu->addAction(m_editGuide); -} - -void CustomTrackView::checkAutoScroll() -{ - m_autoScroll = KdenliveSettings::autoscroll(); -} - -/*sQList CustomTrackView::tracksList() const { - return m_scene->m_tracksList; -}*/ - -void CustomTrackView::checkTrackHeight() -{ - if (m_tracksHeight == KdenliveSettings::trackheight()) return; - m_tracksHeight = KdenliveSettings::trackheight(); - emit trackHeightChanged(); - QList itemList = items(); - ClipItem *item; - Transition *transitionitem; - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - item = (ClipItem*) itemList.at(i); - item->setRect(0, 0, item->rect().width(), m_tracksHeight - 1); - item->setPos((qreal) item->startPos().frames(m_document->fps()), (qreal) item->track() * m_tracksHeight + 1); - item->resetThumbs(true); - } else if (itemList.at(i)->type() == TRANSITIONWIDGET) { - transitionitem = (Transition*) itemList.at(i); - transitionitem->setRect(0, 0, transitionitem->rect().width(), m_tracksHeight / 3 * 2 - 1); - transitionitem->setPos((qreal) transitionitem->startPos().frames(m_document->fps()), (qreal) transitionitem->track() * m_tracksHeight + m_tracksHeight / 3 * 2); - } - } - double newHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22(); - m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), newHeight); - - for (int i = 0; i < m_guides.count(); i++) { - QLineF l = m_guides.at(i)->line(); - l.setP2(QPointF(l.x2(), newHeight)); - m_guides.at(i)->setLine(l); - } - - setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount()); -// verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount()); - KdenliveSettings::setSnaptopoints(snap); - viewport()->update(); -} - -/** Zoom or move viewport on mousewheel - * - * If mousewheel+Ctrl, zooms in/out on the timeline. - * - * With Ctrl, moves viewport towards end of timeline if down/back, - * opposite on up/forward. - * - * See also http://www.kdenlive.org/mantis/view.php?id=265 */ -void CustomTrackView::wheelEvent(QWheelEvent * e) -{ - if (e->modifiers() == Qt::ControlModifier) { - if (e->delta() > 0) emit zoomIn(); - else emit zoomOut(); - } else { - if (e->delta() <= 0) horizontalScrollBar()->setValue(horizontalScrollBar()->value() + horizontalScrollBar()->singleStep()); - else horizontalScrollBar()->setValue(horizontalScrollBar()->value() - horizontalScrollBar()->singleStep()); - } -} - -int CustomTrackView::getPreviousVideoTrack(int track) -{ - track = m_document->tracksCount() - track - 1; - track --; - for (int i = track; i > -1; i--) { - if (m_document->trackInfoAt(i).type == VIDEOTRACK) return i + 1; - } - return 0; -} - - -void CustomTrackView::slotFetchNextThumbs() -{ - if (!m_waitingThumbs.isEmpty()) { - ClipItem *item = m_waitingThumbs.takeFirst(); - while ((item == NULL) && !m_waitingThumbs.isEmpty()) { - item = m_waitingThumbs.takeFirst(); - } - if (item) item->slotFetchThumbs(); - if (!m_waitingThumbs.isEmpty()) m_thumbsTimer.start(); - } -} - -void CustomTrackView::slotCheckMouseScrolling() -{ - if (m_scrollOffset == 0) { - m_scrollTimer.stop(); - return; - } - horizontalScrollBar()->setValue(horizontalScrollBar()->value() + m_scrollOffset); - m_scrollTimer.start(); -} - -void CustomTrackView::slotCheckPositionScrolling() -{ - // If mouse is at a border of the view, scroll - if (m_moveOpMode != SEEK) return; - if (mapFromScene(m_cursorPos, 0).x() < 3) { - horizontalScrollBar()->setValue(horizontalScrollBar()->value() - 2); - QTimer::singleShot(200, this, SLOT(slotCheckPositionScrolling())); - setCursorPos(mapToScene(QPoint(-2, 0)).x()); - } else if (viewport()->width() - 3 < mapFromScene(m_cursorPos + 1, 0).x()) { - horizontalScrollBar()->setValue(horizontalScrollBar()->value() + 2); - setCursorPos(mapToScene(QPoint(viewport()->width(), 0)).x() + 1); - QTimer::singleShot(200, this, SLOT(slotCheckPositionScrolling())); - } -} - - -// virtual -void CustomTrackView::mouseMoveEvent(QMouseEvent * event) -{ - int pos = event->x(); - int mappedXPos = qMax((int)(mapToScene(event->pos()).x() + 0.5), 0); - double snappedPos = getSnapPointForPos(mappedXPos); - emit mousePosition(mappedXPos); - - if (event->buttons() & Qt::MidButton) return; - if (dragMode() == QGraphicsView::RubberBandDrag || (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL)) { - event->setAccepted(true); - m_moveOpMode = NONE; - QGraphicsView::mouseMoveEvent(event); - return; - } - - if (event->buttons() != Qt::NoButton) { - bool move = (event->pos() - m_clickEvent).manhattanLength() >= QApplication::startDragDistance(); - if (m_dragItem && m_tool == SELECTTOOL) { - if (m_operationMode == MOVE && move) { - QGraphicsView::mouseMoveEvent(event); - // If mouse is at a border of the view, scroll - if (pos < 5) { - m_scrollOffset = -30; - m_scrollTimer.start(); - } else if (viewport()->width() - pos < 10) { - m_scrollOffset = 30; - m_scrollTimer.start(); - } else if (m_scrollTimer.isActive()) m_scrollTimer.stop(); - - } else if (m_operationMode == RESIZESTART && move) { - m_document->renderer()->pause(); - m_dragItem->resizeStart((int)(snappedPos)); - } else if (m_operationMode == RESIZEEND && move) { - m_document->renderer()->pause(); - m_dragItem->resizeEnd((int)(snappedPos)); - } else if (m_operationMode == FADEIN && move) { - ((ClipItem*) m_dragItem)->setFadeIn((int)(mappedXPos - m_dragItem->startPos().frames(m_document->fps()))); - } else if (m_operationMode == FADEOUT && move) { - ((ClipItem*) m_dragItem)->setFadeOut((int)(m_dragItem->endPos().frames(m_document->fps()) - mappedXPos)); - } else if (m_operationMode == KEYFRAME && move) { - GenTime keyFramePos = GenTime(mappedXPos, m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart(); - double pos = mapToScene(event->pos()).toPoint().y(); - QRectF br = m_dragItem->sceneBoundingRect(); - double maxh = 100.0 / br.height(); - pos = (br.bottom() - pos) * maxh; - m_dragItem->updateKeyFramePos(keyFramePos, pos); - } - if (m_visualTip) { - scene()->removeItem(m_visualTip); - m_animationTimer->stop(); - delete m_animation; - m_animation = NULL; - delete m_visualTip; - m_visualTip = NULL; - } - return; - } else if (m_operationMode == MOVEGUIDE) { - if (m_visualTip) { - scene()->removeItem(m_visualTip); - m_animationTimer->stop(); - delete m_animation; - m_animation = NULL; - delete m_visualTip; - m_visualTip = NULL; - } - QGraphicsView::mouseMoveEvent(event); - return; - } else if (m_operationMode == SPACER && move && m_selectionGroup) { - // spacer tool - snappedPos = getSnapPointForPos(mappedXPos + m_spacerOffset); - if (snappedPos < 0) snappedPos = 0; - - // Make sure there is no collision - QList children = m_selectionGroup->childItems(); - QPainterPath shape = m_selectionGroup->clipGroupShape(QPointF(snappedPos - m_selectionGroup->sceneBoundingRect().left(), 0)); - QList collidingItems = scene()->items(shape, Qt::IntersectsItemShape); - collidingItems.removeAll(m_selectionGroup); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - for (int j = 0; j < subchildren.count(); j++) { - collidingItems.removeAll(subchildren.at(j)); - } - } - collidingItems.removeAll(children.at(i)); - } - bool collision = false; - int offset = 0; - for (int i = 0; i < collidingItems.count(); i++) { - if (!collidingItems.at(i)->isEnabled()) continue; - if (collidingItems.at(i)->type() == AVWIDGET && snappedPos < m_selectionGroup->sceneBoundingRect().left()) { - AbstractClipItem *item = static_cast (collidingItems.at(i)); - // Moving backward, determine best pos - QPainterPath clipPath; - clipPath.addRect(item->sceneBoundingRect()); - QPainterPath res = shape.intersected(clipPath); - offset = qMax(offset, (int)(res.boundingRect().width() + 0.5)); - } - } - snappedPos += offset; - // make sure we have no collision - shape = m_selectionGroup->clipGroupShape(QPointF(snappedPos - m_selectionGroup->sceneBoundingRect().left(), 0)); - collidingItems = scene()->items(shape, Qt::IntersectsItemShape); - collidingItems.removeAll(m_selectionGroup); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - for (int j = 0; j < subchildren.count(); j++) { - collidingItems.removeAll(subchildren.at(j)); - } - } - collidingItems.removeAll(children.at(i)); - } - - for (int i = 0; i < collidingItems.count(); i++) { - if (!collidingItems.at(i)->isEnabled()) continue; - if (collidingItems.at(i)->type() == AVWIDGET) { - collision = true; - break; - } - } - - - if (!collision) { - // Check transitions - shape = m_selectionGroup->transitionGroupShape(QPointF(snappedPos - m_selectionGroup->sceneBoundingRect().left(), 0)); - collidingItems = scene()->items(shape, Qt::IntersectsItemShape); - collidingItems.removeAll(m_selectionGroup); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - for (int j = 0; j < subchildren.count(); j++) { - collidingItems.removeAll(subchildren.at(j)); - } - } - collidingItems.removeAll(children.at(i)); - } - offset = 0; - - for (int i = 0; i < collidingItems.count(); i++) { - if (collidingItems.at(i)->type() == TRANSITIONWIDGET && snappedPos < m_selectionGroup->sceneBoundingRect().left()) { - AbstractClipItem *item = static_cast (collidingItems.at(i)); - // Moving backward, determine best pos - QPainterPath clipPath; - clipPath.addRect(item->sceneBoundingRect()); - QPainterPath res = shape.intersected(clipPath); - offset = qMax(offset, (int)(res.boundingRect().width() + 0.5)); - } - } - - snappedPos += offset; - // make sure we have no collision - shape = m_selectionGroup->transitionGroupShape(QPointF(snappedPos - m_selectionGroup->sceneBoundingRect().left(), 0)); - collidingItems = scene()->items(shape, Qt::IntersectsItemShape); - collidingItems.removeAll(m_selectionGroup); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == GROUPWIDGET) { - QList subchildren = children.at(i)->childItems(); - for (int j = 0; j < subchildren.count(); j++) { - collidingItems.removeAll(subchildren.at(j)); - } - } - collidingItems.removeAll(children.at(i)); - } - for (int i = 0; i < collidingItems.count(); i++) { - if (collidingItems.at(i)->type() == TRANSITIONWIDGET) { - collision = true; - break; - } - } - } - - if (!collision) - m_selectionGroup->translate(snappedPos - m_selectionGroup->sceneBoundingRect().left(), 0); - //m_selectionGroup->setPos(mappedXPos + (((int) m_selectionGroup->boundingRect().topLeft().x() + 0.5) - mappedClick) , m_selectionGroup->pos().y()); - } - } - - if (m_tool == RAZORTOOL) { - setCursor(m_razorCursor); - //QGraphicsView::mouseMoveEvent(event); - //return; - } else if (m_tool == SPACERTOOL) { - setCursor(m_spacerCursor); - return; - } - - QList itemList = items(event->pos()); - QGraphicsRectItem *item = NULL; - OPERATIONTYPE opMode = NONE; - - if (itemList.count() == 1 && itemList.at(0)->type() == GUIDEITEM) { - opMode = MOVEGUIDE; - } else for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) { - item = (QGraphicsRectItem*) itemList.at(i); - break; - } - } - - if (item && event->buttons() == Qt::NoButton) { - AbstractClipItem *clip = static_cast (item); - if (m_tool == RAZORTOOL) { - // razor tool over a clip, display current frame in monitor - if (false && !m_blockRefresh && item->type() == AVWIDGET) { - //TODO: solve crash when showing frame when moving razor over clip - emit showClipFrame(((ClipItem *) item)->baseClip(), QPoint(), mappedXPos - (clip->startPos() - clip->cropStart()).frames(m_document->fps())); - } - event->accept(); - return; - } - opMode = clip->operationMode(mapToScene(event->pos())); - const double size = 5; - if (opMode == m_moveOpMode) { - QGraphicsView::mouseMoveEvent(event); - return; - } else { - if (m_visualTip) { - scene()->removeItem(m_visualTip); - m_animationTimer->stop(); - delete m_animation; - m_animation = NULL; - delete m_visualTip; - m_visualTip = NULL; - } - } - m_moveOpMode = opMode; - if (opMode == MOVE) { - setCursor(Qt::OpenHandCursor); - } else if (opMode == RESIZESTART) { - setCursor(KCursor("left_side", Qt::SizeHorCursor)); - if (m_visualTip == NULL) { - QRectF rect = clip->sceneBoundingRect(); - QPolygon polygon; - polygon << QPoint(0, - size * 2); - polygon << QPoint(size * 2, 0); - polygon << QPoint(0, size * 2); - polygon << QPoint(0, - size * 2); - - m_visualTip = new QGraphicsPolygonItem(polygon); - ((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor); - ((QGraphicsPolygonItem*) m_visualTip)->setPen(m_tipPen); - m_visualTip->setPos(rect.x(), rect.y() + rect.height() / 2); - m_visualTip->setFlags(QGraphicsItem::ItemIgnoresTransformations); - m_visualTip->setZValue(100); - m_animation = new QGraphicsItemAnimation; - m_animation->setItem(m_visualTip); - m_animation->setTimeLine(m_animationTimer); - m_animation->setScaleAt(.5, 2, 1); - m_animation->setScaleAt(1, 1, 1); - scene()->addItem(m_visualTip); - m_animationTimer->start(); - } - } else if (opMode == RESIZEEND) { - setCursor(KCursor("right_side", Qt::SizeHorCursor)); - if (m_visualTip == NULL) { - QRectF rect = clip->sceneBoundingRect(); - QPolygon polygon; - polygon << QPoint(0, - size * 2); - polygon << QPoint(- size * 2, 0); - polygon << QPoint(0, size * 2); - polygon << QPoint(0, - size * 2); - - m_visualTip = new QGraphicsPolygonItem(polygon); - ((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor); - ((QGraphicsPolygonItem*) m_visualTip)->setPen(m_tipPen); - m_visualTip->setFlags(QGraphicsItem::ItemIgnoresTransformations); - m_visualTip->setPos(rect.right(), rect.y() + rect.height() / 2); - m_visualTip->setZValue(100); - m_animation = new QGraphicsItemAnimation; - m_animation->setItem(m_visualTip); - m_animation->setTimeLine(m_animationTimer); - m_animation->setScaleAt(.5, 2, 1); - m_animation->setScaleAt(1, 1, 1); - scene()->addItem(m_visualTip); - m_animationTimer->start(); - } - } else if (opMode == FADEIN) { - if (m_visualTip == NULL) { - ClipItem *item = (ClipItem *) clip; - QRectF rect = clip->sceneBoundingRect(); - m_visualTip = new QGraphicsEllipseItem(-size, -size, size * 2, size * 2); - ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor); - ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen); - m_visualTip->setPos(rect.x() + item->fadeIn(), rect.y()); - m_visualTip->setFlags(QGraphicsItem::ItemIgnoresTransformations); - m_visualTip->setZValue(100); - m_animation = new QGraphicsItemAnimation; - m_animation->setItem(m_visualTip); - m_animation->setTimeLine(m_animationTimer); - m_animation->setScaleAt(.5, 2, 2); - m_animation->setScaleAt(1, 1, 1); - scene()->addItem(m_visualTip); - m_animationTimer->start(); - } - setCursor(Qt::PointingHandCursor); - } else if (opMode == FADEOUT) { - if (m_visualTip == NULL) { - ClipItem *item = (ClipItem *) clip; - QRectF rect = clip->sceneBoundingRect(); - m_visualTip = new QGraphicsEllipseItem(-size, -size, size * 2, size * 2); - ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor); - ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen); - m_visualTip->setPos(rect.right() - item->fadeOut(), rect.y()); - m_visualTip->setFlags(QGraphicsItem::ItemIgnoresTransformations); - m_visualTip->setZValue(100); - m_animation = new QGraphicsItemAnimation; - m_animation->setItem(m_visualTip); - m_animation->setTimeLine(m_animationTimer); - m_animation->setScaleAt(.5, 2, 2); - m_animation->setScaleAt(1, 1, 1); - scene()->addItem(m_visualTip); - m_animationTimer->start(); - } - setCursor(Qt::PointingHandCursor); - } else if (opMode == TRANSITIONSTART) { - if (m_visualTip == NULL) { - QRectF rect = clip->sceneBoundingRect(); - QPolygon polygon; - polygon << QPoint(0, - size * 2); - polygon << QPoint(size * 2, 0); - polygon << QPoint(0, 0); - polygon << QPoint(0, - size * 2); - - m_visualTip = new QGraphicsPolygonItem(polygon); - ((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor); - ((QGraphicsPolygonItem*) m_visualTip)->setPen(m_tipPen); - m_visualTip->setPos(rect.x(), rect.bottom()); - m_visualTip->setFlags(QGraphicsItem::ItemIgnoresTransformations); - m_visualTip->setZValue(100); - m_animation = new QGraphicsItemAnimation; - m_animation->setItem(m_visualTip); - m_animation->setTimeLine(m_animationTimer); - m_animation->setScaleAt(.5, 2, 2); - m_animation->setScaleAt(1, 1, 1); - scene()->addItem(m_visualTip); - m_animationTimer->start(); - } - setCursor(Qt::PointingHandCursor); - } else if (opMode == TRANSITIONEND) { - if (m_visualTip == NULL) { - QRectF rect = clip->sceneBoundingRect(); - QPolygon polygon; - polygon << QPoint(0, - size * 2); - polygon << QPoint(- size * 2, 0); - polygon << QPoint(0, 0); - polygon << QPoint(0, - size * 2); - - m_visualTip = new QGraphicsPolygonItem(polygon); - ((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor); - ((QGraphicsPolygonItem*) m_visualTip)->setPen(m_tipPen); - m_visualTip->setPos(rect.right(), rect.bottom()); - m_visualTip->setFlags(QGraphicsItem::ItemIgnoresTransformations); - m_visualTip->setZValue(100); - m_animation = new QGraphicsItemAnimation; - m_animation->setItem(m_visualTip); - m_animation->setTimeLine(m_animationTimer); - m_animation->setScaleAt(.5, 2, 2); - m_animation->setScaleAt(1, 1, 1); - scene()->addItem(m_visualTip); - m_animationTimer->start(); - } - setCursor(Qt::PointingHandCursor); - } else if (opMode == KEYFRAME) { - setCursor(Qt::PointingHandCursor); - } - } // no clip under mouse - else if (m_tool == RAZORTOOL) { - event->accept(); - return; - } else if (opMode == MOVEGUIDE) { - m_moveOpMode = opMode; - setCursor(Qt::SplitHCursor); - } else { - if (m_visualTip) { - scene()->removeItem(m_visualTip); - m_animationTimer->stop(); - delete m_animation; - m_animation = NULL; - delete m_visualTip; - m_visualTip = NULL; - - } - setCursor(Qt::ArrowCursor); - if (event->buttons() != Qt::NoButton && event->modifiers() == Qt::NoModifier) { - QGraphicsView::mouseMoveEvent(event); - m_moveOpMode = SEEK; - setCursorPos(mappedXPos); - slotCheckPositionScrolling(); - return; - } else m_moveOpMode = NONE; - } - QGraphicsView::mouseMoveEvent(event); -} - -// virtual -void CustomTrackView::mousePressEvent(QMouseEvent * event) -{ - setFocus(Qt::MouseFocusReason); - m_menuPosition = QPoint(); - - // special cases (middle click button or ctrl / shift click - if (event->button() == Qt::MidButton) { - emit playMonitor(); - m_blockRefresh = false; - m_operationMode = NONE; - return; - } - - if (event->modifiers() & Qt::ShiftModifier) { - // Rectangle selection - setViewportUpdateMode(QGraphicsView::FullViewportUpdate); - setDragMode(QGraphicsView::RubberBandDrag); - if (!(event->modifiers() & Qt::ControlModifier)) { - resetSelectionGroup(); - scene()->clearSelection(); - } - m_blockRefresh = false; - m_operationMode = RUBBERSELECTION; - QGraphicsView::mousePressEvent(event); - return; - } - - m_blockRefresh = true; - m_dragGuide = NULL; - bool collision = false; - - if (m_tool != RAZORTOOL) activateMonitor(); - else if (m_document->renderer()->playSpeed() != 0.0) { - m_document->renderer()->pause(); - return; - } - m_clickEvent = event->pos(); - - // check item under mouse - QList collisionList = items(m_clickEvent); - - if (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL && collisionList.count() == 0) { - // Pressing Ctrl + left mouse button in an empty area scrolls the timeline - setDragMode(QGraphicsView::ScrollHandDrag); - QGraphicsView::mousePressEvent(event); - m_blockRefresh = false; - m_operationMode = NONE; - return; - } - - // if a guide and a clip were pressed, just select the guide - for (int i = 0; i < collisionList.count(); ++i) { - if (collisionList.at(i)->type() == GUIDEITEM) { - // a guide item was pressed - m_dragGuide = (Guide *) collisionList.at(i); - if (event->button() == Qt::LeftButton) { // move it - m_dragGuide->setFlag(QGraphicsItem::ItemIsMovable, true); - collision = true; - m_operationMode = MOVEGUIDE; - // deselect all clips so that only the guide will move - m_scene->clearSelection(); - resetSelectionGroup(false); - updateSnapPoints(NULL); - QGraphicsView::mousePressEvent(event); - return; - } else // show context menu - break; - } - } - - // Find first clip, transition or group under mouse (when no guides selected) - int ct = 0; - AbstractGroupItem *dragGroup = NULL; - AbstractClipItem *collisionClip = NULL; - bool found = false; - while (!m_dragGuide && ct < collisionList.count()) { - if (collisionList.at(ct)->type() == AVWIDGET || collisionList.at(ct)->type() == TRANSITIONWIDGET) { - collisionClip = static_cast (collisionList.at(ct)); - if (collisionClip == m_dragItem) { - collisionClip = NULL; - } else m_dragItem = collisionClip; - found = true; - m_dragItemInfo = m_dragItem->info(); - if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET && m_dragItem->parentItem() != m_selectionGroup) { - // kDebug()<<"// KLIK FOUND GRP: "<sceneBoundingRect(); - dragGroup = static_cast (m_dragItem->parentItem()); - } - break; - } - ct++; - } - if (!found) { - if (m_dragItem) emit clipItemSelected(NULL); - m_dragItem = NULL; - } -#if QT_VERSION >= 0x040600 - // Add shadow to dragged item, currently disabled because of painting artifacts - //TODO: re-enable when fixed - /*QGraphicsDropShadowEffect *eff = new QGraphicsDropShadowEffect(); - eff->setBlurRadius(5); - eff->setOffset(3, 3); - m_dragItem->setGraphicsEffect(eff);*/ -#endif - if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) { - // update transition menu action - m_autoTransition->setChecked(static_cast(m_dragItem)->isAutomatic()); - m_autoTransition->setEnabled(true); - } else m_autoTransition->setEnabled(false); - - // context menu requested - if (event->button() == Qt::RightButton) { - if (m_dragItem) { - if (dragGroup) dragGroup->setSelected(true); - else if (!m_dragItem->isSelected()) { - resetSelectionGroup(false); - m_scene->clearSelection(); - m_dragItem->setSelected(true); - } - } else if (!m_dragGuide) { - // check if there is a guide close to mouse click - QList guidesCollisionList = items(event->pos().x() - 5, event->pos().y(), 10, 2); // a rect of height < 2 does not always collide with the guide - for (int i = 0; i < guidesCollisionList.count(); i++) { - if (guidesCollisionList.at(i)->type() == GUIDEITEM) { - m_dragGuide = static_cast (guidesCollisionList.at(i)); - break; - } - } - // keep this to support multiple guides context menu in the future (?) - /*if (guidesCollisionList.at(0)->type() != GUIDEITEM) - guidesCollisionList.removeAt(0); - } - if (!guidesCollisionList.isEmpty()) - m_dragGuide = static_cast (guidesCollisionList.at(0));*/ - } - - m_operationMode = NONE; - displayContextMenu(event->globalPos(), m_dragItem, dragGroup); - m_menuPosition = m_clickEvent; - m_dragItem = NULL; - event->accept(); - return; - } - - // No item under click - if (m_dragItem == NULL || m_tool == SPACERTOOL) { - resetSelectionGroup(false); - setCursor(Qt::ArrowCursor); - m_scene->clearSelection(); - //event->accept(); - updateClipTypeActions(NULL); - if (m_tool == SPACERTOOL) { - QList selection; - if (event->modifiers() == Qt::ControlModifier) { - // Ctrl + click, select all items on track after click position - int track = (int)(mapToScene(m_clickEvent).y() / m_tracksHeight); - if (m_document->trackInfoAt(m_document->tracksCount() - track - 1).isLocked) { - // Cannot use spacer on locked track - emit displayMessage(i18n("Cannot use spacer in a locked track"), ErrorMessage); - return; - } - - QRectF rect(mapToScene(m_clickEvent).x(), track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width() - mapToScene(m_clickEvent).x(), m_tracksHeight / 2 - 2); - - bool isOk; - selection = checkForGroups(rect, &isOk); - if (!isOk) { - // groups found on track, do not allow the move - emit displayMessage(i18n("Cannot use spacer in a track with a group"), ErrorMessage); - return; - } - - kDebug() << "SPACER TOOL + CTRL, SELECTING ALL CLIPS ON TRACK " << track << " WITH SELECTION RECT " << m_clickEvent.x() << "/" << track * m_tracksHeight + 1 << "; " << mapFromScene(sceneRect().width(), 0).x() - m_clickEvent.x() << "/" << m_tracksHeight - 2; - } else { - // Select all items on all tracks after click position - selection = items(event->pos().x(), 1, mapFromScene(sceneRect().width(), 0).x() - event->pos().x(), sceneRect().height()); - kDebug() << "SELELCTING ELEMENTS WITHIN =" << event->pos().x() << "/" << 1 << ", " << mapFromScene(sceneRect().width(), 0).x() - event->pos().x() << "/" << sceneRect().height(); - } - - QList offsetList; - // create group to hold selected items - m_selectionGroup = new AbstractGroupItem(m_document->fps()); - scene()->addItem(m_selectionGroup); - - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->parentItem() == 0 && (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET)) { - AbstractClipItem *item = static_cast(selection.at(i)); - if (item->isItemLocked()) continue; - offsetList.append(item->startPos()); - offsetList.append(item->endPos()); - m_selectionGroup->addToGroup(selection.at(i)); - selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false); - } else if (/*selection.at(i)->parentItem() == 0 && */selection.at(i)->type() == GROUPWIDGET) { - if (static_cast(selection.at(i))->isItemLocked()) continue; - QList children = selection.at(i)->childItems(); - for (int j = 0; j < children.count(); j++) { - AbstractClipItem *item = static_cast(children.at(j)); - offsetList.append(item->startPos()); - offsetList.append(item->endPos()); - } - m_selectionGroup->addToGroup(selection.at(i)); - selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false); - } else if (selection.at(i)->parentItem() && !selection.contains(selection.at(i)->parentItem())) { - if (static_cast(selection.at(i)->parentItem())->isItemLocked()) continue; - AbstractGroupItem *grp = static_cast(selection.at(i)->parentItem()); - m_selectionGroup->addToGroup(selection.at(i)->parentItem()); - selection.at(i)->parentItem()->setFlag(QGraphicsItem::ItemIsMovable, false); - } - } - m_spacerOffset = m_selectionGroup->sceneBoundingRect().left() - (int)(mapToScene(m_clickEvent).x()); - if (!offsetList.isEmpty()) { - qSort(offsetList); - QList cleandOffsetList; - GenTime startOffset = offsetList.takeFirst(); - for (int k = 0; k < offsetList.size(); k++) { - GenTime newoffset = offsetList.at(k) - startOffset; - if (newoffset != GenTime() && !cleandOffsetList.contains(newoffset)) { - cleandOffsetList.append(newoffset); - } - } - updateSnapPoints(NULL, cleandOffsetList, true); - } - m_operationMode = SPACER; - } else { - setCursorPos((int)(mapToScene(event->x(), 0).x())); - } - QGraphicsView::mousePressEvent(event); - return; - } - - // Razor tool - if (m_tool == RAZORTOOL && m_dragItem) { - if (m_dragItem->type() == TRANSITIONWIDGET) { - emit displayMessage(i18n("Cannot cut a transition"), ErrorMessage); - event->accept(); - m_dragItem = NULL; - return; - } else if (m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) { - emit displayMessage(i18n("Cannot cut a clip in a group"), ErrorMessage); - event->accept(); - m_dragItem = NULL; - return; - } - AbstractClipItem *clip = static_cast (m_dragItem); - RazorClipCommand* command = new RazorClipCommand(this, clip->info(), GenTime((int)(mapToScene(event->pos()).x()), m_document->fps())); - m_document->renderer()->pause(); - m_commandStack->push(command); - setDocumentModified(); - m_dragItem = NULL; - event->accept(); - return; - } - - bool itemSelected = false; - if (m_dragItem->isSelected()) itemSelected = true; - else if (m_dragItem->parentItem() && m_dragItem->parentItem()->isSelected()) itemSelected = true; - else if (dragGroup && dragGroup->isSelected()) itemSelected = true; - - if (event->modifiers() == Qt::ControlModifier || itemSelected == false) { - if (event->modifiers() != Qt::ControlModifier) { - resetSelectionGroup(false); - m_scene->clearSelection(); - // A refresh seems necessary otherwise in zoomed mode, some clips disappear - viewport()->update(); - } else resetSelectionGroup(); - dragGroup = NULL; - if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET) { - //kDebug()<<"// KLIK FOUND GRP: "<sceneBoundingRect(); - dragGroup = static_cast (m_dragItem->parentItem()); - } - bool selected = !m_dragItem->isSelected(); - if (dragGroup) dragGroup->setSelected(selected); - else m_dragItem->setSelected(selected); - - groupSelectedItems(); - ClipItem *clip = static_cast (m_dragItem); - updateClipTypeActions(dragGroup == NULL ? clip : NULL); - m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1); - } - - if (collisionClip != NULL || m_dragItem == NULL) { - if (m_dragItem && m_dragItem->type() == AVWIDGET && !m_dragItem->isItemLocked()) { - ClipItem *selected = static_cast (m_dragItem); - emit clipItemSelected(selected); - } else emit clipItemSelected(NULL); - } - - // If clicked item is selected, allow move - if (event->modifiers() != Qt::ControlModifier && m_operationMode == NONE) QGraphicsView::mousePressEvent(event); - - m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y())); - m_operationMode = m_dragItem->operationMode(mapToScene(event->pos())); - - // Update snap points - if (m_selectionGroup == NULL) { - if (m_operationMode == RESIZEEND || m_operationMode == RESIZESTART) updateSnapPoints(NULL); - else updateSnapPoints(m_dragItem); - } else { - QList offsetList; - QList children = m_selectionGroup->childItems(); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == AVWIDGET || children.at(i)->type() == TRANSITIONWIDGET) { - AbstractClipItem *item = static_cast (children.at(i)); - offsetList.append(item->startPos()); - offsetList.append(item->endPos()); - } - } - if (!offsetList.isEmpty()) { - qSort(offsetList); - GenTime startOffset = offsetList.takeFirst(); - QList cleandOffsetList; - for (int k = 0; k < offsetList.size(); k++) { - GenTime newoffset = offsetList.at(k) - startOffset; - if (newoffset != GenTime() && !cleandOffsetList.contains(newoffset)) { - cleandOffsetList.append(newoffset); - } - } - updateSnapPoints(NULL, cleandOffsetList, true); - } - } - - if (m_operationMode == KEYFRAME) { - m_dragItem->updateSelectedKeyFrame(); - m_blockRefresh = false; - return; - } else if (m_operationMode == MOVE) { - setCursor(Qt::ClosedHandCursor); - } else if (m_operationMode == TRANSITIONSTART && event->modifiers() != Qt::ControlModifier) { - ItemInfo info; - info.startPos = m_dragItem->startPos(); - info.track = m_dragItem->track(); - int transitiontrack = getPreviousVideoTrack(info.track); - ClipItem *transitionClip = NULL; - if (transitiontrack != 0) transitionClip = getClipItemAt((int) info.startPos.frames(m_document->fps()), m_document->tracksCount() - transitiontrack); - if (transitionClip && transitionClip->endPos() < m_dragItem->endPos()) { - info.endPos = transitionClip->endPos(); - } else { - GenTime transitionDuration(65, m_document->fps()); - if (m_dragItem->cropDuration() < transitionDuration) info.endPos = m_dragItem->endPos(); - else info.endPos = info.startPos + transitionDuration; - } - if (info.endPos == info.startPos) info.endPos = info.startPos + GenTime(65, m_document->fps()); - // Check there is no other transition at that place - double startY = info.track * m_tracksHeight + 1 + m_tracksHeight / 2; - QRectF r(info.startPos.frames(m_document->fps()), startY, (info.endPos - info.startPos).frames(m_document->fps()), m_tracksHeight / 2); - QList selection = m_scene->items(r); - bool transitionAccepted = true; - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast (selection.at(i)); - if (tr->startPos() - info.startPos > GenTime(5, m_document->fps())) { - if (tr->startPos() < info.endPos) info.endPos = tr->startPos(); - } else transitionAccepted = false; - } - } - if (transitionAccepted) slotAddTransition((ClipItem *) m_dragItem, info, transitiontrack); - else emit displayMessage(i18n("Cannot add transition"), ErrorMessage); - } else if (m_operationMode == TRANSITIONEND && event->modifiers() != Qt::ControlModifier) { - ItemInfo info; - info.endPos = GenTime(m_dragItem->endPos().frames(m_document->fps()), m_document->fps()); - info.track = m_dragItem->track(); - int transitiontrack = getPreviousVideoTrack(info.track); - ClipItem *transitionClip = NULL; - if (transitiontrack != 0) transitionClip = getClipItemAt((int) info.endPos.frames(m_document->fps()), m_document->tracksCount() - transitiontrack); - if (transitionClip && transitionClip->startPos() > m_dragItem->startPos()) { - info.startPos = transitionClip->startPos(); - } else { - GenTime transitionDuration(65, m_document->fps()); - if (m_dragItem->cropDuration() < transitionDuration) info.startPos = m_dragItem->startPos(); - else info.startPos = info.endPos - transitionDuration; - } - if (info.endPos == info.startPos) info.startPos = info.endPos - GenTime(65, m_document->fps()); - QDomElement transition = MainWindow::transitions.getEffectByTag("luma", "dissolve").cloneNode().toElement(); - EffectsList::setParameter(transition, "reverse", "1"); - - // Check there is no other transition at that place - double startY = info.track * m_tracksHeight + 1 + m_tracksHeight / 2; - QRectF r(info.startPos.frames(m_document->fps()), startY, (info.endPos - info.startPos).frames(m_document->fps()), m_tracksHeight / 2); - QList selection = m_scene->items(r); - bool transitionAccepted = true; - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast (selection.at(i)); - if (info.endPos - tr->endPos() > GenTime(5, m_document->fps())) { - if (tr->endPos() > info.startPos) info.startPos = tr->endPos(); - } else transitionAccepted = false; - } - } - if (transitionAccepted) slotAddTransition((ClipItem *) m_dragItem, info, transitiontrack, transition); - else emit displayMessage(i18n("Cannot add transition"), ErrorMessage); - - } else if ((m_operationMode == RESIZESTART || m_operationMode == RESIZEEND) && m_selectionGroup) { - resetSelectionGroup(false); - m_dragItem->setSelected(true); - } - - m_blockRefresh = false; - //kDebug()< children = m_selectionGroup->childItems(); - scene()->destroyItemGroup(m_selectionGroup); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->parentItem() == 0 && (children.at(i)->type() == AVWIDGET || children.at(i)->type() == TRANSITIONWIDGET)) { - if (!static_cast (children.at(i))->isItemLocked()) { - children.at(i)->setFlag(QGraphicsItem::ItemIsMovable, true); - children.at(i)->setSelected(selectItems); - } - } else if (children.at(i)->type() == GROUPWIDGET) { - children.at(i)->setFlag(QGraphicsItem::ItemIsMovable, true); - children.at(i)->setSelected(selectItems); - } - } - m_selectionGroup = NULL; - KdenliveSettings::setSnaptopoints(snap); - } -} - -void CustomTrackView::groupSelectedItems(bool force, bool createNewGroup) -{ - if (m_selectionGroup) { - kDebug() << "///// ERROR, TRYING TO OVERRIDE EXISTING GROUP"; - return; - } - QList selection = m_scene->selectedItems(); - if (selection.isEmpty()) return; - QRectF rectUnion; - // Find top left position of selection - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->parentItem() == 0 && (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET || selection.at(i)->type() == GROUPWIDGET)) { - rectUnion = rectUnion.united(selection.at(i)->sceneBoundingRect()); - } else if (selection.at(i)->parentItem()) { - rectUnion = rectUnion.united(selection.at(i)->parentItem()->sceneBoundingRect()); - } - } - - if (force || selection.count() > 1) { - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - if (createNewGroup) { - AbstractGroupItem *newGroup = m_document->clipManager()->createGroup(); - newGroup->setPos(rectUnion.left(), rectUnion.top() - 1); - QPointF diff = newGroup->pos(); - newGroup->translate(-diff.x(), -diff.y()); - //newGroup->translate((int) -rectUnion.left(), (int) -rectUnion.top() + 1); - - scene()->addItem(newGroup); - - // CHeck if we are trying to include a group in a group - QList groups; - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == GROUPWIDGET && !groups.contains(static_cast(selection.at(i)))) { - groups.append(static_cast(selection.at(i))); - } else if (selection.at(i)->parentItem() && !groups.contains(static_cast(selection.at(i)->parentItem()))) groups.append(static_cast(selection.at(i)->parentItem())); - } - if (!groups.isEmpty()) { - // ungroup previous groups - while (!groups.isEmpty()) { - AbstractGroupItem *grp = groups.takeFirst(); - m_document->clipManager()->removeGroup(grp); - scene()->destroyItemGroup(grp); - } - selection = m_scene->selectedItems(); - } - - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) { - newGroup->addToGroup(selection.at(i)); - selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false); - } - } - KdenliveSettings::setSnaptopoints(snap); - } else { - m_selectionGroup = new AbstractGroupItem(m_document->fps()); - m_selectionGroup->setPos(rectUnion.left(), rectUnion.top() - 1); - QPointF diff = m_selectionGroup->pos(); - //m_selectionGroup->translate((int) - rectUnion.left(), (int) -rectUnion.top() + 1); - m_selectionGroup->translate(- diff.x(), -diff.y()); - - scene()->addItem(m_selectionGroup); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->parentItem() == 0 && (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET || selection.at(i)->type() == GROUPWIDGET)) { - m_selectionGroup->addToGroup(selection.at(i)); - selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false); - } - } - KdenliveSettings::setSnaptopoints(snap); - if (m_selectionGroup) { - m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()); - m_selectionGroupInfo.track = m_selectionGroup->track(); - } - } - } else resetSelectionGroup(); -} - -void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) -{ - if (m_dragItem && m_dragItem->hasKeyFrames()) { - /*if (m_moveOpMode == KEYFRAME) { - // user double clicked on a keyframe, open edit dialog - //TODO: update for effects with several values per keyframe - QDialog d(parentWidget()); - Ui::KeyFrameDialog_UI view; - view.setupUi(&d); - view.kfr_position->setText(m_document->timecode().getTimecode(GenTime(m_dragItem->selectedKeyFramePos(), m_document->fps()) - m_dragItem->cropStart())); - view.kfr_value->setValue(m_dragItem->selectedKeyFrameValue()); - view.kfr_value->setFocus(); - if (d.exec() == QDialog::Accepted) { - int pos = m_document->timecode().getFrameCount(view.kfr_position->text()); - m_dragItem->updateKeyFramePos(GenTime(pos, m_document->fps()) + m_dragItem->cropStart(), (double) view.kfr_value->value() * m_dragItem->keyFrameFactor()); - ClipItem *item = static_cast (m_dragItem); - QString previous = item->keyframes(item->selectedEffectIndex()); - item->updateKeyframeEffect(); - QString next = item->keyframes(item->selectedEffectIndex()); - EditKeyFrameCommand *command = new EditKeyFrameCommand(this, item->track(), item->startPos(), item->selectedEffectIndex(), previous, next, false); - m_commandStack->push(command); - updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect(), item->selectedEffectIndex()); - emit clipItemSelected(item, item->selectedEffectIndex()); - } - - } else*/ { - // add keyframe - GenTime keyFramePos = GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart(); - int val = m_dragItem->addKeyFrame(keyFramePos, mapToScene(event->pos()).toPoint().y()); - ClipItem * item = static_cast (m_dragItem); - //QString previous = item->keyframes(item->selectedEffectIndex()); - QDomElement oldEffect = item->selectedEffect().cloneNode().toElement(); - item->insertKeyframe(item->getEffectAt(item->selectedEffectIndex()), keyFramePos.frames(m_document->fps()), val); - //item->updateKeyframeEffect(); - //QString next = item->keyframes(item->selectedEffectIndex()); - QDomElement newEffect = item->selectedEffect().cloneNode().toElement(); - EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), oldEffect, newEffect, item->selectedEffectIndex(), false); - //EditKeyFrameCommand *command = new EditKeyFrameCommand(this, m_dragItem->track(), m_dragItem->startPos(), item->selectedEffectIndex(), previous, next, false); - m_commandStack->push(command); - updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect(), item->selectedEffectIndex()); - emit clipItemSelected(item, item->selectedEffectIndex()); - } - } else if (m_dragItem && !m_dragItem->isItemLocked()) { - GenTime minimum; - GenTime maximum; - if (m_dragItem->type() == TRANSITIONWIDGET) { - getTransitionAvailableSpace(m_dragItem, minimum, maximum); - } else { - getClipAvailableSpace(m_dragItem, minimum, maximum); - } - //kDebug()<<"// GOT MOVE POS: "<timecode(), minimum, maximum, this); - if (d.exec() == QDialog::Accepted) { - if (m_dragItem->type() == TRANSITIONWIDGET) { - // move & resize transition - ItemInfo startInfo; - startInfo.startPos = m_dragItem->startPos(); - startInfo.endPos = m_dragItem->endPos(); - startInfo.track = m_dragItem->track(); - ItemInfo endInfo; - endInfo.startPos = d.startPos(); - endInfo.endPos = endInfo.startPos + d.duration(); - endInfo.track = m_dragItem->track(); - MoveTransitionCommand *command = new MoveTransitionCommand(this, startInfo, endInfo, true); - m_commandStack->push(command); - } else { - // move and resize clip - QUndoCommand *moveCommand = new QUndoCommand(); - moveCommand->setText(i18n("Edit clip")); - ItemInfo clipInfo = m_dragItem->info(); - if (d.duration() < m_dragItem->cropDuration() || d.cropStart() != clipInfo.cropStart) { - // duration was reduced, so process it first - ItemInfo startInfo = clipInfo; - clipInfo.endPos = clipInfo.startPos + d.duration(); - clipInfo.cropStart = d.cropStart(); - new ResizeClipCommand(this, startInfo, clipInfo, true, false, moveCommand); - } - if (d.startPos() != clipInfo.startPos) { - ItemInfo startInfo = clipInfo; - clipInfo.startPos = d.startPos(); - clipInfo.endPos = m_dragItem->endPos() + (clipInfo.startPos - startInfo.startPos); - new MoveClipCommand(this, startInfo, clipInfo, true, moveCommand); - } - if (d.duration() > m_dragItem->cropDuration()) { - // duration was increased, so process it after move - ItemInfo startInfo = clipInfo; - clipInfo.endPos = clipInfo.startPos + d.duration(); - clipInfo.cropStart = d.cropStart(); - new ResizeClipCommand(this, startInfo, clipInfo, true, false, moveCommand); - } - m_commandStack->push(moveCommand); - } - } - } else { - QList collisionList = items(event->pos()); - if (collisionList.count() == 1 && collisionList.at(0)->type() == GUIDEITEM) { - Guide *editGuide = (Guide *) collisionList.at(0); - if (editGuide) slotEditGuide(editGuide->info()); - } - } -} - - -void CustomTrackView::editKeyFrame(const GenTime pos, const int track, const int index, const QString keyframes) -{ - ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), track); - if (clip) { - clip->setKeyframes(index, keyframes); - updateEffect(m_document->tracksCount() - clip->track(), clip->startPos(), clip->effectAt(index), index, false); - } else emit displayMessage(i18n("Cannot find clip with keyframe"), ErrorMessage); -} - - -void CustomTrackView::displayContextMenu(QPoint pos, AbstractClipItem *clip, AbstractGroupItem *group) -{ - m_deleteGuide->setEnabled(m_dragGuide != NULL); - m_editGuide->setEnabled(m_dragGuide != NULL); - m_markerMenu->clear(); - m_markerMenu->setEnabled(false); - if (clip == NULL) { - m_timelineContextMenu->popup(pos); - } else if (group != NULL) { - m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1); - m_ungroupAction->setEnabled(true); - updateClipTypeActions(NULL); - m_timelineContextClipMenu->popup(pos); - } else { - m_ungroupAction->setEnabled(false); - if (clip->type() == AVWIDGET) { - ClipItem *item = static_cast (clip); - //build go to marker menu - if (item->baseClip()) { - QList markers = item->baseClip()->commentedSnapMarkers(); - int offset = item->startPos().frames(m_document->fps()); - if (!markers.isEmpty()) { - for (int i = 0; i < markers.count(); i++) { - int pos = (int) markers.at(i).time().frames(m_document->timecode().fps()); - QString position = m_document->timecode().getTimecode(markers.at(i).time()) + ' ' + markers.at(i).comment(); - QAction *go = m_markerMenu->addAction(position); - go->setData(pos + offset); - } - } - m_markerMenu->setEnabled(!m_markerMenu->isEmpty()); - } - updateClipTypeActions(item); - m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1); - m_timelineContextClipMenu->popup(pos); - } else if (clip->type() == TRANSITIONWIDGET) { - m_timelineContextTransitionMenu->popup(pos); - } - } -} - -void CustomTrackView::activateMonitor() -{ - emit activateDocumentMonitor(); -} - -void CustomTrackView::insertClipCut(DocClipBase *clip, int in, int out) -{ - resetSelectionGroup(); - ItemInfo info; - info.startPos = GenTime(); - info.cropStart = GenTime(in, m_document->fps()); - info.endPos = GenTime(out - in, m_document->fps()); - info.cropDuration = info.endPos - info.startPos; - info.track = 0; - - // Check if clip can be inserted at that position - ItemInfo pasteInfo = info; - pasteInfo.startPos = GenTime(m_cursorPos, m_document->fps()); - pasteInfo.endPos = pasteInfo.startPos + info.endPos; - pasteInfo.track = selectedTrack(); - if (!canBePastedTo(pasteInfo, AVWIDGET)) { - emit displayMessage(i18n("Cannot insert clip in timeline"), ErrorMessage); - return; - } - - AddTimelineClipCommand *command = new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), pasteInfo, EffectsList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, true, false); - m_commandStack->push(command); -} - -bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint pos) -{ - if (data->hasFormat("kdenlive/clip")) { - m_clipDrag = true; - m_scene->clearSelection(); - resetSelectionGroup(false); - QStringList list = QString(data->data("kdenlive/clip")).split(';'); - DocClipBase *clip = m_document->getBaseClip(list.at(0)); - if (clip == NULL) { - kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << list.at(0); - return false; - } - QPointF framePos = mapToScene(pos); - ItemInfo info; - info.startPos = GenTime(); - info.cropStart = GenTime(list.at(1).toInt(), m_document->fps()); - info.endPos = GenTime(list.at(2).toInt() - list.at(1).toInt(), m_document->fps()); - info.cropDuration = info.endPos - info.startPos; - info.track = 0; - - // Check if clip can be inserted at that position - ItemInfo pasteInfo = info; - pasteInfo.startPos = GenTime((int)(framePos.x() + 0.5), m_document->fps()); - pasteInfo.endPos = pasteInfo.startPos + info.endPos; - pasteInfo.track = (int)(framePos.y() / m_tracksHeight); - framePos.setX((int)(framePos.x() + 0.5)); - framePos.setY(pasteInfo.track * m_tracksHeight); - if (!canBePastedTo(pasteInfo, AVWIDGET)) { - return true; - } - m_selectionGroup = new AbstractGroupItem(m_document->fps()); - ClipItem *item = new ClipItem(clip, info, m_document->fps(), 1.0, 1); - m_selectionGroup->addToGroup(item); - item->setFlag(QGraphicsItem::ItemIsMovable, false); - - QList offsetList; - offsetList.append(info.endPos); - updateSnapPoints(NULL, offsetList); - m_selectionGroup->setPos(framePos); - scene()->addItem(m_selectionGroup); - m_selectionGroup->setSelected(true); - return true; - } else if (data->hasFormat("kdenlive/producerslist")) { - m_clipDrag = true; - QStringList ids = QString(data->data("kdenlive/producerslist")).split(';'); - m_scene->clearSelection(); - resetSelectionGroup(false); - - QList offsetList; - QList infoList; - QPointF framePos = mapToScene(pos); - GenTime start = GenTime((int)(framePos.x() + 0.5), m_document->fps()); - int track = (int)(framePos.y() / m_tracksHeight); - framePos.setX((int)(framePos.x() + 0.5)); - framePos.setY(track * m_tracksHeight); - - // Check if clips can be inserted at that position - for (int i = 0; i < ids.size(); ++i) { - DocClipBase *clip = m_document->getBaseClip(ids.at(i)); - if (clip == NULL) { - kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << ids.at(i); - return false; - } - ItemInfo info; - info.startPos = start; - info.cropDuration = clip->duration(); - info.endPos = info.startPos + info.cropDuration; - info.track = track; - infoList.append(info); - start += clip->duration(); - } - if (!canBePastedTo(infoList, AVWIDGET)) { - return true; - } - m_selectionGroup = new AbstractGroupItem(m_document->fps()); - start = GenTime(); - for (int i = 0; i < ids.size(); ++i) { - DocClipBase *clip = m_document->getBaseClip(ids.at(i)); - ItemInfo info; - info.startPos = start; - info.cropDuration = clip->duration(); - info.endPos = info.startPos + info.cropDuration; - info.track = 0; - start += info.cropDuration; - offsetList.append(start); - ClipItem *item = new ClipItem(clip, info, m_document->fps(), 1.0, 1, false); - item->setFlag(QGraphicsItem::ItemIsMovable, false); - m_selectionGroup->addToGroup(item); - if (!clip->isPlaceHolder()) m_waitingThumbs.append(item); - } - - updateSnapPoints(NULL, offsetList); - m_selectionGroup->setPos(framePos); - scene()->addItem(m_selectionGroup); - //m_selectionGroup->setZValue(10); - m_thumbsTimer.start(); - return true; - - } else { - // the drag is not a clip (may be effect, ...) - m_clipDrag = false; - return false; - } -} - - - -void CustomTrackView::dragEnterEvent(QDragEnterEvent * event) -{ - if (insertDropClips(event->mimeData(), event->pos())) { - event->acceptProposedAction(); - } else QGraphicsView::dragEnterEvent(event); -} - -bool CustomTrackView::itemCollision(AbstractClipItem *item, ItemInfo newPos) -{ - QRectF shape = QRectF(newPos.startPos.frames(m_document->fps()), newPos.track * m_tracksHeight + 1, (newPos.endPos - newPos.startPos).frames(m_document->fps()) - 0.02, m_tracksHeight - 1); - QList collindingItems = scene()->items(shape, Qt::IntersectsItemShape); - collindingItems.removeAll(item); - if (collindingItems.isEmpty()) return false; - else { - for (int i = 0; i < collindingItems.count(); i++) { - QGraphicsItem *collision = collindingItems.at(i); - if (collision->type() == item->type()) { - // Collision - kDebug() << "// COLLISIION DETECTED"; - return true; - } - } - return false; - } -} - -void CustomTrackView::slotRefreshEffects(ClipItem *clip) -{ - int track = m_document->tracksCount() - clip->track(); - GenTime pos = clip->startPos(); - if (!m_document->renderer()->mltRemoveEffect(track, pos, "-1", false, false)) { - emit displayMessage(i18n("Problem deleting effect"), ErrorMessage); - return; - } - bool success = true; - for (int i = 0; i < clip->effectsCount(); i++) { - if (!m_document->renderer()->mltAddEffect(track, pos, clip->getEffectArgs(clip->effectAt(i)), false)) success = false; - } - if (!success) emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage); - m_document->renderer()->doRefresh(); -} - -void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect) -{ - ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track); - if (clip) { - // Special case: speed effect - if (effect.attribute("id") == "speed") { - if (clip->clipType() != VIDEO && clip->clipType() != AV && clip->clipType() != PLAYLIST) { - emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage); - return; - } - double speed = EffectsList::parameter(effect, "speed").toDouble() / 100.0; - int strobe = EffectsList::parameter(effect, "strobe").toInt(); - if (strobe == 0) strobe = 1; - doChangeClipSpeed(clip->info(), clip->speedIndependantInfo(), speed, 1.0, strobe, clip->baseClip()->getId()); - EffectsParameterList params = clip->addEffect(effect); - m_document->renderer()->mltAddEffect(track, pos, params); - if (clip->isSelected()) emit clipItemSelected(clip); - return; - } - EffectsParameterList params = clip->addEffect(effect); - if (!m_document->renderer()->mltAddEffect(track, pos, params)) - emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage); - if (clip->isSelected()) emit clipItemSelected(clip); - } else emit displayMessage(i18n("Cannot find clip to add effect"), ErrorMessage); -} - -void CustomTrackView::deleteEffect(int track, GenTime pos, QDomElement effect) -{ - QString index = effect.attribute("kdenlive_ix"); - // Special case: speed effect - if (effect.attribute("id") == "speed") { - ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track); - if (clip) { - doChangeClipSpeed(clip->info(), clip->speedIndependantInfo(), 1.0, clip->speed(), 1, clip->baseClip()->getId()); - clip->deleteEffect(index); - emit clipItemSelected(clip); - m_document->renderer()->mltRemoveEffect(track, pos, index, true); - return; - } - } - if (!m_document->renderer()->mltRemoveEffect(track, pos, index, true)) { - kDebug() << "// ERROR REMOV EFFECT: " << index << ", DISABLE: " << effect.attribute("disable"); - emit displayMessage(i18n("Problem deleting effect"), ErrorMessage); - return; - } - ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track); - if (clip) { - clip->deleteEffect(index); - emit clipItemSelected(clip); - } -} - -void CustomTrackView::slotAddGroupEffect(QDomElement effect, AbstractGroupItem *group) -{ - QList itemList = group->childItems(); - QUndoCommand *effectCommand = new QUndoCommand(); - QString effectName; - QDomNode namenode = effect.elementsByTagName("name").item(0); - if (!namenode.isNull()) effectName = i18n(namenode.toElement().text().toUtf8().data()); - else effectName = i18n("effect"); - effectCommand->setText(i18n("Add %1", effectName)); - int count = 0; - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast (itemList.at(i)); - if (effect.attribute("type") == "audio") { - // Don't add audio effects on video clips - if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) continue; - } else if (effect.hasAttribute("type") == false) { - // Don't add video effect on audio clips - if (item->isAudioOnly() || item->clipType() == AUDIO) continue; - } - - if (effect.attribute("unique", "0") != "0" && item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1) { - emit displayMessage(i18n("Effect already present in clip"), ErrorMessage); - continue; - } - if (item->isItemLocked()) { - continue; - } - item->initEffect(effect); - if (effect.attribute("tag") == "ladspa") { - QString ladpsaFile = m_document->getLadspaFile(); - initEffects::ladspaEffectFile(ladpsaFile, effect.attribute("ladspaid").toInt(), getLadspaParams(effect)); - effect.setAttribute("src", ladpsaFile); - } - new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), effect, true, effectCommand); - count++; - } - } - if (count > 0) { - m_commandStack->push(effectCommand); - setDocumentModified(); - } else delete effectCommand; -} - -void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track) -{ - QList itemList; - QUndoCommand *effectCommand = new QUndoCommand(); - QString effectName; - QDomNode namenode = effect.elementsByTagName("name").item(0); - if (!namenode.isNull()) effectName = i18n(namenode.toElement().text().toUtf8().data()); - else effectName = i18n("effect"); - effectCommand->setText(i18n("Add %1", effectName)); - - if (track == -1) itemList = scene()->selectedItems(); - if (itemList.isEmpty()) { - ClipItem *clip = getClipItemAt((int) pos.frames(m_document->fps()), track); - if (clip) itemList.append(clip); - else emit displayMessage(i18n("Select a clip if you want to apply an effect"), ErrorMessage); - } - - //expand groups - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == GROUPWIDGET) { - QList subitems = itemList.at(i)->childItems(); - for (int j = 0; j < subitems.count(); j++) { - if (!itemList.contains(subitems.at(j))) itemList.append(subitems.at(j)); - } - } - } - - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast (itemList.at(i)); - if (effect.attribute("type") == "audio") { - // Don't add audio effects on video clips - if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) { - emit displayMessage(i18n("Cannot add an audio effect to this clip"), ErrorMessage); - continue; - } - } else if (effect.hasAttribute("type") == false) { - // Don't add video effect on audio clips - if (item->isAudioOnly() || item->clipType() == AUDIO) { - emit displayMessage(i18n("Cannot add a video effect to this clip"), ErrorMessage); - continue; - } - } - if (item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1 && effect.attribute("unique", "0") != "0") { - emit displayMessage(i18n("Effect already present in clip"), ErrorMessage); - continue; - } - if (item->isItemLocked()) { - continue; - } - if (effect.attribute("id") == "freeze" && m_cursorPos > item->startPos().frames(m_document->fps()) && m_cursorPos < item->endPos().frames(m_document->fps())) { - item->initEffect(effect, m_cursorPos - item->startPos().frames(m_document->fps())); - } else item->initEffect(effect); - if (effect.attribute("tag") == "ladspa") { - QString ladpsaFile = m_document->getLadspaFile(); - initEffects::ladspaEffectFile(ladpsaFile, effect.attribute("ladspaid").toInt(), getLadspaParams(effect)); - effect.setAttribute("src", ladpsaFile); - } - new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), effect, true, effectCommand); - } - } - if (effectCommand->childCount() > 0) { - m_commandStack->push(effectCommand); - setDocumentModified(); - } else delete effectCommand; -} - -void CustomTrackView::slotDeleteEffect(ClipItem *clip, QDomElement effect, bool affectGroup) -{ - if (affectGroup && clip->parentItem() && clip->parentItem() == m_selectionGroup) { - //clip is in a group, also remove the effect in other clips of the group - QList items = m_selectionGroup->childItems(); - QUndoCommand *delCommand = new QUndoCommand(); - QString effectName; - QDomNode namenode = effect.elementsByTagName("name").item(0); - if (!namenode.isNull()) effectName = i18n(namenode.toElement().text().toUtf8().data()); - else effectName = i18n("effect"); - delCommand->setText(i18n("Delete %1", effectName)); - - //expand groups - for (int i = 0; i < items.count(); i++) { - if (items.at(i)->type() == GROUPWIDGET) { - QList subitems = items.at(i)->childItems(); - for (int j = 0; j < subitems.count(); j++) { - if (!items.contains(subitems.at(j))) items.append(subitems.at(j)); - } - } - } - - for (int i = 0; i < items.count(); i++) { - if (items.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast (items.at(i)); - int ix = item->hasEffect(effect.attribute("tag"), effect.attribute("id")); - if (ix != -1) { - QDomElement eff = item->effectAt(ix); - new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), eff, false, delCommand); - } - } - } - if (delCommand->childCount() > 0) m_commandStack->push(delCommand); - else delete delCommand; - return; - } - AddEffectCommand *command = new AddEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effect, false); - m_commandStack->push(command); - setDocumentModified(); -} - -void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedEffect, int ix, bool triggeredByUser) -{ - if (insertedEffect.isNull()) { - emit displayMessage(i18n("Problem editing effect"), ErrorMessage); - return; - } - ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track); - QDomElement effect = insertedEffect.cloneNode().toElement(); - if (clip) { - // Special case: speed effect - if (effect.attribute("id") == "speed") { - if (effect.attribute("disable") == "1") doChangeClipSpeed(clip->info(), clip->speedIndependantInfo(), 1.0, clip->speed(), 1, clip->baseClip()->getId()); - else { - double speed = EffectsList::parameter(effect, "speed").toDouble() / 100.0; - int strobe = EffectsList::parameter(effect, "strobe").toInt(); - if (strobe == 0) strobe = 1; - doChangeClipSpeed(clip->info(), clip->speedIndependantInfo(), speed, clip->speed(), strobe, clip->baseClip()->getId()); - } - clip->setEffectAt(ix, effect); - if (ix == clip->selectedEffectIndex()) { - clip->setSelectedEffect(ix); - if (!triggeredByUser) emit clipItemSelected(clip, ix); - } - return; - } - - EffectsParameterList effectParams = clip->getEffectArgs(effect); - if (effect.attribute("tag") == "ladspa") { - // Update the ladspa affect file - initEffects::ladspaEffectFile(effect.attribute("src"), effect.attribute("ladspaid").toInt(), getLadspaParams(effect)); - } - // check if we are trying to reset a keyframe effect - if (effectParams.hasParam("keyframes") && effectParams.paramValue("keyframes").isEmpty()) { - clip->initEffect(effect); - effectParams = clip->getEffectArgs(effect); - } - if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - clip->track(), clip->startPos(), effectParams)) - emit displayMessage(i18n("Problem editing effect"), ErrorMessage); - - clip->setEffectAt(ix, effect); - if (ix == clip->selectedEffectIndex()) { - clip->setSelectedEffect(ix); - if (!triggeredByUser) emit clipItemSelected(clip, ix); - } - if (effect.attribute("tag") == "volume" || effect.attribute("tag") == "brightness") { - // A fade effect was modified, update the clip - if (effect.attribute("id") == "fadein" || effect.attribute("id") == "fade_from_black") { - int pos = effectParams.paramValue("out").toInt() - effectParams.paramValue("in").toInt(); - clip->setFadeIn(pos); - } - if (effect.attribute("id") == "fadeout" || effect.attribute("id") == "fade_to_black") { - int pos = effectParams.paramValue("out").toInt() - effectParams.paramValue("in").toInt(); - clip->setFadeOut(pos); - } - } - } - setDocumentModified(); -} - -void CustomTrackView::moveEffect(int track, GenTime pos, int oldPos, int newPos) -{ - ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track); - if (clip && !clip->effectAt(newPos - 1).isNull() && !clip->effectAt(oldPos - 1).isNull()) { - QDomElement act = clip->effectAt(newPos - 1); - QDomElement before = clip->effectAt(oldPos - 1); - clip->setEffectAt(oldPos - 1, act); - clip->setEffectAt(newPos - 1, before); - // special case: speed effect, which is a pseudo-effect, not appearing in MLT's effects - if (act.attribute("id") == "speed") { - m_document->renderer()->mltUpdateEffectPosition(track, pos, oldPos, newPos); - } else if (before.attribute("id") == "speed") { - m_document->renderer()->mltUpdateEffectPosition(track, pos, newPos, oldPos); - } else m_document->renderer()->mltMoveEffect(track, pos, oldPos, newPos); - emit clipItemSelected(clip, newPos - 1); - setDocumentModified(); - } else emit displayMessage(i18n("Cannot move effect"), ErrorMessage); -} - -void CustomTrackView::slotChangeEffectState(ClipItem *clip, int effectPos, bool disable) -{ - QDomElement effect = clip->effectAt(effectPos); - QDomElement oldEffect = effect.cloneNode().toElement(); - - effect.setAttribute("disable", (int) disable); - EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, true); - m_commandStack->push(command); - setDocumentModified();; -} - -void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int currentPos, int newPos) -{ - MoveEffectCommand *command = new MoveEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), currentPos, newPos); - m_commandStack->push(command); - setDocumentModified(); -} - -void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect, QDomElement effect, int ix) -{ - EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, true); - m_commandStack->push(command); -} - -ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, bool execute) -{ - if (cut) { - // cut clip - ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track); - if (!item || cutTime >= item->endPos() || cutTime <= item->startPos()) { - emit displayMessage(i18n("Cannot find clip to cut"), ErrorMessage); - if (item) kDebug() << "///////// ERROR CUTTING CLIP : (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), INFO: (" << info.startPos.frames(25) << "-" << info.endPos.frames(25) << ")" << ", CUT: " << cutTime.frames(25); - else kDebug() << "/// ERROR NO CLIP at: " << info.startPos.frames(m_document->fps()) << ", track: " << info.track; - m_blockRefresh = false; - return NULL; - } - if (item->parentItem()) { - // Item is part of a group, reset group - resetSelectionGroup(); - } - kDebug() << "///////// CUTTING CLIP : (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), INFO: (" << info.startPos.frames(25) << "-" << info.endPos.frames(25) << ")" << ", CUT: " << cutTime.frames(25); - - if (execute) m_document->renderer()->mltCutClip(m_document->tracksCount() - info.track, cutTime); - int cutPos = (int) cutTime.frames(m_document->fps()); - ItemInfo newPos; - newPos.startPos = cutTime; - newPos.endPos = info.endPos; - newPos.cropStart = item->info().cropStart + (cutTime - info.startPos); - newPos.track = info.track; - newPos.cropDuration = newPos.endPos - newPos.startPos; - - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - ClipItem *dup = item->clone(newPos); - // remove unwanted effects (fade in) from 2nd part of cutted clip - int ix = dup->hasEffect(QString(), "fadein"); - if (ix != -1) { - QDomElement oldeffect = item->effectAt(ix); - dup->deleteEffect(oldeffect.attribute("kdenlive_ix")); - } - ix = dup->hasEffect(QString(), "fade_from_black"); - if (ix != -1) { - QDomElement oldeffect = item->effectAt(ix); - dup->deleteEffect(oldeffect.attribute("kdenlive_ix")); - } - item->resizeEnd(cutPos); - scene()->addItem(dup); - if (item->checkKeyFrames()) slotRefreshEffects(item); - if (dup->checkKeyFrames()) slotRefreshEffects(dup); - item->baseClip()->addReference(); - m_document->updateClip(item->baseClip()->getId()); - setDocumentModified(); - KdenliveSettings::setSnaptopoints(snap); - return dup; - //kDebug() << "///////// CUTTING CLIP RESULT: (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), DUP: (" << dup->startPos().frames(25) << "-" << dup->endPos().frames(25) << ")" << ", CUT: " << cutTime.frames(25); - } else { - // uncut clip - - ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track); - ClipItem *dup = getClipItemAt((int) cutTime.frames(m_document->fps()), info.track); - - if (!item || !dup || item == dup) { - emit displayMessage(i18n("Cannot find clip to uncut"), ErrorMessage); - m_blockRefresh = false; - return NULL; - } - if (m_document->renderer()->mltRemoveClip(m_document->tracksCount() - info.track, cutTime) == false) { - emit displayMessage(i18n("Error removing clip at %1 on track %2", m_document->timecode().getTimecodeFromFrames(cutTime.frames(m_document->fps())), info.track), ErrorMessage); - return NULL; - } - - /*kDebug() << "// UNCUTTING CLIPS: ITEM 1 (" << item->startPos().frames(25) << "x" << item->endPos().frames(25) << ")"; - kDebug() << "// UNCUTTING CLIPS: ITEM 2 (" << dup->startPos().frames(25) << "x" << dup->endPos().frames(25) << ")"; - kDebug() << "// UNCUTTING CLIPS, INFO (" << info.startPos.frames(25) << "x" << info.endPos.frames(25) << ") , CUT: " << cutTime.frames(25);;*/ - //deleteClip(dup->info()); - - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - - if (dup->isSelected()) emit clipItemSelected(NULL); - dup->baseClip()->removeReference(); - m_document->updateClip(dup->baseClip()->getId()); - scene()->removeItem(dup); - delete dup; - - ItemInfo clipinfo = item->info(); - clipinfo.track = m_document->tracksCount() - clipinfo.track; - bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, info.endPos - info.startPos); - if (success) { - item->resizeEnd((int) info.endPos.frames(m_document->fps())); - setDocumentModified(); - } else - emit displayMessage(i18n("Error when resizing clip"), ErrorMessage); - KdenliveSettings::setSnaptopoints(snap); - return item; - - } - //QTimer::singleShot(3000, this, SLOT(slotEnableRefresh())); -} - -void CustomTrackView::slotEnableRefresh() -{ - m_blockRefresh = false; -} - -void CustomTrackView::slotAddTransitionToSelectedClips(QDomElement transition) -{ - QList itemList = scene()->selectedItems(); - if (itemList.count() == 1) { - if (itemList.at(0)->type() == AVWIDGET) { - ClipItem *item = (ClipItem *) itemList.at(0); - ItemInfo info; - info.track = item->track(); - ClipItem *transitionClip = NULL; - const int transitiontrack = getPreviousVideoTrack(info.track); - GenTime pos = GenTime((int)(mapToScene(m_menuPosition).x()), m_document->fps()); - if (pos < item->startPos() + item->cropDuration() / 2) { - // add transition to clip start - info.startPos = item->startPos(); - if (transitiontrack != 0) transitionClip = getClipItemAt((int) info.startPos.frames(m_document->fps()), m_document->tracksCount() - transitiontrack); - if (transitionClip && transitionClip->endPos() < item->endPos()) { - info.endPos = transitionClip->endPos(); - } else info.endPos = info.startPos + GenTime(65, m_document->fps()); - // Check there is no other transition at that place - double startY = info.track * m_tracksHeight + 1 + m_tracksHeight / 2; - QRectF r(info.startPos.frames(m_document->fps()), startY, (info.endPos - info.startPos).frames(m_document->fps()), m_tracksHeight / 2); - QList selection = m_scene->items(r); - bool transitionAccepted = true; - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast (selection.at(i)); - if (tr->startPos() - info.startPos > GenTime(5, m_document->fps())) { - if (tr->startPos() < info.endPos) info.endPos = tr->startPos(); - } else transitionAccepted = false; - } - } - if (transitionAccepted) slotAddTransition(item, info, transitiontrack, transition); - else emit displayMessage(i18n("Cannot add transition"), ErrorMessage); - - } else { - // add transition to clip end - info.endPos = item->endPos(); - if (transitiontrack != 0) transitionClip = getClipItemAt((int) info.endPos.frames(m_document->fps()), m_document->tracksCount() - transitiontrack); - if (transitionClip && transitionClip->startPos() > item->startPos()) { - info.startPos = transitionClip->startPos(); - } else info.startPos = info.endPos - GenTime(65, m_document->fps()); - if (transition.attribute("tag") == "luma") EffectsList::setParameter(transition, "reverse", "1"); - else if (transition.attribute("id") == "slide") EffectsList::setParameter(transition, "invert", "1"); - - // Check there is no other transition at that place - double startY = info.track * m_tracksHeight + 1 + m_tracksHeight / 2; - QRectF r(info.startPos.frames(m_document->fps()), startY, (info.endPos - info.startPos).frames(m_document->fps()), m_tracksHeight / 2); - QList selection = m_scene->items(r); - bool transitionAccepted = true; - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast (selection.at(i)); - if (info.endPos - tr->endPos() > GenTime(5, m_document->fps())) { - if (tr->endPos() > info.startPos) info.startPos = tr->endPos(); - } else transitionAccepted = false; - } - } - if (transitionAccepted) slotAddTransition(item, info, transitiontrack, transition); - else emit displayMessage(i18n("Cannot add transition"), ErrorMessage); - } - } - } else for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *item = (ClipItem *) itemList.at(i); - ItemInfo info; - info.startPos = item->startPos(); - info.endPos = info.startPos + GenTime(65, m_document->fps()); - info.track = item->track(); - - // Check there is no other transition at that place - double startY = info.track * m_tracksHeight + 1 + m_tracksHeight / 2; - QRectF r(info.startPos.frames(m_document->fps()), startY, (info.endPos - info.startPos).frames(m_document->fps()), m_tracksHeight / 2); - QList selection = m_scene->items(r); - bool transitionAccepted = true; - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast (selection.at(i)); - if (tr->startPos() - info.startPos > GenTime(5, m_document->fps())) { - if (tr->startPos() < info.endPos) info.endPos = tr->startPos(); - } else transitionAccepted = false; - } - } - int transitiontrack = getPreviousVideoTrack(info.track); - if (transitionAccepted) slotAddTransition(item, info, transitiontrack, transition); - else emit displayMessage(i18n("Cannot add transition"), ErrorMessage); - } - } -} - -void CustomTrackView::slotAddTransition(ClipItem* /*clip*/, ItemInfo transitionInfo, int endTrack, QDomElement transition) -{ - if (transitionInfo.startPos >= transitionInfo.endPos) { - emit displayMessage(i18n("Invalid transition"), ErrorMessage); - return; - } - AddTransitionCommand* command = new AddTransitionCommand(this, transitionInfo, endTrack, transition, false, true); - m_commandStack->push(command); - setDocumentModified(); -} - -void CustomTrackView::addTransition(ItemInfo transitionInfo, int endTrack, QDomElement params, bool refresh) -{ - Transition *tr = new Transition(transitionInfo, endTrack, m_document->fps(), params, true); - //kDebug() << "---- ADDING transition " << params.attribute("value"); - if (m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - transitionInfo.track, transitionInfo.startPos, transitionInfo.endPos, tr->toXML(), refresh)) { - scene()->addItem(tr); - setDocumentModified(); - } else { - emit displayMessage(i18n("Cannot add transition"), ErrorMessage); - delete tr; - } -} - -void CustomTrackView::deleteTransition(ItemInfo transitionInfo, int endTrack, QDomElement /*params*/, bool refresh) -{ - Transition *item = getTransitionItemAt(transitionInfo.startPos, transitionInfo.track); - if (!item) { - emit displayMessage(i18n("Select clip to delete"), ErrorMessage); - return; - } - m_document->renderer()->mltDeleteTransition(item->transitionTag(), endTrack, m_document->tracksCount() - transitionInfo.track, transitionInfo.startPos, transitionInfo.endPos, item->toXML(), refresh); - if (m_dragItem == item) m_dragItem = NULL; - -#if QT_VERSION >= 0x040600 - // animate item deletion - item->closeAnimation(); -#else - delete item; -#endif - emit transitionItemSelected(NULL); - setDocumentModified(); -} - -void CustomTrackView::slotTransitionUpdated(Transition *tr, QDomElement old) -{ - //kDebug() << "TRANS UPDATE, TRACKS: " << old.attribute("transition_btrack") << ", NEW: " << tr->toXML().attribute("transition_btrack"); - EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, tr->toXML(), false); - m_commandStack->push(command); - setDocumentModified(); -} - -void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition, bool updateTransitionWidget) -{ - Transition *item = getTransitionItemAt(pos, track); - if (!item) { - kWarning() << "Unable to find transition at pos :" << pos.frames(m_document->fps()) << ", ON track: " << track; - return; - } - m_document->renderer()->mltUpdateTransition(oldTransition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_document->tracksCount() - transition.attribute("transition_atrack").toInt(), item->startPos(), item->endPos(), transition); - //kDebug() << "ORIGINAL TRACK: "<< oldTransition.attribute("transition_btrack") << ", NEW TRACK: "<setTransitionParameters(transition); - if (updateTransitionWidget) { - ItemInfo info = item->info(); - QPoint p; - ClipItem *transitionClip = getClipItemAt(info.startPos, info.track); - if (transitionClip && transitionClip->baseClip()) { - QString size = transitionClip->baseClip()->getProperty("frame_size"); - double factor = transitionClip->baseClip()->getProperty("aspect_ratio").toDouble(); - p.setX((int)(size.section('x', 0, 0).toInt() * factor + 0.5)); - p.setY(size.section('x', 1, 1).toInt()); - } - emit transitionItemSelected(item, getPreviousVideoTrack(info.track), p, true); - } - setDocumentModified(); -} - -void CustomTrackView::dragMoveEvent(QDragMoveEvent * event) -{ - if (m_clipDrag) { - const QPointF pos = mapToScene(event->pos()); - if (m_selectionGroup) { - m_selectionGroup->setPos(pos); - emit mousePosition((int)(m_selectionGroup->scenePos().x() + 0.5)); - event->acceptProposedAction(); - } else { - // Drag enter was not possible, try again at mouse position - insertDropClips(event->mimeData(), event->pos()); - event->accept(); - } - } else { - QGraphicsView::dragMoveEvent(event); - } -} - -void CustomTrackView::dragLeaveEvent(QDragLeaveEvent * event) -{ - if (m_selectionGroup && m_clipDrag) { - m_thumbsTimer.stop(); - m_waitingThumbs.clear(); - QList items = m_selectionGroup->childItems(); - qDeleteAll(items); - scene()->destroyItemGroup(m_selectionGroup); - m_selectionGroup = NULL; - } else QGraphicsView::dragLeaveEvent(event); -} - -void CustomTrackView::dropEvent(QDropEvent * event) -{ - if (m_selectionGroup && m_clipDrag) { - QList items = m_selectionGroup->childItems(); - resetSelectionGroup(); - m_scene->clearSelection(); - bool hasVideoClip = false; - QUndoCommand *addCommand = new QUndoCommand(); - addCommand->setText(i18n("Add timeline clip")); - QList brokenClips; - - for (int i = 0; i < items.count(); i++) { - ClipItem *item = static_cast (items.at(i)); - if (!hasVideoClip && (item->clipType() == AV || item->clipType() == VIDEO)) hasVideoClip = true; - if (items.count() == 1) { - updateClipTypeActions(item); - } else { - updateClipTypeActions(NULL); - } - - //TODO: take care of edit mode for undo - item->baseClip()->addReference(); - //item->setZValue(item->defaultZValue()); - m_document->updateClip(item->baseClip()->getId()); - ItemInfo info = item->info(); - - int tracknumber = m_document->tracksCount() - info.track - 1; - bool isLocked = m_document->trackInfoAt(tracknumber).isLocked; - if (isLocked) item->setItemLocked(true); - ItemInfo clipInfo = info; - clipInfo.track = m_document->tracksCount() - item->track(); - if (m_document->renderer()->mltInsertClip(clipInfo, item->xml(), item->baseClip()->producer(item->track()), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT) == -1) { - emit displayMessage(i18n("Cannot insert clip in timeline"), ErrorMessage); - brokenClips.append(item); - continue; - } - adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), addCommand); - - new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, false, false, addCommand); - - if (item->baseClip()->isTransparent() && getTransitionItemAtStart(info.startPos, info.track) == NULL) { - // add transparency transition - QDomElement trans = MainWindow::transitions.getEffectByTag("composite", "composite").cloneNode().toElement(); - new AddTransitionCommand(this, info, getPreviousVideoTrack(info.track), trans, false, true, addCommand); - } - item->setSelected(true); - } - qDeleteAll(brokenClips); - brokenClips.clear(); - if (addCommand->childCount() > 0) m_commandStack->push(addCommand); - else delete addCommand; - setDocumentModified(); - - /* - // debug info - QRectF rect(0, 1 * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), 2); - QList selection = m_scene->items(rect); - QStringList timelineList; - - kDebug()<<"// ITEMS on TRACK: "<type() == AVWIDGET) { - ClipItem *clip = static_cast (selection.at(i)); - int start = clip->startPos().frames(m_document->fps()); - int end = clip->endPos().frames(m_document->fps()); - timelineList.append(QString::number(start) + "-" + QString::number(end)); - } - } - kDebug() << "// COMPARE:\n" << timelineList << "\n-------------------"; - */ - - m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1); - if (items.count() > 1) groupSelectedItems(true); - event->setDropAction(Qt::MoveAction); - event->accept(); - } else QGraphicsView::dropEvent(event); - setFocus(); -} - -void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, ItemInfo posinfo, QUndoCommand *command) -{ - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - if (mode == OVERWRITEEDIT) { - // if we are in overwrite mode, move clips accordingly - ItemInfo info; - if (item == NULL) info = posinfo; - else info = item->info(); - QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, 5); - QList selection = m_scene->items(rect); - if (item) selection.removeAll(item); - for (int i = 0; i < selection.count(); i++) { - if (!selection.at(i)->isEnabled()) continue; - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast(selection.at(i)); - if (clip->startPos() < info.startPos) { - if (clip->endPos() > info.endPos) { - ItemInfo clipInfo = clip->info(); - ItemInfo dupInfo = clipInfo; - GenTime diff = info.startPos - clipInfo.startPos; - dupInfo.startPos = info.startPos; - dupInfo.cropStart += diff; - dupInfo.cropDuration = clipInfo.endPos - info.startPos; - ItemInfo newdupInfo = dupInfo; - GenTime diff2 = info.endPos - info.startPos; - newdupInfo.startPos = info.endPos; - newdupInfo.cropStart += diff2; - newdupInfo.cropDuration = clipInfo.endPos - info.endPos; - new RazorClipCommand(this, clipInfo, info.startPos, false, command); - new ResizeClipCommand(this, dupInfo, newdupInfo, false, false, command); - ClipItem *dup = cutClip(clipInfo, info.startPos, true, false); - if (dup) dup->resizeStart(info.endPos.frames(m_document->fps())); - } else { - ItemInfo newclipInfo = clip->info(); - newclipInfo.endPos = info.startPos; - new ResizeClipCommand(this, clip->info(), newclipInfo, false, false, command); - clip->resizeEnd(info.startPos.frames(m_document->fps())); - } - } else if (clip->endPos() <= info.endPos) { - new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), clip->info(), clip->effectList(), false, false, false, true, command); - scene()->removeItem(clip); - delete clip; - clip = NULL; - } else { - ItemInfo newclipInfo = clip->info(); - newclipInfo.startPos = info.endPos; - new ResizeClipCommand(this, clip->info(), newclipInfo, false, false, command); - clip->resizeStart(info.endPos.frames(m_document->fps())); - } - } - } - } else if (mode == INSERTEDIT) { - // if we are in push mode, move clips accordingly - ItemInfo info; - if (item == NULL) info = posinfo; - else info = item->info(); - QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, 5); - QList selection = m_scene->items(rect); - if (item) selection.removeAll(item); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast(selection.at(i)); - if (clip->startPos() < info.startPos) { - if (clip->endPos() > info.startPos) { - ItemInfo clipInfo = clip->info(); - ItemInfo dupInfo = clipInfo; - GenTime diff = info.startPos - clipInfo.startPos; - dupInfo.startPos = info.startPos; - dupInfo.cropStart += diff; - dupInfo.cropDuration = clipInfo.endPos - info.startPos; - new RazorClipCommand(this, clipInfo, info.startPos, false, command); - // Commented out; variable dup unused. --granjow - //ClipItem *dup = cutClip(clipInfo, info.startPos, true, false); - cutClip(clipInfo, info.startPos, true, false); - } - } - // TODO: add insertspacecommand - } - } - } - - KdenliveSettings::setSnaptopoints(snap); -} - - -void CustomTrackView::adjustTimelineTransitions(EDITMODE mode, Transition *item, QUndoCommand *command) -{ - if (mode == OVERWRITEEDIT) { - // if we are in overwrite or push mode, move clips accordingly - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - ItemInfo info = item->info(); - QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight, (info.endPos - info.startPos).frames(m_document->fps()) - 1, 5); - QList selection = m_scene->items(rect); - selection.removeAll(item); - for (int i = 0; i < selection.count(); i++) { - if (!selection.at(i)->isEnabled()) continue; - if (selection.at(i)->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast(selection.at(i)); - if (tr->startPos() < info.startPos) { - ItemInfo firstPos = tr->info(); - ItemInfo newPos = firstPos; - firstPos.endPos = item->startPos(); - newPos.startPos = item->endPos(); - new MoveTransitionCommand(this, tr->info(), firstPos, true, command); - if (tr->endPos() > info.endPos) { - // clone transition - new AddTransitionCommand(this, newPos, tr->transitionEndTrack(), tr->toXML(), false, true, command); - } - } else if (tr->endPos() > info.endPos) { - // just resize - ItemInfo firstPos = tr->info(); - firstPos.startPos = item->endPos(); - new MoveTransitionCommand(this, tr->info(), firstPos, true, command); - } else { - // remove transition - new AddTransitionCommand(this, tr->info(), tr->transitionEndTrack(), tr->toXML(), true, true, command); - } - } - } - KdenliveSettings::setSnaptopoints(snap); - } -} - -QStringList CustomTrackView::mimeTypes() const -{ - QStringList qstrList; - // list of accepted mime types for drop - qstrList.append("text/plain"); - qstrList.append("kdenlive/producerslist"); - qstrList.append("kdenlive/clip"); - return qstrList; -} - -Qt::DropActions CustomTrackView::supportedDropActions() const -{ - // returns what actions are supported when dropping - return Qt::MoveAction; -} - -void CustomTrackView::setDuration(int duration) -{ - int diff = qAbs(duration - sceneRect().width()); - if (diff * matrix().m11() > -50) { - if (matrix().m11() < 0.4) setSceneRect(0, 0, (duration + 100 / matrix().m11()), sceneRect().height()); - else setSceneRect(0, 0, (duration + 300), sceneRect().height()); - } - m_projectDuration = duration; -} - -int CustomTrackView::duration() const -{ - return m_projectDuration; -} - -void CustomTrackView::addTrack(TrackInfo type, int ix) -{ - if (ix == -1 || ix == m_document->tracksCount()) { - m_document->insertTrack(0, type); - m_document->renderer()->mltInsertTrack(1, type.type == VIDEOTRACK); - } else { - m_document->insertTrack(m_document->tracksCount() - ix, type); - // insert track in MLT playlist - m_document->renderer()->mltInsertTrack(m_document->tracksCount() - ix, type.type == VIDEOTRACK); - - double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2; - QRectF r(0, startY, sceneRect().width(), sceneRect().height() - startY); - QList selection = m_scene->items(r); - resetSelectionGroup(); - - m_selectionGroup = new AbstractGroupItem(m_document->fps()); - scene()->addItem(m_selectionGroup); - for (int i = 0; i < selection.count(); i++) { - if ((!selection.at(i)->parentItem()) && (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET || selection.at(i)->type() == GROUPWIDGET)) { - m_selectionGroup->addToGroup(selection.at(i)); - selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false); - } - } - // Move graphic items - m_selectionGroup->translate(0, m_tracksHeight); - - // adjust track number - QList children = m_selectionGroup->childItems(); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == GROUPWIDGET) { - AbstractGroupItem *grp = static_cast(children.at(i)); - children << grp->childItems(); - continue; - } - AbstractClipItem *item = static_cast (children.at(i)); - item->updateItem(); - ItemInfo clipinfo = item->info(); - if (item->type() == AVWIDGET) { - ClipItem *clip = static_cast (item); - // slowmotion clips are not track dependant, so no need to update them - if (clip->speed() != 1.0) continue; - // We add a move clip command so that we get the correct producer for new track number - if (clip->clipType() == AV || clip->clipType() == AUDIO) { - Mlt::Producer *prod; - if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(clipinfo.track); - else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer(); - else prod = clip->baseClip()->producer(clipinfo.track); - if (m_document->renderer()->mltUpdateClipProducer((int)(m_document->tracksCount() - clipinfo.track), clipinfo.startPos.frames(m_document->fps()), prod) == false) { - // problem updating clip - emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", clipinfo.startPos.frames(m_document->fps()), clipinfo.track), ErrorMessage); - } - } - } else if (item->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast (item); - int track = tr->transitionEndTrack(); - if (track >= ix) { - tr->updateTransitionEndTrack(getPreviousVideoTrack(clipinfo.track)); - } - } - } - resetSelectionGroup(false); - } - - int maxHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22(); - for (int i = 0; i < m_guides.count(); i++) { - QLineF l = m_guides.at(i)->line(); - l.setP2(QPointF(l.x2(), maxHeight)); - m_guides.at(i)->setLine(l); - } - m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight); - setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount()); - viewport()->update(); - emit tracksChanged(); - //QTimer::singleShot(500, this, SIGNAL(trackHeightChanged())); - //setFixedHeight(50 * m_tracksCount); -} - -void CustomTrackView::removeTrack(int ix) -{ - // Delete track in MLT playlist - m_document->renderer()->mltDeleteTrack(m_document->tracksCount() - ix); - m_document->deleteTrack(m_document->tracksCount() - ix - 1); - - double startY = ix * (m_tracksHeight + 1) + m_tracksHeight / 2; - QRectF r(0, startY, sceneRect().width(), sceneRect().height() - startY); - QList selection = m_scene->items(r); - - resetSelectionGroup(); - - m_selectionGroup = new AbstractGroupItem(m_document->fps()); - scene()->addItem(m_selectionGroup); - for (int i = 0; i < selection.count(); i++) { - if ((!selection.at(i)->parentItem()) && (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET || selection.at(i)->type() == GROUPWIDGET)) { - m_selectionGroup->addToGroup(selection.at(i)); - selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false); - } - } - // Move graphic items - qreal ydiff = 0 - (int) m_tracksHeight; - m_selectionGroup->translate(0, ydiff); - - // adjust track number - QList children = m_selectionGroup->childItems(); - //kDebug() << "// FOUND CLIPS TO MOVE: " << children.count(); - for (int i = 0; i < children.count(); i++) { - if (children.at(i)->type() == GROUPWIDGET) { - AbstractGroupItem *grp = static_cast(children.at(i)); - children << grp->childItems(); - continue; - } - if (children.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast (children.at(i)); - clip->updateItem(); - ItemInfo clipinfo = clip->info(); - // We add a move clip command so that we get the correct producer for new track number - if (clip->clipType() == AV || clip->clipType() == AUDIO) { - Mlt::Producer *prod; - if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(clipinfo.track); - else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer(); - else prod = clip->baseClip()->producer(clipinfo.track); - if (!m_document->renderer()->mltUpdateClipProducer((int)(m_document->tracksCount() - clipinfo.track), clipinfo.startPos.frames(m_document->fps()), prod)) { - emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", clipinfo.startPos.frames(m_document->fps()), clipinfo.track), ErrorMessage); - } - } - } else if (children.at(i)->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast (children.at(i)); - tr->updateItem(); - int track = tr->transitionEndTrack(); - if (track >= ix) { - ItemInfo clipinfo = tr->info(); - tr->updateTransitionEndTrack(getPreviousVideoTrack(clipinfo.track)); - } - } - } - resetSelectionGroup(false); - - int maxHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22(); - for (int i = 0; i < m_guides.count(); i++) { - QLineF l = m_guides.at(i)->line(); - l.setP2(QPointF(l.x2(), maxHeight)); - m_guides.at(i)->setLine(l); - } - m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight); - setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount()); - - m_selectedTrack = qMin(m_selectedTrack, m_document->tracksCount() - 1); - viewport()->update(); - emit tracksChanged(); - //QTimer::singleShot(500, this, SIGNAL(trackHeightChanged())); -} - -void CustomTrackView::changeTrack(int ix, TrackInfo type) -{ - int tracknumber = m_document->tracksCount() - ix; - m_document->setTrackType(tracknumber - 1, type); - m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind); - QTimer::singleShot(300, this, SIGNAL(trackHeightChanged())); - viewport()->update(); -} - - -void CustomTrackView::slotSwitchTrackAudio(int ix) -{ - /*for (int i = 0; i < m_document->tracksCount(); i++) - kDebug() << "TRK " << i << " STATE: " << m_document->trackInfoAt(i).isMute << m_document->trackInfoAt(i).isBlind;*/ - int tracknumber = m_document->tracksCount() - ix - 1; - m_document->switchTrackAudio(tracknumber, !m_document->trackInfoAt(tracknumber).isMute); - kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber).isMute << m_document->trackInfoAt(tracknumber).isBlind; - m_document->renderer()->mltChangeTrackState(tracknumber + 1, m_document->trackInfoAt(tracknumber).isMute, m_document->trackInfoAt(tracknumber).isBlind); - setDocumentModified(); -} - -void CustomTrackView::slotSwitchTrackLock(int ix) -{ - int tracknumber = m_document->tracksCount() - ix - 1; - LockTrackCommand *command = new LockTrackCommand(this, ix, !m_document->trackInfoAt(tracknumber).isLocked); - m_commandStack->push(command); -} - - -void CustomTrackView::lockTrack(int ix, bool lock) -{ - int tracknumber = m_document->tracksCount() - ix - 1; - m_document->switchTrackLock(tracknumber, lock); - emit doTrackLock(ix, lock); - QList selection = m_scene->items(0, ix * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), m_tracksHeight / 2 - 2); - - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() != AVWIDGET && selection.at(i)->type() != TRANSITIONWIDGET) continue; - if (selection.at(i)->isSelected()) { - if (selection.at(i)->type() == AVWIDGET) emit clipItemSelected(NULL); - else emit transitionItemSelected(NULL); - } - static_cast (selection.at(i))->setItemLocked(lock); - } - kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber).isLocked; - viewport()->update(); - setDocumentModified(); -} - -void CustomTrackView::slotSwitchTrackVideo(int ix) -{ - int tracknumber = m_document->tracksCount() - ix; - m_document->switchTrackVideo(tracknumber - 1, !m_document->trackInfoAt(tracknumber - 1).isBlind); - m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind); - setDocumentModified(); -} - -QList CustomTrackView::checkForGroups(const QRectF &rect, bool *ok) -{ - // Check there is no group going over several tracks there, or that would result in timeline corruption - QList selection = scene()->items(rect); - *ok = true; - int maxHeight = m_tracksHeight * 1.5; - for (int i = 0; i < selection.count(); i++) { - // Check that we don't try to move a group with clips on other tracks - if (selection.at(i)->type() == GROUPWIDGET && (selection.at(i)->boundingRect().height() >= maxHeight)) { - *ok = false; - break; - } else if (selection.at(i)->parentItem() && (selection.at(i)->parentItem()->boundingRect().height() >= maxHeight)) { - *ok = false; - break; - } - } - return selection; -} - -void CustomTrackView::slotRemoveSpace() -{ - GenTime pos; - int track = 0; - if (m_menuPosition.isNull()) { - pos = GenTime(cursorPos(), m_document->fps()); - bool ok; - track = QInputDialog::getInteger(this, i18n("Remove Space"), i18n("Track"), 0, 0, m_document->tracksCount() - 1, 1, &ok); - if (!ok) return; - } else { - pos = GenTime((int)(mapToScene(m_menuPosition).x()), m_document->fps()); - track = (int)(mapToScene(m_menuPosition).y() / m_tracksHeight); - } - - ClipItem *item = getClipItemAt(pos, track); - if (item) { - emit displayMessage(i18n("You must be in an empty space to remove space (time: %1, track: %2)", m_document->timecode().getTimecodeFromFrames(mapToScene(m_menuPosition).x()), track), ErrorMessage); - return; - } - int length = m_document->renderer()->mltGetSpaceLength(pos, m_document->tracksCount() - track, true); - //kDebug() << "// GOT LENGT; " << length; - if (length <= 0) { - emit displayMessage(i18n("You must be in an empty space to remove space (time: %1, track: %2)", m_document->timecode().getTimecodeFromFrames(mapToScene(m_menuPosition).x()), track), ErrorMessage); - return; - } - - // Make sure there is no group in the way - QRectF rect(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width() - pos.frames(m_document->fps()), m_tracksHeight / 2 - 2); - - bool isOk; - QList items = checkForGroups(rect, &isOk); - if (!isOk) { - // groups found on track, do not allow the move - emit displayMessage(i18n("Cannot remove space in a track with a group"), ErrorMessage); - return; - } - - QList clipsToMove; - QList transitionsToMove; - - for (int i = 0; i < items.count(); i++) { - if (items.at(i)->type() == AVWIDGET || items.at(i)->type() == TRANSITIONWIDGET) { - AbstractClipItem *item = static_cast (items.at(i)); - ItemInfo info = item->info(); - if (item->type() == AVWIDGET) { - clipsToMove.append(info); - } else if (item->type() == TRANSITIONWIDGET) { - transitionsToMove.append(info); - } - } - } - - InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, GenTime(-length, m_document->fps()), true); - m_commandStack->push(command); -} - -void CustomTrackView::slotInsertSpace() -{ - GenTime pos; - int track = 0; - if (m_menuPosition.isNull()) { - pos = GenTime(cursorPos(), m_document->fps()); - } else { - pos = GenTime((int)(mapToScene(m_menuPosition).x()), m_document->fps()); - track = (int)(mapToScene(m_menuPosition).y() / m_tracksHeight) + 1; - } - SpacerDialog d(GenTime(65, m_document->fps()), m_document->timecode(), track, m_document->tracksCount(), this); - if (d.exec() != QDialog::Accepted) return; - GenTime spaceDuration = d.selectedDuration(); - track = d.selectedTrack(); - - ClipItem *item = getClipItemAt(pos, track); - if (item) pos = item->startPos(); - - // Make sure there is no group in the way - QRectF rect(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width() - pos.frames(m_document->fps()), m_tracksHeight / 2 - 2); - bool isOk; - QList items = checkForGroups(rect, &isOk); - if (!isOk) { - // groups found on track, do not allow the move - emit displayMessage(i18n("Cannot insert space in a track with a group"), ErrorMessage); - return; - } - - QList clipsToMove; - QList transitionsToMove; - - for (int i = 0; i < items.count(); i++) { - if (items.at(i)->type() == AVWIDGET || items.at(i)->type() == TRANSITIONWIDGET) { - AbstractClipItem *item = static_cast (items.at(i)); - ItemInfo info = item->info(); - if (item->type() == AVWIDGET) { - clipsToMove.append(info); - } else if (item->type() == TRANSITIONWIDGET) { - transitionsToMove.append(info); - } - } - } - - InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, spaceDuration, true); - m_commandStack->push(command); -} - -void CustomTrackView::insertSpace(QList clipsToMove, QList transToMove, int track, const GenTime duration, const GenTime offset) -{ - int diff = duration.frames(m_document->fps()); - resetSelectionGroup(); - m_selectionGroup = new AbstractGroupItem(m_document->fps()); - scene()->addItem(m_selectionGroup); - ClipItem *clip; - Transition *transition; - - // Create lists with start pos for each track - QMap trackClipStartList; - QMap trackTransitionStartList; - - for (int i = 1; i < m_document->tracksCount() + 1; i++) { - trackClipStartList[i] = -1; - trackTransitionStartList[i] = -1; - } - - if (!clipsToMove.isEmpty()) for (int i = 0; i < clipsToMove.count(); i++) { - clip = getClipItemAtStart(clipsToMove.at(i).startPos + offset, clipsToMove.at(i).track); - if (clip) { - if (clip->parentItem()) { - m_selectionGroup->addToGroup(clip->parentItem()); - clip->parentItem()->setFlag(QGraphicsItem::ItemIsMovable, false); - } else { - m_selectionGroup->addToGroup(clip); - clip->setFlag(QGraphicsItem::ItemIsMovable, false); - } - if (trackClipStartList.value(m_document->tracksCount() - clipsToMove.at(i).track) == -1 || clipsToMove.at(i).startPos.frames(m_document->fps()) < trackClipStartList.value(m_document->tracksCount() - clipsToMove.at(i).track)) - trackClipStartList[m_document->tracksCount() - clipsToMove.at(i).track] = clipsToMove.at(i).startPos.frames(m_document->fps()); - } else emit { - displayMessage(i18n("Cannot move clip at position %1, track %2", m_document->timecode().getTimecodeFromFrames((clipsToMove.at(i).startPos + offset).frames(m_document->fps())), clipsToMove.at(i).track), ErrorMessage); - } - } - if (!transToMove.isEmpty()) for (int i = 0; i < transToMove.count(); i++) { - transition = getTransitionItemAtStart(transToMove.at(i).startPos + offset, transToMove.at(i).track); - if (transition) { - if (transition->parentItem()) { - m_selectionGroup->addToGroup(transition->parentItem()); - transition->parentItem()->setFlag(QGraphicsItem::ItemIsMovable, false); - } else { - m_selectionGroup->addToGroup(transition); - transition->setFlag(QGraphicsItem::ItemIsMovable, false); - } - if (trackTransitionStartList.value(m_document->tracksCount() - transToMove.at(i).track) == -1 || transToMove.at(i).startPos.frames(m_document->fps()) < trackTransitionStartList.value(m_document->tracksCount() - transToMove.at(i).track)) - trackTransitionStartList[m_document->tracksCount() - transToMove.at(i).track] = transToMove.at(i).startPos.frames(m_document->fps()); - } else emit displayMessage(i18n("Cannot move transition at position %1, track %2", m_document->timecode().getTimecodeFromFrames(transToMove.at(i).startPos.frames(m_document->fps())), transToMove.at(i).track), ErrorMessage); - } - m_selectionGroup->translate(diff, 0); - - // update items coordinates - QList itemList = m_selectionGroup->childItems(); - - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) { - static_cast < AbstractClipItem *>(itemList.at(i))->updateItem(); - } else if (itemList.at(i)->type() == GROUPWIDGET) { - QList children = itemList.at(i)->childItems(); - for (int j = 0; j < children.count(); j++) { - AbstractClipItem * clp = static_cast < AbstractClipItem *>(children.at(j)); - clp->updateItem(); - } - } - } - resetSelectionGroup(false); - if (track != -1) track = m_document->tracksCount() - track; - m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, duration, offset); -} - -void CustomTrackView::deleteClip(const QString &clipId) -{ - resetSelectionGroup(); - QList itemList = items(); - QUndoCommand *deleteCommand = new QUndoCommand(); - int count = 0; - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *item = (ClipItem *)itemList.at(i); - if (item->clipProducer() == clipId) { - count++; - if (item->parentItem()) { - // Clip is in a group, destroy the group - new GroupClipsCommand(this, QList() << item->info(), QList(), false, deleteCommand); - } - new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false, true, true, deleteCommand); - } - } - } - deleteCommand->setText(i18np("Delete timeline clip", "Delete timeline clips", count)); - if (count == 0) delete deleteCommand; - else m_commandStack->push(deleteCommand); -} - -void CustomTrackView::setCursorPos(int pos, bool seek) -{ - if (pos == m_cursorPos) return; - emit cursorMoved((int)(m_cursorPos), (int)(pos)); - m_cursorPos = pos; - if (seek) m_document->renderer()->seek(GenTime(m_cursorPos, m_document->fps())); - else if (m_autoScroll) checkScrolling(); - m_cursorLine->setPos(m_cursorPos, 0); -} - -void CustomTrackView::updateCursorPos() -{ - m_cursorLine->setPos(m_cursorPos, 0); -} - -int CustomTrackView::cursorPos() -{ - return (int)(m_cursorPos); -} - -void CustomTrackView::moveCursorPos(int delta) -{ - if (m_cursorPos + delta < 0) delta = 0 - m_cursorPos; - emit cursorMoved((int)(m_cursorPos), (int)((m_cursorPos + delta))); - m_cursorPos += delta; - m_cursorLine->setPos(m_cursorPos, 0); - m_document->renderer()->seek(GenTime(m_cursorPos, m_document->fps())); -} - -void CustomTrackView::initCursorPos(int pos) -{ - emit cursorMoved((int)(m_cursorPos), (int)(pos)); - m_cursorPos = pos; - m_cursorLine->setPos(pos, 0); - checkScrolling(); -} - -void CustomTrackView::checkScrolling() -{ - ensureVisible(m_cursorPos, verticalScrollBar()->value() + 10, 2, 2, 50, 0); -} - -void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) -{ - if (m_moveOpMode == SEEK) m_moveOpMode = NONE; - QGraphicsView::mouseReleaseEvent(event); - setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate); -#if QT_VERSION >= 0x040600 - if (m_dragItem) m_dragItem->setGraphicsEffect(NULL); -#endif - if (m_scrollTimer.isActive()) m_scrollTimer.stop(); - if (event->button() == Qt::MidButton) { - return; - } - setDragMode(QGraphicsView::NoDrag); - if (m_operationMode == MOVEGUIDE) { - setCursor(Qt::ArrowCursor); - m_operationMode = NONE; - m_dragGuide->setFlag(QGraphicsItem::ItemIsMovable, false); - GenTime newPos = GenTime(m_dragGuide->pos().x(), m_document->fps()); - if (newPos != m_dragGuide->position()) { - EditGuideCommand *command = new EditGuideCommand(this, m_dragGuide->position(), m_dragGuide->label(), newPos, m_dragGuide->label(), false); - m_commandStack->push(command); - m_dragGuide->updateGuide(GenTime(m_dragGuide->pos().x(), m_document->fps())); - qSort(m_guides.begin(), m_guides.end(), sortGuidesList); - m_document->syncGuides(m_guides); - } - m_dragGuide = NULL; - m_dragItem = NULL; - return; - } else if (m_operationMode == SPACER && m_selectionGroup) { - int track; - if (event->modifiers() != Qt::ControlModifier) { - // We are moving all tracks - track = -1; - } else track = (int)(mapToScene(m_clickEvent).y() / m_tracksHeight); - GenTime timeOffset = GenTime((int)(m_selectionGroup->scenePos().x()), m_document->fps()) - m_selectionGroupInfo.startPos; - - if (timeOffset != GenTime()) { - QList items = m_selectionGroup->childItems(); - - QList clipsToMove; - QList transitionsToMove; - - // Create lists with start pos for each track - QMap trackClipStartList; - QMap trackTransitionStartList; - - for (int i = 1; i < m_document->tracksCount() + 1; i++) { - trackClipStartList[i] = -1; - trackTransitionStartList[i] = -1; - } - - for (int i = 0; i < items.count(); i++) { - if (items.at(i)->type() == GROUPWIDGET) - items += items.at(i)->childItems(); - } - - for (int i = 0; i < items.count(); i++) { - if (items.at(i)->type() == AVWIDGET) { - AbstractClipItem *item = static_cast (items.at(i)); - ItemInfo info = item->info(); - clipsToMove.append(info); - item->updateItem(); - if (trackClipStartList.value(m_document->tracksCount() - info.track) == -1 || info.startPos.frames(m_document->fps()) < trackClipStartList.value(m_document->tracksCount() - info.track)) - trackClipStartList[m_document->tracksCount() - info.track] = info.startPos.frames(m_document->fps()); - } else if (items.at(i)->type() == TRANSITIONWIDGET) { - AbstractClipItem *item = static_cast (items.at(i)); - ItemInfo info = item->info(); - transitionsToMove.append(info); - item->updateItem(); - if (trackTransitionStartList.value(m_document->tracksCount() - info.track) == -1 || info.startPos.frames(m_document->fps()) < trackTransitionStartList.value(m_document->tracksCount() - info.track)) - trackTransitionStartList[m_document->tracksCount() - info.track] = info.startPos.frames(m_document->fps()); - } - } - - InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, timeOffset, false); - m_commandStack->push(command); - if (track != -1) track = m_document->tracksCount() - track; - kDebug() << "SPACER TRACK:" << track; - m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, timeOffset, GenTime()); - } - resetSelectionGroup(false); - m_operationMode = NONE; - } else if (m_operationMode == RUBBERSELECTION) { - //kDebug() << "// END RUBBER SELECT"; - resetSelectionGroup(); - groupSelectedItems(); - m_operationMode = NONE; - } - - if (m_dragItem == NULL && m_selectionGroup == NULL) { - emit transitionItemSelected(NULL); - return; - } - ItemInfo info; - if (m_dragItem) info = m_dragItem->info(); - - if (m_operationMode == MOVE) { - setCursor(Qt::OpenHandCursor); - if (m_dragItem->parentItem() == 0) { - // we are moving one clip, easy - if (m_dragItem->type() == AVWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) { - ClipItem *item = static_cast (m_dragItem); - Mlt::Producer *prod; - if (item->isAudioOnly()) prod = item->baseClip()->audioProducer(m_dragItemInfo.track); - else if (item->isVideoOnly()) prod = item->baseClip()->videoProducer(); - else prod = item->baseClip()->producer(m_dragItemInfo.track); - bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItem->track()), (int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItem->startPos().frames(m_document->fps())), prod, m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT); - - if (success) { - QUndoCommand *moveCommand = new QUndoCommand(); - moveCommand->setText(i18n("Move clip")); - adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), moveCommand); - - int tracknumber = m_document->tracksCount() - item->track() - 1; - bool isLocked = m_document->trackInfoAt(tracknumber).isLocked; - if (isLocked) item->setItemLocked(true); - new MoveClipCommand(this, m_dragItemInfo, info, false, moveCommand); - // Also move automatic transitions (on lower track) - Transition *startTransition = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track); - ItemInfo startTrInfo; - ItemInfo newStartTrInfo; - bool moveStartTrans = false; - bool moveEndTrans = false; - if (startTransition && startTransition->isAutomatic()) { - startTrInfo = startTransition->info(); - newStartTrInfo = startTrInfo; - newStartTrInfo.track = info.track; - newStartTrInfo.startPos = info.startPos; - if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && getClipItemAtEnd(newStartTrInfo.endPos, m_document->tracksCount() - startTransition->transitionEndTrack())) { - // transition end should stay the same - } else { - // transition end should be adjusted to clip - newStartTrInfo.endPos = newStartTrInfo.endPos + (newStartTrInfo.startPos - startTrInfo.startPos); - } - if (newStartTrInfo.startPos < newStartTrInfo.endPos) moveStartTrans = true; - } - if (startTransition == NULL || startTransition->endPos() < m_dragItemInfo.endPos) { - // Check if there is a transition at clip end - Transition *tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track); - if (tr && tr->isAutomatic()) { - ItemInfo trInfo = tr->info(); - ItemInfo newTrInfo = trInfo; - newTrInfo.track = info.track; - newTrInfo.endPos = m_dragItem->endPos(); - if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && getClipItemAtStart(trInfo.startPos, m_document->tracksCount() - tr->transitionEndTrack())) { - // transition start should stay the same - } else { - // transition start should be moved - newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos); - } - if (newTrInfo.startPos < newTrInfo.endPos) { - moveEndTrans = true; - if (moveStartTrans) { - // we have to move both transitions, remove the start one so that there is no collision - new AddTransitionCommand(this, startTrInfo, startTransition->transitionEndTrack(), startTransition->toXML(), true, true, moveCommand); - } - adjustTimelineTransitions(m_scene->editMode(), tr, moveCommand); - new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); - if (moveStartTrans) { - // re-add transition in correct place - int transTrack = startTransition->transitionEndTrack(); - if (m_dragItemInfo.track != info.track && !startTransition->forcedTrack()) { - transTrack = getPreviousVideoTrack(info.track); - } - adjustTimelineTransitions(m_scene->editMode(), startTransition, moveCommand); - new AddTransitionCommand(this, newStartTrInfo, transTrack, startTransition->toXML(), false, true, moveCommand); - } - } - } - } - - if (moveStartTrans && !moveEndTrans) { - adjustTimelineTransitions(m_scene->editMode(), startTransition, moveCommand); - new MoveTransitionCommand(this, startTrInfo, newStartTrInfo, true, moveCommand); - } - - // Also move automatic transitions (on upper track) - Transition *tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track - 1); - if (m_dragItemInfo.track == info.track && tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) { - ItemInfo trInfo = tr->info(); - ItemInfo newTrInfo = trInfo; - newTrInfo.startPos = m_dragItem->startPos(); - ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1); - if (!upperClip || !upperClip->baseClip()->isTransparent()) { - if (!getClipItemAtEnd(newTrInfo.endPos, tr->track())) { - // transition end should be adjusted to clip on upper track - newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos); - } - if (newTrInfo.startPos < newTrInfo.endPos) { - adjustTimelineTransitions(m_scene->editMode(), tr, moveCommand); - new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); - } - } - } - if (m_dragItemInfo.track == info.track && (tr == NULL || tr->endPos() < m_dragItemInfo.endPos)) { - // Check if there is a transition at clip end - tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1); - if (tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) { - ItemInfo trInfo = tr->info(); - ItemInfo newTrInfo = trInfo; - newTrInfo.endPos = m_dragItem->endPos(); - kDebug() << "CLIP ENDS AT: " << newTrInfo.endPos.frames(25); - kDebug() << "CLIP STARTS AT: " << newTrInfo.startPos.frames(25); - ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1); - if (!upperClip || !upperClip->baseClip()->isTransparent()) { - if (!getClipItemAtStart(trInfo.startPos, tr->track())) { - // transition start should be moved - newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos); - } - if (newTrInfo.startPos < newTrInfo.endPos) { - adjustTimelineTransitions(m_scene->editMode(), tr, moveCommand); - new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); - } - } - } - } - m_commandStack->push(moveCommand); - //checkTrackSequence(m_dragItem->track()); - } else { - // undo last move and emit error message - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - item->setPos((int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItemInfo.track * m_tracksHeight + 1)); - KdenliveSettings::setSnaptopoints(snap); - emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(m_dragItemInfo.startPos.frames(m_document->fps()))), ErrorMessage); - } - setDocumentModified(); - } - if (m_dragItem->type() == TRANSITIONWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) { - Transition *transition = static_cast (m_dragItem); - transition->updateTransitionEndTrack(getPreviousVideoTrack(m_dragItem->track())); - if (!m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItem->track()), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos)) { - // Moving transition failed, revert to previous position - emit displayMessage(i18n("Cannot move transition"), ErrorMessage); - transition->setPos((int) m_dragItemInfo.startPos.frames(m_document->fps()), (m_dragItemInfo.track) * m_tracksHeight + 1); - } else { - QUndoCommand *moveCommand = new QUndoCommand(); - moveCommand->setText(i18n("Move transition")); - adjustTimelineTransitions(m_scene->editMode(), transition, moveCommand); - new MoveTransitionCommand(this, m_dragItemInfo, info, false, moveCommand); - m_commandStack->push(moveCommand); - } - } - } else { - // Moving several clips. We need to delete them and readd them to new position, - // or they might overlap each other during the move - QGraphicsItemGroup *group = static_cast (m_dragItem->parentItem()); - QList items = group->childItems(); - - QList clipsToMove; - QList transitionsToMove; - - GenTime timeOffset = GenTime(m_dragItem->scenePos().x(), m_document->fps()) - m_dragItemInfo.startPos; - const int trackOffset = (int)(m_dragItem->scenePos().y() / m_tracksHeight) - m_dragItemInfo.track; - //kDebug() << "// MOVED SEVERAL CLIPS" << timeOffset.frames(25); - QUndoCommand *moveGroup = new QUndoCommand(); - moveGroup->setText(i18n("Move group")); - if (timeOffset != GenTime() || trackOffset != 0) { - // remove items in MLT playlist - - // Expand groups - int max = items.count(); - for (int i = 0; i < max; i++) { - if (items.at(i)->type() == GROUPWIDGET) { - items += items.at(i)->childItems(); - } - } - m_document->renderer()->blockSignals(true); - for (int i = 0; i < items.count(); i++) { - if (items.at(i)->type() != AVWIDGET && items.at(i)->type() != TRANSITIONWIDGET) continue; - AbstractClipItem *item = static_cast (items.at(i)); - ItemInfo info = item->info(); - if (item->type() == AVWIDGET) { - if (m_document->renderer()->mltRemoveClip(m_document->tracksCount() - info.track, info.startPos) == false) { - // error, clip cannot be removed from playlist - emit displayMessage(i18n("Error removing clip at %1 on track %2", m_document->timecode().getTimecodeFromFrames(info.startPos.frames(m_document->fps())), info.track), ErrorMessage); - } else { - clipsToMove.append(info); - } - } else { - transitionsToMove.append(info); - Transition *tr = static_cast (item); - m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML()); - } - } - m_document->renderer()->blockSignals(false); - for (int i = 0; i < items.count(); i++) { - // re-add items in correct place - if (items.at(i)->type() != AVWIDGET && items.at(i)->type() != TRANSITIONWIDGET) continue; - AbstractClipItem *item = static_cast (items.at(i)); - item->updateItem(); - ItemInfo info = item->info(); - int tracknumber = m_document->tracksCount() - info.track - 1; - bool isLocked = m_document->trackInfoAt(tracknumber).isLocked; - if (isLocked) { - group->removeFromGroup(item); - item->setItemLocked(true); - } - - if (item->type() == AVWIDGET) { - ClipItem *clip = static_cast (item); - info.track = m_document->tracksCount() - info.track; - Mlt::Producer *prod; - adjustTimelineClips(m_scene->editMode(), clip, ItemInfo(), moveGroup); - if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(info.track); - else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer(); - else prod = clip->baseClip()->producer(info.track); - m_document->renderer()->mltInsertClip(info, clip->xml(), prod, m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT); - for (int i = 0; i < clip->effectsCount(); i++) { - m_document->renderer()->mltAddEffect(info.track, info.startPos, clip->getEffectArgs(clip->effectAt(i)), false); - } - } else { - Transition *tr = static_cast (item); - int newTrack = tr->transitionEndTrack(); - if (!tr->forcedTrack()) { - newTrack = getPreviousVideoTrack(info.track); - } - tr->updateTransitionEndTrack(newTrack); - adjustTimelineTransitions(m_scene->editMode(), tr, moveGroup); - m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML()); - } - } - - new MoveGroupCommand(this, clipsToMove, transitionsToMove, timeOffset, trackOffset, false, moveGroup); - m_commandStack->push(moveGroup); - - //QPointF top = group->sceneBoundingRect().topLeft(); - //QPointF oldpos = m_selectionGroup->scenePos(); - //kDebug()<<"SELECTION GRP POS: "<scenePos()<<", TOP: "<setPos(top); - //TODO: get rid of the 3 lines below - if (m_selectionGroup) { - m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()); - m_selectionGroupInfo.track = m_selectionGroup->track(); - } - setDocumentModified(); - } - } - m_document->renderer()->doRefresh(); - } else if (m_operationMode == RESIZESTART && m_dragItem->startPos() != m_dragItemInfo.startPos) { - // resize start - if (m_dragItem->type() == AVWIDGET) { - ItemInfo resizeinfo = m_dragItemInfo; - resizeinfo.track = m_document->tracksCount() - resizeinfo.track; - bool success = m_document->renderer()->mltResizeClipStart(resizeinfo, m_dragItem->startPos() - m_dragItemInfo.startPos); - if (success) { - QUndoCommand *resizeCommand = new QUndoCommand(); - resizeCommand->setText(i18n("Resize clip")); - - // Check if there is an automatic transition on that clip (lower track) - Transition *transition = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track); - if (transition && transition->isAutomatic()) { - ItemInfo trInfo = transition->info(); - ItemInfo newTrInfo = trInfo; - newTrInfo.startPos = m_dragItem->startPos(); - if (newTrInfo.startPos < newTrInfo.endPos) - new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); - } - // Check if there is an automatic transition on that clip (upper track) - transition = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track - 1); - if (transition && transition->isAutomatic() && (m_document->tracksCount() - transition->transitionEndTrack()) == m_dragItemInfo.track) { - ItemInfo trInfo = transition->info(); - ItemInfo newTrInfo = trInfo; - newTrInfo.startPos = m_dragItem->startPos(); - ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1); - if ((!upperClip || !upperClip->baseClip()->isTransparent()) && newTrInfo.startPos < newTrInfo.endPos) { - new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); - } - } - - ClipItem *clip = static_cast < ClipItem * >(m_dragItem); - updatePositionEffects(clip, m_dragItemInfo); - - // check keyframes - QDomDocument doc; - QDomElement root = doc.createElement("list"); - doc.appendChild(root); - QList indexes; - for (int i = 0; i < clip->effectsCount(); i++) { - QDomElement effect = clip->effectAt(i); - if (EffectsList::hasKeyFrames(effect)) { - doc.appendChild(doc.importNode(effect, true)); - indexes.append(i); - } - } - - if (clip->checkEffectsKeyframesPos(m_dragItemInfo.cropStart.frames(m_document->fps()), clip->cropStart().frames(m_document->fps()), true)) { - // Keyframes were modified, updateClip - QDomNodeList effs = doc.elementsByTagName("effect"); - // Hack: - // Since we must always resize clip before updating the keyframes, we - // put a resize command before & after checking keyframes so that - // we are sure the resize is performed before whenever we do or undo the action - - new ResizeClipCommand(this, m_dragItemInfo, info, false, true, resizeCommand); - for (int i = 0; i < indexes.count(); i++) { - new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effs.at(i).cloneNode().toElement(), clip->effectAt(indexes.at(i)), indexes.at(i), false, resizeCommand); - updateEffect(m_document->tracksCount() - clip->track(), clip->startPos(), clip->effectAt(indexes.at(i)), indexes.at(i)); - } - new ResizeClipCommand(this, m_dragItemInfo, info, false, true, resizeCommand); - emit clipItemSelected(clip); - } else new ResizeClipCommand(this, m_dragItemInfo, info, false, false, resizeCommand); - - m_commandStack->push(resizeCommand); - } else { - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - m_dragItem->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps())); - KdenliveSettings::setSnaptopoints(snap); - emit displayMessage(i18n("Error when resizing clip"), ErrorMessage); - } - } else if (m_dragItem->type() == TRANSITIONWIDGET) { - Transition *transition = static_cast (m_dragItem); - if (!m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItemInfo.track), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos)) { - // Cannot resize transition - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - transition->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps())); - KdenliveSettings::setSnaptopoints(snap); - emit displayMessage(i18n("Cannot resize transition"), ErrorMessage); - } else { - MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false); - m_commandStack->push(command); - } - - } - if (m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) { - // Item was resized, rebuild group; - AbstractGroupItem *group = static_cast (m_dragItem->parentItem()); - QList children = group->childItems(); - m_document->clipManager()->removeGroup(group); - scene()->destroyItemGroup(group); - for (int i = 0; i < children.count(); i++) { - children.at(i)->setSelected(true); - } - groupSelectedItems(false, true); - } - //m_document->renderer()->doRefresh(); - } else if (m_operationMode == RESIZEEND && m_dragItem->endPos() != m_dragItemInfo.endPos) { - // resize end - if (m_dragItem->type() == AVWIDGET) { - ItemInfo resizeinfo = info; - resizeinfo.track = m_document->tracksCount() - resizeinfo.track; - bool success = m_document->renderer()->mltResizeClipEnd(resizeinfo, resizeinfo.endPos - resizeinfo.startPos); - if (success) { - QUndoCommand *resizeCommand = new QUndoCommand(); - resizeCommand->setText(i18n("Resize clip")); - - // Check if there is an automatic transition on that clip (lower track) - Transition *tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track); - if (tr && tr->isAutomatic()) { - ItemInfo trInfo = tr->info(); - ItemInfo newTrInfo = trInfo; - newTrInfo.endPos = m_dragItem->endPos(); - if (newTrInfo.endPos > newTrInfo.startPos) new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); - } - - // Check if there is an automatic transition on that clip (upper track) - tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1); - if (tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) { - ItemInfo trInfo = tr->info(); - ItemInfo newTrInfo = trInfo; - newTrInfo.endPos = m_dragItem->endPos(); - ClipItem * upperClip = getClipItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1); - if ((!upperClip || !upperClip->baseClip()->isTransparent()) && newTrInfo.endPos > newTrInfo.startPos) { - new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); - } - } - - // check keyframes - ClipItem *clip = static_cast < ClipItem * >(m_dragItem); - QDomDocument doc; - QDomElement root = doc.createElement("list"); - doc.appendChild(root); - QList indexes; - for (int i = 0; i < clip->effectsCount(); i++) { - QDomElement effect = clip->effectAt(i); - if (EffectsList::hasKeyFrames(effect)) { - doc.appendChild(doc.importNode(effect, true)); - indexes.append(i); - } - } - - if (clip->checkEffectsKeyframesPos((m_dragItemInfo.cropStart + m_dragItemInfo.endPos - m_dragItemInfo.startPos).frames(m_document->fps()) - 1, (clip->cropStart() + clip->cropDuration()).frames(m_document->fps()) - 1, false)) { - // Keyframes were modified, updateClip - QDomNodeList effs = doc.elementsByTagName("effect"); - // Hack: - // Since we must always resize clip before updating the keyframes, we - // put a resize command before & after checking keyframes so that - // we are sure the resize is performed before whenever we do or undo the action - - new ResizeClipCommand(this, m_dragItemInfo, info, false, true, resizeCommand); - for (int i = 0; i < indexes.count(); i++) { - new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effs.at(i).cloneNode().toElement(), clip->effectAt(indexes.at(i)), indexes.at(i), false, resizeCommand); - updateEffect(m_document->tracksCount() - clip->track(), clip->startPos(), clip->effectAt(indexes.at(i)), indexes.at(i)); - } - new ResizeClipCommand(this, m_dragItemInfo, info, false, true, resizeCommand); - emit clipItemSelected(clip); - } else new ResizeClipCommand(this, m_dragItemInfo, info, false, false, resizeCommand); - - m_commandStack->push(resizeCommand); - updatePositionEffects(clip, m_dragItemInfo); - } else { - m_dragItem->resizeEnd((int) m_dragItemInfo.endPos.frames(m_document->fps())); - emit displayMessage(i18n("Error when resizing clip"), ErrorMessage); - } - } else if (m_dragItem->type() == TRANSITIONWIDGET) { - Transition *transition = static_cast (m_dragItem); - if (!m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItemInfo.track), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos)) { - // Cannot resize transition - transition->resizeEnd((int) m_dragItemInfo.endPos.frames(m_document->fps())); - emit displayMessage(i18n("Cannot resize transition"), ErrorMessage); - } else { - MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false); - m_commandStack->push(command); - } - } - if (m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) { - // Item was resized, rebuild group; - AbstractGroupItem *group = static_cast (m_dragItem->parentItem()); - QList children = group->childItems(); - m_document->clipManager()->removeGroup(group); - scene()->destroyItemGroup(group); - for (int i = 0; i < children.count(); i++) { - children.at(i)->setSelected(true); - } - groupSelectedItems(false, true); - } - //m_document->renderer()->doRefresh(); - } else if (m_operationMode == FADEIN) { - // resize fade in effect - ClipItem * item = static_cast (m_dragItem); - int ix = item->hasEffect("volume", "fadein"); - int ix2 = item->hasEffect("", "fade_from_black"); - if (ix != -1) { - QDomElement oldeffect = item->effectAt(ix); - int start = item->cropStart().frames(m_document->fps()); - int end = item->fadeIn(); - if (end == 0) { - slotDeleteEffect(item, oldeffect, false); - } else { - end += start; - QDomElement effect = oldeffect.cloneNode().toElement(); - EffectsList::setParameter(oldeffect, "in", QString::number(start)); - EffectsList::setParameter(oldeffect, "out", QString::number(end)); - slotUpdateClipEffect(item, effect, oldeffect, ix); - emit clipItemSelected(item, ix); - } - } else if (item->fadeIn() != 0 && ix2 == -1) { - QDomElement effect; - if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) { - // add video fade - effect = MainWindow::videoEffects.getEffectByTag("", "fade_from_black").cloneNode().toElement(); - } else effect = MainWindow::audioEffects.getEffectByTag("volume", "fadein").cloneNode().toElement(); - EffectsList::setParameter(effect, "out", QString::number(item->fadeIn())); - slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track()); - } - if (ix2 != -1) { - QDomElement oldeffect = item->effectAt(ix2); - int start = item->cropStart().frames(m_document->fps()); - int end = item->fadeIn(); - if (end == 0) { - slotDeleteEffect(item, oldeffect, false); - } else { - end += start; - QDomElement effect = oldeffect.cloneNode().toElement(); - EffectsList::setParameter(oldeffect, "in", QString::number(start)); - EffectsList::setParameter(oldeffect, "out", QString::number(end)); - slotUpdateClipEffect(item, effect, oldeffect, ix2); - emit clipItemSelected(item, ix2); - } - } - } else if (m_operationMode == FADEOUT) { - // resize fade in effect - ClipItem * item = static_cast (m_dragItem); - int ix = item->hasEffect("volume", "fadeout"); - int ix2 = item->hasEffect("", "fade_to_black"); - if (ix != -1) { - QDomElement oldeffect = item->effectAt(ix); - int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps()); - int start = item->fadeOut(); - if (start == 0) { - slotDeleteEffect(item, oldeffect, false); - } else { - start = end - start; - QDomElement effect = oldeffect.cloneNode().toElement(); - EffectsList::setParameter(oldeffect, "in", QString::number(start)); - EffectsList::setParameter(oldeffect, "out", QString::number(end)); - // kDebug()<<"EDIT FADE OUT : "<fadeOut() != 0 && ix2 == -1) { - QDomElement effect; - if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) { - // add video fade - effect = MainWindow::videoEffects.getEffectByTag("", "fade_to_black").cloneNode().toElement(); - } else effect = MainWindow::audioEffects.getEffectByTag("volume", "fadeout").cloneNode().toElement(); - EffectsList::setParameter(effect, "in", QString::number(item->fadeOut())); - EffectsList::setParameter(effect, "out", QString::number(0)); - slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track()); - } - if (ix2 != -1) { - QDomElement oldeffect = item->effectAt(ix2); - int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps()); - int start = item->fadeOut(); - if (start == 0) { - slotDeleteEffect(item, oldeffect, false); - } else { - start = end - start; - QDomElement effect = oldeffect.cloneNode().toElement(); - EffectsList::setParameter(oldeffect, "in", QString::number(start)); - EffectsList::setParameter(oldeffect, "out", QString::number(end)); - // kDebug()<<"EDIT FADE OUT : "<(m_dragItem); - QDomElement oldEffect = item->selectedEffect().cloneNode().toElement(); - - // check if we want to remove keyframe - double val = mapToScene(event->pos()).toPoint().y(); - QRectF br = item->sceneBoundingRect(); - double maxh = 100.0 / br.height(); - val = (br.bottom() - val) * maxh; - int start = item->cropStart().frames(m_document->fps()); - int end = (item->cropStart() + item->cropDuration()).frames(m_document->fps()) - 1; - if ((val < -50 || val > 150) && item->editedKeyFramePos() != start && item->editedKeyFramePos() != end) { - //delete keyframe - kDebug() << "// DELETE KFR: " << item->editedKeyFramePos(); - item->movedKeyframe(item->getEffectAt(item->selectedEffectIndex()), item->selectedKeyFramePos(), -1, 0); - } else item->movedKeyframe(item->getEffectAt(item->selectedEffectIndex()), item->selectedKeyFramePos(), item->editedKeyFramePos(), item->editedKeyFrameValue()); - QDomElement newEffect = item->selectedEffect().cloneNode().toElement(); - //item->updateKeyframeEffect(); - //QString next = item->keyframes(item->selectedEffectIndex()); - //EditKeyFrameCommand *command = new EditKeyFrameCommand(this, item->track(), item->startPos(), item->selectedEffectIndex(), previous, next, false); - EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), oldEffect, newEffect, item->selectedEffectIndex(), false); - - m_commandStack->push(command); - updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect(), item->selectedEffectIndex()); - emit clipItemSelected(item, item->selectedEffectIndex()); - } - if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET && m_dragItem->isSelected()) { - // A transition is selected - QPoint p; - ClipItem *transitionClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track); - if (transitionClip && transitionClip->baseClip()) { - QString size = transitionClip->baseClip()->getProperty("frame_size"); - double factor = transitionClip->baseClip()->getProperty("aspect_ratio").toDouble(); - p.setX((int)(size.section('x', 0, 0).toInt() * factor + 0.5)); - p.setY(size.section('x', 1, 1).toInt()); - } - emit transitionItemSelected(static_cast (m_dragItem), getPreviousVideoTrack(m_dragItem->track()), p); - } else emit transitionItemSelected(NULL); - if (m_operationMode != NONE && m_operationMode != MOVE) setDocumentModified(); - m_operationMode = NONE; -} - -void CustomTrackView::deleteClip(ItemInfo info, bool refresh) -{ - ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track); - - if (!item || m_document->renderer()->mltRemoveClip(m_document->tracksCount() - info.track, info.startPos) == false) { - emit displayMessage(i18n("Error removing clip at %1 on track %2", m_document->timecode().getTimecodeFromFrames(info.startPos.frames(m_document->fps())), info.track), ErrorMessage); - return; - } - if (item->isSelected()) emit clipItemSelected(NULL); - item->baseClip()->removeReference(); - m_document->updateClip(item->baseClip()->getId()); - - /*if (item->baseClip()->isTransparent()) { - // also remove automatic transition - Transition *tr = getTransitionItemAt(info.startPos, info.track); - if (tr && tr->isAutomatic()) { - m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML()); - scene()->removeItem(tr); - delete tr; - } - }*/ - m_waitingThumbs.removeAll(item); - if (m_dragItem == item) m_dragItem = NULL; -#if QT_VERSION >= 0x040600 - // animate item deletion - item->closeAnimation(); - /*if (refresh) item->closeAnimation(); - else { - // no refresh, means we have several operations chained, we need to delete clip immediatly - // so that it does not get in the way of the other - delete item; - item = NULL; - }*/ -#else - delete item; - item = NULL; -#endif - - setDocumentModified(); - if (refresh) m_document->renderer()->doRefresh(); -} - -void CustomTrackView::deleteSelectedClips() -{ - resetSelectionGroup(); - QList itemList = scene()->selectedItems(); - if (itemList.count() == 0) { - emit displayMessage(i18n("Select clip to delete"), ErrorMessage); - return; - } - scene()->clearSelection(); - QUndoCommand *deleteSelected = new QUndoCommand(); - - bool resetGroup = false; - int groupCount = 0; - int clipCount = 0; - int transitionCount = 0; - // expand & destroy groups - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == GROUPWIDGET) { - groupCount++; - QList children = itemList.at(i)->childItems(); - itemList += children; - QList clipInfos; - QList transitionInfos; - GenTime currentPos = GenTime(m_cursorPos, m_document->fps()); - for (int j = 0; j < children.count(); j++) { - if (children.at(j)->type() == AVWIDGET) { - AbstractClipItem *clip = static_cast (children.at(j)); - if (!clip->isItemLocked()) clipInfos.append(clip->info()); - } else if (children.at(j)->type() == TRANSITIONWIDGET) { - AbstractClipItem *clip = static_cast (children.at(j)); - if (!clip->isItemLocked()) transitionInfos.append(clip->info()); - } - } - if (clipInfos.count() > 0) { - new GroupClipsCommand(this, clipInfos, transitionInfos, false, deleteSelected); - } - } - } - - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - clipCount++; - ClipItem *item = static_cast (itemList.at(i)); - if (item->parentItem()) resetGroup = true; - //kDebug()<<"// DELETE CLP AT: "<info().startPos.frames(25); - new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false, true, true, deleteSelected); - emit clipItemSelected(NULL); - } else if (itemList.at(i)->type() == TRANSITIONWIDGET) { - transitionCount++; - Transition *item = static_cast (itemList.at(i)); - //kDebug()<<"// DELETE TRANS AT: "<info().startPos.frames(25); - if (item->parentItem()) resetGroup = true; - new AddTransitionCommand(this, item->info(), item->transitionEndTrack(), item->toXML(), true, true, deleteSelected); - emit transitionItemSelected(NULL); - } - } - if (groupCount > 0 && clipCount == 0 && transitionCount == 0) - deleteSelected->setText(i18np("Delete selected group", "Delete selected groups", groupCount)); - else if (clipCount > 0 && groupCount == 0 && transitionCount == 0) - deleteSelected->setText(i18np("Delete selected clip", "Delete selected clips", clipCount)); - else if (transitionCount > 0 && groupCount == 0 && clipCount == 0) - deleteSelected->setText(i18np("Delete selected transition", "Delete selected transitions", transitionCount)); - else deleteSelected->setText(i18n("Delete selected items")); - m_commandStack->push(deleteSelected); -} - -void CustomTrackView::changeClipSpeed() -{ - QList itemList = scene()->selectedItems(); - if (itemList.count() == 0) { - emit displayMessage(i18n("Select clip to change speed"), ErrorMessage); - return; - } - QUndoCommand *changeSelected = new QUndoCommand(); - changeSelected->setText("Edit clip speed"); - int count = 0; - int percent = -1; - bool ok; - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast (itemList.at(i)); - ItemInfo info = item->info(); - if (percent == -1) percent = QInputDialog::getInteger(this, i18n("Edit Clip Speed"), i18n("New speed (percents)"), item->speed() * 100, 1, 10000, 1, &ok); - if (!ok) break; - double speed = (double) percent / 100.0; - if (item->speed() != speed && (item->clipType() == VIDEO || item->clipType() == AV)) { - count++; - //new ChangeSpeedCommand(this, info, item->speed(), speed, item->clipProducer(), changeSelected); - } - } - } - if (count > 0) m_commandStack->push(changeSelected); - else delete changeSelected; -} - -void CustomTrackView::doChangeClipSpeed(ItemInfo info, ItemInfo speedIndependantInfo, const double speed, const double oldspeed, int strobe, const QString &id) -{ - DocClipBase *baseclip = m_document->clipManager()->getClipById(id); - ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track); - if (!item) { - kDebug() << "ERROR: Cannot find clip for speed change"; - emit displayMessage(i18n("Cannot find clip for speed change"), ErrorMessage); - return; - } - info.track = m_document->tracksCount() - item->track(); - int endPos; - if (item->isVideoOnly()) endPos = m_document->renderer()->mltChangeClipSpeed(info, speedIndependantInfo, speed, oldspeed, strobe, baseclip->videoProducer()); - else if (item->isAudioOnly()) endPos = m_document->renderer()->mltChangeClipSpeed(info, speedIndependantInfo, speed, oldspeed, strobe, baseclip->audioProducer(item->track())); - else endPos = m_document->renderer()->mltChangeClipSpeed(info, speedIndependantInfo, speed, oldspeed, strobe, baseclip->producer()); - if (endPos >= 0) { - item->setSpeed(speed, strobe); - item->updateRectGeometry(); - if (item->cropDuration().frames(m_document->fps()) != endPos) { - item->resizeEnd((int) info.startPos.frames(m_document->fps()) + endPos - 1); - } - updatePositionEffects(item, info); - setDocumentModified(); - } else emit displayMessage(i18n("Invalid clip"), ErrorMessage); -} - -void CustomTrackView::cutSelectedClips() -{ - QList itemList = scene()->selectedItems(); - GenTime currentPos = GenTime(m_cursorPos, m_document->fps()); - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast (itemList.at(i)); - if (item->parentItem() && item->parentItem() != m_selectionGroup) { - emit displayMessage(i18n("Cannot cut a clip in a group"), ErrorMessage); - } else if (currentPos > item->startPos() && currentPos < item->endPos()) { - RazorClipCommand *command = new RazorClipCommand(this, item->info(), currentPos); - m_commandStack->push(command); - } - } - } -} - -void CustomTrackView::groupClips(bool group) -{ - QList itemList = scene()->selectedItems(); - QList clipInfos; - QList transitionInfos; - GenTime currentPos = GenTime(m_cursorPos, m_document->fps()); - - // Expand groups - int max = itemList.count(); - for (int i = 0; i < max; i++) { - if (itemList.at(i)->type() == GROUPWIDGET) { - itemList += itemList.at(i)->childItems(); - } - } - - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - AbstractClipItem *clip = static_cast (itemList.at(i)); - if (!clip->isItemLocked()) clipInfos.append(clip->info()); - } else if (itemList.at(i)->type() == TRANSITIONWIDGET) { - AbstractClipItem *clip = static_cast (itemList.at(i)); - if (!clip->isItemLocked()) transitionInfos.append(clip->info()); - } - } - if (clipInfos.count() > 0) { - GroupClipsCommand *command = new GroupClipsCommand(this, clipInfos, transitionInfos, group); - m_commandStack->push(command); - } -} - -void CustomTrackView::doGroupClips(QList clipInfos, QList transitionInfos, bool group) -{ - resetSelectionGroup(); - m_scene->clearSelection(); - if (!group) { - for (int i = 0; i < clipInfos.count(); i++) { - ClipItem *clip = getClipItemAt(clipInfos.at(i).startPos, clipInfos.at(i).track); - if (clip == NULL) continue; - if (clip->parentItem() && clip->parentItem()->type() == GROUPWIDGET) { - AbstractGroupItem *grp = static_cast (clip->parentItem()); - m_document->clipManager()->removeGroup(grp); - scene()->destroyItemGroup(grp); - } - clip->setFlag(QGraphicsItem::ItemIsMovable, true); - } - for (int i = 0; i < transitionInfos.count(); i++) { - Transition *tr = getTransitionItemAt(transitionInfos.at(i).startPos, transitionInfos.at(i).track); - if (tr == NULL) continue; - if (tr->parentItem() && tr->parentItem()->type() == GROUPWIDGET) { - AbstractGroupItem *grp = static_cast (tr->parentItem()); - m_document->clipManager()->removeGroup(grp); - scene()->destroyItemGroup(grp); - } - tr->setFlag(QGraphicsItem::ItemIsMovable, true); - } - setDocumentModified(); - return; - } - - QList groups; - for (int i = 0; i < clipInfos.count(); i++) { - ClipItem *clip = getClipItemAt(clipInfos.at(i).startPos, clipInfos.at(i).track); - if (clip) { - clip->setSelected(true); - } - } - for (int i = 0; i < transitionInfos.count(); i++) { - Transition *clip = getTransitionItemAt(transitionInfos.at(i).startPos, transitionInfos.at(i).track); - if (clip) { - clip->setSelected(true); - } - } - - groupSelectedItems(false, true); - setDocumentModified(); -} - -void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects, bool overwrite, bool push, bool refresh) -{ - DocClipBase *baseclip = m_document->clipManager()->getClipById(clipId); - if (baseclip == NULL) { - emit displayMessage(i18n("No clip copied"), ErrorMessage); - return; - } - ClipItem *item = new ClipItem(baseclip, info, m_document->fps(), xml.attribute("speed", "1").toDouble(), xml.attribute("strobe", "1").toInt()); - item->setEffectList(effects); - if (xml.hasAttribute("audio_only")) item->setAudioOnly(true); - else if (xml.hasAttribute("video_only")) item->setVideoOnly(true); - scene()->addItem(item); - - int tracknumber = m_document->tracksCount() - info.track - 1; - bool isLocked = m_document->trackInfoAt(tracknumber).isLocked; - if (isLocked) item->setItemLocked(true); - - baseclip->addReference(); - m_document->updateClip(baseclip->getId()); - info.track = m_document->tracksCount() - info.track; - Mlt::Producer *prod; - if (item->isAudioOnly()) prod = baseclip->audioProducer(info.track); - else if (item->isVideoOnly()) prod = baseclip->videoProducer(); - else prod = baseclip->producer(info.track); - m_document->renderer()->mltInsertClip(info, xml, prod, overwrite, push); - for (int i = 0; i < item->effectsCount(); i++) { - m_document->renderer()->mltAddEffect(info.track, info.startPos, item->getEffectArgs(item->effectAt(i)), false); - } - setDocumentModified(); - if (refresh) m_document->renderer()->doRefresh(); - if (!baseclip->isPlaceHolder()) m_waitingThumbs.append(item); - m_thumbsTimer.start(); -} - -void CustomTrackView::slotUpdateClip(const QString &clipId, bool reload) -{ - QList list = scene()->items(); - ClipItem *clip = NULL; - for (int i = 0; i < list.size(); ++i) { - if (list.at(i)->type() == AVWIDGET) { - clip = static_cast (list.at(i)); - if (clip->clipProducer() == clipId) { - ItemInfo info = clip->info(); - info.track = m_document->tracksCount() - clip->track(); - if (reload && !m_document->renderer()->mltUpdateClip(info, clip->xml(), clip->baseClip()->producer())) { - emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", info.startPos.frames(m_document->fps()), info.track), ErrorMessage); - } - clip->refreshClip(true); - clip->update(); - } - } - } -} - -ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track) -{ - int framepos = (int)(pos.frames(m_document->fps())); - QList list = scene()->items(QPointF(framepos - 1, track * m_tracksHeight + m_tracksHeight / 2)); - ClipItem *clip = NULL; - for (int i = 0; i < list.size(); i++) { - if (!list.at(i)->isEnabled()) continue; - if (list.at(i)->type() == AVWIDGET) { - ClipItem *test = static_cast (list.at(i)); - if (test->endPos() == pos) clip = test; - break; - } - } - return clip; -} - -ClipItem *CustomTrackView::getClipItemAtStart(GenTime pos, int track) -{ - QList list = scene()->items(QPointF(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2)); - ClipItem *clip = NULL; - for (int i = 0; i < list.size(); i++) { - if (!list.at(i)->isEnabled()) continue; - if (list.at(i)->type() == AVWIDGET) { - ClipItem *test = static_cast (list.at(i)); - if (test->startPos() == pos) clip = test; - break; - } - } - return clip; -} - -ClipItem *CustomTrackView::getClipItemAt(int pos, int track) -{ - const QPointF p(pos, track * m_tracksHeight + m_tracksHeight / 2); - QList list = scene()->items(p); - ClipItem *clip = NULL; - for (int i = 0; i < list.size(); i++) { - if (!list.at(i)->isEnabled()) continue; - if (list.at(i)->type() == AVWIDGET) { - clip = static_cast (list.at(i)); - break; - } - } - return clip; -} - -ClipItem *CustomTrackView::getClipItemAt(GenTime pos, int track) -{ - return getClipItemAt((int) pos.frames(m_document->fps()), track); -} - -Transition *CustomTrackView::getTransitionItemAt(int pos, int track) -{ - const QPointF p(pos, (track + 1) * m_tracksHeight); - QList list = scene()->items(p); - Transition *clip = NULL; - for (int i = 0; i < list.size(); i++) { - if (!list.at(i)->isEnabled()) continue; - if (list.at(i)->type() == TRANSITIONWIDGET) { - clip = static_cast (list.at(i)); - break; - } - } - return clip; -} - -Transition *CustomTrackView::getTransitionItemAt(GenTime pos, int track) -{ - return getTransitionItemAt(pos.frames(m_document->fps()), track); -} - -Transition *CustomTrackView::getTransitionItemAtEnd(GenTime pos, int track) -{ - int framepos = (int)(pos.frames(m_document->fps())); - const QPointF p(framepos - 1, (track + 1) * m_tracksHeight); - QList list = scene()->items(p); - Transition *clip = NULL; - for (int i = 0; i < list.size(); i++) { - if (!list.at(i)->isEnabled()) continue; - if (list.at(i)->type() == TRANSITIONWIDGET) { - Transition *test = static_cast (list.at(i)); - if (test->endPos() == pos) clip = test; - break; - } - } - return clip; -} - -Transition *CustomTrackView::getTransitionItemAtStart(GenTime pos, int track) -{ - const QPointF p(pos.frames(m_document->fps()), (track + 1) * m_tracksHeight); - QList list = scene()->items(p); - Transition *clip = NULL; - for (int i = 0; i < list.size(); ++i) { - if (!list.at(i)->isEnabled()) continue; - if (list.at(i)->type() == TRANSITIONWIDGET) { - Transition *test = static_cast (list.at(i)); - if (test->startPos() == pos) clip = test; - break; - } - } - return clip; -} - -void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end, bool refresh) -{ - if (m_selectionGroup) resetSelectionGroup(false); - ClipItem *item = getClipItemAt((int) start.startPos.frames(m_document->fps()), start.track); - if (!item) { - emit displayMessage(i18n("Cannot move clip at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage); - kDebug() << "---------------- ERROR, CANNOT find clip to move at.. "; - return; - } - Mlt::Producer *prod; - if (item->isAudioOnly()) prod = item->baseClip()->audioProducer(end.track); - else if (item->isVideoOnly()) prod = item->baseClip()->videoProducer(); - else prod = item->baseClip()->producer(end.track); - - bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - start.track), (int)(m_document->tracksCount() - end.track), (int) start.startPos.frames(m_document->fps()), (int)end.startPos.frames(m_document->fps()), prod); - if (success) { - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - item->setPos((int) end.startPos.frames(m_document->fps()), (int)(end.track * m_tracksHeight + 1)); - - int tracknumber = m_document->tracksCount() - end.track - 1; - bool isLocked = m_document->trackInfoAt(tracknumber).isLocked; - m_scene->clearSelection(); - if (isLocked) item->setItemLocked(true); - else { - if (item->isItemLocked()) item->setItemLocked(false); - item->setSelected(true); - } - if (item->baseClip()->isTransparent()) { - // Also move automatic transition - Transition *tr = getTransitionItemAt(start.startPos, start.track); - if (tr && tr->isAutomatic()) { - tr->updateTransitionEndTrack(getPreviousVideoTrack(end.track)); - m_document->renderer()->mltMoveTransition(tr->transitionTag(), m_document->tracksCount() - start.track, m_document->tracksCount() - end.track, tr->transitionEndTrack(), start.startPos, start.endPos, end.startPos, end.endPos); - tr->setPos((int) end.startPos.frames(m_document->fps()), (int)(end.track * m_tracksHeight + 1)); - } - } - KdenliveSettings::setSnaptopoints(snap); - setDocumentModified(); - } else { - // undo last move and emit error message - emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(end.startPos.frames(m_document->fps()))), ErrorMessage); - } - if (refresh) m_document->renderer()->doRefresh(); - //kDebug() << " // MOVED CLIP TO: " << end.startPos.frames(25) << ", ITEM START: " << item->startPos().frames(25); -} - -void CustomTrackView::moveGroup(QList startClip, QList startTransition, const GenTime offset, const int trackOffset, bool reverseMove) -{ - // Group Items - /*kDebug() << "//GRP MOVE, REVERS:" << reverseMove; - kDebug() << "// GROUP MOV; OFFSET: " << offset.frames(25) << ", TK OFF: " << trackOffset;*/ - resetSelectionGroup(); - m_scene->clearSelection(); - - m_selectionGroup = new AbstractGroupItem(m_document->fps()); - scene()->addItem(m_selectionGroup); - - m_document->renderer()->blockSignals(true); - for (int i = 0; i < startClip.count(); i++) { - if (reverseMove) { - startClip[i].startPos = startClip.at(i).startPos - offset; - startClip[i].track = startClip.at(i).track - trackOffset; - } - //kDebug()<<"//LKING FR CLIP AT:"<setItemLocked(false); - if (clip->parentItem()) { - m_selectionGroup->addToGroup(clip->parentItem()); - clip->parentItem()->setFlag(QGraphicsItem::ItemIsMovable, false); - } else { - m_selectionGroup->addToGroup(clip); - clip->setFlag(QGraphicsItem::ItemIsMovable, false); - } - m_document->renderer()->mltRemoveClip(m_document->tracksCount() - startClip.at(i).track, startClip.at(i).startPos); - } else kDebug() << "//MISSING CLIP AT: " << startClip.at(i).startPos.frames(25); - } - for (int i = 0; i < startTransition.count(); i++) { - if (reverseMove) { - startTransition[i].startPos = startTransition.at(i).startPos - offset; - startTransition[i].track = startTransition.at(i).track - trackOffset; - } - Transition *tr = getTransitionItemAt(startTransition.at(i).startPos, startTransition.at(i).track); - if (tr) { - tr->setItemLocked(false); - if (tr->parentItem()) { - m_selectionGroup->addToGroup(tr->parentItem()); - tr->parentItem()->setFlag(QGraphicsItem::ItemIsMovable, false); - } else { - m_selectionGroup->addToGroup(tr); - tr->setFlag(QGraphicsItem::ItemIsMovable, false); - } - m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - startTransition.at(i).track, startTransition.at(i).startPos, startTransition.at(i).endPos, tr->toXML()); - } else kDebug() << "//MISSING TRANSITION AT: " << startTransition.at(i).startPos.frames(25); - } - m_document->renderer()->blockSignals(false); - - if (m_selectionGroup) { - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - - m_selectionGroup->translate(offset.frames(m_document->fps()), trackOffset *(qreal) m_tracksHeight); - //m_selectionGroup->moveBy(offset.frames(m_document->fps()), trackOffset *(qreal) m_tracksHeight); - - QList children = m_selectionGroup->childItems(); - // Expand groups - int max = children.count(); - for (int i = 0; i < max; i++) { - if (children.at(i)->type() == GROUPWIDGET) { - children += children.at(i)->childItems(); - //AbstractGroupItem *grp = static_cast(children.at(i)); - //grp->moveBy(offset.frames(m_document->fps()), trackOffset *(qreal) m_tracksHeight); - /*m_document->clipManager()->removeGroup(grp); - m_scene->destroyItemGroup(grp);*/ - children.removeAll(children.at(i)); - i--; - } - } - - for (int i = 0; i < children.count(); i++) { - // re-add items in correct place - if (children.at(i)->type() != AVWIDGET && children.at(i)->type() != TRANSITIONWIDGET) continue; - AbstractClipItem *item = static_cast (children.at(i)); - item->updateItem(); - ItemInfo info = item->info(); - int tracknumber = m_document->tracksCount() - info.track - 1; - bool isLocked = m_document->trackInfoAt(tracknumber).isLocked; - if (isLocked) item->setItemLocked(true); - else if (item->isItemLocked()) item->setItemLocked(false); - - if (item->type() == AVWIDGET) { - ClipItem *clip = static_cast (item); - info.track = m_document->tracksCount() - info.track; - Mlt::Producer *prod; - if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(info.track); - else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer(); - else prod = clip->baseClip()->producer(info.track); - m_document->renderer()->mltInsertClip(info, clip->xml(), prod); - } else if (item->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast (item); - int newTrack; - if (!tr->forcedTrack()) newTrack = getPreviousVideoTrack(info.track); - else { - newTrack = tr->transitionEndTrack() + trackOffset; - if (newTrack < 0 || newTrack > m_document->tracksCount()) newTrack = getPreviousVideoTrack(info.track); - } - tr->updateTransitionEndTrack(newTrack); - m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML()); - } - } - resetSelectionGroup(false); - KdenliveSettings::setSnaptopoints(snap); - m_document->renderer()->doRefresh(); - } else kDebug() << "///////// WARNING; NO GROUP TO MOVE"; -} - -void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end, bool m_refresh) -{ - Transition *item = getTransitionItemAt(start.startPos, start.track); - if (!item) { - emit displayMessage(i18n("Cannot move transition at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage); - kDebug() << "---------------- ERROR, CANNOT find transition to move... ";// << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2; - return; - } - //kDebug() << "---------------- Move TRANSITION FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << oldtrack << " TO " << newtrack; - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - //kDebug()<<"/// RESIZE TRANS START: ("<< startPos.x()<<"x"<< startPos.y()<<") / ("<setPos((int) end.startPos.frames(m_document->fps()), (end.track) * m_tracksHeight + 1); - } else if (end.endPos == start.endPos) { - // Transition start resize - item->resizeStart((int) end.startPos.frames(m_document->fps())); - } else if (end.startPos == start.startPos) { - // Transition end resize; - kDebug() << "// resize END: " << end.endPos.frames(m_document->fps()); - item->resizeEnd((int) end.endPos.frames(m_document->fps())); - } else { - // Move & resize - item->setPos((int) end.startPos.frames(m_document->fps()), (end.track) * m_tracksHeight + 1); - item->resizeStart((int) end.startPos.frames(m_document->fps())); - item->resizeEnd((int) end.endPos.frames(m_document->fps())); - } - //item->moveTransition(GenTime((int) (endPos.x() - startPos.x()), m_document->fps())); - KdenliveSettings::setSnaptopoints(snap); - item->updateTransitionEndTrack(getPreviousVideoTrack(end.track)); - m_document->renderer()->mltMoveTransition(item->transitionTag(), m_document->tracksCount() - start.track, m_document->tracksCount() - end.track, item->transitionEndTrack(), start.startPos, start.endPos, end.startPos, end.endPos); - if (m_dragItem && m_dragItem == item) { - QPoint p; - ClipItem *transitionClip = getClipItemAt(item->startPos(), item->track()); - if (transitionClip && transitionClip->baseClip()) { - QString size = transitionClip->baseClip()->getProperty("frame_size"); - double factor = transitionClip->baseClip()->getProperty("aspect_ratio").toDouble(); - p.setX((int)(size.section('x', 0, 0).toInt() * factor + 0.5)); - p.setY(size.section('x', 1, 1).toInt()); - } - emit transitionItemSelected(item, getPreviousVideoTrack(item->track()), p); - } - if (m_refresh) m_document->renderer()->doRefresh(); - setDocumentModified(); -} - -void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end, bool dontWorry) -{ - bool resizeClipStart = (start.startPos != end.startPos); - ClipItem *item = getClipItemAtStart(start.startPos, start.track); - if (!item) { - if (dontWorry) return; - emit displayMessage(i18n("Cannot move clip at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage); - kDebug() << "---------------- ERROR, CANNOT find clip to resize at... "; // << startPos; - return; - } - if (item->parentItem()) { - // Item is part of a group, reset group - resetSelectionGroup(); - } - - bool snap = KdenliveSettings::snaptopoints(); - KdenliveSettings::setSnaptopoints(false); - if (resizeClipStart) { - ItemInfo clipinfo = item->info(); - clipinfo.track = m_document->tracksCount() - clipinfo.track; - bool success = m_document->renderer()->mltResizeClipStart(clipinfo, end.startPos - clipinfo.startPos); - if (success) { - kDebug() << "RESIZE CLP STRAT TO:" << end.startPos.frames(m_document->fps()) << ", OLD ST: " << start.startPos.frames(25); - item->resizeStart((int) end.startPos.frames(m_document->fps())); - updatePositionEffects(item, clipinfo); - } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage); - } else { - ItemInfo clipinfo = item->info(); - clipinfo.track = m_document->tracksCount() - clipinfo.track; - bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, end.endPos - clipinfo.startPos); - if (success) { - item->resizeEnd((int) end.endPos.frames(m_document->fps())); - updatePositionEffects(item, clipinfo); - } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage); - } - if (!resizeClipStart && end.cropStart != start.cropStart) { - kDebug() << "// RESIZE CROP, DIFF: " << (end.cropStart - start.cropStart).frames(25); - ItemInfo clipinfo = end; - clipinfo.track = m_document->tracksCount() - end.track; - bool success = m_document->renderer()->mltResizeClipCrop(clipinfo, end.cropStart - start.cropStart); - if (success) { - item->setCropStart(end.cropStart); - item->resetThumbs(true); - } - } - m_document->renderer()->doRefresh(); - KdenliveSettings::setSnaptopoints(snap); - setDocumentModified(); -} - -void CustomTrackView::updatePositionEffects(ClipItem * item, ItemInfo info) -{ - int end = item->fadeIn(); - if (end != 0) { - // there is a fade in effect - int effectPos = item->hasEffect("volume", "fadein"); - if (effectPos != -1) { - QDomElement oldeffect = item->effectAt(effectPos); - int start = item->cropStart().frames(m_document->fps()); - int max = item->cropDuration().frames(m_document->fps()); - if (end > max) { - // Make sure the fade effect is not longer than the clip - item->setFadeIn(max); - end = item->fadeIn(); - } - end += start; - EffectsList::setParameter(oldeffect, "in", QString::number(start)); - EffectsList::setParameter(oldeffect, "out", QString::number(end)); - if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect))) - emit displayMessage(i18n("Problem editing effect"), ErrorMessage); - // if fade effect is displayed, update the effect edit widget with new clip duration - if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos); - } - effectPos = item->hasEffect("brightness", "fade_from_black"); - if (effectPos != -1) { - QDomElement oldeffect = item->effectAt(effectPos); - int start = item->cropStart().frames(m_document->fps()); - int max = item->cropDuration().frames(m_document->fps()); - if (end > max) { - // Make sure the fade effect is not longer than the clip - item->setFadeIn(max); - end = item->fadeIn(); - } - end += start; - EffectsList::setParameter(oldeffect, "in", QString::number(start)); - EffectsList::setParameter(oldeffect, "out", QString::number(end)); - if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect))) - emit displayMessage(i18n("Problem editing effect"), ErrorMessage); - // if fade effect is displayed, update the effect edit widget with new clip duration - if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos); - } - } - int start = item->fadeOut(); - if (start != 0) { - // there is a fade out effect - int effectPos = item->hasEffect("volume", "fadeout"); - if (effectPos != -1) { - QDomElement oldeffect = item->effectAt(effectPos); - int max = item->cropDuration().frames(m_document->fps()); - int end = max + item->cropStart().frames(m_document->fps()); - if (start > max) { - // Make sure the fade effect is not longer than the clip - item->setFadeOut(max); - start = item->fadeOut(); - } - start = end - start; - EffectsList::setParameter(oldeffect, "in", QString::number(start)); - EffectsList::setParameter(oldeffect, "out", QString::number(end)); - if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect))) - emit displayMessage(i18n("Problem editing effect"), ErrorMessage); - // if fade effect is displayed, update the effect edit widget with new clip duration - if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos); - } - effectPos = item->hasEffect("brightness", "fade_to_black"); - if (effectPos != -1) { - QDomElement oldeffect = item->effectAt(effectPos); - int max = item->cropDuration().frames(m_document->fps()); - int end = max + item->cropStart().frames(m_document->fps()); - if (start > max) { - // Make sure the fade effect is not longer than the clip - item->setFadeOut(max); - start = item->fadeOut(); - } - start = end - start; - EffectsList::setParameter(oldeffect, "in", QString::number(start)); - EffectsList::setParameter(oldeffect, "out", QString::number(end)); - if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect))) - emit displayMessage(i18n("Problem editing effect"), ErrorMessage); - // if fade effect is displayed, update the effect edit widget with new clip duration - if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos); - } - } - - int effectPos = item->hasEffect("freeze", "freeze"); - if (effectPos != -1) { - // Freeze effect needs to be adjusted with clip resize - int diff = (info.startPos - item->startPos()).frames(m_document->fps()); - QDomElement eff = item->getEffectAt(effectPos); - if (!eff.isNull() && diff != 0) { - int freeze_pos = EffectsList::parameter(eff, "frame").toInt() + diff; - EffectsList::setParameter(eff, "frame", QString::number(freeze_pos)); - if (item->isSelected() && item->selectedEffect().attribute("id") == "freeze") { - emit clipItemSelected(item, item->selectedEffectIndex()); - } - } - } -} - -double CustomTrackView::getSnapPointForPos(double pos) -{ - return m_scene->getSnapPointForPos(pos, KdenliveSettings::snaptopoints()); -} - -void CustomTrackView::updateSnapPoints(AbstractClipItem *selected, QList offsetList, bool skipSelectedItems) -{ - QList snaps; - if (selected && offsetList.isEmpty()) offsetList.append(selected->cropDuration()); - QList itemList = items(); - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i) == selected) continue; - if (skipSelectedItems && itemList.at(i)->isSelected()) continue; - if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast (itemList.at(i)); - GenTime start = item->startPos(); - GenTime end = item->endPos(); - snaps.append(start); - snaps.append(end); - if (!offsetList.isEmpty()) { - for (int j = 0; j < offsetList.size(); j++) { - if (start > offsetList.at(j)) snaps.append(start - offsetList.at(j)); - if (end > offsetList.at(j)) snaps.append(end - offsetList.at(j)); - } - } - // Add clip markers - QList < GenTime > markers = item->snapMarkers(); - for (int j = 0; j < markers.size(); ++j) { - GenTime t = markers.at(j); - snaps.append(t); - if (!offsetList.isEmpty()) { - for (int k = 0; k < offsetList.size(); k++) { - if (t > offsetList.at(k)) snaps.append(t - offsetList.at(k)); - } - } - } - } else if (itemList.at(i)->type() == TRANSITIONWIDGET) { - Transition *transition = static_cast (itemList.at(i)); - GenTime start = transition->startPos(); - GenTime end = transition->endPos(); - snaps.append(start); - snaps.append(end); - if (!offsetList.isEmpty()) { - for (int j = 0; j < offsetList.size(); j++) { - if (start > offsetList.at(j)) snaps.append(start - offsetList.at(j)); - if (end > offsetList.at(j)) snaps.append(end - offsetList.at(j)); - } - } - } - } - - // add cursor position - GenTime pos = GenTime(m_cursorPos, m_document->fps()); - snaps.append(pos); - if (!offsetList.isEmpty()) { - for (int j = 0; j < offsetList.size(); j++) { - snaps.append(pos - offsetList.at(j)); - } - } - - // add guides - for (int i = 0; i < m_guides.count(); i++) { - snaps.append(m_guides.at(i)->position()); - if (!offsetList.isEmpty()) { - for (int j = 0; j < offsetList.size(); j++) { - snaps.append(m_guides.at(i)->position() - offsetList.at(j)); - } - } - } - - qSort(snaps); - m_scene->setSnapList(snaps); - //for (int i = 0; i < m_snapPoints.size(); ++i) - // kDebug() << "SNAP POINT: " << m_snapPoints.at(i).frames(25); -} - -void CustomTrackView::slotSeekToPreviousSnap() -{ - updateSnapPoints(NULL); - GenTime res = m_scene->previousSnapPoint(GenTime(m_cursorPos, m_document->fps())); - setCursorPos((int) res.frames(m_document->fps())); - checkScrolling(); -} - -void CustomTrackView::slotSeekToNextSnap() -{ - updateSnapPoints(NULL); - GenTime res = m_scene->nextSnapPoint(GenTime(m_cursorPos, m_document->fps())); - setCursorPos((int) res.frames(m_document->fps())); - checkScrolling(); -} - -void CustomTrackView::clipStart() -{ - AbstractClipItem *item = getMainActiveClip(); - if (item != NULL) { - setCursorPos((int) item->startPos().frames(m_document->fps())); - checkScrolling(); - } -} - -void CustomTrackView::clipEnd() -{ - AbstractClipItem *item = getMainActiveClip(); - if (item != NULL) { - setCursorPos((int) item->endPos().frames(m_document->fps()) - 1); - checkScrolling(); - } -} - -void CustomTrackView::slotAddClipMarker(const QString &id, GenTime t, QString c) -{ - QString oldcomment = m_document->clipManager()->getClipById(id)->markerComment(t); - AddMarkerCommand *command = new AddMarkerCommand(this, oldcomment, c, id, t); - m_commandStack->push(command); -} - -void CustomTrackView::slotDeleteClipMarker(const QString &comment, const QString &id, const GenTime &position) -{ - AddMarkerCommand *command = new AddMarkerCommand(this, comment, QString(), id, position); - m_commandStack->push(command); -} - -void CustomTrackView::slotDeleteAllClipMarkers(const QString &id) -{ - DocClipBase *base = m_document->clipManager()->getClipById(id); - QList markers = base->commentedSnapMarkers(); - - if (markers.isEmpty()) { - emit displayMessage(i18n("Clip has no markers"), ErrorMessage); - return; - } - QUndoCommand *deleteMarkers = new QUndoCommand(); - deleteMarkers->setText("Delete clip markers"); - - for (int i = 0; i < markers.size(); i++) { - new AddMarkerCommand(this, markers.at(i).comment(), QString(), id, markers.at(i).time(), deleteMarkers); - } - m_commandStack->push(deleteMarkers); -} - -void CustomTrackView::addMarker(const QString &id, const GenTime &pos, const QString comment) -{ - DocClipBase *base = m_document->clipManager()->getClipById(id); - if (!comment.isEmpty()) base->addSnapMarker(pos, comment); - else base->deleteSnapMarker(pos); - emit updateClipMarkers(base); - setDocumentModified(); - viewport()->update(); -} - -int CustomTrackView::hasGuide(int pos, int offset) -{ - for (int i = 0; i < m_guides.count(); i++) { - int guidePos = m_guides.at(i)->position().frames(m_document->fps()); - if (qAbs(guidePos - pos) <= offset) return guidePos; - else if (guidePos > pos) return -1; - } - return -1; -} - -void CustomTrackView::editGuide(const GenTime oldPos, const GenTime pos, const QString &comment) -{ - if (oldPos > GenTime() && pos > GenTime()) { - // move guide - for (int i = 0; i < m_guides.count(); i++) { - if (m_guides.at(i)->position() == oldPos) { - Guide *item = m_guides.at(i); - item->updateGuide(pos, comment); - break; - } - } - } else if (pos > GenTime()) addGuide(pos, comment); - else { - // remove guide - bool found = false; - for (int i = 0; i < m_guides.count(); i++) { - if (m_guides.at(i)->position() == oldPos) { - delete m_guides.takeAt(i); - found = true; - break; - } - } - if (!found) emit displayMessage(i18n("No guide at cursor time"), ErrorMessage); - } - qSort(m_guides.begin(), m_guides.end(), sortGuidesList); - m_document->syncGuides(m_guides); -} - -bool CustomTrackView::addGuide(const GenTime pos, const QString &comment) -{ - for (int i = 0; i < m_guides.count(); i++) { - if (m_guides.at(i)->position() == pos) { - emit displayMessage(i18n("A guide already exists at position %1", m_document->timecode().getTimecodeFromFrames(pos.frames(m_document->fps()))), ErrorMessage); - return false; - } - } - Guide *g = new Guide(this, pos, comment, m_tracksHeight * m_document->tracksCount() * matrix().m22()); - scene()->addItem(g); - m_guides.append(g); - qSort(m_guides.begin(), m_guides.end(), sortGuidesList); - m_document->syncGuides(m_guides); - return true; -} - -void CustomTrackView::slotAddGuide() -{ - CommentedTime marker(GenTime(m_cursorPos, m_document->fps()), i18n("Guide")); - MarkerDialog d(NULL, marker, m_document->timecode(), i18n("Add Guide"), this); - if (d.exec() != QDialog::Accepted) return; - if (addGuide(d.newMarker().time(), d.newMarker().comment())) { - EditGuideCommand *command = new EditGuideCommand(this, GenTime(), QString(), d.newMarker().time(), d.newMarker().comment(), false); - m_commandStack->push(command); - } -} - -void CustomTrackView::slotEditGuide(int guidePos) -{ - GenTime pos; - if (guidePos == -1) pos = GenTime(m_cursorPos, m_document->fps()); - else pos = GenTime(guidePos, m_document->fps()); - bool found = false; - for (int i = 0; i < m_guides.count(); i++) { - if (m_guides.at(i)->position() == pos) { - slotEditGuide(m_guides.at(i)->info()); - found = true; - break; - } - } - if (!found) emit displayMessage(i18n("No guide at cursor time"), ErrorMessage); -} - -void CustomTrackView::slotEditGuide(CommentedTime guide) -{ - MarkerDialog d(NULL, guide, m_document->timecode(), i18n("Edit Guide"), this); - if (d.exec() == QDialog::Accepted) { - EditGuideCommand *command = new EditGuideCommand(this, guide.time(), guide.comment(), d.newMarker().time(), d.newMarker().comment(), true); - m_commandStack->push(command); - } -} - - -void CustomTrackView::slotEditTimeLineGuide() -{ - if (m_dragGuide == NULL) return; - CommentedTime guide = m_dragGuide->info(); - MarkerDialog d(NULL, guide, m_document->timecode(), i18n("Edit Guide"), this); - if (d.exec() == QDialog::Accepted) { - EditGuideCommand *command = new EditGuideCommand(this, guide.time(), guide.comment(), d.newMarker().time(), d.newMarker().comment(), true); - m_commandStack->push(command); - } -} - -void CustomTrackView::slotDeleteGuide(int guidePos) -{ - GenTime pos; - if (guidePos == -1) pos = GenTime(m_cursorPos, m_document->fps()); - else pos = GenTime(guidePos, m_document->fps()); - bool found = false; - for (int i = 0; i < m_guides.count(); i++) { - if (m_guides.at(i)->position() == pos) { - EditGuideCommand *command = new EditGuideCommand(this, m_guides.at(i)->position(), m_guides.at(i)->label(), GenTime(), QString(), true); - m_commandStack->push(command); - found = true; - break; - } - } - if (!found) emit displayMessage(i18n("No guide at cursor time"), ErrorMessage); -} - - -void CustomTrackView::slotDeleteTimeLineGuide() -{ - if (m_dragGuide == NULL) return; - EditGuideCommand *command = new EditGuideCommand(this, m_dragGuide->position(), m_dragGuide->label(), GenTime(), QString(), true); - m_commandStack->push(command); -} - - -void CustomTrackView::slotDeleteAllGuides() -{ - QUndoCommand *deleteAll = new QUndoCommand(); - deleteAll->setText("Delete all guides"); - for (int i = 0; i < m_guides.count(); i++) { - new EditGuideCommand(this, m_guides.at(i)->position(), m_guides.at(i)->label(), GenTime(), QString(), true, deleteAll); - } - m_commandStack->push(deleteAll); -} - -void CustomTrackView::setTool(PROJECTTOOL tool) -{ - m_tool = tool; -} - -void CustomTrackView::setScale(double scaleFactor, double verticalScale) -{ - QMatrix newmatrix; - newmatrix = newmatrix.scale(scaleFactor, verticalScale); - m_scene->setScale(scaleFactor, verticalScale); - if (m_visualTip) { - scene()->removeItem(m_visualTip); - m_animationTimer->stop(); - delete m_animation; - m_animation = NULL; - delete m_visualTip; - m_visualTip = NULL; - } - double verticalPos = mapToScene(QPoint(0, viewport()->height() / 2)).y(); - bool adjust = false; - if (verticalScale != matrix().m22()) adjust = true; - setMatrix(newmatrix); - if (adjust) { - double newHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22(); - m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), newHeight); - for (int i = 0; i < m_guides.count(); i++) { - QLineF l = m_guides.at(i)->line(); - l.setP2(QPointF(l.x2(), newHeight)); - m_guides.at(i)->setLine(l); - } - setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount()); - } - - int diff = sceneRect().width() - m_projectDuration; - if (diff * newmatrix.m11() < 50) { - if (newmatrix.m11() < 0.4) setSceneRect(0, 0, (m_projectDuration + 100 / newmatrix.m11()), sceneRect().height()); - else setSceneRect(0, 0, (m_projectDuration + 300), sceneRect().height()); - } - centerOn(QPointF(cursorPos(), verticalPos)); -} - -void CustomTrackView::slotRefreshGuides() -{ - if (KdenliveSettings::showmarkers()) { - for (int i = 0; i < m_guides.count(); i++) { - m_guides.at(i)->update(); - } - } -} - -void CustomTrackView::drawBackground(QPainter * painter, const QRectF &rect) -{ - //kDebug() << "// DRAW BG: " << rect.width(); - painter->setClipRect(rect); - KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window); - QPen pen1 = painter->pen(); - pen1.setColor(scheme.shade(KColorScheme::DarkShade)); - painter->setPen(pen1); - double min = rect.left(); - double max = rect.right(); - painter->drawLine(QPointF(min, 0), QPointF(max, 0)); - int maxTrack = m_document->tracksCount(); - QColor lockedColor = scheme.background(KColorScheme::NegativeBackground).color(); - QColor audioColor = palette().alternateBase().color(); - QColor base = scheme.background(KColorScheme::NormalBackground).color(); - for (int i = 0; i < maxTrack; i++) { - TrackInfo info = m_document->trackInfoAt(maxTrack - i - 1); - if (info.isLocked || info.type == AUDIOTRACK || i == m_selectedTrack) { - const QRectF track(min, m_tracksHeight * i + 1, max - min, m_tracksHeight - 1); - if (i == m_selectedTrack) painter->fillRect(track, scheme.background(KColorScheme::ActiveBackground).color()); - else painter->fillRect(track, info.isLocked ? lockedColor : audioColor); - } - painter->drawLine(QPointF(min, m_tracksHeight *(i + 1)), QPointF(max, m_tracksHeight *(i + 1))); - } - int lowerLimit = m_tracksHeight * maxTrack + 1; - if (height() > lowerLimit) { - const QRectF bg(min, lowerLimit, max - min, height() - lowerLimit); - painter->fillRect(bg, base); - } -} - -bool CustomTrackView::findString(const QString &text) -{ - QString marker; - for (int i = 0; i < m_searchPoints.size(); ++i) { - marker = m_searchPoints.at(i).comment(); - if (marker.contains(text, Qt::CaseInsensitive)) { - setCursorPos(m_searchPoints.at(i).time().frames(m_document->fps()), true); - int vert = verticalScrollBar()->value(); - int hor = cursorPos(); - ensureVisible(hor, vert + 10, 2, 2, 50, 0); - m_findIndex = i; - return true; - } - } - return false; -} - -bool CustomTrackView::findNextString(const QString &text) -{ - QString marker; - for (int i = m_findIndex + 1; i < m_searchPoints.size(); ++i) { - marker = m_searchPoints.at(i).comment(); - if (marker.contains(text, Qt::CaseInsensitive)) { - setCursorPos(m_searchPoints.at(i).time().frames(m_document->fps()), true); - int vert = verticalScrollBar()->value(); - int hor = cursorPos(); - ensureVisible(hor, vert + 10, 2, 2, 50, 0); - m_findIndex = i; - return true; - } - } - m_findIndex = -1; - return false; -} - -void CustomTrackView::initSearchStrings() -{ - m_searchPoints.clear(); - QList itemList = items(); - for (int i = 0; i < itemList.count(); i++) { - // parse all clip names - if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast (itemList.at(i)); - GenTime start = item->startPos(); - CommentedTime t(start, item->clipName()); - m_searchPoints.append(t); - // add all clip markers - QList < CommentedTime > markers = item->commentedSnapMarkers(); - m_searchPoints += markers; - } - } - - // add guides - for (int i = 0; i < m_guides.count(); i++) { - m_searchPoints.append(m_guides.at(i)->info()); - } - - qSort(m_searchPoints); -} - -void CustomTrackView::clearSearchStrings() -{ - m_searchPoints.clear(); - m_findIndex = 0; -} - -void CustomTrackView::copyClip() -{ - qDeleteAll(m_copiedItems); - m_copiedItems.clear(); - QList itemList = scene()->selectedItems(); - if (itemList.count() == 0) { - emit displayMessage(i18n("Select a clip before copying"), ErrorMessage); - return; - } - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast (itemList.at(i)); - ClipItem *clone = clip->clone(clip->info()); - m_copiedItems.append(clone); - } else if (itemList.at(i)->type() == TRANSITIONWIDGET) { - Transition *dup = static_cast (itemList.at(i)); - m_copiedItems.append(dup->clone()); - } - } -} - -bool CustomTrackView::canBePastedTo(ItemInfo info, int type) const -{ - if (m_scene->editMode() != NORMALEDIT) { - // If we are in overwrite mode, always allow the move - return true; - } - QRectF rect((double) info.startPos.frames(m_document->fps()), (double)(info.track * m_tracksHeight + 1), (double)(info.endPos - info.startPos).frames(m_document->fps()), (double)(m_tracksHeight - 1)); - QList collisions = scene()->items(rect, Qt::IntersectsItemBoundingRect); - for (int i = 0; i < collisions.count(); i++) { - if (collisions.at(i)->type() == type) return false; - } - return true; -} - -bool CustomTrackView::canBePastedTo(QList infoList, int type) const -{ - QPainterPath path; - for (int i = 0; i < infoList.count(); i++) { - const QRectF rect((double) infoList.at(i).startPos.frames(m_document->fps()), (double)(infoList.at(i).track * m_tracksHeight + 1), (double)(infoList.at(i).endPos - infoList.at(i).startPos).frames(m_document->fps()), (double)(m_tracksHeight - 1)); - path.addRect(rect); - } - QList collisions = scene()->items(path); - for (int i = 0; i < collisions.count(); i++) { - if (collisions.at(i)->type() == type) return false; - } - return true; -} - -bool CustomTrackView::canBePasted(QList items, GenTime offset, int trackOffset) const -{ - for (int i = 0; i < items.count(); i++) { - ItemInfo info = items.at(i)->info(); - info.startPos += offset; - info.endPos += offset; - info.track += trackOffset; - if (!canBePastedTo(info, items.at(i)->type())) return false; - } - return true; -} - -bool CustomTrackView::canBeMoved(QList items, GenTime offset, int trackOffset) const -{ - QPainterPath movePath; - movePath.moveTo(0, 0); - - for (int i = 0; i < items.count(); i++) { - ItemInfo info = items.at(i)->info(); - info.startPos = info.startPos + offset; - info.endPos = info.endPos + offset; - info.track = info.track + trackOffset; - if (info.startPos < GenTime()) { - // No clip should go below 0 - return false; - } - QRectF rect((double) info.startPos.frames(m_document->fps()), (double)(info.track * m_tracksHeight + 1), (double)(info.endPos - info.startPos).frames(m_document->fps()), (double)(m_tracksHeight - 1)); - movePath.addRect(rect); - } - QList collisions = scene()->items(movePath, Qt::IntersectsItemBoundingRect); - for (int i = 0; i < collisions.count(); i++) { - if ((collisions.at(i)->type() == AVWIDGET || collisions.at(i)->type() == TRANSITIONWIDGET) && !items.contains(static_cast (collisions.at(i)))) { - kDebug() << " //////////// CLIP COLLISION, MOVE NOT ALLOWED"; - return false; - } - } - return true; -} - -void CustomTrackView::pasteClip() -{ - if (m_copiedItems.count() == 0) { - emit displayMessage(i18n("No clip copied"), ErrorMessage); - return; - } - QPoint position; - if (m_menuPosition.isNull()) { - position = mapFromGlobal(QCursor::pos()); - if (!underMouse() || position.y() > m_tracksHeight * m_document->tracksCount()) { - emit displayMessage(i18n("Cannot paste selected clips"), ErrorMessage); - return; - } - } else position = m_menuPosition; - GenTime pos = GenTime((int)(mapToScene(position).x()), m_document->fps()); - int track = (int)(position.y() / m_tracksHeight); - ItemInfo first = m_copiedItems.at(0)->info(); - - GenTime offset = pos - first.startPos; - int trackOffset = track - first.track; - - if (!canBePasted(m_copiedItems, offset, trackOffset)) { - emit displayMessage(i18n("Cannot paste selected clips"), ErrorMessage); - return; - } - QUndoCommand *pasteClips = new QUndoCommand(); - pasteClips->setText("Paste clips"); - - for (int i = 0; i < m_copiedItems.count(); i++) { - // parse all clip names - if (m_copiedItems.at(i) && m_copiedItems.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast (m_copiedItems.at(i)); - ItemInfo info = clip->info(); - info.startPos += offset; - info.endPos += offset; - info.track += trackOffset; - if (canBePastedTo(info, AVWIDGET)) { - new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, true, false, pasteClips); - } else emit displayMessage(i18n("Cannot paste clip to selected place"), ErrorMessage); - } else if (m_copiedItems.at(i) && m_copiedItems.at(i)->type() == TRANSITIONWIDGET) { - Transition *tr = static_cast (m_copiedItems.at(i)); - ItemInfo info; - info.startPos = tr->startPos() + offset; - info.endPos = tr->endPos() + offset; - info.track = tr->track() + trackOffset; - int transitionEndTrack; - if (!tr->forcedTrack()) transitionEndTrack = getPreviousVideoTrack(info.track); - else transitionEndTrack = tr->transitionEndTrack(); - if (canBePastedTo(info, TRANSITIONWIDGET)) { - if (info.startPos >= info.endPos) { - emit displayMessage(i18n("Invalid transition"), ErrorMessage); - } else new AddTransitionCommand(this, info, transitionEndTrack, tr->toXML(), false, true, pasteClips); - } else emit displayMessage(i18n("Cannot paste transition to selected place"), ErrorMessage); - } - } - m_commandStack->push(pasteClips); -} - -void CustomTrackView::pasteClipEffects() -{ - if (m_copiedItems.count() != 1 || m_copiedItems.at(0)->type() != AVWIDGET) { - emit displayMessage(i18n("You must copy exactly one clip before pasting effects"), ErrorMessage); - return; - } - ClipItem *clip = static_cast < ClipItem *>(m_copiedItems.at(0)); - - QUndoCommand *paste = new QUndoCommand(); - paste->setText("Paste effects"); - - QList clips = scene()->selectedItems(); - - // expand groups - for (int i = 0; i < clips.count(); ++i) { - if (clips.at(i)->type() == GROUPWIDGET) { - QList children = clips.at(i)->childItems(); - for (int j = 0; j < children.count(); j++) { - if (children.at(j)->type() == AVWIDGET && !clips.contains(children.at(j))) { - clips.append(children.at(j)); - } - } - } - } - - - for (int i = 0; i < clips.count(); ++i) { - if (clips.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast < ClipItem *>(clips.at(i)); - for (int j = 0; j < clip->effectsCount(); j++) { - QDomElement eff = clip->effectAt(j); - if (eff.attribute("unique", "0") == "0" || item->hasEffect(eff.attribute("tag"), eff.attribute("id")) == -1) { - adjustKeyfames(clip->cropStart(), item->cropStart(), item->cropDuration(), eff); - new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), eff, true, paste); - } - } - } - } - if (paste->childCount() > 0) m_commandStack->push(paste); - else delete paste; - - //adjust effects (fades, ...) - for (int i = 0; i < clips.count(); ++i) { - if (clips.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast < ClipItem *>(clips.at(i)); - updatePositionEffects(item, item->info()); - } - } -} - - -void CustomTrackView::adjustKeyfames(GenTime oldstart, GenTime newstart, GenTime duration, QDomElement xml) -{ - // parse parameters to check if we need to adjust to the new crop start - int diff = (newstart - oldstart).frames(m_document->fps()); - int max = (newstart + duration).frames(m_document->fps()); - QDomNodeList params = xml.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { - QString def = e.attribute("default"); - // Effect has a keyframe type parameter, we need to adjust the values - QStringList keys = e.attribute("keyframes").split(";", QString::SkipEmptyParts); - QStringList newKeyFrames; - foreach(const QString &str, keys) { - int pos = str.section(':', 0, 0).toInt(); - double val = str.section(':', 1, 1).toDouble(); - pos += diff; - if (pos > max) { - newKeyFrames.append(QString::number(max) + ':' + QString::number(val)); - break; - } else newKeyFrames.append(QString::number(pos) + ':' + QString::number(val)); - } - //kDebug()<<"ORIGIN: "<tracksCount())); - QList collisions = scene()->items(rect, Qt::IntersectsItemBoundingRect); - for (int i = 0; i < collisions.count(); i++) { - if (collisions.at(i)->type() == AVWIDGET) { - return static_cast < ClipItem *>(collisions.at(i)); - } - } - return NULL; -} - -AbstractClipItem *CustomTrackView::getMainActiveClip() const -{ - QList clips = scene()->selectedItems(); - if (clips.isEmpty()) { - return getClipUnderCursor(); - } else { - AbstractClipItem *item = NULL; - for (int i = 0; i < clips.count(); ++i) { - if (clips.at(i)->type() == AVWIDGET) { - item = static_cast < AbstractClipItem *>(clips.at(i)); - if (clips.count() > 1 && item->startPos().frames(m_document->fps()) <= m_cursorPos && item->endPos().frames(m_document->fps()) >= m_cursorPos) break; - } - } - if (item) return item; - } - return NULL; -} - -ClipItem *CustomTrackView::getActiveClipUnderCursor(bool allowOutsideCursor) const -{ - QList clips = scene()->selectedItems(); - if (clips.isEmpty()) { - return getClipUnderCursor(); - } else { - ClipItem *item; - // remove all items in the list that are not clips - for (int i = 0; i < clips.count();) { - if (clips.at(i)->type() != AVWIDGET) clips.removeAt(i); - else i++; - } - if (clips.count() == 1 && allowOutsideCursor) return static_cast < ClipItem *>(clips.at(0)); - for (int i = 0; i < clips.count(); ++i) { - if (clips.at(i)->type() == AVWIDGET) { - item = static_cast < ClipItem *>(clips.at(i)); - if (item->startPos().frames(m_document->fps()) <= m_cursorPos && item->endPos().frames(m_document->fps()) >= m_cursorPos) - return item; - } - } - } - return NULL; -} - -void CustomTrackView::setInPoint() -{ - AbstractClipItem *clip = getActiveClipUnderCursor(true); - if (clip == NULL) { - if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) { - clip = m_dragItem; - } else { - emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage); - return; - } - } - ItemInfo startInfo = clip->info(); - ItemInfo endInfo = startInfo; - endInfo.startPos = GenTime(m_cursorPos, m_document->fps()); - if (endInfo.startPos >= startInfo.endPos || endInfo.startPos < startInfo.startPos - startInfo.cropStart) { - // Check for invalid resize - emit displayMessage(i18n("Invalid action"), ErrorMessage); - return; - } else if (endInfo.startPos < startInfo.startPos) { - int length = m_document->renderer()->mltGetSpaceLength(endInfo.startPos, m_document->tracksCount() - startInfo.track, false); - if ((clip->type() == TRANSITIONWIDGET && itemCollision(clip, endInfo) == true) || ( - (clip->type() == AVWIDGET) && length < (startInfo.startPos - endInfo.startPos).frames(m_document->fps()))) { - emit displayMessage(i18n("Invalid action"), ErrorMessage); - return; - } - } - if (clip->type() == TRANSITIONWIDGET) { - m_commandStack->push(new MoveTransitionCommand(this, startInfo, endInfo, true)); - } else m_commandStack->push(new ResizeClipCommand(this, startInfo, endInfo, true, false)); -} - -void CustomTrackView::setOutPoint() -{ - AbstractClipItem *clip = getActiveClipUnderCursor(true); - if (clip == NULL) { - if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) { - clip = m_dragItem; - } else { - emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage); - return; - } - } - ItemInfo startInfo = clip->info(); - ItemInfo endInfo = clip->info(); - endInfo.endPos = GenTime(m_cursorPos, m_document->fps()); - CLIPTYPE type = (CLIPTYPE) static_cast (clip)->clipType(); - if (endInfo.endPos <= startInfo.startPos || (type != IMAGE && type != COLOR && type != TEXT && endInfo.endPos > startInfo.startPos + clip->maxDuration() - startInfo.cropStart)) { - // Check for invalid resize - emit displayMessage(i18n("Invalid action"), ErrorMessage); - return; - } else if (endInfo.endPos > startInfo.endPos) { - int length = m_document->renderer()->mltGetSpaceLength(startInfo.endPos, m_document->tracksCount() - startInfo.track, false); - if ((clip->type() == TRANSITIONWIDGET && itemCollision(clip, endInfo) == true) || (clip->type() == AVWIDGET && length != -1 && length < (endInfo.endPos - startInfo.endPos).frames(m_document->fps()))) { - kDebug() << " RESIZE ERROR, BLNK: " << length << ", RESIZE: " << (endInfo.endPos - startInfo.endPos).frames(m_document->fps()); - emit displayMessage(i18n("Invalid action"), ErrorMessage); - return; - } - } - - - if (clip->type() == TRANSITIONWIDGET) { - m_commandStack->push(new MoveTransitionCommand(this, startInfo, endInfo, true)); - } else m_commandStack->push(new ResizeClipCommand(this, startInfo, endInfo, true, false)); -} - -void CustomTrackView::slotUpdateAllThumbs() -{ - if (!isEnabled()) return; - QList itemList = items(); - //if (itemList.isEmpty()) return; - ClipItem *item; - const QString thumbBase = m_document->projectFolder().path() + "/thumbs/"; - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - item = static_cast (itemList.at(i)); - if (item->clipType() != COLOR && item->clipType() != AUDIO) { - // Check if we have a cached thumbnail - if (item->clipType() == IMAGE || item->clipType() == TEXT) { - QString thumb = thumbBase + item->baseClip()->getClipHash() + "_0.png"; - if (QFile::exists(thumb)) { - QPixmap pix(thumb); - if (pix.isNull()) KIO::NetAccess::del(KUrl(thumb), this); - item->slotSetStartThumb(pix); - } - } else { - QString startThumb = thumbBase + item->baseClip()->getClipHash() + '_'; - QString endThumb = startThumb; - startThumb.append(QString::number(item->speedIndependantCropStart().frames(m_document->fps())) + ".png"); - endThumb.append(QString::number((item->speedIndependantCropStart() + item->speedIndependantCropDuration()).frames(m_document->fps()) - 1) + ".png"); - if (QFile::exists(startThumb)) { - QPixmap pix(startThumb); - if (pix.isNull()) KIO::NetAccess::del(KUrl(startThumb), this); - item->slotSetStartThumb(pix); - } - if (QFile::exists(endThumb)) { - QPixmap pix(endThumb); - if (pix.isNull()) KIO::NetAccess::del(KUrl(endThumb), this); - item->slotSetEndThumb(pix); - } - } - } - item->refreshClip(false); - //qApp->processEvents(); - } - } - viewport()->update(); -} - -void CustomTrackView::saveThumbnails() -{ - QList itemList = items(); - ClipItem *item; - QString thumbBase = m_document->projectFolder().path() + "/thumbs/"; - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET) { - item = static_cast (itemList.at(i)); - if (item->clipType() != COLOR) { - // Check if we have a cached thumbnail - if (item->clipType() == IMAGE || item->clipType() == TEXT || item->clipType() == AUDIO) { - QString thumb = thumbBase + item->baseClip()->getClipHash() + "_0.png"; - if (!QFile::exists(thumb)) { - QPixmap pix(item->startThumb()); - pix.save(thumb); - } - } else { - QString startThumb = thumbBase + item->baseClip()->getClipHash() + '_'; - QString endThumb = startThumb; - startThumb.append(QString::number(item->speedIndependantCropStart().frames(m_document->fps())) + ".png"); - endThumb.append(QString::number((item->speedIndependantCropStart() + item->speedIndependantCropDuration()).frames(m_document->fps()) - 1) + ".png"); - if (!QFile::exists(startThumb)) { - QPixmap pix(item->startThumb()); - pix.save(startThumb); - } - if (!QFile::exists(endThumb)) { - QPixmap pix(item->endThumb()); - pix.save(endThumb); - } - } - } - } - } -} - - -void CustomTrackView::slotInsertTrack(int ix) -{ - TrackDialog d(m_document, parentWidget()); - d.label->setText(i18n("Insert track")); - d.track_nb->setMaximum(m_document->tracksCount() - 1); - d.track_nb->setValue(ix); - d.setWindowTitle(i18n("Insert New Track")); - d.slotUpdateName(ix); - - if (d.exec() == QDialog::Accepted) { - ix = d.track_nb->value(); - if (d.before_select->currentIndex() == 1) { - ix++; - } - TrackInfo info; - if (d.video_track->isChecked()) { - info.type = VIDEOTRACK; - info.isMute = false; - info.isBlind = false; - info.isLocked = false; - } else { - info.type = AUDIOTRACK; - info.isMute = false; - info.isBlind = true; - info.isLocked = false; - } - AddTrackCommand *addTrack = new AddTrackCommand(this, ix, info, true); - m_commandStack->push(addTrack); - setDocumentModified(); - } -} - -void CustomTrackView::slotDeleteTrack(int ix) -{ - TrackDialog d(m_document, parentWidget()); - d.label->setText(i18n("Delete track")); - d.before_select->setHidden(true); - d.track_nb->setMaximum(m_document->tracksCount() - 1); - d.track_nb->setValue(ix); - d.slotUpdateName(ix); - d.setWindowTitle(i18n("Delete Track")); - d.video_track->setHidden(true); - d.audio_track->setHidden(true); - if (d.exec() == QDialog::Accepted) { - ix = d.track_nb->value(); - TrackInfo info = m_document->trackInfoAt(m_document->tracksCount() - ix - 1); - deleteTimelineTrack(ix, info); - setDocumentModified(); - /*AddTrackCommand* command = new AddTrackCommand(this, ix, info, false); - m_commandStack->push(command);*/ - } -} - -void CustomTrackView::slotChangeTrack(int ix) -{ - TrackDialog d(m_document, parentWidget()); - d.label->setText(i18n("Change track")); - d.before_select->setHidden(true); - d.track_nb->setMaximum(m_document->tracksCount() - 1); - d.track_nb->setValue(ix); - d.slotUpdateName(ix); - d.setWindowTitle(i18n("Change Track Type")); - - if (m_document->trackInfoAt(m_document->tracksCount() - ix - 1).type == VIDEOTRACK) - d.video_track->setChecked(true); - else - d.audio_track->setChecked(true); - - if (d.exec() == QDialog::Accepted) { - TrackInfo info; - info.isLocked = false; - info.isMute = false; - ix = d.track_nb->value(); - - if (d.video_track->isChecked()) { - info.type = VIDEOTRACK; - info.isBlind = false; - } else { - info.type = AUDIOTRACK; - info.isBlind = true; - } - changeTimelineTrack(ix, info); - setDocumentModified(); - } -} - - -void CustomTrackView::deleteTimelineTrack(int ix, TrackInfo trackinfo) -{ - double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2; - QRectF r(0, startY, sceneRect().width(), m_tracksHeight / 2 - 1); - QList selection = m_scene->items(r); - QUndoCommand *deleteTrack = new QUndoCommand(); - deleteTrack->setText("Delete track"); - - // Delete all clips in selected track - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *item = static_cast (selection.at(i)); - new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false, false, true, deleteTrack); - m_scene->removeItem(item); - delete item; - item = NULL; - } else if (selection.at(i)->type() == TRANSITIONWIDGET) { - Transition *item = static_cast (selection.at(i)); - new AddTransitionCommand(this, item->info(), item->transitionEndTrack(), item->toXML(), true, false, deleteTrack); - m_scene->removeItem(item); - delete item; - item = NULL; - } - } - - new AddTrackCommand(this, ix, trackinfo, false, deleteTrack); - m_commandStack->push(deleteTrack); -} - -void CustomTrackView::changeTimelineTrack(int ix, TrackInfo trackinfo) -{ - TrackInfo oldinfo = m_document->trackInfoAt(m_document->tracksCount() - ix - 1); - ChangeTrackCommand *changeTrack = new ChangeTrackCommand(this, ix, oldinfo, trackinfo); - m_commandStack->push(changeTrack); -} - -void CustomTrackView::autoTransition() -{ - QList itemList = scene()->selectedItems(); - if (itemList.count() != 1 || itemList.at(0)->type() != TRANSITIONWIDGET) { - emit displayMessage(i18n("You must select one transition for this action"), ErrorMessage); - return; - } - Transition *tr = static_cast (itemList.at(0)); - tr->setAutomatic(!tr->isAutomatic()); - QDomElement transition = tr->toXML(); - m_document->renderer()->mltUpdateTransition(transition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_document->tracksCount() - transition.attribute("transition_atrack").toInt(), tr->startPos(), tr->endPos(), transition); - setDocumentModified(); -} - - -QStringList CustomTrackView::getLadspaParams(QDomElement effect) const -{ - QStringList result; - QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull() && e.attribute("type") == "constant") { - if (e.hasAttribute("factor")) { - double factor = e.attribute("factor").toDouble(); - double value = e.attribute("value").toDouble(); - value = value / factor; - result.append(QString::number(value)); - } else result.append(e.attribute("value")); - } - } - return result; -} - -void CustomTrackView::clipNameChanged(const QString id, const QString name) -{ - QList list = scene()->items(); - ClipItem *clip = NULL; - for (int i = 0; i < list.size(); ++i) { - if (list.at(i)->type() == AVWIDGET) { - clip = static_cast (list.at(i)); - if (clip->clipProducer() == id) { - clip->setClipName(name); - } - } - } - viewport()->update(); -} - -void CustomTrackView::getClipAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum) -{ - minimum = GenTime(); - maximum = GenTime(); - QList selection; - selection = m_scene->items(0, item->track() * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), 2); - selection.removeAll(item); - for (int i = 0; i < selection.count(); i++) { - AbstractClipItem *clip = static_cast (selection.at(i)); - if (clip && clip->type() == AVWIDGET) { - if (clip->endPos() <= item->startPos() && clip->endPos() > minimum) minimum = clip->endPos(); - if (clip->startPos() > item->startPos() && (clip->startPos() < maximum || maximum == GenTime())) maximum = clip->startPos(); - } - } -} - -void CustomTrackView::getTransitionAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum) -{ - minimum = GenTime(); - maximum = GenTime(); - QList selection; - selection = m_scene->items(0, (item->track() + 1) * m_tracksHeight, sceneRect().width(), 2); - selection.removeAll(item); - for (int i = 0; i < selection.count(); i++) { - AbstractClipItem *clip = static_cast (selection.at(i)); - if (clip && clip->type() == TRANSITIONWIDGET) { - if (clip->endPos() <= item->startPos() && clip->endPos() > minimum) minimum = clip->endPos(); - if (clip->startPos() > item->startPos() && (clip->startPos() < maximum || maximum == GenTime())) maximum = clip->startPos(); - } - } -} - - -void CustomTrackView::loadGroups(const QDomNodeList groups) -{ - for (int i = 0; i < groups.count(); i++) { - QDomNodeList children = groups.at(i).childNodes(); - scene()->clearSelection(); - for (int nodeindex = 0; nodeindex < children.count(); nodeindex++) { - QDomNode n = children.item(nodeindex); - QDomElement elem = n.toElement(); - int pos = elem.attribute("position").toInt(); - int track = elem.attribute("track").toInt(); - if (elem.tagName() == "clipitem") { - ClipItem *clip = getClipItemAt(pos, track); //m_document->tracksCount() - transitiontrack); - if (clip) clip->setSelected(true); - } else { - Transition *clip = getTransitionItemAt(pos, track); //m_document->tracksCount() - transitiontrack); - if (clip) clip->setSelected(true); - } - } - groupSelectedItems(false, true); - } -} - -void CustomTrackView::splitAudio() -{ - resetSelectionGroup(); - QList selection = scene()->selectedItems(); - if (selection.isEmpty()) { - emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage); - return; - } - QUndoCommand *splitCommand = new QUndoCommand(); - splitCommand->setText(i18n("Split audio")); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast (selection.at(i)); - if (clip->clipType() == AV || clip->clipType() == PLAYLIST) { - if (clip->parentItem()) { - emit displayMessage(i18n("Cannot split audio of grouped clips"), ErrorMessage); - } else { - new SplitAudioCommand(this, clip->track(), clip->startPos(), splitCommand); - } - } - } - } - m_commandStack->push(splitCommand); -} - -void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split) -{ - ClipItem *clip = getClipItemAt(pos, track); - if (clip == NULL) { - kDebug() << "// Cannot find clip to split!!!"; - return; - } - if (split) { - int start = pos.frames(m_document->fps()); - int freetrack = m_document->tracksCount() - track - 1; - for (; freetrack > 0; freetrack--) { - kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack); - if (m_document->trackInfoAt(freetrack - 1).type == AUDIOTRACK) { - kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack); - if (m_document->renderer()->mltTrackDuration(freetrack) < start || m_document->renderer()->mltGetSpaceLength(pos, freetrack, false) >= clip->cropDuration().frames(m_document->fps())) { - kDebug() << "FOUND SPACE ON TRK: " << freetrack; - break; - } - } - } - kDebug() << "GOT TRK: " << track; - if (freetrack == 0) { - emit displayMessage(i18n("No empty space to put clip audio"), ErrorMessage); - } else { - ItemInfo info = clip->info(); - info.track = m_document->tracksCount() - freetrack; - addClip(clip->xml(), clip->clipProducer(), info, clip->effectList()); - scene()->clearSelection(); - clip->setSelected(true); - ClipItem *audioClip = getClipItemAt(start, info.track); - if (audioClip) { - clip->setVideoOnly(true); - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->videoProducer()) == false) { - emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); - } - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - info.track, start, clip->baseClip()->audioProducer(info.track)) == false) { - emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, info.track), ErrorMessage); - } - audioClip->setSelected(true); - audioClip->setAudioOnly(true); - groupSelectedItems(false, true); - } - } - } else { - // unsplit clip: remove audio part and change video part to normal clip - if (clip->parentItem() == NULL || clip->parentItem()->type() != GROUPWIDGET) { - kDebug() << "//CANNOT FIND CLP GRP"; - return; - } - AbstractGroupItem *grp = static_cast (clip->parentItem()); - QList children = grp->childItems(); - if (children.count() != 2) { - kDebug() << "//SOMETHING IS WRONG WITH CLP GRP"; - return; - } - for (int i = 0; i < children.count(); i++) { - if (children.at(i) != clip) { - ClipItem *clp = static_cast (children.at(i)); - ItemInfo info = clip->info(); - deleteClip(clp->info()); - clip->setVideoOnly(false); - if (!m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - info.track, info.startPos.frames(m_document->fps()), clip->baseClip()->producer(info.track))) { - emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", info.startPos.frames(m_document->fps()), info.track), ErrorMessage); - } - break; - } - } - clip->setFlag(QGraphicsItem::ItemIsMovable, true); - m_document->clipManager()->removeGroup(grp); - scene()->destroyItemGroup(grp); - } -} - -void CustomTrackView::setVideoOnly() -{ - resetSelectionGroup(); - QList selection = scene()->selectedItems(); - if (selection.isEmpty()) { - emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage); - return; - } - QUndoCommand *videoCommand = new QUndoCommand(); - videoCommand->setText(i18n("Video only")); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast (selection.at(i)); - if (clip->clipType() == AV || clip->clipType() == PLAYLIST) { - if (clip->parentItem()) { - emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage); - } else { - new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), true, false, clip->isVideoOnly(), clip->isAudioOnly(), videoCommand); - } - } - } - } - m_commandStack->push(videoCommand); -} - -void CustomTrackView::setAudioOnly() -{ - resetSelectionGroup(); - QList selection = scene()->selectedItems(); - if (selection.isEmpty()) { - emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage); - return; - } - QUndoCommand *videoCommand = new QUndoCommand(); - videoCommand->setText(i18n("Audio only")); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast (selection.at(i)); - if (clip->clipType() == AV || clip->clipType() == PLAYLIST) { - if (clip->parentItem()) { - emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage); - } else { - new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), false, true, clip->isVideoOnly(), clip->isAudioOnly(), videoCommand); - } - } - } - } - m_commandStack->push(videoCommand); -} - -void CustomTrackView::setAudioAndVideo() -{ - resetSelectionGroup(); - QList selection = scene()->selectedItems(); - if (selection.isEmpty()) { - emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage); - return; - } - QUndoCommand *videoCommand = new QUndoCommand(); - videoCommand->setText(i18n("Audio and Video")); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast (selection.at(i)); - if (clip->clipType() == AV || clip->clipType() == PLAYLIST) { - if (clip->parentItem()) { - emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage); - } else { - new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), false, false, clip->isVideoOnly(), clip->isAudioOnly(), videoCommand); - } - } - } - } - m_commandStack->push(videoCommand); -} - -void CustomTrackView::doChangeClipType(const GenTime &pos, int track, bool videoOnly, bool audioOnly) -{ - ClipItem *clip = getClipItemAt(pos, track); - if (clip == NULL) { - kDebug() << "// Cannot find clip to split!!!"; - return; - } - if (videoOnly) { - int start = pos.frames(m_document->fps()); - clip->setVideoOnly(true); - clip->setAudioOnly(false); - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->videoProducer()) == false) { - emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); - } - } else if (audioOnly) { - int start = pos.frames(m_document->fps()); - clip->setAudioOnly(true); - clip->setVideoOnly(false); - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->audioProducer(track)) == false) { - emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); - } - } else { - int start = pos.frames(m_document->fps()); - clip->setAudioOnly(false); - clip->setVideoOnly(false); - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->producer(track)) == false) { - emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); - } - } - clip->update(); - setDocumentModified(); -} - -void CustomTrackView::updateClipTypeActions(ClipItem *clip) -{ - if (clip == NULL || (clip->clipType() != AV && clip->clipType() != PLAYLIST)) { - m_clipTypeGroup->setEnabled(false); - } else { - m_clipTypeGroup->setEnabled(true); - QList actions = m_clipTypeGroup->actions(); - QString lookup; - if (clip->isAudioOnly()) lookup = "clip_audio_only"; - else if (clip->isVideoOnly()) lookup = "clip_video_only"; - else lookup = "clip_audio_and_video"; - for (int i = 0; i < actions.count(); i++) { - if (actions.at(i)->data().toString() == lookup) { - actions.at(i)->setChecked(true); - break; - } - } - } -} - -void CustomTrackView::slotGoToMarker(QAction *action) -{ - int pos = action->data().toInt(); - setCursorPos(pos, true); -} - -void CustomTrackView::reloadTransitionLumas() -{ - QString lumaNames; - QString lumaFiles; - QDomElement lumaTransition = MainWindow::transitions.getEffectByTag("luma", "luma"); - QDomNodeList params = lumaTransition.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (e.attribute("tag") == "resource") { - lumaNames = e.attribute("paramlistdisplay"); - lumaFiles = e.attribute("paramlist"); - break; - } - } - - QList itemList = items(); - Transition *transitionitem; - QDomElement transitionXml; - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == TRANSITIONWIDGET) { - transitionitem = static_cast (itemList.at(i)); - transitionXml = transitionitem->toXML(); - if (transitionXml.attribute("id") == "luma" && transitionXml.attribute("tag") == "luma") { - QDomNodeList params = transitionXml.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (e.attribute("tag") == "resource") { - e.setAttribute("paramlistdisplay", lumaNames); - e.setAttribute("paramlist", lumaFiles); - break; - } - } - } - if (transitionXml.attribute("id") == "composite" && transitionXml.attribute("tag") == "composite") { - QDomNodeList params = transitionXml.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (e.attribute("tag") == "luma") { - e.setAttribute("paramlistdisplay", lumaNames); - e.setAttribute("paramlist", lumaFiles); - break; - } - } - } - } - } - emit transitionItemSelected(NULL); -} - -double CustomTrackView::fps() const -{ - return m_document->fps(); -} - -void CustomTrackView::updateProjectFps() -{ - // update all clips to the new fps - resetSelectionGroup(); - scene()->clearSelection(); - m_dragItem = NULL; - QList itemList = items(); - for (int i = 0; i < itemList.count(); i++) { - // remove all items and re-add them one by one - if (itemList.at(i) != m_cursorLine && itemList.at(i)->parentItem() == NULL) m_scene->removeItem(itemList.at(i)); - } - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->parentItem() == 0 && (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET)) { - AbstractClipItem *clip = static_cast (itemList.at(i)); - clip->updateFps(m_document->fps()); - m_scene->addItem(clip); - } else if (itemList.at(i)->type() == GROUPWIDGET) { - AbstractGroupItem *grp = static_cast (itemList.at(i)); - QList children = grp->childItems(); - for (int j = 0; j < children.count(); j++) { - if (children.at(j)->type() == AVWIDGET || children.at(j)->type() == TRANSITIONWIDGET) { - AbstractClipItem *clip = static_cast (children.at(j)); - clip->setFlag(QGraphicsItem::ItemIsMovable, true); - clip->updateFps(m_document->fps()); - } - } - m_document->clipManager()->removeGroup(grp); - m_scene->addItem(grp); - scene()->destroyItemGroup(grp); - for (int j = 0; j < children.count(); j++) { - if (children.at(j)->type() == AVWIDGET || children.at(j)->type() == TRANSITIONWIDGET) { - //children.at(j)->setParentItem(0); - children.at(j)->setSelected(true); - } - } - groupSelectedItems(true, true); - } else if (itemList.at(i)->type() == GUIDEITEM) { - Guide *g = static_cast(itemList.at(i)); - g->updatePos(); - m_scene->addItem(g); - } - } - viewport()->update(); -} - -void CustomTrackView::slotTrackDown() -{ - if (m_selectedTrack > m_document->tracksCount() - 2) m_selectedTrack = 0; - else m_selectedTrack++; - emit updateTrackHeaders(); - QRectF rect(mapToScene(QPoint(10, 0)).x(), m_selectedTrack * m_tracksHeight, 10, m_tracksHeight); - ensureVisible(rect, 0, 0); - viewport()->update(); -} - -void CustomTrackView::slotTrackUp() -{ - if (m_selectedTrack > 0) m_selectedTrack--; - else m_selectedTrack = m_document->tracksCount() - 1; - emit updateTrackHeaders(); - QRectF rect(mapToScene(QPoint(10, 0)).x(), m_selectedTrack * m_tracksHeight, 10, m_tracksHeight); - ensureVisible(rect, 0, 0); - viewport()->update(); -} - -int CustomTrackView::selectedTrack() const -{ - return m_selectedTrack; -} - -void CustomTrackView::slotSelectTrack(int ix) -{ - m_selectedTrack = qMax(0, ix); - m_selectedTrack = qMin(ix, m_document->tracksCount() - 1); - emit updateTrackHeaders(); - QRectF rect(mapToScene(QPoint(10, 0)).x(), m_selectedTrack * m_tracksHeight, 10, m_tracksHeight); - ensureVisible(rect, 0, 0); - viewport()->update(); -} - -void CustomTrackView::selectClip(bool add, bool group) -{ - QRectF rect(m_cursorPos, m_selectedTrack * m_tracksHeight + m_tracksHeight / 2, 1, 1); - QList selection = m_scene->items(rect); - resetSelectionGroup(group); - if (!group) m_scene->clearSelection(); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - selection.at(i)->setSelected(add); - break; - } - } - if (group) groupSelectedItems(); -} - -void CustomTrackView::selectTransition(bool add, bool group) -{ - QRectF rect(m_cursorPos, m_selectedTrack * m_tracksHeight + m_tracksHeight, 1, 1); - QList selection = m_scene->items(rect); - resetSelectionGroup(group); - if (!group) m_scene->clearSelection(); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == TRANSITIONWIDGET) { - selection.at(i)->setSelected(add); - break; - } - } - if (group) groupSelectedItems(); -} - -QStringList CustomTrackView::extractTransitionsLumas() -{ - QStringList urls; - QList itemList = items(); - Transition *transitionitem; - QDomElement transitionXml; - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == TRANSITIONWIDGET) { - transitionitem = static_cast (itemList.at(i)); - transitionXml = transitionitem->toXML(); - QString luma = EffectsList::parameter(transitionXml, "luma"); - if (!luma.isEmpty()) urls << luma; - } - } - return urls; -} - -void CustomTrackView::setEditMode(EDITMODE mode) -{ - m_scene->setEditMode(mode); -} - -void CustomTrackView::checkTrackSequence(int track) -{ - QList times = m_document->renderer()->checkTrackSequence(m_document->tracksCount() - track); - //track = m_document->tracksCount() -track; - QRectF rect(0, track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), 2); - QList selection = m_scene->items(rect); - QList timelineList; - timelineList.append(0); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast (selection.at(i)); - int start = clip->startPos().frames(m_document->fps()); - int end = clip->endPos().frames(m_document->fps()); - if (!timelineList.contains(start)) timelineList.append(start); - if (!timelineList.contains(end)) timelineList.append(end); - } - } - qSort(timelineList); - kDebug() << "// COMPARE:\n" << times << "\n" << timelineList << "\n-------------------"; - if (times != timelineList) KMessageBox::sorry(this, i18n("error"), i18n("TRACTOR")); -} - -void CustomTrackView::insertZoneOverwrite(QStringList data, int in) -{ - DocClipBase *clip = m_document->getBaseClip(data.at(0)); - ItemInfo info; - info.startPos = GenTime(in, m_document->fps()); - info.cropStart = GenTime(data.at(1).toInt(), m_document->fps()); - info.endPos = info.startPos + GenTime(data.at(2).toInt(), m_document->fps()) - info.cropStart; - info.cropDuration = info.endPos - info.startPos; - info.track = m_selectedTrack; - QUndoCommand *addCommand = new QUndoCommand(); - addCommand->setText(i18n("Insert clip")); - adjustTimelineClips(OVERWRITEEDIT, NULL, info, addCommand); - new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false, addCommand); - m_commandStack->push(addCommand); -} - -void CustomTrackView::clearSelection() -{ - resetSelectionGroup(); - scene()->clearSelection(); - m_dragItem = NULL; - emit clipItemSelected(NULL); -} - diff -Nru kdenlive-0.7.7/src/docclipbase.cpp~ kdenlive-0.7.7.1/src/docclipbase.cpp~ --- kdenlive-0.7.7/src/docclipbase.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/docclipbase.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,969 +0,0 @@ -/*************************************************************************** - * DocClipBase.cpp - description * - * ------------------- * - * begin : Fri Apr 12 2002 * - * Copyright (C) 2002 by Jason Wood (jasonwood@blueyonder.co.uk) * - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - - - -#include "docclipbase.h" -#include "kdenlivesettings.h" -#include "kthumb.h" -#include "clipmanager.h" - -#include -#include - -#include - -#include - -DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id) : - QObject(), - m_audioFrameCache(), - m_refcount(0), - m_baseTrackProducers(), - m_audioTrackProducers(), - m_videoOnlyProducer(NULL), - m_snapMarkers(QList < CommentedTime >()), - m_duration(), - m_audioTimer(NULL), - m_thumbProd(NULL), - m_audioThumbCreated(false), - m_id(id), - m_placeHolder(xml.hasAttribute("placeholder")), - m_properties() -{ - int type = xml.attribute("type").toInt(); - m_clipType = (CLIPTYPE) type; - if (m_placeHolder) xml.removeAttribute("placeholder"); - QDomNamedNodeMap attributes = xml.attributes(); - for (int i = 0; i < attributes.count(); i++) { - m_properties.insert(attributes.item(i).nodeName(), attributes.item(i).nodeValue()); - } - - if (xml.hasAttribute("cutzones")) { - QStringList cuts = xml.attribute("cutzones").split(";", QString::SkipEmptyParts); - for (int i = 0; i < cuts.count(); i++) { - QString z = cuts.at(i); - addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt(), z.section('-', 2, 2)); - } - } - - KUrl url = KUrl(xml.attribute("resource")); - if (!m_properties.contains("file_hash") && !url.isEmpty()) getFileHash(url.path()); - - if (xml.hasAttribute("duration")) { - setDuration(GenTime(xml.attribute("duration").toInt(), KdenliveSettings::project_fps())); - } else { - int out = xml.attribute("out").toInt(); - int in = xml.attribute("in").toInt(); - setDuration(GenTime(out - in, KdenliveSettings::project_fps())); - } - - if (!m_properties.contains("name")) m_properties.insert("name", url.fileName()); - - //if (!url.isEmpty() && QFile::exists(url.path())) - { - m_thumbProd = new KThumb(clipManager, url, m_id, m_properties.value("file_hash")); - if (m_clipType == AV || m_clipType == AUDIO || m_clipType == PLAYLIST) slotCreateAudioTimer(); - } - //kDebug() << "type is video" << (m_clipType == AV) << " " << m_clipType; -} - -/*DocClipBase & DocClipBase::operator=(const DocClipBase & clip) { - DocClipBase::operator=(clip); - m_id = clip.getId(); - m_clipType = clip.clipType(); - m_name = clip.name(); - m_duration = clip.duration(); - m_audioThumbCreated = clip.audioThumbCreated(); - m_properties = clip.properties(); - return *this; -}*/ - -DocClipBase::~DocClipBase() -{ - kDebug() << "CLIP " << m_id << " DELETED******************************"; - delete m_thumbProd; - if (m_audioTimer) { - m_audioTimer->stop(); - delete m_audioTimer; - } - /*kDebug() <<" * * *CNT "< 0) kDebug()<<"YOYO: "<get_out()<<", CUT: "<is_cut();*/ - qDeleteAll(m_baseTrackProducers); - m_baseTrackProducers.clear(); - qDeleteAll(m_audioTrackProducers); - m_audioTrackProducers.clear(); - delete m_videoOnlyProducer; - m_videoOnlyProducer = NULL; -} - -void DocClipBase::setZone(QPoint zone) -{ - m_properties.insert("zone_in", QString::number(zone.x())); - m_properties.insert("zone_out", QString::number(zone.y())); -} - -QPoint DocClipBase::zone() const -{ - QPoint zone(m_properties.value("zone_in", "0").toInt(), m_properties.value("zone_out", "50").toInt()); - return zone; -} - -void DocClipBase::slotCreateAudioTimer() -{ - connect(m_thumbProd, SIGNAL(audioThumbReady(QMap >)), this , SLOT(updateAudioThumbnail(QMap >))); - connect(this, SIGNAL(getAudioThumbs()), this , SLOT(slotGetAudioThumbs())); - m_audioTimer = new QTimer(this); - connect(m_audioTimer, SIGNAL(timeout()), this, SLOT(slotGetAudioThumbs())); -} - -void DocClipBase::askForAudioThumbs() -{ - kDebug() << "*************** ASK AUDIO TBS"; - if (m_thumbProd && m_audioTimer) m_thumbProd->askForAudioThumbs(getId()); -} - -void DocClipBase::slotClearAudioCache() -{ - if (m_thumbProd) m_thumbProd->stopAudioThumbs(); - if (m_audioTimer != NULL) m_audioTimer->stop(); - m_audioFrameCache.clear(); - m_audioThumbCreated = false; -} - -/*void DocClipBase::getClipMainThumb() { - if (m_thumbProd) m_thumbProd->getMainThumb(m_properties.value("thumbnail").toInt()); -}*/ - -KThumb *DocClipBase::thumbProducer() -{ - return m_thumbProd; -} - -bool DocClipBase::audioThumbCreated() const -{ - return m_audioThumbCreated; -} - -const QString DocClipBase::name() const -{ - - return m_properties.value("name"); -} - -const QString &DocClipBase::getId() const -{ - return m_id; -} - -void DocClipBase::setId(const QString &newId) -{ - m_id = newId; -} - -const CLIPTYPE & DocClipBase::clipType() const -{ - return m_clipType; -} - -void DocClipBase::setClipType(CLIPTYPE type) -{ - m_clipType = type; - - m_properties.insert("type", QString::number((int) type)); - if (m_thumbProd && m_audioTimer == NULL && (m_clipType == AV || m_clipType == AUDIO || m_clipType == PLAYLIST)) - slotCreateAudioTimer(); -} - -KUrl DocClipBase::fileURL() const -{ - QString res = m_properties.value("resource"); - if (m_clipType != COLOR && !res.isEmpty()) return KUrl(res); - return KUrl(); -} - -void DocClipBase::setClipThumbFrame(const uint &ix) -{ - m_properties.insert("thumbnail", QString::number((int) ix)); -} - -uint DocClipBase::getClipThumbFrame() const -{ - return (uint) m_properties.value("thumbnail").toInt(); -} - -const QString DocClipBase::description() const -{ - return m_properties.value("description"); -} - -bool DocClipBase::isTransparent() const -{ - return (m_properties.value("transparency") == "1"); -} - -const QString DocClipBase::getProperty(const QString prop) const -{ - return m_properties.value(prop); -} - -void DocClipBase::setDuration(GenTime dur) -{ - m_duration = dur; - m_properties.insert("duration", QString::number((int) dur.frames(KdenliveSettings::project_fps()))); -} - -const GenTime &DocClipBase::duration() const -{ - return m_duration; -} - -const GenTime DocClipBase::maxDuration() const -{ - if (m_clipType == COLOR || m_clipType == IMAGE || m_clipType == TEXT || (m_clipType == SLIDESHOW && m_properties.value("loop") == "1")) { - /*const GenTime dur(15000, KdenliveSettings::project_fps()); - return dur;*/ - return GenTime(); - } - return m_duration; -} - -bool DocClipBase::hasFileSize() const -{ - return true; -} - -qulonglong DocClipBase::fileSize() const -{ - return m_properties.value("file_size").toULongLong(); -} - -// virtual -QDomElement DocClipBase::toXML() const -{ - QDomDocument doc; - QDomElement clip = doc.createElement("producer"); - - QMapIterator i(m_properties); - while (i.hasNext()) { - i.next(); - if (!i.value().isEmpty()) clip.setAttribute(i.key(), i.value()); - } - doc.appendChild(clip); - if (!m_cutZones.isEmpty()) { - QStringList cuts; - for (int i = 0; i < m_cutZones.size(); i++) { - CutZoneInfo info = m_cutZones.at(i); - cuts << QString::number(info.zone.x()) + "-" + QString::number(info.zone.y()) + "-" + info.description; - } - clip.setAttribute("cutzones", cuts.join(";")); - } - //kDebug() << "/// CLIP XML: " << doc.toString(); - return doc.documentElement(); -} - - -void DocClipBase::setAudioThumbCreated(bool isDone) -{ - m_audioThumbCreated = isDone; -} - - -void DocClipBase::setThumbnail(const QPixmap & pixmap) -{ - m_thumbnail = pixmap; -} - -const QPixmap & DocClipBase::thumbnail() const -{ - return m_thumbnail; -} - -void DocClipBase::updateAudioThumbnail(QMap > data) -{ - //kDebug() << "CLIPBASE RECIEDVED AUDIO DATA*********************************************"; - m_audioFrameCache = data; - m_audioThumbCreated = true; - emit gotAudioData(); -} - -QList < GenTime > DocClipBase::snapMarkers() const -{ - QList < GenTime > markers; - - for (int count = 0; count < m_snapMarkers.count(); ++count) { - markers.append(m_snapMarkers.at(count).time()); - } - - return markers; -} - -QList < CommentedTime > DocClipBase::commentedSnapMarkers() const -{ - return m_snapMarkers; -} - - -void DocClipBase::addSnapMarker(const GenTime & time, QString comment) -{ - QList < CommentedTime >::Iterator it = m_snapMarkers.begin(); - for (it = m_snapMarkers.begin(); it != m_snapMarkers.end(); ++it) { - if ((*it).time() >= time) - break; - } - - if ((it != m_snapMarkers.end()) && ((*it).time() == time)) { - (*it).setComment(comment); - //kError() << "trying to add Snap Marker that already exists, this will cause inconsistancies with undo/redo"; - } else { - CommentedTime t(time, comment); - m_snapMarkers.insert(it, t); - } - -} - -void DocClipBase::editSnapMarker(const GenTime & time, QString comment) -{ - QList < CommentedTime >::Iterator it; - for (it = m_snapMarkers.begin(); it != m_snapMarkers.end(); ++it) { - if ((*it).time() == time) - break; - } - if (it != m_snapMarkers.end()) { - (*it).setComment(comment); - } else { - kError() << "trying to edit Snap Marker that does not already exists"; - } -} - -QString DocClipBase::deleteSnapMarker(const GenTime & time) -{ - QString result = i18n("Marker"); - QList < CommentedTime >::Iterator itt = m_snapMarkers.begin(); - - while (itt != m_snapMarkers.end()) { - if ((*itt).time() == time) - break; - ++itt; - } - - if ((itt != m_snapMarkers.end()) && ((*itt).time() == time)) { - result = (*itt).comment(); - m_snapMarkers.erase(itt); - } - return result; -} - - -GenTime DocClipBase::hasSnapMarkers(const GenTime & time) -{ - QList < CommentedTime >::Iterator itt = m_snapMarkers.begin(); - - while (itt != m_snapMarkers.end()) { - if ((*itt).time() == time) - return time; - ++itt; - } - - return GenTime(0.0); -} - -GenTime DocClipBase::findPreviousSnapMarker(const GenTime & currTime) -{ - int it; - for (it = 0; it < m_snapMarkers.count(); it++) { - if (m_snapMarkers.at(it).time() >= currTime) - break; - } - if (it == 0) return GenTime(); - else if (it == m_snapMarkers.count() - 1 && m_snapMarkers.at(it).time() < currTime) - return m_snapMarkers.at(it).time(); - else return m_snapMarkers.at(it - 1).time(); -} - -GenTime DocClipBase::findNextSnapMarker(const GenTime & currTime) -{ - int it; - for (it = 0; it < m_snapMarkers.count(); it++) { - if (m_snapMarkers.at(it).time() > currTime) - break; - } - if (it < m_snapMarkers.count() && m_snapMarkers.at(it).time() > currTime) return m_snapMarkers.at(it).time(); - return duration(); -} - -QString DocClipBase::markerComment(GenTime t) -{ - QList < CommentedTime >::Iterator itt = m_snapMarkers.begin(); - - while (itt != m_snapMarkers.end()) { - if ((*itt).time() == t) - return (*itt).comment(); - ++itt; - } - return QString(); -} - -void DocClipBase::clearProducers() -{ - m_baseTrackProducers.clear(); -} - -void DocClipBase::deleteProducers() -{ - kDebug() << "// CLIP KILL PRODS ct: " << m_baseTrackProducers.count(); - if (m_thumbProd) m_thumbProd->clearProducer(); - /*kDebug()<<"// CLIP KILL PRODS ct: "<get("id"); - deleteProducers(); - } - QString id = producer->get("id"); - if (id.contains('_')) { - // this is a subtrack producer, insert it at correct place - id = id.section('_', 1); - if (id.endsWith("audio")) { - int pos = id.section('_', 0, 0).toInt(); - if (pos >= m_audioTrackProducers.count()) { - while (m_audioTrackProducers.count() - 1 < pos) { - m_audioTrackProducers.append(NULL); - } - } - if (m_audioTrackProducers.at(pos) == NULL) m_audioTrackProducers[pos] = producer; - return; - } else if (id.endsWith("video")) { - m_videoOnlyProducer = producer; - return; - } - int pos = id.toInt(); - if (pos >= m_baseTrackProducers.count()) { - while (m_baseTrackProducers.count() - 1 < pos) { - m_baseTrackProducers.append(NULL); - } - } - if (m_baseTrackProducers.at(pos) == NULL) m_baseTrackProducers[pos] = producer; - } else { - if (m_baseTrackProducers.isEmpty()) m_baseTrackProducers.append(producer); - else if (m_baseTrackProducers.at(0) == NULL) m_baseTrackProducers[0] = producer; - } - //m_clipProducer = producer; - //m_clipProducer->set("transparency", m_properties.value("transparency").toInt()); - if (m_thumbProd && (reset || !m_thumbProd->hasProducer())) m_thumbProd->setProducer(producer); -} - -Mlt::Producer *DocClipBase::audioProducer(int track) -{ - if (m_audioTrackProducers.count() <= track) { - while (m_audioTrackProducers.count() - 1 < track) { - m_audioTrackProducers.append(NULL); - } - } - if (m_audioTrackProducers.at(track) == NULL) { - Mlt::Producer *base = producer(); - m_audioTrackProducers[track] = new Mlt::Producer(*(base->profile()), base->get("resource")); - if (m_properties.contains("force_aspect_ratio")) m_audioTrackProducers.at(track)->set("force_aspect_ratio", m_properties.value("force_aspect_ratio").toDouble()); - if (m_properties.contains("force_fps")) m_audioTrackProducers.at(track)->set("force_fps", m_properties.value("force_fps").toDouble()); - if (m_properties.contains("force_progressive")) m_audioTrackProducers.at(track)->set("force_progressive", m_properties.value("force_progressive").toInt()); - if (m_properties.contains("threads")) m_audioTrackProducers.at(track)->set("threads", m_properties.value("threads").toInt()); - m_audioTrackProducers.at(track)->set("video_index", -1); - if (m_properties.contains("audio_index")) m_audioTrackProducers.at(track)->set("audio_index", m_properties.value("audio_index").toInt()); - char *tmp = (char *) qstrdup(QString(getId() + '_' + QString::number(track) + "_audio").toUtf8().data()); - m_audioTrackProducers.at(track)->set("id", tmp); - delete[] tmp; - } - return m_audioTrackProducers.at(track); -} - -Mlt::Producer *DocClipBase::videoProducer() -{ - if (m_videoOnlyProducer == NULL) { - int i; - for (i = 0; i < m_baseTrackProducers.count(); i++) - if (m_baseTrackProducers.at(i) != NULL) break; - if (i >= m_baseTrackProducers.count()) return NULL; - m_videoOnlyProducer = new Mlt::Producer(*m_baseTrackProducers.at(i)->profile(), m_baseTrackProducers.at(i)->get("resource")); - if (m_properties.contains("force_aspect_ratio")) m_videoOnlyProducer->set("force_aspect_ratio", m_properties.value("force_aspect_ratio").toDouble()); - if (m_properties.contains("force_fps")) m_videoOnlyProducer->set("force_fps", m_properties.value("force_fps").toDouble()); - if (m_properties.contains("force_progressive")) m_videoOnlyProducer->set("force_progressive", m_properties.value("force_progressive").toInt()); - if (m_properties.contains("threads")) m_videoOnlyProducer->set("threads", m_properties.value("threads").toInt()); - m_videoOnlyProducer->set("audio_index", -1); - if (m_properties.contains("video_index")) m_videoOnlyProducer->set("video_index", m_properties.value("video_index").toInt()); - char *tmp = (char *) qstrdup(QString(getId() + "_video").toUtf8().data()); - m_videoOnlyProducer->set("id", tmp); - delete[] tmp; - } - return m_videoOnlyProducer; -} - -Mlt::Producer *DocClipBase::producer(int track) -{ - /*for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i)) kDebug() << "// PROD: " << i << ", ID: " << m_baseTrackProducers.at(i)->get("id"); - }*/ - if (track == -1 || (m_clipType != AUDIO && m_clipType != AV)) { - if (m_baseTrackProducers.count() == 0) return NULL; - for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i) != NULL) - return m_baseTrackProducers.at(i); - } - return NULL; - } - if (track >= m_baseTrackProducers.count()) { - while (m_baseTrackProducers.count() - 1 < track) { - m_baseTrackProducers.append(NULL); - } - } - if (m_baseTrackProducers.at(track) == NULL) { - int i; - for (i = 0; i < m_baseTrackProducers.count(); i++) - if (m_baseTrackProducers.at(i) != NULL) break; - - if (i >= m_baseTrackProducers.count()) return NULL; - - if (KIO::NetAccess::exists(KUrl(m_baseTrackProducers.at(i)->get("resource")), KIO::NetAccess::SourceSide, 0)) - m_baseTrackProducers[track] = new Mlt::Producer(*m_baseTrackProducers.at(i)->profile(), m_baseTrackProducers.at(i)->get("resource")); - else { // special case for placeholder clips - m_baseTrackProducers[track] = NULL; - return NULL; - } - - if (m_properties.contains("force_aspect_ratio")) m_baseTrackProducers[track]->set("force_aspect_ratio", m_properties.value("force_aspect_ratio").toDouble()); - if (m_properties.contains("force_fps")) m_baseTrackProducers[track]->set("force_fps", m_properties.value("force_fps").toDouble()); - if (m_properties.contains("force_progressive")) m_baseTrackProducers[track]->set("force_progressive", m_properties.value("force_progressive").toInt()); - if (m_properties.contains("threads")) m_baseTrackProducers[track]->set("threads", m_properties.value("threads").toInt()); - if (m_properties.contains("video_index")) m_baseTrackProducers[track]->set("video_index", m_properties.value("video_index").toInt()); - if (m_properties.contains("audio_index")) m_baseTrackProducers[track]->set("audio_index", m_properties.value("audio_index").toInt()); - char *tmp = (char *) qstrdup(QString(getId() + '_' + QString::number(track)).toUtf8().data()); - m_baseTrackProducers[track]->set("id", tmp); - delete[] tmp; - if (KdenliveSettings::dropbframes() && m_baseTrackProducers.at(i)->get("skip_loop_filter") && strcmp(m_baseTrackProducers.at(i)->get("skip_loop_filter"), "all") == 0) { - m_baseTrackProducers[track]->set("skip_loop_filter", "all"); - m_baseTrackProducers[track]->set("skip_frame", "bidir"); - } - } - return m_baseTrackProducers.at(track); -} - -void DocClipBase::setProducerProperty(const char *name, int data) -{ - for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i) != NULL) - m_baseTrackProducers[i]->set(name, data); - } -} - -void DocClipBase::setProducerProperty(const char *name, double data) -{ - for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i) != NULL) - m_baseTrackProducers[i]->set(name, data); - } -} - -void DocClipBase::setProducerProperty(const char *name, const char *data) -{ - for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i) != NULL) - m_baseTrackProducers[i]->set(name, data); - } -} - -void DocClipBase::resetProducerProperty(const char *name) -{ - for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i) != NULL) - m_baseTrackProducers[i]->set(name, (const char*) NULL); - } -} - -const char *DocClipBase::producerProperty(const char *name) const -{ - for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i) != NULL) { - return m_baseTrackProducers.at(i)->get(name); - } - } - return NULL; -} - - -void DocClipBase::slotRefreshProducer() -{ - if (m_baseTrackProducers.count() == 0) return; - kDebug() << "//////////// REFRESH CLIP !!!!!!!!!!!!!!!!"; - if (m_clipType == SLIDESHOW) { - /*char *tmp = (char *) qstrdup(getProperty("resource").toUtf8().data()); - Mlt::Producer producer(*(m_clipProducer->profile()), tmp); - delete[] tmp; - delete m_clipProducer; - m_clipProducer = new Mlt::Producer(producer.get_producer()); - if (!getProperty("out").isEmpty()) m_clipProducer->set_in_and_out(getProperty("in").toInt(), getProperty("out").toInt());*/ - setProducerProperty("ttl", getProperty("ttl").toInt()); - //m_clipProducer->set("id", getProperty("id")); - if (getProperty("fade") == "1") { - // we want a fade filter effect - kDebug() << "//////////// FADE WANTED"; - Mlt::Service clipService(m_baseTrackProducers.at(0)->get_service()); - int ct = 0; - Mlt::Filter *filter = clipService.filter(ct); - while (filter) { - if (strcmp(filter->get("mlt_service"), "luma") == 0) { - break; - } - ct++; - filter = clipService.filter(ct); - } - - if (filter && strcmp(filter->get("mlt_service"), "luma") == 0) { - filter->set("period", getProperty("ttl").toInt() - 1); - filter->set("luma.out", getProperty("luma_duration").toInt()); - QString resource = getProperty("luma_file"); - char *tmp = (char *) qstrdup(resource.toUtf8().data()); - filter->set("luma.resource", tmp); - delete[] tmp; - if (!getProperty("softness").isEmpty()) { - int soft = getProperty("softness").toInt(); - filter->set("luma.softness", (double) soft / 100.0); - } - } else { - // filter does not exist, create it... - Mlt::Filter *filter = new Mlt::Filter(*(m_baseTrackProducers.at(0)->profile()), "luma"); - filter->set("period", getProperty("ttl").toInt() - 1); - filter->set("luma.out", getProperty("luma_duration").toInt()); - QString resource = getProperty("luma_file"); - char *tmp = (char *) qstrdup(resource.toUtf8().data()); - filter->set("luma.resource", tmp); - delete[] tmp; - if (!getProperty("softness").isEmpty()) { - int soft = getProperty("softness").toInt(); - filter->set("luma.softness", (double) soft / 100.0); - } - clipService.attach(*filter); - } - } else { - kDebug() << "//////////// FADE NOT WANTED!!!"; - Mlt::Service clipService(m_baseTrackProducers.at(0)->get_service()); - int ct = 0; - Mlt::Filter *filter = clipService.filter(0); - while (filter) { - if (strcmp(filter->get("mlt_service"), "luma") == 0) { - clipService.detach(*filter); - } else ct++; - filter = clipService.filter(ct); - } - } - } -} - -void DocClipBase::setProperties(QMap properties) -{ - // changing clip type is not allowed - properties.remove("type"); - QMapIterator i(properties); - bool refreshProducer = false; - QStringList keys; - keys << "luma_duration" << "luma_file" << "fade" << "ttl" << "softness"; - while (i.hasNext()) { - i.next(); - setProperty(i.key(), i.value()); - if (m_clipType == SLIDESHOW && keys.contains(i.key())) refreshProducer = true; - } - if (refreshProducer) slotRefreshProducer(); -} - -void DocClipBase::setMetadata(QMap properties) -{ - m_metadata = properties; -} - -QMap DocClipBase::metadata() const -{ - return m_metadata; -} - -void DocClipBase::clearProperty(const QString &key) -{ - m_properties.remove(key); -} - -void DocClipBase::getFileHash(const QString url) -{ - if (m_clipType == SLIDESHOW) return; - QFile file(url); - if (file.open(QIODevice::ReadOnly)) { // write size and hash only if resource points to a file - QByteArray fileData; - QByteArray fileHash; - //kDebug() << "SETTING HASH of" << value; - m_properties.insert("file_size", QString::number(file.size())); - /* - * 1 MB = 1 second per 450 files (or faster) - * 10 MB = 9 seconds per 450 files (or faster) - */ - if (file.size() > 1000000*2) { - fileData = file.read(1000000); - if (file.seek(file.size() - 1000000)) - fileData.append(file.readAll()); - } else - fileData = file.readAll(); - file.close(); - fileHash = QCryptographicHash::hash(fileData, QCryptographicHash::Md5); - m_properties.insert("file_hash", QString(fileHash.toHex())); - } -} - -QString DocClipBase::getClipHash() const -{ - QString hash; - if (m_clipType == SLIDESHOW) hash = QCryptographicHash::hash(m_properties.value("resource").toAscii().data(), QCryptographicHash::Md5).toHex(); - else if (m_clipType == COLOR) hash = QCryptographicHash::hash(m_properties.value("colour").toAscii().data(), QCryptographicHash::Md5).toHex(); - else if (m_clipType == TEXT) hash = QCryptographicHash::hash(QString("title" + getId() + m_properties.value("xmldata")).toUtf8().data(), QCryptographicHash::Md5).toHex(); - else hash = m_properties.value("file_hash"); - return hash; -} - -// static -QString DocClipBase::getHash(const QString &path) -{ - QFile file(path); - if (file.open(QIODevice::ReadOnly)) { // write size and hash only if resource points to a file - QByteArray fileData; - QByteArray fileHash; - /* - * 1 MB = 1 second per 450 files (or faster) - * 10 MB = 9 seconds per 450 files (or faster) - */ - if (file.size() > 1000000*2) { - fileData = file.read(1000000); - if (file.seek(file.size() - 1000000)) - fileData.append(file.readAll()); - } else - fileData = file.readAll(); - file.close(); - return QCryptographicHash::hash(fileData, QCryptographicHash::Md5).toHex(); - } - return QString(); -} - -void DocClipBase::refreshThumbUrl() -{ - if (m_thumbProd) m_thumbProd->updateThumbUrl(m_properties.value("file_hash")); -} - -void DocClipBase::setProperty(const QString &key, const QString &value) -{ - m_properties.insert(key, value); - if (key == "resource") { - getFileHash(value); - if (m_thumbProd) m_thumbProd->updateClipUrl(KUrl(value), m_properties.value("file_hash")); - } else if (key == "out") setDuration(GenTime(value.toInt(), KdenliveSettings::project_fps())); - //else if (key == "transparency") m_clipProducer->set("transparency", value.toInt()); - else if (key == "colour") { - char *tmp = (char *) qstrdup(value.toUtf8().data()); - setProducerProperty("colour", tmp); - delete[] tmp; - } else if (key == "templatetext") { - char *tmp = (char *) qstrdup(value.toUtf8().data()); - setProducerProperty("templatetext", tmp); - delete[] tmp; - setProducerProperty("force_reload", 1); - } else if (key == "xmldata") { - char *tmp = (char *) qstrdup(value.toUtf8().data()); - setProducerProperty("xmldata", tmp); - delete[] tmp; - setProducerProperty("force_reload", 1); - } else if (key == "force_aspect_ratio") { - if (value.isEmpty()) { - m_properties.remove("force_aspect_ratio"); - resetProducerProperty("force_aspect_ratio"); - } else setProducerProperty("force_aspect_ratio", value.toDouble()); - } else if (key == "force_fps") { - if (value.isEmpty()) { - m_properties.remove("force_fps"); - resetProducerProperty("force_fps"); - } else setProducerProperty("force_fps", value.toDouble()); - } else if (key == "force_progressive") { - if (value.isEmpty()) { - m_properties.remove("force_progressive"); - resetProducerProperty("force_progressive"); - } else setProducerProperty("force_progressive", value.toInt()); - } else if (key == "threads") { - if (value.isEmpty()) { - m_properties.remove("threads"); - setProducerProperty("threads", 1); - } else setProducerProperty("threads", value.toInt()); - } else if (key == "video_index") { - if (value.isEmpty()) { - m_properties.remove("video_index"); - setProducerProperty("video_index", m_properties.value("default_video").toInt()); - } else setProducerProperty("video_index", value.toInt()); - } else if (key == "audio_index") { - if (value.isEmpty()) { - m_properties.remove("audio_index"); - setProducerProperty("audio_index", m_properties.value("default_audio").toInt()); - } else setProducerProperty("audio_index", value.toInt()); - } -} - -QMap DocClipBase::properties() const -{ - return m_properties; -} - -bool DocClipBase::slotGetAudioThumbs() -{ - kDebug() << "// GET AUD THUMBS"; - if (m_thumbProd == NULL) return false; - if (!KdenliveSettings::audiothumbnails() || m_audioTimer == NULL) { - if (m_audioTimer != NULL) m_audioTimer->stop(); - return false; - } - if (m_audioThumbCreated) { - m_audioTimer->stop(); - return false; - } - m_audioTimer->start(1500); - double lengthInFrames = duration().frames(KdenliveSettings::project_fps()); - m_thumbProd->getAudioThumbs(2, 0, lengthInFrames /*must be number of frames*/, 20); - return true; -} - -bool DocClipBase::isPlaceHolder() const -{ - return m_placeHolder; -} - -void DocClipBase::addCutZone(int in, int out, QString desc) -{ - CutZoneInfo info; - info.zone = QPoint(in, out); - info.description = desc; - for (int i = 0; i < m_cutZones.count(); i++) - if (m_cutZones.at(i).zone == info.zone) { - return; - } - m_cutZones.append(info); -} - -bool DocClipBase::hasCutZone(QPoint p) const -{ - for (int i = 0; i < m_cutZones.count(); i++) - if (m_cutZones.at(i).zone == p) return true; - return false; -} - - -void DocClipBase::removeCutZone(int in, int out) -{ - QPoint p(in, out); - for (int i = 0; i < m_cutZones.count(); i++) { - if (m_cutZones.at(i).zone == p) { - m_cutZones.removeAt(i); - i--; - } - } -} - -void DocClipBase::updateCutZone(int oldin, int oldout, int in, int out, QString desc) -{ - QPoint old(oldin, oldout); - for (int i = 0; i < m_cutZones.size(); ++i) { - if (m_cutZones.at(i).zone == old) { - CutZoneInfo info; - info.zone = QPoint(in, out); - info.description = desc; - m_cutZones.replace(i, info); - break; - } - } -} - -QList DocClipBase::cutZones() const -{ - return m_cutZones; -} - -bool DocClipBase::hasVideoCodec(const QString &codec) const -{ - Mlt::Producer *prod = NULL; - if (m_baseTrackProducers.count() == 0) return false; - for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i) != NULL) { - prod = m_baseTrackProducers.at(i); - break; - } - } - - if (!prod) return false; - int default_video = prod->get_int("video_index"); - char property[200]; - snprintf(property, sizeof(property), "meta.media.%d.codec.name", default_video); - return prod->get(property) == codec; -} - -bool DocClipBase::hasAudioCodec(const QString &codec) const -{ - Mlt::Producer *prod = NULL; - if (m_baseTrackProducers.count() == 0) return false; - for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i) != NULL) { - prod = m_baseTrackProducers.at(i); - break; - } - } - if (!prod) return false; - int default_video = prod->get_int("audio_index"); - char property[200]; - snprintf(property, sizeof(property), "meta.media.%d.codec.name", default_video); - return prod->get(property) == codec; -} - diff -Nru kdenlive-0.7.7/src/effectslistview.cpp~ kdenlive-0.7.7.1/src/effectslistview.cpp~ --- kdenlive-0.7.7/src/effectslistview.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/effectslistview.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,150 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "effectslistview.h" -#include "effectslistwidget.h" -#include "effectslist.h" -#include "kdenlivesettings.h" - -#include -#include -#include - -#include -#include - -EffectsListView::EffectsListView(QWidget *parent) : - QWidget(parent) -{ - setupUi(this); - - QMenu *menu = new QMenu(this); - m_effectsList = new EffectsListWidget(menu); - QVBoxLayout *lyr = new QVBoxLayout(effectlistframe); - lyr->addWidget(m_effectsList); - lyr->setContentsMargins(0, 0, 0, 0); - search_effect->setTreeWidget(m_effectsList); - buttonInfo->setIcon(KIcon("help-about")); - setFocusPolicy(Qt::StrongFocus); - - if (KdenliveSettings::showeffectinfo()) { - buttonInfo->setDown(true); - } else infopanel->hide(); - menu->addAction(KIcon("edit-delete"), i18n("Delete effect"), this, SLOT(slotRemoveEffect())); - - connect(type_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(filterList(int))); - connect(buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel())); - connect(m_effectsList, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateInfo())); - connect(m_effectsList, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotEffectSelected())); - - //m_effectsList->setCurrentRow(0); -} - - -void EffectsListView::focusInEvent(QFocusEvent * event) -{ - kDebug() << "// got foc"; - search_effect->setFocus(); -} - -void EffectsListView::filterList(int pos) -{ - QTreeWidgetItem *item; - QTreeWidgetItem *folder; - for (int i = 0; i < m_effectsList->topLevelItemCount(); i++) { - folder = m_effectsList->topLevelItem(i); - for (int j = 0; j < folder->childCount(); j++) { - item = folder->child(j); - if (pos == 0) item->setHidden(false); - else if (item->data(0, Qt::UserRole).toInt() == pos) item->setHidden(false); - else item->setHidden(true); - } - } - item = m_effectsList->currentItem(); - /*if (item) { - if (item->isHidden()) { - int i; - for (i = 0; i < m_effectsList->count() && m_effectsList->item(i)->isHidden(); i++); //do nothing - m_effectsList->setCurrentRow(i); - } else m_effectsList->scrollToItem(item); - }*/ -} - -void EffectsListView::showInfoPanel() -{ - if (infopanel->isVisible()) { - infopanel->setVisible(false); - buttonInfo->setDown(false); - KdenliveSettings::setShoweffectinfo(false); - } else { - infopanel->setVisible(true); - buttonInfo->setDown(true); - KdenliveSettings::setShoweffectinfo(true); - } -} - -void EffectsListView::slotEffectSelected() -{ - QDomElement effect = m_effectsList->currentEffect(); - if (!effect.isNull()) emit addEffect(effect); -} - -void EffectsListView::slotUpdateInfo() -{ - infopanel->setText(m_effectsList->currentInfo()); -} - -void EffectsListView::reloadEffectList() -{ - m_effectsList->initList(); -} - -void EffectsListView::slotRemoveEffect() -{ - QTreeWidgetItem *item = m_effectsList->currentItem(); - QString effectId = item->text(0); - QString path = KStandardDirs::locateLocal("appdata", "effects/", true); - - QDir directory = QDir(path); - QStringList filter; - filter << "*.xml"; - const QStringList fileList = directory.entryList(filter, QDir::Files); - QString itemName; - foreach(const QString &filename, fileList) { - itemName = KUrl(path + filename).path(); - QDomDocument doc; - QFile file(itemName); - doc.setContent(&file, false); - file.close(); - QDomNodeList effects = doc.elementsByTagName("effect"); - if (effects.count() != 1) { - kDebug() << "More than one effect in file " << itemName << ", NOT SUPPORTED YET"; - } else { - QDomElement e = effects.item(0).toElement(); - if (e.attribute("id") == effectId) { - QFile::remove(itemName); - break; - } - } - } - emit reloadEffects(); -} - -#include "effectslistview.moc" diff -Nru kdenlive-0.7.7/src/effectstackedit.cpp kdenlive-0.7.7.1/src/effectstackedit.cpp --- kdenlive-0.7.7/src/effectstackedit.cpp 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/effectstackedit.cpp 2010-02-26 21:44:41.000000000 +0000 @@ -227,7 +227,7 @@ m_valueItems[paramName+"complex"] = pl; connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); } else if (type == "geometry") { - Geometryval *geo = new Geometryval(m_profile, m_frameSize); + Geometryval *geo = new Geometryval(m_profile, m_frameSize, m_in); geo->setupParam(pa, minFrame, maxFrame); m_vbox->addWidget(geo); m_valueItems[paramName+"geometry"] = geo; @@ -339,7 +339,7 @@ void EffectStackEdit::slotSeekToPos(int pos) { - emit seekTimeline(pos - m_in); + emit seekTimeline(pos); } wipeInfo EffectStackEdit::getWipeInfo(QString value) diff -Nru kdenlive-0.7.7/src/effectstackedit.cpp~ kdenlive-0.7.7.1/src/effectstackedit.cpp~ --- kdenlive-0.7.7/src/effectstackedit.cpp~ 2010-02-17 08:07:50.000000000 +0000 +++ kdenlive-0.7.7.1/src/effectstackedit.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,550 +0,0 @@ -/*************************************************************************** - effecstackview.cpp - description - ------------------- - begin : Feb 15 2008 - copyright : (C) 2008 by Marco Gittler - email : g.marco@freenet.de - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "effectstackedit.h" -#include "ui_constval_ui.h" -#include "ui_listval_ui.h" -#include "ui_boolval_ui.h" -#include "ui_colorval_ui.h" -#include "ui_wipeval_ui.h" -#include "complexparameter.h" -#include "geometryval.h" -#include "positionedit.h" -#include "effectslist.h" -#include "kdenlivesettings.h" -#include "profilesdialog.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - - -class Boolval: public QWidget, public Ui::Boolval_UI -{ -}; - -class Colorval: public QWidget, public Ui::Colorval_UI -{ -}; - -class Constval: public QWidget, public Ui::Constval_UI -{ -}; - -class Listval: public QWidget, public Ui::Listval_UI -{ -}; - -class Wipeval: public QWidget, public Ui::Wipeval_UI -{ -}; - - -QMap EffectStackEdit::iconCache; - -EffectStackEdit::EffectStackEdit(QWidget *parent) : - QScrollArea(parent), - m_in(0), - m_out(0), - m_frameSize(QPoint()), - m_keyframeEditor(NULL) -{ - m_baseWidget = new QWidget(this); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - setFrameStyle(QFrame::NoFrame); - setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding)); - - setWidget(m_baseWidget); - setWidgetResizable(true); - m_vbox = new QVBoxLayout(m_baseWidget); - m_vbox->setContentsMargins(0, 0, 0, 0); - m_vbox->setSpacing(0); - //wid->show(); -} - -EffectStackEdit::~EffectStackEdit() -{ - iconCache.clear(); - delete m_baseWidget; -} - -void EffectStackEdit::setFrameSize(QPoint p) -{ - m_frameSize = p; - QDomNodeList namenode = m_params.elementsByTagName("parameter"); - for (int i = 0; i < namenode.count() ; i++) { - QDomNode pa = namenode.item(i); - QDomNode na = pa.firstChildElement("name"); - QString type = pa.attributes().namedItem("type").nodeValue(); - QString paramName = i18n(na.toElement().text().toUtf8().data()); - - if (type == "geometry") { - Geometryval *geom = ((Geometryval*)m_valueItems[paramName+"geometry"]); - geom->setFrameSize(m_frameSize); - break; - } - } - -} - -void EffectStackEdit::updateProjectFormat(MltVideoProfile profile, Timecode t) -{ - m_profile = profile; - m_timecode = t; -} - -void EffectStackEdit::updateParameter(const QString &name, const QString &value) -{ - m_params.setAttribute(name, value); -} - -void EffectStackEdit::transferParamDesc(const QDomElement d, int in, int out) -{ - clearAllItems(); - if (m_keyframeEditor) delete m_keyframeEditor; - m_keyframeEditor = NULL; - m_params = d; - m_in = in; - m_out = out; - if (m_params.isNull()) { - kDebug() << "// EMPTY EFFECT STACK"; - return; - } - - /*QDomDocument doc; - doc.appendChild(doc.importNode(m_params, true)); - kDebug() << "IMPORTED TRANS: " << doc.toString();*/ - - QDomNodeList namenode = m_params.elementsByTagName("parameter"); - QDomElement e = m_params.toElement(); - const int minFrame = e.attribute("start").toInt(); - const int maxFrame = e.attribute("end").toInt(); - - - for (int i = 0; i < namenode.count() ; i++) { - QDomElement pa = namenode.item(i).toElement(); - QDomNode na = pa.firstChildElement("name"); - QString type = pa.attribute("type"); - QString paramName = i18n(na.toElement().text().toUtf8().data()); - QWidget * toFillin = new QWidget(m_baseWidget); - QString value = pa.attribute("value").isNull() ? - pa.attribute("default") : pa.attribute("value"); - - /** Currently supported parameter types are: - * constant (=double): a slider with an integer value (use the "factor" attribute to divide the value so that you can get a double - * list: a combobox containing a list of values to choose - * bool: a checkbox - * complex: designed for keyframe parameters, but old and not finished, do not use - * geometry: a rectangle that can be moved & resized, with possible keyframes, used in composite transition - * keyframe: a list widget with a list of entries (position and value) - * color: a color chooser button - * position: a slider representing the position of a frame in the current clip - * wipe: a widget designed for the wipe transition, allowing to choose a position (left, right, top,...) - */ - - if (type == "double" || type == "constant") { - int min; - int max; - if (pa.attribute("min").startsWith('%')) { - min = (int) ProfilesDialog::getStringEval(m_profile, pa.attribute("min")); - } else min = pa.attribute("min").toInt(); - if (pa.attribute("max").startsWith('%')) { - max = (int) ProfilesDialog::getStringEval(m_profile, pa.attribute("max")); - } else max = pa.attribute("max").toInt(); - createSliderItem(paramName, (int)(value.toDouble() + 0.5) , min, max, pa.attribute("suffix", QString())); - delete toFillin; - toFillin = NULL; - } else if (type == "list") { - Listval *lsval = new Listval; - lsval->setupUi(toFillin); - QStringList listitems = pa.attribute("paramlist").split(','); - QStringList listitemsdisplay = pa.attribute("paramlistdisplay").split(','); - if (listitemsdisplay.count() != listitems.count()) listitemsdisplay = listitems; - //lsval->list->addItems(listitems); - lsval->list->setIconSize(QSize(30, 30)); - for (int i = 0; i < listitems.count(); i++) { - lsval->list->addItem(listitemsdisplay.at(i), listitems.at(i)); - QString entry = listitems.at(i); - if (!entry.isEmpty() && (entry.endsWith(".png") || entry.endsWith(".pgm"))) { - if (!EffectStackEdit::iconCache.contains(entry)) { - QImage pix(entry); - EffectStackEdit::iconCache[entry] = pix.scaled(30, 30); - } - lsval->list->setItemIcon(i, QPixmap::fromImage(iconCache[entry])); - } - } - if (!value.isEmpty()) lsval->list->setCurrentIndex(listitems.indexOf(value)); - lsval->title->setTitle(paramName); - m_valueItems[paramName] = lsval; - connect(lsval->list, SIGNAL(currentIndexChanged(int)) , this, SLOT(collectAllParameters())); - m_uiItems.append(lsval); - } else if (type == "bool") { - Boolval *bval = new Boolval; - bval->setupUi(toFillin); - bval->checkBox->setCheckState(value == "0" ? Qt::Unchecked : Qt::Checked); - bval->checkBox->setText(paramName); - m_valueItems[paramName] = bval; - connect(bval->checkBox, SIGNAL(stateChanged(int)) , this, SLOT(collectAllParameters())); - m_uiItems.append(bval); - } else if (type == "complex") { - /*QStringList names=nodeAtts.namedItem("name").nodeValue().split(';'); - QStringList max=nodeAtts.namedItem("max").nodeValue().split(';'); - QStringList min=nodeAtts.namedItem("min").nodeValue().split(';'); - QStringList val=value.split(';'); - kDebug() << "in complex"<setupParam(d, pa.attribute("name"), 0, 100); - m_vbox->addWidget(pl); - m_valueItems[paramName+"complex"] = pl; - connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); - } else if (type == "geometry") { - Geometryval *geo = new Geometryval(m_profile, m_frameSize); - geo->setupParam(pa, minFrame, maxFrame); - m_vbox->addWidget(geo); - m_valueItems[paramName+"geometry"] = geo; - connect(geo, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); - connect(geo, SIGNAL(seekToPos(int)), this, SLOT(slotSeekToPos(int))); - } else if (type == "keyframe" || type == "simplekeyframe") { - // keyframe editor widget - kDebug() << "min: " << m_in << ", MAX: " << m_out; - if (m_keyframeEditor == NULL) { - KeyframeEdit *geo = new KeyframeEdit(pa, m_in, m_in + m_out, pa.attribute("min").toInt(), pa.attribute("max").toInt(), m_timecode, e.attribute("active_keyframe", "-1").toInt()); - m_vbox->addWidget(geo); - m_valueItems[paramName+"keyframe"] = geo; - m_keyframeEditor = geo; - connect(geo, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); - connect(geo, SIGNAL(seekToPos(int)), this, SLOT(slotSeekToPos(int))); - } else { - // we already have a keyframe editor, so just add another column for the new param - m_keyframeEditor->addParameter(pa); - } - } else if (type == "color") { - Colorval *cval = new Colorval; - cval->setupUi(toFillin); - bool ok; - if (value.startsWith('#')) value = value.replace('#', "0x"); - cval->kcolorbutton->setColor(value.toUInt(&ok, 16)); - //kDebug() << "color: " << value << ", " << value.toUInt(&ok, 16); - cval->label->setText(paramName); - m_valueItems[paramName] = cval; - connect(cval->kcolorbutton, SIGNAL(clicked()) , this, SLOT(collectAllParameters())); - m_uiItems.append(cval); - } else if (type == "position") { - int pos = value.toInt(); - if (d.attribute("id") == "fadein" || d.attribute("id") == "fade_from_black") { - pos = pos - m_in; - } else if (d.attribute("id") == "fadeout" || d.attribute("id") == "fade_to_black") { - // fadeout position starts from clip end - pos = m_out - (pos - m_in); - } - PositionEdit *posedit = new PositionEdit(paramName, pos, 1, m_out, m_timecode); - m_vbox->addWidget(posedit); - m_valueItems[paramName+"position"] = posedit; - connect(posedit, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); - } else if (type == "wipe") { - Wipeval *wpval = new Wipeval; - wpval->setupUi(toFillin); - wipeInfo w = getWipeInfo(value); - switch (w.start) { - case UP: - wpval->start_up->setChecked(true); - break; - case DOWN: - wpval->start_down->setChecked(true); - break; - case RIGHT: - wpval->start_right->setChecked(true); - break; - case LEFT: - wpval->start_left->setChecked(true); - break; - default: - wpval->start_center->setChecked(true); - break; - } - switch (w.end) { - case UP: - wpval->end_up->setChecked(true); - break; - case DOWN: - wpval->end_down->setChecked(true); - break; - case RIGHT: - wpval->end_right->setChecked(true); - break; - case LEFT: - wpval->end_left->setChecked(true); - break; - default: - wpval->end_center->setChecked(true); - break; - } - wpval->start_transp->setValue(w.startTransparency); - wpval->end_transp->setValue(w.endTransparency); - m_valueItems[paramName] = wpval; - connect(wpval->end_up, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->end_down, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->end_left, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->end_right, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->end_center, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_up, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_down, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_left, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_right, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_center, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_transp, SIGNAL(valueChanged(int)), this, SLOT(collectAllParameters())); - connect(wpval->end_transp, SIGNAL(valueChanged(int)), this, SLOT(collectAllParameters())); - //wpval->title->setTitle(na.toElement().text()); - m_uiItems.append(wpval); - } else { - delete toFillin; - toFillin = NULL; - } - - if (toFillin) { - m_vbox->addWidget(toFillin); - } - } - m_vbox->addStretch(); -} - -void EffectStackEdit::slotSeekToPos(int pos) -{ - emit seekTimeline(m_in + pos); -} - -wipeInfo EffectStackEdit::getWipeInfo(QString value) -{ - wipeInfo info; - QString start = value.section(';', 0, 0); - QString end = value.section(';', 1, 1).section('=', 1, 1); - if (start.startsWith("-100%,0")) info.start = LEFT; - else if (start.startsWith("100%,0")) info.start = RIGHT; - else if (start.startsWith("0%,100%")) info.start = DOWN; - else if (start.startsWith("0%,-100%")) info.start = UP; - else info.start = CENTER; - if (start.count(':') == 2) info.startTransparency = start.section(':', -1).toInt(); - else info.startTransparency = 100; - - if (end.startsWith("-100%,0")) info.end = LEFT; - else if (end.startsWith("100%,0")) info.end = RIGHT; - else if (end.startsWith("0%,100%")) info.end = DOWN; - else if (end.startsWith("0%,-100%")) info.end = UP; - else info.end = CENTER; - if (end.count(':') == 2) info.endTransparency = end.section(':', -1).toInt(); - else info.endTransparency = 100; - return info; -} - -QString EffectStackEdit::getWipeString(wipeInfo info) -{ - - QString start; - QString end; - switch (info.start) { - case LEFT: - start = "-100%,0%:100%x100%"; - break; - case RIGHT: - start = "100%,0%:100%x100%"; - break; - case DOWN: - start = "0%,100%:100%x100%"; - break; - case UP: - start = "0%,-100%:100%x100%"; - break; - default: - start = "0%,0%:100%x100%"; - break; - } - start.append(':' + QString::number(info.startTransparency)); - - switch (info.end) { - case LEFT: - end = "-100%,0%:100%x100%"; - break; - case RIGHT: - end = "100%,0%:100%x100%"; - break; - case DOWN: - end = "0%,100%:100%x100%"; - break; - case UP: - end = "0%,-100%:100%x100%"; - break; - default: - end = "0%,0%:100%x100%"; - break; - } - end.append(':' + QString::number(info.endTransparency)); - return QString(start + ";-1=" + end); -} - -void EffectStackEdit::collectAllParameters() -{ - if (m_valueItems.isEmpty() || m_params.isNull()) return; - const QDomElement oldparam = m_params.cloneNode().toElement(); - QDomElement newparam = oldparam.cloneNode().toElement(); - QDomNodeList namenode = newparam.elementsByTagName("parameter"); - - for (int i = 0; i < namenode.count() ; i++) { - QDomNode pa = namenode.item(i); - QDomNode na = pa.firstChildElement("name"); - QString type = pa.attributes().namedItem("type").nodeValue(); - QString paramName = i18n(na.toElement().text().toUtf8().data()); - if (type == "complex") paramName.append("complex"); - else if (type == "position") paramName.append("position"); - else if (type == "geometry") paramName.append("geometry"); - else if (type == "keyframe") paramName.append("keyframe"); - if (type != "simplekeyframe" && !m_valueItems.contains(paramName)) { - kDebug() << "// Param: " << paramName << " NOT FOUND"; - continue; - } - - QString setValue; - if (type == "double" || type == "constant") { - QSlider* slider = ((Constval*)m_valueItems.value(paramName))->horizontalSlider; - setValue = QString::number(slider->value()); - } else if (type == "list") { - KComboBox *box = ((Listval*)m_valueItems.value(paramName))->list; - setValue = box->itemData(box->currentIndex()).toString(); - } else if (type == "bool") { - QCheckBox *box = ((Boolval*)m_valueItems.value(paramName))->checkBox; - setValue = box->checkState() == Qt::Checked ? "1" : "0" ; - } else if (type == "color") { - KColorButton *color = ((Colorval*)m_valueItems.value(paramName))->kcolorbutton; - setValue = color->color().name(); - } else if (type == "complex") { - ComplexParameter *complex = ((ComplexParameter*)m_valueItems.value(paramName)); - namenode.item(i) = complex->getParamDesc(); - } else if (type == "geometry") { - Geometryval *geom = ((Geometryval*)m_valueItems.value(paramName)); - namenode.item(i).toElement().setAttribute("value", geom->getValue()); - } else if (type == "position") { - PositionEdit *pedit = ((PositionEdit*)m_valueItems.value(paramName)); - int pos = pedit->getPosition(); - setValue = QString::number(pos); - if (newparam.attribute("id") == "fadein" || newparam.attribute("id") == "fade_from_black") { - // Make sure duration is not longer than clip - /*if (pos > m_out) { - pos = m_out; - pedit->setPosition(pos); - }*/ - EffectsList::setParameter(newparam, "in", QString::number(m_in)); - EffectsList::setParameter(newparam, "out", QString::number(m_in + pos)); - setValue.clear(); - } else if (newparam.attribute("id") == "fadeout" || newparam.attribute("id") == "fade_to_black") { - // Make sure duration is not longer than clip - /*if (pos > m_out) { - pos = m_out; - pedit->setPosition(pos); - }*/ - EffectsList::setParameter(newparam, "in", QString::number(m_out + m_in - pos)); - EffectsList::setParameter(newparam, "out", QString::number(m_out + m_in)); - setValue.clear(); - } - } else if (type == "wipe") { - Wipeval *wp = (Wipeval*)m_valueItems.value(paramName); - wipeInfo info; - if (wp->start_left->isChecked()) info.start = LEFT; - else if (wp->start_right->isChecked()) info.start = RIGHT; - else if (wp->start_up->isChecked()) info.start = UP; - else if (wp->start_down->isChecked()) info.start = DOWN; - else if (wp->start_center->isChecked()) info.start = CENTER; - else info.start = LEFT; - info.startTransparency = wp->start_transp->value(); - if (wp->end_left->isChecked()) info.end = LEFT; - else if (wp->end_right->isChecked()) info.end = RIGHT; - else if (wp->end_up->isChecked()) info.end = UP; - else if (wp->end_down->isChecked()) info.end = DOWN; - else if (wp->end_center->isChecked()) info.end = CENTER; - else info.end = RIGHT; - info.endTransparency = wp->end_transp->value(); - setValue = getWipeString(info); - } else if ((type == "simplekeyframe" || type == "keyframe") && m_keyframeEditor) { - QString realName = i18n(na.toElement().text().toUtf8().data()); - QString val = m_keyframeEditor->getValue(realName); - kDebug() << "SET VALUE: " << val; - namenode.item(i).toElement().setAttribute("keyframes", val); - } - if (!setValue.isNull()) { - pa.attributes().namedItem("value").setNodeValue(setValue); - } - } - emit parameterChanged(oldparam, newparam); -} - -void EffectStackEdit::createSliderItem(const QString& name, int val , int min, int max, const QString suffix) -{ - QWidget* toFillin = new QWidget(m_baseWidget); - Constval *ctval = new Constval; - ctval->setupUi(toFillin); - ctval->horizontalSlider->setMinimum(min); - ctval->horizontalSlider->setMaximum(max); - if (!suffix.isEmpty()) ctval->spinBox->setSuffix(suffix); - ctval->spinBox->setMinimum(min); - ctval->spinBox->setMaximum(max); - ctval->horizontalSlider->setPageStep((int)(max - min) / 10); - ctval->horizontalSlider->setValue(val); - ctval->label->setText(name); - m_valueItems[name] = ctval; - m_uiItems.append(ctval); - connect(ctval->horizontalSlider, SIGNAL(valueChanged(int)) , this, SLOT(collectAllParameters())); - m_vbox->addWidget(toFillin); -} - -void EffectStackEdit::slotSliderMoved(int) -{ - collectAllParameters(); -} - -void EffectStackEdit::clearAllItems() -{ - blockSignals(true); - m_valueItems.clear(); - m_uiItems.clear(); - /*while (!m_items.isEmpty()) { - QWidget *die = m_items.takeFirst(); - die->disconnect(); - delete die; - }*/ - //qDeleteAll(m_uiItems); - QLayoutItem *child; - while ((child = m_vbox->takeAt(0)) != 0) { - QWidget *wid = child->widget(); - delete child; - if (wid) delete wid; - } - m_keyframeEditor = NULL; - blockSignals(false); -} diff -Nru kdenlive-0.7.7/src/geometryval.cpp kdenlive-0.7.7.1/src/geometryval.cpp --- kdenlive-0.7.7/src/geometryval.cpp 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/geometryval.cpp 2010-02-26 21:44:41.000000000 +0000 @@ -28,14 +28,15 @@ #include -Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidget* parent) : +Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, int startPoint, QWidget* parent) : QWidget(parent), m_profile(profile), m_paramRect(NULL), m_geom(NULL), m_path(NULL), m_fixedMode(false), - m_frameSize(frame_size) + m_frameSize(frame_size), + m_startPoint(startPoint) { setupUi(this); QVBoxLayout* vbox = new QVBoxLayout(widget); @@ -324,7 +325,7 @@ void Geometryval::slotPositionChanged(int pos, bool seek) { - if (seek && KdenliveSettings::transitionfollowcursor()) emit seekToPos(pos); + if (seek && KdenliveSettings::transitionfollowcursor()) emit seekToPos(pos + m_startPoint); spinPos->setValue(pos); m_helper->setValue(pos); Mlt::GeometryItem item; diff -Nru kdenlive-0.7.7/src/geometryval.h kdenlive-0.7.7.1/src/geometryval.h --- kdenlive-0.7.7/src/geometryval.h 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/geometryval.h 2010-02-26 21:44:41.000000000 +0000 @@ -41,7 +41,7 @@ { Q_OBJECT public: - explicit Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidget* parent = 0); + explicit Geometryval(const MltVideoProfile profile, QPoint frame_size, int startPoint = 0, QWidget* parent = 0); virtual ~Geometryval(); QDomElement getParamDesc(); QString getValue() const; @@ -65,6 +65,7 @@ Ui::GeometryPosition_UI m_view; void updateTransitionPath(); double m_dar; + int m_startPoint; QGraphicsView *m_sceneview; public slots: diff -Nru kdenlive-0.7.7/src/kdenlivedoc.cpp~ kdenlive-0.7.7.1/src/kdenlivedoc.cpp~ --- kdenlive-0.7.7/src/kdenlivedoc.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/kdenlivedoc.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,1234 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "kdenlivedoc.h" -#include "docclipbase.h" -#include "profilesdialog.h" -#include "kdenlivesettings.h" -#include "renderer.h" -#include "clipmanager.h" -#include "titlewidget.h" -#include "mainwindow.h" -#include "documentchecker.h" -#include "documentvalidator.h" -#include "kdenlive-config.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -const double DOCUMENTVERSION = 0.85; - -KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, MainWindow *parent) : - QObject(parent), - m_autosave(NULL), - m_url(url), - m_render(render), - m_commandStack(new QUndoStack(undoGroup)), - m_modified(false), - m_projectFolder(projectFolder), - m_abortLoading(false) -{ - m_clipManager = new ClipManager(this); - m_autoSaveTimer = new QTimer(this); - m_autoSaveTimer->setSingleShot(true); - bool success = false; - - // init default document properties - m_documentProperties["zoom"] = "7"; - m_documentProperties["verticalzoom"] = "1"; - m_documentProperties["zonein"] = "0"; - m_documentProperties["zoneout"] = "100"; - - if (!url.isEmpty()) { - QString tmpFile; - success = KIO::NetAccess::download(url.path(), tmpFile, parent); - if (!success) // The file cannot be opened - KMessageBox::error(parent, KIO::NetAccess::lastErrorString()); - else { - QFile file(tmpFile); - QString errorMsg; - QDomImplementation impl; - impl.setInvalidDataPolicy(QDomImplementation::DropInvalidChars); - success = m_document.setContent(&file, false, &errorMsg); - file.close(); - KIO::NetAccess::removeTempFile(tmpFile); - - if (!success) // It is corrupted - KMessageBox::error(parent, errorMsg); - else { - parent->slotGotProgressInfo(i18n("Validating"), 0); - DocumentValidator validator(m_document); - success = validator.isProject(); - if (!success) { - // It is not a project file - parent->slotGotProgressInfo(i18n("File %1 is not a Kdenlive project file", m_url.path()), 0); - } else { - /* - * Validate the file against the current version (upgrade - * and recover it if needed). It is NOT a passive operation - */ - // TODO: backup the document or alert the user? - success = validator.validate(DOCUMENTVERSION); - if (success) { // Let the validator handle error messages - parent->slotGotProgressInfo(i18n("Loading"), 0); - QDomElement mlt = m_document.firstChildElement("mlt"); - QDomElement infoXml = mlt.firstChildElement("kdenlivedoc"); - - profileName = infoXml.attribute("profile"); - m_projectFolder = KUrl(infoXml.attribute("projectfolder")); - QDomElement docproperties = infoXml.firstChildElement("documentproperties"); - QDomNamedNodeMap props = docproperties.attributes(); - for (int i = 0; i < props.count(); i++) { - m_documentProperties.insert(props.item(i).nodeName(), props.item(i).nodeValue()); - } - // Build tracks - QDomElement e; - QDomElement tracksinfo = infoXml.firstChildElement("tracksinfo"); - TrackInfo projectTrack; - if (!tracksinfo.isNull()) { - QDomNodeList trackslist = tracksinfo.childNodes(); - int maxchild = trackslist.count(); - for (int k = 0; k < maxchild; k++) { - e = trackslist.at(k).toElement(); - if (e.tagName() == "trackinfo") { - if (e.attribute("type") == "audio") projectTrack.type = AUDIOTRACK; - else projectTrack.type = VIDEOTRACK; - projectTrack.isMute = e.attribute("mute").toInt(); - projectTrack.isBlind = e.attribute("blind").toInt(); - projectTrack.isLocked = e.attribute("locked").toInt(); - projectTrack.trackName = e.attribute("trackname"); - m_tracksList.append(projectTrack); - } - } - mlt.removeChild(tracksinfo); - } - QDomNodeList producers = m_document.elementsByTagName("producer"); - QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer"); - parent->slotGotProgressInfo(i18n("Check missing clips"), 0); - if (checkDocumentClips(infoproducers) == false) m_abortLoading = true; - const int max = producers.count(); - const int infomax = infoproducers.count(); - - QDomNodeList folders = m_document.elementsByTagName("folder"); - for (int i = 0; i < folders.count(); i++) { - e = folders.item(i).cloneNode().toElement(); - m_clipManager->addFolder(e.attribute("id"), e.attribute("name")); - } - - for (int i = 0; i < infomax && !m_abortLoading; i++) { - e = infoproducers.item(i).cloneNode().toElement(); - QString prodId = e.attribute("id"); - if (!e.isNull() && prodId != "black" && !prodId.startsWith("slowmotion") && !m_abortLoading) { - e.setTagName("producer"); - // Get MLT's original producer properties - QDomElement orig; - for (int j = 0; j < max; j++) { - QDomElement o = producers.item(j).cloneNode().toElement(); - QString origId = o.attribute("id").section('_', 0, 0); - if (origId == prodId) { - orig = o; - break; - } - } - addClipInfo(e, orig, prodId); - } - } - if (m_abortLoading) { - //parent->slotGotProgressInfo(i18n("File %1 is not a Kdenlive project file."), 100); - emit resetProjectList(); - m_documentProperties.remove("position"); - m_url = KUrl(); - m_tracksList.clear(); - kWarning() << "Aborted loading of: " << url.path(); - m_document = createEmptyDocument(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()); - setProfilePath(KdenliveSettings::default_profile()); - m_clipManager->clear(); - } else { - QDomElement markers = infoXml.firstChildElement("markers"); - if (!markers.isNull()) { - QDomNodeList markerslist = markers.childNodes(); - int maxchild = markerslist.count(); - for (int k = 0; k < maxchild; k++) { - e = markerslist.at(k).toElement(); - if (e.tagName() == "marker") { - m_clipManager->getClipById(e.attribute("id"))->addSnapMarker(GenTime(e.attribute("time").toDouble()), e.attribute("comment")); - } - } - infoXml.removeChild(markers); - } - setProfilePath(profileName); - setModified(validator.isModified()); - kDebug() << "Reading file: " << url.path() << ", found clips: " << producers.count(); - } - } - } - } - } - } - - // Something went wrong, or a new file was requested: create a new project - if (!success) { - setProfilePath(profileName); - m_url = KUrl(); - m_document = createEmptyDocument(tracks.x(), tracks.y()); - } - - KdenliveSettings::setCurrent_profile(profilePath()); - - // Set the video profile (empty == default) - - // Make sure the project folder is usable - if (m_projectFolder.isEmpty() || !KIO::NetAccess::exists(m_projectFolder.path(), KIO::NetAccess::DestinationSide, parent)) { - KMessageBox::information(parent, i18n("Document project folder is invalid, setting it to the default one: %1", KdenliveSettings::defaultprojectfolder())); - m_projectFolder = KUrl(KdenliveSettings::defaultprojectfolder()); - } - - // Make sure that the necessary folders exist - KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "titles/"); - KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/"); - KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/"); - - kDebug() << "Kdenlive document, init timecode: " << m_fps; - if (m_fps == 30000.0 / 1001.0) m_timecode.setFormat(m_fps, true); - else m_timecode.setFormat(m_fps); - - //kDebug() << "// SETTING SCENE LIST:\n\n" << m_document.toString(); - connect(m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave())); -} - -KdenliveDoc::~KdenliveDoc() -{ - m_autoSaveTimer->stop(); - delete m_commandStack; - kDebug() << "// DEL CLP MAN"; - delete m_clipManager; - kDebug() << "// DEL CLP MAN done"; - delete m_autoSaveTimer; - if (m_autosave) { - if (!m_autosave->fileName().isEmpty()) m_autosave->remove(); - delete m_autosave; - } -} - -int KdenliveDoc::setSceneList() -{ - m_render->resetProfile(KdenliveSettings::current_profile()); - if (m_render->setSceneList(m_document.toString(), m_documentProperties.value("position").toInt()) == -1) { - // INVALID MLT Consumer, something is wrong - return -1; - } - m_documentProperties.remove("position"); - // m_document xml is now useless, clear it - m_document.clear(); - return 0; -} - -QDomDocument KdenliveDoc::createEmptyDocument(int videotracks, int audiotracks) -{ - TrackInfo videoTrack; - videoTrack.type = VIDEOTRACK; - videoTrack.isMute = false; - videoTrack.isBlind = false; - videoTrack.isLocked = false; - - TrackInfo audioTrack; - audioTrack.type = AUDIOTRACK; - audioTrack.isMute = false; - audioTrack.isBlind = true; - audioTrack.isLocked = false; - - m_tracksList.clear(); - - for (int i = 0; i < audiotracks; i++) { - m_tracksList.append(audioTrack); - } - for (int i = 0; i < videotracks; i++) { - m_tracksList.append(videoTrack); - } - return createEmptyDocument(m_tracksList); -} - -QDomDocument KdenliveDoc::createEmptyDocument(QList tracks) -{ - // Creating new document - QDomDocument doc; - QDomElement mlt = doc.createElement("mlt"); - doc.appendChild(mlt); - - - // Create black producer - // For some unknown reason, we have to build the black producer here and not in renderer.cpp, otherwise - // the composite transitions with the black track are corrupted. - QDomElement blk = doc.createElement("producer"); - blk.setAttribute("in", 0); - blk.setAttribute("out", 500); - blk.setAttribute("id", "black"); - - QDomElement property = doc.createElement("property"); - property.setAttribute("name", "mlt_type"); - QDomText value = doc.createTextNode("producer"); - property.appendChild(value); - blk.appendChild(property); - - property = doc.createElement("property"); - property.setAttribute("name", "aspect_ratio"); - value = doc.createTextNode(QString::number(0.0)); - property.appendChild(value); - blk.appendChild(property); - - property = doc.createElement("property"); - property.setAttribute("name", "length"); - value = doc.createTextNode(QString::number(15000)); - property.appendChild(value); - blk.appendChild(property); - - property = doc.createElement("property"); - property.setAttribute("name", "eof"); - value = doc.createTextNode("pause"); - property.appendChild(value); - blk.appendChild(property); - - property = doc.createElement("property"); - property.setAttribute("name", "resource"); - value = doc.createTextNode("black"); - property.appendChild(value); - blk.appendChild(property); - - property = doc.createElement("property"); - property.setAttribute("name", "mlt_service"); - value = doc.createTextNode("colour"); - property.appendChild(value); - blk.appendChild(property); - - mlt.appendChild(blk); - - - QDomElement tractor = doc.createElement("tractor"); - tractor.setAttribute("id", "maintractor"); - QDomElement multitrack = doc.createElement("multitrack"); - QDomElement playlist = doc.createElement("playlist"); - playlist.setAttribute("id", "black_track"); - mlt.appendChild(playlist); - - QDomElement blank0 = doc.createElement("entry"); - blank0.setAttribute("in", "0"); - blank0.setAttribute("out", "1"); - blank0.setAttribute("producer", "black"); - playlist.appendChild(blank0); - - // create playlists - int total = tracks.count() + 1; - - for (int i = 1; i < total; i++) { - QDomElement playlist = doc.createElement("playlist"); - playlist.setAttribute("id", "playlist" + QString::number(i)); - mlt.appendChild(playlist); - } - - QDomElement track0 = doc.createElement("track"); - track0.setAttribute("producer", "black_track"); - tractor.appendChild(track0); - - // create audio tracks - for (int i = 1; i < total; i++) { - QDomElement track = doc.createElement("track"); - track.setAttribute("producer", "playlist" + QString::number(i)); - if (tracks.at(i - 1).type == AUDIOTRACK) - track.setAttribute("hide", "video"); - else if (tracks.at(i - 1).isBlind) - track.setAttribute("hide", "video"); - if (tracks.at(i - 1).isMute) - track.setAttribute("hide", "audio"); - tractor.appendChild(track); - } - - for (int i = 2; i < total ; i++) { - QDomElement transition = doc.createElement("transition"); - transition.setAttribute("always_active", "1"); - - QDomElement property = doc.createElement("property"); - property.setAttribute("name", "a_track"); - QDomText value = doc.createTextNode(QString::number(1)); - property.appendChild(value); - transition.appendChild(property); - - property = doc.createElement("property"); - property.setAttribute("name", "b_track"); - value = doc.createTextNode(QString::number(i)); - property.appendChild(value); - transition.appendChild(property); - - property = doc.createElement("property"); - property.setAttribute("name", "mlt_service"); - value = doc.createTextNode("mix"); - property.appendChild(value); - transition.appendChild(property); - - property = doc.createElement("property"); - property.setAttribute("name", "combine"); - value = doc.createTextNode("1"); - property.appendChild(value); - transition.appendChild(property); - - property = doc.createElement("property"); - property.setAttribute("name", "internal_added"); - value = doc.createTextNode("237"); - property.appendChild(value); - transition.appendChild(property); - tractor.appendChild(transition); - } - mlt.appendChild(tractor); - return doc; -} - - -void KdenliveDoc::syncGuides(QList guides) -{ - m_guidesXml.clear(); - QDomElement guideNode = m_guidesXml.createElement("guides"); - m_guidesXml.appendChild(guideNode); - QDomElement e; - - for (int i = 0; i < guides.count(); i++) { - e = m_guidesXml.createElement("guide"); - e.setAttribute("time", guides.at(i)->position().ms() / 1000); - e.setAttribute("comment", guides.at(i)->label()); - guideNode.appendChild(e); - } - setModified(true); - emit guidesUpdated(); -} - -QDomElement KdenliveDoc::guidesXml() const -{ - return m_guidesXml.documentElement(); -} - -void KdenliveDoc::slotAutoSave() -{ - if (m_render && m_autosave) { - if (!m_autosave->isOpen() && !m_autosave->open(QIODevice::ReadWrite)) { - // show error: could not open the autosave file - kDebug() << "ERROR; CANNOT CREATE AUTOSAVE FILE"; - } - kDebug() << "// AUTOSAVE FILE: " << m_autosave->fileName(); - QString doc; - if (KdenliveSettings::dropbframes()) { - KdenliveSettings::setDropbframes(false); - m_clipManager->updatePreviewSettings(); - doc = m_render->sceneList(); - KdenliveSettings::setDropbframes(true); - m_clipManager->updatePreviewSettings(); - } else doc = m_render->sceneList(); - saveSceneList(m_autosave->fileName(), doc); - } -} - -void KdenliveDoc::setZoom(int horizontal, int vertical) -{ - m_documentProperties["zoom"] = QString::number(horizontal); - m_documentProperties["verticalzoom"] = QString::number(vertical); -} - -QPoint KdenliveDoc::zoom() const -{ - return QPoint(m_documentProperties.value("zoom").toInt(), m_documentProperties.value("verticalzoom").toInt()); -} - -void KdenliveDoc::setZone(int start, int end) -{ - m_documentProperties["zonein"] = QString::number(start); - m_documentProperties["zoneout"] = QString::number(end); -} - -QPoint KdenliveDoc::zone() const -{ - return QPoint(m_documentProperties.value("zonein").toInt(), m_documentProperties.value("zoneout").toInt()); -} - -bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene) -{ - QDomDocument sceneList; - sceneList.setContent(scene, true); - QDomElement mlt = sceneList.firstChildElement("mlt"); - if (mlt.isNull() || !mlt.hasChildNodes()) { - //Make sure we don't save if scenelist is corrupted - KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1", path)); - return false; - } - QDomElement addedXml = sceneList.createElement("kdenlivedoc"); - mlt.appendChild(addedXml); - - QDomElement markers = sceneList.createElement("markers"); - addedXml.setAttribute("version", DOCUMENTVERSION); - addedXml.setAttribute("kdenliveversion", VERSION); - addedXml.setAttribute("profile", profilePath()); - addedXml.setAttribute("projectfolder", m_projectFolder.path()); - - QDomElement docproperties = sceneList.createElement("documentproperties"); - QMapIterator i(m_documentProperties); - while (i.hasNext()) { - i.next(); - docproperties.setAttribute(i.key(), i.value()); - } - docproperties.setAttribute("position", m_render->seekPosition().frames(m_fps)); - addedXml.appendChild(docproperties); - - // Add profile info - QDomElement profileinfo = sceneList.createElement("profileinfo"); - profileinfo.setAttribute("description", m_profile.description); - profileinfo.setAttribute("frame_rate_num", m_profile.frame_rate_num); - profileinfo.setAttribute("frame_rate_den", m_profile.frame_rate_den); - profileinfo.setAttribute("width", m_profile.width); - profileinfo.setAttribute("height", m_profile.height); - profileinfo.setAttribute("progressive", m_profile.progressive); - profileinfo.setAttribute("sample_aspect_num", m_profile.sample_aspect_num); - profileinfo.setAttribute("sample_aspect_den", m_profile.sample_aspect_den); - profileinfo.setAttribute("display_aspect_num", m_profile.display_aspect_num); - profileinfo.setAttribute("display_aspect_den", m_profile.display_aspect_den); - addedXml.appendChild(profileinfo); - - // tracks info - QDomElement tracksinfo = sceneList.createElement("tracksinfo"); - foreach(const TrackInfo &info, m_tracksList) { - QDomElement trackinfo = sceneList.createElement("trackinfo"); - if (info.type == AUDIOTRACK) trackinfo.setAttribute("type", "audio"); - trackinfo.setAttribute("mute", info.isMute); - trackinfo.setAttribute("blind", info.isBlind); - trackinfo.setAttribute("locked", info.isLocked); - trackinfo.setAttribute("trackname", info.trackName); - tracksinfo.appendChild(trackinfo); - } - addedXml.appendChild(tracksinfo); - - // save project folders - QMap folderlist = m_clipManager->documentFolderList(); - - QMapIterator f(folderlist); - while (f.hasNext()) { - f.next(); - QDomElement folder = sceneList.createElement("folder"); - folder.setAttribute("id", f.key()); - folder.setAttribute("name", f.value()); - addedXml.appendChild(folder); - } - - // Save project clips - QDomElement e; - QList list = m_clipManager->documentClipList(); - for (int i = 0; i < list.count(); i++) { - e = list.at(i)->toXML(); - e.setTagName("kdenlive_producer"); - addedXml.appendChild(sceneList.importNode(e, true)); - QList < CommentedTime > marks = list.at(i)->commentedSnapMarkers(); - for (int j = 0; j < marks.count(); j++) { - QDomElement marker = sceneList.createElement("marker"); - marker.setAttribute("time", marks.at(j).time().ms() / 1000); - marker.setAttribute("comment", marks.at(j).comment()); - marker.setAttribute("id", e.attribute("id")); - markers.appendChild(marker); - } - } - addedXml.appendChild(markers); - - // Add guides - if (!m_guidesXml.isNull()) addedXml.appendChild(sceneList.importNode(m_guidesXml.documentElement(), true)); - - // Add clip groups - addedXml.appendChild(sceneList.importNode(m_clipManager->groupsXml(), true)); - - //wes.appendChild(doc.importNode(kdenliveData, true)); - - QFile file(path); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - kWarning() << "////// ERROR writing to file: " << path; - KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1", path)); - return false; - } - - file.write(sceneList.toString().toUtf8()); - if (file.error() != QFile::NoError) { - KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1", path)); - file.close(); - return false; - } - file.close(); - return true; -} - -ClipManager *KdenliveDoc::clipManager() -{ - return m_clipManager; -} - -KUrl KdenliveDoc::projectFolder() const -{ - //if (m_projectFolder.isEmpty()) return KUrl(KStandardDirs::locateLocal("appdata", "/projects/")); - return m_projectFolder; -} - -void KdenliveDoc::setProjectFolder(KUrl url) -{ - if (url == m_projectFolder) return; - setModified(true); - KStandardDirs::makeDir(url.path()); - KStandardDirs::makeDir(url.path(KUrl::AddTrailingSlash) + "titles/"); - KStandardDirs::makeDir(url.path(KUrl::AddTrailingSlash) + "thumbs/"); - if (KMessageBox::questionYesNo(kapp->activeWindow(), i18n("You have changed the project folder. Do you want to copy the cached data from %1 to the new folder %2?").arg(m_projectFolder.path(), url.path())) == KMessageBox::Yes) moveProjectData(url); - m_projectFolder = url; -} - -void KdenliveDoc::moveProjectData(KUrl url) -{ - QList list = m_clipManager->documentClipList(); - //TODO: Also move ladspa effects files - for (int i = 0; i < list.count(); i++) { - DocClipBase *clip = list.at(i); - if (clip->clipType() == TEXT) { - // the image for title clip must be moved - KUrl oldUrl = clip->fileURL(); - KUrl newUrl = KUrl(url.path(KUrl::AddTrailingSlash) + "titles/" + oldUrl.fileName()); - KIO::Job *job = KIO::copy(oldUrl, newUrl); - if (KIO::NetAccess::synchronousRun(job, 0)) clip->setProperty("resource", newUrl.path()); - } - QString hash = clip->getClipHash(); - KUrl oldVideoThumbUrl = KUrl(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/" + hash + ".png"); - KUrl oldAudioThumbUrl = KUrl(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/" + hash + ".thumb"); - if (KIO::NetAccess::exists(oldVideoThumbUrl, KIO::NetAccess::SourceSide, 0)) { - KUrl newUrl = KUrl(url.path(KUrl::AddTrailingSlash) + "thumbs/" + hash + ".png"); - KIO::Job *job = KIO::copy(oldVideoThumbUrl, newUrl); - KIO::NetAccess::synchronousRun(job, 0); - } - if (KIO::NetAccess::exists(oldAudioThumbUrl, KIO::NetAccess::SourceSide, 0)) { - KUrl newUrl = KUrl(url.path(KUrl::AddTrailingSlash) + "thumbs/" + hash + ".thumb"); - KIO::Job *job = KIO::copy(oldAudioThumbUrl, newUrl); - if (KIO::NetAccess::synchronousRun(job, 0)) clip->refreshThumbUrl(); - } - } -} - -const QString &KdenliveDoc::profilePath() const -{ - return m_profile.path; -} - -MltVideoProfile KdenliveDoc::mltProfile() const -{ - return m_profile; -} - -bool KdenliveDoc::setProfilePath(QString path) -{ - if (path.isEmpty()) path = KdenliveSettings::default_profile(); - if (path.isEmpty()) path = "dv_pal"; - m_profile = ProfilesDialog::getVideoProfile(path); - bool current_fps = m_fps; - if (m_profile.path.isEmpty()) { - // Profile not found, use embedded profile - QDomElement profileInfo = m_document.elementsByTagName("profileinfo").at(0).toElement(); - if (profileInfo.isNull()) { - KMessageBox::information(kapp->activeWindow(), i18n("Project profile was not found, using default profile."), i18n("Missing Profile")); - m_profile = ProfilesDialog::getVideoProfile(KdenliveSettings::default_profile()); - } else { - m_profile.description = profileInfo.attribute("description"); - m_profile.frame_rate_num = profileInfo.attribute("frame_rate_num").toInt(); - m_profile.frame_rate_den = profileInfo.attribute("frame_rate_den").toInt(); - m_profile.width = profileInfo.attribute("width").toInt(); - m_profile.height = profileInfo.attribute("height").toInt(); - m_profile.progressive = profileInfo.attribute("progressive").toInt(); - m_profile.sample_aspect_num = profileInfo.attribute("sample_aspect_num").toInt(); - m_profile.sample_aspect_den = profileInfo.attribute("sample_aspect_den").toInt(); - m_profile.display_aspect_num = profileInfo.attribute("display_aspect_num").toInt(); - m_profile.display_aspect_den = profileInfo.attribute("display_aspect_den").toInt(); - QString existing = ProfilesDialog::existingProfile(m_profile); - if (!existing.isEmpty()) { - m_profile = ProfilesDialog::getVideoProfile(existing); - KMessageBox::information(kapp->activeWindow(), i18n("Project profile not found, replacing with existing one: %1", m_profile.description), i18n("Missing Profile")); - } else { - QString newDesc = m_profile.description; - bool ok = true; - while (ok && (newDesc.isEmpty() || ProfilesDialog::existingProfileDescription(newDesc))) { - newDesc = QInputDialog::getText(kapp->activeWindow(), i18n("Existing Profile"), i18n("Your project uses an unknown profile.\nIt uses an existing profile name: %1.\nPlease choose a new name to save it", newDesc), QLineEdit::Normal, newDesc, &ok); - } - if (ok == false) { - // User canceled, use default profile - m_profile = ProfilesDialog::getVideoProfile(KdenliveSettings::default_profile()); - } else { - if (newDesc != m_profile.description) { - // Profile description existed, was replaced by new one - m_profile.description = newDesc; - } else { - KMessageBox::information(kapp->activeWindow(), i18n("Project profile was not found, it will be added to your system now."), i18n("Missing Profile")); - } - ProfilesDialog::saveProfile(m_profile); - } - } - setModified(true); - } - } - - KdenliveSettings::setProject_display_ratio((double) m_profile.display_aspect_num / m_profile.display_aspect_den); - m_fps = (double) m_profile.frame_rate_num / m_profile.frame_rate_den; - KdenliveSettings::setProject_fps(m_fps); - m_width = m_profile.width; - m_height = m_profile.height; - kDebug() << "Kdenlive document, init timecode from path: " << path << ", " << m_fps; - if (m_fps == 30000.0 / 1001.0) m_timecode.setFormat(m_fps, true); - else m_timecode.setFormat(m_fps); - return (current_fps != m_fps); -} - -double KdenliveDoc::dar() -{ - return (double) m_profile.display_aspect_num / m_profile.display_aspect_den; -} - -void KdenliveDoc::setThumbsProgress(const QString &message, int progress) -{ - emit progressInfo(message, progress); -} - -QUndoStack *KdenliveDoc::commandStack() -{ - return m_commandStack; -} - -/* -void KdenliveDoc::setRenderer(Render *render) { - if (m_render) return; - m_render = render; - emit progressInfo(i18n("Loading playlist..."), 0); - //qApp->processEvents(); - if (m_render) { - m_render->setSceneList(m_document.toString(), m_startPos); - kDebug() << "// SETTING SCENE LIST:\n\n" << m_document.toString(); - checkProjectClips(); - } - emit progressInfo(QString(), -1); -}*/ - -void KdenliveDoc::checkProjectClips() -{ - kDebug() << "+++++++++++++ + + + + CHK PCLIPS"; - if (m_render == NULL) return; - m_clipManager->resetProducersList(m_render->producersList()); -} - -void KdenliveDoc::updatePreviewSettings() -{ - m_clipManager->updatePreviewSettings(); - m_render->updatePreviewSettings(); - QList prods = m_render->producersList(); - m_clipManager->resetProducersList(m_render->producersList()); - qDeleteAll(prods); - prods.clear(); -} - -Render *KdenliveDoc::renderer() -{ - return m_render; -} - -void KdenliveDoc::updateClip(const QString id) -{ - emit updateClipDisplay(id); -} - -int KdenliveDoc::getFramePos(QString duration) -{ - return m_timecode.getFrameCount(duration); -} - -QString KdenliveDoc::producerName(const QString &id) -{ - QString result = "unnamed"; - QDomNodeList prods = producersList(); - int ct = prods.count(); - for (int i = 0; i < ct ; i++) { - QDomElement e = prods.item(i).toElement(); - if (e.attribute("id") != "black" && e.attribute("id") == id) { - result = e.attribute("name"); - if (result.isEmpty()) result = KUrl(e.attribute("resource")).fileName(); - break; - } - } - return result; -} - -QDomDocument KdenliveDoc::toXml() -{ - return m_document; -} - -Timecode KdenliveDoc::timecode() const -{ - return m_timecode; -} - -QDomNodeList KdenliveDoc::producersList() -{ - return m_document.elementsByTagName("producer"); -} - -double KdenliveDoc::projectDuration() const -{ - if (m_render) - return GenTime(m_render->getLength(), m_fps).ms() / 1000; - else - return 0; -} - -double KdenliveDoc::fps() const -{ - return m_fps; -} - -int KdenliveDoc::width() const -{ - return m_width; -} - -int KdenliveDoc::height() const -{ - return m_height; -} - -KUrl KdenliveDoc::url() const -{ - return m_url; -} - -void KdenliveDoc::setUrl(KUrl url) -{ - m_url = url; -} - -void KdenliveDoc::setModified(bool mod) -{ - if (!m_url.isEmpty() && mod && KdenliveSettings::crashrecovery()) { - m_autoSaveTimer->start(3000); - } - if (mod == m_modified) return; - m_modified = mod; - emit docModified(m_modified); -} - -bool KdenliveDoc::isModified() const -{ - return m_modified; -} - -const QString KdenliveDoc::description() const -{ - if (m_url.isEmpty()) - return i18n("Untitled") + " / " + m_profile.description; - else - return m_url.fileName() + " / " + m_profile.description; -} - -void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem) -{ - const QString producerId = clipId.section('_', 0, 0); - DocClipBase *clip = m_clipManager->getClipById(producerId); - - if (clip == NULL) { - elem.setAttribute("id", producerId); - QString path = elem.attribute("resource"); - QString extension; - if (elem.attribute("type").toInt() == SLIDESHOW) { - extension = KUrl(path).fileName(); - path = KUrl(path).directory(); - } - - if (path.isEmpty() == false && QFile::exists(path) == false && elem.attribute("type").toInt() != TEXT && !elem.hasAttribute("placeholder")) { - kDebug() << "// FOUND MISSING CLIP: " << path << ", TYPE: " << elem.attribute("type").toInt(); - const QString size = elem.attribute("file_size"); - const QString hash = elem.attribute("file_hash"); - QString newpath; - int action = KMessageBox::No; - if (!size.isEmpty() && !hash.isEmpty()) { - if (!m_searchFolder.isEmpty()) newpath = searchFileRecursively(m_searchFolder, size, hash); - else action = (KMessageBox::ButtonCode) KMessageBox::questionYesNoCancel(kapp->activeWindow(), i18n("Clip %1
is invalid, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search automatically")), KGuiItem(i18n("Keep as placeholder"))); - } else { - if (elem.attribute("type").toInt() == SLIDESHOW) { - int res = KMessageBox::questionYesNoCancel(kapp->activeWindow(), i18n("Clip %1
is invalid or missing, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search manually")), KGuiItem(i18n("Keep as placeholder"))); - if (res == KMessageBox::Yes) - newpath = KFileDialog::getExistingDirectory(KUrl("kfiledialog:///clipfolder"), kapp->activeWindow(), i18n("Looking for %1", path)); - else { - // Abort project loading - action = res; - } - } else { - int res = KMessageBox::questionYesNoCancel(kapp->activeWindow(), i18n("Clip %1
is invalid or missing, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search manually")), KGuiItem(i18n("Keep as placeholder"))); - if (res == KMessageBox::Yes) - newpath = KFileDialog::getOpenFileName(KUrl("kfiledialog:///clipfolder"), QString(), kapp->activeWindow(), i18n("Looking for %1", path)); - else { - // Abort project loading - action = res; - } - } - } - if (action == KMessageBox::Yes) { - kDebug() << "// ASKED FOR SRCH CLIP: " << clipId; - m_searchFolder = KFileDialog::getExistingDirectory(KUrl("kfiledialog:///clipfolder"), kapp->activeWindow()); - if (!m_searchFolder.isEmpty()) { - newpath = searchFileRecursively(QDir(m_searchFolder), size, hash); - } - } else if (action == KMessageBox::Cancel) { - m_abortLoading = true; - return; - } else if (action == KMessageBox::No) { - // Keep clip as placeHolder - elem.setAttribute("placeholder", '1'); - } - if (!newpath.isEmpty()) { - if (elem.attribute("type").toInt() == SLIDESHOW) newpath.append('/' + extension); - elem.setAttribute("resource", newpath); - setNewClipResource(clipId, newpath); - setModified(true); - } - } - clip = new DocClipBase(m_clipManager, elem, producerId); - m_clipManager->addClip(clip); - } - - if (createClipItem) { - emit addProjectClip(clip); - //qApp->processEvents(); - } -} - -void KdenliveDoc::setNewClipResource(const QString &id, const QString &path) -{ - QDomNodeList prods = m_document.elementsByTagName("producer"); - int maxprod = prods.count(); - for (int i = 0; i < maxprod; i++) { - QDomNode m = prods.at(i); - QString prodId = m.toElement().attribute("id"); - if (prodId == id || prodId.startsWith(id + '_')) { - QDomNodeList params = m.childNodes(); - for (int j = 0; j < params.count(); j++) { - QDomElement e = params.item(j).toElement(); - if (e.attribute("name") == "resource") { - e.firstChild().setNodeValue(path); - break; - } - } - } - } -} - -QString KdenliveDoc::searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) const -{ - QString foundFileName; - QByteArray fileData; - QByteArray fileHash; - QStringList filesAndDirs = dir.entryList(QDir::Files | QDir::Readable); - for (int i = 0; i < filesAndDirs.size() && foundFileName.isEmpty(); i++) { - QFile file(dir.absoluteFilePath(filesAndDirs.at(i))); - if (file.open(QIODevice::ReadOnly)) { - if (QString::number(file.size()) == matchSize) { - /* - * 1 MB = 1 second per 450 files (or faster) - * 10 MB = 9 seconds per 450 files (or faster) - */ - if (file.size() > 1000000*2) { - fileData = file.read(1000000); - if (file.seek(file.size() - 1000000)) - fileData.append(file.readAll()); - } else - fileData = file.readAll(); - file.close(); - fileHash = QCryptographicHash::hash(fileData, QCryptographicHash::Md5); - if (QString(fileHash.toHex()) == matchHash) - return file.fileName(); - } - } - kDebug() << filesAndDirs.at(i) << file.size() << fileHash.toHex(); - } - filesAndDirs = dir.entryList(QDir::Dirs | QDir::Readable | QDir::Executable | QDir::NoDotAndDotDot); - for (int i = 0; i < filesAndDirs.size() && foundFileName.isEmpty(); i++) { - foundFileName = searchFileRecursively(dir.absoluteFilePath(filesAndDirs.at(i)), matchSize, matchHash); - if (!foundFileName.isEmpty()) - break; - } - return foundFileName; -} - -void KdenliveDoc::addClipInfo(QDomElement elem, QDomElement orig, QString clipId) -{ - DocClipBase *clip = m_clipManager->getClipById(clipId); - if (clip == NULL) { - addClip(elem, clipId, false); - } else { - QMap properties; - QDomNamedNodeMap attributes = elem.attributes(); - QString attrname; - for (int i = 0; i < attributes.count(); i++) { - attrname = attributes.item(i).nodeName(); - if (attrname != "resource") - properties.insert(attrname, attributes.item(i).nodeValue()); - kDebug() << attrname << " = " << attributes.item(i).nodeValue(); - } - clip->setProperties(properties); - emit addProjectClip(clip, false); - } - if (orig != QDomElement()) { - QMap meta; - QDomNode m = orig.firstChild(); - while (!m.isNull()) { - QString name = m.toElement().attribute("name"); - if (name.startsWith("meta.attr")) { - meta.insert(name.section('.', 2, 3), m.firstChild().nodeValue()); - } - m = m.nextSibling(); - } - if (!meta.isEmpty()) { - if (clip == NULL) clip = m_clipManager->getClipById(clipId); - if (clip) clip->setMetadata(meta); - } - } -} - -void KdenliveDoc::deleteProjectClip(QStringList ids) -{ - for (int i = 0; i < ids.size(); ++i) { - emit deleteTimelineClip(ids.at(i)); - } - m_clipManager->slotDeleteClips(ids); - setModified(true); -} - -void KdenliveDoc::deleteClip(const QString &clipId) -{ - emit signalDeleteProjectClip(clipId); -} - -void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId) -{ - m_clipManager->slotAddClipList(urls, group, groupId); - //emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); - setModified(true); -} - - -void KdenliveDoc::slotAddClipFile(const KUrl url, const QString group, const QString &groupId) -{ - m_clipManager->slotAddClipFile(url, group, groupId); - emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); - setModified(true); -} - -const QString KdenliveDoc::getFreeClipId() -{ - return QString::number(m_clipManager->getFreeClipId()); -} - -DocClipBase *KdenliveDoc::getBaseClip(const QString &clipId) -{ - return m_clipManager->getClipById(clipId); -} - -void KdenliveDoc::slotCreateColorClip(const QString &name, const QString &color, const QString &duration, QString group, const QString &groupId) -{ - m_clipManager->slotAddColorClipFile(name, color, duration, group, groupId); - setModified(true); - emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); -} - -void KdenliveDoc::slotCreateSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, QString group, const QString &groupId) -{ - m_clipManager->slotAddSlideshowClipFile(name, path, count, duration, loop, fade, luma_duration, luma_file, softness, group, groupId); - setModified(true); - emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); -} - -void KdenliveDoc::slotCreateTextClip(QString group, const QString &groupId, const QString &templatePath) -{ - QString titlesFolder = projectFolder().path(KUrl::AddTrailingSlash) + "titles/"; - KStandardDirs::makeDir(titlesFolder); - TitleWidget *dia_ui = new TitleWidget(templatePath, m_timecode, titlesFolder, m_render, kapp->activeWindow()); - if (dia_ui->exec() == QDialog::Accepted) { - m_clipManager->slotAddTextClipFile(i18n("Title clip"), dia_ui->duration(), dia_ui->xml().toString(), group, groupId); - setModified(true); - emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); - } - delete dia_ui; -} - -void KdenliveDoc::slotCreateTextTemplateClip(QString group, const QString &groupId, KUrl path) -{ - QString titlesFolder = projectFolder().path(KUrl::AddTrailingSlash) + "titles/"; - if (path.isEmpty()) { - path = KFileDialog::getOpenUrl(KUrl(titlesFolder), "*.kdenlivetitle", kapp->activeWindow(), i18n("Enter Template Path")); - } - - if (path.isEmpty()) return; - - //TODO: rewrite with new title system (just set resource) - m_clipManager->slotAddTextTemplateClip(i18n("Template title clip"), path, group, groupId); - setModified(true); - emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); -} - -int KdenliveDoc::tracksCount() const -{ - return m_tracksList.count(); -} - -TrackInfo KdenliveDoc::trackInfoAt(int ix) const -{ - return m_tracksList.at(ix); -} - -void KdenliveDoc::switchTrackAudio(int ix, bool hide) -{ - m_tracksList[ix].isMute = hide; // !m_tracksList.at(ix).isMute; -} - -void KdenliveDoc::switchTrackLock(int ix, bool lock) -{ - m_tracksList[ix].isLocked = lock; -} - -bool KdenliveDoc::isTrackLocked(int ix) const -{ - return m_tracksList.at(ix).isLocked; -} - -void KdenliveDoc::switchTrackVideo(int ix, bool hide) -{ - m_tracksList[ix].isBlind = hide; // !m_tracksList.at(ix).isBlind; -} - -void KdenliveDoc::insertTrack(int ix, TrackInfo type) -{ - if (ix == -1) m_tracksList << type; - else m_tracksList.insert(ix, type); -} - -void KdenliveDoc::deleteTrack(int ix) -{ - m_tracksList.removeAt(ix); -} - -void KdenliveDoc::setTrackType(int ix, TrackInfo type) -{ - m_tracksList[ix].type = type.type; - m_tracksList[ix].isMute = type.isMute; - m_tracksList[ix].isBlind = type.isBlind; - m_tracksList[ix].isLocked = type.isLocked; - m_tracksList[ix].trackName = type.trackName; -} - -const QList KdenliveDoc::tracksList() const -{ - return m_tracksList; -} - -QPoint KdenliveDoc::getTracksCount() const -{ - int audio = 0; - int video = 0; - foreach(const TrackInfo &info, m_tracksList) { - if (info.type == VIDEOTRACK) video++; - else audio++; - } - return QPoint(video, audio); -} - -void KdenliveDoc::cachePixmap(const QString &fileId, const QPixmap &pix) const -{ - pix.save(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/" + fileId + ".png"); -} - -QString KdenliveDoc::getLadspaFile() const -{ - int ct = 0; - QString counter = QString::number(ct).rightJustified(5, '0', false); - while (QFile::exists(m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/" + counter + ".ladspa")) { - ct++; - counter = QString::number(ct).rightJustified(5, '0', false); - } - return m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/" + counter + ".ladspa"; -} - -bool KdenliveDoc::checkDocumentClips(QDomNodeList infoproducers) -{ - DocumentChecker d(infoproducers, m_document); - return (d.hasMissingClips() == false); - - /* int clipType; - QDomElement e; - QString id; - QString resource; - QList missingClips; - for (int i = 0; i < infoproducers.count(); i++) { - e = infoproducers.item(i).toElement(); - clipType = e.attribute("type").toInt(); - if (clipType == COLOR) continue; - if (clipType == TEXT) { - //TODO: Check is clip template is missing (xmltemplate) or hash changed - continue; - } - id = e.attribute("id"); - resource = e.attribute("resource"); - if (clipType == SLIDESHOW) resource = KUrl(resource).directory(); - if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) { - // Missing clip found - missingClips.append(e); - } else { - // Check if the clip has changed - if (clipType != SLIDESHOW && e.hasAttribute("file_hash")) { - if (e.attribute("file_hash") != DocClipBase::getHash(e.attribute("resource"))) - e.removeAttribute("file_hash"); - } - } - } - if (missingClips.isEmpty()) return true; - DocumentChecker d(missingClips, m_document); - return (d.exec() == QDialog::Accepted);*/ -} - -void KdenliveDoc::setDocumentProperty(const QString &name, const QString &value) -{ - m_documentProperties[name] = value; -} - -const QString KdenliveDoc::getDocumentProperty(const QString &name) const -{ - return m_documentProperties.value(name); -} - -#include "kdenlivedoc.moc" - diff -Nru kdenlive-0.7.7/src/kdenlivedoc.h~ kdenlive-0.7.7.1/src/kdenlivedoc.h~ --- kdenlive-0.7.7/src/kdenlivedoc.h~ 2010-02-17 08:07:50.000000000 +0000 +++ kdenlive-0.7.7.1/src/kdenlivedoc.h~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,171 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#ifndef KDENLIVEDOC_H -#define KDENLIVEDOC_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "gentime.h" -#include "timecode.h" -#include "definitions.h" -#include "guide.h" - -class Render; -class ClipManager; -class DocClipBase; -class MainWindow; -class TrackInfo; - -class KdenliveDoc: public QObject -{ -Q_OBJECT public: - - KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, MainWindow *parent = 0); - ~KdenliveDoc(); - QDomNodeList producersList(); - double fps() const; - int width() const; - int height() const; - KUrl url() const; - KAutoSaveFile *m_autosave; - Timecode timecode() const; - QDomDocument toXml(); - //void setRenderer(Render *render); - QUndoStack *commandStack(); - QString producerName(const QString &id); - Render *renderer(); - QDomDocument m_guidesXml; - QDomElement guidesXml() const; - ClipManager *clipManager(); - void addClip(QDomElement elem, QString clipId, bool createClipItem = true); - void addClipInfo(QDomElement elem, QDomElement orig, QString clipId); - void slotAddClipFile(const KUrl url, const QString group, const QString &groupId = QString()); - void slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId = QString()); - void deleteClip(const QString &clipId); - int getFramePos(QString duration); - DocClipBase *getBaseClip(const QString &clipId); - void updateClip(const QString id); - void deleteProjectClip(QStringList ids); - /** Inform application of the audio thumbnails generation progress */ - void setThumbsProgress(const QString &message, int progress); - const QString &profilePath() const; - MltVideoProfile mltProfile() const; - const QString description() const; - void setUrl(KUrl url); - /** update project profile, returns true if fps was changed */ - bool setProfilePath(QString path); - const QString getFreeClipId(); - /** does the document need saving */ - bool isModified() const; - /** Returns project folder, used to store project files (titles, effects,...) */ - KUrl projectFolder() const; - void syncGuides(QList guides); - void setZoom(int horizontal, int vertical); - QPoint zoom() const; - double dar(); - double projectDuration() const; - bool saveSceneList(const QString &path, const QString &scene); - int tracksCount() const; - TrackInfo trackInfoAt(int ix) const; - void insertTrack(int ix, TrackInfo type); - void deleteTrack(int ix); - void setTrackType(int ix, TrackInfo type); - const QList tracksList() const; - QPoint getTracksCount() const; - void switchTrackVideo(int ix, bool hide); - void switchTrackAudio(int ix, bool hide); - void switchTrackLock(int ix, bool lock); - void cachePixmap(const QString &fileId, const QPixmap &pix) const; - void setProjectFolder(KUrl url); - QString getLadspaFile() const; - void setZone(int start, int end); - QPoint zone() const; - int setSceneList(); - void updatePreviewSettings(); - bool isTrackLocked(int ix) const; - void setDocumentProperty(const QString &name, const QString &value); - const QString getDocumentProperty(const QString &name) const; - -private: - KUrl m_url; - QDomDocument m_document; - double m_fps; - int m_width; - int m_height; - Timecode m_timecode; - Render *m_render; - QUndoStack *m_commandStack; - ClipManager *m_clipManager; - MltVideoProfile m_profile; - QTimer *m_autoSaveTimer; - QString m_searchFolder; - /** tells whether current doc has been changed since last save event */ - bool m_modified; - /** Project folder, used to store project files (titles, effects,...) */ - KUrl m_projectFolder; - bool m_abortLoading; - QMap m_documentProperties; - - QList m_tracksList; - void setNewClipResource(const QString &id, const QString &path); - QString searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) const; - void moveProjectData(KUrl url); - bool checkDocumentClips(QDomNodeList infoproducers); - QDomDocument createEmptyDocument(int videotracks, int audiotracks); - QDomDocument createEmptyDocument(QList tracks); - -public slots: - void slotCreateColorClip(const QString &name, const QString &color, const QString &duration, QString group, const QString &groupId); - void slotCreateSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, QString group, const QString &groupId); - void slotCreateTextClip(QString group, const QString &groupId, const QString &templatePath = QString()); - void slotCreateTextTemplateClip(QString group, const QString &groupId, KUrl path); - /** Set to true if document needs saving, false otherwise */ - void setModified(bool mod = true); - void checkProjectClips(); - -private slots: - void slotAutoSave(); - -signals: - void resetProjectList(); - void addProjectClip(DocClipBase *, bool getInfo = true); - void signalDeleteProjectClip(const QString &); - void updateClipDisplay(const QString&); - void deleteTimelineClip(const QString&); - void progressInfo(const QString &, int); - /** emitted when the document state has been modified (= needs saving or not) */ - void docModified(bool); - void selectLastAddedClip(const QString &); - void guidesUpdated(); -}; - -#endif diff -Nru kdenlive-0.7.7/src/keyframeedit.cpp kdenlive-0.7.7.1/src/keyframeedit.cpp --- kdenlive-0.7.7/src/keyframeedit.cpp 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/keyframeedit.cpp 2010-02-26 21:44:41.000000000 +0000 @@ -383,7 +383,7 @@ sl->setValue(keyframe_list->item(item->row(), col)->text().toInt()); sl->blockSignals(false); } - if (KdenliveSettings::keyframeseek() && seek) emit seekToPos(keyframe_pos->value()); + if (KdenliveSettings::keyframeseek() && seek) emit seekToPos(keyframe_pos->value() - m_min); } void KeyframeEdit::slotAdjustKeyframePos(int value) @@ -394,7 +394,7 @@ else val = m_timecode.getTimecodeFromFrames(value); keyframe_list->verticalHeaderItem(item->row())->setText(val); slotGenerateParams(item->row(), -1); - if (KdenliveSettings::keyframeseek()) emit seekToPos(value); + if (KdenliveSettings::keyframeseek()) emit seekToPos(value - m_min); } void KeyframeEdit::slotAdjustKeyframeValue(int /*value*/) diff -Nru kdenlive-0.7.7/src/mainwindow.cpp~ kdenlive-0.7.7.1/src/mainwindow.cpp~ --- kdenlive-0.7.7/src/mainwindow.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/mainwindow.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,3310 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "mainwindow.h" -#include "mainwindowadaptor.h" -#include "kdenlivesettings.h" -#include "kdenlivesettingsdialog.h" -#include "initeffects.h" -#include "profilesdialog.h" -#include "projectsettings.h" -#include "events.h" -#include "clipmanager.h" -#include "projectlist.h" -#include "monitor.h" -#include "recmonitor.h" -#include "monitormanager.h" -#include "kdenlivedoc.h" -#include "trackview.h" -#include "customtrackview.h" -#include "effectslistview.h" -#include "effectstackview.h" -#include "transitionsettings.h" -#include "renderwidget.h" -#include "renderer.h" -#ifndef NO_JOGSHUTTLE -#include "jogshuttle.h" -#endif /* NO_JOGSHUTTLE */ -#include "clipproperties.h" -#include "wizard.h" -#include "editclipcommand.h" -#include "titlewidget.h" -#include "markerdialog.h" -#include "clipitem.h" -#include "interfaces.h" -#include "kdenlive-config.h" -#include "cliptranscode.h" -#include "ui_templateclip_ui.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if KDE_IS_VERSION(4,3,80) -#include -#include -#else -#include -#include -#define KNS3 KNS -#endif /* KDE_IS_VERSION(4,3,80) */ -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -static const char version[] = VERSION; - -static const int ID_TIMELINE_POS = 0; - -namespace Mlt -{ -class Producer; -}; - -EffectsList MainWindow::videoEffects; -EffectsList MainWindow::audioEffects; -EffectsList MainWindow::customEffects; -EffectsList MainWindow::transitions; - -MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent) : - KXmlGuiWindow(parent), - m_activeDocument(NULL), - m_activeTimeline(NULL), - m_renderWidget(NULL), -#ifndef NO_JOGSHUTTLE - m_jogProcess(NULL), -#endif /* NO_JOGSHUTTLE */ - m_findActivated(false) -{ - - // Create DBus interface - new MainWindowAdaptor(this); - QDBusConnection dbus = QDBusConnection::sessionBus(); - dbus.registerObject("/MainWindow", this); - - setlocale(LC_NUMERIC, "POSIX"); - if (!KdenliveSettings::colortheme().isEmpty()) slotChangePalette(NULL, KdenliveSettings::colortheme()); - setFont(KGlobalSettings::toolBarFont()); - parseProfiles(MltPath); - m_commandStack = new QUndoGroup; - m_timelineArea = new KTabWidget(this); - m_timelineArea->setTabReorderingEnabled(true); - m_timelineArea->setTabBarHidden(true); - - QToolButton *closeTabButton = new QToolButton; - connect(closeTabButton, SIGNAL(clicked()), this, SLOT(closeCurrentDocument())); - closeTabButton->setIcon(KIcon("tab-close")); - closeTabButton->adjustSize(); - closeTabButton->setToolTip(i18n("Close the current tab")); - m_timelineArea->setCornerWidget(closeTabButton); - connect(m_timelineArea, SIGNAL(currentChanged(int)), this, SLOT(activateDocument())); - - connect(&m_findTimer, SIGNAL(timeout()), this, SLOT(findTimeout())); - m_findTimer.setSingleShot(true); - - // FIXME: the next call returns a newly allocated object, which leaks - initEffects::parseEffectFiles(); - //initEffects::parseCustomEffectsFile(); - - m_monitorManager = new MonitorManager(); - - m_projectListDock = new QDockWidget(i18n("Project Tree"), this); - m_projectListDock->setObjectName("project_tree"); - m_projectList = new ProjectList(this); - m_projectListDock->setWidget(m_projectList); - addDockWidget(Qt::TopDockWidgetArea, m_projectListDock); - - m_shortcutRemoveFocus = new QShortcut(QKeySequence("Esc"), this); - connect(m_shortcutRemoveFocus, SIGNAL(activated()), this, SLOT(slotRemoveFocus())); - - m_effectListDock = new QDockWidget(i18n("Effect List"), this); - m_effectListDock->setObjectName("effect_list"); - m_effectList = new EffectsListView(); - - //m_effectList = new KListWidget(this); - m_effectListDock->setWidget(m_effectList); - addDockWidget(Qt::TopDockWidgetArea, m_effectListDock); - - m_effectStackDock = new QDockWidget(i18n("Effect Stack"), this); - m_effectStackDock->setObjectName("effect_stack"); - m_effectStack = new EffectStackView(this); - m_effectStackDock->setWidget(m_effectStack); - addDockWidget(Qt::TopDockWidgetArea, m_effectStackDock); - - m_transitionConfigDock = new QDockWidget(i18n("Transition"), this); - m_transitionConfigDock->setObjectName("transition"); - m_transitionConfig = new TransitionSettings(this); - m_transitionConfigDock->setWidget(m_transitionConfig); - addDockWidget(Qt::TopDockWidgetArea, m_transitionConfigDock); - - KdenliveSettings::setCurrent_profile(KdenliveSettings::default_profile()); - m_fileOpenRecent = KStandardAction::openRecent(this, SLOT(openFile(const KUrl &)), actionCollection()); - readOptions(); - m_fileRevert = KStandardAction::revert(this, SLOT(slotRevert()), actionCollection()); - m_fileRevert->setEnabled(false); - - //slotDetectAudioDriver(); - - m_clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this); - m_clipMonitorDock->setObjectName("clip_monitor"); - m_clipMonitor = new Monitor("clip", m_monitorManager, QString(), this); - m_clipMonitorDock->setWidget(m_clipMonitor); - addDockWidget(Qt::TopDockWidgetArea, m_clipMonitorDock); - //m_clipMonitor->stop(); - - m_projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this); - m_projectMonitorDock->setObjectName("project_monitor"); - m_projectMonitor = new Monitor("project", m_monitorManager, QString(), this); - m_projectMonitorDock->setWidget(m_projectMonitor); - addDockWidget(Qt::TopDockWidgetArea, m_projectMonitorDock); - -#ifndef Q_WS_MAC - m_recMonitorDock = new QDockWidget(i18n("Record Monitor"), this); - m_recMonitorDock->setObjectName("record_monitor"); - m_recMonitor = new RecMonitor("record", this); - m_recMonitorDock->setWidget(m_recMonitor); - addDockWidget(Qt::TopDockWidgetArea, m_recMonitorDock); - - connect(m_recMonitor, SIGNAL(addProjectClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); - connect(m_recMonitor, SIGNAL(showConfigDialog(int, int)), this, SLOT(slotPreferences(int, int))); -#endif - - m_undoViewDock = new QDockWidget(i18n("Undo History"), this); - m_undoViewDock->setObjectName("undo_history"); - m_undoView = new QUndoView(this); - m_undoView->setCleanIcon(KIcon("edit-clear")); - m_undoView->setEmptyLabel(i18n("Clean")); - m_undoViewDock->setWidget(m_undoView); - m_undoView->setGroup(m_commandStack); - addDockWidget(Qt::TopDockWidgetArea, m_undoViewDock); - - //overviewDock = new QDockWidget(i18n("Project Overview"), this); - //overviewDock->setObjectName("project_overview"); - //m_overView = new CustomTrackView(NULL, NULL, this); - //overviewDock->setWidget(m_overView); - //addDockWidget(Qt::TopDockWidgetArea, overviewDock); - - setupActions(); - //tabifyDockWidget(projectListDock, effectListDock); - tabifyDockWidget(m_projectListDock, m_effectStackDock); - tabifyDockWidget(m_projectListDock, m_transitionConfigDock); - //tabifyDockWidget(projectListDock, undoViewDock); - - - tabifyDockWidget(m_clipMonitorDock, m_projectMonitorDock); -#ifndef Q_WS_MAC - tabifyDockWidget(m_clipMonitorDock, m_recMonitorDock); -#endif - setCentralWidget(m_timelineArea); - - - setupGUI(); - - /*ScriptingPart* sp = new ScriptingPart(this, QStringList()); - guiFactory()->addClient(sp);*/ - - loadPlugins(); - loadTranscoders(); - //kDebug() << factory() << " " << factory()->container("video_effects_menu", this); - - m_projectMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone); - m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast(factory()->container("marker_menu", this))); - m_projectList->setupGeneratorMenu(static_cast(factory()->container("generators", this)), static_cast(factory()->container("transcoders", this))); - - QAction *action; - // build themes menus - QMenu *themesMenu = static_cast(factory()->container("themes_menu", this)); - QActionGroup *themegroup = new QActionGroup(this); - themegroup->setExclusive(true); - action = new QAction(i18n("Default"), this); - action->setCheckable(true); - themegroup->addAction(action); - if (KdenliveSettings::colortheme().isEmpty()) action->setChecked(true); - - - const QStringList schemeFiles = KGlobal::dirs()->findAllResources("data", "color-schemes/*.colors", KStandardDirs::NoDuplicates); - - for (int i = 0; i < schemeFiles.size(); ++i) { - // get the file name - const QString filename = schemeFiles.at(i); - const QFileInfo info(filename); - - // add the entry - KSharedConfigPtr config = KSharedConfig::openConfig(filename); - QIcon icon = createSchemePreviewIcon(config); - KConfigGroup group(config, "General"); - const QString name = group.readEntry("Name", info.baseName()); - action = new QAction(name, this); - action->setData(filename); - action->setIcon(icon); - action->setCheckable(true); - themegroup->addAction(action); - if (KdenliveSettings::colortheme() == filename) action->setChecked(true); - } - - - - - - - /*KGlobal::dirs()->addResourceDir("themes", KStandardDirs::installPath("data") + QString("kdenlive/themes")); - QStringList themes = KGlobal::dirs()->findAllResources("themes", QString(), KStandardDirs::Recursive | KStandardDirs::NoDuplicates); - for (QStringList::const_iterator it = themes.constBegin(); it != themes.constEnd(); ++it) - { - QFileInfo fi(*it); - action = new QAction(fi.fileName(), this); - action->setData(*it); - action->setCheckable(true); - themegroup->addAction(action); - if (KdenliveSettings::colortheme() == *it) action->setChecked(true); - }*/ - themesMenu->addActions(themegroup->actions()); - connect(themesMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotChangePalette(QAction*))); - - // build effects menus - QMenu *videoEffectsMenu = static_cast(factory()->container("video_effects_menu", this)); - - QStringList effectInfo; - QMap effectsList; - for (int ix = 0; ix < videoEffects.count(); ix++) { - effectInfo = videoEffects.effectIdInfo(ix); - effectsList.insert(effectInfo.at(0).toLower(), effectInfo); - } - - foreach(const QStringList &value, effectsList) { - action = new QAction(value.at(0), this); - action->setData(value); - videoEffectsMenu->addAction(action); - } - - QMenu *audioEffectsMenu = static_cast(factory()->container("audio_effects_menu", this)); - - - effectsList.clear(); - for (int ix = 0; ix < audioEffects.count(); ix++) { - effectInfo = audioEffects.effectIdInfo(ix); - effectsList.insert(effectInfo.at(0).toLower(), effectInfo); - } - - foreach(const QStringList &value, effectsList) { - action = new QAction(value.at(0), this); - action->setData(value); - audioEffectsMenu->addAction(action); - } - - m_customEffectsMenu = static_cast(factory()->container("custom_effects_menu", this)); - - if (customEffects.isEmpty()) m_customEffectsMenu->setEnabled(false); - else m_customEffectsMenu->setEnabled(true); - - effectsList.clear(); - for (int ix = 0; ix < customEffects.count(); ix++) { - effectInfo = customEffects.effectIdInfo(ix); - effectsList.insert(effectInfo.at(0).toLower(), effectInfo); - } - - foreach(const QStringList &value, effectsList) { - action = new QAction(value.at(0), this); - action->setData(value); - m_customEffectsMenu->addAction(action); - } - - QMenu *newEffect = new QMenu(this); - newEffect->addMenu(videoEffectsMenu); - newEffect->addMenu(audioEffectsMenu); - newEffect->addMenu(m_customEffectsMenu); - m_effectStack->setMenu(newEffect); - - - QMenu *viewMenu = static_cast(factory()->container("dockwindows", this)); - const QList viewActions = createPopupMenu()->actions(); - viewMenu->insertActions(NULL, viewActions); - - connect(videoEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddVideoEffect(QAction *))); - connect(audioEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddAudioEffect(QAction *))); - connect(m_customEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddCustomEffect(QAction *))); - - m_timelineContextMenu = new QMenu(this); - m_timelineContextClipMenu = new QMenu(this); - m_timelineContextTransitionMenu = new QMenu(this); - - - QMenu *transitionsMenu = new QMenu(i18n("Add Transition"), this); - QStringList effects = transitions.effectNames(); - - effectsList.clear(); - for (int ix = 0; ix < transitions.count(); ix++) { - effectInfo = transitions.effectIdInfo(ix); - effectsList.insert(effectInfo.at(0).toLower(), effectInfo); - } - foreach(const QStringList &value, effectsList) { - action = new QAction(value.at(0), this); - action->setData(value); - transitionsMenu->addAction(action); - } - connect(transitionsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddTransition(QAction *))); - - m_timelineContextMenu->addAction(actionCollection()->action("insert_space")); - m_timelineContextMenu->addAction(actionCollection()->action("delete_space")); - m_timelineContextMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Paste))); - - m_timelineContextClipMenu->addAction(actionCollection()->action("delete_timeline_clip")); - m_timelineContextClipMenu->addAction(actionCollection()->action("group_clip")); - m_timelineContextClipMenu->addAction(actionCollection()->action("ungroup_clip")); - m_timelineContextClipMenu->addAction(actionCollection()->action("cut_timeline_clip")); - m_timelineContextClipMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Copy))); - m_timelineContextClipMenu->addAction(actionCollection()->action("paste_effects")); - m_timelineContextClipMenu->addAction(actionCollection()->action("split_audio")); - - QMenu *markersMenu = (QMenu*)(factory()->container("marker_menu", this)); - m_timelineContextClipMenu->addMenu(markersMenu); - m_timelineContextClipMenu->addMenu(transitionsMenu); - m_timelineContextClipMenu->addMenu(videoEffectsMenu); - m_timelineContextClipMenu->addMenu(audioEffectsMenu); - //TODO: re-enable custom effects menu when it is implemented - m_timelineContextClipMenu->addMenu(m_customEffectsMenu); - - m_timelineContextTransitionMenu->addAction(actionCollection()->action("delete_timeline_clip")); - m_timelineContextTransitionMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Copy))); - - m_timelineContextTransitionMenu->addAction(actionCollection()->action("auto_transition")); - - connect(m_projectMonitorDock, SIGNAL(visibilityChanged(bool)), m_projectMonitor, SLOT(refreshMonitor(bool))); - connect(m_clipMonitorDock, SIGNAL(visibilityChanged(bool)), m_clipMonitor, SLOT(refreshMonitor(bool))); - //connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors())); - connect(m_monitorManager, SIGNAL(raiseClipMonitor(bool)), this, SLOT(slotRaiseMonitor(bool))); - connect(m_effectList, SIGNAL(addEffect(const QDomElement)), this, SLOT(slotAddEffect(const QDomElement))); - connect(m_effectList, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects())); - - m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor); - slotConnectMonitors(); - - // Disable drop B frames, see Kdenlive issue #1330, see also kdenlivesettingsdialog.cpp - KdenliveSettings::setDropbframes(false); - - // Open or create a file. Command line argument passed in Url has - // precedence, then "openlastproject", then just a plain empty file. - // If opening Url fails, openlastproject will _not_ be used. - if (!Url.isEmpty()) { - // delay loading so that the window shows up - m_startUrl = Url; - QTimer::singleShot(500, this, SLOT(openFile())); - } else if (KdenliveSettings::openlastproject()) { - QTimer::singleShot(500, this, SLOT(openLastFile())); - } else { //if (m_timelineArea->count() == 0) { - newFile(false); - } - -#ifndef NO_JOGSHUTTLE - activateShuttleDevice(); -#endif /* NO_JOGSHUTTLE */ - m_projectListDock->raise(); -} - -void MainWindow::queryQuit() -{ - if (queryClose()) { - if (m_projectMonitor) m_projectMonitor->stop(); - if (m_clipMonitor) m_clipMonitor->stop(); - delete m_effectStack; - delete m_activeTimeline; -#ifndef Q_WS_MAC - // This sometimes causes crash on exit on OS X for some reason. - delete m_projectMonitor; - delete m_clipMonitor; -#endif - delete m_activeDocument; - delete m_shortcutRemoveFocus; - Mlt::Factory::close(); - kapp->quit(); - } -} - -//virtual -bool MainWindow::queryClose() -{ - if (m_renderWidget) { - int waitingJobs = m_renderWidget->waitingJobsCount(); - if (waitingJobs > 0) { - switch (KMessageBox::warningYesNoCancel(this, i18np("You have 1 rendering job waiting in the queue.\nWhat do you want to do with this job?", "You have %1 rendering jobs waiting in the queue.\nWhat do you want to do with these jobs?", waitingJobs), QString(), KGuiItem(i18n("Start them now")), KGuiItem(i18n("Delete them")))) { - case KMessageBox::Yes : - // create script with waiting jobs and start it - if (m_renderWidget->startWaitingRenderJobs() == false) return false; - break; - case KMessageBox::No : - // Don't do anything, jobs will be deleted - break; - default: - return false; - } - } - } - saveOptions(); - if (m_monitorManager) m_monitorManager->stopActiveMonitor(); - if (m_activeDocument && m_activeDocument->isModified()) { - switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document?"))) { - case KMessageBox::Yes : - // save document here. If saving fails, return false; - return saveFile(); - case KMessageBox::No : - // User does not want to save the changes, clear recovery files - m_activeDocument->m_autosave->resize(0); - return true; - default: // cancel - return false; - } - } - return true; -} - - -void MainWindow::loadPlugins() -{ - foreach(QObject *plugin, QPluginLoader::staticInstances()) - populateMenus(plugin); - - QStringList directories = KGlobal::dirs()->findDirs("module", QString()); - QStringList filters; - filters << "libkdenlive*"; - foreach(const QString &folder, directories) { - kDebug() << "// PARSING FIOLER: " << folder; - QDir pluginsDir(folder); - foreach(const QString &fileName, pluginsDir.entryList(filters, QDir::Files)) { - kDebug() << "// FOUND PLUGIN: " << fileName << "= " << pluginsDir.absoluteFilePath(fileName); - QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); - QObject *plugin = loader.instance(); - if (plugin) { - populateMenus(plugin); - m_pluginFileNames += fileName; - } else kDebug() << "// ERROR LOADING PLUGIN: " << fileName << ", " << loader.errorString(); - } - } - //exit(1); -} - -void MainWindow::populateMenus(QObject *plugin) -{ - QMenu *addMenu = static_cast(factory()->container("generators", this)); - ClipGenerator *iGenerator = qobject_cast(plugin); - if (iGenerator) - addToMenu(plugin, iGenerator->generators(KdenliveSettings::producerslist()), addMenu, SLOT(generateClip()), - NULL); -} - -void MainWindow::addToMenu(QObject *plugin, const QStringList &texts, - QMenu *menu, const char *member, - QActionGroup *actionGroup) -{ - kDebug() << "// ADD to MENU" << texts; - foreach(const QString &text, texts) { - QAction *action = new QAction(text, plugin); - action->setData(text); - connect(action, SIGNAL(triggered()), this, member); - menu->addAction(action); - - if (actionGroup) { - action->setCheckable(true); - actionGroup->addAction(action); - } - } -} - -void MainWindow::aboutPlugins() -{ - //PluginDialog dialog(pluginsDir.path(), m_pluginFileNames, this); - //dialog.exec(); -} - - -void MainWindow::generateClip() -{ - QAction *action = qobject_cast(sender()); - ClipGenerator *iGenerator = qobject_cast(action->parent()); - - KUrl clipUrl = iGenerator->generatedClip(action->data().toString(), m_activeDocument->projectFolder(), QStringList(), QStringList(), 25, 720, 576); - if (!clipUrl.isEmpty()) { - m_projectList->slotAddClip(QList () << clipUrl); - } -} - -void MainWindow::saveProperties(KConfigGroup &config) -{ - // save properties here,used by session management - saveFile(); - KMainWindow::saveProperties(config); -} - - -void MainWindow::readProperties(const KConfigGroup &config) -{ - // read properties here,used by session management - KMainWindow::readProperties(config); - QString Lastproject = config.group("Recent Files").readPathEntry("File1", QString()); - openFile(KUrl(Lastproject)); -} - -void MainWindow::slotReloadEffects() -{ - m_customEffectsMenu->clear(); - initEffects::parseCustomEffectsFile(); - QAction *action; - QStringList effectInfo; - QMap effectsList; - - for (int ix = 0; ix < customEffects.count(); ix++) { - effectInfo = customEffects.effectIdInfo(ix); - effectsList.insert(effectInfo.at(0).toLower(), effectInfo); - } - if (effectsList.isEmpty()) { - m_customEffectsMenu->setEnabled(false); - return; - } else m_customEffectsMenu->setEnabled(true); - - foreach(const QStringList &value, effectsList) { - action = new QAction(value.at(0), this); - action->setData(value); - m_customEffectsMenu->addAction(action); - } - m_effectList->reloadEffectList(); -} - -#ifndef NO_JOGSHUTTLE -void MainWindow::activateShuttleDevice() -{ - delete m_jogProcess; - m_jogProcess = NULL; - if (KdenliveSettings::enableshuttle() == false) return; - m_jogProcess = new JogShuttle(KdenliveSettings::shuttledevice()); - connect(m_jogProcess, SIGNAL(rewind1()), m_monitorManager, SLOT(slotRewindOneFrame())); - connect(m_jogProcess, SIGNAL(forward1()), m_monitorManager, SLOT(slotForwardOneFrame())); - connect(m_jogProcess, SIGNAL(rewind(double)), m_monitorManager, SLOT(slotRewind(double))); - connect(m_jogProcess, SIGNAL(forward(double)), m_monitorManager, SLOT(slotForward(double))); - connect(m_jogProcess, SIGNAL(stop()), m_monitorManager, SLOT(slotPlay())); - connect(m_jogProcess, SIGNAL(button(int)), this, SLOT(slotShuttleButton(int))); -} - -void MainWindow::slotShuttleButton(int code) -{ - switch (code) { - case 5: - slotShuttleAction(KdenliveSettings::shuttle1()); - break; - case 6: - slotShuttleAction(KdenliveSettings::shuttle2()); - break; - case 7: - slotShuttleAction(KdenliveSettings::shuttle3()); - break; - case 8: - slotShuttleAction(KdenliveSettings::shuttle4()); - break; - case 9: - slotShuttleAction(KdenliveSettings::shuttle5()); - break; - } -} - -void MainWindow::slotShuttleAction(int code) -{ - switch (code) { - case 0: - return; - case 1: - m_monitorManager->slotPlay(); - break; - default: - m_monitorManager->slotPlay(); - break; - } -} -#endif /* NO_JOGSHUTTLE */ - -void MainWindow::configureNotifications() -{ - KNotifyConfigWidget::configure(this); -} - -void MainWindow::slotFullScreen() -{ - KToggleFullScreenAction::setFullScreen(this, actionCollection()->action("fullscreen")->isChecked()); -} - -void MainWindow::slotAddEffect(const QDomElement effect, GenTime pos, int track) -{ - if (!m_activeDocument) return; - if (effect.isNull()) { - kDebug() << "--- ERROR, TRYING TO APPEND NULL EFFECT"; - return; - } - QDomElement effectToAdd = effect.cloneNode().toElement(); - m_activeTimeline->projectView()->slotAddEffect(effectToAdd, pos, track); -} - -void MainWindow::slotRaiseMonitor(bool clipMonitor) -{ - if (clipMonitor) m_clipMonitorDock->raise(); - else m_projectMonitorDock->raise(); -} - -void MainWindow::slotUpdateClip(const QString &id) -{ - if (!m_activeDocument) return; - m_activeTimeline->projectView()->slotUpdateClip(id); -} - -void MainWindow::slotConnectMonitors() -{ - - m_projectList->setRenderer(m_projectMonitor->render); - //connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &))); - connect(m_projectList, SIGNAL(deleteProjectClips(QStringList, QMap)), this, SLOT(slotDeleteProjectClips(QStringList, QMap))); - connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *))); - connect(m_projectList, SIGNAL(showClipProperties(QList , QMap)), this, SLOT(slotShowClipProperties(QList , QMap))); - connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, int, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, int, bool))); - connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &))); - connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool))); - - connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(const QString &, bool)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &, bool))); - - connect(m_clipMonitor, SIGNAL(refreshClipThumbnail(const QString &)), m_projectList, SLOT(slotRefreshClipThumbnail(const QString &))); - - connect(m_clipMonitor, SIGNAL(adjustMonitorSize()), this, SLOT(slotAdjustClipMonitor())); - connect(m_projectMonitor, SIGNAL(adjustMonitorSize()), this, SLOT(slotAdjustProjectMonitor())); - - connect(m_clipMonitor, SIGNAL(saveZone(Render *, QPoint)), this, SLOT(slotSaveZone(Render *, QPoint))); - connect(m_projectMonitor, SIGNAL(saveZone(Render *, QPoint)), this, SLOT(slotSaveZone(Render *, QPoint))); -} - -void MainWindow::slotAdjustClipMonitor() -{ - m_clipMonitorDock->updateGeometry(); - m_clipMonitorDock->adjustSize(); - m_clipMonitor->resetSize(); -} - -void MainWindow::slotAdjustProjectMonitor() -{ - m_projectMonitorDock->updateGeometry(); - m_projectMonitorDock->adjustSize(); - m_projectMonitor->resetSize(); -} - -void MainWindow::setupActions() -{ - - KActionCollection* collection = actionCollection(); - m_timecodeFormat = new KComboBox(this); - m_timecodeFormat->addItem(i18n("hh:mm:ss::ff")); - m_timecodeFormat->addItem(i18n("Frames")); - if (KdenliveSettings::frametimecode()) m_timecodeFormat->setCurrentIndex(1); - connect(m_timecodeFormat, SIGNAL(activated(int)), this, SLOT(slotUpdateTimecodeFormat(int))); - - m_statusProgressBar = new QProgressBar(this); - m_statusProgressBar->setMinimum(0); - m_statusProgressBar->setMaximum(100); - m_statusProgressBar->setMaximumWidth(150); - m_statusProgressBar->setVisible(false); - - KToolBar *toolbar = new KToolBar("statusToolBar", this, Qt::BottomToolBarArea); - toolbar->setMovable(false); - statusBar()->setStyleSheet(QString("QStatusBar QLabel {font-size:%1pt;} QStatusBar::item { border: 0px; font-size:%1pt;padding:0px; }").arg(statusBar()->font().pointSize())); - QString style1 = "QToolBar { border: 0px } QToolButton { border-style: inset; border:1px solid #999999;border-radius: 3px;margin: 0px 3px;padding: 0px;} QToolButton:checked { background-color: rgba(224, 224, 0, 100); border-style: inset; border:1px solid #cc6666;border-radius: 3px;}"; - - //create edit mode buttons - m_normalEditTool = new KAction(KIcon("kdenlive-normal-edit"), i18n("Normal mode"), this); - m_normalEditTool->setShortcut(i18nc("Normal editing", "n")); - toolbar->addAction(m_normalEditTool); - m_normalEditTool->setCheckable(true); - m_normalEditTool->setChecked(true); - - m_overwriteEditTool = new KAction(KIcon("kdenlive-overwrite-edit"), i18n("Overwrite mode"), this); - //m_overwriteEditTool->setShortcut(i18nc("Overwrite mode shortcut", "o")); - toolbar->addAction(m_overwriteEditTool); - m_overwriteEditTool->setCheckable(true); - m_overwriteEditTool->setChecked(false); - - m_insertEditTool = new KAction(KIcon("kdenlive-insert-edit"), i18n("Insert mode"), this); - //m_insertEditTool->setShortcut(i18nc("Insert mode shortcut", "i")); - toolbar->addAction(m_insertEditTool); - m_insertEditTool->setCheckable(true); - m_insertEditTool->setChecked(false); - // not implemented yet - m_insertEditTool->setEnabled(false); - - QActionGroup *editGroup = new QActionGroup(this); - editGroup->addAction(m_normalEditTool); - editGroup->addAction(m_overwriteEditTool); - editGroup->addAction(m_insertEditTool); - editGroup->setExclusive(true); - connect(editGroup, SIGNAL(triggered(QAction *)), this, SLOT(slotChangeEdit(QAction *))); - //connect(m_overwriteEditTool, SIGNAL(toggled(bool)), this, SLOT(slotSetOverwriteMode(bool))); - - toolbar->addSeparator(); - - // create tools buttons - m_buttonSelectTool = new KAction(KIcon("kdenlive-select-tool"), i18n("Selection tool"), this); - m_buttonSelectTool->setShortcut(i18nc("Selection tool shortcut", "s")); - toolbar->addAction(m_buttonSelectTool); - m_buttonSelectTool->setCheckable(true); - m_buttonSelectTool->setChecked(true); - - m_buttonRazorTool = new KAction(KIcon("edit-cut"), i18n("Razor tool"), this); - m_buttonRazorTool->setShortcut(i18nc("Razor tool shortcut", "x")); - toolbar->addAction(m_buttonRazorTool); - m_buttonRazorTool->setCheckable(true); - m_buttonRazorTool->setChecked(false); - - m_buttonSpacerTool = new KAction(KIcon("kdenlive-spacer-tool"), i18n("Spacer tool"), this); - m_buttonSpacerTool->setShortcut(i18nc("Spacer tool shortcut", "m")); - toolbar->addAction(m_buttonSpacerTool); - m_buttonSpacerTool->setCheckable(true); - m_buttonSpacerTool->setChecked(false); - - QActionGroup *toolGroup = new QActionGroup(this); - toolGroup->addAction(m_buttonSelectTool); - toolGroup->addAction(m_buttonRazorTool); - toolGroup->addAction(m_buttonSpacerTool); - toolGroup->setExclusive(true); - toolbar->setToolButtonStyle(Qt::ToolButtonIconOnly); - - QWidget * actionWidget; - int max = toolbar->iconSizeDefault() + 2; - actionWidget = toolbar->widgetForAction(m_normalEditTool); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - actionWidget = toolbar->widgetForAction(m_insertEditTool); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - actionWidget = toolbar->widgetForAction(m_overwriteEditTool); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - actionWidget = toolbar->widgetForAction(m_buttonSelectTool); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - actionWidget = toolbar->widgetForAction(m_buttonRazorTool); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - actionWidget = toolbar->widgetForAction(m_buttonSpacerTool); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - toolbar->setStyleSheet(style1); - connect(toolGroup, SIGNAL(triggered(QAction *)), this, SLOT(slotChangeTool(QAction *))); - - toolbar->addSeparator(); - m_buttonFitZoom = new KAction(KIcon("zoom-fit-best"), i18n("Fit zoom to project"), this); - toolbar->addAction(m_buttonFitZoom); - m_buttonFitZoom->setCheckable(false); - connect(m_buttonFitZoom, SIGNAL(triggered()), this, SLOT(slotFitZoom())); - - actionWidget = toolbar->widgetForAction(m_buttonFitZoom); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - m_zoomSlider = new QSlider(Qt::Horizontal, this); - m_zoomSlider->setMaximum(13); - m_zoomSlider->setPageStep(1); - - m_zoomSlider->setMaximumWidth(150); - m_zoomSlider->setMinimumWidth(100); - toolbar->addWidget(m_zoomSlider); - - m_buttonVideoThumbs = new KAction(KIcon("kdenlive-show-videothumb"), i18n("Show video thumbnails"), this); - toolbar->addAction(m_buttonVideoThumbs); - m_buttonVideoThumbs->setCheckable(true); - m_buttonVideoThumbs->setChecked(KdenliveSettings::videothumbnails()); - connect(m_buttonVideoThumbs, SIGNAL(triggered()), this, SLOT(slotSwitchVideoThumbs())); - - m_buttonAudioThumbs = new KAction(KIcon("kdenlive-show-audiothumb"), i18n("Show audio thumbnails"), this); - toolbar->addAction(m_buttonAudioThumbs); - m_buttonAudioThumbs->setCheckable(true); - m_buttonAudioThumbs->setChecked(KdenliveSettings::audiothumbnails()); - connect(m_buttonAudioThumbs, SIGNAL(triggered()), this, SLOT(slotSwitchAudioThumbs())); - - m_buttonShowMarkers = new KAction(KIcon("kdenlive-show-markers"), i18n("Show markers comments"), this); - toolbar->addAction(m_buttonShowMarkers); - m_buttonShowMarkers->setCheckable(true); - m_buttonShowMarkers->setChecked(KdenliveSettings::showmarkers()); - connect(m_buttonShowMarkers, SIGNAL(triggered()), this, SLOT(slotSwitchMarkersComments())); - - m_buttonSnap = new KAction(KIcon("kdenlive-snap"), i18n("Snap"), this); - toolbar->addAction(m_buttonSnap); - m_buttonSnap->setCheckable(true); - m_buttonSnap->setChecked(KdenliveSettings::snaptopoints()); - connect(m_buttonSnap, SIGNAL(triggered()), this, SLOT(slotSwitchSnap())); - - actionWidget = toolbar->widgetForAction(m_buttonVideoThumbs); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - actionWidget = toolbar->widgetForAction(m_buttonAudioThumbs); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - actionWidget = toolbar->widgetForAction(m_buttonShowMarkers); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - actionWidget = toolbar->widgetForAction(m_buttonSnap); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - - m_messageLabel = new StatusBarMessageLabel(this); - m_messageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding); - - statusBar()->addWidget(m_messageLabel, 10); - statusBar()->addWidget(m_statusProgressBar, 0); - statusBar()->addPermanentWidget(toolbar); - statusBar()->insertPermanentFixedItem("00:00:00:00", ID_TIMELINE_POS); - statusBar()->addPermanentWidget(m_timecodeFormat); - //statusBar()->setMaximumHeight(statusBar()->font().pointSize() * 3); - - collection->addAction("normal_mode", m_normalEditTool); - collection->addAction("overwrite_mode", m_overwriteEditTool); - collection->addAction("insert_mode", m_insertEditTool); - collection->addAction("select_tool", m_buttonSelectTool); - collection->addAction("razor_tool", m_buttonRazorTool); - collection->addAction("spacer_tool", m_buttonSpacerTool); - - collection->addAction("show_video_thumbs", m_buttonVideoThumbs); - collection->addAction("show_audio_thumbs", m_buttonAudioThumbs); - collection->addAction("show_markers", m_buttonShowMarkers); - collection->addAction("snap", m_buttonSnap); - collection->addAction("zoom_fit", m_buttonFitZoom); - - KAction* zoomIn = new KAction(KIcon("zoom-in"), i18n("Zoom In"), this); - collection->addAction("zoom_in", zoomIn); - connect(zoomIn, SIGNAL(triggered(bool)), this, SLOT(slotZoomIn())); - zoomIn->setShortcut(Qt::CTRL + Qt::Key_Plus); - - KAction* zoomOut = new KAction(KIcon("zoom-out"), i18n("Zoom Out"), this); - collection->addAction("zoom_out", zoomOut); - connect(zoomOut, SIGNAL(triggered(bool)), this, SLOT(slotZoomOut())); - zoomOut->setShortcut(Qt::CTRL + Qt::Key_Minus); - - m_projectSearch = new KAction(KIcon("edit-find"), i18n("Find"), this); - collection->addAction("project_find", m_projectSearch); - connect(m_projectSearch, SIGNAL(triggered(bool)), this, SLOT(slotFind())); - m_projectSearch->setShortcut(Qt::Key_Slash); - - m_projectSearchNext = new KAction(KIcon("go-down-search"), i18n("Find Next"), this); - collection->addAction("project_find_next", m_projectSearchNext); - connect(m_projectSearchNext, SIGNAL(triggered(bool)), this, SLOT(slotFindNext())); - m_projectSearchNext->setShortcut(Qt::Key_F3); - m_projectSearchNext->setEnabled(false); - - KAction* profilesAction = new KAction(KIcon("document-new"), i18n("Manage Project Profiles"), this); - collection->addAction("manage_profiles", profilesAction); - connect(profilesAction, SIGNAL(triggered(bool)), this, SLOT(slotEditProfiles())); - - KNS3::standardAction(i18n("Download New Wipes..."), this, SLOT(slotGetNewLumaStuff()), actionCollection(), "get_new_lumas"); - - KNS3::standardAction(i18n("Download New Render Profiles..."), this, SLOT(slotGetNewRenderStuff()), actionCollection(), "get_new_profiles"); - - KNS3::standardAction(i18n("Download New Project Profiles..."), this, SLOT(slotGetNewMltProfileStuff()), actionCollection(), "get_new_mlt_profiles"); - - KAction* wizAction = new KAction(KIcon("configure"), i18n("Run Config Wizard"), this); - collection->addAction("run_wizard", wizAction); - connect(wizAction, SIGNAL(triggered(bool)), this, SLOT(slotRunWizard())); - - KAction* projectAction = new KAction(KIcon("configure"), i18n("Project Settings"), this); - collection->addAction("project_settings", projectAction); - connect(projectAction, SIGNAL(triggered(bool)), this, SLOT(slotEditProjectSettings())); - - KAction* projectRender = new KAction(KIcon("media-record"), i18n("Render"), this); - collection->addAction("project_render", projectRender); - projectRender->setShortcut(Qt::CTRL + Qt::Key_Return); - connect(projectRender, SIGNAL(triggered(bool)), this, SLOT(slotRenderProject())); - - KAction* projectClean = new KAction(KIcon("edit-clear"), i18n("Clean Project"), this); - collection->addAction("project_clean", projectClean); - connect(projectClean, SIGNAL(triggered(bool)), this, SLOT(slotCleanProject())); - - KAction* monitorPlay = new KAction(KIcon("media-playback-start"), i18n("Play"), this); - KShortcut playShortcut; - playShortcut.setPrimary(Qt::Key_Space); - playShortcut.setAlternate(Qt::Key_K); - monitorPlay->setShortcut(playShortcut); - collection->addAction("monitor_play", monitorPlay); - connect(monitorPlay, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotPlay())); - - m_playZone = new KAction(KIcon("media-playback-start"), i18n("Play Zone"), this); - m_playZone->setShortcut(Qt::CTRL + Qt::Key_Space); - collection->addAction("monitor_play_zone", m_playZone); - connect(m_playZone, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotPlayZone())); - - m_loopZone = new KAction(KIcon("media-playback-start"), i18n("Loop Zone"), this); - m_loopZone->setShortcut(Qt::ALT + Qt::Key_Space); - collection->addAction("monitor_loop_zone", m_loopZone); - connect(m_loopZone, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotLoopZone())); - - KAction *dvdWizard = new KAction(KIcon("media-optical"), i18n("DVD Wizard"), this); - collection->addAction("dvd_wizard", dvdWizard); - connect(dvdWizard, SIGNAL(triggered(bool)), this, SLOT(slotDvdWizard())); - - KAction *transcodeClip = new KAction(KIcon("edit-copy"), i18n("Transcode Clips"), this); - collection->addAction("transcode_clip", transcodeClip); - connect(transcodeClip, SIGNAL(triggered(bool)), this, SLOT(slotTranscodeClip())); - - KAction *markIn = collection->addAction("mark_in"); - markIn->setText(i18n("Set Zone In")); - markIn->setShortcut(Qt::Key_I); - connect(markIn, SIGNAL(triggered(bool)), this, SLOT(slotSetInPoint())); - - KAction *markOut = collection->addAction("mark_out"); - markOut->setText(i18n("Set Zone Out")); - markOut->setShortcut(Qt::Key_O); - connect(markOut, SIGNAL(triggered(bool)), this, SLOT(slotSetOutPoint())); - - KAction *switchMon = collection->addAction("switch_monitor"); - switchMon->setText(i18n("Switch monitor")); - switchMon->setShortcut(Qt::Key_T); - connect(switchMon, SIGNAL(triggered(bool)), this, SLOT(slotSwitchMonitors())); - - KAction *insertTree = collection->addAction("insert_project_tree"); - insertTree->setText(i18n("Insert zone in project tree")); - insertTree->setShortcut(Qt::CTRL + Qt::Key_I); - connect(insertTree, SIGNAL(triggered(bool)), this, SLOT(slotInsertZoneToTree())); - - KAction *insertTimeline = collection->addAction("insert_timeline"); - insertTimeline->setText(i18n("Insert zone in timeline")); - insertTimeline->setShortcut(Qt::SHIFT + Qt::CTRL + Qt::Key_I); - connect(insertTimeline, SIGNAL(triggered(bool)), this, SLOT(slotInsertZoneToTimeline())); - - KAction *resizeStart = new KAction(KIcon(), i18n("Resize Item Start"), this); - collection->addAction("resize_timeline_clip_start", resizeStart); - resizeStart->setShortcut(Qt::Key_1); - connect(resizeStart, SIGNAL(triggered(bool)), this, SLOT(slotResizeItemStart())); - - KAction *resizeEnd = new KAction(KIcon(), i18n("Resize Item End"), this); - collection->addAction("resize_timeline_clip_end", resizeEnd); - resizeEnd->setShortcut(Qt::Key_2); - connect(resizeEnd, SIGNAL(triggered(bool)), this, SLOT(slotResizeItemEnd())); - - KAction* monitorSeekBackward = new KAction(KIcon("media-seek-backward"), i18n("Rewind"), this); - monitorSeekBackward->setShortcut(Qt::Key_J); - collection->addAction("monitor_seek_backward", monitorSeekBackward); - connect(monitorSeekBackward, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotRewind())); - - KAction* monitorSeekBackwardOneFrame = new KAction(KIcon("media-skip-backward"), i18n("Rewind 1 Frame"), this); - monitorSeekBackwardOneFrame->setShortcut(Qt::Key_Left); - collection->addAction("monitor_seek_backward-one-frame", monitorSeekBackwardOneFrame); - connect(monitorSeekBackwardOneFrame, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotRewindOneFrame())); - - KAction* monitorSeekBackwardOneSecond = new KAction(KIcon("media-skip-backward"), i18n("Rewind 1 Second"), this); - monitorSeekBackwardOneSecond->setShortcut(Qt::SHIFT + Qt::Key_Left); - collection->addAction("monitor_seek_backward-one-second", monitorSeekBackwardOneSecond); - connect(monitorSeekBackwardOneSecond, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotRewindOneSecond())); - - KAction* monitorSeekSnapBackward = new KAction(KIcon("media-seek-backward"), i18n("Go to Previous Snap Point"), this); - monitorSeekSnapBackward->setShortcut(Qt::ALT + Qt::Key_Left); - collection->addAction("monitor_seek_snap_backward", monitorSeekSnapBackward); - connect(monitorSeekSnapBackward, SIGNAL(triggered(bool)), this, SLOT(slotSnapRewind())); - - KAction* monitorSeekForward = new KAction(KIcon("media-seek-forward"), i18n("Forward"), this); - monitorSeekForward->setShortcut(Qt::Key_L); - collection->addAction("monitor_seek_forward", monitorSeekForward); - connect(monitorSeekForward, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotForward())); - - KAction* clipStart = new KAction(KIcon("media-seek-backward"), i18n("Go to Clip Start"), this); - clipStart->setShortcut(Qt::Key_Home); - collection->addAction("seek_clip_start", clipStart); - connect(clipStart, SIGNAL(triggered(bool)), this, SLOT(slotClipStart())); - - KAction* clipEnd = new KAction(KIcon("media-seek-forward"), i18n("Go to Clip End"), this); - clipEnd->setShortcut(Qt::Key_End); - collection->addAction("seek_clip_end", clipEnd); - connect(clipEnd, SIGNAL(triggered(bool)), this, SLOT(slotClipEnd())); - - KAction* zoneStart = new KAction(KIcon("media-seek-backward"), i18n("Go to Zone Start"), this); - zoneStart->setShortcut(Qt::SHIFT + Qt::Key_I); - collection->addAction("seek_zone_start", zoneStart); - connect(zoneStart, SIGNAL(triggered(bool)), this, SLOT(slotZoneStart())); - - KAction* zoneEnd = new KAction(KIcon("media-seek-forward"), i18n("Go to Zone End"), this); - zoneEnd->setShortcut(Qt::SHIFT + Qt::Key_O); - collection->addAction("seek_zone_end", zoneEnd); - connect(zoneEnd, SIGNAL(triggered(bool)), this, SLOT(slotZoneEnd())); - - KAction* projectStart = new KAction(KIcon("go-first"), i18n("Go to Project Start"), this); - projectStart->setShortcut(Qt::CTRL + Qt::Key_Home); - collection->addAction("seek_start", projectStart); - connect(projectStart, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotStart())); - - KAction* projectEnd = new KAction(KIcon("go-last"), i18n("Go to Project End"), this); - projectEnd->setShortcut(Qt::CTRL + Qt::Key_End); - collection->addAction("seek_end", projectEnd); - connect(projectEnd, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotEnd())); - - KAction* monitorSeekForwardOneFrame = new KAction(KIcon("media-skip-forward"), i18n("Forward 1 Frame"), this); - monitorSeekForwardOneFrame->setShortcut(Qt::Key_Right); - collection->addAction("monitor_seek_forward-one-frame", monitorSeekForwardOneFrame); - connect(monitorSeekForwardOneFrame, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotForwardOneFrame())); - - KAction* monitorSeekForwardOneSecond = new KAction(KIcon("media-skip-forward"), i18n("Forward 1 Second"), this); - monitorSeekForwardOneSecond->setShortcut(Qt::SHIFT + Qt::Key_Right); - collection->addAction("monitor_seek_forward-one-second", monitorSeekForwardOneSecond); - connect(monitorSeekForwardOneSecond, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotForwardOneSecond())); - - KAction* monitorSeekSnapForward = new KAction(KIcon("media-seek-forward"), i18n("Go to Next Snap Point"), this); - monitorSeekSnapForward->setShortcut(Qt::ALT + Qt::Key_Right); - collection->addAction("monitor_seek_snap_forward", monitorSeekSnapForward); - connect(monitorSeekSnapForward, SIGNAL(triggered(bool)), this, SLOT(slotSnapForward())); - - KAction* deleteTimelineClip = new KAction(KIcon("edit-delete"), i18n("Delete Selected Item"), this); - deleteTimelineClip->setShortcut(Qt::Key_Delete); - collection->addAction("delete_timeline_clip", deleteTimelineClip); - connect(deleteTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotDeleteTimelineClip())); - - /*KAction* editTimelineClipSpeed = new KAction(i18n("Change Clip Speed"), this); - collection->addAction("change_clip_speed", editTimelineClipSpeed); - editTimelineClipSpeed->setData("change_speed"); - connect(editTimelineClipSpeed, SIGNAL(triggered(bool)), this, SLOT(slotChangeClipSpeed()));*/ - - KAction *stickTransition = collection->addAction("auto_transition"); - stickTransition->setData(QString("auto")); - stickTransition->setCheckable(true); - stickTransition->setEnabled(false); - stickTransition->setText(i18n("Automatic Transition")); - connect(stickTransition, SIGNAL(triggered(bool)), this, SLOT(slotAutoTransition())); - - KAction* groupClip = new KAction(KIcon("object-group"), i18n("Group Clips"), this); - groupClip->setShortcut(Qt::CTRL + Qt::Key_G); - collection->addAction("group_clip", groupClip); - connect(groupClip, SIGNAL(triggered(bool)), this, SLOT(slotGroupClips())); - - KAction* ungroupClip = new KAction(KIcon("object-ungroup"), i18n("Ungroup Clips"), this); - collection->addAction("ungroup_clip", ungroupClip); - ungroupClip->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_G); - ungroupClip->setData("ungroup_clip"); - connect(ungroupClip, SIGNAL(triggered(bool)), this, SLOT(slotUnGroupClips())); - - KAction* insertOvertwrite = new KAction(KIcon(), i18n("Insert Clip Zone in Timeline (Overwrite)"), this); - insertOvertwrite->setShortcut(Qt::Key_V); - collection->addAction("overwrite_to_in_point", insertOvertwrite); - connect(insertOvertwrite, SIGNAL(triggered(bool)), this, SLOT(slotInsertClipOverwrite())); - - KAction* selectTimelineClip = new KAction(KIcon("edit-select"), i18n("Select Clip"), this); - selectTimelineClip->setShortcut(Qt::Key_Plus); - collection->addAction("select_timeline_clip", selectTimelineClip); - connect(selectTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotSelectTimelineClip())); - - KAction* deselectTimelineClip = new KAction(KIcon("edit-select"), i18n("Deselect Clip"), this); - deselectTimelineClip->setShortcut(Qt::Key_Minus); - collection->addAction("deselect_timeline_clip", deselectTimelineClip); - connect(deselectTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotDeselectTimelineClip())); - - KAction* selectAddTimelineClip = new KAction(KIcon("edit-select"), i18n("Add Clip To Selection"), this); - selectAddTimelineClip->setShortcut(Qt::ALT + Qt::Key_Plus); - collection->addAction("select_add_timeline_clip", selectAddTimelineClip); - connect(selectAddTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotSelectAddTimelineClip())); - - KAction* selectTimelineTransition = new KAction(KIcon("edit-select"), i18n("Select Transition"), this); - selectTimelineTransition->setShortcut(Qt::SHIFT + Qt::Key_Plus); - collection->addAction("select_timeline_transition", selectTimelineTransition); - connect(selectTimelineTransition, SIGNAL(triggered(bool)), this, SLOT(slotSelectTimelineTransition())); - - KAction* deselectTimelineTransition = new KAction(KIcon("edit-select"), i18n("Deselect Transition"), this); - deselectTimelineTransition->setShortcut(Qt::SHIFT + Qt::Key_Minus); - collection->addAction("deselect_timeline_transition", deselectTimelineTransition); - connect(deselectTimelineTransition, SIGNAL(triggered(bool)), this, SLOT(slotDeselectTimelineTransition())); - - KAction* selectAddTimelineTransition = new KAction(KIcon("edit-select"), i18n("Add Transition To Selection"), this); - selectAddTimelineTransition->setShortcut(Qt::ALT + Qt::SHIFT + Qt::Key_Plus); - collection->addAction("select_add_timeline_transition", selectAddTimelineTransition); - connect(selectAddTimelineTransition, SIGNAL(triggered(bool)), this, SLOT(slotSelectAddTimelineTransition())); - - KAction* cutTimelineClip = new KAction(KIcon("edit-cut"), i18n("Cut Clip"), this); - cutTimelineClip->setShortcut(Qt::SHIFT + Qt::Key_R); - collection->addAction("cut_timeline_clip", cutTimelineClip); - connect(cutTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotCutTimelineClip())); - - KAction* addClipMarker = new KAction(KIcon("bookmark-new"), i18n("Add Marker"), this); - collection->addAction("add_clip_marker", addClipMarker); - connect(addClipMarker, SIGNAL(triggered(bool)), this, SLOT(slotAddClipMarker())); - - KAction* deleteClipMarker = new KAction(KIcon("edit-delete"), i18n("Delete Marker"), this); - collection->addAction("delete_clip_marker", deleteClipMarker); - connect(deleteClipMarker, SIGNAL(triggered(bool)), this, SLOT(slotDeleteClipMarker())); - - KAction* deleteAllClipMarkers = new KAction(KIcon("edit-delete"), i18n("Delete All Markers"), this); - collection->addAction("delete_all_clip_markers", deleteAllClipMarkers); - connect(deleteAllClipMarkers, SIGNAL(triggered(bool)), this, SLOT(slotDeleteAllClipMarkers())); - - KAction* editClipMarker = new KAction(KIcon("document-properties"), i18n("Edit Marker"), this); - collection->addAction("edit_clip_marker", editClipMarker); - connect(editClipMarker, SIGNAL(triggered(bool)), this, SLOT(slotEditClipMarker())); - - KAction* splitAudio = new KAction(KIcon("document-new"), i18n("Split Audio"), this); - collection->addAction("split_audio", splitAudio); - connect(splitAudio, SIGNAL(triggered(bool)), this, SLOT(slotSplitAudio())); - - KAction* audioOnly = new KAction(KIcon("document-new"), i18n("Audio Only"), this); - collection->addAction("clip_audio_only", audioOnly); - audioOnly->setData("clip_audio_only"); - audioOnly->setCheckable(true); - - KAction* videoOnly = new KAction(KIcon("document-new"), i18n("Video Only"), this); - collection->addAction("clip_video_only", videoOnly); - videoOnly->setData("clip_video_only"); - videoOnly->setCheckable(true); - - KAction* audioAndVideo = new KAction(KIcon("document-new"), i18n("Audio and Video"), this); - collection->addAction("clip_audio_and_video", audioAndVideo); - audioAndVideo->setData("clip_audio_and_video"); - audioAndVideo->setCheckable(true); - - m_clipTypeGroup = new QActionGroup(this); - m_clipTypeGroup->addAction(audioOnly); - m_clipTypeGroup->addAction(videoOnly); - m_clipTypeGroup->addAction(audioAndVideo); - connect(m_clipTypeGroup, SIGNAL(triggered(QAction *)), this, SLOT(slotUpdateClipType(QAction *))); - m_clipTypeGroup->setEnabled(false); - - KAction *insertSpace = new KAction(KIcon(), i18n("Insert Space"), this); - collection->addAction("insert_space", insertSpace); - connect(insertSpace, SIGNAL(triggered()), this, SLOT(slotInsertSpace())); - - KAction *removeSpace = new KAction(KIcon(), i18n("Remove Space"), this); - collection->addAction("delete_space", removeSpace); - connect(removeSpace, SIGNAL(triggered()), this, SLOT(slotRemoveSpace())); - - KAction *insertTrack = new KAction(KIcon(), i18n("Insert Track"), this); - collection->addAction("insert_track", insertTrack); - connect(insertTrack, SIGNAL(triggered()), this, SLOT(slotInsertTrack())); - - KAction *deleteTrack = new KAction(KIcon(), i18n("Delete Track"), this); - collection->addAction("delete_track", deleteTrack); - connect(deleteTrack, SIGNAL(triggered()), this, SLOT(slotDeleteTrack())); - - KAction *changeTrack = new KAction(KIcon(), i18n("Change Track"), this); - collection->addAction("change_track", changeTrack); - connect(changeTrack, SIGNAL(triggered()), this, SLOT(slotChangeTrack())); - - KAction *addGuide = new KAction(KIcon("document-new"), i18n("Add Guide"), this); - collection->addAction("add_guide", addGuide); - connect(addGuide, SIGNAL(triggered()), this, SLOT(slotAddGuide())); - - QAction *delGuide = new KAction(KIcon("edit-delete"), i18n("Delete Guide"), this); - collection->addAction("delete_guide", delGuide); - connect(delGuide, SIGNAL(triggered()), this, SLOT(slotDeleteGuide())); - - QAction *editGuide = new KAction(KIcon("document-properties"), i18n("Edit Guide"), this); - collection->addAction("edit_guide", editGuide); - connect(editGuide, SIGNAL(triggered()), this, SLOT(slotEditGuide())); - - QAction *delAllGuides = new KAction(KIcon("edit-delete"), i18n("Delete All Guides"), this); - collection->addAction("delete_all_guides", delAllGuides); - connect(delAllGuides, SIGNAL(triggered()), this, SLOT(slotDeleteAllGuides())); - - QAction *pasteEffects = new KAction(KIcon("edit-paste"), i18n("Paste Effects"), this); - collection->addAction("paste_effects", pasteEffects); - pasteEffects->setData("paste_effects"); - connect(pasteEffects , SIGNAL(triggered()), this, SLOT(slotPasteEffects())); - - QAction *showTimeline = new KAction(i18n("Show Timeline"), this); - collection->addAction("show_timeline", showTimeline); - showTimeline->setCheckable(true); - showTimeline->setChecked(true); - connect(showTimeline, SIGNAL(triggered(bool)), this, SLOT(slotShowTimeline(bool))); - - /*QAction *maxCurrent = new KAction(i18n("Maximize Current Widget"), this); - collection->addAction("maximize_current", maxCurrent); - maxCurrent->setCheckable(true); - maxCurrent->setChecked(false); - connect(maxCurrent, SIGNAL(triggered(bool)), this, SLOT(slotMaximizeCurrent(bool)));*/ - - - m_closeAction = KStandardAction::close(this, SLOT(closeCurrentDocument()), collection); - - KStandardAction::quit(this, SLOT(queryQuit()), collection); - - KStandardAction::open(this, SLOT(openFile()), collection); - - m_saveAction = KStandardAction::save(this, SLOT(saveFile()), collection); - - KStandardAction::saveAs(this, SLOT(saveFileAs()), collection); - - KStandardAction::openNew(this, SLOT(newFile()), collection); - - KStandardAction::preferences(this, SLOT(slotPreferences()), collection); - - KStandardAction::configureNotifications(this , SLOT(configureNotifications()), collection); - - KStandardAction::copy(this, SLOT(slotCopy()), collection); - - KStandardAction::paste(this, SLOT(slotPaste()), collection); - - KAction *undo = KStandardAction::undo(m_commandStack, SLOT(undo()), collection); - undo->setEnabled(false); - connect(m_commandStack, SIGNAL(canUndoChanged(bool)), undo, SLOT(setEnabled(bool))); - - KAction *redo = KStandardAction::redo(m_commandStack, SLOT(redo()), collection); - redo->setEnabled(false); - connect(m_commandStack, SIGNAL(canRedoChanged(bool)), redo, SLOT(setEnabled(bool))); - - KStandardAction::fullScreen(this, SLOT(slotFullScreen()), this, collection); - - /* - //TODO: Add status tooltip to actions ? - connect(collection, SIGNAL(actionHovered(QAction*)), - this, SLOT(slotDisplayActionMessage(QAction*)));*/ - - - QAction *addClip = new KAction(KIcon("kdenlive-add-clip"), i18n("Add Clip"), this); - collection->addAction("add_clip", addClip); - connect(addClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddClip())); - - QAction *addColorClip = new KAction(KIcon("kdenlive-add-color-clip"), i18n("Add Color Clip"), this); - collection->addAction("add_color_clip", addColorClip); - connect(addColorClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddColorClip())); - - QAction *addSlideClip = new KAction(KIcon("kdenlive-add-slide-clip"), i18n("Add Slideshow Clip"), this); - collection->addAction("add_slide_clip", addSlideClip); - connect(addSlideClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddSlideshowClip())); - - QAction *addTitleClip = new KAction(KIcon("kdenlive-add-text-clip"), i18n("Add Title Clip"), this); - collection->addAction("add_text_clip", addTitleClip); - connect(addTitleClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddTitleClip())); - - QAction *addTitleTemplateClip = new KAction(KIcon("kdenlive-add-text-clip"), i18n("Add Template Title"), this); - collection->addAction("add_text_template_clip", addTitleTemplateClip); - connect(addTitleTemplateClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddTitleTemplateClip())); - - QAction *addFolderButton = new KAction(KIcon("folder-new"), i18n("Create Folder"), this); - collection->addAction("add_folder", addFolderButton); - connect(addFolderButton , SIGNAL(triggered()), m_projectList, SLOT(slotAddFolder())); - - QAction *clipProperties = new KAction(KIcon("document-edit"), i18n("Clip Properties"), this); - collection->addAction("clip_properties", clipProperties); - clipProperties->setData("clip_properties"); - connect(clipProperties , SIGNAL(triggered()), m_projectList, SLOT(slotEditClip())); - clipProperties->setEnabled(false); - - QAction *openClip = new KAction(KIcon("document-open"), i18n("Edit Clip"), this); - collection->addAction("edit_clip", openClip); - openClip->setData("edit_clip"); - connect(openClip , SIGNAL(triggered()), m_projectList, SLOT(slotOpenClip())); - openClip->setEnabled(false); - - QAction *deleteClip = new KAction(KIcon("edit-delete"), i18n("Delete Clip"), this); - collection->addAction("delete_clip", deleteClip); - deleteClip->setData("delete_clip"); - connect(deleteClip , SIGNAL(triggered()), m_projectList, SLOT(slotRemoveClip())); - deleteClip->setEnabled(false); - - QAction *reloadClip = new KAction(KIcon("view-refresh"), i18n("Reload Clip"), this); - collection->addAction("reload_clip", reloadClip); - reloadClip->setData("reload_clip"); - connect(reloadClip , SIGNAL(triggered()), m_projectList, SLOT(slotReloadClip())); - reloadClip->setEnabled(false); - - QMenu *addClips = new QMenu(); - addClips->addAction(addClip); - addClips->addAction(addColorClip); - addClips->addAction(addSlideClip); - addClips->addAction(addTitleClip); - addClips->addAction(addTitleTemplateClip); - addClips->addAction(addFolderButton); - - addClips->addAction(reloadClip); - addClips->addAction(clipProperties); - addClips->addAction(openClip); - addClips->addAction(deleteClip); - m_projectList->setupMenu(addClips, addClip); - - //connect(collection, SIGNAL( clearStatusText() ), - //statusBar(), SLOT( clear() ) ); -} - -void MainWindow::slotDisplayActionMessage(QAction *a) -{ - statusBar()->showMessage(a->data().toString(), 3000); -} - -void MainWindow::saveOptions() -{ - KdenliveSettings::self()->writeConfig(); - KSharedConfigPtr config = KGlobal::config(); - m_fileOpenRecent->saveEntries(KConfigGroup(config, "Recent Files")); - KConfigGroup treecolumns(config, "Project Tree"); - treecolumns.writeEntry("columns", m_projectList->headerInfo()); - config->sync(); -} - -void MainWindow::readOptions() -{ - KSharedConfigPtr config = KGlobal::config(); - m_fileOpenRecent->loadEntries(KConfigGroup(config, "Recent Files")); - KConfigGroup initialGroup(config, "version"); - bool upgrade = false; - if (initialGroup.exists()) { - if (initialGroup.readEntry("version", QString()).section(' ', 0, 0) != QString(version).section(' ', 0, 0)) { - upgrade = true; - } - - if (initialGroup.readEntry("version") == "0.7") { - //Add new settings from 0.7.1 - if (KdenliveSettings::defaultprojectfolder().isEmpty()) { - QString path = QDir::homePath() + "/kdenlive"; - if (KStandardDirs::makeDir(path) == false) { - kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; - } else KdenliveSettings::setDefaultprojectfolder(path); - } - } - - } - - if (!initialGroup.exists() || upgrade) { - // this is our first run, show Wizard - Wizard *w = new Wizard(upgrade, this); - if (w->exec() == QDialog::Accepted && w->isOk()) { - w->adjustSettings(); - initialGroup.writeEntry("version", version); - delete w; - } else { - ::exit(1); - } - } - KConfigGroup treecolumns(config, "Project Tree"); - const QByteArray state = treecolumns.readEntry("columns", QByteArray()); - if (!state.isEmpty()) - m_projectList->setHeaderInfo(state); -} - -void MainWindow::slotRunWizard() -{ - Wizard *w = new Wizard(false, this); - if (w->exec() == QDialog::Accepted && w->isOk()) { - w->adjustSettings(); - } - delete w; -} - -void MainWindow::newFile(bool showProjectSettings, bool force) -{ - if (!m_timelineArea->isEnabled() && !force) return; - m_fileRevert->setEnabled(false); - QString profileName; - KUrl projectFolder; - QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()); - if (!showProjectSettings) { - if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); - profileName = KdenliveSettings::default_profile(); - projectFolder = KdenliveSettings::defaultprojectfolder(); - } else { - ProjectSettings *w = new ProjectSettings(NULL, QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); - if (w->exec() != QDialog::Accepted) return; - if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); - if (KdenliveSettings::videothumbnails() != w->enableVideoThumbs()) slotSwitchVideoThumbs(); - if (KdenliveSettings::audiothumbnails() != w->enableAudioThumbs()) slotSwitchAudioThumbs(); - profileName = w->selectedProfile(); - projectFolder = w->selectedFolder(); - projectTracks = w->tracks(); - delete w; - } - m_timelineArea->setEnabled(true); - m_projectList->setEnabled(true); - KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, projectTracks, m_projectMonitor->render, this); - doc->m_autosave = new KAutoSaveFile(KUrl(), doc); - bool ok; - TrackView *trackView = new TrackView(doc, &ok, this); - m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description()); - if (!ok) { - // MLT is broken - //m_timelineArea->setEnabled(false); - //m_projectList->setEnabled(false); - slotPreferences(6); - return; - } - if (m_timelineArea->count() == 1) { - connectDocumentInfo(doc); - connectDocument(trackView, doc); - } else m_timelineArea->setTabBarHidden(false); - m_monitorManager->activateMonitor("clip"); - m_closeAction->setEnabled(m_timelineArea->count() > 1); -} - -void MainWindow::activateDocument() -{ - if (m_timelineArea->currentWidget() == NULL || !m_timelineArea->isEnabled()) return; - TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget(); - KdenliveDoc *currentDoc = currentTab->document(); - connectDocumentInfo(currentDoc); - connectDocument(currentTab, currentDoc); -} - -void MainWindow::closeCurrentDocument(bool saveChanges) -{ - QWidget *w = m_timelineArea->currentWidget(); - if (!w) return; - // closing current document - int ix = m_timelineArea->currentIndex() + 1; - if (ix == m_timelineArea->count()) ix = 0; - m_timelineArea->setCurrentIndex(ix); - TrackView *tabToClose = (TrackView *) w; - KdenliveDoc *docToClose = tabToClose->document(); - if (docToClose && docToClose->isModified() && saveChanges) { - switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document?"))) { - case KMessageBox::Yes : - // save document here. If saving fails, return false; - if (saveFile() == false) return; - break; - case KMessageBox::Cancel : - return; - break; - default: - break; - } - } - m_clipMonitor->slotSetXml(NULL); - m_timelineArea->removeTab(m_timelineArea->indexOf(w)); - if (m_timelineArea->count() == 1) { - m_timelineArea->setTabBarHidden(true); - m_closeAction->setEnabled(false); - } - if (docToClose == m_activeDocument) { - delete m_activeDocument; - m_activeDocument = NULL; - m_effectStack->clear(); - m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false); - } else delete docToClose; - if (w == m_activeTimeline) { - delete m_activeTimeline; - m_activeTimeline = NULL; - } else delete w; -} - -bool MainWindow::saveFileAs(const QString &outputFileName) -{ - QString currentSceneList; - m_monitorManager->stopActiveMonitor(); - if (KdenliveSettings::dropbframes()) { - KdenliveSettings::setDropbframes(false); - m_activeDocument->clipManager()->updatePreviewSettings(); - currentSceneList = m_projectMonitor->sceneList(); - KdenliveSettings::setDropbframes(true); - m_activeDocument->clipManager()->updatePreviewSettings(); - } else currentSceneList = m_projectMonitor->sceneList(); - - if (m_activeDocument->saveSceneList(outputFileName, currentSceneList) == false) - return false; - - // Save timeline thumbnails - m_activeTimeline->projectView()->saveThumbnails(); - m_activeDocument->setUrl(KUrl(outputFileName)); - if (m_activeDocument->m_autosave == NULL) { - m_activeDocument->m_autosave = new KAutoSaveFile(KUrl(outputFileName), this); - } else m_activeDocument->m_autosave->setManagedFile(KUrl(outputFileName)); - setCaption(m_activeDocument->description()); - m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description()); - m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), m_activeDocument->url().path()); - m_activeDocument->setModified(false); - m_fileOpenRecent->addUrl(KUrl(outputFileName)); - m_fileRevert->setEnabled(true); - return true; -} - -bool MainWindow::saveFileAs() -{ - // Check that the Kdenlive mime type is correctly installed - QString mimetype = "application/x-kdenlive"; - KMimeType::Ptr mime = KMimeType::mimeType(mimetype); - if (!mime) mimetype = "*.kdenlive"; - - QString outputFile = KFileDialog::getSaveFileName(KUrl(), mimetype); - if (outputFile.isEmpty()) return false; - if (QFile::exists(outputFile)) { - if (KMessageBox::questionYesNo(this, i18n("File already exists.\nDo you want to overwrite it?")) == KMessageBox::No) return false; - } - return saveFileAs(outputFile); -} - -bool MainWindow::saveFile() -{ - if (!m_activeDocument) return true; - if (m_activeDocument->url().isEmpty()) { - return saveFileAs(); - } else { - bool result = saveFileAs(m_activeDocument->url().path()); - m_activeDocument->m_autosave->resize(0); - return result; - } -} - -void MainWindow::openFile() -{ - if (!m_startUrl.isEmpty()) { - openFile(m_startUrl); - m_startUrl = KUrl(); - return; - } - // Check that the Kdenlive mime type is correctly installed - QString mimetype = "application/x-kdenlive"; - KMimeType::Ptr mime = KMimeType::mimeType(mimetype); - if (!mime) mimetype = "*.kdenlive"; - - KUrl url = KFileDialog::getOpenUrl(KUrl("kfiledialog:///projectfolder"), mimetype); - if (url.isEmpty()) return; - m_fileOpenRecent->addUrl(url); - openFile(url); -} - -void MainWindow::openLastFile() -{ - KSharedConfigPtr config = KGlobal::config(); - KUrl::List urls = m_fileOpenRecent->urls(); - //WARNING: this is buggy, we get a random url, not the last one. Bug in KRecentFileAction? - if (urls.isEmpty()) newFile(false); - else openFile(urls.last()); -} - -void MainWindow::openFile(const KUrl &url) -{ - // Check if the document is already opened - const int ct = m_timelineArea->count(); - bool isOpened = false; - int i; - for (i = 0; i < ct; i++) { - TrackView *tab = (TrackView *) m_timelineArea->widget(i); - KdenliveDoc *doc = tab->document(); - if (doc->url() == url) { - isOpened = true; - break; - } - } - if (isOpened) { - m_timelineArea->setCurrentIndex(i); - return; - } - - // Check for backup file - QList staleFiles = KAutoSaveFile::staleFiles(url); - if (!staleFiles.isEmpty()) { - if (KMessageBox::questionYesNo(this, - i18n("Auto-saved files exist. Do you want to recover them now?"), - i18n("File Recovery"), - KGuiItem(i18n("Recover")), KGuiItem(i18n("Don't recover"))) == KMessageBox::Yes) { - recoverFiles(staleFiles); - return; - } else { - // remove the stale files - foreach(KAutoSaveFile *stale, staleFiles) { - stale->open(QIODevice::ReadWrite); - delete stale; - } - } - } - if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); - m_messageLabel->setMessage(i18n("Opening file %1", url.path()), InformationMessage); - m_messageLabel->repaint(); - doOpenFile(url, NULL); -} - -void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) -{ - if (!m_timelineArea->isEnabled()) return; - m_fileRevert->setEnabled(true); - KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, this); - if (stale == NULL) { - stale = new KAutoSaveFile(url, doc); - doc->m_autosave = stale; - } else { - doc->m_autosave = stale; - doc->setUrl(stale->managedFile()); - doc->setModified(true); - stale->setParent(doc); - } - connectDocumentInfo(doc); - bool ok; - TrackView *trackView = new TrackView(doc, &ok, this); - m_timelineArea->setCurrentIndex(m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description())); - if (!ok) { - m_timelineArea->setEnabled(false); - m_projectList->setEnabled(false); - KMessageBox::sorry(this, i18n("Cannot open file %1.\nProject is corrupted.", url.path())); - slotGotProgressInfo(QString(), -1); - newFile(false, true); - return; - } - m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), doc->url().path()); - trackView->setDuration(trackView->duration()); - trackView->projectView()->initCursorPos(m_projectMonitor->render->seekPosition().frames(doc->fps())); - - if (m_timelineArea->count() > 1) m_timelineArea->setTabBarHidden(false); - slotGotProgressInfo(QString(), -1); - m_projectMonitor->adjustRulerSize(trackView->duration()); - m_projectMonitor->slotZoneMoved(trackView->inPoint(), trackView->outPoint()); - m_clipMonitor->refreshMonitor(true); -} - -void MainWindow::recoverFiles(QList staleFiles) -{ - if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); - foreach(KAutoSaveFile *stale, staleFiles) { - /*if (!stale->open(QIODevice::QIODevice::ReadOnly)) { - // show an error message; we could not steal the lockfile - // maybe another application got to the file before us? - delete stale; - continue; - }*/ - kDebug() << "// OPENING RECOVERY: " << stale->fileName() << "\nMANAGED: " << stale->managedFile().path(); - // the stalefiles also contain ".lock" files so we must ignore them... bug in KAutoSaveFile? - if (!stale->fileName().endsWith(".lock")) doOpenFile(KUrl(stale->fileName()), stale); - else KIO::NetAccess::del(KUrl(stale->fileName()), this); - } -} - - -void MainWindow::parseProfiles(const QString &mltPath) -{ - // kDebug()<<" + + YOUR MLT INSTALL WAS FOUND IN: "<< MLT_PREFIX <fileDialog()->setMode(KFile::Directory); - if (getUrl->exec() == QDialog::Rejected) { - ::exit(0); - } - KUrl mltPath = getUrl->selectedUrl(); - delete getUrl; - if (mltPath.isEmpty()) ::exit(0); - KdenliveSettings::setMltpath(mltPath.path(KUrl::AddTrailingSlash)); - QStringList profilesList = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files); - } - } - - if (KdenliveSettings::rendererpath().isEmpty()) { - // Cannot find the MLT melt renderer, ask for location - KUrlRequesterDialog *getUrl = new KUrlRequesterDialog(QString(), i18n("Cannot find the melt program required for rendering (part of Mlt)"), this); - if (getUrl->exec() == QDialog::Rejected) { - ::exit(0); - } - KUrl rendererPath = getUrl->selectedUrl(); - delete getUrl; - if (rendererPath.isEmpty()) ::exit(0); - KdenliveSettings::setRendererpath(rendererPath.path()); - } - - kDebug() << "RESULTING MLT PATH: " << KdenliveSettings::mltpath(); - - // Parse MLT profiles to build a list of available video formats - if (profilesList.isEmpty()) parseProfiles(); -} - - -void MainWindow::slotEditProfiles() -{ - ProfilesDialog *w = new ProfilesDialog; - if (w->exec() == QDialog::Accepted) { - KdenliveSettingsDialog* d = static_cast (KConfigDialog::exists("settings")); - if (d) d->checkProfile(); - } - delete w; -} - -void MainWindow::slotDetectAudioDriver() -{ - /* WARNING: do not use this method because sometimes detects wrong driver (pulse instead of alsa), - leading to no audio output, see bug #934 */ - - //decide which audio driver is really best, in some cases SDL is wrong - if (KdenliveSettings::audiodrivername().isEmpty()) { - QString driver; - KProcess readProcess; - //PulseAudio needs to be selected if it exists, the ALSA pulse pcm device is not fast enough. - if (!KStandardDirs::findExe("pactl").isEmpty()) { - readProcess.setOutputChannelMode(KProcess::OnlyStdoutChannel); - readProcess.setProgram("pactl", QStringList() << "stat"); - readProcess.execute(2000); // Kill it after 2 seconds - - QString result = QString(readProcess.readAllStandardOutput()); - kDebug() << "// / / / / / READING PACTL: "; - kDebug() << result; - if (!result.isEmpty()) { - driver = "pulse"; - kDebug() << "// / / / / PULSEAUDIO DETECTED"; - } - } - //put others here - KdenliveSettings::setAutoaudiodrivername(driver); - } -} - -void MainWindow::slotEditProjectSettings() -{ - QPoint p = m_activeDocument->getTracksCount(); - ProjectSettings *w = new ProjectSettings(m_projectList, m_activeTimeline->projectView()->extractTransitionsLumas(), p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this); - - if (w->exec() == QDialog::Accepted) { - QString profile = w->selectedProfile(); - m_activeDocument->setProjectFolder(w->selectedFolder()); - if (m_renderWidget) m_renderWidget->setDocumentPath(w->selectedFolder().path(KUrl::AddTrailingSlash)); - if (KdenliveSettings::videothumbnails() != w->enableVideoThumbs()) slotSwitchVideoThumbs(); - if (KdenliveSettings::audiothumbnails() != w->enableAudioThumbs()) slotSwitchAudioThumbs(); - if (m_activeDocument->profilePath() != profile) { - // Profile was changed - double dar = m_activeDocument->dar(); - - // Deselect current effect / transition - m_effectStack->slotClipItemSelected(NULL, 0); - m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false); - m_clipMonitor->slotSetXml(NULL); - bool updateFps = m_activeDocument->setProfilePath(profile); - KdenliveSettings::setCurrent_profile(profile); - KdenliveSettings::setProject_fps(m_activeDocument->fps()); - setCaption(m_activeDocument->description(), m_activeDocument->isModified()); - - m_activeDocument->clipManager()->clearUnusedProducers(); - m_monitorManager->resetProfiles(m_activeDocument->timecode()); - - m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList()); - m_effectStack->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode()); - if (m_renderWidget) m_renderWidget->setProfile(m_activeDocument->mltProfile()); - m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description()); - //m_activeDocument->clipManager()->resetProducersList(m_projectMonitor->render->producersList()); - if (dar != m_activeDocument->dar()) m_projectList->reloadClipThumbnails(); - if (updateFps) m_activeTimeline->updateProjectFps(); - m_activeDocument->setModified(true); - m_commandStack->activeStack()->clear(); - // We need to desactivate & reactivate monitors to get a refresh - //m_monitorManager->switchMonitors(); - } - } - delete w; -} - - -void MainWindow::slotRenderProject() -{ - if (!m_renderWidget) { - QString projectfolder = m_activeDocument ? m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash) : KdenliveSettings::defaultprojectfolder(); - m_renderWidget = new RenderWidget(projectfolder, this); - connect(m_renderWidget, SIGNAL(shutdown()), this, SLOT(slotShutdown())); - connect(m_renderWidget, SIGNAL(selectedRenderProfile(const QString &, const QString &, const QString &, const QString&)), this, SLOT(slotSetDocumentRenderProfile(const QString &, const QString &, const QString &, const QString&))); - connect(m_renderWidget, SIGNAL(prepareRenderingData(bool, bool, const QString&)), this, SLOT(slotPrepareRendering(bool, bool, const QString&))); - connect(m_renderWidget, SIGNAL(abortProcess(const QString &)), this, SIGNAL(abortRenderJob(const QString &))); - connect(m_renderWidget, SIGNAL(openDvdWizard(const QString &, const QString &)), this, SLOT(slotDvdWizard(const QString &, const QString &))); - if (m_activeDocument) { - m_renderWidget->setProfile(m_activeDocument->mltProfile()); - m_renderWidget->setGuides(m_activeDocument->guidesXml(), m_activeDocument->projectDuration()); - m_renderWidget->setDocumentPath(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash)); - m_renderWidget->setRenderProfile(m_activeDocument->getDocumentProperty("renderdestination"), m_activeDocument->getDocumentProperty("rendercategory"), m_activeDocument->getDocumentProperty("renderprofile"), m_activeDocument->getDocumentProperty("renderurl")); - } - } - /*TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget(); - if (currentTab) m_renderWidget->setTimeline(currentTab); - m_renderWidget->setDocument(m_activeDocument);*/ - m_renderWidget->show(); - m_renderWidget->showNormal(); -} - -void MainWindow::setRenderingProgress(const QString &url, int progress) -{ - if (m_renderWidget) m_renderWidget->setRenderJob(url, progress); -} - -void MainWindow::setRenderingFinished(const QString &url, int status, const QString &error) -{ - if (m_renderWidget) m_renderWidget->setRenderStatus(url, status, error); -} - -void MainWindow::slotCleanProject() -{ - if (KMessageBox::warningContinueCancel(this, i18n("This will remove all unused clips from your project."), i18n("Clean up project")) == KMessageBox::Cancel) return; - m_projectList->cleanup(); -} - -void MainWindow::slotUpdateMousePosition(int pos) -{ - if (m_activeDocument) - switch (m_timecodeFormat->currentIndex()) { - case 0: - statusBar()->changeItem(m_activeDocument->timecode().getTimecodeFromFrames(pos), ID_TIMELINE_POS); - break; - default: - statusBar()->changeItem(QString::number(pos), ID_TIMELINE_POS); - } -} - -void MainWindow::slotUpdateDocumentState(bool modified) -{ - if (!m_activeDocument) return; - setCaption(m_activeDocument->description(), modified); - m_saveAction->setEnabled(modified); - if (modified) { - m_timelineArea->setTabTextColor(m_timelineArea->currentIndex(), palette().color(QPalette::Link)); - m_timelineArea->setTabIcon(m_timelineArea->currentIndex(), KIcon("document-save")); - } else { - m_timelineArea->setTabTextColor(m_timelineArea->currentIndex(), palette().color(QPalette::Text)); - m_timelineArea->setTabIcon(m_timelineArea->currentIndex(), KIcon("kdenlive")); - } -} - -void MainWindow::connectDocumentInfo(KdenliveDoc *doc) -{ - if (m_activeDocument) { - if (m_activeDocument == doc) return; - disconnect(m_activeDocument, SIGNAL(progressInfo(const QString &, int)), this, SLOT(slotGotProgressInfo(const QString &, int))); - } - connect(doc, SIGNAL(progressInfo(const QString &, int)), this, SLOT(slotGotProgressInfo(const QString &, int))); -} - -void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //changed -{ - //m_projectMonitor->stop(); - m_closeAction->setEnabled(m_timelineArea->count() > 1); - kDebug() << "/////////////////// CONNECTING DOC TO PROJECT VIEW ////////////////"; - if (m_activeDocument) { - if (m_activeDocument == doc) return; - if (m_activeTimeline) { - disconnect(m_projectMonitor, SIGNAL(renderPosition(int)), m_activeTimeline, SLOT(moveCursorPos(int))); - disconnect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), m_activeTimeline, SLOT(slotSetZone(QPoint))); - disconnect(m_projectMonitor, SIGNAL(durationChanged(int)), m_activeTimeline, SLOT(setDuration(int))); - disconnect(m_projectList, SIGNAL(projectModified()), m_activeDocument, SLOT(setModified())); - disconnect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers()), m_activeDocument, SLOT(checkProjectClips())); - - disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated())); - disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool))); - disconnect(m_activeDocument, SIGNAL(resetProjectList()), m_projectList, SLOT(slotResetProjectList())); - disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &))); - disconnect(m_activeDocument, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &))); - disconnect(m_activeDocument, SIGNAL(selectLastAddedClip(const QString &)), m_projectList, SLOT(slotSelectClip(const QString &))); - disconnect(m_activeDocument, SIGNAL(deleteTimelineClip(const QString &)), m_activeTimeline, SLOT(slotDeleteClip(const QString &))); - disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int))); - disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView())); - disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, int, QPoint, bool))); - disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *))); - disconnect(m_activeTimeline->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay())); - disconnect(m_zoomSlider, SIGNAL(valueChanged(int)), m_activeTimeline, SLOT(slotChangeZoom(int))); - disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType))); - disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int))); - disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor())); - disconnect(m_activeTimeline, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int))); - disconnect(m_activeTimeline, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int))); - disconnect(m_activeTimeline, SIGNAL(changeTrack(int)), this, SLOT(slotChangeTrack(int))); - disconnect(m_activeDocument, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool))); - disconnect(m_effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement, QDomElement, int)), m_activeTimeline->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement, QDomElement, int))); - disconnect(m_effectStack, SIGNAL(removeEffect(ClipItem*, QDomElement)), m_activeTimeline->projectView(), SLOT(slotDeleteEffect(ClipItem*, QDomElement))); - disconnect(m_effectStack, SIGNAL(changeEffectState(ClipItem*, int, bool)), m_activeTimeline->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, bool))); - disconnect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), m_activeTimeline->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int))); - disconnect(m_effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*))); - disconnect(m_effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects())); - disconnect(m_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), m_activeTimeline->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement))); - disconnect(m_transitionConfig, SIGNAL(seekTimeline(int)), m_activeTimeline->projectView() , SLOT(setCursorPos(int))); - disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor())); - disconnect(m_activeTimeline, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int))); - disconnect(m_projectList, SIGNAL(loadingIsOver()), m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs())); - disconnect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int))); - disconnect(m_projectList, SIGNAL(clipNeedsReload(const QString&, bool)), m_activeTimeline->projectView(), SLOT(slotUpdateClip(const QString &, bool))); - m_effectStack->clear(); - } - //m_activeDocument->setRenderer(NULL); - disconnect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *))); - disconnect(m_projectList, SIGNAL(refreshClip()), m_clipMonitor, SLOT(refreshMonitor())); - m_clipMonitor->stop(); - } - KdenliveSettings::setCurrent_profile(doc->profilePath()); - KdenliveSettings::setProject_fps(doc->fps()); - m_monitorManager->resetProfiles(doc->timecode()); - m_projectList->setDocument(doc); - m_transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode(), doc->tracksList()); - m_effectStack->updateProjectFormat(doc->mltProfile(), doc->timecode()); - connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint))); - connect(m_projectList, SIGNAL(refreshClip()), m_clipMonitor, SLOT(refreshMonitor())); - connect(m_projectList, SIGNAL(clipNeedsReload(const QString&, bool)), trackView->projectView(), SLOT(slotUpdateClip(const QString &, bool))); - - connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified())); - connect(m_projectList, SIGNAL(clipNameChanged(const QString, const QString)), trackView->projectView(), SLOT(clipNameChanged(const QString, const QString))); - - - connect(trackView, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor())); - connect(trackView, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int))); - connect(trackView, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int))); - connect(trackView, SIGNAL(changeTrack(int)), this, SLOT(slotChangeTrack(int))); - connect(trackView, SIGNAL(updateTracksInfo()), this, SLOT(slotUpdateTrackInfo())); - connect(trackView, SIGNAL(mousePosition(int)), this, SLOT(slotUpdateMousePosition(int))); - connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int))); - connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint))); - connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), m_projectList, SLOT(slotUpdateClipCut(QPoint))); - connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int))); - connect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers()), doc, SLOT(checkProjectClips())); - - connect(doc, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool))); - connect(doc, SIGNAL(resetProjectList()), m_projectList, SLOT(slotResetProjectList())); - connect(doc, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &))); - connect(doc, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &))); - connect(doc, SIGNAL(selectLastAddedClip(const QString &)), m_projectList, SLOT(slotSelectClip(const QString &))); - - connect(doc, SIGNAL(deleteTimelineClip(const QString &)), trackView, SLOT(slotDeleteClip(const QString &))); - connect(doc, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool))); - connect(doc, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated())); - - - connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int))); - connect(trackView->projectView(), SIGNAL(updateClipMarkers(DocClipBase *)), this, SLOT(slotUpdateClipMarkers(DocClipBase*))); - - connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView())); - connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, int, QPoint, bool))); - connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *))); - m_zoomSlider->setValue(doc->zoom().x()); - connect(m_zoomSlider, SIGNAL(valueChanged(int)), trackView, SLOT(slotChangeZoom(int))); - connect(trackView->projectView(), SIGNAL(zoomIn()), this, SLOT(slotZoomIn())); - connect(trackView->projectView(), SIGNAL(zoomOut()), this, SLOT(slotZoomOut())); - connect(trackView, SIGNAL(setZoom(int)), this, SLOT(slotSetZoom(int))); - connect(trackView->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType))); - - connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int))); - connect(trackView->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay())); - - - connect(m_effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement, QDomElement, int))); - connect(m_effectStack, SIGNAL(removeEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotDeleteEffect(ClipItem*, QDomElement))); - connect(m_effectStack, SIGNAL(changeEffectState(ClipItem*, int, bool)), trackView->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, bool))); - connect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int))); - connect(m_effectStack, SIGNAL(refreshEffectStack(ClipItem*)), trackView->projectView(), SLOT(slotRefreshEffects(ClipItem*))); - connect(m_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement))); - connect(m_transitionConfig, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(setCursorPos(int))); - connect(m_effectStack, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(setCursorPos(int))); - connect(m_effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects())); - - connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor())); - connect(trackView, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int))); - connect(m_projectList, SIGNAL(loadingIsOver()), trackView->projectView(), SLOT(slotUpdateAllThumbs())); - connect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int))); - - - trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu, m_clipTypeGroup, (QMenu*)(factory()->container("marker_menu", this))); - m_activeTimeline = trackView; - if (m_renderWidget) { - m_renderWidget->setProfile(doc->mltProfile()); - m_renderWidget->setGuides(doc->guidesXml(), doc->projectDuration()); - m_renderWidget->setDocumentPath(doc->projectFolder().path(KUrl::AddTrailingSlash)); - m_renderWidget->setRenderProfile(doc->getDocumentProperty("renderdestination"), doc->getDocumentProperty("rendercategory"), doc->getDocumentProperty("renderprofile"), doc->getDocumentProperty("renderurl")); - } - //doc->setRenderer(m_projectMonitor->render); - m_commandStack->setActiveStack(doc->commandStack()); - KdenliveSettings::setProject_display_ratio(doc->dar()); - //doc->clipManager()->checkAudioThumbs(); - - //m_overView->setScene(trackView->projectScene()); - //m_overView->scale(m_overView->width() / trackView->duration(), m_overView->height() / (50 * trackView->tracksNumber())); - //m_overView->fitInView(m_overView->itemAt(0, 50), Qt::KeepAspectRatio); - - setCaption(doc->description(), doc->isModified()); - m_saveAction->setEnabled(doc->isModified()); - m_normalEditTool->setChecked(true); - m_activeDocument = doc; - m_activeTimeline->updateProjectFps(); - m_activeDocument->checkProjectClips(); - if (KdenliveSettings::dropbframes()) slotUpdatePreviewSettings(); - - // set tool to select tool - m_buttonSelectTool->setChecked(true); -} - -void MainWindow::slotZoneMoved(int start, int end) -{ - m_activeDocument->setZone(start, end); - m_projectMonitor->slotZoneMoved(start, end); -} - -void MainWindow::slotGuidesUpdated() -{ - if (m_renderWidget) m_renderWidget->setGuides(m_activeDocument->guidesXml(), m_activeDocument->projectDuration()); -} - -void MainWindow::slotPreferences(int page, int option) -{ - //An instance of your dialog could be already created and could be - // cached, in which case you want to display the cached dialog - // instead of creating another one - if (KConfigDialog::showDialog("settings")) { - KdenliveSettingsDialog* d = static_cast (KConfigDialog::exists("settings")); - if (page != -1) d->showPage(page, option); - return; - } - - // KConfigDialog didn't find an instance of this dialog, so lets - // create it : - KdenliveSettingsDialog* dialog = new KdenliveSettingsDialog(this); - connect(dialog, SIGNAL(settingsChanged(const QString&)), this, SLOT(updateConfiguration())); - //connect(dialog, SIGNAL(doResetProfile()), this, SLOT(slotDetectAudioDriver())); - connect(dialog, SIGNAL(doResetProfile()), m_monitorManager, SLOT(slotResetProfiles())); - connect(dialog, SIGNAL(updatePreviewSettings()), this, SLOT(slotUpdatePreviewSettings())); -#ifndef Q_WS_MAC - connect(dialog, SIGNAL(updateCaptureFolder()), m_recMonitor, SLOT(slotUpdateCaptureFolder())); -#endif - //connect(dialog, SIGNAL(updatePreviewSettings()), this, SLOT(slotUpdatePreviewSettings())); - dialog->show(); - if (page != -1) dialog->showPage(page, option); -} - -void MainWindow::slotUpdatePreviewSettings() -{ - if (m_activeDocument) { - m_clipMonitor->slotSetXml(NULL); - m_activeDocument->updatePreviewSettings(); - } -} - -void MainWindow::updateConfiguration() -{ - //TODO: we should apply settings to all projects, not only the current one - if (m_activeTimeline) { - m_activeTimeline->refresh(); - m_activeTimeline->projectView()->checkAutoScroll(); - m_activeTimeline->projectView()->checkTrackHeight(); - if (m_activeDocument) m_activeDocument->clipManager()->checkAudioThumbs(); - } - m_buttonAudioThumbs->setChecked(KdenliveSettings::audiothumbnails()); - m_buttonVideoThumbs->setChecked(KdenliveSettings::videothumbnails()); - - // Update list of transcoding profiles - loadTranscoders(); -#ifndef NO_JOGSHUTTLE - activateShuttleDevice(); -#endif /* NO_JOGSHUTTLE */ - -} - - -void MainWindow::slotSwitchVideoThumbs() -{ - KdenliveSettings::setVideothumbnails(!KdenliveSettings::videothumbnails()); - if (m_activeTimeline) { - m_activeTimeline->projectView()->slotUpdateAllThumbs(); - } - m_buttonVideoThumbs->setChecked(KdenliveSettings::videothumbnails()); -} - -void MainWindow::slotSwitchAudioThumbs() -{ - KdenliveSettings::setAudiothumbnails(!KdenliveSettings::audiothumbnails()); - if (m_activeTimeline) { - m_activeTimeline->refresh(); - m_activeTimeline->projectView()->checkAutoScroll(); - if (m_activeDocument) m_activeDocument->clipManager()->checkAudioThumbs(); - } - m_buttonAudioThumbs->setChecked(KdenliveSettings::audiothumbnails()); -} - -void MainWindow::slotSwitchMarkersComments() -{ - KdenliveSettings::setShowmarkers(!KdenliveSettings::showmarkers()); - if (m_activeTimeline) { - m_activeTimeline->refresh(); - } - m_buttonShowMarkers->setChecked(KdenliveSettings::showmarkers()); -} - -void MainWindow::slotSwitchSnap() -{ - KdenliveSettings::setSnaptopoints(!KdenliveSettings::snaptopoints()); - m_buttonSnap->setChecked(KdenliveSettings::snaptopoints()); -} - - -void MainWindow::slotDeleteTimelineClip() -{ - if (QApplication::focusWidget() && QApplication::focusWidget()->parentWidget() && QApplication::focusWidget()->parentWidget()->parentWidget() && QApplication::focusWidget()->parentWidget()->parentWidget() == m_projectListDock) m_projectList->slotRemoveClip(); - else if (m_activeTimeline) { - m_activeTimeline->projectView()->deleteSelectedClips(); - } -} - -void MainWindow::slotUpdateClipMarkers(DocClipBase *clip) -{ - if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); - m_clipMonitor->updateMarkers(clip); -} - -void MainWindow::slotAddClipMarker() -{ - DocClipBase *clip = NULL; - GenTime pos; - if (m_projectMonitor->isActive()) { - if (m_activeTimeline) { - ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor(); - if (item) { - pos = GenTime((int)((m_projectMonitor->position() - item->startPos() + item->cropStart()).frames(m_activeDocument->fps()) * item->speed() + 0.5), m_activeDocument->fps()); - clip = item->baseClip(); - } - } - } else { - clip = m_clipMonitor->activeClip(); - pos = m_clipMonitor->position(); - } - if (!clip) { - m_messageLabel->setMessage(i18n("Cannot find clip to add marker"), ErrorMessage); - return; - } - QString id = clip->getId(); - CommentedTime marker(pos, i18n("Marker")); - MarkerDialog d(clip, marker, m_activeDocument->timecode(), i18n("Add Marker"), this); - if (d.exec() == QDialog::Accepted) { - m_activeTimeline->projectView()->slotAddClipMarker(id, d.newMarker().time(), d.newMarker().comment()); - } -} - -void MainWindow::slotDeleteClipMarker() -{ - DocClipBase *clip = NULL; - GenTime pos; - if (m_projectMonitor->isActive()) { - if (m_activeTimeline) { - ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor(); - if (item) { - pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed(); - clip = item->baseClip(); - } - } - } else { - clip = m_clipMonitor->activeClip(); - pos = m_clipMonitor->position(); - } - if (!clip) { - m_messageLabel->setMessage(i18n("Cannot find clip to remove marker"), ErrorMessage); - return; - } - - QString id = clip->getId(); - QString comment = clip->markerComment(pos); - if (comment.isEmpty()) { - m_messageLabel->setMessage(i18n("No marker found at cursor time"), ErrorMessage); - return; - } - m_activeTimeline->projectView()->slotDeleteClipMarker(comment, id, pos); -} - -void MainWindow::slotDeleteAllClipMarkers() -{ - DocClipBase *clip = NULL; - if (m_projectMonitor->isActive()) { - if (m_activeTimeline) { - ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor(); - if (item) { - clip = item->baseClip(); - } - } - } else { - clip = m_clipMonitor->activeClip(); - } - if (!clip) { - m_messageLabel->setMessage(i18n("Cannot find clip to remove marker"), ErrorMessage); - return; - } - m_activeTimeline->projectView()->slotDeleteAllClipMarkers(clip->getId()); -} - -void MainWindow::slotEditClipMarker() -{ - DocClipBase *clip = NULL; - GenTime pos; - if (m_projectMonitor->isActive()) { - if (m_activeTimeline) { - ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor(); - if (item) { - pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed(); - clip = item->baseClip(); - } - } - } else { - clip = m_clipMonitor->activeClip(); - pos = m_clipMonitor->position(); - } - if (!clip) { - m_messageLabel->setMessage(i18n("Cannot find clip to remove marker"), ErrorMessage); - return; - } - - QString id = clip->getId(); - QString oldcomment = clip->markerComment(pos); - if (oldcomment.isEmpty()) { - m_messageLabel->setMessage(i18n("No marker found at cursor time"), ErrorMessage); - return; - } - - CommentedTime marker(pos, oldcomment); - MarkerDialog d(clip, marker, m_activeDocument->timecode(), i18n("Edit Marker"), this); - if (d.exec() == QDialog::Accepted) { - m_activeTimeline->projectView()->slotAddClipMarker(id, d.newMarker().time(), d.newMarker().comment()); - if (d.newMarker().time() != pos) { - // remove old marker - m_activeTimeline->projectView()->slotAddClipMarker(id, pos, QString()); - } - } -} - -void MainWindow::slotAddGuide() -{ - if (m_activeTimeline) - m_activeTimeline->projectView()->slotAddGuide(); -} - -void MainWindow::slotInsertSpace() -{ - if (m_activeTimeline) - m_activeTimeline->projectView()->slotInsertSpace(); -} - -void MainWindow::slotRemoveSpace() -{ - if (m_activeTimeline) - m_activeTimeline->projectView()->slotRemoveSpace(); -} - -void MainWindow::slotInsertTrack(int ix) -{ - m_projectMonitor->activateMonitor(); - if (m_activeTimeline) - m_activeTimeline->projectView()->slotInsertTrack(ix); -} - -void MainWindow::slotDeleteTrack(int ix) -{ - m_projectMonitor->activateMonitor(); - if (m_activeTimeline) - m_activeTimeline->projectView()->slotDeleteTrack(ix); -} - -void MainWindow::slotChangeTrack(int ix) -{ - m_projectMonitor->activateMonitor(); - if (m_activeTimeline) - m_activeTimeline->projectView()->slotChangeTrack(ix); -} - -void MainWindow::slotEditGuide() -{ - if (m_activeTimeline) - m_activeTimeline->projectView()->slotEditGuide(); -} - -void MainWindow::slotDeleteGuide() -{ - if (m_activeTimeline) - m_activeTimeline->projectView()->slotDeleteGuide(); -} - -void MainWindow::slotDeleteAllGuides() -{ - if (m_activeTimeline) - m_activeTimeline->projectView()->slotDeleteAllGuides(); -} - -void MainWindow::slotCutTimelineClip() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->cutSelectedClips(); - } -} - -void MainWindow::slotInsertClipOverwrite() -{ - if (m_activeTimeline) { - QStringList data = m_clipMonitor->getZoneInfo(); - m_activeTimeline->projectView()->insertZoneOverwrite(data, m_activeTimeline->inPoint()); - } -} - -void MainWindow::slotSelectTimelineClip() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->selectClip(true); - } -} - -void MainWindow::slotSelectTimelineTransition() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->selectTransition(true); - } -} - -void MainWindow::slotDeselectTimelineClip() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->selectClip(false, true); - } -} - -void MainWindow::slotDeselectTimelineTransition() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->selectTransition(false, true); - } -} - -void MainWindow::slotSelectAddTimelineClip() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->selectClip(true, true); - } -} - -void MainWindow::slotSelectAddTimelineTransition() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->selectTransition(true, true); - } -} - -void MainWindow::slotGroupClips() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->groupClips(); - } -} - -void MainWindow::slotUnGroupClips() -{ - if (m_activeTimeline) { - m_activeTimeline->projectView()->groupClips(false); - } -} - -void MainWindow::slotAddProjectClip(KUrl url) -{ - if (m_activeDocument) - m_activeDocument->slotAddClipFile(url, QString()); -} - -void MainWindow::slotAddTransition(QAction *result) -{ - if (!result) return; - QStringList info = result->data().toStringList(); - if (info.isEmpty()) return; - QDomElement transition = transitions.getEffectByTag(info.at(1), info.at(2)); - if (m_activeTimeline && !transition.isNull()) { - m_activeTimeline->projectView()->slotAddTransitionToSelectedClips(transition.cloneNode().toElement()); - } -} - -void MainWindow::slotAddVideoEffect(QAction *result) -{ - if (!result) return; - QStringList info = result->data().toStringList(); - if (info.isEmpty()) return; - QDomElement effect = videoEffects.getEffectByTag(info.at(1), info.at(2)); - slotAddEffect(effect); -} - -void MainWindow::slotAddAudioEffect(QAction *result) -{ - if (!result) return; - QStringList info = result->data().toStringList(); - if (info.isEmpty()) return; - QDomElement effect = audioEffects.getEffectByTag(info.at(1), info.at(2)); - slotAddEffect(effect); -} - -void MainWindow::slotAddCustomEffect(QAction *result) -{ - if (!result) return; - QStringList info = result->data().toStringList(); - if (info.isEmpty()) return; - QDomElement effect = customEffects.getEffectByTag(info.at(1), info.at(2)); - slotAddEffect(effect); -} - -void MainWindow::slotZoomIn() -{ - m_zoomSlider->setValue(m_zoomSlider->value() - 1); -} - -void MainWindow::slotZoomOut() -{ - m_zoomSlider->setValue(m_zoomSlider->value() + 1); -} - -void MainWindow::slotFitZoom() -{ - if (m_activeTimeline) { - m_zoomSlider->setValue(m_activeTimeline->fitZoom()); - } -} - -void MainWindow::slotSetZoom(int value) -{ - m_zoomSlider->setValue(value); -} - -void MainWindow::slotGotProgressInfo(const QString &message, int progress) -{ - m_statusProgressBar->setValue(progress); - if (progress >= 0) { - if (!message.isEmpty()) m_messageLabel->setMessage(message, InformationMessage);//statusLabel->setText(message); - m_statusProgressBar->setVisible(true); - } else { - m_messageLabel->setMessage(QString(), DefaultMessage); - m_statusProgressBar->setVisible(false); - } -} - -void MainWindow::slotShowClipProperties(DocClipBase *clip) -{ - if (clip->clipType() == TEXT) { - QString titlepath = m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash) + "titles/"; - if (!clip->getProperty("resource").isEmpty() && clip->getProperty("xmldata").isEmpty()) { - // template text clip - - // Get the list of existing templates - QStringList filter; - filter << "*.kdenlivetitle"; - QStringList templateFiles = QDir(titlepath).entryList(filter, QDir::Files); - - QDialog *dia = new QDialog(this); - Ui::TemplateClip_UI dia_ui; - dia_ui.setupUi(dia); - int ix = -1; - const QString templatePath = clip->getProperty("resource"); - for (int i = 0; i < templateFiles.size(); ++i) { - dia_ui.template_list->comboBox()->addItem(templateFiles.at(i), titlepath + templateFiles.at(i)); - if (templatePath == KUrl(titlepath + templateFiles.at(i)).path()) ix = i; - } - if (ix != -1) dia_ui.template_list->comboBox()->setCurrentIndex(ix); - else dia_ui.template_list->comboBox()->insertItem(0, templatePath); - dia_ui.template_list->fileDialog()->setFilter("*.kdenlivetitle"); - //warning: setting base directory doesn't work?? - KUrl startDir(titlepath); - dia_ui.template_list->fileDialog()->setUrl(startDir); - dia_ui.description->setText(clip->getProperty("description")); - if (dia->exec() == QDialog::Accepted) { - QString textTemplate = dia_ui.template_list->comboBox()->itemData(dia_ui.template_list->comboBox()->currentIndex()).toString(); - if (textTemplate.isEmpty()) textTemplate = dia_ui.template_list->comboBox()->currentText(); - - QMap newprops; - - if (KUrl(textTemplate).path() != templatePath) { - // The template was changed - newprops.insert("resource", textTemplate); - } - - if (dia_ui.description->toPlainText() != clip->getProperty("description")) { - newprops.insert("description", dia_ui.description->toPlainText()); - } - - QString newtemplate = newprops.value("xmltemplate"); - if (newtemplate.isEmpty()) newtemplate = templatePath; - - // template modified we need to update xmldata - QString description = newprops.value("description"); - if (description.isEmpty()) description = clip->getProperty("description"); - else newprops.insert("templatetext", description); - //newprops.insert("xmldata", m_projectList->generateTemplateXml(newtemplate, description).toString()); - if (!newprops.isEmpty()) { - EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); - m_activeDocument->commandStack()->push(command); - } - } - delete dia; - return; - } - QString path = clip->getProperty("resource"); - TitleWidget *dia_ui = new TitleWidget(KUrl(), m_activeDocument->timecode(), titlepath, m_projectMonitor->render, this); - QDomDocument doc; - doc.setContent(clip->getProperty("xmldata")); - dia_ui->setXml(doc); - if (dia_ui->exec() == QDialog::Accepted) { - QMap newprops; - newprops.insert("xmldata", dia_ui->xml().toString()); - if (dia_ui->duration() != clip->duration().frames(m_activeDocument->fps()) - 1) { - // duration changed, we need to update duration - newprops.insert("out", QString::number(dia_ui->duration())); - } - EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); - m_activeDocument->commandStack()->push(command); - m_activeTimeline->projectView()->slotUpdateClip(clip->getId()); - m_activeDocument->setModified(true); - } - delete dia_ui; - - //m_activeDocument->editTextClip(clip->getProperty("xml"), clip->getId()); - return; - } - ClipProperties dia(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this); - connect(&dia, SIGNAL(addMarker(const QString &, GenTime, QString)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, GenTime, QString))); - if (dia.exec() == QDialog::Accepted) { - QMap newprops = dia.properties(); - if (newprops.isEmpty()) return; - EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); - m_activeDocument->commandStack()->push(command); - - if (dia.needsTimelineRefresh()) { - // update clip occurences in timeline - m_activeTimeline->projectView()->slotUpdateClip(clip->getId(), dia.needsTimelineReload()); - } - } -} - - -void MainWindow::slotShowClipProperties(QList cliplist, QMap commonproperties) -{ - ClipProperties dia(cliplist, m_activeDocument->timecode(), commonproperties, this); - if (dia.exec() == QDialog::Accepted) { - QUndoCommand *command = new QUndoCommand(); - command->setText(i18n("Edit clips")); - for (int i = 0; i < cliplist.count(); i++) { - DocClipBase *clip = cliplist.at(i); - new EditClipCommand(m_projectList, clip->getId(), clip->properties(), dia.properties(), true, command); - } - m_activeDocument->commandStack()->push(command); - for (int i = 0; i < cliplist.count(); i++) { - m_activeTimeline->projectView()->slotUpdateClip(cliplist.at(i)->getId(), dia.needsTimelineReload()); - } - } -} - -void MainWindow::customEvent(QEvent* e) -{ - if (e->type() == QEvent::User) { - m_messageLabel->setMessage(static_cast (e)->message(), MltError); - } -} -void MainWindow::slotActivateEffectStackView() -{ - m_effectStack->raiseWindow(m_effectStackDock); -} - -void MainWindow::slotActivateTransitionView(Transition *t) -{ - if (t) m_transitionConfig->raiseWindow(m_transitionConfigDock); -} - -void MainWindow::slotSnapRewind() -{ - if (m_projectMonitor->isActive()) { - if (m_activeTimeline) - m_activeTimeline->projectView()->slotSeekToPreviousSnap(); - } else m_clipMonitor->slotSeekToPreviousSnap(); -} - -void MainWindow::slotSnapForward() -{ - if (m_projectMonitor->isActive()) { - if (m_activeTimeline) - m_activeTimeline->projectView()->slotSeekToNextSnap(); - } else m_clipMonitor->slotSeekToNextSnap(); -} - -void MainWindow::slotClipStart() -{ - if (m_projectMonitor->isActive()) { - if (m_activeTimeline) - m_activeTimeline->projectView()->clipStart(); - } -} - -void MainWindow::slotClipEnd() -{ - if (m_projectMonitor->isActive()) { - if (m_activeTimeline) - m_activeTimeline->projectView()->clipEnd(); - } -} - -void MainWindow::slotZoneStart() -{ - if (m_projectMonitor->isActive()) m_projectMonitor->slotZoneStart(); - else m_clipMonitor->slotZoneStart(); -} - -void MainWindow::slotZoneEnd() -{ - if (m_projectMonitor->isActive()) m_projectMonitor->slotZoneEnd(); - else m_clipMonitor->slotZoneEnd(); -} - -void MainWindow::slotChangeTool(QAction * action) -{ - if (action == m_buttonSelectTool) slotSetTool(SELECTTOOL); - else if (action == m_buttonRazorTool) slotSetTool(RAZORTOOL); - else if (action == m_buttonSpacerTool) slotSetTool(SPACERTOOL); -} - -void MainWindow::slotChangeEdit(QAction * action) -{ - if (!m_activeTimeline) return; - if (action == m_overwriteEditTool) m_activeTimeline->projectView()->setEditMode(OVERWRITEEDIT); - else if (action == m_insertEditTool) m_activeTimeline->projectView()->setEditMode(INSERTEDIT); - else m_activeTimeline->projectView()->setEditMode(NORMALEDIT); -} - -void MainWindow::slotSetTool(PROJECTTOOL tool) -{ - if (m_activeDocument && m_activeTimeline) { - //m_activeDocument->setTool(tool); - QString message; - switch (tool) { - case SPACERTOOL: - message = i18n("Ctrl + click to use spacer on current track only"); - break; - case RAZORTOOL: - message = i18n("Click on a clip to cut it"); - break; - default: - message = i18n("Shift + click to create a selection rectangle, Ctrl + click to add an item to selection"); - break; - } - m_messageLabel->setMessage(message, InformationMessage); - m_activeTimeline->projectView()->setTool(tool); - } -} - -void MainWindow::slotCopy() -{ - if (!m_activeDocument || !m_activeTimeline) return; - m_activeTimeline->projectView()->copyClip(); -} - -void MainWindow::slotPaste() -{ - if (!m_activeDocument || !m_activeTimeline) return; - m_activeTimeline->projectView()->pasteClip(); -} - -void MainWindow::slotPasteEffects() -{ - if (!m_activeDocument || !m_activeTimeline) return; - m_activeTimeline->projectView()->pasteClipEffects(); -} - -void MainWindow::slotFind() -{ - if (!m_activeDocument || !m_activeTimeline) return; - m_projectSearch->setEnabled(false); - m_findActivated = true; - m_findString.clear(); - m_activeTimeline->projectView()->initSearchStrings(); - statusBar()->showMessage(i18n("Starting -- find text as you type")); - m_findTimer.start(5000); - qApp->installEventFilter(this); -} - -void MainWindow::slotFindNext() -{ - if (m_activeTimeline && m_activeTimeline->projectView()->findNextString(m_findString)) { - statusBar()->showMessage(i18n("Found: %1", m_findString)); - } else { - statusBar()->showMessage(i18n("Reached end of project")); - } - m_findTimer.start(4000); -} - -void MainWindow::findAhead() -{ - if (m_activeTimeline && m_activeTimeline->projectView()->findString(m_findString)) { - m_projectSearchNext->setEnabled(true); - statusBar()->showMessage(i18n("Found: %1", m_findString)); - } else { - m_projectSearchNext->setEnabled(false); - statusBar()->showMessage(i18n("Not found: %1", m_findString)); - } -} - -void MainWindow::findTimeout() -{ - m_projectSearchNext->setEnabled(false); - m_findActivated = false; - m_findString.clear(); - statusBar()->showMessage(i18n("Find stopped"), 3000); - if (m_activeTimeline) m_activeTimeline->projectView()->clearSearchStrings(); - m_projectSearch->setEnabled(true); - removeEventFilter(this); -} - -void MainWindow::keyPressEvent(QKeyEvent *ke) -{ - if (m_findActivated) { - if (ke->key() == Qt::Key_Backspace) { - m_findString = m_findString.left(m_findString.length() - 1); - - if (!m_findString.isEmpty()) { - findAhead(); - } else { - findTimeout(); - } - - m_findTimer.start(4000); - ke->accept(); - return; - } else if (ke->key() == Qt::Key_Escape) { - findTimeout(); - ke->accept(); - return; - } else if (ke->key() == Qt::Key_Space || !ke->text().trimmed().isEmpty()) { - m_findString += ke->text(); - - findAhead(); - - m_findTimer.start(4000); - ke->accept(); - return; - } - } else KXmlGuiWindow::keyPressEvent(ke); -} - - -/** Gets called when the window gets hidden */ -void MainWindow::hideEvent(QHideEvent */*event*/) -{ - // kDebug() << "I was hidden"; - // issue http://www.kdenlive.org/mantis/view.php?id=231 - if (isMinimized()) { - // kDebug() << "I am minimized"; - if (m_monitorManager) m_monitorManager->stopActiveMonitor(); - } -} - -bool MainWindow::eventFilter(QObject *obj, QEvent *event) -{ - if (m_findActivated) { - if (event->type() == QEvent::ShortcutOverride) { - QKeyEvent* ke = (QKeyEvent*) event; - if (ke->text().trimmed().isEmpty()) return false; - ke->accept(); - return true; - } else return false; - } else { - // pass the event on to the parent class - return QMainWindow::eventFilter(obj, event); - } -} - - -void MainWindow::slotSaveZone(Render *render, QPoint zone) -{ - KDialog *dialog = new KDialog(this); - dialog->setCaption("Save clip zone"); - dialog->setButtons(KDialog::Ok | KDialog::Cancel); - - QWidget *widget = new QWidget(dialog); - dialog->setMainWidget(widget); - - QVBoxLayout *vbox = new QVBoxLayout(widget); - QLabel *label1 = new QLabel(i18n("Save clip zone as:"), this); - QString path = m_activeDocument->projectFolder().path(); - path.append("/"); - path.append("untitled.mlt"); - KUrlRequester *url = new KUrlRequester(KUrl(path), this); - url->setFilter("video/mlt-playlist"); - QLabel *label2 = new QLabel(i18n("Description:"), this); - KLineEdit *edit = new KLineEdit(this); - vbox->addWidget(label1); - vbox->addWidget(url); - vbox->addWidget(label2); - vbox->addWidget(edit); - if (dialog->exec() == QDialog::Accepted) render->saveZone(url->url(), edit->text(), zone); - -} - -void MainWindow::slotSetInPoint() -{ - if (m_clipMonitor->isActive()) { - m_clipMonitor->slotSetZoneStart(); - } else m_projectMonitor->slotSetZoneStart(); - //else m_activeTimeline->projectView()->setInPoint(); -} - -void MainWindow::slotSetOutPoint() -{ - if (m_clipMonitor->isActive()) { - m_clipMonitor->slotSetZoneEnd(); - } else m_projectMonitor->slotSetZoneEnd(); - // else m_activeTimeline->projectView()->setOutPoint(); -} - -void MainWindow::slotResizeItemStart() -{ - if (m_activeTimeline) m_activeTimeline->projectView()->setInPoint(); -} - -void MainWindow::slotResizeItemEnd() -{ - if (m_activeTimeline) m_activeTimeline->projectView()->setOutPoint(); -} - -int MainWindow::getNewStuff(const QString &configFile) -{ - KNS3::Entry::List entries; -#if KDE_IS_VERSION(4,3,80) - KNS3::DownloadDialog dialog(configFile); - dialog.exec(); - entries = dialog.changedEntries(); - foreach(const KNS3::Entry &entry, entries) { - if (entry.status() == KNS3::Entry::Installed) - kDebug() << "// Installed files: " << entry.installedFiles(); - } -#else - KNS::Engine engine(0); - if (engine.init(configFile)) - entries = engine.downloadDialogModal(this); - foreach(KNS::Entry *entry, entries) { - if (entry->status() == KNS::Entry::Installed) - kDebug() << "// Installed files: " << entry->installedFiles(); - } -#endif /* KDE_IS_VERSION(4,3,80) */ - return entries.size(); -} - -void MainWindow::slotGetNewLumaStuff() -{ - if (getNewStuff("kdenlive_wipes.knsrc") > 0) { - initEffects::refreshLumas(); - m_activeTimeline->projectView()->reloadTransitionLumas(); - } -} - -void MainWindow::slotGetNewRenderStuff() -{ - if (getNewStuff("kdenlive_renderprofiles.knsrc") > 0) { - if (m_renderWidget) - m_renderWidget->reloadProfiles(); - } -} - -void MainWindow::slotGetNewMltProfileStuff() -{ - if (getNewStuff("kdenlive_projectprofiles.knsrc") > 0) { - // update the list of profiles in settings dialog - KdenliveSettingsDialog* d = static_cast (KConfigDialog::exists("settings")); - if (d) - d->checkProfile(); - } -} - -void MainWindow::slotAutoTransition() -{ - if (m_activeTimeline) m_activeTimeline->projectView()->autoTransition(); -} - -void MainWindow::slotSplitAudio() -{ - if (m_activeTimeline) m_activeTimeline->projectView()->splitAudio(); -} - -void MainWindow::slotUpdateClipType(QAction *action) -{ - if (m_activeTimeline) { - if (action->data().toString() == "clip_audio_only") m_activeTimeline->projectView()->setAudioOnly(); - else if (action->data().toString() == "clip_video_only") m_activeTimeline->projectView()->setVideoOnly(); - else m_activeTimeline->projectView()->setAudioAndVideo(); - } -} - -void MainWindow::slotDvdWizard(const QString &url, const QString &profile) -{ - // We must stop the monitors since we create a new on in the dvd wizard - m_clipMonitor->stop(); - m_projectMonitor->stop(); - DvdWizard w(url, profile, this); - w.exec(); - m_projectMonitor->start(); -} - -void MainWindow::slotShowTimeline(bool show) -{ - if (show == false) { - m_timelineState = saveState(); - centralWidget()->setHidden(true); - } else { - centralWidget()->setHidden(false); - restoreState(m_timelineState); - } -} - -void MainWindow::slotMaximizeCurrent(bool /*show*/) -{ - //TODO: is there a way to maximize current widget? - //if (show == true) - { - m_timelineState = saveState(); - QWidget *par = focusWidget()->parentWidget(); - while (par->parentWidget() && par->parentWidget() != this) { - par = par->parentWidget(); - } - kDebug() << "CURRENT WIDGET: " << par->objectName(); - } - /*else { - //centralWidget()->setHidden(false); - //restoreState(m_timelineState); - }*/ -} - -void MainWindow::loadTranscoders() -{ - QMenu *transMenu = static_cast(factory()->container("transcoders", this)); - transMenu->clear(); - - KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc"); - KConfigGroup transConfig(config, "Transcoding"); - // read the entries - QMap< QString, QString > profiles = transConfig.entryMap(); - QMapIterator i(profiles); - while (i.hasNext()) { - i.next(); - QStringList data = i.value().split(";", QString::SkipEmptyParts); - QAction *a = transMenu->addAction(i.key()); - a->setData(data); - if (data.count() > 1) { - a->setToolTip(data.at(1)); - } - connect(a, SIGNAL(triggered()), this, SLOT(slotTranscode())); - } -} - -void MainWindow::slotTranscode(KUrl::List urls) -{ - QString params; - QString desc; - QString condition; - if (urls.isEmpty()) { - QAction *action = qobject_cast(sender()); - QStringList data = action->data().toStringList(); - params = data.at(0); - if (data.count() > 1) desc = data.at(1); - if (data.count() > 2) condition = data.at(2); - urls << m_projectList->getConditionalUrls(condition); - urls.removeAll(KUrl()); - } - if (urls.isEmpty()) { - m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage); - return; - } - ClipTranscode *d = new ClipTranscode(urls, params, desc); - connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); - d->show(); - //QProcess::startDetached("ffmpeg", parameters); -} - -void MainWindow::slotTranscodeClip() -{ - KUrl::List urls = KFileDialog::getOpenUrls(KUrl("kfiledialog:///projectfolder")); - if (urls.isEmpty()) return; - slotTranscode(urls); -} - -void MainWindow::slotSetDocumentRenderProfile(const QString &dest, const QString &group, const QString &name, const QString &file) -{ - if (m_activeDocument == NULL) return; - m_activeDocument->setDocumentProperty("renderdestination", dest); - m_activeDocument->setDocumentProperty("rendercategory", group); - m_activeDocument->setDocumentProperty("renderprofile", name); - m_activeDocument->setDocumentProperty("renderurl", file); - m_activeDocument->setModified(true); -} - - -void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QString &chapterFile) -{ - if (m_activeDocument == NULL || m_renderWidget == NULL) return; - QString scriptPath; - QString playlistPath; - if (scriptExport) { - bool ok; - QString scriptsFolder = m_activeDocument->projectFolder().path() + "/scripts/"; - QString path = m_renderWidget->getFreeScriptName(); - scriptPath = QInputDialog::getText(this, i18n("Create Render Script"), i18n("Script name (will be saved in: %1)", scriptsFolder), QLineEdit::Normal, KUrl(path).fileName(), &ok); - if (!ok || scriptPath.isEmpty()) return; - scriptPath.prepend(scriptsFolder); - QFile f(scriptPath); - if (f.exists()) { - if (KMessageBox::warningYesNo(this, i18n("Script file already exists. Do you want to overwrite it?")) != KMessageBox::Yes) - return; - } - playlistPath = scriptPath + ".mlt"; - m_projectMonitor->saveSceneList(playlistPath); - } else { - KTemporaryFile temp; - temp.setAutoRemove(false); - temp.setSuffix(".mlt"); - temp.open(); - playlistPath = temp.fileName(); - m_projectMonitor->saveSceneList(playlistPath); - } - - if (!chapterFile.isEmpty()) { - int in = 0; - int out; - if (!zoneOnly) out = (int) GenTime(m_activeDocument->projectDuration()).frames(m_activeDocument->fps()); - else { - in = m_activeTimeline->inPoint(); - out = m_activeTimeline->outPoint(); - } - QDomDocument doc; - QDomElement chapters = doc.createElement("chapters"); - chapters.setAttribute("fps", m_activeDocument->fps()); - doc.appendChild(chapters); - - QDomElement guidesxml = m_activeDocument->guidesXml(); - QDomNodeList nodes = guidesxml.elementsByTagName("guide"); - for (int i = 0; i < nodes.count(); i++) { - QDomElement e = nodes.item(i).toElement(); - if (!e.isNull()) { - QString comment = e.attribute("comment"); - int time = (int) GenTime(e.attribute("time").toDouble()).frames(m_activeDocument->fps()); - if (time >= in && time < out) { - if (zoneOnly) time = time - in; - QDomElement chapter = doc.createElement("chapter"); - chapters.appendChild(chapter); - chapter.setAttribute("title", comment); - chapter.setAttribute("time", time); - } - } - } - if (chapters.childNodes().count() > 0) { - if (m_activeTimeline->projectView()->hasGuide(out, 0) == -1) { - // Always insert a guide in pos 0 - QDomElement chapter = doc.createElement("chapter"); - chapters.insertBefore(chapter, QDomNode()); - chapter.setAttribute("title", i18n("Start")); - chapter.setAttribute("time", "0"); - } - // save chapters file - QFile file(chapterFile); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - kWarning() << "////// ERROR writing DVD CHAPTER file: " << chapterFile; - } else { - file.write(doc.toString().toUtf8()); - if (file.error() != QFile::NoError) { - kWarning() << "////// ERROR writing DVD CHAPTER file: " << chapterFile; - } - file.close(); - } - } - } - - m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), playlistPath, scriptPath); -} - -void MainWindow::slotUpdateTimecodeFormat(int ix) -{ - KdenliveSettings::setFrametimecode(ix == 1); - m_clipMonitor->updateTimecodeFormat(); - m_projectMonitor->updateTimecodeFormat(); - m_activeTimeline->projectView()->clearSelection(); -} - -void MainWindow::slotRemoveFocus() -{ - statusBar()->setFocus(); - statusBar()->clearFocus(); -} - -void MainWindow::slotRevert() -{ - if (KMessageBox::warningContinueCancel(this, i18n("This will delete all changes made since you last saved your project. Are you sure you want to continue?"), i18n("Revert to last saved version")) == KMessageBox::Cancel) return; - KUrl url = m_activeDocument->url(); - closeCurrentDocument(false); - doOpenFile(url, NULL); -} - - -void MainWindow::slotShutdown() -{ - if (m_activeDocument) m_activeDocument->setModified(false); - // Call shutdown - QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface(); - if (interface && interface->isServiceRegistered("org.kde.ksmserver")) { - QDBusInterface smserver("org.kde.ksmserver", "/KSMServer", "org.kde.KSMServerInterface"); - smserver.call("logout", 1, 2, 2); - } else if (interface && interface->isServiceRegistered("org.gnome.SessionManager")) { - QDBusInterface smserver("org.gnome.SessionManager", "/SessionManager", "org.gnome.SessionManager"); - smserver.call("Shutdown"); - } -} - -void MainWindow::slotUpdateTrackInfo() -{ - if (m_activeDocument) - m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList()); -} - -void MainWindow::slotChangePalette(QAction *action, const QString &themename) -{ - // Load the theme file - QString theme; - if (action == NULL) theme = themename; - else theme = action->data().toString(); - KdenliveSettings::setColortheme(theme); - // Make palette for all widgets. - QPalette plt; - if (theme.isEmpty()) - plt = QApplication::desktop()->palette(); - else { - KSharedConfigPtr config = KSharedConfig::openConfig(theme); - plt = KGlobalSettings::createApplicationPalette(config); - } - - kapp->setPalette(plt); - const QObjectList children = statusBar()->children(); - - foreach(QObject *child, children) { - if (child->isWidgetType()) - ((QWidget*)child)->setPalette(plt); - const QObjectList subchildren = child->children(); - foreach(QObject *subchild, subchildren) { - if (subchild->isWidgetType()) - ((QWidget*)subchild)->setPalette(plt); - } - } -} - - -QPixmap MainWindow::createSchemePreviewIcon(const KSharedConfigPtr &config) -{ - // code taken from kdebase/workspace/kcontrol/colors/colorscm.cpp - const uchar bits1[] = { 0xff, 0xff, 0xff, 0x2c, 0x16, 0x0b }; - const uchar bits2[] = { 0x68, 0x34, 0x1a, 0xff, 0xff, 0xff }; - const QSize bitsSize(24, 2); - const QBitmap b1 = QBitmap::fromData(bitsSize, bits1); - const QBitmap b2 = QBitmap::fromData(bitsSize, bits2); - - QPixmap pixmap(23, 16); - pixmap.fill(Qt::black); // ### use some color other than black for borders? - - KConfigGroup group(config, "WM"); - QPainter p(&pixmap); - KColorScheme windowScheme(QPalette::Active, KColorScheme::Window, config); - p.fillRect(1, 1, 7, 7, windowScheme.background()); - p.fillRect(2, 2, 5, 2, QBrush(windowScheme.foreground().color(), b1)); - - KColorScheme buttonScheme(QPalette::Active, KColorScheme::Button, config); - p.fillRect(8, 1, 7, 7, buttonScheme.background()); - p.fillRect(9, 2, 5, 2, QBrush(buttonScheme.foreground().color(), b1)); - - p.fillRect(15, 1, 7, 7, group.readEntry("activeBackground", QColor(96, 148, 207))); - p.fillRect(16, 2, 5, 2, QBrush(group.readEntry("activeForeground", QColor(255, 255, 255)), b1)); - - KColorScheme viewScheme(QPalette::Active, KColorScheme::View, config); - p.fillRect(1, 8, 7, 7, viewScheme.background()); - p.fillRect(2, 12, 5, 2, QBrush(viewScheme.foreground().color(), b2)); - - KColorScheme selectionScheme(QPalette::Active, KColorScheme::Selection, config); - p.fillRect(8, 8, 7, 7, selectionScheme.background()); - p.fillRect(9, 12, 5, 2, QBrush(selectionScheme.foreground().color(), b2)); - - p.fillRect(15, 8, 7, 7, group.readEntry("inactiveBackground", QColor(224, 223, 222))); - p.fillRect(16, 12, 5, 2, QBrush(group.readEntry("inactiveForeground", QColor(20, 19, 18)), b2)); - - p.end(); - return pixmap; -} - -void MainWindow::slotSwitchMonitors() -{ - m_monitorManager->slotSwitchMonitors(m_clipMonitor->isActive()); - if (m_projectMonitor->isActive()) m_activeTimeline->projectView()->setFocus(); - else m_projectList->focusTree(); -} - -void MainWindow::slotInsertZoneToTree() -{ - if (!m_clipMonitor->isActive() || m_clipMonitor->activeClip() == NULL) return; - QStringList info = m_clipMonitor->getZoneInfo(); - m_projectList->slotAddClipCut(info.at(0), info.at(1).toInt(), info.at(2).toInt()); -} - -void MainWindow::slotInsertZoneToTimeline() -{ - if (m_activeTimeline == NULL || m_clipMonitor->activeClip() == NULL) return; - QStringList info = m_clipMonitor->getZoneInfo(); - m_activeTimeline->projectView()->insertClipCut(m_clipMonitor->activeClip(), info.at(1).toInt(), info.at(2).toInt()); -} - - -void MainWindow::slotDeleteProjectClips(QStringList ids, QMap folderids) -{ - for (int i = 0; i < ids.size(); ++i) { - m_activeTimeline->slotDeleteClip(ids.at(i)); - } - m_activeDocument->clipManager()->slotDeleteClips(ids); - if (!folderids.isEmpty()) m_projectList->deleteProjectFolder(folderids); - -} - -#include "mainwindow.moc" - diff -Nru kdenlive-0.7.7/src/mainwindow.h~ kdenlive-0.7.7.1/src/mainwindow.h~ --- kdenlive-0.7.7/src/mainwindow.h~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/mainwindow.h~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,350 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "effectslist.h" -#include "gentime.h" -#include "definitions.h" -#include "statusbarmessagelabel.h" -#include "dvdwizard.h" - -class KdenliveDoc; -class TrackView; -class MonitorManager; -class ProjectList; -class EffectsListView; -class EffectStackView; -class TransitionSettings; -class Monitor; -class RecMonitor; -class CustomTrackView; -class RenderWidget; -#ifndef NO_JOGSHUTTLE -class JogShuttle; -#endif /* NO_JOGSHUTTLE */ -class DocClipBase; -class Render; -class Transition; - -class MainWindow : public KXmlGuiWindow -{ - Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "org.kdenlive.MainWindow") - -public: - /** Constructor - * \param MltPath path to MLT environment - * \param Url Url to open - * \param parent Std. widget parent - * - * The constructor inits the main window. If Url is present, it will be opened. - * If Url is not present, and openLastproject is set, last project will be set - * If no file is open after trying this, a default "newfile" will be created. */ - explicit MainWindow(const QString &MltPath = QString(), const KUrl & Url = KUrl(), QWidget *parent = 0); - void parseProfiles(const QString &mltPath = QString()); - - static EffectsList videoEffects; - static EffectsList audioEffects; - static EffectsList customEffects; - static EffectsList transitions; -protected: - virtual bool queryClose(); - virtual void customEvent(QEvent * e); - virtual void keyPressEvent(QKeyEvent *ke); - /** Override hideEvent to get events when the mainwindow gets hidden */ - virtual void hideEvent(QHideEvent *e); - bool eventFilter(QObject *obj, QEvent *ev); - /** - * This function is called when it is time for the app to save its - * properties for session management purposes. - */ - virtual void saveProperties(KConfigGroup &config); - - /** - * This function is called when this app is restored. The KConfig - * object points to the session management config file that was saved - * with @ref saveProperties - */ - virtual void readProperties(const KConfigGroup &config); - -private: - KTabWidget* m_timelineArea; - QProgressBar *m_statusProgressBar; - void setupActions(); - KdenliveDoc *m_activeDocument; - TrackView *m_activeTimeline; - MonitorManager *m_monitorManager; - - QDockWidget *m_projectListDock; - ProjectList *m_projectList; - - QDockWidget *m_effectListDock; - EffectsListView *m_effectList; - //KListWidget *m_effectList; - - QDockWidget *m_effectStackDock; - EffectStackView *m_effectStack; - - QDockWidget *m_transitionConfigDock; - TransitionSettings *m_transitionConfig; - - QDockWidget *m_clipMonitorDock; - Monitor *m_clipMonitor; - - QDockWidget *m_projectMonitorDock; - Monitor *m_projectMonitor; - - QDockWidget *m_recMonitorDock; - RecMonitor *m_recMonitor; - - QDockWidget *m_undoViewDock; - QUndoView *m_undoView; - QUndoGroup *m_commandStack; - - KComboBox *m_timecodeFormat; - - QMenu *m_customEffectsMenu; - QMenu *m_timelineContextMenu; - QMenu *m_timelineContextClipMenu; - QMenu *m_timelineContextTransitionMenu; - KUrl m_startUrl; - - /** - * Shortcut to remove the focus of any element. Allows to get out - * of e.g. text input fields and to press another shortcut. - */ - QShortcut* m_shortcutRemoveFocus; - - RenderWidget *m_renderWidget; - -#ifndef NO_JOGSHUTTLE - JogShuttle *m_jogProcess; -#endif /* NO_JOGSHUTTLE */ - - KRecentFilesAction *m_fileOpenRecent; - KAction *m_fileRevert; - KAction *m_projectSearch; - KAction *m_projectSearchNext; - - KAction *m_buttonAudioThumbs; - KAction *m_buttonVideoThumbs; - KAction *m_buttonShowMarkers; - KAction *m_buttonFitZoom; - KAction *m_normalEditTool; - KAction *m_overwriteEditTool; - KAction *m_insertEditTool; - KAction *m_buttonSelectTool; - KAction *m_buttonRazorTool; - KAction *m_buttonSpacerTool; - KAction *m_buttonSnap; - KAction *m_saveAction; - KAction *m_closeAction; - QSlider *m_zoomSlider; - KAction *m_loopZone; - KAction *m_playZone; - StatusBarMessageLabel *m_messageLabel; - QActionGroup *m_clipTypeGroup; - - bool m_findActivated; - QString m_findString; - QTimer m_findTimer; - - void readOptions(); - void saveOptions(); -#ifndef NO_JOGSHUTTLE - void activateShuttleDevice(); - void slotShuttleAction(int code); -#endif /* NO_JOGSHUTTLE */ - void connectDocumentInfo(KdenliveDoc *doc); - void findAhead(); - void doOpenFile(const KUrl &url, KAutoSaveFile *stale); - void recoverFiles(QList staleFiles); - void loadPlugins(); - void populateMenus(QObject *plugin); - void addToMenu(QObject *plugin, const QStringList &texts, - QMenu *menu, const char *member, - QActionGroup *actionGroup); - void aboutPlugins(); - int getNewStuff(const QString &configFile = QString()); - QStringList m_pluginFileNames; - QByteArray m_timelineState; - void loadTranscoders(); - QPixmap createSchemePreviewIcon(const KSharedConfigPtr &config); - -public slots: - void openFile(const KUrl &url); - void slotGotProgressInfo(const QString &message, int progress); - Q_SCRIPTABLE void setRenderingProgress(const QString &url, int progress); - Q_SCRIPTABLE void setRenderingFinished(const QString &url, int status, const QString &error); - -private slots: - void newFile(bool showProjectSettings = true, bool force = false); - void queryQuit(); - void activateDocument(); - void connectDocument(TrackView*, KdenliveDoc*); - void openFile(); - void openLastFile(); - bool saveFile(); - bool saveFileAs(); - bool saveFileAs(const QString &outputFileName); - void slotPreferences(int page = -1, int option = -1); - void updateConfiguration(); - void slotConnectMonitors(); - void slotRaiseMonitor(bool clipMonitor); - void slotUpdateClip(const QString &id); - void slotUpdateMousePosition(int pos); - void slotAddEffect(const QDomElement effect, GenTime pos = GenTime(), int track = -1); - void slotEditProfiles(); - void slotDetectAudioDriver(); - void slotEditProjectSettings(); - void slotDisplayActionMessage(QAction *a); - void slotSwitchVideoThumbs(); - void slotSwitchAudioThumbs(); - void slotSwitchMarkersComments(); - void slotSwitchSnap(); - void slotRenderProject(); - void slotFullScreen(); - void slotUpdateDocumentState(bool modified); - void slotZoomIn(); - void slotZoomOut(); - void slotFitZoom(); - void closeCurrentDocument(bool saveChanges = true); - void slotDeleteTimelineClip(); - void slotAddClipMarker(); - void slotDeleteClipMarker(); - void slotDeleteAllClipMarkers(); - void slotEditClipMarker(); - void slotCutTimelineClip(); - void slotInsertClipOverwrite(); - void slotSelectTimelineClip(); - void slotSelectTimelineTransition(); - void slotDeselectTimelineClip(); - void slotDeselectTimelineTransition(); - void slotSelectAddTimelineClip(); - void slotSelectAddTimelineTransition(); - void slotAddVideoEffect(QAction *result); - void slotAddAudioEffect(QAction *result); - void slotAddCustomEffect(QAction *result); - void slotAddTransition(QAction *result); - void slotAddProjectClip(KUrl url); -#ifndef NO_JOGSHUTTLE - void slotShuttleButton(int code); -#endif /* NO_JOGSHUTTLE */ - void slotShowClipProperties(DocClipBase *clip); - void slotShowClipProperties(QList cliplist, QMap commonproperties); - void slotActivateEffectStackView(); - void slotActivateTransitionView(Transition *); - void slotChangeTool(QAction * action); - void slotChangeEdit(QAction * action); - void slotSetTool(PROJECTTOOL tool); - void slotSnapForward(); - void slotSnapRewind(); - void slotClipStart(); - void slotClipEnd(); - void slotZoneStart(); - void slotZoneEnd(); - void slotFind(); - void findTimeout(); - void slotFindNext(); - - void slotInsertSpace(); - void slotRemoveSpace(); - void slotAddGuide(); - void slotEditGuide(); - void slotDeleteGuide(); - void slotDeleteAllGuides(); - void slotGuidesUpdated(); - - void slotCopy(); - void slotPaste(); - void slotPasteEffects(); - void slotReloadEffects(); - - void slotAdjustClipMonitor(); - void slotAdjustProjectMonitor(); - void slotSaveZone(Render *render, QPoint zone); - - void slotSetInPoint(); - void slotSetOutPoint(); - void slotResizeItemStart(); - void slotResizeItemEnd(); - void configureNotifications(); - void slotInsertTrack(int ix = 0); - void slotDeleteTrack(int ix = 0); - void slotChangeTrack(int ix = 0); - void slotGetNewLumaStuff(); - void slotGetNewRenderStuff(); - void slotGetNewMltProfileStuff(); - void slotAutoTransition(); - void slotRunWizard(); - void generateClip(); - void slotZoneMoved(int start, int end); - void slotUpdatePreviewSettings(); - void slotDvdWizard(const QString &url = QString(), const QString &profile = "dv_pal"); - void slotGroupClips(); - void slotUnGroupClips(); - void slotSplitAudio(); - void slotUpdateClipType(QAction *action); - void slotShowTimeline(bool show); - void slotMaximizeCurrent(bool show); - void slotTranscode(KUrl::List urls = KUrl::List()); - void slotTranscodeClip(); - void slotSetDocumentRenderProfile(const QString &dest, const QString &group, const QString &name, const QString &file); - void slotPrepareRendering(bool scriptExport, bool zoneOnly, const QString &chapterFile); - void slotUpdateTimecodeFormat(int ix); - /** Removes the focus of anything */ - void slotRemoveFocus(); - void slotCleanProject(); - void slotSetZoom(int value); - void slotUpdateClipMarkers(DocClipBase *clip); - void slotRevert(); - void slotShutdown(); - void slotUpdateTrackInfo(); - /** \brief Change color scheme */ - void slotChangePalette(QAction *action, const QString &themename = QString()); - void slotSwitchMonitors(); - void slotInsertZoneToTree(); - void slotInsertZoneToTimeline(); - -signals: - Q_SCRIPTABLE void abortRenderJob(const QString &url); -}; - - -#endif diff -Nru kdenlive-0.7.7/src/projectitem.cpp~ kdenlive-0.7.7.1/src/projectitem.cpp~ --- kdenlive-0.7.7/src/projectitem.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/projectitem.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,243 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "projectitem.h" -#include "timecode.h" -#include "kdenlivesettings.h" -#include "docclipbase.h" - -#include -#include -#include - -const int DurationRole = Qt::UserRole + 1; -const int itemHeight = 38; - -ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip) : - QTreeWidgetItem(parent, PROJECTCLIPTYPE) -{ - setSizeHint(0, QSize(itemHeight * 3, itemHeight)); - if (clip->isPlaceHolder()) setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - else setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); - m_clip = clip; - m_clipId = clip->getId(); - QString name = m_clip->getProperty("name"); - if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName(); - m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); - if (m_clipType != UNKNOWN) slotSetToolTip(); - setText(0, name); - setText(1, m_clip->description()); - m_clip->askForAudioThumbs(); - GenTime duration = m_clip->duration(); - if (duration != GenTime()) setData(0, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); - //setFlags(Qt::NoItemFlags); - //kDebug() << "Constructed with clipId: " << m_clipId; -} - -ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) : - QTreeWidgetItem(parent, PROJECTCLIPTYPE) -{ - setSizeHint(0, QSize(itemHeight * 3, itemHeight)); - if (clip->isPlaceHolder()) setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - else setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); - m_clip = clip; - m_clipId = clip->getId(); - QString name = m_clip->getProperty("name"); - if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName(); - m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); - setText(0, name); - setText(1, m_clip->description()); - m_clip->askForAudioThumbs(); - GenTime duration = m_clip->duration(); - if (duration != GenTime()) setData(0, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); - //setFlags(Qt::NoItemFlags); - //kDebug() << "Constructed with clipId: " << m_clipId; -} - - -ProjectItem::~ProjectItem() -{ -} - -//static -int ProjectItem::itemDefaultHeight() -{ - return itemHeight; -} - -int ProjectItem::numReferences() const -{ - if (!m_clip) return 0; - return m_clip->numReferences(); -} - -const QString &ProjectItem::clipId() const -{ - return m_clipId; -} - -CLIPTYPE ProjectItem::clipType() const -{ - return m_clipType; -} - -int ProjectItem::clipMaxDuration() const -{ - return m_clip->getProperty("duration").toInt(); -} - -QStringList ProjectItem::names() const -{ - QStringList result; - result.append(text(0)); - result.append(text(1)); - result.append(text(2)); - return result; -} - -QDomElement ProjectItem::toXml() const -{ - return m_clip->toXML(); -} - -const KUrl ProjectItem::clipUrl() const -{ - if (m_clipType != COLOR && m_clipType != VIRTUAL && m_clipType != UNKNOWN) - return KUrl(m_clip->getProperty("resource")); - else return KUrl(); -} - -void ProjectItem::changeDuration(int frames) -{ - setData(0, DurationRole, Timecode::getEasyTimecode(GenTime(frames, KdenliveSettings::project_fps()), KdenliveSettings::project_fps())); -} - -void ProjectItem::setProperties(QMap props) -{ - if (m_clip == NULL) return; - m_clip->setProperties(props); -} - -QString ProjectItem::getClipHash() const -{ - if (m_clip == NULL) return QString(); - return m_clip->getClipHash(); -} - -void ProjectItem::setProperty(const QString &key, const QString &value) -{ - if (m_clip == NULL) return; - m_clip->setProperty(key, value); -} - -void ProjectItem::clearProperty(const QString &key) -{ - if (m_clip == NULL) return; - m_clip->clearProperty(key); -} - -DocClipBase *ProjectItem::referencedClip() -{ - return m_clip; -} - -void ProjectItem::slotSetToolTip() -{ - QString tip = ""; - if (m_clip->isPlaceHolder()) tip.append(i18n("Missing") + " | "); - switch (m_clipType) { - case AUDIO: - tip.append(i18n("Audio clip") + "
" + clipUrl().path()); - break; - case VIDEO: - tip.append(i18n("Mute video clip") + "
" + clipUrl().path()); - break; - case AV: - tip.append(i18n("Video clip") + "
" + clipUrl().path()); - break; - case COLOR: - tip.append(i18n("Color clip")); - break; - case IMAGE: - tip.append(i18n("Image clip") + "
" + clipUrl().path()); - break; - case TEXT: - if (!clipUrl().isEmpty() && m_clip->getProperty("xmldata").isEmpty()) tip.append(i18n("Template text clip") + "
" + clipUrl().path()); - else tip.append(i18n("Text clip") + "
" + clipUrl().path()); - break; - case SLIDESHOW: - tip.append(i18n("Slideshow clip") + "
" + clipUrl().directory()); - break; - case VIRTUAL: - tip.append(i18n("Virtual clip")); - break; - case PLAYLIST: - tip.append(i18n("Playlist clip") + "
" + clipUrl().path()); - break; - default: - tip.append(i18n("Unknown clip")); - break; - } - - setToolTip(0, tip); -} - - -void ProjectItem::setProperties(const QMap < QString, QString > &attributes, const QMap < QString, QString > &metadata) -{ - if (m_clip == NULL) return; - //setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); - if (attributes.contains("duration")) { - GenTime duration = GenTime(attributes.value("duration").toInt(), KdenliveSettings::project_fps()); - setData(0, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); - m_clip->setDuration(duration); - } else { - // No duration known, use an arbitrary one until it is. - } - - - //extend attributes -reh - - if (m_clipType == UNKNOWN) { - QString cliptype = attributes.value("type"); - if (cliptype == "audio") m_clipType = AUDIO; - else if (cliptype == "video") m_clipType = VIDEO; - else if (cliptype == "av") m_clipType = AV; - else if (cliptype == "playlist") m_clipType = PLAYLIST; - else m_clipType = AV; - - m_clip->setClipType(m_clipType); - slotSetToolTip(); - } - m_clip->setProperties(attributes); - m_clip->setMetadata(metadata); - m_clip->askForAudioThumbs(); - - if (m_clip->description().isEmpty()) { - if (metadata.contains("description")) { - m_clip->setProperty("description", metadata.value("description")); - setText(1, m_clip->description()); - } else if (metadata.contains("comment")) { - m_clip->setProperty("description", metadata.value("comment")); - setText(1, m_clip->description()); - } - } -} - diff -Nru kdenlive-0.7.7/src/projectlist.cpp~ kdenlive-0.7.7.1/src/projectlist.cpp~ --- kdenlive-0.7.7/src/projectlist.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/projectlist.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,1513 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - -#include "projectlist.h" -#include "projectitem.h" -#include "addfoldercommand.h" -#include "kdenlivesettings.h" -#include "slideshowclip.h" -#include "ui_colorclip_ui.h" -#include "titlewidget.h" -#include "definitions.h" -#include "clipmanager.h" -#include "docclipbase.h" -#include "kdenlivedoc.h" -#include "renderer.h" -#include "kthumb.h" -#include "projectlistview.h" -#include "editclipcommand.h" -#include "editclipcutcommand.h" -#include "editfoldercommand.h" -#include "addclipcutcommand.h" - -#include "ui_templateclip_ui.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef NEPOMUK -#include -#include -//#include -#endif - -#include -#include -#include -#include -#include -#include -#include - -ProjectList::ProjectList(QWidget *parent) : - QWidget(parent), - m_render(NULL), - m_fps(-1), - m_commandStack(NULL), - m_editAction(NULL), - m_deleteAction(NULL), - m_openAction(NULL), - m_reloadAction(NULL), - m_transcodeAction(NULL), - m_doc(NULL), - m_refreshed(false), - m_infoQueue(), - m_thumbnailQueue() -{ - - m_listView = new ProjectListView(this);; - QVBoxLayout *layout = new QVBoxLayout; - layout->setContentsMargins(0, 0, 0, 0); - - // setup toolbar - KTreeWidgetSearchLine *searchView = new KTreeWidgetSearchLine(this); - m_toolbar = new QToolBar("projectToolBar", this); - m_toolbar->addWidget(searchView); - int s = style()->pixelMetric(QStyle::PM_SmallIconSize); - m_toolbar->setIconSize(QSize(s, s)); - searchView->setTreeWidget(m_listView); - - m_addButton = new QToolButton(m_toolbar); - m_addButton->setPopupMode(QToolButton::MenuButtonPopup); - m_toolbar->addWidget(m_addButton); - - layout->addWidget(m_toolbar); - layout->addWidget(m_listView); - setLayout(layout); - - m_queueTimer.setInterval(100); - connect(&m_queueTimer, SIGNAL(timeout()), this, SLOT(slotProcessNextClipInQueue())); - m_queueTimer.setSingleShot(true); - - - connect(m_listView, SIGNAL(projectModified()), this, SIGNAL(projectModified())); - connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected())); - connect(m_listView, SIGNAL(focusMonitor()), this, SLOT(slotClipSelected())); - connect(m_listView, SIGNAL(pauseMonitor()), this, SLOT(slotPauseMonitor())); - connect(m_listView, SIGNAL(requestMenu(const QPoint &, QTreeWidgetItem *)), this, SLOT(slotContextMenu(const QPoint &, QTreeWidgetItem *))); - connect(m_listView, SIGNAL(addClip()), this, SLOT(slotAddClip())); - connect(m_listView, SIGNAL(addClip(const QList , const QString &, const QString &)), this, SLOT(slotAddClip(const QList , const QString &, const QString &))); - connect(m_listView, SIGNAL(addClipCut(const QString &, int, int)), this, SLOT(slotAddClipCut(const QString &, int, int))); - connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int))); - connect(m_listView, SIGNAL(showProperties(DocClipBase *)), this, SIGNAL(showClipProperties(DocClipBase *))); - - m_listViewDelegate = new ItemDelegate(m_listView); - m_listView->setItemDelegate(m_listViewDelegate); -#ifdef NEPOMUK - if (KdenliveSettings::activate_nepomuk()) { - Nepomuk::ResourceManager::instance()->init(); - if (!Nepomuk::ResourceManager::instance()->initialized()) { - kDebug() << "Cannot communicate with Nepomuk, DISABLING it"; - KdenliveSettings::setActivate_nepomuk(false); - } - } -#endif -} - -ProjectList::~ProjectList() -{ - delete m_menu; - delete m_toolbar; - m_listView->blockSignals(true); - m_listView->clear(); - delete m_listViewDelegate; -} - -void ProjectList::focusTree() const -{ - m_listView->setFocus(); -} - -void ProjectList::setupMenu(QMenu *addMenu, QAction *defaultAction) -{ - QList actions = addMenu->actions(); - for (int i = 0; i < actions.count(); i++) { - if (actions.at(i)->data().toString() == "clip_properties") { - m_editAction = actions.at(i); - m_toolbar->addAction(m_editAction); - actions.removeAt(i); - i--; - } else if (actions.at(i)->data().toString() == "delete_clip") { - m_deleteAction = actions.at(i); - m_toolbar->addAction(m_deleteAction); - actions.removeAt(i); - i--; - } else if (actions.at(i)->data().toString() == "edit_clip") { - m_openAction = actions.at(i); - actions.removeAt(i); - i--; - } else if (actions.at(i)->data().toString() == "reload_clip") { - m_reloadAction = actions.at(i); - actions.removeAt(i); - i--; - } - } - - QMenu *m = new QMenu(); - m->addActions(actions); - m_addButton->setMenu(m); - m_addButton->setDefaultAction(defaultAction); - m_menu = new QMenu(); - m_menu->addActions(addMenu->actions()); -} - -void ProjectList::setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu) -{ - if (!addMenu) return; - QMenu *menu = m_addButton->menu(); - menu->addMenu(addMenu); - m_addButton->setMenu(menu); - - m_menu->addMenu(addMenu); - if (addMenu->isEmpty()) addMenu->setEnabled(false); - m_menu->addMenu(transcodeMenu); - if (transcodeMenu->isEmpty()) transcodeMenu->setEnabled(false); - m_transcodeAction = transcodeMenu; - m_menu->addAction(m_reloadAction); - m_menu->addAction(m_editAction); - m_menu->addAction(m_openAction); - m_menu->addAction(m_deleteAction); - m_menu->insertSeparator(m_deleteAction); -} - - -QByteArray ProjectList::headerInfo() const -{ - return m_listView->header()->saveState(); -} - -void ProjectList::setHeaderInfo(const QByteArray &state) -{ - m_listView->header()->restoreState(state); -} - -void ProjectList::slotEditClip() -{ - QList list = m_listView->selectedItems(); - if (list.count() > 1) { - editClipSelection(list); - return; - } - ProjectItem *item; - if (!m_listView->currentItem() || m_listView->currentItem()->type() == PROJECTFOLDERTYPE) return; - if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE) { - item = static_cast (m_listView->currentItem()->parent()); - } else item = static_cast (m_listView->currentItem()); - if (!(item->flags() & Qt::ItemIsDragEnabled)) return; - if (item) { - emit clipSelected(item->referencedClip()); - emit showClipProperties(item->referencedClip()); - } -} - -void ProjectList::editClipSelection(QList list) -{ - // Gather all common properties - QMap commonproperties; - QList clipList; - commonproperties.insert("force_aspect_ratio", "-"); - commonproperties.insert("force_fps", "-"); - commonproperties.insert("force_progressive", "-"); - commonproperties.insert("threads", "-"); - commonproperties.insert("video_index", "-"); - commonproperties.insert("audio_index", "-"); - - bool allowDurationChange = true; - int commonDuration = -1; - ProjectItem *item; - for (int i = 0; i < list.count(); i++) { - item = NULL; - if (list.at(i)->type() == PROJECTFOLDERTYPE) continue; - if (list.at(i)->type() == PROJECTSUBCLIPTYPE) { - item = static_cast (list.at(i)->parent()); - } else item = static_cast (list.at(i)); - if (!(item->flags() & Qt::ItemIsDragEnabled)) continue; - if (item) { - // check properties - DocClipBase *clip = item->referencedClip(); - if (clipList.contains(clip)) continue; - if (clip->clipType() != COLOR && clip->clipType() != IMAGE && clip->clipType() != TEXT) { - allowDurationChange = false; - } - if (allowDurationChange && commonDuration != 0) { - if (commonDuration == -1) { - commonDuration = clip->duration().frames(m_fps); - } else if (commonDuration != clip->duration().frames(m_fps)) { - commonDuration = 0; - } - } - clipList.append(clip); - QMap clipprops = clip->properties(); - QMapIterator p(commonproperties); - while (p.hasNext()) { - p.next(); - if (p.value().isEmpty()) continue; - if (clipprops.contains(p.key())) { - if (p.value() == "-") commonproperties.insert(p.key(), clipprops.value(p.key())); - else if (p.value() != clipprops.value(p.key())) commonproperties.insert(p.key(), QString()); - } else commonproperties.insert(p.key(), QString()); - } - } - } - if (allowDurationChange) commonproperties.insert("out", QString::number(commonDuration)); - QMapIterator p(commonproperties); - while (p.hasNext()) { - p.next(); - kDebug() << "Result: " << p.key() << " = " << p.value(); - } - emit showClipProperties(clipList, commonproperties); -} - -void ProjectList::slotOpenClip() -{ - ProjectItem *item; - if (!m_listView->currentItem() || m_listView->currentItem()->type() == PROJECTFOLDERTYPE) return; - if (m_listView->currentItem()->type() == QTreeWidgetItem::UserType + 1) { - item = static_cast (m_listView->currentItem()->parent()); - } else item = static_cast (m_listView->currentItem()); - if (item) { - if (item->clipType() == IMAGE) { - if (KdenliveSettings::defaultimageapp().isEmpty()) KMessageBox::sorry(this, i18n("Please set a default application to open images in the Settings dialog")); - else QProcess::startDetached(KdenliveSettings::defaultimageapp(), QStringList() << item->clipUrl().path()); - } - if (item->clipType() == AUDIO) { - if (KdenliveSettings::defaultaudioapp().isEmpty()) KMessageBox::sorry(this, i18n("Please set a default application to open audio files in the Settings dialog")); - else QProcess::startDetached(KdenliveSettings::defaultaudioapp(), QStringList() << item->clipUrl().path()); - } - } -} - -void ProjectList::cleanup() -{ - m_listView->clearSelection(); - QTreeWidgetItemIterator it(m_listView); - ProjectItem *item; - while (*it) { - if ((*it)->type() != PROJECTCLIPTYPE) { - it++; - continue; - } - item = static_cast (*it); - if (item->numReferences() == 0) item->setSelected(true); - it++; - } - slotRemoveClip(); -} - -void ProjectList::trashUnusedClips() -{ - QTreeWidgetItemIterator it(m_listView); - ProjectItem *item; - QStringList ids; - QStringList urls; - while (*it) { - if ((*it)->type() != PROJECTCLIPTYPE) { - it++; - continue; - } - item = static_cast (*it); - if (item->numReferences() == 0) { - ids << item->clipId(); - KUrl url = item->clipUrl(); - if (!url.isEmpty() && !urls.contains(url.path())) urls << url.path(); - } - it++; - } - - // Check that we don't use the URL in another clip - QTreeWidgetItemIterator it2(m_listView); - while (*it2) { - if ((*it2)->type() != PROJECTCLIPTYPE) { - it2++; - continue; - } - item = static_cast (*it2); - if (item->numReferences() > 0) { - KUrl url = item->clipUrl(); - if (!url.isEmpty() && urls.contains(url.path())) urls.removeAll(url.path()); - } - it2++; - } - - emit deleteProjectClips(ids, QMap ()); - for (int i = 0; i < urls.count(); i++) { - KIO::NetAccess::del(KUrl(urls.at(i)), this); - } -} - -void ProjectList::slotReloadClip(const QString &id) -{ - QList selected; - if (id.isEmpty()) selected = m_listView->selectedItems(); - else selected.append(getItemById(id)); - ProjectItem *item; - for (int i = 0; i < selected.count(); i++) { - if (selected.at(i)->type() != PROJECTCLIPTYPE) continue; - item = static_cast (selected.at(i)); - if (item) { - if (item->clipType() == IMAGE) { - item->referencedClip()->producer()->set("force_reload", 1); - } else if (item->clipType() == TEXT) { - if (!item->referencedClip()->getProperty("xmltemplate").isEmpty()) regenerateTemplate(item); - } - //requestClipInfo(item->toXml(), item->clipId(), true); - // Clear the file_hash value, which will cause a complete reload of the clip - emit getFileProperties(item->toXml(), item->clipId(), m_listView->iconSize().height(), true); - } - } -} - -void ProjectList::setRenderer(Render *projectRender) -{ - m_render = projectRender; - m_listView->setIconSize(QSize((ProjectItem::itemDefaultHeight() - 2) * m_render->dar(), ProjectItem::itemDefaultHeight() - 2)); -} - -void ProjectList::slotClipSelected() -{ - if (m_listView->currentItem()) { - if (m_listView->currentItem()->type() == PROJECTFOLDERTYPE) { - emit clipSelected(NULL); - m_editAction->setEnabled(false); - m_deleteAction->setEnabled(true); - m_openAction->setEnabled(false); - m_reloadAction->setEnabled(false); - m_transcodeAction->setEnabled(false); - } else { - ProjectItem *clip; - if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE) { - // this is a sub item, use base clip - m_deleteAction->setEnabled(true); - clip = static_cast (m_listView->currentItem()->parent()); - if (clip == NULL) kDebug() << "-----------ERROR"; - SubProjectItem *sub = static_cast (m_listView->currentItem()); - emit clipSelected(clip->referencedClip(), sub->zone()); - m_transcodeAction->setEnabled(false); - return; - } - clip = static_cast (m_listView->currentItem()); - if (clip) emit clipSelected(clip->referencedClip()); - m_editAction->setEnabled(true); - m_deleteAction->setEnabled(true); - m_reloadAction->setEnabled(true); - m_transcodeAction->setEnabled(true); - if (clip && clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) { - m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp())); - m_openAction->setEnabled(true); - } else if (clip && clip->clipType() == AUDIO && !KdenliveSettings::defaultaudioapp().isEmpty()) { - m_openAction->setIcon(KIcon(KdenliveSettings::defaultaudioapp())); - m_openAction->setEnabled(true); - } else m_openAction->setEnabled(false); - // Display relevant transcoding actions only - adjustTranscodeActions(clip); - } - } else { - emit clipSelected(NULL); - m_editAction->setEnabled(false); - m_deleteAction->setEnabled(false); - m_openAction->setEnabled(false); - m_reloadAction->setEnabled(false); - m_transcodeAction->setEnabled(false); - } -} - -void ProjectList::adjustTranscodeActions(ProjectItem *clip) const -{ - if (clip == NULL || clip->type() != PROJECTCLIPTYPE || clip->clipType() == COLOR || clip->clipType() == TEXT || clip->clipType() == PLAYLIST) { - m_transcodeAction->setEnabled(false); - return; - } - m_transcodeAction->setEnabled(true); - QList transcodeActions = m_transcodeAction->actions(); - QStringList data; - QString condition; - for (int i = 0; i < transcodeActions.count(); i++) { - data = transcodeActions.at(i)->data().toStringList(); - if (data.count() > 2) { - condition = data.at(2); - if (condition.startsWith("vcodec")) transcodeActions.at(i)->setEnabled(clip->referencedClip()->hasVideoCodec(condition.section("=", 1, 1))); - else if (condition.startsWith("acodec")) transcodeActions.at(i)->setEnabled(clip->referencedClip()->hasVideoCodec(condition.section("=", 1, 1))); - } - } - -} - -void ProjectList::slotPauseMonitor() -{ - if (m_render) m_render->pause(); -} - -void ProjectList::slotUpdateClipProperties(const QString &id, QMap properties) -{ - ProjectItem *item = getItemById(id); - if (item) { - slotUpdateClipProperties(item, properties); - if (properties.contains("out") || properties.contains("force_fps")) { - slotReloadClip(id); - } else if (properties.contains("colour") || properties.contains("resource") || properties.contains("xmldata") || properties.contains("force_aspect_ratio") || properties.contains("templatetext")) { - slotRefreshClipThumbnail(item); - emit refreshClip(); - } - } -} - -void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap properties) -{ - if (!clip) return; - clip->setProperties(properties); - if (properties.contains("name")) { - m_listView->blockSignals(true); - clip->setText(0, properties.value("name")); - m_listView->blockSignals(false); - emit clipNameChanged(clip->clipId(), properties.value("name")); - } - if (properties.contains("description")) { - CLIPTYPE type = clip->clipType(); - m_listView->blockSignals(true); - clip->setText(1, properties.value("description")); - m_listView->blockSignals(false); -#ifdef NEPOMUK - if (KdenliveSettings::activate_nepomuk() && (type == AUDIO || type == VIDEO || type == AV || type == IMAGE || type == PLAYLIST)) { - // Use Nepomuk system to store clip description - Nepomuk::Resource f(clip->clipUrl().path()); - f.setDescription(properties.value("description")); - } -#endif - emit projectModified(); - } -} - -void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column) -{ - if (item->type() == PROJECTSUBCLIPTYPE) { - // this is a sub-item - if (column == 1) { - // user edited description - SubProjectItem *sub = static_cast (item); - ProjectItem *item = static_cast (sub->parent()); - EditClipCutCommand *command = new EditClipCutCommand(this, item->clipId(), sub->zone(), sub->zone(), sub->description(), sub->text(1), true); - m_commandStack->push(command); - //slotUpdateCutClipProperties(sub->clipId(), sub->zone(), sub->text(1), sub->text(1)); - } - return; - } - if (item->type() == PROJECTFOLDERTYPE) { - if (column != 0) return; - FolderProjectItem *folder = static_cast (item); - editFolder(item->text(0), folder->groupName(), folder->clipId()); - folder->setGroupName(item->text(0)); - m_doc->clipManager()->addFolder(folder->clipId(), item->text(0)); - const int children = item->childCount(); - for (int i = 0; i < children; i++) { - ProjectItem *child = static_cast (item->child(i)); - child->setProperty("groupname", item->text(0)); - } - return; - } - - ProjectItem *clip = static_cast (item); - if (column == 1) { - if (clip->referencedClip()) { - QMap oldprops; - QMap newprops; - oldprops["description"] = clip->referencedClip()->getProperty("description"); - newprops["description"] = item->text(1); - - if (clip->clipType() == TEXT) { - // This is a text template clip, update the image - /*oldprops.insert("xmldata", clip->referencedClip()->getProperty("xmldata")); - newprops.insert("xmldata", generateTemplateXml(clip->referencedClip()->getProperty("xmltemplate"), item->text(2)).toString());*/ - oldprops.insert("templatetext", clip->referencedClip()->getProperty("templatetext")); - newprops.insert("templatetext", item->text(1)); - } - slotUpdateClipProperties(clip->clipId(), newprops); - EditClipCommand *command = new EditClipCommand(this, clip->clipId(), oldprops, newprops, false); - m_commandStack->push(command); - } - } else if (column == 0) { - if (clip->referencedClip()) { - QMap oldprops; - QMap newprops; - oldprops["name"] = clip->referencedClip()->getProperty("name"); - newprops["name"] = item->text(0); - slotUpdateClipProperties(clip, newprops); - emit projectModified(); - EditClipCommand *command = new EditClipCommand(this, clip->clipId(), oldprops, newprops, false); - m_commandStack->push(command); - } - } -} - -void ProjectList::slotContextMenu(const QPoint &pos, QTreeWidgetItem *item) -{ - bool enable = false; - if (item) { - enable = true; - } - m_editAction->setEnabled(enable); - m_deleteAction->setEnabled(enable); - m_reloadAction->setEnabled(enable); - m_transcodeAction->setEnabled(enable); - if (enable) { - ProjectItem *clip = NULL; - if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE) { - clip = static_cast (item->parent()); - m_transcodeAction->setEnabled(false); - } else if (m_listView->currentItem()->type() == PROJECTCLIPTYPE) { - clip = static_cast (item); - // Display relevant transcoding actions only - adjustTranscodeActions(clip); - } else m_transcodeAction->setEnabled(false); - if (clip && clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) { - m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp())); - m_openAction->setEnabled(true); - } else if (clip && clip->clipType() == AUDIO && !KdenliveSettings::defaultaudioapp().isEmpty()) { - m_openAction->setIcon(KIcon(KdenliveSettings::defaultaudioapp())); - m_openAction->setEnabled(true); - } else m_openAction->setEnabled(false); - - } else m_openAction->setEnabled(false); - m_menu->popup(pos); -} - -void ProjectList::slotRemoveClip() -{ - if (!m_listView->currentItem()) return; - QStringList ids; - QMap folderids; - QList selected = m_listView->selectedItems(); - - QUndoCommand *delCommand = new QUndoCommand(); - delCommand->setText(i18n("Delete Clip Zone")); - - for (int i = 0; i < selected.count(); i++) { - if (selected.at(i)->type() == PROJECTSUBCLIPTYPE) { - // subitem - SubProjectItem *sub = static_cast (selected.at(i)); - ProjectItem *item = static_cast (sub->parent()); - new AddClipCutCommand(this, item->clipId(), sub->zone().x(), sub->zone().y(), sub->description(), false, true, delCommand); - } else if (selected.at(i)->type() == PROJECTFOLDERTYPE) { - // folder - FolderProjectItem *folder = static_cast (selected.at(i)); - folderids[folder->groupName()] = folder->clipId(); - int children = folder->childCount(); - - if (children > 0 && KMessageBox::questionYesNo(this, i18np("Delete folder %2?
This will also remove the clip in that folder", "Delete folder %2?
This will also remove the %1 clips in that folder", children, folder->text(1)), i18n("Delete Folder")) != KMessageBox::Yes) return; - for (int i = 0; i < children; ++i) { - ProjectItem *child = static_cast (folder->child(i)); - ids << child->clipId(); - } - } else { - ProjectItem *item = static_cast (selected.at(i)); - ids << item->clipId(); - if (item->numReferences() > 0) { - if (KMessageBox::questionYesNo(this, i18np("Delete clip %2?
This will also remove the clip in timeline", "Delete clip %2?
This will also remove its %1 clips in timeline", item->numReferences(), item->names().at(1)), i18n("Delete Clip")) != KMessageBox::Yes) return; - } - } - } - - if (delCommand->childCount() == 0) delete delCommand; - else m_commandStack->push(delCommand); - emit deleteProjectClips(ids, folderids); -} - -void ProjectList::updateButtons() const -{ - if (m_listView->topLevelItemCount() == 0) { - m_deleteAction->setEnabled(false); - } else { - m_deleteAction->setEnabled(true); - if (!m_listView->currentItem()) m_listView->setCurrentItem(m_listView->topLevelItem(0)); - QTreeWidgetItem *item = m_listView->currentItem(); - if (item && item->type() == PROJECTCLIPTYPE) { - m_editAction->setEnabled(true); - m_openAction->setEnabled(true); - m_reloadAction->setEnabled(true); - m_transcodeAction->setEnabled(true); - return; - } - } - - m_editAction->setEnabled(false); - m_openAction->setEnabled(false); - m_reloadAction->setEnabled(false); - m_transcodeAction->setEnabled(false); -} - -void ProjectList::selectItemById(const QString &clipId) -{ - ProjectItem *item = getItemById(clipId); - if (item) m_listView->setCurrentItem(item); -} - - -void ProjectList::slotDeleteClip(const QString &clipId) -{ - ProjectItem *item = getItemById(clipId); - if (!item) { - kDebug() << "/// Cannot find clip to delete"; - return; - } - m_listView->blockSignals(true); - QTreeWidgetItem *newSelectedItem = m_listView->itemAbove(item); - if (!newSelectedItem) newSelectedItem = m_listView->itemBelow(item); - delete item; - m_doc->clipManager()->deleteClip(clipId); - m_listView->blockSignals(false); - if (newSelectedItem) m_listView->setCurrentItem(newSelectedItem); - else updateButtons(); -} - - -void ProjectList::editFolder(const QString folderName, const QString oldfolderName, const QString &clipId) -{ - EditFolderCommand *command = new EditFolderCommand(this, folderName, oldfolderName, clipId, false); - m_commandStack->push(command); - m_doc->setModified(true); -} - -void ProjectList::slotAddFolder() -{ - AddFolderCommand *command = new AddFolderCommand(this, i18n("Folder"), QString::number(m_doc->clipManager()->getFreeFolderId()), true); - m_commandStack->push(command); -} - -void ProjectList::slotAddFolder(const QString foldername, const QString &clipId, bool remove, bool edit) -{ - if (remove) { - FolderProjectItem *item = getFolderItemById(clipId); - if (item) { - m_doc->clipManager()->deleteFolder(clipId); - QTreeWidgetItem *newSelectedItem = m_listView->itemAbove(item); - if (!newSelectedItem) newSelectedItem = m_listView->itemBelow(item); - delete item; - if (newSelectedItem) m_listView->setCurrentItem(newSelectedItem); - else updateButtons(); - } - } else { - if (edit) { - FolderProjectItem *item = getFolderItemById(clipId); - if (item) { - m_listView->blockSignals(true); - item->setGroupName(foldername); - m_listView->blockSignals(false); - m_doc->clipManager()->addFolder(clipId, foldername); - const int children = item->childCount(); - for (int i = 0; i < children; i++) { - ProjectItem *child = static_cast (item->child(i)); - child->setProperty("groupname", foldername); - } - } - } else { - QStringList text; - text << foldername; - m_listView->blockSignals(true); - m_listView->setCurrentItem(new FolderProjectItem(m_listView, text, clipId)); - m_doc->clipManager()->addFolder(clipId, foldername); - m_listView->blockSignals(false); - } - updateButtons(); - } - m_doc->setModified(true); -} - - - -void ProjectList::deleteProjectFolder(QMap map) -{ - QMapIterator i(map); - QUndoCommand *delCommand = new QUndoCommand(); - delCommand->setText(i18n("Delete Folder")); - while (i.hasNext()) { - i.next(); - new AddFolderCommand(this, i.key(), i.value(), false, delCommand); - } - m_commandStack->push(delCommand); -} - -void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) -{ - m_listView->setEnabled(false); - if (getProperties) { - m_listView->blockSignals(true); - m_refreshed = false; - // remove file_hash so that we load all properties for the clip - QDomElement e = clip->toXML().cloneNode().toElement(); - e.removeAttribute("file_hash"); - m_infoQueue.insert(clip->getId(), e); - clip->askForAudioThumbs(); - //m_render->getFileProperties(clip->toXML(), clip->getId(), true); - } - const QString parent = clip->getProperty("groupid"); - ProjectItem *item = NULL; - if (!parent.isEmpty()) { - FolderProjectItem *parentitem = getFolderItemById(parent); - if (!parentitem) { - QStringList text; - QString groupName = clip->getProperty("groupname"); - //kDebug() << "Adding clip to new group: " << groupName; - if (groupName.isEmpty()) groupName = i18n("Folder"); - text << groupName; - parentitem = new FolderProjectItem(m_listView, text, parent); - } else { - //kDebug() << "Adding clip to existing group: " << parentitem->groupName(); - } - if (parentitem) item = new ProjectItem(parentitem, clip); - } - if (item == NULL) item = new ProjectItem(m_listView, clip); - KUrl url = clip->fileURL(); - - if (getProperties == false && !clip->getClipHash().isEmpty()) { - QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + ".png"; - if (QFile::exists(cachedPixmap)) { - QPixmap pix(cachedPixmap); - if (pix.isNull()) KIO::NetAccess::del(KUrl(cachedPixmap), this); - item->setData(0, Qt::DecorationRole, pix); - } - } -#ifdef NEPOMUK - if (!url.isEmpty() && KdenliveSettings::activate_nepomuk()) { - // if file has Nepomuk comment, use it - Nepomuk::Resource f(url.path()); - QString annotation = f.description(); - if (!annotation.isEmpty()) item->setText(1, annotation); - item->setText(2, QString::number(f.rating())); - } -#endif - // Add cut zones - QList cuts = clip->cutZones(); - if (!cuts.isEmpty()) { - for (int i = 0; i < cuts.count(); i++) { - SubProjectItem *sub = new SubProjectItem(item, cuts.at(i).zone.x(), cuts.at(i).zone.y(), cuts.at(i).description); - if (!clip->getClipHash().isEmpty()) { - QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + '#' + QString::number(cuts.at(i).zone.x()) + ".png"; - if (QFile::exists(cachedPixmap)) { - QPixmap pix(cachedPixmap); - if (pix.isNull()) KIO::NetAccess::del(KUrl(cachedPixmap), this); - sub->setData(0, Qt::DecorationRole, pix); - } - } - } - } - if (m_listView->isEnabled()) { - updateButtons(); - if (getProperties) m_listView->blockSignals(false); - } - if (getProperties && !m_queueTimer.isActive()) m_queueTimer.start(); -} - -void ProjectList::slotResetProjectList() -{ - m_listView->clear(); - emit clipSelected(NULL); - m_thumbnailQueue.clear(); - m_infoQueue.clear(); - m_refreshed = false; -} - -void ProjectList::requestClipInfo(const QDomElement xml, const QString id) -{ - m_refreshed = false; - m_infoQueue.insert(id, xml); - //if (m_infoQueue.count() == 1 || ) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); -} - -void ProjectList::slotProcessNextClipInQueue() -{ - if (m_infoQueue.isEmpty()) { - slotProcessNextThumbnail(); - return; - } - - QMap::const_iterator j = m_infoQueue.constBegin(); - if (j != m_infoQueue.constEnd()) { - const QDomElement dom = j.value(); - const QString id = j.key(); - m_infoQueue.remove(j.key()); - emit getFileProperties(dom, id, m_listView->iconSize().height(), false); - } -} - -void ProjectList::slotUpdateClip(const QString &id) -{ - ProjectItem *item = getItemById(id); - m_listView->blockSignals(true); - if (item) item->setData(0, UsageRole, QString::number(item->numReferences())); - m_listView->blockSignals(false); -} - -void ProjectList::updateAllClips() -{ - m_listView->setSortingEnabled(false); - kDebug() << "// UPDATE ALL CLPY"; - - QTreeWidgetItemIterator it(m_listView); - DocClipBase *clip; - ProjectItem *item; - m_listView->blockSignals(true); - while (*it) { - if ((*it)->type() == PROJECTSUBCLIPTYPE) { - // subitem - SubProjectItem *sub = static_cast (*it); - if (sub->data(0, Qt::DecorationRole).isNull()) { - item = static_cast ((*it)->parent()); - requestClipThumbnail(item->clipId() + '#' + QString::number(sub->zone().x())); - } - ++it; - continue; - } else if ((*it)->type() == PROJECTFOLDERTYPE) { - // folder - ++it; - continue; - } else { - item = static_cast (*it); - clip = item->referencedClip(); - if (item->referencedClip()->producer() == NULL) { - if (clip->isPlaceHolder() == false) { - requestClipInfo(clip->toXML(), clip->getId()); - } else if (!clip->isPlaceHolder()) item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - } else { - if (item->data(0, Qt::DecorationRole).isNull()) { - requestClipThumbnail(clip->getId()); - } - if (item->data(0, DurationRole).toString().isEmpty()) { - item->changeDuration(item->referencedClip()->producer()->get_playtime()); - } - } - item->setData(0, UsageRole, QString::number(item->numReferences())); - } - //qApp->processEvents(); - ++it; - } - if (!m_queueTimer.isActive()) m_queueTimer.start(); - if (m_listView->isEnabled()) m_listView->blockSignals(false); - m_listView->setSortingEnabled(true); - if (m_infoQueue.isEmpty()) slotProcessNextThumbnail(); -} - -void ProjectList::slotAddClip(const QList givenList, const QString &groupName, const QString &groupId) -{ - if (!m_commandStack) { - kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK"; - } - KUrl::List list; - if (givenList.isEmpty()) { - // Build list of mime types - QStringList mimeTypes = QStringList() << "application/x-kdenlive" << "application/x-kdenlivetitle" << "video/x-flv" << "application/vnd.rn-realmedia" << "video/x-dv" << "video/dv" << "video/x-msvideo" << "video/x-matroska" << "video/mlt-playlist" << "video/mpeg" << "video/ogg" << "video/x-ms-wmv" << "audio/x-flac" << "audio/x-matroska" << "audio/mp4" << "audio/mpeg" << "audio/x-mp3" << "audio/ogg" << "audio/x-wav" << "application/ogg" << "video/mp4" << "video/quicktime" << "image/gif" << "image/jpeg" << "image/png" << "image/x-tga" << "image/x-bmp" << "image/svg+xml" << "image/tiff" << "image/x-xcf-gimp" << "image/x-vnd.adobe.photoshop" << "image/x-pcx" << "image/x-exr"; - - QString allExtensions; - foreach(const QString& mimeType, mimeTypes) { - KMimeType::Ptr mime(KMimeType::mimeType(mimeType)); - if (mime) { - allExtensions.append(mime->patterns().join(" ")); - allExtensions.append(' '); - } - } - const QString dialogFilter = allExtensions.simplified() + ' ' + QLatin1Char('|') + i18n("All Supported Files") + "\n* " + QLatin1Char('|') + i18n("All Files"); - list = KFileDialog::getOpenUrls(KUrl("kfiledialog:///clipfolder"), dialogFilter, this); - - } else { - for (int i = 0; i < givenList.count(); i++) - list << givenList.at(i); - } - - foreach(const KUrl &file, list) { - // Check there is no folder here - KMimeType::Ptr type = KMimeType::findByUrl(file); - if (type->is("inode/directory")) { - // user dropped a folder - list.removeAll(file); - } - } - - if (list.isEmpty()) return; - - if (givenList.isEmpty()) { - QStringList groupInfo = getGroup(); - m_doc->slotAddClipList(list, groupInfo.at(0), groupInfo.at(1)); - } else m_doc->slotAddClipList(list, groupName, groupId); -} - -void ProjectList::slotRemoveInvalidClip(const QString &id, bool replace) -{ - ProjectItem *item = getItemById(id); - QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); - if (item) { - const QString path = item->referencedClip()->fileURL().path(); - if (item->referencedClip()->isPlaceHolder()) replace = false; - if (!path.isEmpty()) { - if (replace) KMessageBox::sorry(this, i18n("Clip %1
is invalid, will be removed from project.", path)); - else { - if (KMessageBox::questionYesNo(this, i18n("Clip %1
is missing or invalid. Remove it from project?", path), i18n("Invalid clip")) == KMessageBox::Yes) replace = true; - } - } - QStringList ids; - ids << id; - if (replace) emit deleteProjectClips(ids, QMap ()); - } -} - -void ProjectList::slotAddColorClip() -{ - if (!m_commandStack) { - kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK"; - } - QDialog *dia = new QDialog(this); - Ui::ColorClip_UI dia_ui; - dia_ui.setupUi(dia); - dia->setWindowTitle(i18n("Color Clip")); - dia_ui.clip_name->setText(i18n("Color Clip")); - dia_ui.clip_duration->setText(KdenliveSettings::color_duration()); - if (dia->exec() == QDialog::Accepted) { - QString color = dia_ui.clip_color->color().name(); - color = color.replace(0, 1, "0x") + "ff"; - QStringList groupInfo = getGroup(); - m_doc->slotCreateColorClip(dia_ui.clip_name->text(), color, dia_ui.clip_duration->text(), groupInfo.at(0), groupInfo.at(1)); - } - delete dia; -} - - -void ProjectList::slotAddSlideshowClip() -{ - if (!m_commandStack) { - kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK"; - } - SlideshowClip *dia = new SlideshowClip(m_timecode, this); - - if (dia->exec() == QDialog::Accepted) { - QStringList groupInfo = getGroup(); - m_doc->slotCreateSlideshowClipFile(dia->clipName(), dia->selectedPath(), dia->imageCount(), dia->clipDuration(), dia->loop(), dia->fade(), dia->lumaDuration(), dia->lumaFile(), dia->softness(), groupInfo.at(0), groupInfo.at(1)); - } - delete dia; -} - -void ProjectList::slotAddTitleClip() -{ - QStringList groupInfo = getGroup(); - m_doc->slotCreateTextClip(groupInfo.at(0), groupInfo.at(1)); -} - -void ProjectList::slotAddTitleTemplateClip() -{ - QStringList groupInfo = getGroup(); - if (!m_commandStack) { - kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK"; - } - - // Get the list of existing templates - QStringList filter; - filter << "*.kdenlivetitle"; - const QString path = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "titles/"; - QStringList templateFiles = QDir(path).entryList(filter, QDir::Files); - - QDialog *dia = new QDialog(this); - Ui::TemplateClip_UI dia_ui; - dia_ui.setupUi(dia); - for (int i = 0; i < templateFiles.size(); ++i) { - dia_ui.template_list->comboBox()->addItem(templateFiles.at(i), path + templateFiles.at(i)); - } - dia_ui.template_list->fileDialog()->setFilter("*.kdenlivetitle"); - //warning: setting base directory doesn't work?? - KUrl startDir(path); - dia_ui.template_list->fileDialog()->setUrl(startDir); - dia_ui.text_box->setHidden(true); - if (dia->exec() == QDialog::Accepted) { - QString textTemplate = dia_ui.template_list->comboBox()->itemData(dia_ui.template_list->comboBox()->currentIndex()).toString(); - if (textTemplate.isEmpty()) textTemplate = dia_ui.template_list->comboBox()->currentText(); - // Create a cloned template clip - m_doc->slotCreateTextTemplateClip(groupInfo.at(0), groupInfo.at(1), KUrl(textTemplate)); - } - delete dia; -} - -QStringList ProjectList::getGroup() const -{ - QStringList result; - QTreeWidgetItem *item = m_listView->currentItem(); - while (item && item->type() != PROJECTFOLDERTYPE) { - item = item->parent(); - } - - if (item) { - FolderProjectItem *folder = static_cast (item); - result << folder->groupName(); - result << folder->clipId(); - } else result << QString() << QString(); - return result; -} - -void ProjectList::setDocument(KdenliveDoc *doc) -{ - m_listView->blockSignals(true); - m_listView->clear(); - m_listView->setSortingEnabled(false); - emit clipSelected(NULL); - m_thumbnailQueue.clear(); - m_infoQueue.clear(); - m_refreshed = false; - m_fps = doc->fps(); - m_timecode = doc->timecode(); - m_commandStack = doc->commandStack(); - m_doc = doc; - - QMap flist = doc->clipManager()->documentFolderList(); - QMapIterator f(flist); - while (f.hasNext()) { - f.next(); - (void) new FolderProjectItem(m_listView, QStringList() << f.value(), f.key()); - } - - QList list = doc->clipManager()->documentClipList(); - for (int i = 0; i < list.count(); i++) { - slotAddClip(list.at(i), false); - } - - m_listView->blockSignals(false); - m_toolbar->setEnabled(true); - connect(m_doc->clipManager(), SIGNAL(reloadClip(const QString &)), this, SLOT(slotReloadClip(const QString &))); - connect(m_doc->clipManager(), SIGNAL(checkAllClips()), this, SLOT(updateAllClips())); -} - -QList ProjectList::documentClipList() const -{ - if (m_doc == NULL) return QList (); - return m_doc->clipManager()->documentClipList(); -} - -QDomElement ProjectList::producersList() -{ - QDomDocument doc; - QDomElement prods = doc.createElement("producerlist"); - doc.appendChild(prods); - kDebug() << "//////////// PRO LIST BUILD PRDSLIST "; - QTreeWidgetItemIterator it(m_listView); - while (*it) { - if ((*it)->type() != PROJECTCLIPTYPE) { - // subitem - ++it; - continue; - } - prods.appendChild(doc.importNode(((ProjectItem *)(*it))->toXml(), true)); - ++it; - } - return prods; -} - -void ProjectList::slotCheckForEmptyQueue() -{ - if (!m_refreshed && m_thumbnailQueue.isEmpty() && m_infoQueue.isEmpty()) { - m_refreshed = true; - emit loadingIsOver(); - emit displayMessage(QString(), -1); - m_listView->blockSignals(false); - m_listView->setEnabled(true); - updateButtons(); - } else if (!m_refreshed) QTimer::singleShot(300, this, SLOT(slotCheckForEmptyQueue())); -} - -void ProjectList::reloadClipThumbnails() -{ - kDebug() << "////////////// RELOAD CLIPS THUMBNAILS!!!"; - m_thumbnailQueue.clear(); - QTreeWidgetItemIterator it(m_listView); - while (*it) { - if ((*it)->type() != PROJECTCLIPTYPE) { - // subitem - ++it; - continue; - } - m_thumbnailQueue << ((ProjectItem *)(*it))->clipId(); - ++it; - } - QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail())); -} - -void ProjectList::requestClipThumbnail(const QString id) -{ - if (!m_thumbnailQueue.contains(id)) m_thumbnailQueue.append(id); -} - -void ProjectList::slotProcessNextThumbnail() -{ - if (m_thumbnailQueue.isEmpty() && m_infoQueue.isEmpty()) { - slotCheckForEmptyQueue(); - return; - } - if (!m_infoQueue.isEmpty()) { - //QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail())); - return; - } - if (m_thumbnailQueue.count() > 1) { - int max = m_doc->clipManager()->clipsCount(); - emit displayMessage(i18n("Loading thumbnails"), (int)(100 *(max - m_thumbnailQueue.count()) / max)); - } - slotRefreshClipThumbnail(m_thumbnailQueue.takeFirst(), false); -} - -void ProjectList::slotRefreshClipThumbnail(const QString &clipId, bool update) -{ - QTreeWidgetItem *item = getAnyItemById(clipId); - if (item) slotRefreshClipThumbnail(item, update); - else slotProcessNextThumbnail(); -} - -void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update) -{ - if (it == NULL) return; - ProjectItem *item = NULL; - bool isSubItem = false; - int frame; - if (it->type() == PROJECTFOLDERTYPE) return; - if (it->type() == PROJECTSUBCLIPTYPE) { - item = static_cast (it->parent()); - frame = static_cast (it)->zone().x(); - isSubItem = true; - } else { - item = static_cast (it); - frame = item->referencedClip()->getClipThumbFrame(); - } - - if (item) { - DocClipBase *clip = item->referencedClip(); - if (!clip) { - slotProcessNextThumbnail(); - return; - } - QPixmap pix; - int height = m_listView->iconSize().height(); - int width = (int)(height * m_render->dar()); - if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height)); - else if (clip->clipType() == IMAGE) pix = QPixmap::fromImage(KThumb::getFrame(item->referencedClip()->producer(), 0, width, height)); - else pix = item->referencedClip()->thumbProducer()->extractImage(frame, width, height); - - if (!pix.isNull()) { - m_listView->blockSignals(true); - it->setData(0, Qt::DecorationRole, pix); - if (m_listView->isEnabled()) m_listView->blockSignals(false); - if (!isSubItem) m_doc->cachePixmap(item->getClipHash(), pix); - else m_doc->cachePixmap(item->getClipHash() + '#' + QString::number(frame), pix); - } - if (update) emit projectModified(); - QTimer::singleShot(30, this, SLOT(slotProcessNextThumbnail())); - } -} - -void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata, bool replace) -{ - QString toReload; - ProjectItem *item = getItemById(clipId); - if (item && producer) { - m_listView->blockSignals(true); - item->setProperties(properties, metadata); - if (item->referencedClip()->isPlaceHolder() && producer->is_valid()) { - item->referencedClip()->setValid(); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); - toReload = clipId; - } - //Q_ASSERT_X(item->referencedClip(), "void ProjectList::slotReplyGetFileProperties", QString("Item with groupName %1 does not have a clip associated").arg(item->groupName()).toLatin1()); - item->referencedClip()->setProducer(producer, replace); - if (!replace && item->data(0, Qt::DecorationRole).isNull()) { - requestClipThumbnail(clipId); - } - //emit receivedClipDuration(clipId); - if (m_listView->isEnabled() && replace) { - // update clip in clip monitor - emit clipSelected(NULL); - emit clipSelected(item->referencedClip()); - } - /*else { - // Check if duration changed. - emit receivedClipDuration(clipId); - delete producer; - }*/ - if (m_listView->isEnabled()) m_listView->blockSignals(false); - /*if (item->icon(0).isNull()) { - requestClipThumbnail(clipId); - }*/ - } else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS..."; - int max = m_doc->clipManager()->clipsCount(); - emit displayMessage(i18n("Loading clips"), (int)(100 *(max - m_infoQueue.count()) / max)); - // small delay so that the app can display the progress info - if (item && m_infoQueue.isEmpty() && m_thumbnailQueue.isEmpty()) { - m_listView->setCurrentItem(item); - emit clipSelected(item->referencedClip()); - } - if (!toReload.isEmpty()) emit clipNeedsReload(toReload, true); - QTimer::singleShot(30, this, SLOT(slotProcessNextClipInQueue())); -} - -void ProjectList::slotReplyGetImage(const QString &clipId, const QPixmap &pix) -{ - ProjectItem *item = getItemById(clipId); - if (item && !pix.isNull()) { - m_listView->blockSignals(true); - item->setData(0, Qt::DecorationRole, pix); - m_doc->cachePixmap(item->getClipHash(), pix); - if (m_listView->isEnabled()) m_listView->blockSignals(false); - } -} - -QTreeWidgetItem *ProjectList::getAnyItemById(const QString &id) -{ - QTreeWidgetItemIterator it(m_listView); - QString lookId = id; - if (id.contains('#')) { - lookId = id.section('#', 0, 0); - } - - ProjectItem *result = NULL; - while (*it) { - if ((*it)->type() != PROJECTCLIPTYPE) { - // subitem - ++it; - continue; - } - ProjectItem *item = static_cast(*it); - if (item->clipId() == lookId) { - result = item; - break; - } - ++it; - } - if (result == NULL || !id.contains('#')) return result; - else for (int i = 0; i < result->childCount(); i++) { - SubProjectItem *sub = static_cast (result->child(i)); - if (sub && sub->zone().x() == id.section('#', 1, 1).toInt()) { - return sub; - } - } - - return NULL; -} - - -ProjectItem *ProjectList::getItemById(const QString &id) -{ - ProjectItem *item; - QTreeWidgetItemIterator it(m_listView); - while (*it) { - if ((*it)->type() != PROJECTCLIPTYPE) { - // subitem - ++it; - continue; - } - item = static_cast(*it); - if (item->clipId() == id) - return item; - ++it; - } - return NULL; -} - -FolderProjectItem *ProjectList::getFolderItemById(const QString &id) -{ - FolderProjectItem *item; - QTreeWidgetItemIterator it(m_listView); - while (*it) { - if ((*it)->type() == PROJECTFOLDERTYPE) { - item = static_cast(*it); - if (item->clipId() == id) return item; - } - ++it; - } - return NULL; -} - -void ProjectList::slotSelectClip(const QString &ix) -{ - ProjectItem *clip = getItemById(ix); - if (clip) { - m_listView->setCurrentItem(clip); - m_listView->scrollToItem(clip); - m_editAction->setEnabled(true); - m_deleteAction->setEnabled(true); - m_reloadAction->setEnabled(true); - m_transcodeAction->setEnabled(true); - if (clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) { - m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp())); - m_openAction->setEnabled(true); - } else if (clip->clipType() == AUDIO && !KdenliveSettings::defaultaudioapp().isEmpty()) { - m_openAction->setIcon(KIcon(KdenliveSettings::defaultaudioapp())); - m_openAction->setEnabled(true); - } else m_openAction->setEnabled(false); - } -} - -QString ProjectList::currentClipUrl() const -{ - ProjectItem *item; - if (!m_listView->currentItem() || m_listView->currentItem()->type() == PROJECTFOLDERTYPE) return QString(); - if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE) { - // subitem - item = static_cast (m_listView->currentItem()->parent()); - } else item = static_cast (m_listView->currentItem()); - if (item == NULL) return QString(); - return item->clipUrl().path(); -} - -KUrl::List ProjectList::getConditionalUrls(const QString &condition) const -{ - KUrl::List result; - ProjectItem *item; - QList list = m_listView->selectedItems(); - for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == PROJECTFOLDERTYPE) continue; - if (list.at(i)->type() == PROJECTSUBCLIPTYPE) { - // subitem - item = static_cast (list.at(i)->parent()); - } else item = static_cast (list.at(i)); - if (item == NULL) continue; - if (item->type() == COLOR || item->type() == SLIDESHOW || item->type() == TEXT) continue; - DocClipBase *clip = item->referencedClip(); - if (!condition.isEmpty()) { - if (condition.startsWith("vcodec") && !clip->hasVideoCodec(condition.section("=", 1, 1))) continue; - else if (condition.startsWith("acodec") && !clip->hasAudioCodec(condition.section("=", 1, 1))) continue; - } - result.append(item->clipUrl()); - } - return result; -} - -void ProjectList::regenerateTemplate(const QString &id) -{ - ProjectItem *clip = getItemById(id); - if (clip) regenerateTemplate(clip); -} - -void ProjectList::regenerateTemplate(ProjectItem *clip) -{ - //TODO: remove this unused method, only force_reload is necessary - clip->referencedClip()->producer()->set("force_reload", 1); -} - -QDomDocument ProjectList::generateTemplateXml(QString path, const QString &replaceString) -{ - QDomDocument doc; - QFile file(path); - if (!file.open(QIODevice::ReadOnly)) { - kWarning() << "ERROR, CANNOT READ: " << path; - return doc; - } - if (!doc.setContent(&file)) { - kWarning() << "ERROR, CANNOT READ: " << path; - file.close(); - return doc; - } - file.close(); - QDomNodeList texts = doc.elementsByTagName("content"); - for (int i = 0; i < texts.count(); i++) { - QString data = texts.item(i).firstChild().nodeValue(); - data.replace("%s", replaceString); - texts.item(i).firstChild().setNodeValue(data); - } - return doc; -} - - -void ProjectList::slotAddClipCut(const QString &id, int in, int out) -{ - ProjectItem *clip = getItemById(id); - if (clip == NULL) return; - if (clip->referencedClip()->hasCutZone(QPoint(in, out))) return; - AddClipCutCommand *command = new AddClipCutCommand(this, id, in, out, QString(), true, false); - m_commandStack->push(command); -} - -void ProjectList::addClipCut(const QString &id, int in, int out, const QString desc, bool newItem) -{ - ProjectItem *clip = getItemById(id); - if (clip) { - DocClipBase *base = clip->referencedClip(); - base->addCutZone(in, out); - m_listView->blockSignals(true); - SubProjectItem *sub = new SubProjectItem(clip, in, out, desc); - if (newItem && desc.isEmpty() && !m_listView->isColumnHidden(1)) { - if (!clip->isExpanded()) clip->setExpanded(true); - m_listView->editItem(sub, 1); - } - QPixmap p = clip->referencedClip()->thumbProducer()->extractImage(in, (int)(sub->sizeHint(0).height() * m_render->dar()), sub->sizeHint(0).height() - 2); - sub->setData(0, Qt::DecorationRole, p); - m_doc->cachePixmap(clip->getClipHash() + '#' + QString::number(in), p); - m_listView->blockSignals(false); - } - emit projectModified(); -} - -void ProjectList::removeClipCut(const QString &id, int in, int out) -{ - ProjectItem *clip = getItemById(id); - if (clip) { - DocClipBase *base = clip->referencedClip(); - base->removeCutZone(in, out); - SubProjectItem *sub = getSubItem(clip, QPoint(in, out)); - if (sub) { - m_listView->blockSignals(true); - delete sub; - m_listView->blockSignals(false); - } - } - emit projectModified(); -} - -SubProjectItem *ProjectList::getSubItem(ProjectItem *clip, QPoint zone) -{ - SubProjectItem *sub = NULL; - if (clip) { - for (int i = 0; i < clip->childCount(); i++) { - QTreeWidgetItem *it = clip->child(i); - if (it->type() == PROJECTSUBCLIPTYPE) { - sub = static_cast (it); - if (sub->zone() == zone) break; - else sub = NULL; - } - } - } - return sub; -} - -void ProjectList::slotUpdateClipCut(QPoint p) -{ - if (!m_listView->currentItem() || m_listView->currentItem()->type() != PROJECTSUBCLIPTYPE) return; - SubProjectItem *sub = static_cast (m_listView->currentItem()); - ProjectItem *item = static_cast (sub->parent()); - EditClipCutCommand *command = new EditClipCutCommand(this, item->clipId(), sub->zone(), p, sub->text(1), sub->text(1), true); - m_commandStack->push(command); -} - -void ProjectList::doUpdateClipCut(const QString &id, const QPoint oldzone, const QPoint zone, const QString &comment) -{ - ProjectItem *clip = getItemById(id); - SubProjectItem *sub = getSubItem(clip, oldzone); - if (sub == NULL || clip == NULL) return; - DocClipBase *base = clip->referencedClip(); - base->updateCutZone(oldzone.x(), oldzone.y(), zone.x(), zone.y(), comment); - m_listView->blockSignals(true); - sub->setZone(zone); - sub->setDescription(comment); - m_listView->blockSignals(false); - emit projectModified(); -} - -#include "projectlist.moc" diff -Nru kdenlive-0.7.7/src/projectlist.h~ kdenlive-0.7.7.1/src/projectlist.h~ --- kdenlive-0.7.7/src/projectlist.h~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/projectlist.h~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,248 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#ifndef PROJECTLIST_H -#define PROJECTLIST_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#ifdef NEPOMUK -#include -#include -#endif - -#include "definitions.h" -#include "timecode.h" -#include "kdenlivesettings.h" -#include "folderprojectitem.h" -#include "subprojectitem.h" - -namespace Mlt -{ -class Producer; -}; - -class ProjectItem; -class ProjectListView; -class Render; -class KdenliveDoc; -class DocClipBase; - -const int NameRole = Qt::UserRole; -const int DurationRole = NameRole + 1; -const int UsageRole = NameRole + 2; - -class ItemDelegate: public QItemDelegate -{ -public: - ItemDelegate(QAbstractItemView* parent = 0): QItemDelegate(parent) { - } - - /*void drawFocus(QPainter *, const QStyleOptionViewItem &, const QRect &) const { - }*/ - - void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { - if (index.column() == 0 && !index.data(DurationRole).isNull()) { - QRect r1 = option.rect; - painter->save(); - if (option.state & (QStyle::State_Selected)) { - painter->setPen(option.palette.color(QPalette::HighlightedText)); - painter->fillRect(r1, option.palette.highlight()); - } - QStyleOptionViewItemV2 opt = setOptions(index, option); - QPixmap pixmap = decoration(opt, index.data(Qt::DecorationRole)); - if ((index.flags() & (Qt::ItemIsDragEnabled)) == false) { - KIcon icon("dialog-close"); - QPainter p(&pixmap); - p.drawPixmap(1, 1, icon.pixmap(16, 16)); - p.end(); - } - QRect decorationRect = pixmap.rect(); //QRect(QPoint(0, 0), option.decorationSize).intersected(pixmap.rect()); - const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; - decorationRect.moveTo(r1.topLeft() + QPoint(0, 1)); - drawDecoration(painter, opt, decorationRect, pixmap); - int decoWidth = pixmap.width() + 2 * textMargin; - - QFont font = painter->font(); - font.setBold(true); - painter->setFont(font); - int mid = (int)((r1.height() / 2)); - r1.adjust(decoWidth, 0, 0, -mid); - QRect r2 = option.rect; - r2.adjust(decoWidth, mid, 0, 0); - painter->drawText(r1, Qt::AlignLeft | Qt::AlignBottom , index.data().toString()); - //painter->setPen(Qt::green); - font.setBold(false); - painter->setFont(font); - QString subText = index.data(DurationRole).toString(); - int usage = index.data(UsageRole).toInt(); - if (usage != 0) subText.append(QString(" (%1)").arg(usage)); - if (option.state & (QStyle::State_Selected)) painter->setPen(option.palette.color(QPalette::Mid)); - painter->drawText(r2, Qt::AlignLeft | Qt::AlignVCenter , subText); - painter->restore(); - } else if (index.column() == 2 && KdenliveSettings::activate_nepomuk()) { - if (index.data().toString().isEmpty()) { - QItemDelegate::paint(painter, option, index); - return; - } - QRect r1 = option.rect; - if (option.state & (QStyle::State_Selected)) { - painter->fillRect(r1, option.palette.highlight()); - } -#ifdef NEPOMUK - KRatingPainter::paintRating(painter, r1, Qt::AlignCenter, index.data().toInt()); -#endif - } else { - QItemDelegate::paint(painter, option, index); - } - } -}; - -class ProjectList : public QWidget -{ - Q_OBJECT - -public: - ProjectList(QWidget *parent = 0); - virtual ~ProjectList(); - - QDomElement producersList(); - void setRenderer(Render *projectRender); - void slotUpdateClipProperties(const QString &id, QMap properties); - QByteArray headerInfo() const; - void setHeaderInfo(const QByteArray &state); - void setupMenu(QMenu *addMenu, QAction *defaultAction); - void setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu); - QString currentClipUrl() const; - KUrl::List getConditionalUrls(const QString &condition) const; - void reloadClipThumbnails(); - QDomDocument generateTemplateXml(QString data, const QString &replaceString); - void cleanup(); - void trashUnusedClips(); - QList documentClipList() const; - void addClipCut(const QString &id, int in, int out, const QString desc, bool newItem); - void removeClipCut(const QString &id, int in, int out); - void focusTree() const; - SubProjectItem *getSubItem(ProjectItem *clip, QPoint zone); - void doUpdateClipCut(const QString &id, const QPoint oldzone, const QPoint zone, const QString &comment); - void deleteProjectFolder(QMap map); - void updateButtons() const; - -public slots: - void setDocument(KdenliveDoc *doc); - void updateAllClips(); - void slotReplyGetImage(const QString &clipId, const QPixmap &pix); - void slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata, bool replace); - void slotAddClip(DocClipBase *clip, bool getProperties); - void slotDeleteClip(const QString &clipId); - void slotUpdateClip(const QString &id); - void slotRefreshClipThumbnail(const QString &clipId, bool update = true); - void slotRefreshClipThumbnail(QTreeWidgetItem *item, bool update = true); - void slotRemoveInvalidClip(const QString &id, bool replace); - void slotSelectClip(const QString &ix); - void slotRemoveClip(); - void slotAddClip(const QList givenList = QList (), const QString &groupName = QString(), const QString &groupId = QString()); - void slotAddFolder(const QString foldername, const QString &clipId, bool remove, bool edit = false); - void slotResetProjectList(); - void slotOpenClip(); - void slotEditClip(); - void slotReloadClip(const QString &id = QString()); - void slotAddColorClip(); - void regenerateTemplate(const QString &id); - void slotUpdateClipCut(QPoint p); - void slotAddClipCut(const QString &id, int in, int out); - -private: - ProjectListView *m_listView; - Render *m_render; - Timecode m_timecode; - double m_fps; - QToolBar *m_toolbar; - QTimer m_queueTimer; - QMenu *m_menu; - QUndoStack *m_commandStack; - void selectItemById(const QString &clipId); - ProjectItem *getItemById(const QString &id); - QTreeWidgetItem *getAnyItemById(const QString &id); - FolderProjectItem *getFolderItemById(const QString &id); - QAction *m_editAction; - QAction *m_deleteAction; - QAction *m_openAction; - QAction *m_reloadAction; - QMenu *m_transcodeAction; - KdenliveDoc *m_doc; - ItemDelegate *m_listViewDelegate; - bool m_refreshed; - QToolButton *m_addButton; - QMap m_infoQueue; - QMap m_producerQueue; - void requestClipInfo(const QDomElement xml, const QString id); - QList m_thumbnailQueue; - void requestClipThumbnail(const QString id); - void editFolder(const QString folderName, const QString oldfolderName, const QString &clipId); - QStringList getGroup() const; - void regenerateTemplate(ProjectItem *clip); - void editClipSelection(QList list); - void adjustTranscodeActions(ProjectItem *clip) const; - -private slots: - void slotClipSelected(); - void slotAddSlideshowClip(); - void slotAddTitleClip(); - void slotAddTitleTemplateClip(); - void slotContextMenu(const QPoint &pos, QTreeWidgetItem *); - void slotAddFolder(); - /** This is triggered when a clip description has been modified */ - void slotItemEdited(QTreeWidgetItem *item, int column); - void slotUpdateClipProperties(ProjectItem *item, QMap properties); - void slotProcessNextClipInQueue(); - void slotProcessNextThumbnail(); - void slotCheckForEmptyQueue(); - void slotPauseMonitor(); - //void slotShowMenu(const QPoint &pos); - -signals: - void clipSelected(DocClipBase *, QPoint zone = QPoint()); - void getFileProperties(const QDomElement, const QString &, int pixHeight, bool); - void receivedClipDuration(const QString &); - void showClipProperties(DocClipBase *); - void showClipProperties(QList , QMap commonproperties); - void projectModified(); - void loadingIsOver(); - void displayMessage(const QString, int progress); - void clipNameChanged(const QString, const QString); - void clipNeedsReload(const QString&, bool); - void refreshClip(); - void deleteProjectClips(QStringList ids, QMap folderids); -}; - -#endif diff -Nru kdenlive-0.7.7/src/projectlistview.cpp~ kdenlive-0.7.7.1/src/projectlistview.cpp~ --- kdenlive-0.7.7/src/projectlistview.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/projectlistview.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,346 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "projectlistview.h" -#include "projectitem.h" -#include "subprojectitem.h" -#include "folderprojectitem.h" -#include "kdenlivesettings.h" - -#include -#include -#include - -#include -#include -#include - -ProjectListView::ProjectListView(QWidget *parent) : - QTreeWidget(parent), - m_dragStarted(false) -{ - setSelectionMode(QAbstractItemView::ExtendedSelection); - setDragDropMode(QAbstractItemView::DragDrop); - setDropIndicatorShown(true); - setAlternatingRowColors(true); - setDragEnabled(true); - setAcceptDrops(true); - - - setColumnCount(3); - QStringList headers; - headers << i18n("Clip") << i18n("Description") << i18n("Rating"); - setHeaderLabels(headers); - - QHeaderView* headerView = header(); - headerView->setContextMenuPolicy(Qt::CustomContextMenu); - connect(headerView, SIGNAL(customContextMenuRequested(const QPoint&)), - this, SLOT(configureColumns(const QPoint&))); - headerView->setClickable(true); - headerView->setSortIndicatorShown(true); - headerView->setMovable(false); - sortByColumn(0, Qt::AscendingOrder); - setSortingEnabled(true); - - if (!KdenliveSettings::showdescriptioncolumn()) hideColumn(1); - if (!KdenliveSettings::showratingcolumn()) hideColumn(2); -} - -ProjectListView::~ProjectListView() -{ -} - -void ProjectListView::configureColumns(const QPoint& pos) -{ - KMenu popup(this); - popup.addTitle(i18nc("@title:menu", "Columns")); - - QHeaderView* headerView = header(); - for (int i = 1; i < headerView->count(); ++i) { - const QString text = model()->headerData(i, Qt::Horizontal).toString(); - QAction* action = popup.addAction(text); - action->setCheckable(true); - action->setChecked(!headerView->isSectionHidden(i)); - action->setData(i); - } - - QAction* activatedAction = popup.exec(header()->mapToGlobal(pos)); - if (activatedAction != 0) { - const bool show = activatedAction->isChecked(); - - // remember the changed column visibility in the settings - const int columnIndex = activatedAction->data().toInt(); - switch (columnIndex) { - case 1: - KdenliveSettings::setShowdescriptioncolumn(show); - break; - case 2: - KdenliveSettings::setShowratingcolumn(show); - break; - default: - break; - } - - // apply the changed column visibility - if (show) { - showColumn(columnIndex); - } else { - hideColumn(columnIndex); - } - } -} - -// virtual -void ProjectListView::contextMenuEvent(QContextMenuEvent * event) -{ - emit requestMenu(event->globalPos(), itemAt(event->pos())); -} - -// virtual -void ProjectListView::mouseDoubleClickEvent(QMouseEvent * event) -{ - QTreeWidgetItem *it = itemAt(event->pos()); - if (!it) { - emit addClip(); - return; - } - ProjectItem *item; - if (it->type() == PROJECTFOLDERTYPE) { - if ((columnAt(event->pos().x()) == 0)) QTreeWidget::mouseDoubleClickEvent(event); - return; - } - if (it->type() == PROJECTSUBCLIPTYPE) { - // subitem - if ((columnAt(event->pos().x()) == 1)) { - QTreeWidget::mouseDoubleClickEvent(event); - return; - } - item = static_cast (it->parent()); - } else item = static_cast (it); - - if (!(item->flags() & Qt::ItemIsDragEnabled)) return; - - int column = columnAt(event->pos().x()); - if (column == 0 && (item->clipType() == SLIDESHOW || item->clipType() == TEXT || item->clipType() == COLOR)) { - QPixmap pix = qVariantValue(it->data(0, Qt::DecorationRole)); - int offset = pix.width() + indentation(); - if (item->parent()) offset += indentation(); - if ((pix.isNull() || offset < event->pos().x())) { - QTreeWidget::mouseDoubleClickEvent(event); - return; - } - } - if ((column == 1) && it->type() != PROJECTSUBCLIPTYPE) { - QTreeWidget::mouseDoubleClickEvent(event); - return; - } - emit showProperties(item->referencedClip()); -} - -// virtual -void ProjectListView::dragEnterEvent(QDragEnterEvent *event) -{ - if (event->mimeData()->hasUrls() || event->mimeData()->hasText()) { - kDebug() << "//////////////// DRAG ENTR OK"; - } - event->acceptProposedAction(); -} - -// virtual -void ProjectListView::dropEvent(QDropEvent *event) -{ - FolderProjectItem *item = NULL; - QTreeWidgetItem *it = itemAt(event->pos()); - while (it && it->type() != PROJECTFOLDERTYPE) { - it = it->parent(); - } - if (it) item = static_cast (it); - if (event->mimeData()->hasUrls()) { - QString groupName; - QString groupId; - if (item) { - groupName = item->groupName(); - groupId = item->clipId(); - } - emit addClip(event->mimeData()->urls(), groupName, groupId); - event->setDropAction(Qt::CopyAction); - event->accept(); - return; - } else if (event->mimeData()->hasFormat("kdenlive/producerslist")) { - if (item) { - //emit addClip(event->mimeData->text()); - const QList list = selectedItems(); - ProjectItem *clone; - QString parentId = item->clipId(); - foreach(QTreeWidgetItem *it, list) { - // TODO allow dragging of folders ? - if (it->type() == PROJECTCLIPTYPE) { - if (it->parent()) clone = (ProjectItem*) it->parent()->takeChild(it->parent()->indexOfChild(it)); - else clone = (ProjectItem*) takeTopLevelItem(indexOfTopLevelItem(it)); - if (clone) { - item->addChild(clone); - QMap props; - props.insert("groupname", item->groupName()); - props.insert("groupid", parentId); - clone->setProperties(props); - } - } else item = NULL; - } - } else { - // item dropped in empty zone, move it to top level - const QList list = selectedItems(); - ProjectItem *clone; - foreach(QTreeWidgetItem *it, list) { - QTreeWidgetItem *parent = it->parent(); - if (parent/* && ((ProjectItem *) it)->clipId() < 10000*/) { - kDebug() << "++ item parent: " << parent->text(1); - clone = static_cast (parent->takeChild(parent->indexOfChild(it))); - if (clone) { - addTopLevelItem(clone); - clone->clearProperty("groupname"); - clone->clearProperty("groupid"); - } - } - } - } - emit projectModified(); - } else if (event->mimeData()->hasFormat("kdenlive/clip")) { - QStringList list = QString(event->mimeData()->data("kdenlive/clip")).split(';'); - emit addClipCut(list.at(0), list.at(1).toInt(), list.at(2).toInt()); - } - event->acceptProposedAction(); -} - -// virtual -void ProjectListView::mousePressEvent(QMouseEvent *event) -{ - if (event->button() == Qt::LeftButton) { - m_DragStartPosition = event->pos(); - m_dragStarted = true; - /*QTreeWidgetItem *underMouse = itemAt(event->pos()); - if (underMouse && underMouse->isSelected()) emit focusMonitor();*/ - } - QTreeWidget::mousePressEvent(event); -} - -// virtual -void ProjectListView::mouseReleaseEvent(QMouseEvent *event) -{ - QTreeWidget::mouseReleaseEvent(event); - QTreeWidgetItem *underMouse = itemAt(event->pos()); - if (underMouse) emit focusMonitor(); -} - -// virtual -void ProjectListView::mouseMoveEvent(QMouseEvent *event) -{ - //kDebug() << "// DRAG STARTED, MOUSE MOVED: "; - if (!m_dragStarted) return; - - if ((event->pos() - m_DragStartPosition).manhattanLength() - < QApplication::startDragDistance()) - return; - - QTreeWidgetItem *it = itemAt(m_DragStartPosition); - if (!it) return; - if (it->type() == PROJECTSUBCLIPTYPE) { - // subitem - SubProjectItem *clickItem = static_cast (it); - if (clickItem && (clickItem->flags() & Qt::ItemIsDragEnabled)) { - ProjectItem *clip = static_cast (it->parent()); - QDrag *drag = new QDrag(this); - QMimeData *mimeData = new QMimeData; - - QStringList list; - list.append(clip->clipId()); - QPoint p = clickItem->zone(); - list.append(QString::number(p.x())); - list.append(QString::number(p.y())); - QByteArray data; - data.append(list.join(";").toUtf8()); - mimeData->setData("kdenlive/clip", data); - drag->setMimeData(mimeData); - drag->setPixmap(clickItem->data(0, Qt::DecorationRole).value()); - drag->setHotSpot(QPoint(0, 50)); - drag->exec(); - } - } else { - if (it && (it->flags() & Qt::ItemIsDragEnabled)) { - QDrag *drag = new QDrag(this); - QMimeData *mimeData = new QMimeData; - const QList list = selectedItems(); - QStringList ids; - foreach(const QTreeWidgetItem *item, list) { - if (item->type() == PROJECTFOLDERTYPE) { - const int children = item->childCount(); - for (int i = 0; i < children; i++) { - ids.append(static_cast (item->child(i))->clipId()); - } - } else { - const ProjectItem *clip = static_cast (item); - ids.append(clip->clipId()); - } - } - if (ids.isEmpty()) return; - QByteArray data; - data.append(ids.join(";").toUtf8()); //doc.toString().toUtf8()); - mimeData->setData("kdenlive/producerslist", data); - //mimeData->setText(ids.join(";")); //doc.toString()); - //mimeData->setImageData(image); - drag->setMimeData(mimeData); - drag->setPixmap(it->data(0, Qt::DecorationRole).value()); - drag->setHotSpot(QPoint(0, 50)); - drag->exec(); - } - //event->accept(); - } -} - -// virtual -void ProjectListView::dragMoveEvent(QDragMoveEvent * event) -{ - //event->setDropAction(Qt::MoveAction); - if (event->mimeData()->hasText()) { - event->acceptProposedAction(); - } - // stop playing because we get a crash otherwise when fetching the thumbnails - emit pauseMonitor(); -} - -QStringList ProjectListView::mimeTypes() const -{ - QStringList qstrList; - qstrList << QTreeWidget::mimeTypes(); - // list of accepted mime types for drop - qstrList.append("text/uri-list"); - qstrList.append("text/plain"); - qstrList.append("kdenlive/producerslist"); - qstrList.append("kdenlive/clip"); - return qstrList; -} - - -Qt::DropActions ProjectListView::supportedDropActions() const -{ - // returns what actions are supported when dropping - return Qt::MoveAction; -} - -#include "projectlistview.moc" diff -Nru kdenlive-0.7.7/src/renderwidget.cpp~ kdenlive-0.7.7.1/src/renderwidget.cpp~ --- kdenlive-0.7.7/src/renderwidget.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/renderwidget.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,1761 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - - -#include "renderwidget.h" -#include "kdenlivesettings.h" -#include "ui_saveprofile_ui.h" -#include "timecode.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -// #include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int GroupRole = Qt::UserRole; -const int ExtensionRole = GroupRole + 1; -const int StandardRole = GroupRole + 2; -const int RenderRole = GroupRole + 3; -const int ParamsRole = GroupRole + 4; -const int EditableRole = GroupRole + 5; -const int MetaGroupRole = GroupRole + 6; -const int ExtraRole = GroupRole + 7; - -// Running job status -const int WAITINGJOB = 0; -const int RUNNINGJOB = 1; -const int FINISHEDJOB = 2; - - -RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) : - QDialog(parent), - m_projectFolder(projectfolder), - m_blockProcessing(false) -{ - m_view.setupUi(this); - setWindowTitle(i18n("Rendering")); - m_view.buttonDelete->setIcon(KIcon("trash-empty")); - m_view.buttonDelete->setToolTip(i18n("Delete profile")); - m_view.buttonDelete->setEnabled(false); - - m_view.buttonEdit->setIcon(KIcon("document-properties")); - m_view.buttonEdit->setToolTip(i18n("Edit profile")); - m_view.buttonEdit->setEnabled(false); - - m_view.buttonSave->setIcon(KIcon("document-new")); - m_view.buttonSave->setToolTip(i18n("Create new profile")); - - m_view.buttonInfo->setIcon(KIcon("help-about")); - m_view.hide_log->setIcon(KIcon("go-down")); - - m_view.buttonFavorite->setIcon(KIcon("favorites")); - m_view.buttonFavorite->setToolTip(i18n("Copy profile to favorites")); - - if (KdenliveSettings::showrenderparams()) { - m_view.buttonInfo->setDown(true); - } else m_view.advanced_params->hide(); - - m_view.rescale_size->setInputMask("0099\\x0099"); - m_view.rescale_size->setText("320x240"); - - - QMenu *renderMenu = new QMenu(i18n("Start Rendering"), this); - QAction *renderAction = renderMenu->addAction(KIcon("video-x-generic"), i18n("Render to File")); - connect(renderAction, SIGNAL(triggered()), this, SLOT(slotPrepareExport())); - QAction *scriptAction = renderMenu->addAction(KIcon("application-x-shellscript"), i18n("Generate Script")); - connect(scriptAction, SIGNAL(triggered()), this, SLOT(slotGenerateScript())); - - m_view.buttonStart->setMenu(renderMenu); - m_view.buttonStart->setPopupMode(QToolButton::MenuButtonPopup); - m_view.buttonStart->setDefaultAction(renderAction); - m_view.buttonStart->setToolButtonStyle(Qt::ToolButtonTextOnly); - m_view.abort_job->setEnabled(false); - m_view.start_script->setEnabled(false); - m_view.delete_script->setEnabled(false); - - m_view.format_list->setAlternatingRowColors(true); - m_view.size_list->setAlternatingRowColors(true); - - parseProfiles(); - parseScriptFiles(); - - connect(m_view.start_script, SIGNAL(clicked()), this, SLOT(slotStartScript())); - connect(m_view.delete_script, SIGNAL(clicked()), this, SLOT(slotDeleteScript())); - connect(m_view.scripts_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckScript())); - connect(m_view.running_jobs, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckJob())); - connect(m_view.running_jobs, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotPlayRendering(QTreeWidgetItem *, int))); - - connect(m_view.buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel())); - - connect(m_view.buttonSave, SIGNAL(clicked()), this, SLOT(slotSaveProfile())); - connect(m_view.buttonEdit, SIGNAL(clicked()), this, SLOT(slotEditProfile())); - connect(m_view.buttonDelete, SIGNAL(clicked()), this, SLOT(slotDeleteProfile())); - connect(m_view.buttonFavorite, SIGNAL(clicked()), this, SLOT(slotCopyToFavorites())); - - connect(m_view.abort_job, SIGNAL(clicked()), this, SLOT(slotAbortCurrentJob())); - connect(m_view.start_job, SIGNAL(clicked()), this, SLOT(slotStartCurrentJob())); - connect(m_view.clean_up, SIGNAL(clicked()), this, SLOT(slotCLeanUpJobs())); - connect(m_view.hide_log, SIGNAL(clicked()), this, SLOT(slotHideLog())); - - connect(m_view.buttonClose, SIGNAL(clicked()), this, SLOT(hide())); - connect(m_view.buttonClose2, SIGNAL(clicked()), this, SLOT(hide())); - connect(m_view.buttonClose3, SIGNAL(clicked()), this, SLOT(hide())); - connect(m_view.rescale, SIGNAL(toggled(bool)), m_view.rescale_size, SLOT(setEnabled(bool))); - connect(m_view.destination_list, SIGNAL(activated(int)), this, SLOT(refreshCategory())); - connect(m_view.out_file, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButtons())); - connect(m_view.out_file, SIGNAL(urlSelected(const KUrl &)), this, SLOT(slotUpdateButtons(const KUrl &))); - connect(m_view.format_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshView())); - connect(m_view.size_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshParams())); - - connect(m_view.size_list, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(slotEditItem(QListWidgetItem *))); - - connect(m_view.render_guide, SIGNAL(clicked(bool)), this, SLOT(slotUpdateGuideBox())); - connect(m_view.render_zone, SIGNAL(clicked(bool)), this, SLOT(slotUpdateGuideBox())); - connect(m_view.render_full, SIGNAL(clicked(bool)), this, SLOT(slotUpdateGuideBox())); - - connect(m_view.guide_end, SIGNAL(activated(int)), this, SLOT(slotCheckStartGuidePosition())); - connect(m_view.guide_start, SIGNAL(activated(int)), this, SLOT(slotCheckEndGuidePosition())); - - connect(m_view.format_selection, SIGNAL(activated(int)), this, SLOT(refreshView())); - - m_view.buttonStart->setEnabled(false); - m_view.rescale_size->setEnabled(false); - m_view.guides_box->setVisible(false); - m_view.open_dvd->setVisible(false); - m_view.create_chapter->setVisible(false); - m_view.open_browser->setVisible(false); - m_view.error_box->setVisible(false); - - m_view.splitter->setStretchFactor(1, 5); - m_view.splitter->setStretchFactor(0, 2); - - m_view.out_file->setMode(KFile::File); - - m_view.running_jobs->setHeaderLabels(QStringList() << QString() << i18n("File") << i18n("Progress")); - m_jobsDelegate = new RenderViewDelegate(this); - m_view.running_jobs->setItemDelegate(m_jobsDelegate); - - QHeaderView *header = m_view.running_jobs->header(); - QFontMetrics fm = fontMetrics(); - header->setResizeMode(0, QHeaderView::Fixed); - header->resizeSection(0, 30); - header->setResizeMode(1, QHeaderView::Interactive); - header->setResizeMode(2, QHeaderView::Fixed); - header->resizeSection(1, width() * 2 / 3 - 15); - header->setResizeMode(2, QHeaderView::Interactive); - //header->setResizeMode(1, QHeaderView::Fixed); - - - m_view.scripts_list->setHeaderLabels(QStringList() << QString() << i18n("Script Files")); - m_scriptsDelegate = new RenderViewDelegate(this); - m_view.scripts_list->setItemDelegate(m_scriptsDelegate); - header = m_view.scripts_list->header(); - header->setResizeMode(0, QHeaderView::Fixed); - header->resizeSection(0, 30); - - // Find path for Kdenlive renderer - m_renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render"); - if (!QFile::exists(m_renderer)) { - m_renderer = KStandardDirs::findExe("kdenlive_render"); - if (m_renderer.isEmpty()) m_renderer = KStandardDirs::locate("exe", "kdenlive_render"); - if (m_renderer.isEmpty()) m_renderer = "kdenlive_render"; - } - - QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface(); - if (!interface || !interface->isServiceRegistered("org.kde.ksmserver") || !interface->isServiceRegistered("org.gnome.SessionManager")) { - m_view.shutdown->setEnabled(false); - } - - focusFirstVisibleItem(); -} - -RenderWidget::~RenderWidget() -{ - m_view.running_jobs->blockSignals(true); - m_view.scripts_list->blockSignals(true); - m_view.running_jobs->clear(); - m_view.scripts_list->clear(); - delete m_jobsDelegate; - delete m_scriptsDelegate; -} - -void RenderWidget::slotEditItem(QListWidgetItem *item) -{ - QString edit = item->data(EditableRole).toString(); - if (edit.isEmpty() || !edit.endsWith("customprofiles.xml")) slotSaveProfile(); - else slotEditProfile(); -} - -void RenderWidget::showInfoPanel() -{ - if (m_view.advanced_params->isVisible()) { - m_view.advanced_params->setVisible(false); - m_view.buttonInfo->setDown(false); - KdenliveSettings::setShowrenderparams(false); - } else { - m_view.advanced_params->setVisible(true); - m_view.buttonInfo->setDown(true); - KdenliveSettings::setShowrenderparams(true); - } -} - -void RenderWidget::setDocumentPath(const QString path) -{ - if (m_view.out_file->url().directory() == KUrl(m_projectFolder).directory()) { - const QString fileName = m_view.out_file->url().fileName(); - m_view.out_file->setUrl(KUrl(path + fileName)); - } - m_projectFolder = path; - parseScriptFiles(); - -} - -void RenderWidget::slotUpdateGuideBox() -{ - m_view.guides_box->setVisible(m_view.render_guide->isChecked()); -} - -void RenderWidget::slotCheckStartGuidePosition() -{ - if (m_view.guide_start->currentIndex() > m_view.guide_end->currentIndex()) - m_view.guide_start->setCurrentIndex(m_view.guide_end->currentIndex()); -} - -void RenderWidget::slotCheckEndGuidePosition() -{ - if (m_view.guide_end->currentIndex() < m_view.guide_start->currentIndex()) - m_view.guide_end->setCurrentIndex(m_view.guide_start->currentIndex()); -} - -void RenderWidget::setGuides(QDomElement guidesxml, double duration) -{ - m_view.guide_start->clear(); - m_view.guide_end->clear(); - QDomNodeList nodes = guidesxml.elementsByTagName("guide"); - if (nodes.count() > 0) { - m_view.guide_start->addItem(i18n("Beginning"), "0"); - m_view.render_guide->setEnabled(true); - m_view.create_chapter->setEnabled(true); - } else { - m_view.render_guide->setEnabled(false); - m_view.create_chapter->setEnabled(false); - } - double fps = (double) m_profile.frame_rate_num / m_profile.frame_rate_den; - for (int i = 0; i < nodes.count(); i++) { - QDomElement e = nodes.item(i).toElement(); - if (!e.isNull()) { - GenTime pos = GenTime(e.attribute("time").toDouble()); - const QString guidePos = Timecode::getStringTimecode(pos.frames(fps), fps); - m_view.guide_start->addItem(e.attribute("comment") + '/' + guidePos, e.attribute("time").toDouble()); - m_view.guide_end->addItem(e.attribute("comment") + '/' + guidePos, e.attribute("time").toDouble()); - } - } - if (nodes.count() > 0) - m_view.guide_end->addItem(i18n("End"), QString::number(duration)); -} - -/** - * Will be called when the user selects an output file via the file dialog. - * File extension will be added automatically. - */ -void RenderWidget::slotUpdateButtons(KUrl url) -{ - if (m_view.out_file->url().isEmpty()) m_view.buttonStart->setEnabled(false); - else { - updateButtons(); // This also checks whether the selected format is available - //m_view.buttonStart->setEnabled(true); - } - if (url != 0) { - QListWidgetItem *item = m_view.size_list->currentItem(); - if (!item) { - m_view.buttonStart->setEnabled(false); - return; - } - QString extension = item->data(ExtensionRole).toString(); - url = filenameWithExtension(url, extension); - m_view.out_file->setUrl(url); - } -} - -/** - * Will be called when the user changes the output file path in the text line. - * File extension must NOT be added, would make editing impossible! - */ -void RenderWidget::slotUpdateButtons() -{ - if (m_view.out_file->url().isEmpty()) m_view.buttonStart->setEnabled(false); - else updateButtons(); // This also checks whether the selected format is available - //else m_view.buttonStart->setEnabled(true); -} - -void RenderWidget::slotSaveProfile() -{ - //TODO: update to correctly use metagroups - Ui::SaveProfile_UI ui; - QDialog *d = new QDialog(this); - ui.setupUi(d); - - for (int i = 0; i < m_view.destination_list->count(); i++) - ui.destination_list->addItem(m_view.destination_list->itemIcon(i), m_view.destination_list->itemText(i), m_view.destination_list->itemData(i, Qt::UserRole)); - - ui.destination_list->setCurrentIndex(m_view.destination_list->currentIndex()); - QString dest = ui.destination_list->itemData(ui.destination_list->currentIndex(), Qt::UserRole).toString(); - - QString customGroup = m_view.format_list->currentItem()->text(); - if (customGroup.isEmpty()) customGroup = i18n("Custom"); - ui.group_name->setText(customGroup); - - ui.parameters->setText(m_view.advanced_params->toPlainText()); - ui.extension->setText(m_view.size_list->currentItem()->data(ExtensionRole).toString()); - ui.profile_name->setFocus(); - - if (d->exec() == QDialog::Accepted && !ui.profile_name->text().simplified().isEmpty()) { - QString newProfileName = ui.profile_name->text().simplified(); - QString newGroupName = ui.group_name->text().simplified(); - if (newGroupName.isEmpty()) newGroupName = i18n("Custom"); - QString newMetaGroupId = ui.destination_list->itemData(ui.destination_list->currentIndex(), Qt::UserRole).toString(); - - QDomDocument doc; - QDomElement profileElement = doc.createElement("profile"); - profileElement.setAttribute("name", newProfileName); - profileElement.setAttribute("category", newGroupName); - profileElement.setAttribute("destinationid", newMetaGroupId); - profileElement.setAttribute("extension", ui.extension->text().simplified()); - profileElement.setAttribute("args", ui.parameters->toPlainText().simplified()); - doc.appendChild(profileElement); - saveProfile(doc.documentElement()); - - parseProfiles(newMetaGroupId, newGroupName, newProfileName); - } - delete d; -} - - -void RenderWidget::saveProfile(QDomElement newprofile) -{ - QString exportFile = KStandardDirs::locateLocal("appdata", "export/customprofiles.xml"); - QDomDocument doc; - QFile file(exportFile); - doc.setContent(&file, false); - file.close(); - QDomElement documentElement; - QDomElement profiles = doc.documentElement(); - if (profiles.isNull() || profiles.tagName() != "profiles") { - doc.clear(); - profiles = doc.createElement("profiles"); - profiles.setAttribute("version", 1); - doc.appendChild(profiles); - } - int version = profiles.attribute("version", 0).toInt(); - if (version < 1) { - kDebug() << "// OLD profile version"; - doc.clear(); - profiles = doc.createElement("profiles"); - profiles.setAttribute("version", 1); - doc.appendChild(profiles); - } - - - QDomNodeList profilelist = doc.elementsByTagName("profile"); - int i = 0; - while (!profilelist.item(i).isNull()) { - // make sure a profile with same name doesn't exist - documentElement = profilelist.item(i).toElement(); - QString profileName = documentElement.attribute("name"); - if (profileName == newprofile.attribute("name")) { - // a profile with that same name already exists - bool ok; - QString newProfileName = QInputDialog::getText(this, i18n("Profile already exists"), i18n("This profile name already exists. Change the name if you don't want to overwrite it."), QLineEdit::Normal, profileName, &ok); - if (!ok) return; - if (profileName == newProfileName) { - profiles.removeChild(profilelist.item(i)); - break; - } - } - i++; - } - - profiles.appendChild(newprofile); - - //QCString save = doc.toString().utf8(); - - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile)); - return; - } - QTextStream out(&file); - out << doc.toString(); - if (file.error() != QFile::NoError) { - KMessageBox::error(this, i18n("Cannot write to file %1", exportFile)); - file.close(); - return; - } - file.close(); -} - -void RenderWidget::slotCopyToFavorites() -{ - QListWidgetItem *item = m_view.size_list->currentItem(); - if (!item) return; - QString currentGroup = m_view.format_list->currentItem()->text(); - - QString params = item->data(ParamsRole).toString(); - QString extension = item->data(ExtensionRole).toString(); - QString currentProfile = item->text(); - QDomDocument doc; - QDomElement profileElement = doc.createElement("profile"); - profileElement.setAttribute("name", currentProfile); - profileElement.setAttribute("category", i18n("Custom")); - profileElement.setAttribute("destinationid", "favorites"); - profileElement.setAttribute("extension", extension); - profileElement.setAttribute("args", params); - doc.appendChild(profileElement); - saveProfile(doc.documentElement()); - parseProfiles(m_view.destination_list->itemData(m_view.destination_list->currentIndex(), Qt::UserRole).toString(), currentGroup, currentProfile); -} - -void RenderWidget::slotEditProfile() -{ - QListWidgetItem *item = m_view.size_list->currentItem(); - if (!item) return; - QString currentGroup = m_view.format_list->currentItem()->text(); - - QString params = item->data(ParamsRole).toString(); - QString extension = item->data(ExtensionRole).toString(); - QString currentProfile = item->text(); - - Ui::SaveProfile_UI ui; - QDialog *d = new QDialog(this); - ui.setupUi(d); - - for (int i = 0; i < m_view.destination_list->count(); i++) - ui.destination_list->addItem(m_view.destination_list->itemIcon(i), m_view.destination_list->itemText(i), m_view.destination_list->itemData(i, Qt::UserRole)); - - ui.destination_list->setCurrentIndex(m_view.destination_list->currentIndex()); - QString dest = ui.destination_list->itemData(ui.destination_list->currentIndex(), Qt::UserRole).toString(); - - QString customGroup = m_view.format_list->currentItem()->text(); - if (customGroup.isEmpty()) customGroup = i18n("Custom"); - ui.group_name->setText(customGroup); - - ui.profile_name->setText(currentProfile); - ui.extension->setText(extension); - ui.parameters->setText(params); - ui.profile_name->setFocus(); - d->setWindowTitle(i18n("Edit Profile")); - if (d->exec() == QDialog::Accepted) { - slotDeleteProfile(false); - QString exportFile = KStandardDirs::locateLocal("appdata", "export/customprofiles.xml"); - QDomDocument doc; - QFile file(exportFile); - doc.setContent(&file, false); - file.close(); - QDomElement documentElement; - QDomElement profiles = doc.documentElement(); - - if (profiles.isNull() || profiles.tagName() != "profiles") { - doc.clear(); - profiles = doc.createElement("profiles"); - profiles.setAttribute("version", 1); - doc.appendChild(profiles); - } - - int version = profiles.attribute("version", 0).toInt(); - if (version < 1) { - kDebug() << "// OLD profile version"; - doc.clear(); - profiles = doc.createElement("profiles"); - profiles.setAttribute("version", 1); - doc.appendChild(profiles); - } - - QString newProfileName = ui.profile_name->text().simplified(); - QString newGroupName = ui.group_name->text().simplified(); - if (newGroupName.isEmpty()) newGroupName = i18n("Custom"); - QString newMetaGroupId = ui.destination_list->itemData(ui.destination_list->currentIndex(), Qt::UserRole).toString(); - QDomNodeList profilelist = doc.elementsByTagName("profile"); - int i = 0; - while (!profilelist.item(i).isNull()) { - // make sure a profile with same name doesn't exist - documentElement = profilelist.item(i).toElement(); - QString profileName = documentElement.attribute("name"); - if (profileName == newProfileName) { - // a profile with that same name already exists - bool ok; - newProfileName = QInputDialog::getText(this, i18n("Profile already exists"), i18n("This profile name already exists. Change the name if you don't want to overwrite it."), QLineEdit::Normal, newProfileName, &ok); - if (!ok) return; - if (profileName == newProfileName) { - profiles.removeChild(profilelist.item(i)); - break; - } - } - i++; - } - - QDomElement profileElement = doc.createElement("profile"); - profileElement.setAttribute("name", newProfileName); - profileElement.setAttribute("category", newGroupName); - profileElement.setAttribute("destinationid", newMetaGroupId); - profileElement.setAttribute("extension", ui.extension->text().simplified()); - profileElement.setAttribute("args", ui.parameters->toPlainText().simplified()); - profiles.appendChild(profileElement); - - //QCString save = doc.toString().utf8(); - delete d; - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - KMessageBox::error(this, i18n("Cannot write to file %1", exportFile)); - return; - } - QTextStream out(&file); - out << doc.toString(); - if (file.error() != QFile::NoError) { - KMessageBox::error(this, i18n("Cannot write to file %1", exportFile)); - file.close(); - return; - } - file.close(); - parseProfiles(newMetaGroupId, newGroupName, newProfileName); - } else delete d; -} - -void RenderWidget::slotDeleteProfile(bool refresh) -{ - //TODO: delete a profile installed by KNewStuff the easy way - /* - QString edit = m_view.size_list->currentItem()->data(EditableRole).toString(); - if (!edit.endsWith("customprofiles.xml")) { - // This is a KNewStuff installed file, process through KNS - KNS::Engine engine(0); - if (engine.init("kdenlive_render.knsrc")) { - KNS::Entry::List entries; - } - return; - }*/ - QString currentGroup = m_view.format_list->currentItem()->text(); - QString currentProfile = m_view.size_list->currentItem()->text(); - QString metaGroupId = m_view.destination_list->itemData(m_view.destination_list->currentIndex(), Qt::UserRole).toString(); - - QString exportFile = KStandardDirs::locateLocal("appdata", "export/customprofiles.xml"); - QDomDocument doc; - QFile file(exportFile); - doc.setContent(&file, false); - file.close(); - - QDomElement documentElement; - QDomNodeList profiles = doc.elementsByTagName("profile"); - int i = 0; - QString groupName; - QString profileName; - QString destination; - - while (!profiles.item(i).isNull()) { - documentElement = profiles.item(i).toElement(); - profileName = documentElement.attribute("name"); - groupName = documentElement.attribute("category"); - destination = documentElement.attribute("destinationid"); - - if (profileName == currentProfile && groupName == currentGroup && destination == metaGroupId) { - kDebug() << "// GOT it: " << profileName; - doc.documentElement().removeChild(profiles.item(i)); - break; - } - i++; - } - - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile)); - return; - } - QTextStream out(&file); - out << doc.toString(); - if (file.error() != QFile::NoError) { - KMessageBox::error(this, i18n("Cannot write to file %1", exportFile)); - file.close(); - return; - } - file.close(); - if (refresh) { - parseProfiles(metaGroupId, currentGroup); - focusFirstVisibleItem(); - } -} - -void RenderWidget::updateButtons() -{ - if (!m_view.size_list->currentItem() || m_view.size_list->currentItem()->isHidden()) { - m_view.buttonSave->setEnabled(false); - m_view.buttonDelete->setEnabled(false); - m_view.buttonEdit->setEnabled(false); - m_view.buttonStart->setEnabled(false); - } else { - m_view.buttonSave->setEnabled(true); - m_view.buttonStart->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty()); - QString edit = m_view.size_list->currentItem()->data(EditableRole).toString(); - if (edit.isEmpty() || !edit.endsWith("customprofiles.xml")) { - m_view.buttonDelete->setEnabled(false); - m_view.buttonEdit->setEnabled(false); - } else { - m_view.buttonDelete->setEnabled(true); - m_view.buttonEdit->setEnabled(true); - } - } -} - - -void RenderWidget::focusFirstVisibleItem() -{ - if (m_view.size_list->currentItem()) { - updateButtons(); - return; - } - m_view.size_list->setCurrentRow(0); - updateButtons(); -} - -void RenderWidget::slotPrepareExport(bool scriptExport) -{ - if (!QFile::exists(KdenliveSettings::rendererpath())) { - KMessageBox::sorry(this, i18n("Cannot find the melt program required for rendering (part of Mlt)")); - return; - } - if (m_view.play_after->isChecked() && KdenliveSettings::defaultplayerapp().isEmpty()) - KMessageBox::sorry(this, i18n("Cannot play video after rendering because the default video player application is not set.\nPlease define it in Kdenlive settings dialog.")); - QString chapterFile; - if (m_view.create_chapter->isChecked()) chapterFile = m_view.out_file->url().path() + ".dvdchapter"; - - // mantisbt 1051 - KStandardDirs::makeDir(m_view.out_file->url().directory()); - - emit prepareRenderingData(scriptExport, m_view.render_zone->isChecked(), chapterFile); -} - - -void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const QString &playlistPath, const QString &scriptPath) -{ - QListWidgetItem *item = m_view.size_list->currentItem(); - if (!item) return; - - QString dest = m_view.out_file->url().path(); - if (dest.isEmpty()) return; - - // Check whether target file has an extension. - // If not, ask whether extension should be added or not. - QString extension = item->data(ExtensionRole).toString(); - if (!dest.endsWith(extension, Qt::CaseInsensitive)) { - if (KMessageBox::questionYesNo(this, i18n("File has no extension. Add extension (%1)?", extension)) == KMessageBox::Yes) { - dest.append("." + extension); - } - } - - QFile f(dest); - if (f.exists()) { - if (KMessageBox::warningYesNo(this, i18n("Output file already exists. Do you want to overwrite it?")) != KMessageBox::Yes) - return; - } - - QStringList overlayargs; - if (m_view.tc_overlay->isChecked()) { - QString filterFile = KStandardDirs::locate("appdata", "metadata.properties"); - overlayargs << "meta.attr.timecode=1" << "meta.attr.timecode.markup=#timecode"; - overlayargs << "-attach" << "data_feed:attr_check" << "-attach"; - overlayargs << "data_show:" + filterFile << "_loader=1" << "dynamic=1"; - } - - QStringList render_process_args; - - if (!scriptExport) render_process_args << "-erase"; - if (KdenliveSettings::usekuiserver()) render_process_args << "-kuiserver"; - - double guideStart = 0; - double guideEnd = 0; - - if (m_view.render_zone->isChecked()) render_process_args << "in=" + QString::number(zoneIn) << "out=" + QString::number(zoneOut); - else if (m_view.render_guide->isChecked()) { - double fps = (double) m_profile.frame_rate_num / m_profile.frame_rate_den; - guideStart = m_view.guide_start->itemData(m_view.guide_start->currentIndex()).toDouble(); - guideEnd = m_view.guide_end->itemData(m_view.guide_end->currentIndex()).toDouble(); - render_process_args << "in=" + QString::number(GenTime(guideStart).frames(fps)) << "out=" + QString::number(GenTime(guideEnd).frames(fps)); - } - - if (!overlayargs.isEmpty()) render_process_args << "preargs=" + overlayargs.join(" "); - - render_process_args << KdenliveSettings::rendererpath() << m_profile.path << item->data(RenderRole).toString(); - if (m_view.play_after->isChecked()) render_process_args << KdenliveSettings::KdenliveSettings::defaultplayerapp(); - else render_process_args << "-"; - - QString renderArgs = m_view.advanced_params->toPlainText().simplified(); - - // Adjust frame scale - int width; - int height; - if (m_view.rescale->isChecked() && m_view.rescale->isEnabled()) { - width = m_view.rescale_size->text().section('x', 0, 0).toInt(); - height = m_view.rescale_size->text().section('x', 1, 1).toInt(); - } else { - width = m_profile.width; - height = m_profile.height; - } - renderArgs.replace("%dar", '@' + QString::number(m_profile.display_aspect_num) + '/' + QString::number(m_profile.display_aspect_den)); - - // Adjust scanning - if (m_view.scanning_list->currentIndex() == 1) renderArgs.append(" progressive=1"); - else if (m_view.scanning_list->currentIndex() == 2) renderArgs.append(" progressive=0"); - - // disable audio if requested - if (!m_view.export_audio->isChecked()) - renderArgs.append(" an=1 "); - - // Check if the rendering profile is different from project profile, - // in which case we need to use the producer_comsumer from MLT - QString std = renderArgs; - QString destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString(); - const QString currentSize = QString::number(width) + 'x' + QString::number(height); - QString subsize = currentSize; - if (std.startsWith("s=")) { - subsize = std.section(' ', 0, 0).toLower(); - subsize = subsize.section("=", 1, 1); - } else if (std.contains(" s=")) { - subsize = std.section(" s=", 1, 1); - subsize = subsize.section(' ', 0, 0).toLower(); - } else if (destination != "audioonly" && m_view.rescale->isChecked() && m_view.rescale->isEnabled()) { - subsize = QString(" s=%1x%2").arg(width).arg(height); - // Add current size parameter - renderArgs.append(subsize); - } - bool resizeProfile = (subsize != currentSize); - QStringList paramsList = renderArgs.split(" ", QString::SkipEmptyParts); - for (int i = 0; i < paramsList.count(); i++) { - if (paramsList.at(i).startsWith("profile=")) { - if (paramsList.at(i).section('=', 1) != m_profile.path) resizeProfile = true; - break; - } - } - - if (resizeProfile) render_process_args << "consumer:" + playlistPath; - else render_process_args << playlistPath; - render_process_args << dest; - render_process_args << paramsList; - - QString group = m_view.size_list->currentItem()->data(MetaGroupRole).toString(); - - QStringList renderParameters; - renderParameters << dest << item->data(RenderRole).toString() << renderArgs.simplified(); - renderParameters << QString::number(zoneIn) << QString::number(zoneOut) << QString::number(m_view.play_after->isChecked()); - renderParameters << QString::number(guideStart) << QString::number(guideEnd) << QString::number(resizeProfile); - - QString scriptName; - if (scriptExport) { - // Generate script file - QFile file(scriptPath); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - KMessageBox::error(this, i18n("Cannot write to file %1", scriptPath)); - return; - } - QTextStream outStream(&file); - outStream << "#! /bin/sh" << "\n" << "\n"; - outStream << "SOURCE=" << "\"" + playlistPath + "\"" << "\n"; - outStream << "TARGET=" << "\"" + dest + "\"" << "\n"; - outStream << "RENDERER=" << "\"" + m_renderer + "\"" << "\n"; - outStream << "MELT=" << "\"" + render_process_args.takeFirst() + "\"" << "\n"; - outStream << "PARAMETERS=" << "\"" + render_process_args.join(" ") + "\"" << "\n"; - outStream << "$RENDERER $MELT $PARAMETERS" << "\n" << "\n"; - if (file.error() != QFile::NoError) { - KMessageBox::error(this, i18n("Cannot write to file %1", scriptPath)); - file.close(); - return; - } - file.close(); - QFile::setPermissions(scriptPath, file.permissions() | QFile::ExeUser); - - QTimer::singleShot(400, this, SLOT(parseScriptFiles())); - m_view.tabWidget->setCurrentIndex(2); - return; - } - renderParameters << scriptName; - m_view.tabWidget->setCurrentIndex(1); - - // Save rendering profile to document - emit selectedRenderProfile(m_view.size_list->currentItem()->data(MetaGroupRole).toString(), m_view.size_list->currentItem()->data(GroupRole).toString(), m_view.size_list->currentItem()->text(), dest); - - // insert item in running jobs list - QTreeWidgetItem *renderItem; - QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); - if (!existing.isEmpty()) { - renderItem = existing.at(0); - if (renderItem->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) { - KMessageBox::information(this, i18n("There is already a job writing file:
%1
Abort the job if you want to overwrite it...", dest), i18n("Already running")); - return; - } - renderItem->setData(1, Qt::UserRole + 4, QString()); - } else { - renderItem = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString()); - } - renderItem->setData(1, Qt::UserRole + 2, WAITINGJOB); - renderItem->setIcon(0, KIcon("media-playback-pause")); - renderItem->setData(1, Qt::UserRole, i18n("Waiting...")); - renderItem->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2)); - renderItem->setData(1, Qt::UserRole + 1, QTime::currentTime()); - - // Set rendering type - if (group == "dvd") { - if (m_view.open_dvd->isChecked()) { - renderItem->setData(0, Qt::UserRole, group); - if (renderArgs.contains("profile=")) { - // rendering profile contains an MLT profile, so pass it to the running jog item, useful for dvd - QString prof = renderArgs.section("profile=", 1, 1); - prof = prof.section(' ', 0, 0); - kDebug() << "// render profile: " << prof; - renderItem->setData(0, Qt::UserRole + 1, prof); - } - } - } else { - if (group == "websites" && m_view.open_browser->isChecked()) { - renderItem->setData(0, Qt::UserRole, group); - // pass the url - QString url = m_view.size_list->currentItem()->data(ExtraRole).toString(); - renderItem->setData(0, Qt::UserRole + 1, url); - } - } - renderItem->setData(1, Qt::UserRole + 3, render_process_args); - checkRenderStatus(); -} - -void RenderWidget::checkRenderStatus() -{ - // check if we have a job waiting to render - if (m_blockProcessing) return; - QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0); - while (item) { - if (item->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) return; - item = m_view.running_jobs->itemBelow(item); - } - item = m_view.running_jobs->topLevelItem(0); - bool waitingJob = false; - while (item) { - if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) { - item->setData(1, Qt::UserRole + 1, QTime::currentTime()); - waitingJob = true; - startRendering(item); - break; - } - item = m_view.running_jobs->itemBelow(item); - } - if (waitingJob == false && m_view.shutdown->isChecked()) emit shutdown(); -} - -void RenderWidget::startRendering(QTreeWidgetItem *item) -{ - if (item->data(1, Qt::UserRole + 4).isNull()) { - // Normal render process - if (QProcess::startDetached(m_renderer, item->data(1, Qt::UserRole + 3).toStringList()) == false) { - item->setData(1, Qt::UserRole + 2, FINISHEDJOB); - item->setData(1, Qt::UserRole, i18n("Rendering crashed")); - item->setIcon(0, KIcon("dialog-close")); - item->setData(2, Qt::UserRole, 100); - } else KNotification::event("RenderStarted", i18n("Rendering %1 started", item->text(1)), QPixmap(), this); - } else { - // Script item - if (QProcess::startDetached(item->data(1, Qt::UserRole + 3).toString()) == false) { - item->setData(1, Qt::UserRole + 2, FINISHEDJOB); - item->setData(1, Qt::UserRole, i18n("Rendering crashed")); - item->setIcon(0, KIcon("dialog-close")); - item->setData(2, Qt::UserRole, 100); - } - } -} - -int RenderWidget::waitingJobsCount() const -{ - int count = 0; - QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0); - while (item) { - if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) count++; - item = m_view.running_jobs->itemBelow(item); - } - return count; -} - -void RenderWidget::setProfile(MltVideoProfile profile) -{ - m_profile = profile; - //WARNING: this way to tell the video standard is a bit hackish... - if (m_profile.description.contains("pal", Qt::CaseInsensitive) || m_profile.description.contains("25", Qt::CaseInsensitive) || m_profile.description.contains("50", Qt::CaseInsensitive)) m_view.format_selection->setCurrentIndex(0); - else m_view.format_selection->setCurrentIndex(1); - m_view.scanning_list->setCurrentIndex(0); - refreshView(); -} - -void RenderWidget::refreshCategory() -{ - m_view.format_list->blockSignals(true); - m_view.format_list->clear(); - QListWidgetItem *sizeItem; - - QString destination; - if (m_view.destination_list->currentIndex() > 0) - destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString(); - - - if (destination == "dvd") { - m_view.open_dvd->setVisible(true); - m_view.create_chapter->setVisible(true); - } else { - m_view.open_dvd->setVisible(false); - m_view.create_chapter->setVisible(false); - } - if (destination == "websites") m_view.open_browser->setVisible(true); - else m_view.open_browser->setVisible(false); - if (!destination.isEmpty() && QString("dvd websites audioonly").contains(destination)) - m_view.rescale->setEnabled(false); - else m_view.rescale->setEnabled(true); - // hide groups that are not in the correct destination - for (int i = 0; i < m_renderCategory.count(); i++) { - sizeItem = m_renderCategory.at(i); - if (sizeItem->data(MetaGroupRole).toString() == destination) { - m_view.format_list->addItem(sizeItem->clone()); - //kDebug() << "// SET GRP:: " << sizeItem->text() << ", METY:" << sizeItem->data(MetaGroupRole).toString(); - } - } - - // activate first visible item - QListWidgetItem * item = m_view.format_list->currentItem(); - if (!item) { - m_view.format_list->setCurrentRow(0); - item = m_view.format_list->currentItem(); - } - if (!item) { - m_view.format_list->setEnabled(false); - m_view.size_list->setEnabled(false); - m_view.size_list->blockSignals(false); - m_view.format_list->blockSignals(false); - return; - } else { - m_view.format_list->setEnabled(true); - m_view.size_list->setEnabled(true); - } - - if (m_view.format_list->count() > 1) m_view.format_list->setVisible(true); - else m_view.format_list->setVisible(false); - refreshView(); -} - -void RenderWidget::refreshView() -{ - if (!m_view.format_list->currentItem()) return; - m_view.size_list->blockSignals(true); - m_view.size_list->clear(); - QListWidgetItem *sizeItem; - QString std; - QString group = m_view.format_list->currentItem()->text(); - QString destination; - if (m_view.destination_list->currentIndex() > 0) - destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString(); - KIcon brokenIcon("dialog-close"); - - const QStringList formatsList = KdenliveSettings::supportedformats(); - const QStringList vcodecsList = KdenliveSettings::videocodecs(); - const QStringList acodecsList = KdenliveSettings::audiocodecs(); - - KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window); - const QColor disabled = scheme.foreground(KColorScheme::InactiveText).color(); - const QColor disabledbg = scheme.background(KColorScheme::NegativeBackground).color(); - - - for (int i = 0; i < m_renderItems.count(); i++) { - sizeItem = m_renderItems.at(i); - QListWidgetItem *dupItem = NULL; - if ((sizeItem->data(GroupRole).toString() == group || sizeItem->data(GroupRole).toString().isEmpty()) && sizeItem->data(MetaGroupRole).toString() == destination) { - std = sizeItem->data(StandardRole).toString(); - if (!std.isEmpty()) { - if (std.contains("PAL", Qt::CaseInsensitive) && m_view.format_selection->currentIndex() == 0) dupItem = sizeItem->clone(); - else if (std.contains("NTSC", Qt::CaseInsensitive) && m_view.format_selection->currentIndex() == 1) dupItem = sizeItem->clone(); - } else { - dupItem = sizeItem->clone(); - } - - if (dupItem) { - m_view.size_list->addItem(dupItem); - // Make sure the selected profile uses an installed avformat codec / format - std = dupItem->data(ParamsRole).toString(); - if (!formatsList.isEmpty()) { - QString format; - if (std.startsWith("f=")) format = std.section("f=", 1, 1); - else if (std.contains(" f=")) format = std.section(" f=", 1, 1); - if (!format.isEmpty()) { - format = format.section(' ', 0, 0).toLower(); - if (!formatsList.contains(format)) { - kDebug() << "***** UNSUPPORTED F: " << format; - //sizeItem->setHidden(true); - //sizeItem->setFlags(Qt::ItemIsSelectable); - dupItem->setToolTip(i18n("Unsupported video format: %1", format)); - dupItem->setIcon(brokenIcon); - dupItem->setForeground(disabled); - } - } - } - if (!acodecsList.isEmpty()) { - QString format; - if (std.startsWith("acodec=")) format = std.section("acodec=", 1, 1); - else if (std.contains(" acodec=")) format = std.section(" acodec=", 1, 1); - if (!format.isEmpty()) { - format = format.section(' ', 0, 0).toLower(); - if (!acodecsList.contains(format)) { - kDebug() << "***** UNSUPPORTED ACODEC: " << format; - //sizeItem->setHidden(true); - //sizeItem->setFlags(Qt::ItemIsSelectable); - dupItem->setToolTip(i18n("Unsupported audio codec: %1", format)); - dupItem->setIcon(brokenIcon); - dupItem->setForeground(disabled); - dupItem->setBackground(disabledbg); - } - } - } - if (!vcodecsList.isEmpty()) { - QString format; - if (std.startsWith("vcodec=")) format = std.section("vcodec=", 1, 1); - else if (std.contains(" vcodec=")) format = std.section(" vcodec=", 1, 1); - if (!format.isEmpty()) { - format = format.section(' ', 0, 0).toLower(); - if (!vcodecsList.contains(format)) { - kDebug() << "***** UNSUPPORTED VCODEC: " << format; - //sizeItem->setHidden(true); - //sizeItem->setFlags(Qt::ItemIsSelectable); - dupItem->setToolTip(i18n("Unsupported video codec: %1", format)); - dupItem->setIcon(brokenIcon); - dupItem->setForeground(disabled); - } - } - } - } - } - } - // m_view.size_list->sortItems(); - focusFirstVisibleItem(); - m_view.size_list->blockSignals(false); - m_view.format_list->blockSignals(false); - refreshParams(); -} - -KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension) -{ - if (url.isEmpty()) url = KUrl(m_projectFolder); - QString directory = url.directory(KUrl::AppendTrailingSlash | KUrl::ObeyTrailingSlash); - QString filename = url.fileName(KUrl::ObeyTrailingSlash); - QString ext; - - if (extension.at(0) == '.') ext = extension; - else ext = '.' + extension; - - if (filename.isEmpty()) filename = i18n("untitled"); - - int pos = filename.lastIndexOf('.'); - if (pos == 0) filename.append(ext); - else { - if (!filename.endsWith(ext, Qt::CaseInsensitive)) { - filename = filename.left(pos) + ext; - } - } - - return KUrl(directory + filename); -} - - -/** - * Called when a new format or size has been selected. - */ -void RenderWidget::refreshParams() -{ - // Format not available (e.g. codec not installed); Disable start button - QListWidgetItem *item = m_view.size_list->currentItem(); - if (!item || item->isHidden()) { - m_view.advanced_params->clear(); - m_view.buttonStart->setEnabled(false); - return; - } - QString params = item->data(ParamsRole).toString(); - QString extension = item->data(ExtensionRole).toString(); - m_view.advanced_params->setPlainText(params); - QString destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString(); - if (params.contains(" s=") || destination == "audioonly") { - // profile has a fixed size, do not allow resize - m_view.rescale->setEnabled(false); - m_view.rescale_size->setEnabled(false); - } else { - m_view.rescale->setEnabled(true); - m_view.rescale_size->setEnabled(true); - } - KUrl url = filenameWithExtension(m_view.out_file->url(), extension); - m_view.out_file->setUrl(url); -// if (!url.isEmpty()) { -// QString path = url.path(); -// int pos = path.lastIndexOf('.') + 1; -// if (pos == 0) path.append('.' + extension); -// else path = path.left(pos) + extension; -// m_view.out_file->setUrl(KUrl(path)); -// } else { -// m_view.out_file->setUrl(KUrl(QDir::homePath() + "/untitled." + extension)); -// } - m_view.out_file->setFilter("*." + extension); - QString edit = item->data(EditableRole).toString(); - if (edit.isEmpty() || !edit.endsWith("customprofiles.xml")) { - m_view.buttonDelete->setEnabled(false); - m_view.buttonEdit->setEnabled(false); - } else { - m_view.buttonDelete->setEnabled(true); - m_view.buttonEdit->setEnabled(true); - } - - m_view.buttonStart->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty()); -} - -void RenderWidget::reloadProfiles() -{ - parseProfiles(); -} - -void RenderWidget::parseProfiles(QString meta, QString group, QString profile) -{ - m_view.size_list->blockSignals(true); - m_view.format_list->blockSignals(true); - m_view.size_list->clear(); - m_view.format_list->clear(); - m_view.destination_list->clear(); - qDeleteAll(m_renderItems); - qDeleteAll(m_renderCategory); - m_renderItems.clear(); - m_renderCategory.clear(); - m_view.destination_list->addItem(KIcon("video-x-generic"), i18n("File rendering")); - m_view.destination_list->addItem(KIcon("favorites"), i18n("Favorites"), "favorites"); - m_view.destination_list->addItem(KIcon("media-optical"), i18n("DVD"), "dvd"); - m_view.destination_list->addItem(KIcon("audio-x-generic"), i18n("Audio only"), "audioonly"); - m_view.destination_list->addItem(KIcon("applications-internet"), i18n("Web sites"), "websites"); - m_view.destination_list->addItem(KIcon("applications-multimedia"), i18n("Media players"), "mediaplayers"); - m_view.destination_list->addItem(KIcon("drive-harddisk"), i18n("Lossless / HQ"), "lossless"); - m_view.destination_list->addItem(KIcon("pda"), i18n("Mobile devices"), "mobile"); - - QString exportFile = KStandardDirs::locate("appdata", "export/profiles.xml"); - parseFile(exportFile, false); - - - QString exportFolder = KStandardDirs::locateLocal("appdata", "export/"); - QDir directory = QDir(exportFolder); - QStringList filter; - filter << "*.xml"; - QStringList fileList = directory.entryList(filter, QDir::Files); - // We should parse customprofiles.xml in last position, so that user profiles - // can also override profiles installed by KNewStuff - fileList.removeAll("customprofiles.xml"); - foreach(const QString &filename, fileList) - parseFile(exportFolder + filename, true); - if (QFile::exists(exportFolder + "customprofiles.xml")) parseFile(exportFolder + "customprofiles.xml", true); - - if (!meta.isEmpty()) { - m_view.destination_list->blockSignals(true); - m_view.destination_list->setCurrentIndex(m_view.destination_list->findData(meta)); - m_view.destination_list->blockSignals(false); - } - refreshCategory(); - QList child; - if (!group.isEmpty()) child = m_view.format_list->findItems(group, Qt::MatchExactly); - if (!child.isEmpty()) { - for (int i = 0; i < child.count(); i++) { - if (child.at(i)->data(MetaGroupRole).toString() == meta) { - m_view.format_list->setCurrentItem(child.at(i)); - break; - } - } - } - child.clear(); - m_view.size_list->blockSignals(false); - m_view.format_list->blockSignals(false); - if (!profile.isEmpty()) child = m_view.size_list->findItems(profile, Qt::MatchExactly); - if (!child.isEmpty()) m_view.size_list->setCurrentItem(child.at(0)); -} - -void RenderWidget::parseFile(QString exportFile, bool editable) -{ - kDebug() << "// Parsing file: " << exportFile; - kDebug() << "------------------------------"; - QDomDocument doc; - QFile file(exportFile); - doc.setContent(&file, false); - file.close(); - QDomElement documentElement; - QDomElement profileElement; - QString extension; - QDomNodeList groups = doc.elementsByTagName("group"); - QListWidgetItem *item = NULL; - const QStringList acodecsList = KdenliveSettings::audiocodecs(); - bool replaceVorbisCodec = false; - if (!acodecsList.contains("vorbis") && acodecsList.contains("libvorbis")) replaceVorbisCodec = true; - bool replaceLibfaacCodec = false; - if (!acodecsList.contains("aac") && acodecsList.contains("libfaac")) replaceLibfaacCodec = true; - - - if (editable || groups.count() == 0) { - QDomElement profiles = doc.documentElement(); - if (editable && profiles.attribute("version", 0).toInt() < 1) { - kDebug() << "// OLD profile version"; - // this is an old profile version, update it - QDomDocument newdoc; - QDomElement newprofiles = newdoc.createElement("profiles"); - newprofiles.setAttribute("version", 1); - newdoc.appendChild(newprofiles); - QDomNodeList profilelist = doc.elementsByTagName("profile"); - for (int i = 0; i < profilelist.count(); i++) { - QString category = i18n("Custom"); - QString extension; - QDomNode parent = profilelist.at(i).parentNode(); - if (!parent.isNull()) { - QDomElement parentNode = parent.toElement(); - if (parentNode.hasAttribute("name")) category = parentNode.attribute("name"); - extension = parentNode.attribute("extension"); - } - profilelist.at(i).toElement().setAttribute("category", category); - if (!extension.isEmpty()) profilelist.at(i).toElement().setAttribute("extension", extension); - QDomNode n = profilelist.at(i).cloneNode(); - newprofiles.appendChild(newdoc.importNode(n, true)); - } - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile)); - return; - } - QTextStream out(&file); - out << newdoc.toString(); - file.close(); - parseFile(exportFile, editable); - return; - } - - QDomNode node = doc.elementsByTagName("profile").at(0); - if (node.isNull()) { - kDebug() << "// Export file: " << exportFile << " IS BROKEN"; - return; - } - int count = 1; - while (!node.isNull()) { - QDomElement profile = node.toElement(); - QString profileName = profile.attribute("name"); - QString standard = profile.attribute("standard"); - QString params = profile.attribute("args"); - - if (replaceVorbisCodec && params.contains("acodec=vorbis")) { - // replace vorbis with libvorbis - params = params.replace("vorbis", "libvorbis"); - } - if (replaceLibfaacCodec && params.contains("acodec=aac")) { - // replace libfaac with aac - params = params.replace("aac", "libfaac"); - } - - QString category = profile.attribute("category", i18n("Custom")); - QString dest = profile.attribute("destinationid"); - QString prof_extension = profile.attribute("extension"); - if (!prof_extension.isEmpty()) extension = prof_extension; - bool exists = false; - for (int j = 0; j < m_renderCategory.count(); j++) { - if (m_renderCategory.at(j)->text() == category && m_renderCategory.at(j)->data(MetaGroupRole) == dest) { - exists = true; - break; - } - } - - if (!exists) { - QListWidgetItem *itemcat = new QListWidgetItem(category); - itemcat->setData(MetaGroupRole, dest); - m_renderCategory.append(itemcat); - } - - // Check if item with same name already exists and replace it, - // allowing to override default profiles - - - for (int j = 0; j < m_renderItems.count(); j++) { - if (m_renderItems.at(j)->text() == profileName && m_renderItems.at(j)->data(MetaGroupRole) == dest) { - QListWidgetItem *duplicate = m_renderItems.takeAt(j); - delete duplicate; - j--; - } - } - - item = new QListWidgetItem(profileName); // , m_view.size_list - //kDebug() << "// ADDINg item with name: " << profileName << ", GRP" << category << ", DEST:" << dest ; - item->setData(GroupRole, category); - item->setData(MetaGroupRole, dest); - item->setData(ExtensionRole, extension); - item->setData(RenderRole, "avformat"); - item->setData(StandardRole, standard); - item->setData(ParamsRole, params); - if (profile.hasAttribute("url")) item->setData(ExtraRole, profile.attribute("url")); - if (editable) { - item->setData(EditableRole, exportFile); - if (exportFile.endsWith("customprofiles.xml")) item->setIcon(KIcon("emblem-favorite")); - else item->setIcon(KIcon("applications-internet")); - } - m_renderItems.append(item); - node = doc.elementsByTagName("profile").at(count); - count++; - } - return; - } - - int i = 0; - QString groupName; - QString profileName; - - QString prof_extension; - QString renderer; - QString params; - QString standard; - KIcon icon; - - while (!groups.item(i).isNull()) { - documentElement = groups.item(i).toElement(); - QDomNode gname = documentElement.elementsByTagName("groupname").at(0); - QString metagroupName; - QString metagroupId; - if (!gname.isNull()) { - metagroupName = gname.firstChild().nodeValue(); - metagroupId = gname.toElement().attribute("id"); - - if (!metagroupName.isEmpty() && m_view.destination_list->findData(metagroupId) == -1) { - if (metagroupId == "dvd") icon = KIcon("media-optical"); - else if (metagroupId == "audioonly") icon = KIcon("audio-x-generic"); - else if (metagroupId == "websites") icon = KIcon("applications-internet"); - else if (metagroupId == "mediaplayers") icon = KIcon("applications-multimedia"); - else if (metagroupId == "lossless") icon = KIcon("drive-harddisk"); - else if (metagroupId == "mobile") icon = KIcon("pda"); - m_view.destination_list->addItem(icon, i18n(metagroupName.toUtf8().data()), metagroupId); - } - } - groupName = documentElement.attribute("name", i18n("Custom")); - extension = documentElement.attribute("extension", QString()); - renderer = documentElement.attribute("renderer", QString()); - bool exists = false; - for (int j = 0; j < m_renderCategory.count(); j++) { - if (m_renderCategory.at(j)->text() == groupName && m_renderCategory.at(j)->data(MetaGroupRole) == metagroupId) { - exists = true; - break; - } - } - if (!exists) { - QListWidgetItem *itemcat = new QListWidgetItem(groupName); //, m_view.format_list); - itemcat->setData(MetaGroupRole, metagroupId); - m_renderCategory.append(itemcat); - } - - QDomNode n = groups.item(i).firstChild(); - while (!n.isNull()) { - if (n.toElement().tagName() != "profile") { - n = n.nextSibling(); - continue; - } - profileElement = n.toElement(); - profileName = profileElement.attribute("name"); - standard = profileElement.attribute("standard"); - params = profileElement.attribute("args"); - - if (replaceVorbisCodec && params.contains("acodec=vorbis")) { - // replace vorbis with libvorbis - params = params.replace("vorbis", "libvorbis"); - } - if (replaceLibfaacCodec && params.contains("acodec=aac")) { - // replace libfaac with aac - params = params.replace("aac", "libfaac"); - } - - prof_extension = profileElement.attribute("extension"); - if (!prof_extension.isEmpty()) extension = prof_extension; - item = new QListWidgetItem(profileName); //, m_view.size_list); - item->setData(GroupRole, groupName); - item->setData(MetaGroupRole, metagroupId); - item->setData(ExtensionRole, extension); - item->setData(RenderRole, renderer); - item->setData(StandardRole, standard); - item->setData(ParamsRole, params); - if (profileElement.hasAttribute("url")) item->setData(ExtraRole, profileElement.attribute("url")); - if (editable) item->setData(EditableRole, exportFile); - m_renderItems.append(item); - n = n.nextSibling(); - } - - i++; - } -} - -void RenderWidget::setRenderJob(const QString &dest, int progress) -{ - QTreeWidgetItem *item; - QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); - if (!existing.isEmpty()) item = existing.at(0); - else { - item = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString()); - item->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2)); - if (progress == 0) { - item->setData(1, Qt::UserRole + 2, WAITINGJOB); - item->setIcon(0, KIcon("media-playback-pause")); - item->setData(1, Qt::UserRole, i18n("Waiting...")); - } - } - item->setData(2, Qt::UserRole, progress); - item->setData(1, Qt::UserRole + 2, RUNNINGJOB); - if (progress == 0) { - item->setIcon(0, KIcon("system-run")); - item->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2)); - item->setData(1, Qt::UserRole + 1, QTime::currentTime()); - slotCheckJob(); - } else { - QTime startTime = item->data(1, Qt::UserRole + 1).toTime(); - int seconds = startTime.secsTo(QTime::currentTime());; - const QString t = i18n("Estimated time %1", QTime().addSecs(seconds * (100 - progress) / progress).toString("hh:mm:ss")); - item->setData(1, Qt::UserRole, t); - } -} - -void RenderWidget::setRenderStatus(const QString &dest, int status, const QString &error) -{ - QTreeWidgetItem *item; - QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); - if (!existing.isEmpty()) item = existing.at(0); - else { - item = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString()); - item->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2)); - } - item->setData(1, Qt::UserRole + 2, FINISHEDJOB); - if (status == -1) { - // Job finished successfully - item->setIcon(0, KIcon("dialog-ok")); - item->setData(2, Qt::UserRole, 100); - QTime startTime = item->data(1, Qt::UserRole + 1).toTime(); - int seconds = startTime.secsTo(QTime::currentTime()); - const QTime tm = QTime().addSecs(seconds); - const QString t = i18n("Rendering finished in %1", tm.toString("hh:mm:ss")); - item->setData(1, Qt::UserRole, t); - QString itemGroup = item->data(0, Qt::UserRole).toString(); - if (itemGroup == "dvd") { - emit openDvdWizard(item->text(1), item->data(0, Qt::UserRole + 1).toString()); - } else if (itemGroup == "websites") { - QString url = item->data(0, Qt::UserRole + 1).toString(); - if (!url.isEmpty()) new KRun(url, this); - } - } else if (status == -2) { - // Rendering crashed - item->setData(1, Qt::UserRole, i18n("Rendering crashed")); - item->setIcon(0, KIcon("dialog-close")); - item->setData(2, Qt::UserRole, 100); - m_view.error_log->append(i18n("Rendering of %1 crashed
", dest)); - m_view.error_log->append(error); - m_view.error_log->append("
"); - m_view.error_box->setVisible(true); - } else if (status == -3) { - // User aborted job - item->setData(1, Qt::UserRole, i18n("Rendering aborted")); - item->setIcon(0, KIcon("dialog-cancel")); - item->setData(2, Qt::UserRole, 100); - } - slotCheckJob(); - checkRenderStatus(); -} - -void RenderWidget::slotAbortCurrentJob() -{ - QTreeWidgetItem *current = m_view.running_jobs->currentItem(); - if (current) { - if (current->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) - emit abortProcess(current->text(1)); - else { - delete current; - slotCheckJob(); - checkRenderStatus(); - } - } -} - -void RenderWidget::slotStartCurrentJob() -{ - QTreeWidgetItem *current = m_view.running_jobs->currentItem(); - if (current && current->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) - startRendering(current); - m_view.start_job->setEnabled(false); -} - -void RenderWidget::slotCheckJob() -{ - bool activate = false; - QTreeWidgetItem *current = m_view.running_jobs->currentItem(); - if (current) { - if (current->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) { - m_view.abort_job->setText(i18n("Abort Job")); - m_view.start_job->setEnabled(false); - } else { - m_view.abort_job->setText(i18n("Remove Job")); - m_view.start_job->setEnabled(current->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB); - } - activate = true; - } - m_view.abort_job->setEnabled(activate); -} - -void RenderWidget::slotCLeanUpJobs() -{ - int ix = 0; - QTreeWidgetItem *current = m_view.running_jobs->topLevelItem(ix); - while (current) { - if (current->data(1, Qt::UserRole + 2).toInt() == FINISHEDJOB) - delete current; - else ix++; - current = m_view.running_jobs->topLevelItem(ix); - } - slotCheckJob(); -} - -void RenderWidget::parseScriptFiles() -{ - QStringList scriptsFilter; - scriptsFilter << "*.sh"; - m_view.scripts_list->clear(); - - QTreeWidgetItem *item; - // List the project scripts - QStringList scriptFiles = QDir(m_projectFolder + "scripts").entryList(scriptsFilter, QDir::Files); - for (int i = 0; i < scriptFiles.size(); ++i) { - KUrl scriptpath(m_projectFolder + "scripts/" + scriptFiles.at(i)); - QString target; - QString renderer; - QString melt; - QFile file(scriptpath.path()); - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - while (!file.atEnd()) { - QByteArray line = file.readLine(); - if (line.startsWith("TARGET=")) { - target = QString(line).section("TARGET=", 1).simplified(); - target.remove(QChar('"')); - } else if (line.startsWith("RENDERER=")) { - renderer = QString(line).section("RENDERER=", 1).simplified(); - renderer.remove(QChar('"')); - } else if (line.startsWith("MELT=")) { - melt = QString(line).section("MELT=", 1).simplified(); - melt.remove(QChar('"')); - } - } - file.close(); - } - if (target.isEmpty()) continue; - item = new QTreeWidgetItem(m_view.scripts_list, QStringList() << QString() << scriptpath.fileName()); - if (!renderer.isEmpty() && renderer.contains('/') && !QFile::exists(renderer)) { - item->setIcon(0, KIcon("dialog-cancel")); - item->setToolTip(1, i18n("Script contains wrong command: %1", renderer)); - item->setData(0, Qt::UserRole, '1'); - } else if (!melt.isEmpty() && melt.contains('/') && !QFile::exists(melt)) { - item->setIcon(0, KIcon("dialog-cancel")); - item->setToolTip(1, i18n("Script contains wrong command: %1", melt)); - item->setData(0, Qt::UserRole, '1'); - } else item->setIcon(0, KIcon("application-x-executable-script")); - item->setSizeHint(0, QSize(m_view.scripts_list->columnWidth(0), fontMetrics().height() * 2)); - item->setData(1, Qt::UserRole, target.simplified()); - item->setData(1, Qt::UserRole + 1, scriptpath.path()); - } - bool activate = false; - QTreeWidgetItem *script = m_view.scripts_list->topLevelItem(0); - if (script) { - script->setSelected(true); - m_view.scripts_list->setCurrentItem(script); - activate = true; - } -// m_view.start_script->setEnabled(activate); -// m_view.delete_script->setEnabled(activate); -} - -void RenderWidget::slotCheckScript() -{ - QTreeWidgetItem *item = m_view.scripts_list->currentItem(); - if (item == NULL) return; - m_view.start_script->setEnabled(item->data(0, Qt::UserRole).toString().isEmpty()); - m_view.delete_script->setEnabled(true); -} - -void RenderWidget::slotStartScript() -{ - QTreeWidgetItem *item = m_view.scripts_list->currentItem(); - if (item) { - QString destination = item->data(1, Qt::UserRole).toString(); - QString path = item->data(1, Qt::UserRole + 1).toString(); - // Insert new job in queue - QTreeWidgetItem *renderItem; - QList existing = m_view.running_jobs->findItems(destination, Qt::MatchExactly, 1); - kDebug() << "------ START SCRIPT"; - if (!existing.isEmpty()) { - renderItem = existing.at(0); - if (renderItem->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) { - KMessageBox::information(this, i18n("There is already a job writing file:
%1
Abort the job if you want to overwrite it...", destination), i18n("Already running")); - return; - } - } else renderItem = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << destination << QString()); - kDebug() << "------ START SCRIPT 2"; - renderItem->setData(2, Qt::UserRole, 0); - renderItem->setData(1, Qt::UserRole + 2, WAITINGJOB); - renderItem->setIcon(0, KIcon("media-playback-pause")); - renderItem->setData(1, Qt::UserRole, i18n("Waiting...")); - renderItem->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2)); - renderItem->setData(1, Qt::UserRole + 1, QTime::currentTime()); - renderItem->setData(1, Qt::UserRole + 3, path); - renderItem->setData(1, Qt::UserRole + 4, '1'); - checkRenderStatus(); - m_view.tabWidget->setCurrentIndex(1); - } -} - -void RenderWidget::slotDeleteScript() -{ - QTreeWidgetItem *item = m_view.scripts_list->currentItem(); - if (item) { - QString path = item->data(1, Qt::UserRole + 1).toString(); - KIO::NetAccess::del(path + ".mlt", this); - KIO::NetAccess::del(path, this); - parseScriptFiles(); - } -} - -void RenderWidget::slotGenerateScript() -{ - slotPrepareExport(true); -} - -void RenderWidget::slotHideLog() -{ - m_view.error_box->setVisible(false); -} - -void RenderWidget::setRenderProfile(const QString &dest, const QString &group, const QString &name, const QString &url) -{ - m_view.destination_list->blockSignals(true); - m_view.format_list->blockSignals(true); - - if (!url.isEmpty()) m_view.out_file->setUrl(KUrl(url)); - - // set destination - for (int i = 0; i < m_view.destination_list->count(); i++) { - if (m_view.destination_list->itemData(i, Qt::UserRole) == dest) { - m_view.destination_list->setCurrentIndex(i); - break; - } - } - refreshCategory(); - - // set category - if (!group.isEmpty()) { - QList childs = m_view.format_list->findItems(group, Qt::MatchExactly); - if (!childs.isEmpty()) { - m_view.format_list->setCurrentItem(childs.at(0)); - } - refreshView(); - } - - // set profile - QList childs = m_view.size_list->findItems(name, Qt::MatchExactly); - if (!childs.isEmpty()) { - m_view.size_list->setCurrentItem(childs.at(0)); - } - //refreshView(); - m_view.destination_list->blockSignals(false); - m_view.format_list->blockSignals(false); - -} - -bool RenderWidget::startWaitingRenderJobs() -{ - m_blockProcessing = true; - QString autoscriptFile = getFreeScriptName("auto"); - QFile file(autoscriptFile); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - kWarning() << "////// ERROR writing to file: " << autoscriptFile; - KMessageBox::error(0, i18n("Cannot write to file %1", autoscriptFile)); - return false; - } - - QTextStream outStream(&file); - outStream << "#! /bin/sh" << "\n" << "\n"; - QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0); - while (item) { - if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) { - if (item->data(1, Qt::UserRole + 4).isNull()) { - // Add render process for item - const QString params = item->data(1, Qt::UserRole + 3).toStringList().join(" "); - outStream << m_renderer << " " << params << "\n"; - } else { - // Script item - outStream << item->data(1, Qt::UserRole + 3).toString() << "\n"; - } - } - item = m_view.running_jobs->itemBelow(item); - } - // erase itself when rendering is finished - outStream << "rm " << autoscriptFile << "\n" << "\n"; - if (file.error() != QFile::NoError) { - KMessageBox::error(0, i18n("Cannot write to file %1", autoscriptFile)); - file.close(); - m_blockProcessing = false; - return false; - } - file.close(); - QFile::setPermissions(autoscriptFile, file.permissions() | QFile::ExeUser); - QProcess::startDetached(autoscriptFile, QStringList()); - return true; -} - -QString RenderWidget::getFreeScriptName(const QString &prefix) -{ - int ix = 0; - QString scriptsFolder = m_projectFolder + "scripts/"; - KStandardDirs::makeDir(scriptsFolder); - QString path; - while (path.isEmpty() || QFile::exists(path)) { - ix++; - path = scriptsFolder + prefix + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh"; - } - return path; -} - -void RenderWidget::slotPlayRendering(QTreeWidgetItem *item, int) -{ - if (KdenliveSettings::defaultplayerapp().isEmpty() || item->data(1, Qt::UserRole + 2).toInt() != FINISHEDJOB) return; - const QByteArray startId = KStartupInfo::createNewStartupId(); - const QString command = KdenliveSettings::defaultplayerapp() + ' ' + item->text(1); - KRun::runCommand(command, KdenliveSettings::defaultplayerapp(), KdenliveSettings::defaultplayerapp(), this, startId); -} - - - diff -Nru kdenlive-0.7.7/src/titlewidget.cpp~ kdenlive-0.7.7.1/src/titlewidget.cpp~ --- kdenlive-0.7.7/src/titlewidget.cpp~ 2010-02-17 08:07:50.000000000 +0000 +++ kdenlive-0.7.7.1/src/titlewidget.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,2242 +0,0 @@ -/*************************************************************************** - titlewidget.cpp - description - ------------------- - begin : Feb 28 2008 - copyright : (C) 2008 by Marco Gittler - email : g.marco@freenet.de - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "titlewidget.h" -#include "kdenlivesettings.h" -#include "KoSliderCombo.h" - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if QT_VERSION >= 0x040600 -#include -#include -#include -#endif - -int settingUp = false; - -const int IMAGEITEM = 7; -const int RECTITEM = 3; -const int TEXTITEM = 8; - -const int NOEFFECT = 0; -const int BLUREFFECT = 1; -const int SHADOWEFFECT = 2; -const int TYPEWRITEREFFECT = 3; - -TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render *render, QWidget *parent) : - QDialog(parent), - Ui::TitleWidget_UI(), - m_startViewport(NULL), - m_endViewport(NULL), - m_render(render), - m_count(0), - m_unicodeDialog(new UnicodeDialog(UnicodeDialog::InputHex)), - m_projectTitlePath(projectTitlePath), - m_tc(tc) -{ - setupUi(this); - setFont(KGlobalSettings::toolBarFont()); - frame_properties->setEnabled(false); - frame_properties->setFixedHeight(frame_toolbar->height()); - - // Set combo sliders values - textAlpha->setMinimum(0); - textAlpha->setMaximum(255); - textAlpha->setDecimals(0); - textAlpha->setValue(255); - textAlpha->setToolTip(i18n("Font color opacity")); - - textOutlineAlpha->setMinimum(0); - textOutlineAlpha->setMaximum(255); - textOutlineAlpha->setDecimals(0); - textOutlineAlpha->setValue(255); - textOutlineAlpha->setToolTip(i18n("Outline color opacity")); - - textOutline->setMinimum(0); - textOutline->setMaximum(200); - textOutline->setDecimals(0); - textOutline->setValue(0); - textOutline->setToolTip(i18n("Outline width")); - - backgroundAlpha->setMinimum(0); - backgroundAlpha->setMaximum(255); - backgroundAlpha->setDecimals(0); - backgroundAlpha->setValue(0); - backgroundAlpha->setToolTip(i18n("Background color opacity")); - - itemrotatex->setMinimum(-360); - itemrotatex->setMaximum(360); - itemrotatex->setDecimals(0); - itemrotatex->setValue(0); - itemrotatex->setToolTip(i18n("Rotation around the X axis")); - - itemrotatey->setMinimum(-360); - itemrotatey->setMaximum(360); - itemrotatey->setDecimals(0); - itemrotatey->setValue(0); - itemrotatey->setToolTip(i18n("Rotation around the Y axis")); - - itemrotatez->setMinimum(-360); - itemrotatez->setMaximum(360); - itemrotatez->setDecimals(0); - itemrotatez->setValue(0); - itemrotatez->setToolTip(i18n("Rotation around the Z axis")); - - rectBAlpha->setMinimum(0); - rectBAlpha->setMaximum(255); - rectBAlpha->setDecimals(0); - rectBAlpha->setValue(255); - rectBAlpha->setToolTip(i18n("Color opacity")); - - rectFAlpha->setMinimum(0); - rectFAlpha->setMaximum(255); - rectFAlpha->setDecimals(0); - rectFAlpha->setValue(255); - rectFAlpha->setToolTip(i18n("Border opacity")); - - rectLineWidth->setMinimum(0); - rectLineWidth->setMaximum(100); - rectLineWidth->setDecimals(0); - rectLineWidth->setValue(0); - rectLineWidth->setToolTip(i18n("Border width")); - - itemzoom->setSuffix(i18n("%")); - m_frameWidth = render->renderWidth(); - m_frameHeight = render->renderHeight(); - showToolbars(TITLE_SELECT); - - //TODO: get default title duration instead of hardcoded one - title_duration->setText(m_tc.getTimecode(GenTime(5000 / 1000.0))); - - connect(backgroundColor, SIGNAL(clicked()), this, SLOT(slotChangeBackground())) ; - connect(backgroundAlpha, SIGNAL(valueChanged(qreal, bool)), this, SLOT(slotChangeBackground())) ; - - connect(fontColorButton, SIGNAL(clicked()), this, SLOT(slotUpdateText())) ; - connect(textOutlineColor, SIGNAL(clicked()), this, SLOT(slotUpdateText())) ; - connect(font_family, SIGNAL(currentFontChanged(const QFont &)), this, SLOT(slotUpdateText())) ; - connect(font_size, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateText())) ; - connect(textAlpha, SIGNAL(valueChanged(qreal, bool)), this, SLOT(slotUpdateText())); - connect(textOutline, SIGNAL(valueChanged(qreal, bool)), this, SLOT(slotUpdateText())); - connect(textOutlineAlpha, SIGNAL(valueChanged(qreal, bool)), this, SLOT(slotUpdateText())); - connect(font_weight_box, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateText())); - - connect(font_family, SIGNAL(editTextChanged(const QString &)), this, SLOT(slotFontText(const QString&))); - - connect(rectFAlpha, SIGNAL(valueChanged(qreal, bool)), this, SLOT(rectChanged())); - connect(rectBAlpha, SIGNAL(valueChanged(qreal, bool)), this, SLOT(rectChanged())); - connect(rectFColor, SIGNAL(clicked()), this, SLOT(rectChanged())); - connect(rectBColor, SIGNAL(clicked()), this, SLOT(rectChanged())); - connect(rectLineWidth, SIGNAL(valueChanged(qreal, bool)), this, SLOT(rectChanged())); - - /*connect(startViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); - connect(startViewportY, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); - connect(startViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); - connect(endViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); - connect(endViewportY, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); - connect(endViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));*/ - - // Fill effects - effect_list->addItem(i18n("None"), NOEFFECT); - effect_list->addItem(i18n("Typewriter"), TYPEWRITEREFFECT); - effect_list->addItem(i18n("Blur"), BLUREFFECT); - - - connect(zValue, SIGNAL(valueChanged(int)), this, SLOT(zIndexChanged(int))); - connect(itemzoom, SIGNAL(valueChanged(int)), this, SLOT(itemScaled(int))); - connect(itemrotatex, SIGNAL(valueChanged(qreal, bool)), this, SLOT(itemRotateX(qreal))); - connect(itemrotatey, SIGNAL(valueChanged(qreal, bool)), this, SLOT(itemRotateY(qreal))); - connect(itemrotatez, SIGNAL(valueChanged(qreal, bool)), this, SLOT(itemRotateZ(qreal))); - connect(itemhcenter, SIGNAL(clicked()), this, SLOT(itemHCenter())); - connect(itemvcenter, SIGNAL(clicked()), this, SLOT(itemVCenter())); - connect(itemtop, SIGNAL(clicked()), this, SLOT(itemTop())); - connect(itembottom, SIGNAL(clicked()), this, SLOT(itemBottom())); - connect(itemleft, SIGNAL(clicked()), this, SLOT(itemLeft())); - connect(itemright, SIGNAL(clicked()), this, SLOT(itemRight())); - connect(effect_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotAddEffect(int))); - connect(typewriter_delay, SIGNAL(valueChanged(int)), this, SLOT(slotEditTypewriter(int))); - connect(typewriter_start, SIGNAL(valueChanged(int)), this, SLOT(slotEditTypewriter(int))); - connect(blur_radius, SIGNAL(valueChanged(int)), this, SLOT(slotEditBlur(int))); - connect(shadow_radius, SIGNAL(valueChanged(int)), this, SLOT(slotEditShadow())); - connect(shadow_x, SIGNAL(valueChanged(int)), this, SLOT(slotEditShadow())); - connect(shadow_y, SIGNAL(valueChanged(int)), this, SLOT(slotEditShadow())); - effect_stack->setHidden(true); - effect_frame->setEnabled(false); - - connect(origin_x_left, SIGNAL(clicked()), this, SLOT(slotOriginXClicked())); - connect(origin_y_top, SIGNAL(clicked()), this, SLOT(slotOriginYClicked())); - - m_signalMapper = new QSignalMapper(this); - m_signalMapper->setMapping(value_w, ValueWidth); - m_signalMapper->setMapping(value_h, ValueHeight); - connect(value_w, SIGNAL(valueChanged(int)), m_signalMapper, SLOT(map())); - connect(value_h, SIGNAL(valueChanged(int)), m_signalMapper, SLOT(map())); - connect(m_signalMapper, SIGNAL(mapped(int)), this, SLOT(slotValueChanged(int))); - - connect(value_x, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustSelectedItem())); - connect(value_y, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustSelectedItem())); - connect(value_w, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustSelectedItem())); - connect(value_h, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustSelectedItem())); - connect(buttonFitZoom, SIGNAL(clicked()), this, SLOT(slotAdjustZoom())); - connect(buttonRealSize, SIGNAL(clicked()), this, SLOT(slotZoomOneToOne())); - connect(buttonItalic, SIGNAL(clicked()), this, SLOT(slotUpdateText())); - connect(buttonUnder, SIGNAL(clicked()), this, SLOT(slotUpdateText())); - connect(buttonAlignLeft, SIGNAL(clicked()), this, SLOT(slotUpdateText())); - connect(buttonAlignRight, SIGNAL(clicked()), this, SLOT(slotUpdateText())); - connect(buttonAlignCenter, SIGNAL(clicked()), this, SLOT(slotUpdateText())); - connect(buttonAlignNone, SIGNAL(clicked()), this, SLOT(slotUpdateText())); - connect(displayBg, SIGNAL(stateChanged(int)), this, SLOT(displayBackgroundFrame())); - - connect(m_unicodeDialog, SIGNAL(charSelected(QString)), this, SLOT(slotInsertUnicodeString(QString))); - - // mbd - connect(this, SIGNAL(accepted()), this, SLOT(slotAccepted())); - - font_weight_box->blockSignals(true); - font_weight_box->addItem(i18nc("Font style", "Light"), QFont::Light); - font_weight_box->addItem(i18nc("Font style", "Normal"), QFont::Normal); - font_weight_box->addItem(i18nc("Font style", "Demi-Bold"), QFont::DemiBold); - font_weight_box->addItem(i18nc("Font style", "Bold"), QFont::Bold); - font_weight_box->addItem(i18nc("Font style", "Black"), QFont::Black); - font_weight_box->setToolTip(i18n("Font weight")); - font_weight_box->setCurrentIndex(1); - font_weight_box->blockSignals(false); - - buttonFitZoom->setIcon(KIcon("zoom-fit-best")); - buttonRealSize->setIcon(KIcon("zoom-original")); - buttonItalic->setIcon(KIcon("format-text-italic")); - buttonUnder->setIcon(KIcon("format-text-underline")); - buttonAlignCenter->setIcon(KIcon("format-justify-center")); - buttonAlignLeft->setIcon(KIcon("format-justify-left")); - buttonAlignRight->setIcon(KIcon("format-justify-right")); - buttonAlignNone->setIcon(KIcon("kdenlive-align-none")); - - buttonAlignNone->setToolTip(i18n("No alignment")); - buttonAlignRight->setToolTip(i18n("Align right")); - buttonAlignLeft->setToolTip(i18n("Align left")); - buttonAlignCenter->setToolTip(i18n("Align center")); - - m_unicodeAction = new QAction(KIcon("kdenlive-insert-unicode"), QString(), this); - m_unicodeAction->setShortcut(Qt::SHIFT + Qt::CTRL + Qt::Key_U); - m_unicodeAction->setToolTip(i18n("Insert Unicode character") + ' ' + m_unicodeAction->shortcut().toString()); - connect(m_unicodeAction, SIGNAL(triggered()), this, SLOT(slotInsertUnicode())); - buttonInsertUnicode->setDefaultAction(m_unicodeAction); - - m_zUp = new QAction(KIcon("kdenlive-zindex-up"), QString(), this); - m_zUp->setShortcut(Qt::Key_PageUp); - m_zUp->setToolTip(i18n("Raise object")); - connect(m_zUp, SIGNAL(triggered()), this, SLOT(slotZIndexUp())); - zUp->setDefaultAction(m_zUp); - - m_zDown = new QAction(KIcon("kdenlive-zindex-down"), QString(), this); - m_zDown->setShortcut(Qt::Key_PageDown); - m_zDown->setToolTip(i18n("Lower object")); - connect(m_zDown, SIGNAL(triggered()), this, SLOT(slotZIndexDown())); - zDown->setDefaultAction(m_zDown); - - m_zTop = new QAction(KIcon("kdenlive-zindex-top"), QString(), this); - // TODO mbt 1414: Shortcut should change z index only if - // cursor is NOT in a text field ... - //m_zTop->setShortcut(Qt::Key_Home); - m_zTop->setToolTip(i18n("Raise object to top")); - connect(m_zTop, SIGNAL(triggered()), this, SLOT(slotZIndexTop())); - zTop->setDefaultAction(m_zTop); - - m_zBottom = new QAction(KIcon("kdenlive-zindex-bottom"), QString(), this); - // TODO mbt 1414 - //m_zBottom->setShortcut(Qt::Key_End); - m_zBottom->setToolTip(i18n("Lower object to bottom")); - connect(m_zBottom, SIGNAL(triggered()), this, SLOT(slotZIndexBottom())); - zBottom->setDefaultAction(m_zBottom); - - zDown->setIcon(KIcon("kdenlive-zindex-down")); - zTop->setIcon(KIcon("kdenlive-zindex-top")); - zBottom->setIcon(KIcon("kdenlive-zindex-bottom")); - connect(zDown, SIGNAL(clicked()), this, SLOT(slotZIndexDown())); - connect(zTop, SIGNAL(clicked()), this, SLOT(slotZIndexTop())); - connect(zBottom, SIGNAL(clicked()), this, SLOT(slotZIndexBottom())); - - origin_x_left->setToolTip(i18n("Invert x axis and change 0 point")); - origin_y_top->setToolTip(i18n("Invert y axis and change 0 point")); - rectBColor->setToolTip(i18n("Select fill color")); - rectFColor->setToolTip(i18n("Select border color")); - rectBAlpha->setToolTip(i18n("Fill opacity")); - rectFAlpha->setToolTip(i18n("Border opacity")); - zoom_slider->setToolTip(i18n("Zoom")); - buttonRealSize->setToolTip(i18n("Original size (1:1)")); - buttonFitZoom->setToolTip(i18n("Fit zoom")); - backgroundColor->setToolTip(i18n("Select background color")); - backgroundAlpha->setToolTip(i18n("Background opacity")); - - itemhcenter->setIcon(KIcon("kdenlive-align-hor")); - itemhcenter->setToolTip(i18n("Align item horizontally")); - itemvcenter->setIcon(KIcon("kdenlive-align-vert")); - itemvcenter->setToolTip(i18n("Align item vertically")); - itemtop->setIcon(KIcon("kdenlive-align-top")); - itemtop->setToolTip(i18n("Align item to top")); - itembottom->setIcon(KIcon("kdenlive-align-bottom")); - itembottom->setToolTip(i18n("Align item to bottom")); - itemright->setIcon(KIcon("kdenlive-align-right")); - itemright->setToolTip(i18n("Align item to right")); - itemleft->setIcon(KIcon("kdenlive-align-left")); - itemleft->setToolTip(i18n("Align item to left")); - - - QHBoxLayout *layout = new QHBoxLayout; - frame_toolbar->setLayout(layout); - layout->setContentsMargins(0, 0, 0, 0); - QToolBar *m_toolbar = new QToolBar("titleToolBar", this); - int s = style()->pixelMetric(QStyle::PM_SmallIconSize); - m_toolbar->setIconSize(QSize(s, s)); - - m_buttonCursor = m_toolbar->addAction(KIcon("transform-move"), QString()); - m_buttonCursor->setCheckable(true); - m_buttonCursor->setShortcut(Qt::ALT + Qt::Key_S); - m_buttonCursor->setToolTip(i18n("Selection Tool") + ' ' + m_buttonCursor->shortcut().toString()); - connect(m_buttonCursor, SIGNAL(triggered()), this, SLOT(slotSelectTool())); - - m_buttonText = m_toolbar->addAction(KIcon("insert-text"), QString()); - m_buttonText->setCheckable(true); - m_buttonText->setShortcut(Qt::ALT + Qt::Key_T); - m_buttonText->setToolTip(i18n("Add Text") + ' ' + m_buttonText->shortcut().toString()); - connect(m_buttonText, SIGNAL(triggered()), this, SLOT(slotTextTool())); - - m_buttonRect = m_toolbar->addAction(KIcon("kdenlive-insert-rect"), QString()); - m_buttonRect->setCheckable(true); - m_buttonRect->setShortcut(Qt::ALT + Qt::Key_R); - m_buttonRect->setToolTip(i18n("Add Rectangle") + ' ' + m_buttonRect->shortcut().toString()); - connect(m_buttonRect, SIGNAL(triggered()), this, SLOT(slotRectTool())); - - m_buttonImage = m_toolbar->addAction(KIcon("insert-image"), QString()); - m_buttonImage->setCheckable(false); - m_buttonImage->setShortcut(Qt::ALT + Qt::Key_I); - m_buttonImage->setToolTip(i18n("Add Image") + ' ' + m_buttonImage->shortcut().toString()); - connect(m_buttonImage, SIGNAL(triggered()), this, SLOT(slotImageTool())); - - m_toolbar->addSeparator(); - - m_buttonLoad = m_toolbar->addAction(KIcon("document-open"), i18n("Open Document")); - m_buttonLoad->setCheckable(false); - m_buttonLoad->setShortcut(Qt::CTRL + Qt::Key_O); - connect(m_buttonLoad, SIGNAL(triggered()), this, SLOT(loadTitle())); - - m_buttonSave = m_toolbar->addAction(KIcon("document-save-as"), i18n("Save As")); - m_buttonSave->setCheckable(false); - m_buttonSave->setShortcut(Qt::CTRL + Qt::Key_S); - connect(m_buttonSave, SIGNAL(triggered()), this, SLOT(saveTitle())); - - layout->addWidget(m_toolbar); - - // initialize graphic scene - m_scene = new GraphicsSceneRectMove(this); - graphicsView->setScene(m_scene); - graphicsView->setMouseTracking(true); - m_titledocument.setScene(m_scene, m_frameWidth, m_frameHeight); - connect(m_scene, SIGNAL(changed(QList)), this, SLOT(slotChanged())); - connect(font_size, SIGNAL(valueChanged(int)), m_scene, SLOT(slotUpdateFontSize(int))); - - // a gradient background - /*QRadialGradient *gradient = new QRadialGradient(0, 0, 10); - gradient->setSpread(QGradient::ReflectSpread); - scene->setBackgroundBrush(*gradient);*/ - - m_frameImage = new QGraphicsPixmapItem(); - QTransform qtrans; - qtrans.scale(2.0, 2.0); - m_frameImage->setTransform(qtrans); - m_frameImage->setZValue(-1200); - m_frameImage->setFlags(0); - displayBackgroundFrame(); - graphicsView->scene()->addItem(m_frameImage); - - connect(m_scene, SIGNAL(selectionChanged()), this , SLOT(selectionChanged())); - connect(m_scene, SIGNAL(itemMoved()), this , SLOT(selectionChanged())); - connect(m_scene, SIGNAL(sceneZoom(bool)), this , SLOT(slotZoom(bool))); - connect(m_scene, SIGNAL(actionFinished()), this , SLOT(slotSelectTool())); - //connect(m_scene, SIGNAL(actionFinished()), this , SLOT(selectionChanged())); - connect(m_scene, SIGNAL(newRect(QGraphicsRectItem *)), this , SLOT(slotNewRect(QGraphicsRectItem *))); - connect(m_scene, SIGNAL(newText(QGraphicsTextItem *)), this , SLOT(slotNewText(QGraphicsTextItem *))); - connect(zoom_slider, SIGNAL(valueChanged(int)), this , SLOT(slotUpdateZoom(int))); - - QPen framepen(Qt::DotLine); - framepen.setColor(Qt::red); - - m_frameBorder = new QGraphicsRectItem(QRectF(0, 0, m_frameWidth, m_frameHeight)); - m_frameBorder->setPen(framepen); - m_frameBorder->setZValue(-1100); - m_frameBorder->setBrush(Qt::transparent); - m_frameBorder->setFlags(0); - graphicsView->scene()->addItem(m_frameBorder); - - // mbd: load saved settings - readChoices(); - - graphicsView->show(); - //graphicsView->setRenderHint(QPainter::Antialiasing); - graphicsView->setInteractive(true); - //graphicsView->resize(400, 300); - kDebug() << "// TITLE WIDGWT: " << graphicsView->viewport()->width() << "x" << graphicsView->viewport()->height(); - //toolBox->setItemEnabled(2, false); - m_startViewport = new QGraphicsRectItem(QRectF(0, 0, m_frameWidth, m_frameHeight)); - m_endViewport = new QGraphicsRectItem(QRectF(0, 0, m_frameWidth, m_frameHeight)); - m_startViewport->setData(0, m_frameWidth); - m_startViewport->setData(1, m_frameHeight); - m_endViewport->setData(0, m_frameWidth); - m_endViewport->setData(1, m_frameHeight); - - if (!url.isEmpty()) loadTitle(url); - else { - slotTextTool(); - QTimer::singleShot(200, this, SLOT(slotAdjustZoom())); - } - initAnimation(); - connect(anim_start, SIGNAL(toggled(bool)), this, SLOT(slotAnimStart(bool))); - connect(anim_end, SIGNAL(toggled(bool)), this, SLOT(slotAnimEnd(bool))); - - buttonBox->button(QDialogButtonBox::Ok)->setEnabled(KdenliveSettings::hastitleproducer()); -} - -TitleWidget::~TitleWidget() -{ - delete m_buttonRect; - delete m_buttonText; - delete m_buttonImage; - delete m_buttonCursor; - delete m_buttonSave; - delete m_buttonLoad; - delete m_unicodeAction; - delete m_zUp; - delete m_zDown; - delete m_zTop; - delete m_zBottom; - - delete m_unicodeDialog; - delete m_frameBorder; - delete m_frameImage; - delete m_startViewport; - delete m_endViewport; - delete m_scene; - delete m_signalMapper; -} - -//static -QStringList TitleWidget::getFreeTitleInfo(const KUrl &projectUrl, bool isClone) -{ - QStringList result; - QString titlePath = projectUrl.path(KUrl::AddTrailingSlash) + "titles/"; - KStandardDirs::makeDir(titlePath); - titlePath.append((isClone == false) ? "title" : "clone"); - int counter = 0; - QString path; - while (path.isEmpty() || QFile::exists(path)) { - counter++; - path = titlePath + QString::number(counter).rightJustified(3, '0', false) + ".png"; - } - result.append(((isClone == false) ? i18n("Title") : i18n("Clone")) + ' ' + QString::number(counter).rightJustified(3, '0', false)); - result.append(path); - return result; -} - -// static -QString TitleWidget::getTitleResourceFromName(const KUrl &projectUrl, const QString &titleName) -{ - QStringList result; - QString titlePath = projectUrl.path(KUrl::AddTrailingSlash) + "titles/"; - KStandardDirs::makeDir(titlePath); - return titlePath + titleName + ".png"; -} - -// static -QStringList TitleWidget::extractImageList(QString xml) -{ - QStringList result; - if (xml.isEmpty()) return result; - QDomDocument doc; - doc.setContent(xml); - QDomNodeList images = doc.elementsByTagName("content"); - for (int i = 0; i < images.count(); i++) { - if (images.at(i).toElement().hasAttribute("url")) - result.append(images.at(i).toElement().attribute("url")); - } - return result; -} - -// static -QStringList TitleWidget::extractFontList(QString xml) -{ - QStringList result; - if (xml.isEmpty()) return result; - QDomDocument doc; - doc.setContent(xml); - QDomNodeList images = doc.elementsByTagName("content"); - for (int i = 0; i < images.count(); i++) { - if (images.at(i).toElement().hasAttribute("font")) - result.append(images.at(i).toElement().attribute("font")); - } - return result; -} - - -//virtual -void TitleWidget::resizeEvent(QResizeEvent * /*event*/) -{ - //slotAdjustZoom(); -} - -void TitleWidget::slotTextTool() -{ - m_scene->setTool(TITLE_TEXT); - showToolbars(TITLE_TEXT); - checkButton(TITLE_TEXT); -} - -void TitleWidget::slotRectTool() -{ - m_scene->setTool(TITLE_RECTANGLE); - showToolbars(TITLE_RECTANGLE); - checkButton(TITLE_RECTANGLE); -} - -void TitleWidget::slotSelectTool() -{ - m_scene->setTool(TITLE_SELECT); - - // Find out which toolbars need to be shown, depending on selected item - TITLETOOL t = TITLE_SELECT; - QList l = graphicsView->scene()->selectedItems(); - if (l.size() > 0) { - switch (l.at(0)->type()) { - case TEXTITEM: - t = TITLE_TEXT; - break; - case RECTITEM: - t = TITLE_RECTANGLE; - break; - case IMAGEITEM: - t = TITLE_IMAGE; - break; - } - } - - enableToolbars(t); - if (t == TITLE_RECTANGLE && (l.at(0) == m_endViewport || l.at(0) == m_startViewport)) { - //graphicsView->centerOn(l.at(0)); - t = TITLE_SELECT; - } - showToolbars(t); - - if (l.size() > 0) { - updateCoordinates(l.at(0)); - updateDimension(l.at(0)); - updateRotZoom(l.at(0)); - } - - checkButton(TITLE_SELECT); -} - -void TitleWidget::slotImageTool() -{ - // TODO: find a way to get a list of all supported image types... - QString allExtensions = "image/gif image/jpeg image/png image/x-tga image/x-bmp image/svg+xml image/tiff image/x-xcf-gimp image/x-vnd.adobe.photoshop image/x-pcx image/x-exr"; - KUrl url = KFileDialog::getOpenUrl(KUrl(), allExtensions, this, i18n("Load Image")); //"*.svg *.png *.jpg *.jpeg *.gif *.raw" - if (!url.isEmpty()) { - if (url.path().endsWith(".svg")) { - QGraphicsSvgItem *svg = new QGraphicsSvgItem(url.toLocalFile()); - svg->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); - svg->setZValue(m_count++); - svg->setData(Qt::UserRole, url.path()); - graphicsView->scene()->addItem(svg); - } else { - QPixmap pix(url.path()); - QGraphicsPixmapItem *image = new QGraphicsPixmapItem(pix); - image->setShapeMode(QGraphicsPixmapItem::BoundingRectShape); - image->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); - image->setData(Qt::UserRole, url.path()); - image->setZValue(m_count++); - graphicsView->scene()->addItem(image); - } - } - m_scene->setTool(TITLE_SELECT); - showToolbars(TITLE_SELECT); - checkButton(TITLE_SELECT); -} - -void TitleWidget::showToolbars(TITLETOOL toolType) -{ - toolbar_stack->setCurrentIndex((int) toolType); -} - -void TitleWidget::enableToolbars(TITLETOOL toolType) -{ - // TITLETOOL is defined in graphicsscenerectmove.h - bool enable = false; - if (toolType == TITLE_RECTANGLE || toolType == TITLE_IMAGE) enable = true; - value_w->setEnabled(enable); - value_h->setEnabled(enable); -} - -void TitleWidget::checkButton(TITLETOOL toolType) -{ - bool bSelect = false; - bool bText = false; - bool bRect = false; - bool bImage = false; - - switch (toolType) { - case TITLE_SELECT: - bSelect = true; - break; - case TITLE_TEXT: - bText = true; - break; - case TITLE_RECTANGLE: - bRect = true; - break; - case TITLE_IMAGE: - bImage = true; - break; - default: - break; - } - - m_buttonCursor->setChecked(bSelect); - m_buttonText->setChecked(bText); - m_buttonRect->setChecked(bRect); - m_buttonImage->setChecked(bImage); -} - -void TitleWidget::displayBackgroundFrame() -{ - if (!displayBg->isChecked()) { - QPixmap bg(m_frameWidth / 2, m_frameHeight / 2); - QPixmap pattern(20, 20); - pattern.fill(); - QColor bgcolor(210, 210, 210); - QPainter p; - p.begin(&pattern); - p.fillRect(QRect(0, 0, 10, 10), bgcolor); - p.fillRect(QRect(10, 10, 20, 20), bgcolor); - p.end(); - QBrush br(pattern); - - p.begin(&bg); - p.fillRect(bg.rect(), br); - p.end(); - m_frameImage->setPixmap(bg); - } else { - m_frameImage->setPixmap(QPixmap::fromImage(m_render->extractFrame((int) m_render->seekPosition().frames(m_render->fps()), m_frameWidth / 2, m_frameHeight / 2))); - } -} - -void TitleWidget::initAnimation() -{ - align_box->setEnabled(false); - QPen startpen(Qt::DotLine); - QPen endpen(Qt::DashDotLine); - startpen.setColor(QColor(100, 200, 100, 140)); - endpen.setColor(QColor(200, 100, 100, 140)); - - m_startViewport->setPen(startpen); - m_endViewport->setPen(endpen); - - m_startViewport->setZValue(-1000); - m_endViewport->setZValue(-1000); - - m_startViewport->setFlags(0); - m_endViewport->setFlags(0); - - graphicsView->scene()->addItem(m_startViewport); - graphicsView->scene()->addItem(m_endViewport); - - connect(keep_aspect, SIGNAL(toggled(bool)), this, SLOT(slotKeepAspect(bool))); - connect(resize50, SIGNAL(clicked()), this, SLOT(slotResize50())); - connect(resize100, SIGNAL(clicked()), this, SLOT(slotResize100())); - connect(resize200, SIGNAL(clicked()), this, SLOT(slotResize200())); -} - -void TitleWidget::slotUpdateZoom(int pos) -{ - m_scene->setZoom((double) pos / 100); - zoom_label->setText(QString::number(pos) + '%'); -} - -void TitleWidget::slotZoom(bool up) -{ - int pos = zoom_slider->value(); - if (up) pos++; - else pos--; - zoom_slider->setValue(pos); -} - -void TitleWidget::slotAdjustZoom() -{ - /*double scalex = graphicsView->width() / (double)(m_frameWidth * 1.2); - double scaley = graphicsView->height() / (double)(m_frameHeight * 1.2); - if (scalex > scaley) scalex = scaley; - int zoompos = (int)(scalex * 7 + 0.5);*/ - graphicsView->fitInView(m_frameBorder, Qt::KeepAspectRatio); - int zoompos = graphicsView->matrix().m11() * 100; - zoom_slider->setValue(zoompos); - graphicsView->centerOn(m_frameBorder); -} - -void TitleWidget::slotZoomOneToOne() -{ - zoom_slider->setValue(100); - graphicsView->centerOn(m_frameBorder); -} - -void TitleWidget::slotNewRect(QGraphicsRectItem * rect) -{ - updateAxisButtons(rect); // back to default - - QColor f = rectFColor->color(); - f.setAlpha(rectFAlpha->value()); - QPen penf(f); - penf.setWidth(rectLineWidth->value()); - penf.setJoinStyle(Qt::RoundJoin); - rect->setPen(penf); - QColor b = rectBColor->color(); - b.setAlpha(rectBAlpha->value()); - rect->setBrush(QBrush(b)); - rect->setZValue(m_count++); - rect->setData(ZOOMFACTOR, 100); - //setCurrentItem(rect); - //graphicsView->setFocus(); -} - -void TitleWidget::slotNewText(QGraphicsTextItem *tt) -{ - updateAxisButtons(tt); // back to default - - QFont font = font_family->currentFont(); - font.setPixelSize(font_size->value()); - // mbd: issue 551: - font.setWeight(font_weight_box->itemData(font_weight_box->currentIndex()).toInt()); - font.setItalic(buttonItalic->isChecked()); - font.setUnderline(buttonUnder->isChecked()); - - tt->setFont(font); - QColor color = fontColorButton->color(); - color.setAlpha(textAlpha->value()); - tt->setDefaultTextColor(color); - - QTextCursor cur(tt->document()); - cur.select(QTextCursor::Document); - QTextBlockFormat format = cur.blockFormat(); - QTextCharFormat cformat = cur.charFormat(); - QColor outlineColor = textOutlineColor->color(); - outlineColor.setAlpha(textOutlineAlpha->value()); - double outlineWidth = textOutline->value() / 10.0; - - tt->setData(101, outlineWidth); - tt->setData(102, outlineColor); - if (outlineWidth > 0.0) cformat.setTextOutline(QPen(outlineColor, outlineWidth)); - - cformat.setForeground(QBrush(color)); - cur.setCharFormat(cformat); - cur.setBlockFormat(format); - tt->setTextCursor(cur); - tt->setZValue(m_count++); - setCurrentItem(tt); -} - -void TitleWidget::setFontBoxWeight(int weight) -{ - int index = font_weight_box->findData(weight); - if (index < 0) { - index = font_weight_box->findData(QFont::Normal); - } - font_weight_box->setCurrentIndex(index); -} - -void TitleWidget::setCurrentItem(QGraphicsItem *item) -{ - m_scene->setSelectedItem(item); -} - -void TitleWidget::zIndexChanged(int v) -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() >= 1) { - l[0]->setZValue(v); - } -} - -void TitleWidget::selectionChanged() -{ - if (m_scene->tool() != TITLE_SELECT) return; - QList l = graphicsView->scene()->selectedItems(); - //toolBox->setItemEnabled(2, false); - //toolBox->setItemEnabled(3, false); - value_x->blockSignals(true); - value_y->blockSignals(true); - value_w->blockSignals(true); - value_h->blockSignals(true); - itemzoom->blockSignals(true); - itemrotatex->blockSignals(true); - itemrotatey->blockSignals(true); - itemrotatez->blockSignals(true); - if (l.size() == 0) { - effect_stack->setHidden(true); - effect_frame->setEnabled(false); - effect_list->setCurrentIndex(0); - bool blockX = !origin_x_left->signalsBlocked(); - bool blockY = !origin_y_top->signalsBlocked(); - if (blockX) origin_x_left->blockSignals(true); - if (blockY) origin_y_top->blockSignals(true); - origin_x_left->setChecked(false); - origin_y_top->setChecked(false); - updateTextOriginX(); - updateTextOriginY(); - enableToolbars(TITLE_SELECT); - if (blockX) origin_x_left->blockSignals(false); - if (blockY) origin_y_top->blockSignals(false); - itemzoom->setEnabled(false); - itemrotatex->setEnabled(false); - itemrotatey->setEnabled(false); - itemrotatez->setEnabled(false); - frame_properties->setEnabled(false); - } else if (l.size() == 1) { - effect_frame->setEnabled(true); - frame_properties->setEnabled(true); - if (l.at(0) != m_startViewport && l.at(0) != m_endViewport) { - itemzoom->setEnabled(true); - itemrotatex->setEnabled(true); - itemrotatey->setEnabled(true); - itemrotatez->setEnabled(true); - } else { - itemzoom->setEnabled(false); - itemrotatex->setEnabled(false); - itemrotatey->setEnabled(false); - itemrotatez->setEnabled(false); - updateInfoText(); - } - if (l.at(0)->type() == TEXTITEM) { - showToolbars(TITLE_TEXT); - QGraphicsTextItem* i = static_cast (l.at(0)); - if (!i->data(100).isNull()) { - // Item has an effect - QStringList effdata = i->data(100).toStringList(); - QString effectName = effdata.takeFirst(); - if (effectName == "typewriter") { - QStringList params = effdata.at(0).split(';'); - typewriter_delay->setValue(params.at(0).toInt()); - typewriter_start->setValue(params.at(1).toInt()); - effect_list->setCurrentIndex(effect_list->findData((int) TYPEWRITEREFFECT)); - effect_stack->setHidden(false); - } - } else { -#if QT_VERSION >= 0x040600 - if (i->graphicsEffect()) { - QGraphicsBlurEffect *blur = static_cast (i->graphicsEffect()); - if (blur) { - effect_list->setCurrentIndex(effect_list->findData((int) BLUREFFECT)); - int rad = (int) blur->blurRadius(); - blur_radius->setValue(rad); - effect_stack->setHidden(false); - } else { - QGraphicsDropShadowEffect *shad = static_cast (i->graphicsEffect()); - if (shad) { - effect_list->setCurrentIndex(effect_list->findData((int) SHADOWEFFECT)); - shadow_radius->setValue(shad->blurRadius()); - shadow_x->setValue(shad->xOffset()); - shadow_y->setValue(shad->yOffset()); - effect_stack->setHidden(false); - } - } - } else { - effect_list->blockSignals(true); - effect_list->setCurrentIndex(effect_list->findData((int) NOEFFECT)); - effect_list->blockSignals(false); - effect_stack->setHidden(true); - } -#else - effect_list->blockSignals(true); - effect_list->setCurrentIndex(effect_list->findData((int) NOEFFECT)); - effect_list->blockSignals(false); - effect_stack->setHidden(true); -#endif - } - //if (l[0]->hasFocus()) - //toolBox->setCurrentIndex(0); - //toolBox->setItemEnabled(2, true); - font_size->blockSignals(true); - font_family->blockSignals(true); - font_weight_box->blockSignals(true); - buttonItalic->blockSignals(true); - buttonUnder->blockSignals(true); - fontColorButton->blockSignals(true); - textAlpha->blockSignals(true); - buttonAlignLeft->blockSignals(true); - buttonAlignRight->blockSignals(true); - buttonAlignNone->blockSignals(true); - buttonAlignCenter->blockSignals(true); - - QFont font = i->font(); - font_family->setCurrentFont(font); - font_size->setValue(font.pixelSize()); - m_scene->slotUpdateFontSize(font.pixelSize()); - buttonItalic->setChecked(font.italic()); - buttonUnder->setChecked(font.underline()); - setFontBoxWeight(font.weight()); - - QTextCursor cursor(i->document()); - cursor.select(QTextCursor::Document); - QColor color = cursor.charFormat().foreground().color(); - textAlpha->setValue(color.alpha()); - color.setAlpha(255); - fontColorButton->setColor(color); - - if (!i->data(101).isNull()) { - textOutline->blockSignals(true); - textOutline->setValue(i->data(101).toDouble()*10); - textOutline->blockSignals(false); - } - if (!i->data(102).isNull()) { - textOutlineColor->blockSignals(true); - textOutlineAlpha->blockSignals(true); - color = QColor(i->data(102).toString()); - textOutlineAlpha->setValue(color.alpha()); - color.setAlpha(255); - textOutlineColor->setColor(color); - textOutlineColor->blockSignals(false); - textOutlineAlpha->blockSignals(false); - } - QTextCursor cur = i->textCursor(); - QTextBlockFormat format = cur.blockFormat(); - if (i->textWidth() == -1) buttonAlignNone->setChecked(true); - else if (format.alignment() == Qt::AlignHCenter) buttonAlignCenter->setChecked(true); - else if (format.alignment() == Qt::AlignRight) buttonAlignRight->setChecked(true); - else if (format.alignment() == Qt::AlignLeft) buttonAlignLeft->setChecked(true); - - font_size->blockSignals(false); - font_family->blockSignals(false); - font_weight_box->blockSignals(false); - buttonItalic->blockSignals(false); - buttonUnder->blockSignals(false); - fontColorButton->blockSignals(false); - textAlpha->blockSignals(false); - buttonAlignLeft->blockSignals(false); - buttonAlignRight->blockSignals(false); - buttonAlignNone->blockSignals(false); - buttonAlignCenter->blockSignals(false); - - updateAxisButtons(i); - updateCoordinates(i); - updateDimension(i); - enableToolbars(TITLE_TEXT); - - } else if ((l.at(0))->type() == RECTITEM) { - showToolbars(TITLE_RECTANGLE); - settingUp = true; - QGraphicsRectItem *rec = static_cast (l.at(0)); - if (rec == m_startViewport || rec == m_endViewport) { - /*toolBox->setCurrentIndex(3); - toolBox->widget(0)->setEnabled(false); - toolBox->widget(1)->setEnabled(false);*/ - enableToolbars(TITLE_SELECT); - } else { - /*toolBox->widget(0)->setEnabled(true); - toolBox->widget(1)->setEnabled(true); - toolBox->setCurrentIndex(0);*/ - //toolBox->setItemEnabled(3, true); - rectFAlpha->setValue(rec->pen().color().alpha()); - rectBAlpha->setValue(rec->brush().color().alpha()); - //kDebug() << rec->brush().color().alpha(); - QColor fcol = rec->pen().color(); - QColor bcol = rec->brush().color(); - //fcol.setAlpha(255); - //bcol.setAlpha(255); - rectFColor->setColor(fcol); - rectBColor->setColor(bcol); - settingUp = false; - rectLineWidth->setValue(rec->pen().width()); - enableToolbars(TITLE_RECTANGLE); - } - - updateAxisButtons(l.at(0)); - updateCoordinates(rec); - updateDimension(rec); - - } else if (l.at(0)->type() == IMAGEITEM) { - showToolbars(TITLE_IMAGE); - - updateCoordinates(l.at(0)); - updateDimension(l.at(0)); - - enableToolbars(TITLE_IMAGE); - - } else { - //toolBox->setCurrentIndex(0); - showToolbars(TITLE_SELECT); - enableToolbars(TITLE_SELECT); - frame_properties->setEnabled(false); - } - zValue->setValue((int)l.at(0)->zValue()); - if (!l.at(0)->data(ZOOMFACTOR).isNull()) itemzoom->setValue(l.at(0)->data(ZOOMFACTOR).toInt()); - else itemzoom->setValue((int)(m_transformations.value(l.at(0)).scalex * 100.0 + 0.5)); - itemrotatex->setValue((int)(m_transformations.value(l.at(0)).rotatex)); - itemrotatey->setValue((int)(m_transformations.value(l.at(0)).rotatey)); - itemrotatez->setValue((int)(m_transformations.value(l.at(0)).rotatez)); - value_x->blockSignals(false); - value_y->blockSignals(false); - value_w->blockSignals(false); - value_h->blockSignals(false); - itemzoom->blockSignals(false); - itemrotatex->blockSignals(false); - itemrotatey->blockSignals(false); - itemrotatez->blockSignals(false); - } -} - -void TitleWidget::slotValueChanged(int type) -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() > 0 && l.at(0)->type() == IMAGEITEM) { - - int val = 0; - switch (type) { - case ValueWidth: - val = value_w->value(); - break; - case ValueHeight: - val = value_h->value(); - break; - } - - QGraphicsItem *i = l.at(0); - Transform t = m_transformations.value(i); - - // Ratio width:height - double phi = (double) i->boundingRect().width() / i->boundingRect().height(); - // TODO: proper calculation for rotation around 3 axes - double alpha = (double) t.rotatez / 180.0 * M_PI; - - // New length - double length = val; - - // Scaling factor - double scale = 1; - - switch (type) { - case ValueWidth: - // Add 0.5 because otherwise incrementing by 1 might have no effect - length = val / (cos(alpha) + 1 / phi * sin(alpha)) + 0.5; - scale = length / i->boundingRect().width(); - break; - case ValueHeight: - length = val / (phi * sin(alpha) + cos(alpha)) + 0.5; - scale = length / i->boundingRect().height(); - break; - } - - t.scalex = scale; - t.scaley = scale; - QTransform qtrans; - qtrans.scale(scale, scale); - qtrans.rotate(t.rotatex, Qt::XAxis); - qtrans.rotate(t.rotatey, Qt::YAxis); - qtrans.rotate(t.rotatez, Qt::ZAxis); - i->setTransform(qtrans); - m_transformations[i] = t; - - updateDimension(i); - updateRotZoom(i); - } -} - -/** \brief Updates position/size of the selected item when a value - * of an item (coordinates, size) has changed */ -void TitleWidget::slotAdjustSelectedItem() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() >= 1) { - if (l.at(0)->type() == RECTITEM) { - //rect item - QGraphicsRectItem *rec = static_cast (l.at(0)); - updatePosition(rec); - rec->setRect(QRect(0, 0, value_w->value(), value_h->value())); - } else if (l.at(0)->type() == TEXTITEM) { - //text item - updatePosition(l.at(0)); - } else if (l.at(0)->type() == IMAGEITEM) { - //image item - updatePosition(l.at(0)); - } - } -} - -/** \brief Updates width/height int the text fields, regarding transformation matrix */ -void TitleWidget::updateDimension(QGraphicsItem *i) -{ - value_w->blockSignals(true); - value_h->blockSignals(true); - zValue->blockSignals(true); - - zValue->setValue((int) i->zValue()); - if (i->type() == IMAGEITEM) { - // Get multipliers for rotation/scaling - - /*Transform t = m_transformations.value(i); - QRectF r = i->boundingRect(); - int width = (int) ( abs(r.width()*t.scalex * cos(t.rotate/180.0*M_PI)) - + abs(r.height()*t.scaley * sin(t.rotate/180.0*M_PI)) ); - int height = (int) ( abs(r.height()*t.scaley * cos(t.rotate/180*M_PI)) - + abs(r.width()*t.scalex * sin(t.rotate/180*M_PI)) );*/ - - value_w->setValue(i->sceneBoundingRect().width()); - value_h->setValue(i->sceneBoundingRect().height()); - } else if (i->type() == RECTITEM) { - QGraphicsRectItem *r = static_cast (i); - value_w->setValue((int) r->rect().width()); - value_h->setValue((int) r->rect().height()); - } else if (i->type() == TEXTITEM) { - QGraphicsTextItem *t = static_cast (i); - value_w->setValue((int) t->boundingRect().width()); - value_h->setValue((int) t->boundingRect().height()); - } - - zValue->blockSignals(false); - value_w->blockSignals(false); - value_h->blockSignals(false); -} - -/** \brief Updates the coordinates in the text fields from the item */ -void TitleWidget::updateCoordinates(QGraphicsItem *i) -{ - // Block signals emitted by this method - value_x->blockSignals(true); - value_y->blockSignals(true); - - if (i->type() == TEXTITEM) { - - QGraphicsTextItem *rec = static_cast (i); - - // Set the correct x coordinate value - if (origin_x_left->isChecked()) { - // Origin (0 point) is at m_frameWidth, coordinate axis is inverted - value_x->setValue((int)(m_frameWidth - rec->pos().x() - rec->boundingRect().width())); - } else { - // Origin is at 0 (default) - value_x->setValue((int) rec->pos().x()); - } - - // Same for y - if (origin_y_top->isChecked()) { - value_y->setValue((int)(m_frameHeight - rec->pos().y() - rec->boundingRect().height())); - } else { - value_y->setValue((int) rec->pos().y()); - } - - } else if (i->type() == RECTITEM) { - - QGraphicsRectItem *rec = static_cast (i); - - if (origin_x_left->isChecked()) { - // Origin (0 point) is at m_frameWidth - value_x->setValue((int)(m_frameWidth - rec->pos().x() - rec->rect().width())); - } else { - // Origin is at 0 (default) - value_x->setValue((int) rec->pos().x()); - } - - if (origin_y_top->isChecked()) { - value_y->setValue((int)(m_frameHeight - rec->pos().y() - rec->rect().height())); - } else { - value_y->setValue((int) rec->pos().y()); - } - - } else if (i->type() == IMAGEITEM) { - - if (origin_x_left->isChecked()) { - value_x->setValue((int)(m_frameWidth - i->pos().x() - i->sceneBoundingRect().width())); - } else { - value_x->setValue((int) i->pos().x()); - } - - if (origin_y_top->isChecked()) { - value_y->setValue((int)(m_frameHeight - i->pos().y() - i->sceneBoundingRect().height())); - } else { - value_y->setValue((int) i->pos().y()); - } - - } - - // Stop blocking signals now - value_x->blockSignals(false); - value_y->blockSignals(false); -} - -void TitleWidget::updateRotZoom(QGraphicsItem *i) -{ - itemzoom->blockSignals(true); - itemrotatex->blockSignals(true); - itemrotatey->blockSignals(true); - itemrotatez->blockSignals(true); - - Transform t = m_transformations.value(i); - - if (!i->data(ZOOMFACTOR).isNull()) itemzoom->setValue(i->data(ZOOMFACTOR).toInt()); - else itemzoom->setValue((int)(t.scalex * 100.0 + 0.5)); - - itemrotatex->setValue((int)(t.rotatex)); - itemrotatey->setValue((int)(t.rotatey)); - itemrotatez->setValue((int)(t.rotatez)); - - itemzoom->blockSignals(false); - itemrotatex->blockSignals(false); - itemrotatey->blockSignals(false); - itemrotatez->blockSignals(false); -} - -/** \brief Updates the position of an item by reading coordinates from the text fields */ -void TitleWidget::updatePosition(QGraphicsItem *i) -{ - if (i->type() == TEXTITEM) { - QGraphicsTextItem *rec = static_cast (i); - - int posX; - if (origin_x_left->isChecked()) { - /* Origin of the x axis is at m_frameWidth, - * and distance from right border of the item to the right - * border of the frame is taken. - * See comment to slotOriginXClicked(). - */ - posX = m_frameWidth - value_x->value() - rec->boundingRect().width(); - } else { - posX = value_x->value(); - } - - int posY; - if (origin_y_top->isChecked()) { - /* Same for y axis */ - posY = m_frameHeight - value_y->value() - rec->boundingRect().height(); - } else { - posY = value_y->value(); - } - - rec->setPos(posX, posY); - - } else if (i->type() == RECTITEM) { - - QGraphicsRectItem *rec = static_cast (i); - - int posX; - if (origin_x_left->isChecked()) { - posX = m_frameWidth - value_x->value() - rec->rect().width(); - } else { - posX = value_x->value(); - } - - int posY; - if (origin_y_top->isChecked()) { - posY = m_frameHeight - value_y->value() - rec->rect().height(); - } else { - posY = value_y->value(); - } - - rec->setPos(posX, posY); - - } else if (i->type() == IMAGEITEM) { - int posX; - if (origin_x_left->isChecked()) { - // Use the sceneBoundingRect because this also regards transformations like zoom - posX = m_frameWidth - value_x->value() - i->sceneBoundingRect().width(); - } else { - posX = value_x->value(); - } - - int posY; - if (origin_y_top->isChecked()) { - posY = m_frameHeight - value_y->value() - i->sceneBoundingRect().height(); - } else { - posY = value_y->value(); - } - - i->setPos(posX, posY); - - } - -} - -void TitleWidget::updateTextOriginX() -{ - if (origin_x_left->isChecked()) { - origin_x_left->setText(i18n("\u2212X")); - } else { - origin_x_left->setText(i18n("+X")); - } -} - -void TitleWidget::slotOriginXClicked() -{ - // Update the text displayed on the button. - updateTextOriginX(); - - QList l = graphicsView->scene()->selectedItems(); - if (l.size() >= 1) { - updateCoordinates(l.at(0)); - - // Remember x axis setting - l.at(0)->setData(TitleDocument::OriginXLeft, origin_x_left->isChecked() ? - TitleDocument::AxisInverted : TitleDocument::AxisDefault); - } - graphicsView->setFocus(); -} - -void TitleWidget::updateTextOriginY() -{ - if (origin_y_top->isChecked()) { - origin_y_top->setText(i18n("\u2212Y")); - } else { - origin_y_top->setText(i18n("+Y")); - } -} - -void TitleWidget::slotOriginYClicked() -{ - // Update the text displayed on the button. - updateTextOriginY(); - - QList l = graphicsView->scene()->selectedItems(); - if (l.size() >= 1) { - updateCoordinates(l.at(0)); - - l.at(0)->setData(TitleDocument::OriginYTop, origin_y_top->isChecked() ? - TitleDocument::AxisInverted : TitleDocument::AxisDefault); - - } - graphicsView->setFocus(); -} - -void TitleWidget::updateAxisButtons(QGraphicsItem *i) -{ - int xAxis = i->data(TitleDocument::OriginXLeft).toInt(); - int yAxis = i->data(TitleDocument::OriginYTop).toInt(); - origin_x_left->blockSignals(true); - origin_y_top->blockSignals(true); - - if (xAxis == TitleDocument::AxisInverted) { - origin_x_left->setChecked(true); - } else { - origin_x_left->setChecked(false); - } - updateTextOriginX(); - - if (yAxis == TitleDocument::AxisInverted) { - origin_y_top->setChecked(true); - } else { - origin_y_top->setChecked(false); - } - updateTextOriginY(); - - origin_x_left->blockSignals(false); - origin_y_top->blockSignals(false); -} - -void TitleWidget::slotChangeBackground() -{ - QColor color = backgroundColor->color(); - color.setAlpha(backgroundAlpha->value()); - m_frameBorder->setBrush(QBrush(color)); -} - -/** - * Something (yeah) has changed in our QGraphicsScene. - */ -void TitleWidget::slotChanged() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() >= 1 && l.at(0)->type() == TEXTITEM) { - textChanged(static_cast (l.at(0))); - } -} - -/** - * If the user has set origin_x_left (everything also for y), - * we need to look whether a text element has been selected. If yes, - * we need to ensure that the right border of the text field - * remains fixed also when some text has been entered. - * - * This is also known as right-justified, with the difference that - * it is not valid for text but for its boundingRect. Text may still - * be left-justified. - */ -void TitleWidget::textChanged(QGraphicsTextItem *i) -{ - - updateDimension(i); - - if (origin_x_left->isChecked() || origin_y_top->isChecked()) { - - if (!i->toPlainText().isEmpty()) { - updatePosition(i); - } else { - /* - * Don't do anything if the string is empty. If the position - * would be updated here, a newly created text field would - * be set to the position of the last selected text field. - */ - } - } -} - -void TitleWidget::slotInsertUnicode() -{ - m_unicodeDialog->exec(); -} - -void TitleWidget::slotInsertUnicodeString(QString text) -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() > 0) { - if (l.at(0)->type() == TEXTITEM) { - QGraphicsTextItem *t = static_cast (l.at(0)); - t->textCursor().insertText(text); - } - } -} - -void TitleWidget::slotUpdateText() -{ - QFont font = font_family->currentFont(); - font.setPixelSize(font_size->value()); - font.setItalic(buttonItalic->isChecked()); - font.setUnderline(buttonUnder->isChecked()); - font.setWeight(font_weight_box->itemData(font_weight_box->currentIndex()).toInt()); - QColor color = fontColorButton->color(); - color.setAlpha(textAlpha->value()); - - QColor outlineColor = textOutlineColor->color(); - outlineColor.setAlpha(textOutlineAlpha->value()); - double outlineWidth = textOutline->value() / 10.0; - QGraphicsTextItem* item = NULL; - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1 && l.at(0)->type() == TEXTITEM) { - item = static_cast (l.at(0)); - } - if (!item) return; - //if (item->textCursor().selection ().isEmpty()) - QTextCursor cur(item->document()); - cur.select(QTextCursor::Document); - QTextBlockFormat format = cur.blockFormat(); - if (buttonAlignLeft->isChecked() || buttonAlignCenter->isChecked() || buttonAlignRight->isChecked()) { - item->setTextWidth(item->boundingRect().width()); - if (buttonAlignCenter->isChecked()) format.setAlignment(Qt::AlignHCenter); - else if (buttonAlignRight->isChecked()) format.setAlignment(Qt::AlignRight); - else if (buttonAlignLeft->isChecked()) format.setAlignment(Qt::AlignLeft); - } else { - format.setAlignment(Qt::AlignLeft); - item->setTextWidth(-1); - } - - item->setFont(font); - QTextCharFormat cformat = cur.charFormat(); - - item->setData(101, outlineWidth); - item->setData(102, outlineColor); - if (outlineWidth > 0.0) cformat.setTextOutline(QPen(outlineColor, outlineWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); - - cformat.setForeground(QBrush(color)); - cur.setCharFormat(cformat); - cur.setBlockFormat(format); - item->setTextCursor(cur); - cur.clearSelection(); - item->setTextCursor(cur); -} - -void TitleWidget::rectChanged() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1 && l.at(0)->type() == RECTITEM && !settingUp) { - QGraphicsRectItem *rec = static_cast(l.at(0)); - QColor f = rectFColor->color(); - f.setAlpha(rectFAlpha->value()); - QPen penf(f); - penf.setWidth(rectLineWidth->value()); - penf.setJoinStyle(Qt::RoundJoin); - rec->setPen(penf); - QColor b = rectBColor->color(); - b.setAlpha(rectBAlpha->value()); - rec->setBrush(QBrush(b)); - } -} - -void TitleWidget::itemScaled(int val) -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - Transform x = m_transformations.value(l.at(0)); - x.scalex = (double)val / 100.0; - x.scaley = (double)val / 100.0; - QTransform qtrans; - qtrans.scale(x.scalex, x.scaley); - qtrans.rotate(x.rotatex, Qt::XAxis); - qtrans.rotate(x.rotatey, Qt::YAxis); - qtrans.rotate(x.rotatez, Qt::ZAxis); - l[0]->setTransform(qtrans); - l[0]->setData(ZOOMFACTOR, val); - m_transformations[l.at(0)] = x; - updateDimension(l.at(0)); - } -} - -void TitleWidget::itemRotateX(qreal val) -{ - itemRotate(val, 0); -} - -void TitleWidget::itemRotateY(qreal val) -{ - itemRotate(val, 1); -} - -void TitleWidget::itemRotateZ(qreal val) -{ - itemRotate(val, 2); -} - -void TitleWidget::itemRotate(qreal val, int axis) -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - Transform x = m_transformations[l.at(0)]; - switch (axis) { - case 0: - x.rotatex = val; - break; - case 1: - x.rotatey = val; - break; - case 2: - x.rotatez = val; - break; - } - - l[0]->setData(ROTATEFACTOR, QList() << QVariant(x.rotatex) << QVariant(x.rotatey) << QVariant(x.rotatez)); - - QTransform qtrans; - qtrans.scale(x.scalex, x.scaley); - qtrans.rotate(x.rotatex, Qt::XAxis); - qtrans.rotate(x.rotatey, Qt::YAxis); - qtrans.rotate(x.rotatez, Qt::ZAxis); - l[0]->setTransform(qtrans); - m_transformations[l.at(0)] = x; - if (l[0]->data(ZOOMFACTOR).isNull()) l[0]->setData(ZOOMFACTOR, 100); - updateDimension(l.at(0)); - } -} - -void TitleWidget::itemHCenter() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - QGraphicsItem *item = l.at(0); - QRectF br = item->sceneBoundingRect(); - int width = (int)br.width(); - int newPos = (int)((m_frameWidth - width) / 2); - newPos += item->pos().x() - br.left(); // Check item transformation - item->setPos(newPos, item->pos().y()); - updateCoordinates(item); - } -} - -void TitleWidget::itemVCenter() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - QGraphicsItem *item = l.at(0); - QRectF br = item->sceneBoundingRect(); - int height = (int)br.height(); - int newPos = (int)((m_frameHeight - height) / 2); - newPos += item->pos().y() - br.top(); // Check item transformation - item->setPos(item->pos().x(), newPos); - updateCoordinates(item); - } -} - -void TitleWidget::itemTop() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - QGraphicsItem *item = l.at(0); - QRectF br = item->sceneBoundingRect(); - double diff; - if (br.top() > 0) diff = -br.top(); - else diff = -br.bottom(); - item->moveBy(0, diff); - updateCoordinates(item); - } -} - -void TitleWidget::itemBottom() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - QGraphicsItem *item = l.at(0); - QRectF br = item->sceneBoundingRect(); - double diff; - if (br.bottom() > m_frameHeight) diff = m_frameHeight - br.top(); - else diff = m_frameHeight - br.bottom(); - item->moveBy(0, diff); - updateCoordinates(item); - } -} - -void TitleWidget::itemLeft() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - QGraphicsItem *item = l.at(0); - QRectF br = item->sceneBoundingRect(); - double diff; - if (br.left() > 0) diff = -br.left(); - else diff = -br.right(); - item->moveBy(diff, 0); - updateCoordinates(item); - } -} - -void TitleWidget::itemRight() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - QGraphicsItem *item = l.at(0); - QRectF br = item->sceneBoundingRect(); - double diff; - if (br.right() < m_frameWidth) diff = m_frameWidth - br.right(); - else diff = m_frameWidth - br.left(); - item->moveBy(diff, 0); - updateCoordinates(item); - } -} - -void TitleWidget::setupViewports() -{ - //double aspect_ratio = 4.0 / 3.0;//read from project - //better zoom centered, but render uses only the created rect, so no problem to change the zoom function - /*QRectF sp(0, 0, startViewportSize->value() * m_frameWidth / 100.0 , startViewportSize->value()* m_frameHeight / 100.0); - QRectF ep(0, 0, endViewportSize->value() * m_frameWidth / 100.0, endViewportSize->value() * m_frameHeight / 100.0); - // use a polygon thiat uses 16:9 and 4:3 rects forpreview the size in all aspect ratios ? - QPolygonF spoly(sp); - QPolygonF epoly(ep); - spoly.translate(startViewportX->value(), startViewportY->value()); - epoly.translate(endViewportX->value(), endViewportY->value()); - m_startViewport->setPolygon(spoly); - m_endViewport->setPolygon(epoly); - if (! insertingValues) { - m_startViewport->setData(0, startViewportX->value()); - m_startViewport->setData(1, startViewportY->value()); - m_startViewport->setData(2, startViewportSize->value()); - - m_endViewport->setData(0, endViewportX->value()); - m_endViewport->setData(1, endViewportY->value()); - m_endViewport->setData(2, endViewportSize->value()); - }*/ -} - -void TitleWidget::loadTitle(KUrl url) -{ - if (url.isEmpty()) url = KFileDialog::getOpenUrl(KUrl(m_projectTitlePath), "application/x-kdenlivetitle", this, i18n("Load Title")); - if (!url.isEmpty()) { - QList items = m_scene->items(); - for (int i = 0; i < items.size(); i++) { - if (items.at(i)->zValue() > -1000) delete items.at(i); - } - m_scene->clearTextSelection(); - QDomDocument doc; - QString tmpfile; - - if (KIO::NetAccess::download(url, tmpfile, 0)) { - QFile file(tmpfile); - if (file.open(QIODevice::ReadOnly)) { - doc.setContent(&file, false); - file.close(); - } else return; - KIO::NetAccess::removeTempFile(tmpfile); - } - setXml(doc); - - /*int out; - m_count = m_titledocument.loadDocument(url, m_startViewport, m_endViewport, &out) + 1; - adjustFrameSize(); - title_duration->setText(m_tc.getTimecode(GenTime(out, m_render->fps()))); - insertingValues = true; - startViewportX->setValue(m_startViewport->data(0).toInt()); - startViewportY->setValue(m_startViewport->data(1).toInt()); - startViewportSize->setValue(m_startViewport->data(2).toInt()); - endViewportX->setValue(m_endViewport->data(0).toInt()); - endViewportY->setValue(m_endViewport->data(1).toInt()); - endViewportSize->setValue(m_endViewport->data(2).toInt()); - - insertingValues = false; - slotSelectTool(); - slotAdjustZoom();*/ - } -} - -void TitleWidget::saveTitle(KUrl url) -{ - if (anim_start->isChecked()) slotAnimStart(false); - if (anim_end->isChecked()) slotAnimEnd(false); - if (url.isEmpty()) { - KFileDialog *fs = new KFileDialog(KUrl(m_projectTitlePath), "application/x-kdenlivetitle", this); - fs->setOperationMode(KFileDialog::Saving); - fs->setMode(KFile::File); -#if KDE_IS_VERSION(4,2,0) - fs->setConfirmOverwrite(true); -#endif - fs->setKeepLocation(true); - fs->exec(); - url = fs->selectedUrl(); - delete fs; - } - if (!url.isEmpty()) { - if (m_titledocument.saveDocument(url, m_startViewport, m_endViewport, m_tc.getFrameCount(title_duration->text())) == false) - KMessageBox::error(this, i18n("Cannot write to file %1", url.path())); - } -} - -QDomDocument TitleWidget::xml() -{ - QDomDocument doc = m_titledocument.xml(m_startViewport, m_endViewport); - doc.documentElement().setAttribute("out", m_tc.getFrameCount(title_duration->text())); - return doc; -} - -int TitleWidget::duration() const -{ - return m_tc.getFrameCount(title_duration->text()); -} - -void TitleWidget::setXml(QDomDocument doc) -{ - int out; - m_count = m_titledocument.loadFromXml(doc, m_startViewport, m_endViewport, &out); - adjustFrameSize(); - title_duration->setText(m_tc.getTimecode(GenTime(out, m_render->fps()))); - /*if (doc.documentElement().hasAttribute("out")) { - GenTime duration = GenTime(doc.documentElement().attribute("out").toDouble() / 1000.0); - title_duration->setText(m_tc.getTimecode(duration)); - } - else title_duration->setText(m_tc.getTimecode(GenTime(5000)));*/ - - QDomElement e = doc.documentElement(); - m_transformations.clear(); - QList items = graphicsView->scene()->items(); - const double PI = 4.0 * atan(1.0); - for (int i = 0; i < items.count(); i++) { - QTransform t = items.at(i)->transform(); - Transform x; - x.scalex = t.m11(); - x.scaley = t.m22(); - if (!items.at(i)->data(ROTATEFACTOR).isNull()) { - QList rotlist = items.at(i)->data(ROTATEFACTOR).toList(); - if (rotlist.count() >= 3) { - x.rotatex = rotlist[0].toDouble(); - x.rotatey = rotlist[1].toDouble(); - x.rotatez = rotlist[2].toDouble(); - - // Try to adjust zoom - t.rotate(x.rotatex *(-1), Qt::XAxis); - t.rotate(x.rotatey *(-1), Qt::YAxis); - t.rotate(x.rotatez *(-1), Qt::ZAxis); - x.scalex = t.m11(); - x.scaley = t.m22(); - } else { - x.rotatex = 0; - x.rotatey = 0; - x.rotatez = 0; - } - } else { - x.rotatex = 0; - x.rotatey = 0; - x.rotatez = 180. / PI * atan2(-t.m21(), t.m11()); - } - m_transformations[items.at(i)] = x; - } - // mbd: Update the GUI color selectors to match the stuff from the loaded document - QColor background_color = m_titledocument.getBackgroundColor(); - backgroundAlpha->blockSignals(true); - backgroundColor->blockSignals(true); - backgroundAlpha->setValue(background_color.alpha()); - background_color.setAlpha(255); - backgroundColor->setColor(background_color); - backgroundAlpha->blockSignals(false); - backgroundColor->blockSignals(false); - - /*startViewportX->setValue(m_startViewport->data(0).toInt()); - startViewportY->setValue(m_startViewport->data(1).toInt()); - startViewportSize->setValue(m_startViewport->data(2).toInt()); - endViewportX->setValue(m_endViewport->data(0).toInt()); - endViewportY->setValue(m_endViewport->data(1).toInt()); - endViewportSize->setValue(m_endViewport->data(2).toInt());*/ - - QTimer::singleShot(200, this, SLOT(slotAdjustZoom())); - slotSelectTool(); - selectionChanged(); -} - -/** \brief Connected to the accepted signal - calls writeChoices */ -void TitleWidget::slotAccepted() -{ - if (anim_start->isChecked()) slotAnimStart(false); - if (anim_end->isChecked()) slotAnimEnd(false); - writeChoices(); -} - -/** \brief Store the current choices of font, background and rect values */ -void TitleWidget::writeChoices() -{ - // Get a pointer to a shared configuration instance, then get the TitleWidget group. - KSharedConfigPtr config = KGlobal::config(); - KConfigGroup titleConfig(config, "TitleWidget"); - // Write the entries - titleConfig.writeEntry("font_family", font_family->currentFont()); - //titleConfig.writeEntry("font_size", font_size->value()); - titleConfig.writeEntry("font_pixel_size", font_size->value()); - titleConfig.writeEntry("font_color", fontColorButton->color()); - titleConfig.writeEntry("font_alpha", textAlpha->value()); - titleConfig.writeEntry("font_outline", textOutline->value()); - titleConfig.writeEntry("font_outline_color", textOutlineColor->color()); - titleConfig.writeEntry("font_outline_alpha", textOutlineAlpha->value()); - titleConfig.writeEntry("font_weight", font_weight_box->itemData(font_weight_box->currentIndex()).toInt()); - titleConfig.writeEntry("font_italic", buttonItalic->isChecked()); - titleConfig.writeEntry("font_underlined", buttonUnder->isChecked()); - - titleConfig.writeEntry("rect_foreground_color", rectFColor->color()); - titleConfig.writeEntry("rect_foreground_alpha", rectFAlpha->value()); - titleConfig.writeEntry("rect_background_color", rectBColor->color()); - titleConfig.writeEntry("rect_background_alpha", rectBAlpha->value()); - titleConfig.writeEntry("rect_line_width", rectLineWidth->value()); - - titleConfig.writeEntry("background_color", backgroundColor->color()); - titleConfig.writeEntry("background_alpha", backgroundAlpha->value()); - - //! \todo Not sure if I should sync - it is probably safe to do it - config->sync(); - -} - -/** \brief Read the last stored choices into the dialog */ -void TitleWidget::readChoices() -{ - // Get a pointer to a shared configuration instance, then get the TitleWidget group. - KSharedConfigPtr config = KGlobal::config(); - KConfigGroup titleConfig(config, "TitleWidget"); - // read the entries - font_family->setCurrentFont(titleConfig.readEntry("font_family", font_family->currentFont())); - font_size->setValue(titleConfig.readEntry("font_pixel_size", font_size->value())); - m_scene->slotUpdateFontSize(font_size->value()); - fontColorButton->setColor(titleConfig.readEntry("font_color", fontColorButton->color())); - textAlpha->setValue(titleConfig.readEntry("font_alpha", textAlpha->value())); - - textOutlineColor->setColor(titleConfig.readEntry("font_outline_color", textOutlineColor->color())); - textOutlineAlpha->setValue(titleConfig.readEntry("font_outline_alpha", textOutlineAlpha->value())); - textOutline->setValue(titleConfig.readEntry("font_outline", textOutline->value())); - - int weight; - if (titleConfig.readEntry("font_bold", false)) weight = QFont::Bold; - else weight = titleConfig.readEntry("font_weight", font_weight_box->itemData(font_weight_box->currentIndex()).toInt()); - setFontBoxWeight(weight); - buttonItalic->setChecked(titleConfig.readEntry("font_italic", buttonItalic->isChecked())); - buttonUnder->setChecked(titleConfig.readEntry("font_underlined", buttonUnder->isChecked())); - - rectFColor->setColor(titleConfig.readEntry("rect_foreground_color", rectFColor->color())); - rectFAlpha->setValue(titleConfig.readEntry("rect_foreground_alpha", rectFAlpha->value())); - rectBColor->setColor(titleConfig.readEntry("rect_background_color", rectBColor->color())); - rectBAlpha->setValue(titleConfig.readEntry("rect_background_alpha", rectBAlpha->value())); - rectLineWidth->setValue(titleConfig.readEntry("rect_line_width", rectLineWidth->value())); - - backgroundColor->setColor(titleConfig.readEntry("background_color", backgroundColor->color())); - backgroundAlpha->setValue(titleConfig.readEntry("background_alpha", backgroundAlpha->value())); -} - -void TitleWidget::adjustFrameSize() -{ - m_frameWidth = m_titledocument.frameWidth(); - m_frameHeight = m_titledocument.frameHeight(); - m_frameBorder->setRect(0, 0, m_frameWidth, m_frameHeight); - displayBackgroundFrame(); -} - -void TitleWidget::slotAnimStart(bool anim) -{ - if (anim && anim_end->isChecked()) { - anim_end->setChecked(false); - m_endViewport->setZValue(-1000); - m_endViewport->setBrush(QBrush()); - } - slotSelectTool(); - QList list = m_scene->items(); - for (int i = 0; i < list.count(); i++) { - if (list.at(i)->zValue() > -1000) { - list.at(i)->setFlag(QGraphicsItem::ItemIsMovable, !anim); - list.at(i)->setFlag(QGraphicsItem::ItemIsSelectable, !anim); - } - } - align_box->setEnabled(anim); - itemzoom->setEnabled(!anim); - itemrotatex->setEnabled(!anim); - itemrotatey->setEnabled(!anim); - itemrotatez->setEnabled(!anim); - frame_toolbar->setEnabled(!anim); - toolbar_stack->setEnabled(!anim); - if (anim) { - keep_aspect->setChecked(!m_startViewport->data(0).isNull()); - m_startViewport->setZValue(1100); - QColor col = m_startViewport->pen().color(); - col.setAlpha(100); - m_startViewport->setBrush(col); - m_startViewport->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); - m_startViewport->setSelected(true); - selectionChanged(); - slotSelectTool(); - if (m_startViewport->childItems().isEmpty()) addAnimInfoText(); - } else { - m_startViewport->setZValue(-1000); - m_startViewport->setBrush(QBrush()); - m_startViewport->setFlags(0); - if (!anim_end->isChecked()) deleteAnimInfoText(); - } - -} - -void TitleWidget::slotAnimEnd(bool anim) -{ - if (anim && anim_start->isChecked()) { - anim_start->setChecked(false); - m_startViewport->setZValue(-1000); - m_startViewport->setBrush(QBrush()); - } - slotSelectTool(); - QList list = m_scene->items(); - for (int i = 0; i < list.count(); i++) { - if (list.at(i)->zValue() > -1000) { - list.at(i)->setFlag(QGraphicsItem::ItemIsMovable, !anim); - list.at(i)->setFlag(QGraphicsItem::ItemIsSelectable, !anim); - } - } - align_box->setEnabled(anim); - itemzoom->setEnabled(!anim); - itemrotatex->setEnabled(!anim); - itemrotatey->setEnabled(!anim); - itemrotatez->setEnabled(!anim); - frame_toolbar->setEnabled(!anim); - toolbar_stack->setEnabled(!anim); - if (anim) { - keep_aspect->setChecked(!m_endViewport->data(0).isNull()); - m_endViewport->setZValue(1100); - QColor col = m_endViewport->pen().color(); - col.setAlpha(100); - m_endViewport->setBrush(col); - m_endViewport->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); - m_endViewport->setSelected(true); - selectionChanged(); - slotSelectTool(); - if (m_endViewport->childItems().isEmpty()) addAnimInfoText(); - } else { - m_endViewport->setZValue(-1000); - m_endViewport->setBrush(QBrush()); - m_endViewport->setFlags(0); - if (!anim_start->isChecked()) deleteAnimInfoText(); - } -} - -void TitleWidget::addAnimInfoText() -{ - // add text to anim viewport - QGraphicsTextItem *t = new QGraphicsTextItem(i18n("Start"), m_startViewport); - QGraphicsTextItem *t2 = new QGraphicsTextItem(i18n("End"), m_endViewport); - QFont font = t->font(); - font.setPixelSize(m_startViewport->rect().width() / 10); - QColor col = m_startViewport->pen().color(); - col.setAlpha(255); - t->setDefaultTextColor(col); - t->setFont(font); - font.setPixelSize(m_endViewport->rect().width() / 10); - col = m_endViewport->pen().color(); - col.setAlpha(255); - t2->setDefaultTextColor(col); - t2->setFont(font); -} - -void TitleWidget::updateInfoText() -{ - // update info text font - if (!m_startViewport->childItems().isEmpty()) { - QGraphicsTextItem *item = static_cast (m_startViewport->childItems().at(0)); - if (item) { - QFont font = item->font(); - font.setPixelSize(m_startViewport->rect().width() / 10); - item->setFont(font); - } - } - if (!m_endViewport->childItems().isEmpty()) { - QGraphicsTextItem *item = static_cast (m_endViewport->childItems().at(0)); - if (item) { - QFont font = item->font(); - font.setPixelSize(m_endViewport->rect().width() / 10); - item->setFont(font); - } - } -} - -void TitleWidget::deleteAnimInfoText() -{ - // end animation editing, remove info text - while (!m_startViewport->childItems().isEmpty()) { - QGraphicsItem *item = m_startViewport->childItems().at(0); - m_scene->removeItem(item); - delete item; - } - while (!m_endViewport->childItems().isEmpty()) { - QGraphicsItem *item = m_endViewport->childItems().at(0); - m_scene->removeItem(item); - delete item; - } -} - - -void TitleWidget::slotKeepAspect(bool keep) -{ - if (m_endViewport->zValue() == 1100) { - m_endViewport->setData(0, keep == true ? m_frameWidth : QVariant()); - m_endViewport->setData(1, keep == true ? m_frameHeight : QVariant()); - } else { - m_startViewport->setData(0, keep == true ? m_frameWidth : QVariant()); - m_startViewport->setData(1, keep == true ? m_frameHeight : QVariant()); - } -} - -void TitleWidget::slotResize50() -{ - if (m_endViewport->zValue() == 1100) { - m_endViewport->setRect(0, 0, m_frameWidth / 2, m_frameHeight / 2); - } else m_startViewport->setRect(0, 0, m_frameWidth / 2, m_frameHeight / 2); -} - -void TitleWidget::slotResize100() -{ - if (m_endViewport->zValue() == 1100) { - m_endViewport->setRect(0, 0, m_frameWidth, m_frameHeight); - } else m_startViewport->setRect(0, 0, m_frameWidth, m_frameHeight); -} - -void TitleWidget::slotResize200() -{ - if (m_endViewport->zValue() == 1100) { - m_endViewport->setRect(0, 0, m_frameWidth * 2, m_frameHeight * 2); - } else m_startViewport->setRect(0, 0, m_frameWidth * 2, m_frameHeight * 2); -} - -void TitleWidget::slotAddEffect(int ix) -{ - QList l = graphicsView->scene()->selectedItems(); - int effect = effect_list->itemData(ix).toInt(); - if (effect == NOEFFECT) { - if (l.size() == 1) l[0]->setData(100, QVariant()); - effect_stack->setHidden(true); - return; - } - effect_stack->setCurrentIndex(effect - 1); - effect_stack->setHidden(false); - if (effect == TYPEWRITEREFFECT) { - if (l.size() == 1 && l.at(0)->type() == TEXTITEM) { - QStringList effdata = QStringList() << "typewriter" << QString::number(typewriter_delay->value()) + ";" + QString::number(typewriter_start->value()); - l[0]->setData(100, effdata); - } - } -#if QT_VERSION < 0x040600 - return; -#else - if (effect == BLUREFFECT) { - // Blur effect - if (l.size() == 1) { - QGraphicsEffect *eff = new QGraphicsBlurEffect(); - l[0]->setGraphicsEffect(eff); - } - } else if (effect == SHADOWEFFECT) { - if (l.size() == 1) { - QGraphicsEffect *eff = new QGraphicsDropShadowEffect(); - l[0]->setGraphicsEffect(eff); - } - } - -#endif -} - - -void TitleWidget::slotFontText(const QString& s) -{ - const QFont f(s); - if (f.exactMatch()) { - // Font really exists (could also just be a «d» if the user - // starts typing «dejavu» for example). - font_family->setCurrentFont(f); - } - // Note: Typing dejavu serif does not recognize the font (takes sans) - // in older Qt versions. -} - -void TitleWidget::slotEditTypewriter(int ix) -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - QStringList effdata = QStringList() << "typewriter" << QString::number(typewriter_delay->value()) + ";" + QString::number(typewriter_start->value()); - l[0]->setData(100, effdata); - } -} - -void TitleWidget::slotEditBlur(int ix) -{ -#if QT_VERSION < 0x040600 - return; -#else - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - QGraphicsEffect *eff = l[0]->graphicsEffect(); - QGraphicsBlurEffect *blur = static_cast (eff); - if (blur) blur->setBlurRadius(ix); - } -#endif -} - -void TitleWidget::slotEditShadow() -{ -#if QT_VERSION < 0x040600 - return; -#else - QList l = graphicsView->scene()->selectedItems(); - if (l.size() == 1) { - QGraphicsEffect *eff = l[0]->graphicsEffect(); - QGraphicsDropShadowEffect *shadow = static_cast (eff); - if (shadow) { - shadow->setBlurRadius(shadow_radius->value()); - shadow->setOffset(shadow_x->value(), shadow_y->value()); - } - } -#endif -} - -qreal TitleWidget::zIndexBounds(bool maxBound, bool intersectingOnly) -{ - qreal bound = maxBound ? -99 : 99; - QList l = graphicsView->scene()->selectedItems(); - if (l.size() > 0) { - QList lItems; - // Get items (all or intersecting only) - if (intersectingOnly) { - lItems = graphicsView->scene()->items(l[0]->sceneBoundingRect(), Qt::IntersectsItemShape); - } else { - lItems = graphicsView->scene()->items(); - } - if (lItems.size() > 0) { - int n = lItems.size(); - qreal z; - if (maxBound) { - for (int i = 0; i < n; i++) { - z = lItems[i]->zValue(); - if (z > bound && !lItems[i]->isSelected()) { - bound = z; - } - } - } else { - // Get minimum z index. - for (int i = 0; i < n; i++) { - z = lItems[i]->zValue(); - if (z < bound && !lItems[i]->isSelected() && z > -999) { - // There are items at the very bottom (background e.g.) with z-index < -1000. - bound = z; - } - } - } - } - } - return bound; -} - -void TitleWidget::slotZIndexUp() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() >= 1) { - qreal currentZ = l[0]->zValue(); - qreal max = zIndexBounds(true, true); - if (currentZ <= max) { - l[0]->setZValue(currentZ + 1); - updateDimension(l[0]); - } - } -} - -void TitleWidget::slotZIndexTop() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() >= 1) { - qreal currentZ = l[0]->zValue(); - qreal max = zIndexBounds(true, false); - if (currentZ <= max) { - l[0]->setZValue(max + 1); - updateDimension(l[0]); - } - } -} - -void TitleWidget::slotZIndexDown() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() >= 1) { - qreal currentZ = l[0]->zValue(); - qreal min = zIndexBounds(false, true); - if (currentZ >= min) { - l[0]->setZValue(currentZ - 1); - updateDimension(l[0]); - } - } -} - -void TitleWidget::slotZIndexBottom() -{ - QList l = graphicsView->scene()->selectedItems(); - if (l.size() >= 1) { - qreal currentZ = l[0]->zValue(); - qreal min = zIndexBounds(false, false); - if (currentZ >= min) { - l[0]->setZValue(min - 1); - updateDimension(l[0]); - } - } -} diff -Nru kdenlive-0.7.7/src/trackview.cpp kdenlive-0.7.7.1/src/trackview.cpp --- kdenlive-0.7.7/src/trackview.cpp 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/trackview.cpp 2010-02-26 21:44:41.000000000 +0000 @@ -344,32 +344,32 @@ QDomElement base = MainWindow::transitions.getEffectByTag(mlt_service, transitionId).cloneNode().toElement(); for (int k = 0; k < transitionparams.count(); k++) { - p = transitionparams.item(k).toElement(); - if (!p.isNull()) { - QString paramName = p.attribute("name"); - QString paramValue = p.text(); - - QDomNodeList params = base.elementsByTagName("parameter"); - if (paramName != "a_track" && paramName != "b_track") for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull() && e.attribute("tag") == paramName) { - if (e.attribute("type") == "double") { - QString factor = e.attribute("factor", "1"); - if (factor != "1") { - double fact; - if (factor.startsWith('%')) { - fact = ProfilesDialog::getStringEval(m_doc->mltProfile(), factor); - } else fact = factor.toDouble(); - double val = paramValue.toDouble() * fact; - paramValue = QString::number(val); + p = transitionparams.item(k).toElement(); + if (!p.isNull()) { + QString paramName = p.attribute("name"); + QString paramValue = p.text(); + + QDomNodeList params = base.elementsByTagName("parameter"); + if (paramName != "a_track" && paramName != "b_track") for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + if (!e.isNull() && e.attribute("tag") == paramName) { + if (e.attribute("type") == "double") { + QString factor = e.attribute("factor", "1"); + if (factor != "1") { + double fact; + if (factor.startsWith('%')) { + fact = ProfilesDialog::getStringEval(m_doc->mltProfile(), factor); + } else fact = factor.toDouble(); + double val = paramValue.toDouble() * fact; + paramValue = QString::number(val); + } } + e.setAttribute("value", paramValue); + break; } - e.setAttribute("value", paramValue); - break; } - } + } } - } /*QDomDocument doc; doc.appendChild(doc.importNode(base, true)); diff -Nru kdenlive-0.7.7/src/trackview.cpp.orig kdenlive-0.7.7.1/src/trackview.cpp.orig --- kdenlive-0.7.7/src/trackview.cpp.orig 1970-01-01 01:00:00.000000000 +0100 +++ kdenlive-0.7.7.1/src/trackview.cpp.orig 2010-02-26 21:44:41.000000000 +0000 @@ -0,0 +1,946 @@ +/*************************************************************************** + * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#include "trackview.h" +#include "definitions.h" +#include "headertrack.h" +#include "clipitem.h" +#include "transition.h" +#include "kdenlivesettings.h" +#include "clipmanager.h" +#include "customruler.h" +#include "kdenlivedoc.h" +#include "mainwindow.h" +#include "customtrackview.h" +#include "initeffects.h" +#include "profilesdialog.h" + +#include +#include +#include + +#include +#include + +TrackView::TrackView(KdenliveDoc *doc, bool *ok, QWidget *parent) : + QWidget(parent), + m_scale(1.0), + m_projectTracks(0), + m_doc(doc), + m_verticalZoom(1) +{ + + setupUi(this); +// ruler_frame->setMaximumHeight(); +// size_frame->setMaximumHeight(); + m_scene = new CustomTrackScene(doc); + m_trackview = new CustomTrackView(doc, m_scene, parent); + m_trackview->scale(1, 1); + m_trackview->setAlignment(Qt::AlignLeft | Qt::AlignTop); + //m_scene->addRect(QRectF(0, 0, 100, 100), QPen(), QBrush(Qt::red)); + + m_ruler = new CustomRuler(doc->timecode(), m_trackview); + connect(m_ruler, SIGNAL(zoneMoved(int, int)), this, SIGNAL(zoneMoved(int, int))); + connect(m_ruler, SIGNAL(adjustZoom(int)), this, SIGNAL(setZoom(int))); + QHBoxLayout *layout = new QHBoxLayout; + layout->setContentsMargins(m_trackview->frameWidth(), 0, 0, 0); + layout->setSpacing(0); + ruler_frame->setLayout(layout); + layout->addWidget(m_ruler); + + QHBoxLayout *sizeLayout = new QHBoxLayout; + sizeLayout->setContentsMargins(0, 0, 0, 0); + sizeLayout->setSpacing(0); + size_frame->setLayout(sizeLayout); + + QToolButton *butSmall = new QToolButton(this); + butSmall->setIcon(KIcon("kdenlive-zoom-small")); + butSmall->setToolTip(i18n("Smaller tracks")); + butSmall->setAutoRaise(true); + connect(butSmall, SIGNAL(clicked()), this, SLOT(slotVerticalZoomDown())); + sizeLayout->addWidget(butSmall); + + QToolButton *butLarge = new QToolButton(this); + butLarge->setIcon(KIcon("kdenlive-zoom-large")); + butLarge->setToolTip(i18n("Bigger tracks")); + butLarge->setAutoRaise(true); + connect(butLarge, SIGNAL(clicked()), this, SLOT(slotVerticalZoomUp())); + sizeLayout->addWidget(butLarge); + + QHBoxLayout *tracksLayout = new QHBoxLayout; + tracksLayout->setContentsMargins(0, 0, 0, 0); + tracksLayout->setSpacing(0); + tracks_frame->setLayout(tracksLayout); + + headers_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + headers_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + headers_area->setFixedWidth(70); + + QVBoxLayout *headersLayout = new QVBoxLayout; + headersLayout->setContentsMargins(0, m_trackview->frameWidth(), 0, 0); + headersLayout->setSpacing(0); + headers_container->setLayout(headersLayout); + connect(headers_area->verticalScrollBar(), SIGNAL(valueChanged(int)), m_trackview->verticalScrollBar(), SLOT(setValue(int))); + + tracksLayout->addWidget(m_trackview); + connect(m_trackview->verticalScrollBar(), SIGNAL(valueChanged(int)), headers_area->verticalScrollBar(), SLOT(setValue(int))); + connect(m_trackview, SIGNAL(trackHeightChanged()), this, SLOT(slotRebuildTrackHeaders())); + connect(m_trackview, SIGNAL(tracksChanged()), this, SLOT(slotReloadTracks())); + connect(m_trackview, SIGNAL(updateTrackHeaders()), this, SLOT(slotRepaintTracks())); + + parseDocument(m_doc->toXml()); + if (m_doc->setSceneList() == -1) *ok = false; + else *ok = true; + connect(m_trackview, SIGNAL(cursorMoved(int, int)), m_ruler, SLOT(slotCursorMoved(int, int))); + connect(m_trackview->horizontalScrollBar(), SIGNAL(valueChanged(int)), m_ruler, SLOT(slotMoveRuler(int))); + connect(m_trackview, SIGNAL(mousePosition(int)), this, SIGNAL(mousePosition(int))); + connect(m_trackview, SIGNAL(doTrackLock(int, bool)), this, SLOT(slotChangeTrackLock(int, bool))); + + slotChangeZoom(m_doc->zoom().x(), m_doc->zoom().y()); + slotSetZone(m_doc->zone()); +} + +TrackView::~TrackView() +{ + delete m_ruler; + delete m_trackview; +} + +//virtual +void TrackView::keyPressEvent(QKeyEvent * event) +{ + if (event->key() == Qt::Key_Up) { + m_trackview->slotTrackUp(); + event->accept(); + } else if (event->key() == Qt::Key_Down) { + m_trackview->slotTrackDown(); + event->accept(); + } else QWidget::keyPressEvent(event); +} + +int TrackView::duration() const +{ + return m_trackview->duration(); +} + +int TrackView::tracksNumber() const +{ + return m_projectTracks - 1; +} + +int TrackView::inPoint() const +{ + return m_ruler->inPoint(); +} + +int TrackView::outPoint() const +{ + return m_ruler->outPoint(); +} + +void TrackView::slotSetZone(QPoint p) +{ + m_ruler->setZone(p); +} + +void TrackView::setDuration(int dur) +{ + m_trackview->setDuration(dur); + m_ruler->setDuration(dur); +} + +void TrackView::parseDocument(QDomDocument doc) +{ + //int cursorPos = 0; + m_documentErrors.clear(); + + //kDebug() << "//// DOCUMENT: " << doc.toString(); + /*QDomNode props = doc.elementsByTagName("properties").item(0); + if (!props.isNull()) { + cursorPos = props.toElement().attribute("timeline_position").toInt(); + }*/ + + // parse project tracks + QDomElement tractor = doc.elementsByTagName("tractor").item(0).toElement(); + QDomNodeList tracks = doc.elementsByTagName("track"); + QDomNodeList playlists = doc.elementsByTagName("playlist"); + int duration = 300; + m_projectTracks = tracks.count(); + int trackduration = 0; + QDomElement e; + QDomElement p; + + int pos = m_projectTracks - 1; + m_invalidProducers.clear(); + QDomNodeList producers = doc.elementsByTagName("producer"); + for (int i = 0; i < producers.count(); i++) { + // Check for invalid producers + QDomNode n = producers.item(i); + e = n.toElement(); + + /* + // Check for invalid markup + QDomNodeList params = e.elementsByTagName("property"); + for (int j = 0; j < params.count(); j++) { + QDomElement p = params.item(j).toElement(); + if (p.attribute("name") == "markup") { + QString val = p.text().toUtf8().data(); + kDebug()<<"//FOUND MARKUP, VAL: "< out || in == out) { + // invalid producer, remove it + QString id = e.attribute("id"); + m_invalidProducers.append(id); + m_documentErrors.append(i18n("Invalid clip producer %1\n", id)); + doc.documentElement().removeChild(producers.at(i)); + i--; + } + } + + for (int i = 0; i < m_projectTracks; i++) { + e = tracks.item(i).toElement(); + QString playlist_name = e.attribute("producer"); + if (playlist_name != "black_track" && playlist_name != "playlistmain") { + // find playlist related to this track + p = QDomElement(); + for (int j = 0; j < m_projectTracks; j++) { + p = playlists.item(j).toElement(); + if (p.attribute("id") == playlist_name) break; + } + if (p.attribute("id") != playlist_name) { // then it didn't work. + kDebug() << "NO PLAYLIST FOUND FOR TRACK " + pos; + } + if (e.attribute("hide") == "video") { + m_doc->switchTrackVideo(i - 1, true); + } else if (e.attribute("hide") == "audio") { + m_doc->switchTrackAudio(i - 1, true); + } else if (e.attribute("hide") == "both") { + m_doc->switchTrackVideo(i - 1, true); + m_doc->switchTrackAudio(i - 1, true); + } + + trackduration = slotAddProjectTrack(pos, p, m_doc->isTrackLocked(i - 1)); + pos--; + //kDebug() << " PRO DUR: " << trackduration << ", TRACK DUR: " << duration; + if (trackduration > duration) duration = trackduration; + } else { + // background black track + for (int j = 0; j < m_projectTracks; j++) { + p = playlists.item(j).toElement(); + if (p.attribute("id") == playlist_name) break; + } + pos--; + } + } + + // parse transitions + QDomNodeList transitions = doc.elementsByTagName("transition"); + + //kDebug() << "//////////// TIMELINE FOUND: " << projectTransitions << " transitions"; + for (int i = 0; i < transitions.count(); i++) { + e = transitions.item(i).toElement(); + QDomNodeList transitionparams = e.childNodes(); + bool transitionAdd = true; + int a_track = 0; + int b_track = 0; + bool isAutomatic = false; + bool forceTrack = false; + QString mlt_geometry; + QString mlt_service; + QString transitionId; + for (int k = 0; k < transitionparams.count(); k++) { + p = transitionparams.item(k).toElement(); + if (!p.isNull()) { + QString paramName = p.attribute("name"); + // do not add audio mixing transitions + if (paramName == "internal_added" && p.text() == "237") { + transitionAdd = false; + //kDebug() << "// TRANSITRION " << i << " IS NOT VALID (INTERN ADDED)"; + //break; + } else if (paramName == "a_track") { + a_track = qMax(0, p.text().toInt()); + a_track = qMin(m_projectTracks - 1, a_track); + if (a_track != p.text().toInt()) { + // the transition track was out of bounds + m_documentErrors.append(i18n("Transition %1 had an invalid track: %2 > %3", e.attribute("id"), p.text().toInt(), a_track) + '\n'); + EffectsList::setProperty(e, "a_track", QString::number(a_track)); + } + } else if (paramName == "b_track") { + b_track = qMax(0, p.text().toInt()); + b_track = qMin(m_projectTracks - 1, b_track); + if (b_track != p.text().toInt()) { + // the transition track was out of bounds + m_documentErrors.append(i18n("Transition %1 had an invalid track: %2 > %3", e.attribute("id"), p.text().toInt(), b_track) + '\n'); + EffectsList::setProperty(e, "b_track", QString::number(b_track)); + } + } else if (paramName == "mlt_service") mlt_service = p.text(); + else if (paramName == "kdenlive_id") transitionId = p.text(); + else if (paramName == "geometry") mlt_geometry = p.text(); + else if (paramName == "automatic" && p.text() == "1") isAutomatic = true; + else if (paramName == "force_track" && p.text() == "1") forceTrack = true; + } + } + if (a_track == b_track || b_track == 0) { + // invalid transition, remove it + m_documentErrors.append(i18n("Removed invalid transition: %1", e.attribute("id")) + '\n'); + tractor.removeChild(transitions.item(i)); + i--; + continue; + } + if (transitionAdd || mlt_service != "mix") { + // Transition should be added to the scene + ItemInfo transitionInfo; + if (mlt_service == "composite" && transitionId.isEmpty()) { + // When adding composite transition, check if it is a wipe transition + if (mlt_geometry.count(';') == 1) { + mlt_geometry.remove(QChar('%'), Qt::CaseInsensitive); + mlt_geometry.replace(QChar('x'), QChar(','), Qt::CaseInsensitive); + QString start = mlt_geometry.section(';', 0, 0); + start = start.section(':', 0, 1); + start.replace(QChar(':'), QChar(','), Qt::CaseInsensitive); + QString end = mlt_geometry.section('=', 1, 1); + end = end.section(':', 0, 1); + end.replace(QChar(':'), QChar(','), Qt::CaseInsensitive); + start.append(',' + end); + QStringList numbers = start.split(',', QString::SkipEmptyParts); + bool isWipeTransition = true; + int checkNumber; + for (int i = 0; i < numbers.size(); ++i) { + checkNumber = qAbs(numbers.at(i).toInt()); + if (checkNumber != 0 && checkNumber != 100) { + isWipeTransition = false; + break; + } + } + if (isWipeTransition) transitionId = "slide"; + } + } + QDomElement base = MainWindow::transitions.getEffectByTag(mlt_service, transitionId).cloneNode().toElement(); + + for (int k = 0; k < transitionparams.count(); k++) { + p = transitionparams.item(k).toElement(); + if (!p.isNull()) { + QString paramName = p.attribute("name"); + QString paramValue = p.text(); + + QDomNodeList params = base.elementsByTagName("parameter"); + if (paramName != "a_track" && paramName != "b_track") for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + if (!e.isNull() && e.attribute("tag") == paramName) { + if (e.attribute("type") == "double") { + QString factor = e.attribute("factor", "1"); + if (factor != "1") { + double fact; + if (factor.startsWith('%')) { + fact = ProfilesDialog::getStringEval(m_doc->mltProfile(), factor); + } else fact = factor.toDouble(); + double val = paramValue.toDouble() * fact; + paramValue = QString::number(val); + } + } + e.setAttribute("value", paramValue); + break; + } + } + } + } + + /*QDomDocument doc; + doc.appendChild(doc.importNode(base, true)); + kDebug() << "/////// TRANSITION XML: "<< doc.toString();*/ + + transitionInfo.startPos = GenTime(e.attribute("in").toInt(), m_doc->fps()); + transitionInfo.endPos = GenTime(e.attribute("out").toInt() + 1, m_doc->fps()); + transitionInfo.track = m_projectTracks - 1 - b_track; + + //kDebug() << "/////////////// +++++++++++ ADDING TRANSITION ON TRACK: " << b_track << ", TOTAL TRKA: " << m_projectTracks; + if (transitionInfo.startPos >= transitionInfo.endPos) { + // invalid transition, remove it. + m_documentErrors.append(i18n("Removed invalid transition: %1", e.attribute("id")) + '\n'); + kDebug() << "///// REMOVED INVALID TRANSITION: " << e.attribute("id"); + tractor.removeChild(transitions.item(i)); + i--; + } else { + Transition *tr = new Transition(transitionInfo, a_track, m_doc->fps(), base, isAutomatic); + if (forceTrack) tr->setForcedTrack(true, a_track); + m_scene->addItem(tr); + if (b_track > 0 && m_doc->isTrackLocked(b_track - 1)) { + tr->setItemLocked(true); + } + } + } + } + + // Add guides + QDomNodeList guides = doc.elementsByTagName("guide"); + for (int i = 0; i < guides.count(); i++) { + e = guides.item(i).toElement(); + const QString comment = e.attribute("comment"); + const GenTime pos = GenTime(e.attribute("time").toDouble()); + m_trackview->addGuide(pos, comment); + } + + // Rebuild groups + QDomNodeList groups = doc.elementsByTagName("group"); + m_trackview->loadGroups(groups); + m_trackview->setDuration(duration); + kDebug() << "/////////// TOTAL PROJECT DURATION: " << duration; + + // Remove Kdenlive extra info from xml doc before sending it to MLT + QDomElement mlt = doc.firstChildElement("mlt"); + QDomElement infoXml = mlt.firstChildElement("kdenlivedoc"); + mlt.removeChild(infoXml); + + slotRebuildTrackHeaders(); + if (!m_documentErrors.isNull()) KMessageBox::sorry(this, m_documentErrors); + if (infoXml.hasAttribute("upgraded")) { + // Our document was upgraded, create a backup copy just in case + QString baseFile = m_doc->url().path().section(".kdenlive", 0, 0); + int ct = 0; + QString backupFile = baseFile + "_backup" + QString::number(ct) + ".kdenlive"; + while (QFile::exists(backupFile)) { + ct++; + backupFile = baseFile + "_backup" + QString::number(ct) + ".kdenlive"; + } + if (KIO::NetAccess::file_copy(m_doc->url(), KUrl(backupFile), this)) KMessageBox::information(this, i18n("Your project file was upgraded to the latest Kdenlive document version.\n To make sure you don't lose data, a backup copy called %1 was created.", backupFile)); + else KMessageBox::information(this, i18n("Your project file was upgraded to the latest Kdenlive document version, it was not possible to create a backup copy.", backupFile)); + } + //m_trackview->setCursorPos(cursorPos); + //m_scrollBox->setGeometry(0, 0, 300 * zoomFactor(), m_scrollArea->height()); +} + +void TrackView::slotDeleteClip(const QString &clipId) +{ + m_trackview->deleteClip(clipId); +} + +void TrackView::setCursorPos(int pos) +{ + m_trackview->setCursorPos(pos); +} + +void TrackView::moveCursorPos(int pos) +{ + m_trackview->setCursorPos(pos, false); +} + +void TrackView::slotChangeZoom(int horizontal, int vertical) +{ + m_ruler->setPixelPerMark(horizontal); + m_scale = (double) FRAME_SIZE / m_ruler->comboScale[horizontal]; + + if (vertical == -1) { + // user called zoom + m_doc->setZoom(horizontal, m_verticalZoom); + m_trackview->setScale(m_scale, m_scene->scale().y()); + } else { + m_verticalZoom = vertical; + if (m_verticalZoom == 0) m_trackview->setScale(m_scale, 0.5); + else m_trackview->setScale(m_scale, m_verticalZoom); + adjustTrackHeaders(); + } +} + +int TrackView::fitZoom() const +{ + int zoom = (int)((duration() + 20 / m_scale) * FRAME_SIZE / m_trackview->width()); + int i; + for (i = 0; i < 13; i++) + if (m_ruler->comboScale[i] > zoom) break; + return i; +} + +KdenliveDoc *TrackView::document() +{ + return m_doc; +} + +void TrackView::refresh() +{ + m_trackview->viewport()->update(); +} + +void TrackView::slotRepaintTracks() +{ + QLayoutItem *child; + for (int i = 0; i < headers_container->layout()->count(); i++) { + child = headers_container->layout()->itemAt(i); + if (child->widget() && child->widget()->height() > 5) { + HeaderTrack *head = static_cast (child->widget()); + if (head) head->setSelectedIndex(m_trackview->selectedTrack()); + } + } +} + +void TrackView::slotReloadTracks() +{ + slotRebuildTrackHeaders(); + emit updateTracksInfo(); +} + +void TrackView::slotRebuildTrackHeaders() +{ + const QList list = m_doc->tracksList(); + QLayoutItem *child; + while ((child = headers_container->layout()->takeAt(0)) != 0) { + QWidget *wid = child->widget(); + delete child; + if (wid) wid->deleteLater(); + } + int max = list.count(); + int height = KdenliveSettings::trackheight() * m_scene->scale().y() - 1; + HeaderTrack *header = NULL; + QFrame *frame = NULL; + for (int i = 0; i < max; i++) { + frame = new QFrame(headers_container); + frame->setFixedHeight(1); + frame->setFrameStyle(QFrame::Plain); + frame->setFrameShape(QFrame::Box); + frame->setLineWidth(1); + headers_container->layout()->addWidget(frame); + TrackInfo info = list.at(max - i - 1); + header = new HeaderTrack(i, info, height, headers_container); + header->setSelectedIndex(m_trackview->selectedTrack()); + connect(header, SIGNAL(switchTrackVideo(int)), m_trackview, SLOT(slotSwitchTrackVideo(int))); + connect(header, SIGNAL(switchTrackAudio(int)), m_trackview, SLOT(slotSwitchTrackAudio(int))); + connect(header, SIGNAL(switchTrackLock(int)), m_trackview, SLOT(slotSwitchTrackLock(int))); + connect(header, SIGNAL(selectTrack(int)), m_trackview, SLOT(slotSelectTrack(int))); + connect(header, SIGNAL(deleteTrack(int)), this, SIGNAL(deleteTrack(int))); + connect(header, SIGNAL(insertTrack(int)), this, SIGNAL(insertTrack(int))); + connect(header, SIGNAL(changeTrack(int)), this, SIGNAL(changeTrack(int))); + connect(header, SIGNAL(renameTrack(int)), this, SLOT(slotRenameTrack(int))); + headers_container->layout()->addWidget(header); + } + frame = new QFrame(this); + frame->setFixedHeight(1); + frame->setFrameStyle(QFrame::Plain); + frame->setFrameShape(QFrame::Box); + frame->setLineWidth(1); + headers_container->layout()->addWidget(frame); +} + + +void TrackView::adjustTrackHeaders() +{ + int height = KdenliveSettings::trackheight() * m_scene->scale().y() - 1; + QLayoutItem *child; + for (int i = 0; i < headers_container->layout()->count(); i++) { + child = headers_container->layout()->itemAt(i); + if (child->widget() && child->widget()->height() > 5)(static_cast (child->widget()))->adjustSize(height); + } +} + +int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked) +{ + // parse track + int position = 0; + QDomNodeList children = xml.childNodes(); + for (int nodeindex = 0; nodeindex < children.count(); nodeindex++) { + QDomNode n = children.item(nodeindex); + QDomElement elem = n.toElement(); + if (elem.tagName() == "blank") { + position += elem.attribute("length").toInt(); + } else if (elem.tagName() == "entry") { + // Found a clip + int in = elem.attribute("in").toInt(); + int out = elem.attribute("out").toInt(); + if (in > out || /*in == out ||*/ m_invalidProducers.contains(elem.attribute("producer"))) { + m_documentErrors.append(i18n("Invalid clip removed from track %1 at %2\n", ix, position)); + xml.removeChild(children.at(nodeindex)); + nodeindex--; + continue; + } + QString idString = elem.attribute("producer"); + QString id = idString; + double speed = 1.0; + int strobe = 1; + if (idString.startsWith("slowmotion")) { + id = idString.section(':', 1, 1); + speed = idString.section(':', 2, 2).toDouble(); + strobe = idString.section(':', 3, 3).toInt(); + if (strobe == 0) strobe = 1; + } else id = id.section('_', 0, 0); + DocClipBase *clip = m_doc->clipManager()->getClipById(id); + if (clip == NULL) { + // The clip in playlist was not listed in the kdenlive producers, + // something went wrong, repair required. + kWarning() << "CANNOT INSERT CLIP " << id; + + clip = getMissingProducer(id); + if (!clip) { + // We cannot find the producer, something is really wrong, add + // placeholder color clip + QDomDocument doc; + QDomElement producerXml = doc.createElement("producer"); + doc.appendChild(producerXml); + producerXml.setAttribute("colour", "0xff0000ff"); + producerXml.setAttribute("mlt_service", "colour"); + producerXml.setAttribute("length", "15000"); + producerXml.setAttribute("name", "INVALID"); + producerXml.setAttribute("type", COLOR); + producerXml.setAttribute("id", id); + clip = new DocClipBase(m_doc->clipManager(), doc.documentElement(), id); + xml.insertBefore(producerXml, QDomNode()); + m_doc->clipManager()->addClip(clip); + + m_documentErrors.append(i18n("Broken clip producer %1", id) + '\n'); + } else { + // Found correct producer + m_documentErrors.append(i18n("Replaced wrong clip producer %1 with %2", id, clip->getId()) + '\n'); + elem.setAttribute("producer", clip->getId()); + } + m_doc->setModified(true); + } + + if (clip != NULL) { + ItemInfo clipinfo; + clipinfo.startPos = GenTime(position, m_doc->fps()); + clipinfo.endPos = clipinfo.startPos + GenTime(out - in + 1, m_doc->fps()); + clipinfo.cropStart = GenTime(in, m_doc->fps()); + clipinfo.cropDuration = clipinfo.endPos - clipinfo.startPos; + + clipinfo.track = ix; + //kDebug() << "// INSERTING CLIP: " << in << "x" << out << ", track: " << ix << ", ID: " << id << ", SCALE: " << m_scale << ", FPS: " << m_doc->fps(); + ClipItem *item = new ClipItem(clip, clipinfo, m_doc->fps(), speed, strobe, false); + if (idString.endsWith("_video")) item->setVideoOnly(true); + else if (idString.endsWith("_audio")) item->setAudioOnly(true); + m_scene->addItem(item); + if (locked) item->setItemLocked(true); + clip->addReference(); + position += (out - in + 1); + if (speed != 1.0 || strobe > 1) { + QDomElement speedeffect = MainWindow::videoEffects.getEffectByTag(QString(), "speed").cloneNode().toElement(); + EffectsList::setParameter(speedeffect, "speed", QString::number((int)(100 * speed + 0.5))); + EffectsList::setParameter(speedeffect, "strobe", QString::number(strobe)); + item->addEffect(speedeffect, false); + item->effectsCounter(); + } + + // parse clip effects + QDomNodeList effects = elem.childNodes(); + for (int ix = 0; ix < effects.count(); ix++) { + bool disableeffect = false; + QDomElement effect = effects.at(ix).toElement(); + if (effect.tagName() == "filter") { + // add effect to clip + QString effecttag; + QString effectid; + QString effectindex = QString::number(ix + 1); + QString ladspaEffectFile; + // Get effect tag & index + for (QDomNode n3 = effect.firstChild(); !n3.isNull(); n3 = n3.nextSibling()) { + // parse effect parameters + QDomElement effectparam = n3.toElement(); + if (effectparam.attribute("name") == "tag") { + effecttag = effectparam.text(); + } else if (effectparam.attribute("name") == "kdenlive_id") { + effectid = effectparam.text(); + } else if (effectparam.attribute("name") == "disable" && effectparam.text().toInt() == 1) { + // Fix effects index + disableeffect = true; + } else if (effectparam.attribute("name") == "kdenlive_ix") { + // Fix effects index + effectparam.firstChild().setNodeValue(effectindex); + } else if (effectparam.attribute("name") == "src") { + ladspaEffectFile = effectparam.text(); + if (!QFile::exists(ladspaEffectFile)) { + // If the ladspa effect file is missing, recreate it + kDebug() << "// MISSING LADSPA FILE: " << ladspaEffectFile; + ladspaEffectFile = m_doc->getLadspaFile(); + effectparam.firstChild().setNodeValue(ladspaEffectFile); + kDebug() << "// ... REPLACED WITH: " << ladspaEffectFile; + } + } + } + //kDebug() << "+ + CLIP EFF FND: " << effecttag << ", " << effectid << ", " << effectindex; + // get effect standard tags + QDomElement clipeffect = MainWindow::customEffects.getEffectByTag(QString(), effectid); + if (clipeffect.isNull()) clipeffect = MainWindow::videoEffects.getEffectByTag(effecttag, effectid); + if (clipeffect.isNull()) clipeffect = MainWindow::audioEffects.getEffectByTag(effecttag, effectid); + if (clipeffect.isNull()) { + kDebug() << "/// WARNING, EFFECT: " << effecttag << ": " << effectid << " not found, removing it from project"; + m_documentErrors.append(i18n("Effect %1:%2 not found in MLT, it was removed from this project\n", effecttag, effectid)); + elem.removeChild(effects.at(ix)); + ix--; + } else { + QDomElement currenteffect = clipeffect.cloneNode().toElement(); + currenteffect.setAttribute("kdenlive_ix", effectindex); + QDomNodeList clipeffectparams = currenteffect.childNodes(); + + if (MainWindow::videoEffects.hasKeyFrames(currenteffect)) { + //kDebug() << " * * * * * * * * * * ** CLIP EFF WITH KFR FND * * * * * * * * * * *"; + // effect is key-framable, read all effects to retrieve keyframes + QString factor; + QString starttag; + QString endtag; + QDomNodeList params = currenteffect.elementsByTagName("parameter"); + for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + if (e.attribute("type") == "keyframe") { + starttag = e.attribute("starttag", "start"); + endtag = e.attribute("endtag", "end"); + factor = e.attribute("factor", "1"); + break; + } + } + QString keyframes; + int effectin = effect.attribute("in").toInt(); + int effectout = effect.attribute("out").toInt(); + double startvalue = 0; + double endvalue = 0; + double fact; + if (factor.isEmpty()) fact = 1; + else if (factor.startsWith('%')) { + fact = ProfilesDialog::getStringEval(m_doc->mltProfile(), factor); + } else fact = factor.toDouble(); + for (QDomNode n3 = effect.firstChild(); !n3.isNull(); n3 = n3.nextSibling()) { + // parse effect parameters + QDomElement effectparam = n3.toElement(); + if (effectparam.attribute("name") == starttag) + startvalue = effectparam.text().toDouble() * fact; + if (effectparam.attribute("name") == endtag) + endvalue = effectparam.text().toDouble() * fact; + } + // add first keyframe + keyframes.append(QString::number(effectin) + ':' + QString::number(startvalue) + ';' + QString::number(effectout) + ':' + QString::number(endvalue) + ';'); + QDomNode lastParsedEffect; + ix++; + QDomNode n2 = effects.at(ix); + bool continueParsing = true; + for (; !n2.isNull() && continueParsing; n2 = n2.nextSibling()) { + // parse all effects + QDomElement kfreffect = n2.toElement(); + int effectout = kfreffect.attribute("out").toInt(); + + for (QDomNode n4 = kfreffect.firstChild(); !n4.isNull(); n4 = n4.nextSibling()) { + // parse effect parameters + QDomElement subeffectparam = n4.toElement(); + if (subeffectparam.attribute("name") == "kdenlive_ix" && subeffectparam.text() != effectindex) { + //We are not in the same effect, stop parsing + lastParsedEffect = n2.previousSibling(); + ix--; + continueParsing = false; + break; + } else if (subeffectparam.attribute("name") == endtag) { + endvalue = subeffectparam.text().toDouble() * fact; + break; + } + } + if (continueParsing) { + keyframes.append(QString::number(effectout) + ':' + QString::number(endvalue) + ';'); + ix++; + } + } + + params = currenteffect.elementsByTagName("parameter"); + for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + if (e.attribute("type") == "keyframe") e.setAttribute("keyframes", keyframes); + } + if (!continueParsing) { + n2 = lastParsedEffect; + } + } else { + // Check if effect has in/out points + if (effect.hasAttribute("in")) { + EffectsList::setParameter(currenteffect, "in", effect.attribute("in")); + } + if (effect.hasAttribute("out")) { + EffectsList::setParameter(currenteffect, "out", effect.attribute("out")); + } + } + + // adjust effect parameters + for (QDomNode n3 = effect.firstChild(); !n3.isNull(); n3 = n3.nextSibling()) { + // parse effect parameters + QDomElement effectparam = n3.toElement(); + QString paramname = effectparam.attribute("name"); + QString paramvalue = effectparam.text(); + + + // try to find this parameter in the effect xml + QDomElement e; + for (int k = 0; k < clipeffectparams.count(); k++) { + e = clipeffectparams.item(k).toElement(); + if (!e.isNull() && e.tagName() == "parameter" && e.attribute("name") == paramname) { + if (e.attribute("factor", "1") != "1") { + QString factor = e.attribute("factor", "1"); + double fact; + if (factor.startsWith('%')) { + fact = ProfilesDialog::getStringEval(m_doc->mltProfile(), factor); + } else fact = factor.toDouble(); + if (e.attribute("type") == "simplekeyframe") { + QStringList kfrs = paramvalue.split(";"); + for (int l = 0; l < kfrs.count(); l++) { + QString fr = kfrs.at(l).section("=", 0, 0); + double val = kfrs.at(l).section("=", 1, 1).toDouble(); + kfrs[l] = fr + ":" + QString::number((int)(val * fact)); + } + e.setAttribute("keyframes", kfrs.join(";")); + } else e.setAttribute("value", paramvalue.toDouble() * fact); + } else e.setAttribute("value", paramvalue); + break; + } + } + } + if (effecttag == "ladspa") { + //QString ladspaEffectFile = EffectsList::parameter(effect, "src", "property"); + + if (!QFile::exists(ladspaEffectFile)) { + // If the ladspa effect file is missing, recreate it + initEffects::ladspaEffectFile(ladspaEffectFile, currenteffect.attribute("ladspaid").toInt(), m_trackview->getLadspaParams(currenteffect)); + } + currenteffect.setAttribute("src", ladspaEffectFile); + } + if (disableeffect) currenteffect.setAttribute("disable", "1"); + item->addEffect(currenteffect, false); + } + } + } + } + //m_clipList.append(clip); + } + } + //m_trackDuration = position; + + + //documentTracks.insert(ix, track); + kDebug() << "************* ADD DOC TRACK " << ix << ", DURATION: " << position; + return position; + //track->show(); +} + +DocClipBase *TrackView::getMissingProducer(const QString id) const +{ + QDomElement missingXml; + QDomDocument doc = m_doc->toXml(); + QString docRoot = doc.documentElement().attribute("root"); + if (!docRoot.endsWith('/')) docRoot.append('/'); + QDomNodeList prods = doc.elementsByTagName("producer"); + int maxprod = prods.count(); + for (int i = 0; i < maxprod; i++) { + QDomNode m = prods.at(i); + QString prodId = m.toElement().attribute("id"); + if (prodId == id) { + missingXml = m.toElement(); + break; + } + } + if (missingXml == QDomElement()) return NULL; + + QDomNodeList params = missingXml.childNodes(); + QString resource; + for (int j = 0; j < params.count(); j++) { + QDomElement e = params.item(j).toElement(); + if (e.attribute("name") == "resource") { + resource = e.firstChild().nodeValue(); + break; + } + } + // prepend MLT XML document root if no path in clip resource and not a color clip + if (!resource.startsWith('/') && !resource.startsWith("0x")) resource.prepend(docRoot); + DocClipBase *missingClip = NULL; + if (!resource.isEmpty()) { + QList list = m_doc->clipManager()->getClipByResource(resource); + if (!list.isEmpty()) missingClip = list.at(0); + } + return missingClip; +} + +QGraphicsScene *TrackView::projectScene() +{ + return m_scene; +} + +CustomTrackView *TrackView::projectView() +{ + return m_trackview; +} + +void TrackView::setEditMode(const QString & editMode) +{ + m_editMode = editMode; +} + +const QString & TrackView::editMode() const +{ + return m_editMode; +} + +void TrackView::slotChangeTrackLock(int ix, bool lock) +{ + QList widgets = findChildren(); + widgets.at(ix)->setLock(lock); +} + + +void TrackView::slotVerticalZoomDown() +{ + if (m_verticalZoom == 0) return; + m_verticalZoom--; + m_doc->setZoom(m_doc->zoom().x(), m_verticalZoom); + if (m_verticalZoom == 0) m_trackview->setScale(m_scene->scale().x(), 0.5); + else m_trackview->setScale(m_scene->scale().x(), 1); + adjustTrackHeaders(); + m_trackview->verticalScrollBar()->setValue(headers_area->verticalScrollBar()->value()); +} + +void TrackView::slotVerticalZoomUp() +{ + if (m_verticalZoom == 2) return; + m_verticalZoom++; + m_doc->setZoom(m_doc->zoom().x(), m_verticalZoom); + if (m_verticalZoom == 2) m_trackview->setScale(m_scene->scale().x(), 2); + else m_trackview->setScale(m_scene->scale().x(), 1); + adjustTrackHeaders(); + m_trackview->verticalScrollBar()->setValue(headers_area->verticalScrollBar()->value()); +} + +void TrackView::updateProjectFps() +{ + m_ruler->updateProjectFps(m_doc->timecode()); + m_trackview->updateProjectFps(); +} + +void TrackView::slotRenameTrack(int ix) +{ + int tracknumber = m_doc->tracksCount() - ix; + TrackInfo info = m_doc->trackInfoAt(tracknumber - 1); + bool ok; + QString newName = QInputDialog::getText(this, i18n("New Track Name"), i18n("Enter new name"), QLineEdit::Normal, info.trackName, &ok); + if (ok) { + info.trackName = newName; + m_doc->setTrackType(tracknumber - 1, info); + QTimer::singleShot(300, this, SLOT(slotReloadTracks())); + m_doc->setModified(true); + } +} + + +#include "trackview.moc" diff -Nru kdenlive-0.7.7/src/transition.cpp kdenlive-0.7.7.1/src/transition.cpp --- kdenlive-0.7.7/src/transition.cpp 2010-02-17 08:07:50.000000000 +0000 +++ kdenlive-0.7.7.1/src/transition.cpp 2010-02-26 21:44:41.000000000 +0000 @@ -70,7 +70,7 @@ if (m_automaticTransition) m_parameters.setAttribute("automatic", 1); else if (m_parameters.attribute("automatic") == "1") m_automaticTransition = true; if (m_parameters.attribute("force_track") == "1") m_forceTransitionTrack = true; - m_name = m_parameters.elementsByTagName("name").item(0).toElement().text(); + m_name = i18n(m_parameters.elementsByTagName("name").item(0).toElement().text().toUtf8().data()); m_secondClip = 0; //m_referenceClip->addTransition(this); @@ -92,14 +92,16 @@ return tr; } -QString Transition::transitionName() const +QString Transition::transitionTag() const { - return m_name; + return m_parameters.attribute("tag"); } -QString Transition::transitionTag() const +QStringList Transition::transitionInfo() const { - return m_parameters.attribute("tag"); + QStringList info; + info << m_name << m_parameters.attribute("tag") << m_parameters.attribute("id"); + return info; } bool Transition::isAutomatic() const @@ -125,7 +127,7 @@ m_parameters = params; if (m_parameters.attribute("force_track") == "1") setForcedTrack(true, m_parameters.attribute("transition_btrack").toInt()); else if (m_parameters.attribute("force_track") == "0") setForcedTrack(false, m_parameters.attribute("transition_btrack").toInt()); - m_name = m_parameters.elementsByTagName("name").item(0).toElement().text(); + m_name = i18n(m_parameters.elementsByTagName("name").item(0).toElement().text().toUtf8().data()); update(); } diff -Nru kdenlive-0.7.7/src/transition.h kdenlive-0.7.7.1/src/transition.h --- kdenlive-0.7.7/src/transition.h 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/transition.h 2010-02-26 21:44:41.000000000 +0000 @@ -54,8 +54,8 @@ bool hasClip(const ClipItem * clip) const; bool belongsToClip(const ClipItem * clip) const; bool invertedTransition() const; - QString transitionName() const; QString transitionTag() const; + QStringList transitionInfo() const; OPERATIONTYPE operationMode(QPointF pos); //const QMap < QString, QString > transitionParameters() const; void setTransitionParameters(const QDomElement params); diff -Nru kdenlive-0.7.7/src/transitionsettings.cpp kdenlive-0.7.7.1/src/transitionsettings.cpp --- kdenlive-0.7.7/src/transitionsettings.cpp 2010-02-17 08:07:50.000000000 +0000 +++ kdenlive-0.7.7.1/src/transitionsettings.cpp 2010-02-26 21:44:41.000000000 +0000 @@ -42,7 +42,7 @@ connect(m_effectEdit, SIGNAL(seekTimeline(int)), this, SIGNAL(seekTimeline(int))); setEnabled(false); - QMap transitionsList; + QList transitionsList; int max = MainWindow::transitions.effectNames().count(); QStringList transitionInfo; int ix = 0; @@ -50,11 +50,13 @@ for (; ix < max; ix++) { transitionInfo = MainWindow::transitions.effectIdInfo(ix); transitionInfo << QString::number(ix); - transitionsList.insert(transitionInfo.at(0).toLower(), transitionInfo); + transitionsList.append(transitionInfo); } ix = 0; foreach(const QStringList &value, transitionsList) { - transitionList->addItem(value.at(0)); + QStringList data = value; + if (!data.isEmpty()) data.removeLast(); + transitionList->addItem(value.at(0), data); transitionList->setItemData(ix, MainWindow::transitions.getInfoFromIndex(value.last().toInt()), Qt::ToolTipRole); ix++; } @@ -150,7 +152,7 @@ if (!t->forcedTrack()) transitionTrack->setCurrentIndex(0); else transitionTrack->setCurrentIndex(m_tracksCount + 1 - t->transitionEndTrack()); transitionTrack->blockSignals(false); - int ix = transitionList->findText(t->transitionName(), Qt::MatchExactly); + int ix = transitionList->findData(t->transitionInfo(), Qt::UserRole, Qt::MatchExactly); m_usedTransition = t; if (ix != -1) { transitionList->blockSignals(true); diff -Nru kdenlive-0.7.7/src/wizard.cpp kdenlive-0.7.7.1/src/wizard.cpp --- kdenlive-0.7.7/src/wizard.cpp 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/wizard.cpp 2010-02-26 21:44:41.000000000 +0000 @@ -36,7 +36,7 @@ #include const double recommendedMltVersion = 50; -static const char version[] = VERSION; +static const char kdenlive_version[] = VERSION; Wizard::Wizard(bool upgrade, QWidget *parent) : QWizard(parent) @@ -48,7 +48,7 @@ page1->setTitle(i18n("Welcome")); QLabel *label; if (upgrade) - label = new QLabel(i18n("Your Kdenlive version was upgraded to version %1. Please take some time to review the basic settings", QString(version).section(' ', 0, 0))); + label = new QLabel(i18n("Your Kdenlive version was upgraded to version %1. Please take some time to review the basic settings", QString(kdenlive_version).section(' ', 0, 0))); else label = new QLabel(i18n("This is the first time you run Kdenlive. This wizard will let you adjust some basic settings, you will be ready to edit your first movie in a few seconds...")); label->setWordWrap(true); @@ -581,7 +581,7 @@ void Wizard::slotShowWebInfos() { - KRun::runUrl(KUrl("http://kdenlive.org/discover/" + QString(version).section(' ', 0, 0)), "text/html", this); + KRun::runUrl(KUrl("http://kdenlive.org/discover/" + QString(kdenlive_version).section(' ', 0, 0)), "text/html", this); } #include "wizard.moc" diff -Nru kdenlive-0.7.7/src/wizard.cpp~ kdenlive-0.7.7.1/src/wizard.cpp~ --- kdenlive-0.7.7/src/wizard.cpp~ 2010-02-17 08:07:49.000000000 +0000 +++ kdenlive-0.7.7.1/src/wizard.cpp~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,587 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - -#include "wizard.h" -#include "kdenlivesettings.h" -#include "profilesdialog.h" -#include "kdenlive-config.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -const double recommendedMltVersion = 46; -static const char version[] = VERSION; - -Wizard::Wizard(bool upgrade, QWidget *parent) : - QWizard(parent) -{ - setWindowTitle(i18n("Config Wizard")); - setPixmap(QWizard::WatermarkPixmap, QPixmap(KStandardDirs::locate("appdata", "banner.png"))); - - QWizardPage *page1 = new QWizardPage; - page1->setTitle(i18n("Welcome")); - QLabel *label; - if (upgrade) - label = new QLabel(i18n("Your Kdenlive version was upgraded to version %1. Please take some time to review the basic settings", QString(version).section(' ', 0, 0))); - else - label = new QLabel(i18n("This is the first time you run Kdenlive. This wizard will let you adjust some basic settings, you will be ready to edit your first movie in a few seconds...")); - label->setWordWrap(true); - m_startLayout = new QVBoxLayout; - m_startLayout->addWidget(label); - QPushButton *but = new QPushButton(KIcon("help-about"), i18n("Discover the features of this Kdenlive release"), this); - connect(but, SIGNAL(clicked()), this, SLOT(slotShowWebInfos())); - m_startLayout->addStretch(); - m_startLayout->addWidget(but); - - - page1->setLayout(m_startLayout); - addPage(page1); - - QWizardPage *page4 = new QWizardPage; - page4->setTitle(i18n("Checking MLT engine")); - m_mltCheck.setupUi(page4); - addPage(page4); - - WizardDelegate *listViewDelegate = new WizardDelegate(m_mltCheck.programList); - m_mltCheck.programList->setItemDelegate(listViewDelegate); - - QWizardPage *page2 = new QWizardPage; - page2->setTitle(i18n("Video Standard")); - m_standard.setupUi(page2); - - m_okIcon = KIcon("dialog-ok"); - m_badIcon = KIcon("dialog-close"); - - // build profiles lists - QMap profilesInfo = ProfilesDialog::getProfilesInfo(); - QMap::const_iterator i = profilesInfo.constBegin(); - while (i != profilesInfo.constEnd()) { - QMap< QString, QString > profileData = ProfilesDialog::getSettingsFromFile(i.value()); - if (profileData.value("width") == "720") m_dvProfiles.insert(i.key(), i.value()); - else if (profileData.value("width").toInt() >= 1080) m_hdvProfiles.insert(i.key(), i.value()); - else m_otherProfiles.insert(i.key(), i.value()); - ++i; - } - - m_standard.button_all->setChecked(true); - connect(m_standard.button_all, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard())); - connect(m_standard.button_hdv, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard())); - connect(m_standard.button_dv, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard())); - slotCheckStandard(); - connect(m_standard.profiles_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckSelectedItem())); - - // select default profile - if (!KdenliveSettings::default_profile().isEmpty()) { - for (int i = 0; i < m_standard.profiles_list->count(); i++) { - if (m_standard.profiles_list->item(i)->data(Qt::UserRole).toString() == KdenliveSettings::default_profile()) { - m_standard.profiles_list->setCurrentRow(i); - m_standard.profiles_list->scrollToItem(m_standard.profiles_list->currentItem()); - break; - } - } - } - - addPage(page2); - - QWizardPage *page3 = new QWizardPage; - page3->setTitle(i18n("Additional Settings")); - m_extra.setupUi(page3); - m_extra.projectfolder->setMode(KFile::Directory); - m_extra.projectfolder->setUrl(KUrl(KdenliveSettings::defaultprojectfolder())); - m_extra.videothumbs->setChecked(KdenliveSettings::videothumbnails()); - m_extra.audiothumbs->setChecked(KdenliveSettings::audiothumbnails()); - m_extra.autosave->setChecked(KdenliveSettings::crashrecovery()); - connect(m_extra.videothumbs, SIGNAL(stateChanged(int)), this, SLOT(slotCheckThumbs())); - connect(m_extra.audiothumbs, SIGNAL(stateChanged(int)), this, SLOT(slotCheckThumbs())); - slotCheckThumbs(); - addPage(page3); - - - QWizardPage *page5 = new QWizardPage; - page5->setTitle(i18n("Checking system")); - m_check.setupUi(page5); - addPage(page5); - - listViewDelegate = new WizardDelegate(m_check.programList); - m_check.programList->setItemDelegate(listViewDelegate); - - QTimer::singleShot(500, this, SLOT(slotCheckMlt())); -} - - -void Wizard::checkMltComponents() -{ - QSize itemSize(20, fontMetrics().height() * 2.5); - m_mltCheck.programList->setColumnWidth(0, 30); - m_mltCheck.programList->setIconSize(QSize(24, 24)); - - - QTreeWidgetItem *mltitem = new QTreeWidgetItem(m_mltCheck.programList); - - QTreeWidgetItem *meltitem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("Melt") + " (" + KdenliveSettings::rendererpath() + ')'); - meltitem->setData(1, Qt::UserRole, i18n("Required for rendering (part of MLT package)")); - meltitem->setSizeHint(0, itemSize); - meltitem->setIcon(0, m_okIcon); - - // Check MLT's installed producers - QProcess checkProcess; - checkProcess.start(KdenliveSettings::rendererpath(), QStringList() << "-query" << "producer"); - if (!checkProcess.waitForStarted()) { - meltitem->setIcon(0, m_badIcon); - meltitem->setData(1, Qt::UserRole, i18n("Error starting MLT's command line player (melt)")); - button(QWizard::NextButton)->setEnabled(false); - } else { - checkProcess.waitForFinished(); - QByteArray result = checkProcess.readAllStandardError(); - - // Check MLT avformat module - QTreeWidgetItem *avformatItem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("Avformat module (FFmpeg)")); - avformatItem->setData(1, Qt::UserRole, i18n("Required to work with various video formats (hdv, mpeg, flash, ...)")); - avformatItem->setSizeHint(0, itemSize); - if (!result.contains("- avformat")) { - avformatItem->setIcon(0, m_badIcon); - m_mltCheck.tabWidget->setTabEnabled(1, false); - } else { - avformatItem->setIcon(0, m_okIcon); - // Make sure we have MLT > 0.3.4 - int version = 0; - QString mltVersion; - QString exepath = KStandardDirs::findExe("pkg-config"); - if (!exepath.isEmpty()) { - checkProcess.start(exepath, QStringList() << "--variable=version" << "mlt++"); - if (!checkProcess.waitForStarted()) { - kDebug() << "// Error querying MLT's version"; - } else { - checkProcess.waitForFinished(); - mltVersion = checkProcess.readAllStandardOutput(); - version = 100 * mltVersion.section('.', 0, 0).toInt() + 10 * mltVersion.section('.', 1, 1).toInt() + mltVersion.section('.', 2, 2).toInt(); - kDebug() << "// FOUND MLT's pkgconfig version: " << version; - } - } - if (version == 0) { - checkProcess.start(KdenliveSettings::rendererpath(), QStringList() << "--version"); - if (!checkProcess.waitForStarted()) { - kDebug() << "// Error querying MLT's version"; - } else { - checkProcess.waitForFinished(); - mltVersion = checkProcess.readAllStandardError(); - mltVersion = mltVersion.section('\n', 0, 0).simplified(); - mltVersion = mltVersion.section(' ', -1).simplified(); - version = 100 * mltVersion.section('.', 0, 0).toInt() + 10 * mltVersion.section('.', 1, 1).toInt() + mltVersion.section('.', 2, 2).toInt(); - kDebug() << "// FOUND MLT version: " << version; - } - } - - mltitem->setText(1, i18n("MLT version: %1", mltVersion.simplified())); - mltitem->setSizeHint(0, itemSize); - if (version < 40) { - mltitem->setData(1, Qt::UserRole, i18n("Your MLT version is unsupported!!!")); - mltitem->setIcon(0, m_badIcon); - } else { - if (version < recommendedMltVersion) { - mltitem->setData(1, Qt::UserRole, i18n("Please upgrade to the latest MLT version")); - mltitem->setIcon(0, m_badIcon); - } else { - mltitem->setData(1, Qt::UserRole, i18n("MLT version is correct")); - mltitem->setIcon(0, m_okIcon); - } - // Check installed audio codecs - QProcess checkProcess2; - checkProcess2.start(KdenliveSettings::rendererpath(), QStringList() << "noise:" << "-consumer" << "avformat" << "acodec=list"); - if (!checkProcess2.waitForStarted()) { - m_mltCheck.tabWidget->setTabEnabled(1, false); - kDebug() << "// Error parsing MLT's avformat codecs"; - } else { - checkProcess2.waitForFinished(); - QByteArray codecList = checkProcess2.readAllStandardError(); - QString acodecList(codecList); - QStringList result; - QStringList alist = acodecList.split('\n', QString::SkipEmptyParts); - for (int i = 0; i < alist.count(); i++) { - if (alist.at(i).contains("- ")) result.append(alist.at(i).section("- ", 1).simplified().toLower()); - } - m_mltCheck.acodecs_list->addItems(result); - KdenliveSettings::setAudiocodecs(result); - //kDebug()<<"// FOUND LIST:\n\n"<addItems(result); - KdenliveSettings::setVideocodecs(result); - //kDebug()<<"// FOUND LIST:\n\n"<addItems(result); - KdenliveSettings::setSupportedformats(result); - //kDebug()<<"// FOUND LIST:\n\n"<setData(1, Qt::UserRole, i18n("Required to work with dv files if avformat module is not installed")); - dvItem->setSizeHint(0, itemSize); - if (!result.contains("- libdv")) { - dvItem->setIcon(0, m_badIcon); - } else { - dvItem->setIcon(0, m_okIcon); - } - - // Check MLT image format module - QTreeWidgetItem *imageItem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("QImage module")); - imageItem->setData(1, Qt::UserRole, i18n("Required to work with images")); - imageItem->setSizeHint(0, itemSize); - if (!result.contains("- qimage")) { - imageItem->setIcon(0, m_badIcon); - imageItem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("Pixbuf module")); - imageItem->setData(1, Qt::UserRole, i18n("Required to work with images")); - imageItem->setSizeHint(0, itemSize); - if (!result.contains("- pixbuf")) imageItem->setIcon(0, m_badIcon); - else imageItem->setIcon(0, m_okIcon); - } else { - imageItem->setIcon(0, m_okIcon); - } - - // Check MLT title module - QTreeWidgetItem *titleItem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("Title module")); - titleItem->setData(1, Qt::UserRole, i18n("Required to work with titles")); - titleItem->setSizeHint(0, itemSize); - if (!result.contains("- kdenlivetitle")) { - KdenliveSettings::setHastitleproducer(false); - titleItem->setIcon(0, m_badIcon); - } else { - titleItem->setIcon(0, m_okIcon); - KdenliveSettings::setHastitleproducer(true); - } - } -} - -void Wizard::slotCheckPrograms() -{ - QSize itemSize(20, fontMetrics().height() * 2.5); - m_check.programList->setColumnWidth(0, 30); - m_check.programList->setIconSize(QSize(24, 24)); - - QTreeWidgetItem *item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("FFmpeg & ffplay")); - item->setData(1, Qt::UserRole, i18n("Required for webcam capture")); - item->setSizeHint(0, itemSize); - QString exepath = KStandardDirs::findExe("ffmpeg"); - if (exepath.isEmpty()) item->setIcon(0, m_badIcon); - else if (KStandardDirs::findExe("ffplay").isEmpty()) item->setIcon(0, m_badIcon); - else item->setIcon(0, m_okIcon); - -#ifndef Q_WS_MAC - item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("recordmydesktop")); - item->setData(1, Qt::UserRole, i18n("Required for screen capture")); - item->setSizeHint(0, itemSize); - if (KStandardDirs::findExe("recordmydesktop").isEmpty()) item->setIcon(0, m_badIcon); - else item->setIcon(0, m_okIcon); - - item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("dvgrab")); - item->setData(1, Qt::UserRole, i18n("Required for firewire capture")); - item->setSizeHint(0, itemSize); - if (KStandardDirs::findExe("dvgrab").isEmpty()) item->setIcon(0, m_badIcon); - else item->setIcon(0, m_okIcon); -#endif - - item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("dvdauthor")); - item->setData(1, Qt::UserRole, i18n("Required for creation of DVD")); - item->setSizeHint(0, itemSize); - if (KStandardDirs::findExe("dvdauthor").isEmpty()) item->setIcon(0, m_badIcon); - else item->setIcon(0, m_okIcon); - - - item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("genisoimage or mkisofs")); - item->setData(1, Qt::UserRole, i18n("Required for creation of DVD ISO images")); - item->setSizeHint(0, itemSize); - if (KStandardDirs::findExe("genisoimage").isEmpty()) { - // no GenIso, check for mkisofs - if (!KStandardDirs::findExe("mkisofs").isEmpty()) { - item->setIcon(0, m_okIcon); - } else item->setIcon(0, m_badIcon); - } else item->setIcon(0, m_okIcon); - - // set up some default applications - QString program; - if (KdenliveSettings::defaultimageapp().isEmpty()) { - program = KStandardDirs::findExe("gimp"); - if (program.isEmpty()) program = KStandardDirs::findExe("krita"); - if (!program.isEmpty()) KdenliveSettings::setDefaultimageapp(program); - } - if (KdenliveSettings::defaultaudioapp().isEmpty()) { - program = KStandardDirs::findExe("audacity"); - if (program.isEmpty()) program = KStandardDirs::findExe("traverso"); - if (!program.isEmpty()) KdenliveSettings::setDefaultaudioapp(program); - } - if (KdenliveSettings::defaultplayerapp().isEmpty()) { - KService::Ptr offer = KMimeTypeTrader::self()->preferredService("video/mpeg"); - if (offer) - KdenliveSettings::setDefaultplayerapp(KRun::binaryName(offer->exec(), true)); - } -} - -void Wizard::installExtraMimes(QString baseName, QStringList globs) -{ - QString mimefile = baseName; - mimefile.replace('/', '-'); - KMimeType::Ptr mime = KMimeType::mimeType(baseName); - if (!mime) { - kDebug() << "KMimeTypeTrader: mimeType " << baseName << " not found"; - } else { - QStringList extensions = mime->patterns(); - QString comment = mime->comment(); - foreach(const QString &glob, globs) { - if (!extensions.contains(glob)) extensions << glob; - } - kDebug() << "EXTS: " << extensions; - QString packageFileName = KStandardDirs::locateLocal("xdgdata-mime", "packages/" + mimefile + ".xml"); - kDebug() << "INSTALLING NEW MIME TO: " << packageFileName; - QFile packageFile(packageFileName); - if (!packageFile.open(QIODevice::WriteOnly)) { - kError() << "Couldn't open" << packageFileName << "for writing"; - return; - } - QXmlStreamWriter writer(&packageFile); - writer.setAutoFormatting(true); - writer.writeStartDocument(); - - const QString nsUri = "http://www.freedesktop.org/standards/shared-mime-info"; - writer.writeDefaultNamespace(nsUri); - writer.writeStartElement("mime-info"); - writer.writeStartElement(nsUri, "mime-type"); - writer.writeAttribute("type", baseName); - - if (!comment.isEmpty()) { - writer.writeStartElement(nsUri, "comment"); - writer.writeCharacters(comment); - writer.writeEndElement(); // comment - } - - foreach(const QString& pattern, extensions) { - writer.writeStartElement(nsUri, "glob"); - writer.writeAttribute("pattern", pattern); - writer.writeEndElement(); // glob - } - - writer.writeEndElement(); // mime-info - writer.writeEndElement(); // mime-type - writer.writeEndDocument(); - } -} - -void Wizard::runUpdateMimeDatabase() -{ - const QString localPackageDir = KStandardDirs::locateLocal("xdgdata-mime", QString()); - //Q_ASSERT(!localPackageDir.isEmpty()); - KProcess proc; - proc << "update-mime-database"; - proc << localPackageDir; - const int exitCode = proc.execute(); - if (exitCode) { - kWarning() << proc.program() << "exited with error code" << exitCode; - } -} - -void Wizard::slotCheckThumbs() -{ - QString pixname = "timeline_vthumbs.png"; - if (!m_extra.audiothumbs->isChecked() && !m_extra.videothumbs->isChecked()) { - pixname = "timeline_nothumbs.png"; - } else if (m_extra.audiothumbs->isChecked()) { - if (m_extra.videothumbs->isChecked()) - pixname = "timeline_avthumbs.png"; - else pixname = "timeline_athumbs.png"; - } - - m_extra.timeline_preview->setPixmap(QPixmap(KStandardDirs::locate("appdata", pixname))); -} - -void Wizard::slotCheckStandard() -{ - m_standard.profiles_list->clear(); - QStringList profiles; - if (!m_standard.button_hdv->isChecked()) { - // DV standard - QMapIterator i(m_dvProfiles); - while (i.hasNext()) { - i.next(); - QListWidgetItem *item = new QListWidgetItem(i.key(), m_standard.profiles_list); - item->setData(Qt::UserRole, i.value()); - } - } - if (!m_standard.button_dv->isChecked()) { - // HDV standard - QMapIterator i(m_hdvProfiles); - while (i.hasNext()) { - i.next(); - QListWidgetItem *item = new QListWidgetItem(i.key(), m_standard.profiles_list); - item->setData(Qt::UserRole, i.value()); - } - } - if (m_standard.button_all->isChecked()) { - QMapIterator i(m_otherProfiles); - while (i.hasNext()) { - i.next(); - QListWidgetItem *item = new QListWidgetItem(i.key(), m_standard.profiles_list); - item->setData(Qt::UserRole, i.value()); - } - //m_standard.profiles_list->sortItems(); - } - - for (int i = 0; i < m_standard.profiles_list->count(); i++) { - QListWidgetItem *item = m_standard.profiles_list->item(i); - - QMap< QString, QString > values = ProfilesDialog::getSettingsFromFile(item->data(Qt::UserRole).toString()); - const QString infoString = ("" + i18n("Frame size:") + " %1x%2
" + i18n("Frame rate:") + " %3/%4
" + i18n("Pixel aspect ratio:") + "%5/%6
" + i18n("Display aspect ratio:") + " %7/%8").arg(values.value("width"), values.value("height"), values.value("frame_rate_num"), values.value("frame_rate_den"), values.value("sample_aspect_num"), values.value("sample_aspect_den"), values.value("display_aspect_num"), values.value("display_aspect_den")); - item->setToolTip(infoString); - } - - m_standard.profiles_list->setSortingEnabled(true); - m_standard.profiles_list->setCurrentRow(0); -} - -void Wizard::slotCheckSelectedItem() -{ - // Make sure we always have an item highlighted - m_standard.profiles_list->setCurrentRow(m_standard.profiles_list->currentRow()); -} - - -void Wizard::adjustSettings() -{ - if (m_extra.installmimes->isChecked()) { - QStringList globs; - globs << "*.mts" << "*.m2t" << "*.mod" << "*.ts" << "*.m2ts"; - installExtraMimes("video/mpeg", globs); - globs.clear(); - globs << "*.dv"; - installExtraMimes("video/dv", globs); - runUpdateMimeDatabase(); - } - KdenliveSettings::setAudiothumbnails(m_extra.audiothumbs->isChecked()); - KdenliveSettings::setVideothumbnails(m_extra.videothumbs->isChecked()); - KdenliveSettings::setCrashrecovery(m_extra.autosave->isChecked()); - if (m_standard.profiles_list->currentItem()) { - QString selectedProfile = m_standard.profiles_list->currentItem()->data(Qt::UserRole).toString(); - if (selectedProfile.isEmpty()) selectedProfile = "dv_pal"; - KdenliveSettings::setDefault_profile(selectedProfile); - } - QString path = m_extra.projectfolder->url().path(); - if (KStandardDirs::makeDir(path) == false) { - kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; - } else KdenliveSettings::setDefaultprojectfolder(path); - -} - -void Wizard::slotCheckMlt() -{ - QString errorMessage; - if (KdenliveSettings::rendererpath().isEmpty()) { - errorMessage.append(i18n("Your MLT installation cannot be found. Install MLT and restart Kdenlive.\n")); - } - /*QProcess checkProcess; - checkProcess.start(KdenliveSettings::rendererpath(), QStringList() << "-query" << "producer"); - if (!checkProcess.waitForStarted()) - errorMessage.append(i18n("Error starting MLT's command line player (melt)") + ".\n"); - - checkProcess.waitForFinished(); - - QByteArray result = checkProcess.readAllStandardError(); - if (!result.contains("- avformat")) errorMessage.append(i18n("MLT's avformat (FFMPEG) module not found. Please check your FFMPEG and MLT install. Kdenlive will not work until this issue is fixed.") + "\n");*/ - - QProcess checkProcess2; - checkProcess2.start(KdenliveSettings::rendererpath(), QStringList() << "-query" << "consumer"); - if (!checkProcess2.waitForStarted()) - errorMessage.append(i18n("Error starting MLT's command line player (melt).") + '\n'); - - checkProcess2.waitForFinished(); - - QByteArray result = checkProcess2.readAllStandardError(); - if (!result.contains("sdl") || !result.contains("sdl_preview")) errorMessage.append(i18n("MLT's SDL module not found. Please check your MLT install. Kdenlive will not work until this issue is fixed.") + '\n'); - - if (!errorMessage.isEmpty()) { - errorMessage.prepend(QString("%1
").arg(i18n("Fatal Error"))); - QLabel *pix = new QLabel(); - pix->setPixmap(KIcon("dialog-error").pixmap(30)); - QLabel *label = new QLabel(errorMessage); - label->setWordWrap(true); - m_startLayout->addSpacing(40); - m_startLayout->addWidget(pix); - m_startLayout->addWidget(label); - m_systemCheckIsOk = false; - button(QWizard::NextButton)->setEnabled(false); - } else m_systemCheckIsOk = true; - - if (m_systemCheckIsOk) checkMltComponents(); - slotCheckPrograms(); -} - -bool Wizard::isOk() const -{ - return m_systemCheckIsOk; -} - -void Wizard::slotShowWebInfos() -{ - KRun::runUrl(KUrl("http://kdenlive.org/discover/" + QString(version).section(' ', 0, 0)), "text/html", this); -} - -#include "wizard.moc"