Fix extra widgets appearing when switching between subs and closed captions in the...
[dcpomatic.git] / src / wx / language_tag_widget.cc
index 592741b4d4f589e92c99a75f943e69c1800e430a..88923da15c87b7a29340dd02c0483766ec5ef4e4 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2020-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 #include "dcpomatic_button.h"
 #include "language_tag_dialog.h"
 #include "language_tag_widget.h"
+#include "wx_ptr.h"
 #include "wx_util.h"
+#include "lib/scope_guard.h"
+#include <dcp/warnings.h>
+LIBDCP_DISABLE_WARNINGS
 #include <wx/wx.h>
+LIBDCP_ENABLE_WARNINGS
 
 
-LanguageTagWidget::LanguageTagWidget (wxWindow* parent, wxSizer* sizer, wxString label, wxString tooltip, dcp::LanguageTag tag)
+using boost::optional;
+
+
+LanguageTagWidget::LanguageTagWidget (wxWindow* parent, wxString tooltip, optional<dcp::LanguageTag> tag, optional<wxString> size_to_fit)
        : _parent (parent)
+       , _sizer (new wxBoxSizer(wxHORIZONTAL))
 {
-       add_label_to_sizer(sizer, parent, label, true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
-       wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
-       _language = new wxStaticText (parent, wxID_ANY, wxT(""));
+       _language = new wxStaticText (parent, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END);
        _language->SetToolTip (tooltip);
        set (tag);
-       s->Add (_language, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
+
+       if (size_to_fit) {
+               int w;
+               int h;
+               _language->GetTextExtent (*size_to_fit, &w, &h);
+               _language->SetMinSize (wxSize(w, -1));
+       }
+
+       _sizer->Add (_language, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
        _edit = new Button (parent, _("Edit..."));
-       s->Add (_edit, 0, wxLEFT, DCPOMATIC_SIZER_GAP);
-       sizer->Add (s, 0, wxEXPAND);
+       _sizer->Add (_edit, 0, wxLEFT, DCPOMATIC_SIZER_GAP);
 
        _edit->Bind (wxEVT_BUTTON, boost::bind(&LanguageTagWidget::edit, this));
 }
 
 
+LanguageTagWidget::~LanguageTagWidget()
+{
+       _language->Destroy();
+       _edit->Destroy();
+}
+
+
 void
 LanguageTagWidget::edit ()
 {
-       LanguageTagDialog* d = new LanguageTagDialog(_parent, _tag);
-       d->ShowModal ();
-       set (d->get());
-       Changed (d->get());
-       d->Destroy ();
+       auto d = make_wx<LanguageTagDialog>(_parent, _tag.get_value_or(dcp::LanguageTag("en")));
+       if (d->ShowModal() == wxID_OK) {
+               set(d->get());
+               Changed(d->get());
+       }
 }
 
 
 void
-LanguageTagWidget::set (dcp::LanguageTag tag)
+LanguageTagWidget::set (optional<dcp::LanguageTag> tag)
 {
        _tag = tag;
-       checked_set (_language, std_to_wx(tag.to_string()));
+       if (tag) {
+               checked_set (_language, std_to_wx(tag->to_string()));
+       } else {
+               checked_set (_language, wxT(""));
+       }
+}
+
+
+void
+LanguageTagWidget::enable (bool e)
+{
+       _language->Enable (e);
+       _edit->Enable (e);
 }