/*
- Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
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
#include "lib/config.h"
#include "lib/util.h"
#include "lib/version.h"
-#include "lib/ui_signaller.h"
+#include "lib/signal_manager.h"
#include "lib/log.h"
#include "lib/job_manager.h"
#include "lib/transcode_job.h"
#include "wx/wx_util.h"
#include "wx/new_film_dialog.h"
#include "wx/properties_dialog.h"
-#include "wx/wx_ui_signaller.h"
+#include "wx/wx_signal_manager.h"
#include "wx/about_dialog.h"
#include "wx/kdm_dialog.h"
#include "wx/servers_list_dialog.h"
#include <boost/filesystem.hpp>
#include <iostream>
#include <fstream>
+#include <sstream>
#ifdef check
#undef check
#endif
using std::cout;
+using std::wcout;
using std::string;
using std::vector;
using std::wstring;
+using std::wstringstream;
using std::map;
using std::make_pair;
using std::list;
ID_tools_hints,
ID_tools_encoding_servers,
ID_tools_check_for_updates,
+ ID_tools_restore_default_preferences,
ID_help_report_a_problem,
/* IDs for shortcuts (with no associated menu item) */
ID_add_file
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::tools_check_for_updates, this), ID_tools_check_for_updates);
+ Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences);
Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::help_about, this), wxID_ABOUT);
Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::help_report_a_problem, this), ID_help_report_a_problem);
Bind (wxEVT_MENU, boost::bind (&ContentPanel::add_file_clicked, _film_editor->content_panel()), ID_add_file);
wxAcceleratorTable accel_table (1, accel);
SetAcceleratorTable (accel_table);
+
+ /* Instantly save any config changes when using the DCP-o-matic GUI */
+ Config::instance()->Changed.connect (boost::bind (&Config::write, Config::instance ()));
}
void new_film (boost::filesystem::path path)
_config_dialog->Show (this);
}
+ void tools_restore_default_preferences ()
+ {
+ Config::restore_defaults ();
+ }
+
void jobs_make_dcp ()
{
double required;
double available;
+ bool can_hard_link;
- if (!_film->should_be_enough_disk_space (required, available)) {
- if (!confirm_dialog (this, wxString::Format (_("The DCP for this film will take up about %.1f Gb, and the disk that you are using only has %.1f Gb available. Do you want to continue anyway?"), required, available))) {
+ if (!_film->should_be_enough_disk_space (required, available, can_hard_link)) {
+ wxString message;
+ if (can_hard_link) {
+ message = wxString::Format (_("The DCP for this film will take up about %.1f Gb, and the disk that you are using only has %.1f Gb available. Do you want to continue anyway?"), required, available);
+ } else {
+ message = wxString::Format (_("The DCP and intermediate files for this film will take up about %.1f Gb, and the disk that you are using only has %.1f Gb available. You would need half as much space if the filesystem supported hard links, but it does not. Do you want to continue anyway?"), required, available);
+ }
+ if (!confirm_dialog (this, message)) {
return;
}
}
try {
+ /* It seems to make sense to auto-save metadata here, since the make DCP may last
+ a long time, and crashes/power failures are moderately likely.
+ */
+ _film->write_metadata ();
_film->make_dcp ();
} catch (BadSettingError& e) {
error_dialog (this, wxString::Format (_("Bad setting for %s (%s)"), std_to_wx(e.setting()).data(), std_to_wx(e.what()).data()));
void jobs_show_dcp ()
{
-#ifdef __WXMSW__
- string d = _film->directory().string ();
- wstring w;
- w.assign (d.begin(), d.end());
- ShellExecute (0, L"open", w.c_str(), 0, 0, SW_SHOWDEFAULT);
-#else
+#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 ("nautilus " + _film->directory().string()).c_str ());
}
}
#endif
+
+#ifdef DCPOMATIC_OSX
+ int r = system (string ("open -R " + _film->dir (_film->dcp_name (false)).string ()).c_str ());
+ if (WEXITSTATUS (r)) {
+ error_dialog (this, _("Could not show DCP"));
+ }
+#endif
}
void tools_hints ()
add_item (jobs_menu, _("S&how DCP"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL);
wxMenu* tools = new wxMenu;
- add_item (tools, _("Hints...\tCtrl-H"), ID_tools_hints, 0);
+ add_item (tools, _("Hints..."), ID_tools_hints, 0);
add_item (tools, _("Encoding servers..."), ID_tools_encoding_servers, 0);
add_item (tools, _("Check for updates"), ID_tools_check_for_updates, 0);
+ tools->AppendSeparator ();
+ add_item (tools, _("Restore default preferences"), ID_tools_restore_default_preferences, ALWAYS);
wxMenu* help = new wxMenu;
#ifdef __WXOSX__
*/
class App : public wxApp
{
+public:
+ App ()
+ : wxApp ()
+ , _frame (0)
+ {}
+
+private:
+
bool OnInit ()
try
{
/* Enable i18n; this will create a Config object
to look for a force-configured language. This Config
object will be wrong, however, because dcpomatic_setup
- hasn't yet been called and there aren't any scalers, filters etc.
+ hasn't yet been called and there aren't any filters etc.
set up yet.
*/
dcpomatic_setup_i18n ();
- /* Set things up, including scalers / filters etc.
+ /* Set things up, including filters etc.
which will now be internationalised correctly.
*/
dcpomatic_setup ();
if (!_film_to_create.empty ()) {
_frame->new_film (_film_to_create);
if (!_content_to_add.empty ()) {
- _frame->film()->examine_and_add_content (content_factory (_frame->film(), _content_to_add), true);
+ _frame->film()->examine_and_add_content (content_factory (_frame->film(), _content_to_add));
}
}
- ui_signaller = new wxUISignaller (this);
+ signal_manager = new wxSignalManager (this);
Bind (wxEVT_IDLE, boost::bind (&App::idle, this));
Bind (wxEVT_TIMER, boost::bind (&App::check, this));
void idle ()
{
- ui_signaller->ui_idle ();
+ signal_manager->ui_idle ();
}
void check ()
void update_checker_state_changed ()
{
- switch (UpdateChecker::instance()->state ()) {
- case UpdateChecker::YES:
- {
- string test;
- if (Config::instance()->check_for_test_updates ()) {
- test = UpdateChecker::instance()->test ();
- }
- UpdateDialog* dialog = new UpdateDialog (_frame, UpdateChecker::instance()->stable (), test);
+ UpdateChecker* uc = UpdateChecker::instance ();
+ if (uc->state() == UpdateChecker::YES && (uc->stable() || uc->test())) {
+ UpdateDialog* dialog = new UpdateDialog (_frame, uc->stable (), uc->test ());
dialog->ShowModal ();
dialog->Destroy ();
- break;
- }
- case UpdateChecker::NO:
+ } else if (uc->state() == UpdateChecker::FAILED) {
if (!UpdateChecker::instance()->last_emit_was_first ()) {
- error_dialog (_frame, _("There are no new versions of DCP-o-matic available."));
+ error_dialog (_frame, _("The DCP-o-matic download server could not be contacted."));
}
- break;
- case UpdateChecker::FAILED:
+ } else {
if (!UpdateChecker::instance()->last_emit_was_first ()) {
- error_dialog (_frame, _("The DCP-o-matic download server could not be contacted."));
+ error_dialog (_frame, _("There are no new versions of DCP-o-matic available."));
}
- default:
- break;
}
}