#include "wx/content_panel.h"
#include "wx/report_problem_dialog.h"
#include "wx/video_waveform_dialog.h"
+#include "wx/system_information_dialog.h"
#include "wx/save_template_dialog.h"
#include "wx/templates_dialog.h"
#include "wx/nag_dialog.h"
#include "lib/check_content_change_job.h"
#include "lib/text_content.h"
#include "lib/dcpomatic_log.h"
+#include "lib/subtitle_encoder.h"
#include <dcp/exceptions.h>
#include <dcp/raw_convert.h>
#include <wx/generic/aboutdlgg.h>
#include <wx/preferences.h>
#include <wx/splash.h>
#include <wx/wxhtml.h>
+#ifdef __WXGTK__
+#include <X11/Xlib.h>
+#endif
#ifdef __WXMSW__
#include <shellapi.h>
#endif
ID_tools_manage_templates,
ID_tools_check_for_updates,
ID_tools_send_translations,
+ ID_tools_system_information,
ID_tools_restore_default_preferences,
ID_help_report_a_problem,
/* IDs for shortcuts (with no associated menu item) */
explicit DOMFrame (wxString const & title)
: wxFrame (NULL, -1, title)
, _video_waveform_dialog (0)
+ , _system_information_dialog (0)
, _hints_dialog (0)
, _servers_list_dialog (0)
, _config_dialog (0)
Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_manage_templates, this), ID_tools_manage_templates);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_send_translations, this), ID_tools_send_translations);
+ Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_system_information, this),ID_tools_system_information);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_about, this), wxID_ABOUT);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem);
JobManager::instance()->add(shared_ptr<Job>(new CheckContentChangeJob(film)));
}
- catch (std::exception& e) {
- wxString p = std_to_wx (file.string ());
- wxCharBuffer b = p.ToUTF8 ();
- error_dialog (this, wxString::Format (_("Could not open film at %s"), p.data()), std_to_wx (e.what()));
+ catch (FileNotFoundError& e) {
+ boost::filesystem::path const dir = e.file().parent_path();
+ if (boost::filesystem::exists(dir / "ASSETMAP") || boost::filesystem::exists(dir / "ASSETMAP.xml")) {
+ error_dialog (
+ this, _("Could not open this folder as a DCP-o-matic project."),
+ _("It looks like you are trying to open a DCP. File -> Open is for loading DCP-o-matic projects, not DCPs. To import a DCP, create a new project with File -> New and then click the \"Add DCP...\" button.")
+ );
+ } else {
+ wxString const p = std_to_wx(file.string ());
+ error_dialog (this, wxString::Format(_("Could not open film at %s"), p.data()), std_to_wx(e.what()));
+ }
+
+ } catch (std::exception& e) {
+ wxString const p = std_to_wx (file.string());
+ error_dialog (this, wxString::Format(_("Could not open film at %s"), p.data()), std_to_wx(e.what()));
}
void set_film (shared_ptr<Film> film)
} catch (boost::filesystem::filesystem_error& e) {
#ifdef DCPOMATIC_WINDOWS
string bad_chars = "<>:\"/|?*";
- string const filename = d->path().string();
+ string const filename = d->path().filename().string();
string found_bad_chars;
for (size_t i = 0; i < bad_chars.length(); ++i) {
if (filename.find(bad_chars[i]) != string::npos && found_bad_chars.find(bad_chars[i]) == string::npos) {
}
}
wxString message = _("Could not create folder to store film.");
+ message += " ";
if (!found_bad_chars.empty()) {
- message += " ";
message += wxString::Format (_("Try removing the %s characters from your folder name."), std_to_wx(found_bad_chars).data());
+ } else {
+ message += _("Please check that you do not have Windows controlled folder access enabled for DCP-o-matic.");
}
error_dialog (this, message, std_to_wx(e.what()));
#else
a long time, and crashes/power failures are moderately likely.
*/
_film->write_metadata ();
- _film->make_dcp ();
+ _film->make_dcp (true);
} 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) {
start (wx_to_std (wxStandardPaths::Get().GetExecutablePath()));
}
- dcpomatic_sleep (1);
+ dcpomatic_sleep_seconds (1);
}
return true;
)
);
+
+ dcp::LocalTime from (Config::instance()->signer_chain()->leaf().not_before());
+ from.add_minutes (1);
+ dcp::LocalTime to (Config::instance()->signer_chain()->leaf().not_after());
+ to.add_minutes (-1);
+
optional<dcp::EncryptedKDM> kdm;
try {
kdm = _film->make_kdm (
Config::instance()->decryption_chain()->leaf(),
vector<string>(),
d->cpl (),
- dcp::LocalTime ("2012-01-01T01:00:00+00:00"),
- dcp::LocalTime ("2112-01-01T01:00:00+00:00"),
+ from, to,
dcp::MODIFIED_TRANSITIONAL_1,
true,
0
void jobs_export ()
{
- ExportDialog* d = new ExportDialog (this);
+ ExportDialog* d = new ExportDialog (this, _film->isdcf_name(true));
if (d->ShowModal() == wxID_OK) {
+ if (boost::filesystem::exists(d->path())) {
+ bool ok = confirm_dialog(
+ this,
+ wxString::Format (_("File %s already exists. Do you want to overwrite it?"), std_to_wx(d->path().string()).data())
+ );
+
+ if (!ok) {
+ d->Destroy ();
+ return;
+ }
+ }
+
shared_ptr<TranscodeJob> job (new TranscodeJob (_film));
- job->set_encoder (
- shared_ptr<FFmpegEncoder> (
- new FFmpegEncoder (_film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->x264_crf())
- )
- );
+ if (d->format() == EXPORT_FORMAT_SUBTITLES_DCP) {
+ job->set_encoder (
+ shared_ptr<SubtitleEncoder>(new SubtitleEncoder(_film, job, d->path(), d->split_reels()))
+ );
+ } else {
+ job->set_encoder (
+ shared_ptr<FFmpegEncoder> (
+ new FFmpegEncoder (_film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->x264_crf()
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+ , optional<dcp::Key>(), optional<string>()
+#endif
+ )
+ )
+ );
+ }
JobManager::instance()->add (job);
}
d->Destroy ();
_video_waveform_dialog->Show ();
}
+ void tools_system_information ()
+ {
+ if (!_system_information_dialog) {
+ _system_information_dialog = new SystemInformationDialog (this, _film_viewer);
+ }
+
+ _system_information_dialog->Show ();
+ }
+
void tools_hints ()
{
if (!_hints_dialog) {
add_item (tools, _("Manage templates..."), ID_tools_manage_templates, 0);
add_item (tools, _("Check for updates"), ID_tools_check_for_updates, 0);
add_item (tools, _("Send translations..."), ID_tools_send_translations, 0);
+ add_item (tools, _("System information..."), ID_tools_system_information, 0);
tools->AppendSeparator ();
add_item (tools, _("Restore default preferences"), ID_tools_restore_default_preferences, ALWAYS);
boost::shared_ptr<FilmViewer> _film_viewer;
StandardControls* _controls;
VideoWaveformDialog* _video_waveform_dialog;
+ SystemInformationDialog* _system_information_dialog;
HintsDialog* _hints_dialog;
ServersListDialog* _servers_list_dialog;
wxPreferencesEditor* _config_dialog;
{ wxCMD_LINE_SWITCH, "n", "new", "create new film", wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL },
{ wxCMD_LINE_OPTION, "c", "content", "add content file / directory", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
{ wxCMD_LINE_OPTION, "d", "dcp", "add content DCP", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
+ { wxCMD_LINE_SWITCH, "v", "version", "show DCP-o-matic version", wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL },
+ { wxCMD_LINE_OPTION, "", "config", "directory containing config.xml and cinemas.xml", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
{ wxCMD_LINE_PARAM, 0, 0, "film to load or create", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
{ wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 }
};
: wxApp ()
, _frame (0)
, _splash (0)
- {}
+ {
+#ifdef DCPOMATIC_LINUX
+ XInitThreads ();
+#endif
+ }
private:
Config::instance()->set_nagged(Config::NAG_INITIAL_SETUP, true);
}
+ if (running_32_on_64 ()) {
+ NagDialog::maybe_nag (
+ _frame, Config::NAG_32_ON_64,
+ _("You are running the 32-bit version of DCP-o-matic on a 64-bit version of Windows. This will limit the memory available to DCP-o-matic and may cause errors. You are strongly advised to install the 64-bit version of DCP-o-matic."),
+ false);
+ }
+
_frame->Show ();
+ signal_manager = new wxSignalManager (this);
+ Bind (wxEVT_IDLE, boost::bind (&App::idle, this, _1));
+
if (!_film_to_load.empty() && boost::filesystem::is_directory (_film_to_load)) {
try {
_frame->load_film (_film_to_load);
}
}
- signal_manager = new wxSignalManager (this);
- Bind (wxEVT_IDLE, boost::bind (&App::idle, this));
-
Bind (wxEVT_TIMER, boost::bind (&App::check, this));
_timer.reset (new wxTimer (this));
_timer->Start (1000);
bool OnCmdLineParsed (wxCmdLineParser& parser)
{
+ if (parser.Found (wxT("version"))) {
+ cout << "dcpomatic version " << dcpomatic_version << " " << dcpomatic_git_commit << "\n";
+ exit (EXIT_SUCCESS);
+ }
+
if (parser.GetParamCount() > 0) {
if (parser.Found (wxT ("new"))) {
_film_to_create = wx_to_std (parser.GetParam (0));
_dcp_to_add = wx_to_std (dcp);
}
+ wxString config;
+ if (parser.Found (wxT("config"), &config)) {
+ State::override_path = wx_to_std (config);
+ }
+
return true;
}
report_exception ();
}
- void idle ()
+ void idle (wxIdleEvent& ev)
{
signal_manager->ui_idle ();
+ ev.Skip ();
}
void check ()