/*
- Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2019-2021 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
*/
+
#include "markers_dialog.h"
#include "wx_util.h"
#include "timecode.h"
#include "lib/film.h"
#include <dcp/types.h>
#include <wx/gbsizer.h>
-#include <boost/bind.hpp>
+#include <boost/bind/bind.hpp>
#include <iostream>
+
using std::cout;
-using boost::bind;
-using boost::shared_ptr;
-using boost::weak_ptr;
+using std::shared_ptr;
+using std::weak_ptr;
+using std::make_shared;
using boost::optional;
+using boost::bind;
using dcpomatic::DCPTime;
+
class Marker
{
public:
set_button = new Button (parent, _("Set from current position"));
grid->Add (set_button, wxGBPosition(row, 2));
- shared_ptr<Film> f = film.lock ();
+ auto f = film.lock ();
DCPOMATIC_ASSERT (f);
- optional<DCPTime> t = f->marker (type);
+ auto t = f->marker (type);
checkbox->SetValue (static_cast<bool>(t));
if (t) {
timecode->set (*t, f->video_frame_rate());
set_sensitivity ();
set_button->Bind (wxEVT_BUTTON, bind(&Marker::set, this));
- checkbox->Bind (wxEVT_CHECKBOX, bind(&Marker::set_sensitivity, this));
+ checkbox->Bind (wxEVT_CHECKBOX, bind(&Marker::checkbox_clicked, this));
timecode->Changed.connect (bind(&Marker::changed, this));
}
private:
+ void checkbox_clicked ()
+ {
+ set_sensitivity ();
+ changed ();
+ }
+
void set_sensitivity ()
{
timecode->Enable (checkbox->GetValue());
void set ()
{
- shared_ptr<Film> f = film.lock ();
+ auto f = film.lock ();
DCPOMATIC_ASSERT (f);
- shared_ptr<FilmViewer> v = viewer.lock ();
+ auto v = viewer.lock ();
DCPOMATIC_ASSERT (v);
timecode->set (v->position(), f->video_frame_rate());
changed ();
void changed ()
{
- shared_ptr<Film> f = film.lock ();
+ auto f = film.lock ();
DCPOMATIC_ASSERT (f);
+ auto vfr = f->video_frame_rate();
+ auto tc = timecode->get(vfr);
+ if (tc >= f->length()) {
+ tc = f->length() - DCPTime::from_frames(1, vfr);
+ timecode->set (tc, vfr);
+ }
if (checkbox->GetValue()) {
- f->set_marker (type, timecode->get(f->video_frame_rate()));
+ f->set_marker (type, tc);
} else {
f->unset_marker (type);
}
Button* set_button;
};
+
MarkersDialog::MarkersDialog (wxWindow* parent, weak_ptr<Film> film, weak_ptr<FilmViewer> viewer)
: wxDialog (parent, wxID_ANY, _("Markers"))
, _film (film)
{
- wxSizer* sizer = new wxBoxSizer (wxVERTICAL);
- wxGridBagSizer* grid = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+ auto sizer = new wxBoxSizer (wxVERTICAL);
+ auto grid = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
int r = 0;
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("First frame of composition"), dcp::FFOC)));
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("Last frame of composition"), dcp::LFOC)));
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("First frame of title credits"), dcp::FFTC)));
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("Last frame of title credits"), dcp::LFTC)));
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("First frame of intermission"), dcp::FFOI)));
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("Last frame of intermission"), dcp::LFOI)));
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("First frame of end credits"), dcp::FFEC)));
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("Last frame of end credits"), dcp::LFEC)));
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("First frame of moving credits"), dcp::FFMC)));
- _markers.push_back (shared_ptr<Marker>(new Marker(this, grid, r++, film, viewer, _("Last frame of moving credits"), dcp::LFMC)));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("First frame of composition"), dcp::Marker::FFOC));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("Last frame of composition"), dcp::Marker::LFOC));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("First frame of title credits"), dcp::Marker::FFTC));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("Last frame of title credits"), dcp::Marker::LFTC));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("First frame of intermission"), dcp::Marker::FFOI));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("Last frame of intermission"), dcp::Marker::LFOI));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("First frame of end credits"), dcp::Marker::FFEC));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("Last frame of end credits"), dcp::Marker::LFEC));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("First frame of moving credits"), dcp::Marker::FFMC));
+ _markers.push_back (make_shared<Marker>(this, grid, r++, film, viewer, _("Last frame of moving credits"), dcp::Marker::LFMC));
sizer->Add (grid, 0, wxALL, 8);
+
+ auto buttons = CreateSeparatedButtonSizer (wxCLOSE);
+ if (buttons) {
+ sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
+ }
+
SetSizerAndFit (sizer);
}