/*
- Copyright (C) 2015-2017 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2015-2019 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
#include "wx/file_dialog_wrapper.h"
#include "wx/new_dkdm_folder_dialog.h"
#include "wx/editable_list.h"
+#include "wx/static_text.h"
+#include "wx/dcpomatic_button.h"
+#include "wx/nag_dialog.h"
#include "lib/config.h"
#include "lib/util.h"
#include "lib/screen.h"
using boost::optional;
using boost::ref;
using boost::dynamic_pointer_cast;
+using namespace dcpomatic;
enum {
ID_help_report_a_problem = 1,
wxFont subheading_font (*wxNORMAL_FONT);
subheading_font.SetWeight (wxFONTWEIGHT_BOLD);
- wxStaticText* h = new wxStaticText (overall_panel, wxID_ANY, _("Screens"));
+ wxStaticText* h = new StaticText (overall_panel, _("Screens"));
h->SetFont (subheading_font);
left->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP);
_screens = new ScreensPanel (overall_panel);
left->Add (_screens, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP);
/// TRANSLATORS: translate the word "Timing" here; do not include the "KDM|" prefix
- h = new wxStaticText (overall_panel, wxID_ANY, S_("KDM|Timing"));
+ h = new StaticText (overall_panel, S_("KDM|Timing"));
h->SetFont (subheading_font);
right->Add (h, 0, wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_Y_GAP * 2);
_timing = new KDMTimingPanel (overall_panel);
right->Add (_timing, 0, wxALL, DCPOMATIC_SIZER_Y_GAP);
- h = new wxStaticText (overall_panel, wxID_ANY, _("DKDM"));
+ h = new StaticText (overall_panel, _("DKDM"));
h->SetFont (subheading_font);
right->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2);
wxBoxSizer* dkdm_sizer = new wxBoxSizer (wxHORIZONTAL);
);
dkdm_sizer->Add (_dkdm, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP);
wxBoxSizer* dkdm_buttons = new wxBoxSizer(wxVERTICAL);
- _add_dkdm = new wxButton (overall_panel, wxID_ANY, _("Add..."));
+ _add_dkdm = new Button (overall_panel, _("Add..."));
dkdm_buttons->Add (_add_dkdm, 0, wxALL | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP);
- _add_dkdm_folder = new wxButton (overall_panel, wxID_ANY, _("Add folder..."));
+ _add_dkdm_folder = new Button (overall_panel, _("Add folder..."));
dkdm_buttons->Add (_add_dkdm_folder, 0, wxALL | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP);
- _remove_dkdm = new wxButton (overall_panel, wxID_ANY, _("Remove"));
+ _remove_dkdm = new Button (overall_panel, _("Remove"));
dkdm_buttons->Add (_remove_dkdm, 0, wxALL | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP);
+ _export_dkdm = new Button (overall_panel, _("Export..."));
+ dkdm_buttons->Add (_export_dkdm, 0, wxALL | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP);
dkdm_sizer->Add (dkdm_buttons, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_GAP);
right->Add (dkdm_sizer, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP);
add_dkdm_view (Config::instance()->dkdms());
- h = new wxStaticText (overall_panel, wxID_ANY, _("Output"));
+ h = new StaticText (overall_panel, _("Output"));
h->SetFont (subheading_font);
right->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2);
/* XXX: hard-coded non-interop here */
_output = new KDMOutputPanel (overall_panel, false);
right->Add (_output, 0, wxALL, DCPOMATIC_SIZER_Y_GAP);
- _create = new wxButton (overall_panel, wxID_ANY, _("Create KDMs"));
+ _create = new Button (overall_panel, _("Create KDMs"));
right->Add (_create, 0, wxALL, DCPOMATIC_SIZER_GAP);
main_sizer->Add (horizontal, 1, wxALL | wxEXPAND, DCPOMATIC_DIALOG_BORDER);
_add_dkdm->Bind (wxEVT_BUTTON, bind (&DOMFrame::add_dkdm_clicked, this));
_add_dkdm_folder->Bind (wxEVT_BUTTON, bind (&DOMFrame::add_dkdm_folder_clicked, this));
_remove_dkdm->Bind (wxEVT_BUTTON, bind (&DOMFrame::remove_dkdm_clicked, this));
+ _export_dkdm->Bind (wxEVT_BUTTON, bind (&DOMFrame::export_dkdm_clicked, this));
setup_sensitivity ();
}
_output->setup_sensitivity ();
wxArrayTreeItemIds sel;
_dkdm->GetSelections (sel);
+ shared_ptr<DKDMGroup> group = dynamic_pointer_cast<DKDMGroup>(selected_dkdm());
+ shared_ptr<DKDM> dkdm = dynamic_pointer_cast<DKDM>(selected_dkdm());
_create->Enable (!_screens->screens().empty() && sel.GetCount() > 0);
+ _remove_dkdm->Enable (sel.GetCount() > 0 && (!group || group->name() != "root"));
+ _export_dkdm->Enable (sel.GetCount() > 0 && dkdm);
}
void dkdm_begin_drag (wxTreeEvent& ev)
std_to_wx(e.what())
);
return;
- } catch (dcp::KDMDecryptionError) {
+ } catch (dcp::KDMDecryptionError &) {
error_dialog (
this,
_("Could not decrypt the DKDM. Perhaps it was not created with the correct certificate.")
);
+ } catch (dcp::MiscError& e) {
+ error_dialog (
+ this,
+ _("Could not read file as a KDM. It is much too large. Make sure you are loading a DKDM (XML) file."),
+ std_to_wx(e.what())
+ );
}
}
d->Destroy ();
return;
}
+ if (NagDialog::maybe_nag (
+ this, Config::NAG_DELETE_DKDM,
+ _("You are about to remove a DKDM. This will make it impossible to decrypt the DCP that the DKDM was made for, and it cannot be undone. "
+ "Are you sure?"),
+ true)) {
+ return;
+ }
+
_dkdm->Delete (dkdm_to_id (removed));
shared_ptr<DKDMGroup> dkdms = Config::instance()->dkdms ();
dkdms->remove (removed);
Config::instance()->changed ();
}
+ void export_dkdm_clicked ()
+ {
+ shared_ptr<DKDMBase> removed = selected_dkdm ();
+ if (!removed) {
+ return;
+ }
+
+ shared_ptr<DKDM> dkdm = dynamic_pointer_cast<DKDM>(removed);
+ if (!dkdm) {
+ return;
+ }
+
+ wxFileDialog* d = new wxFileDialog (
+ this, _("Select DKDM File"), wxEmptyString, wxEmptyString, wxT("XML files (*.xml)|*.xml"),
+ wxFD_SAVE | wxFD_OVERWRITE_PROMPT
+ );
+
+ if (d->ShowModal() == wxID_OK) {
+ dkdm->dkdm().as_xml(wx_to_std(d->GetPath()));
+ }
+ d->Destroy ();
+ }
+
wxPreferencesEditor* _config_dialog;
ScreensPanel* _screens;
KDMTimingPanel* _timing;
wxButton* _add_dkdm;
wxButton* _add_dkdm_folder;
wxButton* _remove_dkdm;
+ wxButton* _export_dkdm;
wxButton* _create;
KDMOutputPanel* _output;
JobViewDialog* _job_view;
private:
bool OnInit ()
- try
{
- wxInitAllImageHandlers ();
+ wxSplashScreen* splash = 0;
- Config::FailedToLoad.connect (boost::bind (&App::config_failed_to_load, this));
- Config::Warning.connect (boost::bind (&App::config_warning, this, _1));
+ try {
+ wxInitAllImageHandlers ();
- wxSplashScreen* splash = maybe_show_splash ();
+ Config::FailedToLoad.connect (boost::bind (&App::config_failed_to_load, this));
+ Config::Warning.connect (boost::bind (&App::config_warning, this, _1));
- SetAppName (_("DCP-o-matic KDM Creator"));
+ splash = maybe_show_splash ();
- if (!wxApp::OnInit()) {
- return false;
- }
+ SetAppName (_("DCP-o-matic KDM Creator"));
+
+ if (!wxApp::OnInit()) {
+ return false;
+ }
#ifdef DCPOMATIC_LINUX
- unsetenv ("UBUNTU_MENUPROXY");
+ unsetenv ("UBUNTU_MENUPROXY");
#endif
#ifdef __WXOSX__
- ProcessSerialNumber serial;
- GetCurrentProcess (&serial);
- TransformProcessType (&serial, kProcessTransformToForegroundApplication);
+ ProcessSerialNumber serial;
+ GetCurrentProcess (&serial);
+ TransformProcessType (&serial, kProcessTransformToForegroundApplication);
#endif
- dcpomatic_setup_path_encoding ();
-
- /* 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 filters etc.
- set up yet.
- */
- dcpomatic_setup_i18n ();
-
- /* Set things up, including filters etc.
- which will now be internationalised correctly.
- */
- dcpomatic_setup ();
-
- /* Force the configuration to be re-loaded correctly next
- time it is needed.
- */
- Config::drop ();
+ dcpomatic_setup_path_encoding ();
+
+ /* 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 filters etc.
+ set up yet.
+ */
+ dcpomatic_setup_i18n ();
+
+ /* Set things up, including filters etc.
+ which will now be internationalised correctly.
+ */
+ dcpomatic_setup ();
+
+ /* Force the configuration to be re-loaded correctly next
+ time it is needed.
+ */
+ Config::drop ();
+
+ _frame = new DOMFrame (_("DCP-o-matic KDM Creator"));
+ SetTopWindow (_frame);
+ _frame->Maximize ();
+ if (splash) {
+ splash->Destroy ();
+ splash = 0;
+ }
+ _frame->Show ();
- _frame = new DOMFrame (_("DCP-o-matic KDM Creator"));
- SetTopWindow (_frame);
- _frame->Maximize ();
- if (splash) {
- splash->Destroy ();
+ signal_manager = new wxSignalManager (this);
+ Bind (wxEVT_IDLE, boost::bind (&App::idle, this));
+ }
+ catch (exception& e)
+ {
+ if (splash) {
+ splash->Destroy ();
+ }
+ error_dialog (0, _("DCP-o-matic could not start"), std_to_wx(e.what()));
}
- _frame->Show ();
-
- signal_manager = new wxSignalManager (this);
- Bind (wxEVT_IDLE, boost::bind (&App::idle, this));
return true;
}
- catch (exception& e)
- {
- error_dialog (0, _("DCP-o-matic could not start"), std_to_wx(e.what()));
- return true;
- }
/* An unhandled exception has occurred inside the main event loop */
bool OnExceptionInMainLoop ()