Nag about deletion of DKDMs.
[dcpomatic.git] / src / tools / dcpomatic_kdm.cc
index 999bba17ee68292bdf1ce7fd71a37f9c45f97f46..2b0d25836dbf4cb0e77234f09a2fe10e99ef5f1f 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    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.
 
@@ -32,6 +32,8 @@
 #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"
@@ -152,11 +154,11 @@ public:
                );
                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);
                dkdm_sizer->Add (dkdm_buttons, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_GAP);
                right->Add (dkdm_sizer, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP);
@@ -170,7 +172,7 @@ public:
                _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);
@@ -436,11 +438,17 @@ private:
                                        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 ();
@@ -516,6 +524,14 @@ private:
                        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);
@@ -550,69 +566,75 @@ public:
 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 ()