Make sure translators give email addresses.
[dcpomatic.git] / src / tools / dcpomatic.cc
index 24c5bd5ecae4624758f36f40b1c66fa687c09ce0..a273d008b11948e56aeaba42d784c59bbf08a42e 100644 (file)
@@ -58,6 +58,7 @@
 #include "lib/analytics.h"
 #include "lib/emailer.h"
 #include "lib/config.h"
+#include "lib/cross.h"
 #include "lib/util.h"
 #include "lib/video_content.h"
 #include "lib/content.h"
@@ -127,8 +128,6 @@ using std::shared_ptr;
 using std::string;
 using std::vector;
 using std::wcout;
-using std::wstring;
-using std::wstringstream;
 using boost::optional;
 using boost::is_any_of;
 using boost::algorithm::find;
@@ -388,12 +387,18 @@ public:
 #else
                int accelerators = 6;
 #endif
-               wxAcceleratorEntry* accel = new wxAcceleratorEntry[accelerators];
+               auto accel = new wxAcceleratorEntry[accelerators];
+               /* [Shortcut] Ctrl+A:Add file(s) to the film */
                accel[0].Set (wxACCEL_CTRL, static_cast<int>('A'), ID_add_file);
+               /* [Shortcut] Delete:Remove selected content from film */
                accel[1].Set (wxACCEL_NORMAL, WXK_DELETE, ID_remove);
+               /* [Shortcut] Space:Start/stop playback */
                accel[2].Set (wxACCEL_NORMAL, WXK_SPACE, ID_start_stop);
+               /* [Shortcut] Ctrl+T:Open timeline window */
                accel[3].Set (wxACCEL_CTRL, static_cast<int>('T'), ID_timeline);
+               /* [Shortcut] Left arrow:Move back one frame */
                accel[4].Set (wxACCEL_NORMAL, WXK_LEFT, ID_back_frame);
+               /* [Shortcut] Right arrow:Move forward one frame */
                accel[5].Set (wxACCEL_NORMAL, WXK_RIGHT, ID_forward_frame);
 #ifdef __WXOSX__
                accel[6].Set (wxACCEL_CTRL, static_cast<int>('W'), ID_file_close);
@@ -794,7 +799,7 @@ private:
                           a long time, and crashes/power failures are moderately likely.
                        */
                        _film->write_metadata ();
-                       _film->make_dcp (true);
+                       _film->make_dcp (TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
                } catch (BadSettingError& e) {
                        error_dialog (this, wxString::Format (_("Bad setting for %s."), std_to_wx(e.setting()).data()), std_to_wx(e.what()));
                } catch (std::exception& e) {
@@ -928,7 +933,7 @@ private:
                                _("You are making a DKDM which is encrypted by a private key held in"
                                  "\n\n<tt>%s</tt>\n\nIt is <span weight=\"bold\" size=\"larger\">VITALLY IMPORTANT</span> "
                                  "that you <span weight=\"bold\" size=\"larger\">BACK UP THIS FILE</span> since if it is lost "
-                                 "your DKDMs (and the DCPs they protect) will become useless."), std_to_wx(Config::config_file().string()).data()
+                                 "your DKDMs (and the DCPs they protect) will become useless."), std_to_wx(Config::config_read_file().string()).data()
                                )
                        );
 
@@ -988,7 +993,7 @@ private:
                                }
                        }
 
-                       auto job = make_shared<TranscodeJob>(_film);
+                       auto job = make_shared<TranscodeJob>(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
                        job->set_encoder (
                                make_shared<FFmpegEncoder> (
                                        _film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->split_streams(), d->x264_crf())
@@ -1003,7 +1008,7 @@ private:
        {
                auto d = new ExportSubtitlesDialog (this, _film->reels().size(), _film->interop());
                if (d->ShowModal() == wxID_OK) {
-                       auto job = make_shared<TranscodeJob>(_film);
+                       auto job = make_shared<TranscodeJob>(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
                        job->set_encoder (
                                make_shared<SubtitleEncoder>(_film, job, d->path(), _film->isdcf_name(true), d->split_reels(), d->include_font())
                                );
@@ -1021,36 +1026,9 @@ private:
        void jobs_show_dcp ()
        {
                DCPOMATIC_ASSERT (_film->directory ());
-#ifdef DCPOMATIC_WINDOWS
-               wstringstream args;
-               args << "/select," << _film->dir (_film->dcp_name(false));
-               ShellExecute (0, L"open", L"explorer.exe", args.str().c_str(), 0, SW_SHOWDEFAULT);
-#endif
-
-#ifdef DCPOMATIC_LINUX
-               int r = system ("which nautilus");
-               if (WEXITSTATUS (r) == 0) {
-                       r = system (String::compose("nautilus \"%1\"", _film->directory()->string()).c_str());
-                       if (WEXITSTATUS (r)) {
-                               error_dialog (this, _("Could not show DCP."), _("Could not run nautilus"));
-                       }
-               } else {
-                       int r = system ("which konqueror");
-                       if (WEXITSTATUS (r) == 0) {
-                               r = system (String::compose ("konqueror \"%1\"", _film->directory()->string()).c_str());
-                               if (WEXITSTATUS (r)) {
-                                       error_dialog (this, _("Could not show DCP"), _("Could not run konqueror"));
-                               }
-                       }
+               if (show_in_file_manager(_film->directory().get(), _film->dir(_film->dcp_name(false)))) {
+                       error_dialog (this, _("Could not show DCP."));
                }
-#endif
-
-#ifdef DCPOMATIC_OSX
-               int r = system (String::compose ("open -R \"%1\"", _film->dir (_film->dcp_name(false)).string()).c_str());
-               if (WEXITSTATUS (r)) {
-                       error_dialog (this, _("Could not show DCP"));
-               }
-#endif
        }
 
        void view_closed_captions ()
@@ -1123,8 +1101,17 @@ private:
                                body += i.first + "\n" + i.second + "\n\n";
                        }
                        list<string> to = { "carl@dcpomatic.com" };
-                       Emailer emailer (d->email(), to, "DCP-o-matic translations", body);
-                       emailer.send ("main.carlh.net", 2525, EmailProtocol::STARTTLS);
+                       if (d->email().find("@") == string::npos) {
+                               error_dialog (this, _("You must enter a valid email address when sending translations, "
+                                                     "otherwise the DCP-o-matic maintainers cannot credit you or contact you with questions."));
+                       } else {
+                               Emailer emailer (d->email(), to, "DCP-o-matic translations", body);
+                               try {
+                                       emailer.send ("main.carlh.net", 2525, EmailProtocol::STARTTLS);
+                               } catch (NetworkError& e) {
+                                       error_dialog (this, _("Could not send translations"), std_to_wx(e.what()));
+                               }
+                       }
                }
 
                d->Destroy ();
@@ -1302,9 +1289,12 @@ private:
        void setup_menu (wxMenuBar* m)
        {
                _file_menu = new wxMenu;
+               /* [Shortcut] Ctrl+N:New film */
                add_item (_file_menu, _("New...\tCtrl-N"), ID_file_new, ALWAYS);
+               /* [Shortcut] Ctrl+O:Open existing film */
                add_item (_file_menu, _("&Open...\tCtrl-O"), ID_file_open, ALWAYS);
                _file_menu->AppendSeparator ();
+               /* [Shortcut] Ctrl+S:Save current film */
                add_item (_file_menu, _("&Save\tCtrl-S"), ID_file_save, NEEDS_FILM);
                _file_menu->AppendSeparator ();
                add_item (_file_menu, _("Save as &template..."), ID_file_save_as_template, NEEDS_FILM);
@@ -1314,6 +1304,7 @@ private:
                _history_position = _file_menu->GetMenuItems().GetCount();
 
                _file_menu->AppendSeparator ();
+               /* [Shortcut] Ctrl+W:Close current film */
                add_item (_file_menu, _("&Close\tCtrl-W"), ID_file_close, NEEDS_FILM);
 
 #ifndef __WXOSX__
@@ -1327,26 +1318,35 @@ private:
 #endif
 
                auto edit = new wxMenu;
+               /* [Shortcut] Ctrl+C:Copy settings from currently selected content */
                add_item (edit, _("Copy settings\tCtrl-C"), ID_edit_copy, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_SINGLE_SELECTED_CONTENT);
+               /* [Shortcut] Ctrl+V:Paste settings into currently selected content */
                add_item (edit, _("Paste settings...\tCtrl-V"), ID_edit_paste, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_SELECTED_CONTENT | NEEDS_CLIPBOARD);
                edit->AppendSeparator ();
+               /* [Shortcut] Shift+Ctrl+A:Select all content */
                add_item (edit, _("Select all\tShift-Ctrl-A"), ID_edit_select_all, NEEDS_FILM);
 
 #ifdef __WXOSX__
                add_item (_file_menu, _("&Preferences...\tCtrl-P"), wxID_PREFERENCES, ALWAYS);
 #else
                edit->AppendSeparator ();
+               /* [Shortcut] Ctrl+P:Open preferences window */
                add_item (edit, _("&Preferences...\tCtrl-P"), wxID_PREFERENCES, ALWAYS);
 #endif
 
                auto jobs_menu = new wxMenu;
+               /* [Shortcut] Ctrl+M:Make DCP */
                add_item (jobs_menu, _("&Make DCP\tCtrl-M"), ID_jobs_make_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION);
+               /* [Shortcut] Ctrl+B:Make DCP in the batch converter*/
                add_item (jobs_menu, _("Make DCP in &batch converter\tCtrl-B"), ID_jobs_make_dcp_batch, NEEDS_FILM | NOT_DURING_DCP_CREATION);
                jobs_menu->AppendSeparator ();
+               /* [Shortcut] Ctrl+K:Make KDMs */
                add_item (jobs_menu, _("Make &KDMs...\tCtrl-K"), ID_jobs_make_kdms, NEEDS_FILM);
+               /* [Shortcut] Ctrl+D:Make DKDMs */
                add_item (jobs_menu, _("Make &DKDMs...\tCtrl-D"), ID_jobs_make_dkdms, NEEDS_FILM);
                add_item (jobs_menu, _("Make DKDM for DCP-o-matic..."), ID_jobs_make_self_dkdm, NEEDS_FILM | NEEDS_ENCRYPTION);
                jobs_menu->AppendSeparator ();
+               /* [Shortcut] Ctrl+E:Export video file */
                add_item (jobs_menu, _("Export video file...\tCtrl-E"), ID_jobs_export_video_file, NEEDS_FILM);
                add_item (jobs_menu, _("Export subtitles..."), ID_jobs_export_subtitles, NEEDS_FILM);
                jobs_menu->AppendSeparator ();