First hacks on OOBE help.
authorCarl Hetherington <cth@carlh.net>
Tue, 9 Jun 2020 22:50:37 +0000 (00:50 +0200)
committerCarl Hetherington <cth@carlh.net>
Sat, 20 Jun 2020 18:09:15 +0000 (20:09 +0200)
28 files changed:
graphics/fonts/BebasNeue-Regular.ttf [new file with mode: 0644]
graphics/fonts/IbarraRealNova-Bold.ttf [new file with mode: 0644]
graphics/fonts/IbarraRealNova-BoldItalic.ttf [new file with mode: 0644]
graphics/fonts/IbarraRealNova-Italic.ttf [new file with mode: 0644]
graphics/fonts/IbarraRealNova-Regular.ttf [new file with mode: 0644]
graphics/fonts/IbarraRealNova-SemiBold.ttf [new file with mode: 0644]
graphics/fonts/IbarraRealNova-SemiBoldItalic.ttf [new file with mode: 0644]
graphics/fonts/OFL.txt [new file with mode: 0644]
graphics/help/add_content.png [new file with mode: 0644]
graphics/help/file_new.png [new file with mode: 0644]
graphics/help/preview.png [new file with mode: 0644]
graphics/src/help/add_content.svg [new file with mode: 0644]
graphics/src/help/file_new.svg [new file with mode: 0644]
graphics/src/help/preview.svg [new file with mode: 0644]
graphics/update
platform/osx/make_dmg.sh
platform/windows/wscript
src/lib/film.cc
src/lib/help.cc [new file with mode: 0644]
src/lib/help.h [new file with mode: 0644]
src/lib/wscript
src/tools/dcpomatic.cc
src/wx/content_panel.cc
src/wx/film_editor.cc
src/wx/standard_controls.cc
src/wx/wscript
src/wx/wx_help.cc [new file with mode: 0644]
src/wx/wx_help.h [new file with mode: 0644]

diff --git a/graphics/fonts/BebasNeue-Regular.ttf b/graphics/fonts/BebasNeue-Regular.ttf
new file mode 100644 (file)
index 0000000..83a29bf
Binary files /dev/null and b/graphics/fonts/BebasNeue-Regular.ttf differ
diff --git a/graphics/fonts/IbarraRealNova-Bold.ttf b/graphics/fonts/IbarraRealNova-Bold.ttf
new file mode 100644 (file)
index 0000000..d376543
Binary files /dev/null and b/graphics/fonts/IbarraRealNova-Bold.ttf differ
diff --git a/graphics/fonts/IbarraRealNova-BoldItalic.ttf b/graphics/fonts/IbarraRealNova-BoldItalic.ttf
new file mode 100644 (file)
index 0000000..ba80f21
Binary files /dev/null and b/graphics/fonts/IbarraRealNova-BoldItalic.ttf differ
diff --git a/graphics/fonts/IbarraRealNova-Italic.ttf b/graphics/fonts/IbarraRealNova-Italic.ttf
new file mode 100644 (file)
index 0000000..13b704f
Binary files /dev/null and b/graphics/fonts/IbarraRealNova-Italic.ttf differ
diff --git a/graphics/fonts/IbarraRealNova-Regular.ttf b/graphics/fonts/IbarraRealNova-Regular.ttf
new file mode 100644 (file)
index 0000000..27c067e
Binary files /dev/null and b/graphics/fonts/IbarraRealNova-Regular.ttf differ
diff --git a/graphics/fonts/IbarraRealNova-SemiBold.ttf b/graphics/fonts/IbarraRealNova-SemiBold.ttf
new file mode 100644 (file)
index 0000000..6ca3a78
Binary files /dev/null and b/graphics/fonts/IbarraRealNova-SemiBold.ttf differ
diff --git a/graphics/fonts/IbarraRealNova-SemiBoldItalic.ttf b/graphics/fonts/IbarraRealNova-SemiBoldItalic.ttf
new file mode 100644 (file)
index 0000000..d1f2203
Binary files /dev/null and b/graphics/fonts/IbarraRealNova-SemiBoldItalic.ttf differ
diff --git a/graphics/fonts/OFL.txt b/graphics/fonts/OFL.txt
new file mode 100644 (file)
index 0000000..85efe02
--- /dev/null
@@ -0,0 +1,93 @@
+Copyright 2007 The Ibarra Real Nova Project Authors (https://github.com/googlefonts/ibarrareal)\r
+\r
+This Font Software is licensed under the SIL Open Font License, Version 1.1.\r
+This license is copied below, and is also available with a FAQ at:\r
+http://scripts.sil.org/OFL\r
+\r
+\r
+-----------------------------------------------------------\r
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\r
+-----------------------------------------------------------\r
+\r
+PREAMBLE\r
+The goals of the Open Font License (OFL) are to stimulate worldwide\r
+development of collaborative font projects, to support the font creation\r
+efforts of academic and linguistic communities, and to provide a free and\r
+open framework in which fonts may be shared and improved in partnership\r
+with others.\r
+\r
+The OFL allows the licensed fonts to be used, studied, modified and\r
+redistributed freely as long as they are not sold by themselves. The\r
+fonts, including any derivative works, can be bundled, embedded, \r
+redistributed and/or sold with any software provided that any reserved\r
+names are not used by derivative works. The fonts and derivatives,\r
+however, cannot be released under any other type of license. The\r
+requirement for fonts to remain under this license does not apply\r
+to any document created using the fonts or their derivatives.\r
+\r
+DEFINITIONS\r
+"Font Software" refers to the set of files released by the Copyright\r
+Holder(s) under this license and clearly marked as such. This may\r
+include source files, build scripts and documentation.\r
+\r
+"Reserved Font Name" refers to any names specified as such after the\r
+copyright statement(s).\r
+\r
+"Original Version" refers to the collection of Font Software components as\r
+distributed by the Copyright Holder(s).\r
+\r
+"Modified Version" refers to any derivative made by adding to, deleting,\r
+or substituting -- in part or in whole -- any of the components of the\r
+Original Version, by changing formats or by porting the Font Software to a\r
+new environment.\r
+\r
+"Author" refers to any designer, engineer, programmer, technical\r
+writer or other person who contributed to the Font Software.\r
+\r
+PERMISSION & CONDITIONS\r
+Permission is hereby granted, free of charge, to any person obtaining\r
+a copy of the Font Software, to use, study, copy, merge, embed, modify,\r
+redistribute, and sell modified and unmodified copies of the Font\r
+Software, subject to the following conditions:\r
+\r
+1) Neither the Font Software nor any of its individual components,\r
+in Original or Modified Versions, may be sold by itself.\r
+\r
+2) Original or Modified Versions of the Font Software may be bundled,\r
+redistributed and/or sold with any software, provided that each copy\r
+contains the above copyright notice and this license. These can be\r
+included either as stand-alone text files, human-readable headers or\r
+in the appropriate machine-readable metadata fields within text or\r
+binary files as long as those fields can be easily viewed by the user.\r
+\r
+3) No Modified Version of the Font Software may use the Reserved Font\r
+Name(s) unless explicit written permission is granted by the corresponding\r
+Copyright Holder. This restriction only applies to the primary font name as\r
+presented to the users.\r
+\r
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\r
+Software shall not be used to promote, endorse or advertise any\r
+Modified Version, except to acknowledge the contribution(s) of the\r
+Copyright Holder(s) and the Author(s) or with their explicit written\r
+permission.\r
+\r
+5) The Font Software, modified or unmodified, in part or in whole,\r
+must be distributed entirely under this license, and must not be\r
+distributed under any other license. The requirement for fonts to\r
+remain under this license does not apply to any document created\r
+using the Font Software.\r
+\r
+TERMINATION\r
+This license becomes null and void if any of the above conditions are\r
+not met.\r
+\r
+DISCLAIMER\r
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\r
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\r
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\r
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\r
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\r
+OTHER DEALINGS IN THE FONT SOFTWARE.\r
diff --git a/graphics/help/add_content.png b/graphics/help/add_content.png
new file mode 100644 (file)
index 0000000..ae56c10
Binary files /dev/null and b/graphics/help/add_content.png differ
diff --git a/graphics/help/file_new.png b/graphics/help/file_new.png
new file mode 100644 (file)
index 0000000..1cfa003
Binary files /dev/null and b/graphics/help/file_new.png differ
diff --git a/graphics/help/preview.png b/graphics/help/preview.png
new file mode 100644 (file)
index 0000000..a5e3a75
Binary files /dev/null and b/graphics/help/preview.png differ
diff --git a/graphics/src/help/add_content.svg b/graphics/src/help/add_content.svg
new file mode 100644 (file)
index 0000000..daa63a8
--- /dev/null
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="167.96584mm"
+   height="57.458946mm"
+   viewBox="0 0 167.96582 57.458946"
+   version="1.1"
+   id="svg8"
+   inkscape:version="1.0 (6e3e5246a0, 2020-05-07)"
+   sodipodi:docname="add_content.svg">
+  <defs
+     id="defs2">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path2830"
+         style="fill:#29a2a2;fill-opacity:1;fill-rule:evenodd;stroke:#29a2a2;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path2812"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#29a2a2;fill-opacity:1;fill-rule:evenodd;stroke:#29a2a2;stroke-width:1pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="256.92807"
+     inkscape:cy="137.95738"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     inkscape:document-rotation="0"
+     showgrid="false"
+     inkscape:snap-global="false"
+     fit-margin-top="2"
+     fit-margin-left="2"
+     fit-margin-right="2"
+     fit-margin-bottom="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="986"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-6.0998694,-20.366511)">
+    <rect
+       style="fill:#9ecece;fill-opacity:1;stroke:#000000;stroke-width:0.478665;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
+       id="rect1937-6-7"
+       width="30.287195"
+       height="7.578104"
+       x="103.13097"
+       y="68.008018"
+       rx="1.0482159"
+       ry="0.99857616" />
+    <rect
+       style="fill:#9ecece;fill-opacity:1;stroke:#000000;stroke-width:0.467859;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
+       id="rect1937"
+       width="28.894049"
+       height="7.5889091"
+       x="112.87321"
+       y="53.907749"
+       rx="1"
+       ry="1" />
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:'Bebas Neue';-inkscape-font-specification:'Bebas Neue';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="33.978741"
+       y="29.880653"
+       id="text1919"><tspan
+         sodipodi:role="line"
+         id="tspan1917"
+         x="33.978741"
+         y="29.880653"
+         style="fill:#ff0000;stroke-width:0.264583">GREAT! NOW FOR some content...</tspan></text>
+    <rect
+       ry="0.99615294"
+       rx="1.1330551"
+       y="61.197998"
+       x="131.76047"
+       height="7.5597143"
+       width="32.738548"
+       id="rect1937-6"
+       style="fill:#9ecece;fill-opacity:1;stroke:#000000;stroke-width:0.497055;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" />
+    <text
+       xml:space="preserve"
+       style="font-size:5.64444px;line-height:1.25;font-family:'Ibarra Real Nova';-inkscape-font-specification:'Ibarra Real Nova';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="34.382824"
+       y="38.162991"
+       id="text1923"><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="38.162991"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan3767">It's time to add some content.  This could be a video</tspan><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="45.21854"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan3769">file, some audio, subtitles, another DCP... almost anything!</tspan><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="52.27409"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan3771" /><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="59.329639"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan3773">If it's one file, or just a few, click  Add Files...</tspan><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="66.385193"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan3775">If it's a folder containing lots of files, use  Add Folder...</tspan><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="73.440742"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan3777">It it's an existing DCP, click  Add DCP... </tspan><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="80.496292"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan1929" /></text>
+    <path
+       style="mix-blend-mode:normal;fill:none;stroke:#29a2a2;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 31.852662,36.688559 C 26.19738,34.419474 22.660132,30.239709 10.367561,30.016582"
+       id="path2801"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/graphics/src/help/file_new.svg b/graphics/src/help/file_new.svg
new file mode 100644 (file)
index 0000000..ae86086
--- /dev/null
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="119.16308mm"
+   height="48.256836mm"
+   viewBox="0 0 119.16307 48.256836"
+   version="1.1"
+   id="svg8"
+   inkscape:version="1.0 (6e3e5246a0, 2020-05-07)"
+   sodipodi:docname="file_new.svg">
+  <defs
+     id="defs2">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path2830"
+         style="fill:#29a2a2;fill-opacity:1;fill-rule:evenodd;stroke:#29a2a2;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path2812"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#29a2a2;fill-opacity:1;fill-rule:evenodd;stroke:#29a2a2;stroke-width:1pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8"
+     inkscape:cx="228.73591"
+     inkscape:cy="111.96217"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     inkscape:document-rotation="0"
+     showgrid="false"
+     inkscape:snap-global="false"
+     fit-margin-top="2"
+     fit-margin-left="2"
+     fit-margin-right="2"
+     fit-margin-bottom="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="986"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-8.383023,-11.350459)">
+    <rect
+       ry="0.99708825"
+       rx="1.1596159"
+       y="30.740938"
+       x="106.15783"
+       height="7.7341828"
+       width="13.478274"
+       id="rect1937-3"
+       style="fill:#9ecece;fill-opacity:1;stroke:#000000;stroke-width:0.322586;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" />
+    <rect
+       style="fill:#9ecece;fill-opacity:1;stroke:#000000;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
+       id="rect1937"
+       width="11.62305"
+       height="7.7567682"
+       x="80.685257"
+       y="30.729647"
+       rx="1"
+       ry="1" />
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:'Bebas Neue';-inkscape-font-specification:'Bebas Neue';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="32.135391"
+       y="26.241934"
+       id="text1919"><tspan
+         sodipodi:role="line"
+         id="tspan1917"
+         x="32.135391"
+         y="26.241934"
+         style="fill:#ff0000;stroke-width:0.264583">Welcome to DCP-o-matic!</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:5.64444px;line-height:1.25;font-family:'Ibarra Real Nova';-inkscape-font-specification:'Ibarra Real Nova';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="32.285839"
+       y="36.37291"
+       id="text1923"><tspan
+         sodipodi:role="line"
+         id="tspan1921"
+         x="32.285839"
+         y="36.37291"
+         style="font-size:5.64444px;stroke-width:0.264583">To get started, click  File  then  New </tspan><tspan
+         sodipodi:role="line"
+         x="32.285839"
+         y="43.428459"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan1925">and give your first project a name.</tspan><tspan
+         sodipodi:role="line"
+         x="32.285839"
+         y="50.484009"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan1933">You can also specify where the project's</tspan><tspan
+         sodipodi:role="line"
+         x="32.285839"
+         y="57.539558"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan1935">data will be stored.</tspan><tspan
+         sodipodi:role="line"
+         x="32.285839"
+         y="64.595108"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan1929" /></text>
+    <path
+       style="mix-blend-mode:normal;fill:none;stroke:#29a2a2;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 29.408407,33.731144 C 23.753125,31.462059 18.741758,26.746728 11.716731,15.316581"
+       id="path2801"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/graphics/src/help/preview.svg b/graphics/src/help/preview.svg
new file mode 100644 (file)
index 0000000..ca93883
--- /dev/null
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="136.18156mm"
+   height="29.304541mm"
+   viewBox="0 0 136.18155 29.304542"
+   version="1.1"
+   id="svg8"
+   inkscape:version="1.0 (6e3e5246a0, 2020-05-07)"
+   sodipodi:docname="preview.svg">
+  <defs
+     id="defs2">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path2830"
+         style="fill:#29a2a2;fill-opacity:1;fill-rule:evenodd;stroke:#29a2a2;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path2812"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#29a2a2;fill-opacity:1;fill-rule:evenodd;stroke:#29a2a2;stroke-width:1pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="300.65763"
+     inkscape:cy="228.91194"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     inkscape:document-rotation="0"
+     showgrid="false"
+     inkscape:snap-global="false"
+     fit-margin-top="2"
+     fit-margin-left="2"
+     fit-margin-right="2"
+     fit-margin-bottom="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="986"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-8.8820517,-20.366511)">
+    <rect
+       style="fill:#9ecece;fill-opacity:1;stroke:#000000;stroke-width:0.325442;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
+       id="rect1937"
+       width="13.723092"
+       height="7.7313256"
+       x="33.275249"
+       y="39.777004"
+       rx="1"
+       ry="1" />
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:'Bebas Neue';-inkscape-font-specification:'Bebas Neue';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="33.978741"
+       y="29.880653"
+       id="text1919"><tspan
+         sodipodi:role="line"
+         id="tspan1917"
+         x="33.978741"
+         y="29.880653"
+         style="fill:#ff0000;stroke-width:0.264583">SEE hOW IT LOOKS...</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:5.64444px;line-height:1.25;font-family:'Ibarra Real Nova';-inkscape-font-specification:'Ibarra Real Nova';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="34.382824"
+       y="38.162991"
+       id="text1923"><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="38.162991"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan3771">Now you can preview your content by clicking</tspan><tspan
+         id="tspan3520"
+         sodipodi:role="line"
+         x="34.382824"
+         y="45.21854"
+         style="font-size:5.64444px;stroke-width:0.264583">Play.  Check that it looks and sounds OK!</tspan><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="52.27409"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan3777" /><tspan
+         sodipodi:role="line"
+         x="34.382824"
+         y="59.329639"
+         style="font-size:5.64444px;stroke-width:0.264583"
+         id="tspan1929" /></text>
+    <path
+       style="mix-blend-mode:normal;fill:none;stroke:#29a2a2;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 31.852662,36.688559 C 22.768894,32.701083 24.949513,29.892713 13.039582,25.652605"
+       id="path2801"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
index 72aaa5f26221892882690c7bb68756084e246e0b..4695fcfe0022566f6167ffa6b9261bfb4c76010d 100755 (executable)
@@ -95,4 +95,12 @@ else
     done
     convert web/favicon-16x16.png web/favicon-32x32.png web/favicon-64x64.png web/favicon-128x128.png web/favicon-256x256.png web/favicon.ico
     convert src/web.png -resize 123x123 -transparent white web/logo.png
+
+    # Help
+    mkdir -p help
+    for f in src/help/*.svg; do
+       base=$(basename $f | sed -e "s/.svg//")
+       $INKSCAPE help/$base.png $f
+    done
+
 fi
index bfb518110c8b6eba42994e52c2b5b6c8a8a6ccd0..748fb852a7f714738d241c0ddad3dc1da274d96a 100644 (file)
@@ -215,6 +215,7 @@ function copy_resources {
     cp $prefix/src/dcpomatic/graphics/sequence.png "$dest"
     cp $prefix/src/dcpomatic/graphics/me.jpg "$dest"
     cp $prefix/src/dcpomatic/graphics/link.png "$dest"
+    cp -r $prefix/src/dcpomatic/graphics/help "$dest"
     cp -r $prefix/share/libdcp/xsd "$dest"
 
     # i18n: DCP-o-matic .mo files
index c6d4232d40e62f2c9af48bcb8f8832b7cb87eb6b..f3b720cdbb0a7d2754b199a094dd7525d059ed61 100644 (file)
@@ -318,6 +318,9 @@ File "%graphics%/me.jpg"
 File "%graphics%/tick.png"
 File "%graphics%/no_tick.png"
 File "%graphics%/link.png"
+File "%graphics%/help/add_content.png"
+File "%graphics%/help/file_new.png"
+File "%graphics%/help/preview.png"
 SetOutPath "$INSTDIR\\xsd"
 File "%cdist_deps%/share/libdcp/xsd/SMPTE-429-7-2006-CPL.xsd"
 File "%cdist_deps%/share/libdcp/xsd/SMPTE-429-8-2006-PKL.xsd"
index 1a9e552fe394f73f14480ad0e18eb8e757866775..e7165c9555dbfe98c5cf742cfbd05dfc0454bb6d 100644 (file)
@@ -57,6 +57,7 @@
 #include "check_content_change_job.h"
 #include "ffmpeg_subtitle_stream.h"
 #include "font.h"
+#include "help.h"
 #include <libcxml/cxml.h>
 #include <dcp/cpl.h>
 #include <dcp/certificate_chain.h>
@@ -1270,6 +1271,8 @@ Film::add_content (shared_ptr<Content> c)
        _playlist->add (shared_from_this(), c);
 
        maybe_set_container_and_resolution ();
+
+       Help::instance()->event (Help::SUCCESSFUL_ADD_CONTENT);
 }
 
 
diff --git a/src/lib/help.cc b/src/lib/help.cc
new file mode 100644 (file)
index 0000000..a718568
--- /dev/null
@@ -0,0 +1,25 @@
+#include "help.h"
+#include <boost/bind.hpp>
+#include <boost/ref.hpp>
+
+
+Help* Help::_instance = 0;
+
+
+Help*
+Help::instance ()
+{
+       if (!_instance) {
+               _instance = new Help ();
+       }
+
+       return _instance;
+}
+
+
+void
+Help::event (EventType e)
+{
+       emit (boost::bind(boost::ref(Event), e));
+}
+
diff --git a/src/lib/help.h b/src/lib/help.h
new file mode 100644 (file)
index 0000000..ac36124
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef DCPOMATIC_HELP_H
+#define DCPOMATIC_HELP_H
+
+#include "signaller.h"
+#include <boost/signals2.hpp>
+
+class Help : public Signaller
+{
+public:
+       static Help* instance ();
+
+       enum EventType {
+               SUCCESSFUL_FILE_NEW,
+               SUCCESSFUL_ADD_CONTENT,
+       };
+
+       void event (EventType e);
+
+       boost::signals2::signal<void (EventType)> Event;
+
+private:
+       static Help* _instance;
+};
+
+#endif
+
index c2dfb55d87d32880dabaf5f1a8e36b66e923d88a..fae4ab035aa154ec94b30b467db82309881d00e4 100644 (file)
@@ -114,6 +114,7 @@ sources = """
           font.cc
           frame_interval_checker.cc
           frame_rate_change.cc
+          help.cc
           hints.cc
           internet.cc
           image.cc
index 9cd99a265f553b9e51f39a600e20dbe340a0a9a7..440151429876a245c11224f0af668d2c54d51c17 100644 (file)
@@ -52,6 +52,8 @@
 #include "wx/initial_setup_dialog.h"
 #include "wx/send_i18n_dialog.h"
 #include "wx/i18n_hook.h"
+#include "wx/static_text.h"
+#include "wx/wx_help.h"
 #include "lib/film.h"
 #include "lib/analytics.h"
 #include "lib/emailer.h"
@@ -66,6 +68,7 @@
 #include "lib/job_manager.h"
 #include "lib/exceptions.h"
 #include "lib/cinema.h"
+#include "lib/help.h"
 #include "lib/kdm_with_metadata.h"
 #include "lib/send_kdm_email_job.h"
 #include "lib/encode_server_finder.h"
@@ -542,6 +545,7 @@ private:
                                error_dialog (this, _("Could not create folder to store film."), std_to_wx(e.what()));
 #endif
                        }
+                       Help::instance()->event (Help::SUCCESSFUL_FILE_NEW);
                }
 
                d->Destroy ();
@@ -1631,6 +1635,8 @@ private:
                        if (Config::instance()->check_for_updates ()) {
                                UpdateChecker::instance()->run ();
                        }
+
+                       signal_manager->when_idle (boost::bind(&HelpGUI::start, HelpGUI::instance()));
                }
                catch (exception& e)
                {
index 7d854224d232a0b939758cd4094e3951d0604a65..681761f19b63b8d89121ed2c58157b90adca0480 100644 (file)
@@ -28,6 +28,7 @@
 #include "image_sequence_dialog.h"
 #include "film_viewer.h"
 #include "dcpomatic_button.h"
+#include "wx_help.h"
 #include "lib/audio_content.h"
 #include "lib/text_content.h"
 #include "lib/video_content.h"
@@ -128,6 +129,7 @@ ContentPanel::ContentPanel (wxNotebook* n, shared_ptr<Film> film, weak_ptr<FilmV
                _add_folder = new Button (top, _("Add folder..."));
                _add_folder->SetToolTip (_("Add a folder of image files (which will be used as a moving image sequence) or a folder of sound files."));
                b->Add (_add_folder, 1, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP);
+               HelpGUI::instance()->landmark (_add_folder, HelpGUI::ADD_FOLDER_BUTTON);
 
                _add_dcp = new Button (top, _("Add DCP..."));
                _add_dcp->SetToolTip (_("Add a DCP."));
index ae0868f27f55f01bf2543e6307efda9639ace184..5de677c21f5ac07f9c2fc75adeef5c51e3064f4b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
index 5df89f8fecd05093738c089239c4ab03dc971c52..11426ff591f7bb97d1acb2f9326f7eee7550fca8 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2018-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -18,8 +18,9 @@
 
 */
 
-#include "standard_controls.h"
 #include "film_viewer.h"
+#include "standard_controls.h"
+#include "wx_help.h"
 #include <wx/wx.h>
 #include <wx/tglbtn.h>
 
@@ -31,6 +32,7 @@ StandardControls::StandardControls (wxWindow* parent, shared_ptr<FilmViewer> vie
 {
        _button_sizer->Add (_play_button, 0, wxEXPAND);
        _play_button->Bind (wxEVT_TOGGLEBUTTON, boost::bind(&StandardControls::play_clicked, this));
+       HelpGUI::instance()->landmark (_play_button, HelpGUI::PLAY_BUTTON);
 }
 
 void
index 7acbcc56f89073302735a3a804028e880cacd9cc..ad1c49806e490847da539323e1fe57767774a9e2 100644 (file)
@@ -111,8 +111,8 @@ sources = """
           playlist_controls.cc
           playlist_editor_config_dialog.cc
           question_dialog.cc
-          rating_dialog.cc
           qube_certificate_panel.cc
+          rating_dialog.cc
           recipients_panel.cc
           recipient_dialog.cc
           recreate_chain_dialog.cc
@@ -160,8 +160,9 @@ sources = """
           video_view.cc
           video_waveform_dialog.cc
           video_waveform_plot.cc
-          wx_util.cc
+          wx_help.cc
           wx_signal_manager.cc
+          wx_util.cc
           """
 
 def configure(conf):
diff --git a/src/wx/wx_help.cc b/src/wx/wx_help.cc
new file mode 100644 (file)
index 0000000..529977c
--- /dev/null
@@ -0,0 +1,111 @@
+#include "wx_help.h"
+#include "wx_util.h"
+#include <iostream>
+
+HelpGUI* HelpGUI::_instance = 0;
+
+
+HelpGUI::HelpGUI ()
+       : _current_index (-1)
+       , _current_frame (0)
+{
+       _messages.push_back (Message("file_new", wxPoint(50, 100), Help::SUCCESSFUL_FILE_NEW));
+       _messages.push_back (Message("add_content", ADD_FOLDER_BUTTON, wxSize(24, -48), Help::SUCCESSFUL_ADD_CONTENT));
+       _messages.push_back (Message("preview", PLAY_BUTTON, wxSize(24, 0)));
+
+       Help::instance()->Event.connect (boost::bind(&HelpGUI::event, this, _1));
+}
+
+
+void
+HelpGUI::event (Help::EventType e)
+{
+       if (
+               _current_index >= 0 &&
+               _current_index < int(_messages.size() - 1) &&
+               _messages[_current_index].next_trigger &&
+               *_messages[_current_index].next_trigger == e) {
+               next ();
+       }
+}
+
+
+void
+HelpGUI::landmark (wxWindow* landmark, Landmark id)
+{
+       _landmarks[id] = landmark;
+}
+
+
+void
+HelpGUI::next ()
+{
+       ++_current_index;
+       show (_current_index);
+}
+
+
+void
+HelpGUI::start ()
+{
+       next ();
+}
+
+
+void
+HelpGUI::show (int index)
+{
+       if (_current_frame) {
+               _current_frame->Destroy ();
+               _current_frame = 0;
+       }
+
+       Message const& m = _messages[index];
+       wxBitmap bitmap (bitmap_path("help/" + m.id));
+       wxPoint pos;
+       if (m.anchor_point) {
+               pos = *m.anchor_point;
+       } else if (m.anchor_landmark) {
+               DCPOMATIC_ASSERT (_landmarks.find(*m.anchor_landmark) != _landmarks.end());
+               wxWindow* lm = _landmarks[*m.anchor_landmark];
+               pos = lm->GetScreenPosition();
+               pos.x += lm->GetSize().GetWidth();
+       }
+       pos += m.offset;
+       _current_frame = new wxFrame (0, wxID_ANY, wxT(""), pos, wxSize(bitmap.GetSize().GetWidth() + 16, bitmap.GetSize().GetHeight() + 128), wxFRAME_TOOL_WINDOW);
+       wxSizer* sizer = new wxBoxSizer (wxVERTICAL);
+       wxStaticBitmap* static_bitmap = new wxStaticBitmap (_current_frame, wxID_ANY, bitmap);
+       sizer->Add (static_bitmap, 1, wxEXPAND);
+       wxSizer* buttons_sizer = new wxBoxSizer (wxHORIZONTAL);
+       wxButton* close = new wxButton (_current_frame, wxID_ANY, _("Stop showing tips"));
+       close->Bind (wxEVT_BUTTON, boost::bind(&HelpGUI::stop, this));
+       buttons_sizer->Add (close, 1, wxEXPAND | wxALL, 8);
+       sizer->Add (buttons_sizer, 0, wxALIGN_RIGHT);
+       _current_frame->SetSizer (sizer);
+       _current_frame->Show ();
+}
+
+
+void
+HelpGUI::stop ()
+{
+       _current_index = -1;
+       if (_current_frame) {
+               _current_frame->Destroy ();
+       }
+
+       /* XXX: should write a config entry */
+}
+
+
+HelpGUI *
+HelpGUI::instance ()
+{
+       if (!_instance) {
+               _instance = new HelpGUI ();
+       }
+
+       return _instance;
+}
+
+
diff --git a/src/wx/wx_help.h b/src/wx/wx_help.h
new file mode 100644 (file)
index 0000000..0d56634
--- /dev/null
@@ -0,0 +1,66 @@
+#include "lib/help.h"
+#include <wx/wx.h>
+#include <boost/optional.hpp>
+#include <map>
+#include <string>
+#include <vector>
+
+class HelpGUI
+{
+public:
+       static HelpGUI* instance ();
+
+       void start ();
+
+       enum Landmark {
+               ADD_FOLDER_BUTTON,
+               PLAY_BUTTON
+       };
+
+       void landmark (wxWindow* landmark, Landmark id);
+
+private:
+       class Message
+       {
+       public:
+               Message (std::string id_, wxPoint anchor_, Help::EventType next_trigger_)
+                       : id (id_)
+                       , anchor_point (anchor_)
+                       , next_trigger (next_trigger_)
+               {}
+
+               Message (std::string id_, Landmark anchor_, wxSize offset_)
+                       : id (id_)
+                       , anchor_landmark (anchor_)
+                       , offset (offset_)
+               {}
+
+               Message (std::string id_, Landmark anchor_, wxSize offset_, Help::EventType next_trigger_)
+                       : id (id_)
+                       , anchor_landmark (anchor_)
+                       , offset (offset_)
+                       , next_trigger (next_trigger_)
+               {}
+
+               std::string id;
+               boost::optional<wxPoint> anchor_point;
+               boost::optional<Landmark> anchor_landmark;
+               wxSize offset;
+               boost::optional<Help::EventType> next_trigger;
+       };
+
+       HelpGUI ();
+       void event (Help::EventType e);
+       void show (int index);
+       void next ();
+       void stop ();
+
+       static HelpGUI* _instance;
+
+       int _current_index;
+       wxFrame* _current_frame;
+       std::vector<Message> _messages;
+       std::map<Landmark, wxWindow*> _landmarks;
+};
+
+