From 89ae13638097f259f3e50b4b61068dd23451107d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 9 May 2017 11:24:03 +0100 Subject: [PATCH] Simple cover sheet support (#1039). --- ChangeLog | 4 + graphics/linux/128/dcpomatic2.png | Bin 24154 -> 24154 bytes graphics/linux/16/dcpomatic2.png | Bin 1946 -> 1946 bytes graphics/linux/22/dcpomatic2.png | Bin 2366 -> 2366 bytes graphics/linux/256/dcpomatic2.png | Bin 70188 -> 70188 bytes graphics/linux/32/dcpomatic2.png | Bin 3704 -> 3704 bytes graphics/linux/48/dcpomatic2.png | Bin 6369 -> 6369 bytes graphics/linux/512/dcpomatic2.png | Bin 232409 -> 232409 bytes graphics/linux/64/dcpomatic2.png | Bin 9349 -> 9349 bytes .../osx/dcpomatic2.iconset/icon_128x128.png | Bin 24154 -> 24154 bytes .../dcpomatic2.iconset/icon_128x128@2x.png | Bin 24154 -> 24154 bytes .../osx/dcpomatic2.iconset/icon_16x16.png | Bin 1946 -> 1946 bytes .../osx/dcpomatic2.iconset/icon_16x16@2x.png | Bin 1946 -> 1946 bytes .../osx/dcpomatic2.iconset/icon_256x256.png | Bin 70188 -> 70188 bytes .../dcpomatic2.iconset/icon_256x256@2x.png | Bin 70188 -> 70188 bytes .../osx/dcpomatic2.iconset/icon_32x32.png | Bin 3704 -> 3704 bytes .../osx/dcpomatic2.iconset/icon_32x32@2x.png | Bin 3704 -> 3704 bytes .../osx/dcpomatic2.iconset/icon_512x512.png | Bin 232409 -> 232409 bytes .../dcpomatic2.iconset/icon_512x512@2x.png | Bin 232409 -> 232409 bytes graphics/osx/preferences/cover_sheet.png | Bin 0 -> 1192 bytes graphics/src/cover_sheet.svg | 253 ++++++++++++++++++ graphics/update | 2 +- graphics/web/favicon-128x128.png | Bin 25046 -> 25046 bytes graphics/web/favicon-16x16.png | Bin 1976 -> 1976 bytes graphics/web/favicon-256x256.png | Bin 70281 -> 70281 bytes graphics/web/favicon-32x32.png | Bin 3747 -> 3747 bytes graphics/web/favicon-64x64.png | Bin 9587 -> 9587 bytes graphics/web/logo.png | Bin 0 -> 22492 bytes src/lib/config.cc | 24 ++ src/lib/config.h | 12 + src/lib/film.cc | 21 +- src/lib/util.cc | 27 ++ src/lib/util.h | 1 + src/lib/writer.cc | 47 +++- src/lib/writer.h | 1 + src/wx/config_dialog.cc | 66 +++++ 36 files changed, 438 insertions(+), 20 deletions(-) create mode 100644 graphics/osx/preferences/cover_sheet.png create mode 100644 graphics/src/cover_sheet.svg create mode 100644 graphics/web/logo.png diff --git a/ChangeLog b/ChangeLog index f349abaa9..bc8e6bb81 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2017-05-09 Carl Hetherington + + * Write a simple cover sheet when making a DCP (#1039). + 2017-05-08 Carl Hetherington * Show multiple tracks in the timeline if there are overlapping subtitles (#941). diff --git a/graphics/linux/128/dcpomatic2.png b/graphics/linux/128/dcpomatic2.png index ae3ae23e99e26e6efa371687849ee8cd1108389f..5ff12d6ed9dfc614260cbf897db6081ff668409c 100644 GIT binary patch delta 101 zcmcb$hw;`P#tn}dIaxWm_@qt+eU9J!hA}PL!&KM6D8$gv%FxKl$XMIJ(8|Ezg=EWJ p1_lPz64!{5l*E!$tK9sQ%(O}dBLhQoT>~r{X1drUPM#He004@wA2I*{ delta 101 zcmcb$hw;`P#tn}dIT=Ox42>I(90=U}hA}PL!%)}AAjHtb%E;Wx)KJ^Nz{~r{QZ_wRnLI1@004yadsRc delta 99 zcmbQmKZ}2Z2P-F|2%n+e<3npYHV3jgGI|*58X1Hbnphc`TbUYa8yHv_7>K@)ox#As npjzS@QIe8al4_NkpOTqY$zWt)Xs&C3MMKJ_rz(?gu^j*aYr-6b diff --git a/graphics/linux/22/dcpomatic2.png b/graphics/linux/22/dcpomatic2.png index d99654779b5b383264e2c3560fbab8b248b103ac..6d27f8c11f3827ac43d3d1b50a36eba5ed1e5d2a 100644 GIT binary patch delta 78 zcmdldv`=WmV@6I^PA)#N!%y~?Y<|P&#U^g5YhV;&XlP|JMGhJ*FC)aTt006Cq7U2K@ delta 78 zcmdldv`=WmV@6I!5k5oxDM#nXZGOY(#U^g3Yh(~&Xkuk#Ze?nyZD3$!U?BQFcE)61 R4k>JMDVv_EOs?ZN004!q7N-CJ diff --git a/graphics/linux/256/dcpomatic2.png b/graphics/linux/256/dcpomatic2.png index 394da0332aaa567eacd1a1b33029a9d923e4ae66..bf734859cb87119e8cc2abaccbdedf7a78e163ff 100644 GIT binary patch delta 86 zcmZ3pgk{YVmJN>?IaxWm_@wuS9zNOphH?8FMn(&MaZ_CbqYy(wD?=kIBV%m?Ln{M= Z7m_V^r&|j$N@0_n>0*;OJx7r7005M&85RHl delta 86 zcmZ3pgk{YVmJN>?IT=Ox3{B(~gnnv%!?^toBclbsxS_6*L5QJ=m65rXsiC%kft7)Q Z==<0i)2#&=rLak+YG_*1_vNAH(HZZg@FnA%^a(D6v RaVczaGhJ*FCo4)E006w57byS$ delta 78 zcmaE8_|R~}V@6I!5k5o1yi*HnH@{(gD=KcNYh(~&Xkuk#Ze?nyZD3$!U?BQFcE;on R;!@b;QZ_wRnXD*r008<-7>57= diff --git a/graphics/linux/512/dcpomatic2.png b/graphics/linux/512/dcpomatic2.png index 6f7543daf6a847ad856a3e0042b157ac3e021322..4cd8938046a74fbc615eab943e5f772958ae9fc0 100644 GIT binary patch delta 114 zcmcaPo$uy!z73BVIaxWm_+*p~!?K#+Ft)#81YxG_Zy1@Mc6gZT8W@Eb8d@0|Ss58? z8yH#{7`%{dxy!)7pjzS@QIe8al4_NkpOTqY$zWt)Xs&C3MZ-)No5bmo-OL97Ew>_S delta 114 zcmcaPo$uy!z73BVIT=Ox3{5kar=~Q&VQhcH2*OO;-!L*i?eH+vH8Kb>G_f)=w=y-< zHZZUIC|03&2JbdDtege8W@Eb8d@0|Ss58?8yH#{7`%{dxy!)7 npjzS@QIe8al4_NkpOTqY$zWt)Xs&C3MZ-)No5aaSl@9;_)DIm< delta 99 zcmZqmZ1vpmn30oFgwN3E`{57AH@{(=sOVv+Yh(~&Xkuk#Ze?nyZD3$!U?BQFb_N3j ngKCLuL`h0wNvc(DeoAIqC4-THp}DRB77Zzzo~lefs(b(dM1vm@ diff --git a/graphics/osx/dcpomatic2.iconset/icon_128x128.png b/graphics/osx/dcpomatic2.iconset/icon_128x128.png index 6e028b2c3c6d08fcb00737e46ae55cd297e640eb..f0d6df56dadf02e71ea43ac3f07fced9ff955f44 100644 GIT binary patch delta 101 zcmcb$hw;`P#tn}dIaxWm_yn}tr5rcEVN8qmFx53M3NbXaGBmO>GS)UQv@$SwA=z@5 pfq_A_#5JNMC9x#cDmOnRGp&-r$iUEC*8q!#nJzYolV`;q000s+9mW6v delta 101 zcmcb$hw;`P#tn}dIT=Ox3^lkGa_-&yhA}PL!%)}AAjHtb%E;Wx)KJ^Nz{~r{QZ_wRnLI1@0022g9=8Ah diff --git a/graphics/osx/dcpomatic2.iconset/icon_128x128@2x.png b/graphics/osx/dcpomatic2.iconset/icon_128x128@2x.png index 6e028b2c3c6d08fcb00737e46ae55cd297e640eb..f0d6df56dadf02e71ea43ac3f07fced9ff955f44 100644 GIT binary patch delta 101 zcmcb$hw;`P#tn}dIaxWm_yn}tr5rcEVN8qmFx53M3NbXaGBmO>GS)UQv@$SwA=z@5 pfq_A_#5JNMC9x#cDmOnRGp&-r$iUEC*8q!#nJzYolV`;q000s+9mW6v delta 101 zcmcb$hw;`P#tn}dIT=Ox3^lkGa_-&yhA}PL!%)}AAjHtb%E;Wx)KJ^Nz{~r{QZ_wRnLI1@0022g9=8Ah diff --git a/graphics/osx/dcpomatic2.iconset/icon_16x16.png b/graphics/osx/dcpomatic2.iconset/icon_16x16.png index e2b750e9460fa3a83ac8967f2926500e4c9e5fd5..cf150c09be8ec2edab85120965116f26d0d3160e 100644 GIT binary patch delta 99 zcmbQmKZ}2Z2P-ElCl?=&U7H)<=0H|QMh{b61EUZ_Ln}igDUO_Qmu0HQ!>*k8H@}J&2cn(G>1(U7v~smkPAYzF|x1R9qB diff --git a/graphics/osx/dcpomatic2.iconset/icon_16x16@2x.png b/graphics/osx/dcpomatic2.iconset/icon_16x16@2x.png index e2b750e9460fa3a83ac8967f2926500e4c9e5fd5..cf150c09be8ec2edab85120965116f26d0d3160e 100644 GIT binary patch delta 99 zcmbQmKZ}2Z2P-ElCl?=&U7H)<=0H|QMh{b61EUZ_Ln}igDUO_Qmu0HQ!>*k8H@}J&2cn(G>1(U7v~smkPAYzF|x1R9qB diff --git a/graphics/osx/dcpomatic2.iconset/icon_256x256.png b/graphics/osx/dcpomatic2.iconset/icon_256x256.png index 724869aacfef404da0f41bd3c40c7dbf5890e767..d84d2285bfc660c6dad530093ef4b2f6bc5fb62f 100644 GIT binary patch delta 86 zcmZ3pgk{YVmJN>?IaxWm_yl7cw5~V5VchDGdbQrIMCy4WO6&k?IT=Ox47HxD&zRW!hH?8FMn(&MaYJ1rgAhX#D diff --git a/graphics/osx/dcpomatic2.iconset/icon_256x256@2x.png b/graphics/osx/dcpomatic2.iconset/icon_256x256@2x.png index 724869aacfef404da0f41bd3c40c7dbf5890e767..d84d2285bfc660c6dad530093ef4b2f6bc5fb62f 100644 GIT binary patch delta 86 zcmZ3pgk{YVmJN>?IaxWm_yl7cw5~V5VchDGdbQrIMCy4WO6&k?IT=Ox47HxD&zRW!hH?8FMn(&MaYJ1rgAhX#D diff --git a/graphics/osx/dcpomatic2.iconset/icon_32x32.png b/graphics/osx/dcpomatic2.iconset/icon_32x32.png index abad340e1d6d393256e3a7203f3419ba45a97651..46e0fb786f9da1ab38444e8ad52d20fbcdde042f 100644 GIT binary patch delta 99 zcmew%^FwCCV@6I^PA)#a3mxi8o8K_DaC?~Q8W@Eb8d@0|Ss58?8yH#{7`%{dxy!)7 npjzS@QIe8al4_NkpOTqY$zWt)Xs&C3MZ-)No5aaGcn<&o%#G_f)=w=y-G_f)=w=y-k806bx<&e~(+~WBBwD{2CR6S!i4EMS@27=xEjwNt8Ff=jH-^4z|4j9GWTMz|^lwEy~w7)HBdO z_IU44VA43|>Eaj?(fW3}t^e%+k+%6N4ht44F5sCuA$6IK$|;GHLC01lFYD>x`P2Mw z(!WkU9gmP#=L9wyr6w?nqtysERTlV(*%93|Gr}61T ztX%Qn;luCiTYJx*-?ePfG9T9oE1fzOyd?PQ|K7Q6|Kr=AyGu2iW8OVJm$&nmtGI&K z+ixc;Lu`Z|d|Yfc*H8W0ju^e*)mOJ1Ok$Kdey~s`_wx~ky>a~q6Fw*{4$*R58f3^V zz`{8B#n#u80^-5#B zw}^9c`9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + tango internet mail + 2010-03-29T08:04:16 + "E-mail" icon from <a href="http://tango.freedesktop.org/Tango_Desktop_Project"> Tango Project </a> \n<br><br> \nSince version 0.8.90 Tango Project icons are Public Domain: <a href="http://tango.freedesktop.org/Frequently_Asked_Questions#Terms_of_Use.3F"> Tango Project FAQ </a> + https://openclipart.org/detail/35215/tango-internet-mail-by-warszawianka + + + warszawianka + + + + + email + envelope + externalsource + icon + letter + tango + + + + + + + + + + + diff --git a/graphics/update b/graphics/update index 2b72080f8..06e4de302 100755 --- a/graphics/update +++ b/graphics/update @@ -55,7 +55,7 @@ else # OS X preferences icons # servers.png does not have an SVG version mkdir -p osx/preferences - for i in colour_conversions defaults kdm_email keys tms; do + for i in colour_conversions defaults kdm_email cover_sheet keys tms; do $INKSCAPE osx/preferences/$i.png src/$i.svg -w 32 -h 32 done diff --git a/graphics/web/favicon-128x128.png b/graphics/web/favicon-128x128.png index 3c684fc8bae9cadec662bdefd8d30082b4ee4b6d..93a1ebbcd20bf0fdccca7ca72449ba88c507f59b 100644 GIT binary patch delta 101 zcmcb1nDN?S#tn}dIaxWm_~dt4uwU5xhVfCHhpDcCWr(4nm7$51v7xqsp_PHblb7cv pFfcHvmbgZgq$HN4TIJ@aWTsUz7#SFv>l$FuFm+3r&SbH~0|2lOAK?H1 delta 101 zcmcb1nDN?S#tn}dIT=Ox3@yaPByVnh!}uu9!%)}AAjHtb%EZ#j)J)sJz{~r{!ZQ`4CW|E=002N;9f$w` diff --git a/graphics/web/favicon-16x16.png b/graphics/web/favicon-16x16.png index 666411ee28a0e80867d9b40817c2feecba761507..7dfaf35227d16fd5e06a09edab461aef41177c5f 100644 GIT binary patch delta 99 zcmdnNzk`268Y?F&Cl{amE(`VxoAX&689hvO4J<cn(G>1(GZ@g7&Z9^+W`Rldm4EF diff --git a/graphics/web/favicon-256x256.png b/graphics/web/favicon-256x256.png index 6be1a06ba0e4861253a5ad25c1fe83392686d6d2..df20b5c921e6c19f89c0e851022e506db754eec0 100644 GIT binary patch delta 106 zcmeBN%F?-%Wy51ePF7AXKKWf1>=&BfFm8Xt$T*eX!&KM6D8$gv%FxKl$XMIJ(8|Ez ug=EWJ1_lPz64!{5l*E!$tK9sQ%(O}dBLhQoT>~r{X1drUPCqHgcmM#i2OkIk delta 106 zcmeBN%F?-%Wy51ePDT+vLkn>+$(zk@7`MM+WSq+HVW?|l5MpRzWn^w;YN%~sU}az+ u`aX6B0|SFRc?MtW?ChKk%6JPt^pPeDVv_EOg|~ecmM!@3?AzM diff --git a/graphics/web/favicon-32x32.png b/graphics/web/favicon-32x32.png index 86d2850f13797f043420d54bf7cc73238c91acbc..c7b87ba0511a4db349ee01028a4630f61353fc83 100644 GIT binary patch delta 99 zcmZ21yI6L^V@6I^PA)$AT^8&YHosw9&+TEVYhW2-XlP|!C8<`q`6-!cl?+A(hUU5kSTs!CQl>NcG4BBY-cTMO delta 99 zcmZ21yI6L^V@6I!5k5l;aWTo8o8K_5=k_qvH8Kb>G_f+Vv@$i*HZZUq nLAAs+q9i4;B-JW6KP5A*lEKKp&|KF5i-zz_#i+@Tc@F>pZk`** diff --git a/graphics/web/favicon-64x64.png b/graphics/web/favicon-64x64.png index 0c849d96abe8d6a863971f78af11223fe4b8391c..0fa6bd7d6525151ff4da393544a203a3e7189370 100644 GIT binary patch delta 99 zcmezD_1SB~V@6I^PA)$AT^8&YHosx4SMo5`HLwgZG_*1_u`)K)HZZg@FnIFv+yn*& n2GtVRh?11Vl2ohQ{FKbJN(LhXLvvjNEE=Y6Dbty}S>*r#HHjYR delta 99 zcmezD_1SB~V@6I!5k5l;aWTo8o8K_jD|r~|8X1Hbnpl}wTA7+@8yHv_7^s=de8#}Q mpjzS@QIe8al4_NkpOTqY$zWt)Xs&C3MMHR|V$|f#DhB|?$Q+LV diff --git a/graphics/web/logo.png b/graphics/web/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..992894e43ad77598e40bf7b366e0854ba59607e8 GIT binary patch literal 22492 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 HS%&`$)G$1r literal 0 HcmV?d00001 diff --git a/src/lib/config.cc b/src/lib/config.cc index c0ab44923..a19a60f55 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -132,6 +132,7 @@ Config::set_defaults () _allowed_dcp_frame_rates.push_back (60); set_kdm_email_to_default (); + set_cover_sheet_to_default (); } void @@ -329,6 +330,9 @@ try } _preview_sound = f.optional_bool_child("PreviewSound").get_value_or (false); _preview_sound_output = f.optional_string_child("PreviewSoundOutput"); + if (f.optional_string_child("CoverSheet")) { + _cover_sheet = f.optional_string_child("CoverSheet").get(); + } /* Replace any cinemas from config.xml with those from the configured file */ if (boost::filesystem::exists (_cinemas_file)) { @@ -514,6 +518,7 @@ Config::write_config () const if (_preview_sound_output) { root->add_child("PreviewSoundOutput")->add_child_text (_preview_sound_output.get()); } + root->add_child("CoverSheet")->add_child_text (_cover_sheet); try { doc.write_to_file_formatted (path("config.xml").string ()); @@ -607,6 +612,18 @@ Config::reset_kdm_email () changed (); } +void +Config::set_cover_sheet_to_default () +{ + _cover_sheet = _( + "$CPL_NAME\n\n" + "Type: $TYPE\n" + "Format: $CONTAINER\n" + "Audio: $AUDIO\n" + "Length: $LENGTH\n" + ); +} + void Config::add_to_history (boost::filesystem::path p) { @@ -707,3 +724,10 @@ Config::config_path () { return path("config.xml", false); } + +void +Config::reset_cover_sheet () +{ + set_cover_sheet_to_default (); + changed (); +} diff --git a/src/lib/config.h b/src/lib/config.h index 3e74a5049..fc6315242 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -327,6 +327,10 @@ public: return _preview_sound; } + std::string cover_sheet () const { + return _cover_sheet; + } + boost::optional preview_sound_output () const { return _preview_sound_output; } @@ -599,6 +603,12 @@ public: maybe_set (_nagged[nag], nagged); } + void set_cover_sheet (std::string s) { + maybe_set (_cover_sheet, s); + } + + void reset_cover_sheet (); + void changed (Property p = OTHER); boost::signals2::signal Changed; /** Emitted if read() failed on an existing Config file. There is nothing @@ -629,6 +639,7 @@ private: void read (); void set_defaults (); void set_kdm_email_to_default (); + void set_cover_sheet_to_default (); void read_cinemas (cxml::Document const & f); boost::shared_ptr create_certificate_chain (); boost::filesystem::path directory_or (boost::optional dir, boost::filesystem::path a) const; @@ -737,6 +748,7 @@ private: bool _preview_sound; /** name of a specific sound output stream to use for preview, or empty to use the default */ boost::optional _preview_sound_output; + std::string _cover_sheet; /** Singleton instance, or 0 */ static Config* _instance; diff --git a/src/lib/film.cc b/src/lib/film.cc index df19af77f..04ff00250 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -723,24 +723,9 @@ Film::isdcf_name (bool if_created_now) const /* Count mapped audio channels */ - int non_lfe = 0; - int lfe = 0; - - BOOST_FOREACH (int i, mapped_audio_channels ()) { - if (i >= audio_channels()) { - /* This channel is mapped but is not included in the DCP */ - continue; - } - - if (static_cast (i) == dcp::LFE) { - ++lfe; - } else { - ++non_lfe; - } - } - - if (non_lfe) { - d += String::compose("_%1%2", non_lfe, lfe); + pair ch = audio_channel_types (mapped_audio_channels(), audio_channels()); + if (ch.first) { + d += String::compose("_%1%2", ch.first, ch.second); } /* XXX: HI/VI */ diff --git a/src/lib/util.cc b/src/lib/util.cc index 574d1d889..b1dfeab55 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -88,6 +88,7 @@ using std::pair; using std::cout; using std::bad_alloc; using std::set_terminate; +using std::make_pair; using boost::shared_ptr; using boost::thread; using boost::optional; @@ -706,3 +707,29 @@ careful_string_filter (string s) return out; } + +/** @param mapped List of mapped audio channels from a Film. + * @param channels Total number of channels in the Film. + * @return First: number of non-LFE channels, second: number of LFE channels. + */ +pair +audio_channel_types (list mapped, int channels) +{ + int non_lfe = 0; + int lfe = 0; + + BOOST_FOREACH (int i, mapped) { + if (i >= channels) { + /* This channel is mapped but is not included in the DCP */ + continue; + } + + if (static_cast (i) == dcp::LFE) { + ++lfe; + } else { + ++non_lfe; + } + } + + return make_pair (non_lfe, lfe); +} diff --git a/src/lib/util.h b/src/lib/util.h index 4e6e50dd7..db6c37fe1 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -83,5 +83,6 @@ extern std::string video_asset_filename (boost::shared_ptr as extern std::string audio_asset_filename (boost::shared_ptr asset, int reel_index, int reel_count, boost::optional content_summary); extern float relaxed_string_to_float (std::string); extern std::string careful_string_filter (std::string); +extern std::pair audio_channel_types (std::list mapped, int channels); #endif diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 87cdac2d8..ec4689b2f 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2016 Carl Hetherington + Copyright (C) 2012-2017 Carl Hetherington This file is part of DCP-o-matic. @@ -539,6 +539,51 @@ Writer::finish () LOG_GENERAL ( N_("Wrote %1 FULL, %2 FAKE, %3 REPEAT, %4 pushed to disk"), _full_written, _fake_written, _repeat_written, _pushed_to_disk ); + + write_cover_sheet (); +} + +void +Writer::write_cover_sheet () +{ + boost::filesystem::path const cover = _film->file ("COVER_SHEET.txt"); + FILE* f = fopen_boost (cover, "w"); + if (!f) { + throw OpenFileError (cover, errno, false); + } + + string text = Config::instance()->cover_sheet (); + boost::algorithm::replace_all (text, "$CPL_NAME", _film->name()); + boost::algorithm::replace_all (text, "$TYPE", _film->dcp_content_type()->pretty_name()); + boost::algorithm::replace_all (text, "$CONTAINER", _film->container()->nickname()); + + pair ch = audio_channel_types (_film->mapped_audio_channels(), _film->audio_channels()); + string description = String::compose("%1.%2", ch.first, ch.second); + + if (description == "0.0") { + description = _("None"); + } else if (description == "1.0") { + description = _("Mono"); + } else if (description == "2.0") { + description = _("Stereo"); + } + boost::algorithm::replace_all (text, "$AUDIO", description); + + int h, m, s, fr; + _film->length().split (_film->video_frame_rate(), h, m, s, fr); + string length; + if (h == 0 && m == 0) { + length = String::compose("%1s", s); + } else if (h == 0 && m > 0) { + length = String::compose("%1m%2s", m, s); + } else if (h > 0 && m > 0) { + length = String::compose("%1h%2m%3s", h, m, s); + } + + boost::algorithm::replace_all (text, "$LENGTH", length); + + fwrite (text.c_str(), 1, text.length(), f); + fclose (f); } /** @param frame Frame index within the whole DCP. diff --git a/src/lib/writer.h b/src/lib/writer.h index 1e4d3b6a3..cb1bdc5cc 100644 --- a/src/lib/writer.h +++ b/src/lib/writer.h @@ -117,6 +117,7 @@ private: bool have_sequenced_image_at_queue_head (); size_t video_reel (int frame) const; void set_digest_progress (Job* job, float progress); + void write_cover_sheet (); /** our Film */ boost::shared_ptr _film; diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index 570d5e448..49a8a6849 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -1482,6 +1482,71 @@ private: wxButton* _reset_kdm_email; }; +class CoverSheetPage : public StandardPage +{ +public: + + CoverSheetPage (wxSize panel_size, int border) +#ifdef DCPOMATIC_OSX + /* We have to force both width and height of this one */ + : StandardPage (wxSize (480, 128), border) +#else + : StandardPage (panel_size, border) +#endif + {} + + wxString GetName () const + { + return _("Cover Sheet"); + } + +#ifdef DCPOMATIC_OSX + wxBitmap GetLargeIcon () const + { + return wxBitmap ("cover_sheet", wxBITMAP_TYPE_PNG_RESOURCE); + } +#endif + +private: + void setup () + { + _cover_sheet = new wxTextCtrl (_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (-1, 200), wxTE_MULTILINE); + _panel->GetSizer()->Add (_cover_sheet, 0, wxEXPAND | wxALL, _border); + + _reset_cover_sheet = new wxButton (_panel, wxID_ANY, _("Reset to default text")); + _panel->GetSizer()->Add (_reset_cover_sheet, 0, wxEXPAND | wxALL, _border); + + _cover_sheet->Bind (wxEVT_TEXT, boost::bind (&CoverSheetPage::cover_sheet_changed, this)); + _reset_cover_sheet->Bind (wxEVT_BUTTON, boost::bind (&CoverSheetPage::reset_cover_sheet, this)); + } + + void config_changed () + { + checked_set (_cover_sheet, Config::instance()->cover_sheet ()); + } + + void cover_sheet_changed () + { + if (_cover_sheet->GetValue().IsEmpty ()) { + /* Sometimes we get sent an erroneous notification that the cover sheet + is empty; I don't know why. + */ + return; + } + Config::instance()->set_cover_sheet (wx_to_std (_cover_sheet->GetValue ())); + } + + void reset_cover_sheet () + { + Config::instance()->reset_cover_sheet (); + checked_set (_cover_sheet, Config::instance()->cover_sheet ()); + } + + wxTextCtrl* _cover_sheet; + wxButton* _reset_cover_sheet; +}; + + /** @class AdvancedPage * @brief Advanced page of the preferences dialog. */ @@ -1730,6 +1795,7 @@ create_config_dialog () e->AddPage (new KeysPage (ps, border)); e->AddPage (new TMSPage (ps, border)); e->AddPage (new KDMEmailPage (ps, border)); + e->AddPage (new CoverSheetPage (ps, border)); e->AddPage (new AdvancedPage (ps, border)); return e; } -- 2.30.2