#include "wx/export_dialog.h"
#include "wx/paste_dialog.h"
#include "wx/focus_manager.h"
+#include "wx/html_dialog.h"
#include "wx/initial_setup_dialog.h"
#include "wx/send_i18n_dialog.h"
#include "wx/i18n_hook.h"
#include "lib/film.h"
+#include "lib/analytics.h"
#include "lib/emailer.h"
#include "lib/config.h"
#include "lib/util.h"
#include <wx/cmdline.h>
#include <wx/preferences.h>
#include <wx/splash.h>
+#include <wx/wxhtml.h>
#ifdef __WXMSW__
#include <shellapi.h>
#endif
_config_changed_connection = Config::instance()->Changed.connect (boost::bind (&DOMFrame::config_changed, this, _1));
config_changed (Config::OTHER);
+ _analytics_message_connection = Analytics::instance()->Message.connect(boost::bind(&DOMFrame::analytics_message, this, _1, _2));
+
Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_new, this), ID_file_new);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_open, this), ID_file_open);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_save, this), ID_file_save);
film->set_name (path.filename().generic_string());
film->write_metadata ();
set_film (film);
- dcpomatic_log = film->log ();
}
void load_film (boost::filesystem::path file)
);
}
- for (list<string>::const_iterator i = notes.begin(); i != notes.end(); ++i) {
- error_dialog (0, std_to_wx (*i));
+ BOOST_FOREACH (string i, notes) {
+ error_dialog (0, std_to_wx(i));
}
set_film (film);
if (_film) {
_film->Change.connect (boost::bind (&DOMFrame::film_change, this, _1));
_film->Message.connect (boost::bind(&DOMFrame::film_message, this, _1));
+ dcpomatic_log = _film->log ();
}
}
} 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
string body;
body += d->name() + "\n";
body += d->language() + "\n";
+ body += string(dcpomatic_version) + " " + string(dcpomatic_git_commit) + "\n";
+ body += "--\n";
map<string, string> translations = I18NHook::translations ();
for (map<string, string>::const_iterator i = translations.begin(); i != translations.end(); ++i) {
- body += i->first + "\n" + i->second + "\n";
+ body += i->first + "\n" + i->second + "\n\n";
}
list<string> to;
to.push_back ("carl@dcpomatic.com");
Emailer emailer (d->email(), to, "DCP-o-matic translations", body);
- emailer.send ("main.carlh.net", 2525);
+ emailer.send ("main.carlh.net", 2525, EMAIL_PROTOCOL_STARTTLS);
}
d->Destroy ();
*/
_config_changed_connection.disconnect ();
+ /* Also stop hearing about analytics-related stuff */
+ _analytics_message_connection.disconnect ();
+
ev.Skip ();
}
_history_position = _file_menu->GetMenuItems().GetCount();
_file_menu->AppendSeparator ();
- add_item (_file_menu, _("&Close"), ID_file_close, NEEDS_FILM);
+ add_item (_file_menu, _("&Close\tCtrl-W"), ID_file_close, NEEDS_FILM);
#ifndef __WXOSX__
_file_menu->AppendSeparator ();
int pos = _history_position;
+ /* Clear out non-existant history items before we re-build the menu */
+ Config::instance()->clean_history ();
vector<boost::filesystem::path> history = Config::instance()->history ();
if (!history.empty ()) {
}
_history_items = history.size ();
+
+ dcpomatic_log->set_types (Config::instance()->log_types());
}
void update_checker_state_changed ()
_film_viewer->seek_by (_film_viewer->one_video_frame(), true);
}
+ void analytics_message (string title, string html)
+ {
+ HTMLDialog* d = new HTMLDialog(this, std_to_wx(title), std_to_wx(html));
+ d->ShowModal();
+ d->Destroy();
+ }
+
FilmEditor* _film_editor;
boost::shared_ptr<FilmViewer> _film_viewer;
StandardControls* _controls;
int _history_position;
wxMenuItem* _history_separator;
boost::signals2::scoped_connection _config_changed_connection;
+ boost::signals2::scoped_connection _analytics_message_connection;
bool _update_news_requested;
shared_ptr<Content> _clipboard;
};
{ 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_PARAM, 0, 0, "film to load or create", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
{ wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 }
};
App ()
: wxApp ()
, _frame (0)
+ , _splash (0)
{}
private:
bool OnInit ()
{
- wxSplashScreen* splash = 0;
try {
wxInitAllImageHandlers ();
Config::FailedToLoad.connect (boost::bind (&App::config_failed_to_load, this));
Config::Warning.connect (boost::bind (&App::config_warning, this, _1));
- splash = maybe_show_splash ();
+ _splash = maybe_show_splash ();
SetAppName (_("DCP-o-matic"));
_frame = new DOMFrame (_("DCP-o-matic"));
SetTopWindow (_frame);
_frame->Maximize ();
- if (splash) {
- splash->Destroy ();
- splash = 0;
+ if (_splash) {
+ _splash->Destroy ();
+ _splash = 0;
}
if (!Config::instance()->nagged(Config::NAG_INITIAL_SETUP)) {
}
signal_manager = new wxSignalManager (this);
- Bind (wxEVT_IDLE, boost::bind (&App::idle, this));
+ Bind (wxEVT_IDLE, boost::bind (&App::idle, this, _1));
Bind (wxEVT_TIMER, boost::bind (&App::check, this));
_timer.reset (new wxTimer (this));
}
catch (exception& e)
{
- if (splash) {
- splash->Destroy ();
+ if (_splash) {
+ _splash->Destroy ();
}
error_dialog (0, wxString::Format ("DCP-o-matic could not start."), std_to_wx(e.what()));
}
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));
void report_exception ()
{
+ if (_splash) {
+ _splash->Destroy ();
+ _splash = 0;
+ }
+
try {
throw;
} catch (FileError& e) {
report_exception ();
}
- void idle ()
+ void idle (wxIdleEvent& ev)
{
signal_manager->ui_idle ();
+ ev.Skip ();
}
void check ()
return false;
}
+ if (_splash) {
+ _splash->Destroy ();
+ _splash = 0;
+ }
+
RecreateChainDialog* d = new RecreateChainDialog (_frame);
int const r = d->ShowModal ();
d->Destroy ();
}
DOMFrame* _frame;
+ wxSplashScreen* _splash;
shared_ptr<wxTimer> _timer;
string _film_to_load;
string _film_to_create;