#include "wx/recreate_chain_dialog.h"
#include "wx/about_dialog.h"
#include "wx/kdm_dialog.h"
+#include "wx/dkdm_dialog.h"
#include "wx/self_dkdm_dialog.h"
#include "wx/servers_list_dialog.h"
#include "wx/hints_dialog.h"
#include "wx/save_template_dialog.h"
#include "wx/templates_dialog.h"
#include "wx/nag_dialog.h"
-#include "wx/export_dialog.h"
+#include "wx/export_subtitles_dialog.h"
+#include "wx/export_video_file_dialog.h"
#include "wx/paste_dialog.h"
#include "wx/focus_manager.h"
#include "wx/html_dialog.h"
#include "lib/job_manager.h"
#include "lib/exceptions.h"
#include "lib/cinema.h"
-#include "lib/screen_kdm.h"
+#include "lib/kdm_with_metadata.h"
#include "lib/send_kdm_email_job.h"
#include "lib/encode_server_finder.h"
#include "lib/update_checker.h"
#include "lib/cross.h"
#include "lib/content_factory.h"
#include "lib/compose.hpp"
-#include "lib/cinema_kdms.h"
#include "lib/dcpomatic_socket.h"
#include "lib/hints.h"
#include "lib/dcp_content.h"
#include "lib/text_content.h"
#include "lib/dcpomatic_log.h"
#include "lib/subtitle_encoder.h"
+#include "lib/warnings.h"
#include <dcp/exceptions.h>
#include <dcp/raw_convert.h>
+DCPOMATIC_DISABLE_WARNINGS
#include <wx/generic/aboutdlgg.h>
#include <wx/stdpaths.h>
#include <wx/cmdline.h>
#include <wx/preferences.h>
#include <wx/splash.h>
#include <wx/wxhtml.h>
+DCPOMATIC_ENABLE_WARNINGS
+#ifdef __WXGTK__
+#include <X11/Xlib.h>
+#endif
#ifdef __WXMSW__
#include <shellapi.h>
#endif
-#ifdef __WXOSX__
-#include <ApplicationServices/ApplicationServices.h>
-#endif
#include <boost/filesystem.hpp>
#include <boost/noncopyable.hpp>
#include <boost/foreach.hpp>
using boost::function;
using boost::is_any_of;
using boost::algorithm::find;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
using dcp::raw_convert;
class FilmChangedClosingDialog : public boost::noncopyable
ID_file_close = 100,
ID_edit_copy,
ID_edit_paste,
- ID_content_scale_to_fit_width,
- ID_content_scale_to_fit_height,
ID_jobs_make_dcp,
ID_jobs_make_dcp_batch,
ID_jobs_make_kdms,
+ ID_jobs_make_dkdms,
ID_jobs_make_self_dkdm,
- ID_jobs_export,
+ ID_jobs_export_video_file,
+ ID_jobs_export_subtitles,
ID_jobs_send_dcp_to_tms,
ID_jobs_show_dcp,
ID_jobs_open_dcp_in_player,
, _servers_list_dialog (0)
, _config_dialog (0)
, _kdm_dialog (0)
+ , _dkdm_dialog (0)
, _templates_dialog (0)
, _file_menu (0)
, _history_items (0)
, _history_position (0)
, _history_separator (0)
, _update_news_requested (false)
+ , _first_shown_called (false)
{
#if defined(DCPOMATIC_WINDOWS)
if (Config::instance()->win32_console ()) {
Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_copy, this), ID_edit_copy);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_paste, this), ID_edit_paste);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_preferences, this), wxID_PREFERENCES);
- Bind (wxEVT_MENU, boost::bind (&DOMFrame::content_scale_to_fit_width, this), ID_content_scale_to_fit_width);
- Bind (wxEVT_MENU, boost::bind (&DOMFrame::content_scale_to_fit_height, this), ID_content_scale_to_fit_height);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dcp, this), ID_jobs_make_dcp);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_kdms, this), ID_jobs_make_kdms);
+ Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dkdms, this), ID_jobs_make_dkdms);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dcp_batch, this), ID_jobs_make_dcp_batch);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_self_dkdm, this), ID_jobs_make_self_dkdm);
- Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_export, this), ID_jobs_export);
+ Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_export_video_file, this), ID_jobs_export_video_file);
+ Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_export_subtitles, this), ID_jobs_export_subtitles);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_send_dcp_to_tms, this), ID_jobs_send_dcp_to_tms);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_show_dcp, this), ID_jobs_show_dcp);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_open_dcp_in_player, this), ID_jobs_open_dcp_in_player);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem);
Bind (wxEVT_CLOSE_WINDOW, boost::bind (&DOMFrame::close, this, _1));
+ Bind (wxEVT_SHOW, boost::bind (&DOMFrame::show, this, _1));
/* Use a panel as the only child of the Frame so that we avoid
the dark-grey background on Windows.
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)
private:
+ void show (wxShowEvent& ev)
+ {
+ if (ev.IsShown() && !_first_shown_called) {
+ _film_editor->first_shown ();
+ _first_shown_called = true;
+ }
+ }
+
void film_message (string m)
{
message_dialog (this, std_to_wx(m));
_kdm_dialog->Show ();
}
+ void jobs_make_dkdms ()
+ {
+ if (!_film) {
+ return;
+ }
+
+ if (_dkdm_dialog) {
+ _dkdm_dialog->Destroy ();
+ _dkdm_dialog = 0;
+ }
+
+ _dkdm_dialog = new DKDMDialog (this, _film);
+ _dkdm_dialog->Show ();
+ }
+
/** @return false if we succeeded, true if not */
- bool send_to_other_tool (int port, function<void(boost::filesystem::path)> start, string message)
+ bool send_to_other_tool (int port, function<void()> start, string message)
{
/* i = 0; try to connect via socket
i = 1; try again, and then try to start the tool
}
if (i == 1) {
- start (wx_to_std (wxStandardPaths::Get().GetExecutablePath()));
+ start ();
}
dcpomatic_sleep_seconds (1);
_film->write_metadata ();
- if (send_to_other_tool (BATCH_JOB_PORT, bind (&start_batch_converter, _1), _film->directory()->string())) {
+ if (send_to_other_tool (BATCH_JOB_PORT, &start_batch_converter, _film->directory()->string())) {
+#ifdef DCPOMATIC_OSX
+ error_dialog (this, _("Could not start the batch converter. You may need to download it from dcpomatic.com."));
+#else
error_dialog (this, _("Could not find batch converter."));
+#endif
}
}
return;
}
- if (send_to_other_tool (PLAYER_PLAY_PORT, bind (&start_player, _1), _film->dir(_film->dcp_name(false)).string())) {
+ if (send_to_other_tool (PLAYER_PLAY_PORT, &start_player, _film->dir(_film->dcp_name(false)).string())) {
+#ifdef DCPOMATIC_OSX
+ error_dialog (this, _("Could not start the player. You may need to download it from dcpomatic.com."));
+#else
error_dialog (this, _("Could not find player."));
+#endif
}
}
);
- dcp::LocalTime from (Config::instance()->decryption_chain()->leaf().not_before());
- from.add_months (1);
- dcp::LocalTime to (Config::instance()->decryption_chain()->leaf().not_after());
- to.add_months (-1);
+ dcp::LocalTime from (Config::instance()->signer_chain()->leaf().not_before());
+ from.add_days (1);
+ dcp::LocalTime to (Config::instance()->signer_chain()->leaf().not_after());
+ to.add_days (-1);
optional<dcp::EncryptedKDM> kdm;
try {
d->Destroy ();
}
- void jobs_export ()
+
+ void jobs_export_video_file ()
{
- ExportDialog* d = new ExportDialog (this, _film->isdcf_name(true));
+ ExportVideoFileDialog* d = new ExportVideoFileDialog (this, _film->isdcf_name(true));
if (d->ShowModal() == wxID_OK) {
if (boost::filesystem::exists(d->path())) {
bool ok = confirm_dialog(
}
shared_ptr<TranscodeJob> job (new TranscodeJob (_film));
- 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()
+ job->set_encoder (
+ shared_ptr<FFmpegEncoder> (
+ new FFmpegEncoder (_film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->split_streams(), d->x264_crf()
#ifdef DCPOMATIC_VARIANT_SWAROOP
- , optional<dcp::Key>(), optional<string>()
+ , optional<dcp::Key>(), optional<string>()
#endif
- )
)
- );
- }
+ )
+ );
JobManager::instance()->add (job);
}
d->Destroy ();
}
- void content_scale_to_fit_width ()
- {
- ContentList vc = _film_editor->content_panel()->selected_video ();
- for (ContentList::iterator i = vc.begin(); i != vc.end(); ++i) {
- (*i)->video->scale_and_crop_to_fit_width (_film);
- }
- }
- void content_scale_to_fit_height ()
+ void jobs_export_subtitles ()
{
- ContentList vc = _film_editor->content_panel()->selected_video ();
- for (ContentList::iterator i = vc.begin(); i != vc.end(); ++i) {
- (*i)->video->scale_and_crop_to_fit_height (_film);
+ ExportSubtitlesDialog* d = new ExportSubtitlesDialog (this, _film->reels().size(), _film->interop());
+ if (d->ShowModal() == wxID_OK) {
+ shared_ptr<TranscodeJob> job (new TranscodeJob (_film));
+ job->set_encoder (
+ shared_ptr<SubtitleEncoder>(new SubtitleEncoder(_film, job, d->path(), _film->isdcf_name(true), d->split_reels(), d->include_font()))
+ );
+ JobManager::instance()->add (job);
}
+ d->Destroy ();
}
+
void jobs_send_dcp_to_tms ()
{
_film->send_dcp_to_tms ();
add_item (edit, _("&Preferences...\tCtrl-P"), wxID_PREFERENCES, ALWAYS);
#endif
- wxMenu* content = new wxMenu;
- add_item (content, _("Scale to fit &width"), ID_content_scale_to_fit_width, NEEDS_FILM | NEEDS_SELECTED_VIDEO_CONTENT);
- add_item (content, _("Scale to fit &height"), ID_content_scale_to_fit_height, NEEDS_FILM | NEEDS_SELECTED_VIDEO_CONTENT);
-
wxMenu* jobs_menu = new wxMenu;
add_item (jobs_menu, _("&Make DCP\tCtrl-M"), ID_jobs_make_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION);
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 ();
add_item (jobs_menu, _("Make &KDMs...\tCtrl-K"), ID_jobs_make_kdms, NEEDS_FILM);
+ 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 ();
- add_item (jobs_menu, _("Export...\tCtrl-E"), ID_jobs_export, NEEDS_FILM);
+ 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 ();
add_item (jobs_menu, _("&Send DCP to TMS"), ID_jobs_send_dcp_to_tms, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL);
- add_item (jobs_menu, _("S&how DCP"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL);
+
+#if defined(DCPOMATIC_OSX)
+ add_item (jobs_menu, _("S&how DCP in Finder"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL);
+#elif defined(DCPOMATIC_WINDOWS)
+ add_item (jobs_menu, _("S&how DCP in Explorer"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL);
+#else
+ add_item (jobs_menu, _("S&how DCP in Files"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL);
+#endif
+
add_item (jobs_menu, _("Open DCP in &player"), ID_jobs_open_dcp_in_player, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL);
wxMenu* view = new wxMenu;
m->Append (_file_menu, _("&File"));
m->Append (edit, _("&Edit"));
- m->Append (content, _("&Content"));
m->Append (jobs_menu, _("&Jobs"));
m->Append (view, _("&View"));
m->Append (tools, _("&Tools"));
ServersListDialog* _servers_list_dialog;
wxPreferencesEditor* _config_dialog;
KDMDialog* _kdm_dialog;
+ DKDMDialog* _dkdm_dialog;
TemplatesDialog* _templates_dialog;
wxMenu* _file_menu;
shared_ptr<Film> _film;
boost::signals2::scoped_connection _analytics_message_connection;
bool _update_news_requested;
shared_ptr<Content> _clipboard;
+ bool _first_shown_called;
};
static const wxCmdLineEntryDesc command_line_description[] = {
{ 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:
unsetenv ("UBUNTU_MENUPROXY");
#endif
-#ifdef __WXOSX__
- ProcessSerialNumber serial;
- GetCurrentProcess (&serial);
- TransformProcessType (&serial, kProcessTransformToForegroundApplication);
+#ifdef DCPOMATIC_OSX
+ dcpomatic_sleep_seconds (1);
+ make_foreground_application ();
#endif
dcpomatic_setup_path_encoding ();
_dcp_to_add = wx_to_std (dcp);
}
+ wxString config;
+ if (parser.Found (wxT("config"), &config)) {
+ State::override_path = wx_to_std (config);
+ }
+
return true;
}