From ce835adf99ec81ea182ac151f6e0d1cc3376d175 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 20 Nov 2013 16:30:54 +0000 Subject: [PATCH] Add primitive hints dialogue box. --- ChangeLog | 4 ++ src/tools/dcpomatic.cc | 14 ++++++ src/wx/hints_dialog.cc | 99 ++++++++++++++++++++++++++++++++++++++++++ src/wx/hints_dialog.h | 36 +++++++++++++++ src/wx/wscript | 5 ++- 5 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 src/wx/hints_dialog.cc create mode 100644 src/wx/hints_dialog.h diff --git a/ChangeLog b/ChangeLog index fbc23ffee..e6882ece8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-11-20 Carl Hetherington + + * Add primitive hints dialogue box. + 2013-11-17 Carl Hetherington * Fix specified-server discovery. diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 1fea4fb1a..1d01e4da8 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -41,6 +41,7 @@ #include "wx/about_dialog.h" #include "wx/kdm_dialog.h" #include "wx/servers_list_dialog.h" +#include "wx/hints_dialog.h" #include "lib/film.h" #include "lib/config.h" #include "lib/util.h" @@ -181,6 +182,7 @@ enum { ID_jobs_make_kdms, ID_jobs_send_dcp_to_tms, ID_jobs_show_dcp, + ID_tools_hints, ID_tools_encoding_servers, }; @@ -219,6 +221,7 @@ setup_menu (wxMenuBar* m) add_item (jobs_menu, _("S&how DCP"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_DCP); wxMenu* tools = new wxMenu; + add_item (tools, _("Hints..."), ID_tools_hints, 0); add_item (tools, _("Encoding Servers..."), ID_tools_encoding_servers, 0); wxMenu* help = new wxMenu; @@ -258,6 +261,7 @@ public: Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::jobs_make_kdms, this), ID_jobs_make_kdms); Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::jobs_send_dcp_to_tms, this), ID_jobs_send_dcp_to_tms); Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::jobs_show_dcp, this), ID_jobs_show_dcp); + Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::tools_hints, this), ID_tools_hints); Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::tools_encoding_servers, this), ID_tools_encoding_servers); Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::help_about, this), wxID_ABOUT); @@ -479,6 +483,15 @@ private: #endif } + void tools_hints () + { + if (!_hints_dialog) { + _hints_dialog = new HintsDialog (this, film); + } + + _hints_dialog->Show (); + } + void tools_encoding_servers () { if (!_servers_list_dialog) { @@ -523,6 +536,7 @@ private: ev.Skip (); } + HintsDialog* _hints_dialog; ServersListDialog* _servers_list_dialog; }; diff --git a/src/wx/hints_dialog.cc b/src/wx/hints_dialog.cc new file mode 100644 index 000000000..df22500d2 --- /dev/null +++ b/src/wx/hints_dialog.cc @@ -0,0 +1,99 @@ +/* + Copyright (C) 2012-2013 Carl Hetherington + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include +#include "lib/film.h" +#include "hints_dialog.h" + +HintsDialog::HintsDialog (wxWindow* parent, boost::weak_ptr f) + : wxDialog (parent, wxID_ANY, _("Hints")) + , _film (f) +{ + wxBoxSizer* sizer = new wxBoxSizer (wxVERTICAL); + _text = new wxRichTextCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (400, 300), wxRE_READONLY); + sizer->Add (_text, 1, wxEXPAND | wxALL, 6); + + wxSizer* buttons = CreateSeparatedButtonSizer (wxOK); + if (buttons) { + sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder()); + } + + SetSizer (sizer); + sizer->Layout (); + sizer->SetSizeHints (this); + + _text->GetCaret()->Hide (); + + boost::shared_ptr film = _film.lock (); + if (film) { + film->Changed.connect (boost::bind (&HintsDialog::film_changed, this)); + } + + film_changed (); +} + +void +HintsDialog::film_changed () +{ + _text->Clear (); + bool hint = false; + + boost::shared_ptr film = _film.lock (); + if (!film) { + return; + } + + _text->BeginStandardBullet (N_("standard/circle"), 1, 50); + if (film->audio_channels() % 2) { + hint = true; + _text->WriteText (_("Your DCP has an odd number of audio channels. This is very likely to cause problems on playback.")); + _text->Newline (); + } else if (film->audio_channels() < 6) { + hint = true; + _text->WriteText (_("Your DCP has fewer than 6 audio channels. This may cause problems on some projectors.")); + _text->Newline (); + } + + if (film->video_frame_rate() != 24 && film->video_frame_rate() != 48) { + hint = true; + _text->WriteText (wxString::Format (_("Your DCP frame rate (%d fps) may cause problems in a few (mostly older) projectors. Use 24 or 48 frames per second to be on the safe side."), film->video_frame_rate())); + _text->Newline (); + } + + ContentList content = film->content (); + int vob = 0; + for (ContentList::const_iterator i = content.begin(); i != content.end(); ++i) { + if (boost::algorithm::starts_with ((*i)->path().filename().string(), "VTS_")) { + ++vob; + } + } + + if (vob > 1) { + hint = true; + _text->WriteText (wxString::Format (_("You have %d files that look like they are VOB files from DVD. You should coalesce them to ensure smooth joins between the files."), vob)); + _text->Newline (); + } + + _text->EndSymbolBullet (); + + if (!hint) { + _text->WriteText (_("There are no hints: everything looks good!")); + } +} diff --git a/src/wx/hints_dialog.h b/src/wx/hints_dialog.h new file mode 100644 index 000000000..810791453 --- /dev/null +++ b/src/wx/hints_dialog.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2012-2013 Carl Hetherington + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include + +class wxRichTextCtrl; +class Film; + +class HintsDialog : public wxDialog +{ +public: + HintsDialog (wxWindow* parent, boost::weak_ptr); + +private: + void film_changed (); + + boost::weak_ptr _film; + wxRichTextCtrl* _text; +}; diff --git a/src/wx/wscript b/src/wx/wscript index c86188c6a..64b82d534 100644 --- a/src/wx/wscript +++ b/src/wx/wscript @@ -22,6 +22,7 @@ sources = """ filter_dialog.cc filter_editor.cc gain_calculator_dialog.cc + hints_dialog.cc job_manager_view.cc job_wrapper.cc kdm_dialog.cc @@ -45,7 +46,7 @@ sources = """ def configure(conf): args = '--cppflags --cxxflags' if not conf.env.STATIC: - args += ' --libs' + args += ' --libs std,richtext' conf.check_cfg(msg='Checking for wxWidgets', package='', path=conf.options.wx_config, args=args, uselib_store='WXWIDGETS', mandatory=True) @@ -53,7 +54,7 @@ def configure(conf): if conf.env.STATIC: # wx-config returns its static libraries as full paths, without -l prefixes, which confuses # check_cfg(), so just hard-code it all. - conf.env.STLIB_WXWIDGETS = ['wx_gtk2u_xrc-2.9', 'wx_gtk2u_qa-2.9', 'wx_baseu_net-2.9', 'wx_gtk2u_html-2.9', + conf.env.STLIB_WXWIDGETS = ['wx_gtk2u_richtext-2.9', 'wx_gtk2u_xrc-2.9', 'wx_gtk2u_qa-2.9', 'wx_baseu_net-2.9', 'wx_gtk2u_html-2.9', 'wx_gtk2u_adv-2.9', 'wx_gtk2u_core-2.9', 'wx_baseu_xml-2.9', 'wx_baseu-2.9'] conf.env.LIB_WXWIDGETS = ['tiff', 'SM', 'dl', 'jpeg', 'png', 'X11'] -- 2.30.2