#include "lib/file_log.h"
#include "lib/job_manager.h"
#include "lib/kdm_with_metadata.h"
-#include "lib/scope_guard.h"
#include "lib/screen.h"
#include "lib/send_kdm_email_job.h"
#include <dcp/encrypted_kdm.h>
#include <dcp/exceptions.h>
#include <dcp/warnings.h>
LIBDCP_DISABLE_WARNINGS
+#include <wx/dnd.h>
#include <wx/filepicker.h>
#include <wx/preferences.h>
#include <wx/splash.h>
h = new StaticText (overall_panel, _("DKDM"));
h->SetFont (subheading_font);
- right->Add (h, 0, wxTOP, DCPOMATIC_SIZER_Y_GAP * 2);
+ right->Add(h, 0, wxTOP, DCPOMATIC_SUBHEADING_TOP_PAD);
_dkdm_search = new wxSearchCtrl(overall_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(200, search_ctrl_height()));
#ifndef __WXGTK3__
right->Add(_dkdm_search, 0, wxTOP | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP);
+ class DKDMDropTarget : public wxFileDropTarget
+ {
+ public:
+ DKDMDropTarget(DOMFrame* frame)
+ : _frame(frame)
+ {}
+
+ bool OnDropFiles(wxCoord, wxCoord, wxArrayString const& filenames) override
+ {
+ for (size_t i = 0; i < filenames.GetCount(); ++i) {
+ _frame->add_dkdm(boost::filesystem::path(wx_to_std(filenames[0])));
+ }
+
+ return true;
+ }
+
+ private:
+ DOMFrame* _frame;
+ };
+
auto dkdm_sizer = new wxBoxSizer (wxHORIZONTAL);
_dkdm = new wxTreeCtrl (
overall_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT
);
+ _dkdm->SetDropTarget(new DKDMDropTarget(this));
dkdm_sizer->Add(_dkdm, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP);
- wxBoxSizer* dkdm_buttons = new wxBoxSizer(wxVERTICAL);
+ auto dkdm_buttons = new wxBoxSizer(wxVERTICAL);
_add_dkdm = new Button (overall_panel, _("Add..."));
dkdm_buttons->Add (_add_dkdm, 0, wxALL | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP);
_add_dkdm_folder = new Button (overall_panel, _("Add folder..."));
h = new StaticText (overall_panel, _("Output"));
h->SetFont (subheading_font);
- right->Add (h, 0, wxTOP, DCPOMATIC_SIZER_Y_GAP * 2);
+ right->Add(h, 0, wxTOP, DCPOMATIC_SUBHEADING_TOP_PAD);
_output = new KDMOutputPanel (overall_panel);
right->Add (_output, 0, wxALL, DCPOMATIC_SIZER_Y_GAP);
void help_about ()
{
- auto d = new AboutDialog (this);
- d->ShowModal ();
- d->Destroy ();
+ AboutDialog dialog(this);
+ dialog.ShowModal();
}
void help_report_a_problem ()
{
- auto d = new ReportProblemDialog (this, shared_ptr<Film>());
- if (d->ShowModal () == wxID_OK) {
- d->report ();
+ ReportProblemDialog dialog(this, shared_ptr<Film>());
+ if (dialog.ShowModal() == wxID_OK) {
+ dialog.report();
}
- d->Destroy ();
}
void setup_menu (wxMenuBar* m)
void add_dkdm_clicked ()
{
- auto dialog = new FileDialog(this, _("Select DKDM file"), wxT("XML files|*.xml|All files|*.*"), wxFD_MULTIPLE, "AddDKDMPath");
-
- ScopeGuard sg = [dialog]() { dialog->Destroy(); };
-
- if (!dialog->show()) {
+ FileDialog dialog(this, _("Select DKDM file"), wxT("XML files|*.xml|All files|*.*"), wxFD_MULTIPLE, "AddDKDMPath");
+ if (!dialog.show()) {
return;
}
+ for (auto path: dialog.paths()) {
+ add_dkdm(path);
+ }
+ }
+
+ void add_dkdm(boost::filesystem::path path)
+ {
auto chain = Config::instance()->decryption_chain();
DCPOMATIC_ASSERT (chain->key());
- for (auto path: dialog->paths()) {
- try {
- dcp::EncryptedKDM ekdm(dcp::file_to_string(path, MAX_KDM_SIZE));
- /* Decrypt the DKDM to make sure that we can */
- dcp::DecryptedKDM dkdm(ekdm, chain->key().get());
-
- auto new_dkdm = make_shared<DKDM>(ekdm);
- auto group = dynamic_pointer_cast<DKDMGroup> (selected_dkdm());
- if (!group) {
- group = Config::instance()->dkdms ();
- }
- add_dkdm(new_dkdm, group);
- } catch (dcp::KDMFormatError& e) {
- error_dialog (
- this,
- _("Could not read file as a KDM. Perhaps it is badly formatted, or not a KDM at all."),
- std_to_wx(e.what())
- );
- return;
- } 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())
- );
+ try {
+ dcp::EncryptedKDM ekdm(dcp::file_to_string(path, MAX_KDM_SIZE));
+ /* Decrypt the DKDM to make sure that we can */
+ dcp::DecryptedKDM dkdm(ekdm, chain->key().get());
+
+ auto new_dkdm = make_shared<DKDM>(ekdm);
+ auto group = dynamic_pointer_cast<DKDMGroup> (selected_dkdm());
+ if (!group) {
+ group = Config::instance()->dkdms ();
}
+ add_dkdm(new_dkdm, group);
+ } catch (dcp::KDMFormatError& e) {
+ error_dialog (
+ this,
+ _("Could not read file as a KDM. Perhaps it is badly formatted, or not a KDM at all."),
+ std_to_wx(e.what())
+ );
+ return;
+ } 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())
+ );
}
+
update_dkdm_view();
}
void add_dkdm_folder_clicked ()
{
- auto d = new NewDKDMFolderDialog (this);
- if (d->ShowModal() == wxID_OK) {
- auto new_dkdm = make_shared<DKDMGroup>(wx_to_std(d->get()));
- auto parent = dynamic_pointer_cast<DKDMGroup>(selected_dkdm());
- if (!parent) {
- parent = Config::instance()->dkdms ();
- }
- add_dkdm(new_dkdm, parent);
- update_dkdm_view();
+ NewDKDMFolderDialog dialog(this);
+ if (dialog.ShowModal() != wxID_OK) {
+ return;
+ }
+
+ auto new_dkdm = make_shared<DKDMGroup>(wx_to_std(dialog.get()));
+ auto parent = dynamic_pointer_cast<DKDMGroup>(selected_dkdm());
+ if (!parent) {
+ parent = Config::instance()->dkdms ();
}
- d->Destroy ();
+ add_dkdm(new_dkdm, parent);
+ update_dkdm_view();
}
void update_dkdm_view()
return;
}
- auto d = new wxFileDialog (
+ wxFileDialog dialog(
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()));
+ if (dialog.ShowModal() == wxID_OK) {
+ dkdm->dkdm().as_xml(wx_to_std(dialog.GetPath()));
}
- d->Destroy ();
}
void dkdm_search_changed()
bool OnInit () override
{
- wxSplashScreen* splash = nullptr;
+ wx_ptr<wxSplashScreen> splash;
try {
wxInitAllImageHandlers ();