diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-08-16 14:10:09 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-08-16 14:10:09 +0100 |
| commit | f8a0bc6135a933dcf660bbc46b4b3d29d503690e (patch) | |
| tree | 3d31c624da5ebedf77b92e94e302c3ecd2068bd4 /src | |
| parent | 533de5cc51d93a8403816fc0f04ca1d5aa733242 (diff) | |
Simple mouseover in the video waveform (part of #932).
Diffstat (limited to 'src')
| -rw-r--r-- | src/tools/dcpomatic.cc | 4 | ||||
| -rw-r--r-- | src/wx/video_waveform_dialog.cc | 35 | ||||
| -rw-r--r-- | src/wx/video_waveform_dialog.h | 7 | ||||
| -rw-r--r-- | src/wx/video_waveform_plot.cc | 41 | ||||
| -rw-r--r-- | src/wx/video_waveform_plot.h | 13 |
5 files changed, 91 insertions, 9 deletions
diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 1f320f088..d4695f1fa 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -317,6 +317,8 @@ public: _film = film; _film_viewer->set_film (_film); _film_editor->set_film (_film); + delete _video_waveform_dialog; + _video_waveform_dialog = 0; set_menu_sensitivity (); Config::instance()->add_to_history (_film->directory ()); } @@ -649,7 +651,7 @@ private: void tools_video_waveform () { if (!_video_waveform_dialog) { - _video_waveform_dialog = new VideoWaveformDialog (this, _film_viewer); + _video_waveform_dialog = new VideoWaveformDialog (this, _film, _film_viewer); } _video_waveform_dialog->Show (); diff --git a/src/wx/video_waveform_dialog.cc b/src/wx/video_waveform_dialog.cc index e4b09b8ee..412ebf8bb 100644 --- a/src/wx/video_waveform_dialog.cc +++ b/src/wx/video_waveform_dialog.cc @@ -27,8 +27,9 @@ using std::cout; using boost::bind; +using boost::weak_ptr; -VideoWaveformDialog::VideoWaveformDialog (wxWindow* parent, FilmViewer* viewer) +VideoWaveformDialog::VideoWaveformDialog (wxWindow* parent, weak_ptr<const Film> film, FilmViewer* viewer) : wxDialog ( parent, wxID_ANY, @@ -56,7 +57,18 @@ VideoWaveformDialog::VideoWaveformDialog (wxWindow* parent, FilmViewer* viewer) overall_sizer->Add (controls, 0, wxALL | wxEXPAND, DCPOMATIC_SIZER_X_GAP); - _plot = new VideoWaveformPlot (this, _viewer); + wxBoxSizer* position = new wxBoxSizer (wxHORIZONTAL); + add_label_to_sizer (position, this, _("Image X position"), true); + _x_position = new wxStaticText (this, wxID_ANY, ""); + _x_position->SetMinSize (wxSize (64, -1)); + position->Add (_x_position, 0, wxALL, DCPOMATIC_SIZER_X_GAP); + add_label_to_sizer (position, this, _("component value"), true); + _value = new wxStaticText (this, wxID_ANY, ""); + _value->SetMinSize (wxSize (64, -1)); + position->Add (_value, 0, wxALL, DCPOMATIC_SIZER_X_GAP); + overall_sizer->Add (position, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP); + + _plot = new VideoWaveformPlot (this, film, _viewer); overall_sizer->Add (_plot, 1, wxALL | wxEXPAND, 12); #ifdef DCPOMATIC_LINUX @@ -71,8 +83,9 @@ VideoWaveformDialog::VideoWaveformDialog (wxWindow* parent, FilmViewer* viewer) overall_sizer->SetSizeHints (this); Bind (wxEVT_SHOW, bind (&VideoWaveformDialog::shown, this, _1)); - _component->Bind (wxEVT_COMMAND_CHOICE_SELECTED, bind (&VideoWaveformDialog::component_changed, this)); + _component->Bind (wxEVT_COMMAND_CHOICE_SELECTED, bind (&VideoWaveformDialog::component_changed, this)); _contrast->Bind (wxEVT_SCROLL_THUMBTRACK, bind (&VideoWaveformDialog::contrast_changed, this)); + _plot->MouseMoved.connect (bind (&VideoWaveformDialog::mouse_moved, this, _1, _2, _3, _4)); _component->SetSelection (0); _contrast->SetValue (32); @@ -101,3 +114,19 @@ VideoWaveformDialog::contrast_changed () { _plot->set_contrast (_contrast->GetValue ()); } + +void +VideoWaveformDialog::mouse_moved (int x1, int x2, int y1, int y2) +{ + if (x1 != x2) { + _x_position->SetLabel (wxString::Format ("%d-%d", x1, x2)); + } else { + _x_position->SetLabel (wxString::Format ("%d", x1)); + } + + if (y1 != y2) { + _value->SetLabel (wxString::Format ("%d-%d", y1, y2)); + } else { + _value->SetLabel (wxString::Format ("%d", y1)); + } +} diff --git a/src/wx/video_waveform_dialog.h b/src/wx/video_waveform_dialog.h index c853d0cda..aa134f7a5 100644 --- a/src/wx/video_waveform_dialog.h +++ b/src/wx/video_waveform_dialog.h @@ -19,22 +19,27 @@ */ #include <wx/wx.h> +#include <boost/weak_ptr.hpp> class VideoWaveformPlot; class FilmViewer; +class Film; class VideoWaveformDialog : public wxDialog { public: - VideoWaveformDialog (wxWindow* parent, FilmViewer* viewer); + VideoWaveformDialog (wxWindow* parent, boost::weak_ptr<const Film> film, FilmViewer* viewer); private: void shown (wxShowEvent &); void component_changed (); void contrast_changed (); + void mouse_moved (int x1, int x2, int y1, int y2); FilmViewer* _viewer; VideoWaveformPlot* _plot; wxChoice* _component; wxSlider* _contrast; + wxStaticText* _x_position; + wxStaticText* _value; }; diff --git a/src/wx/video_waveform_plot.cc b/src/wx/video_waveform_plot.cc index e2083caa6..ad0498057 100644 --- a/src/wx/video_waveform_plot.cc +++ b/src/wx/video_waveform_plot.cc @@ -32,16 +32,19 @@ using std::cout; using std::min; +using std::max; using std::string; using boost::weak_ptr; using boost::shared_ptr; using dcp::locale_convert; int const VideoWaveformPlot::_vertical_margin = 8; +int const VideoWaveformPlot::_pixel_values = 4096; int const VideoWaveformPlot::_x_axis_width = 52; -VideoWaveformPlot::VideoWaveformPlot (wxWindow* parent, FilmViewer* viewer) +VideoWaveformPlot::VideoWaveformPlot (wxWindow* parent, weak_ptr<const Film> film, FilmViewer* viewer) : wxPanel (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE) + , _film (film) , _dirty (true) , _enabled (false) , _component (0) @@ -55,6 +58,7 @@ VideoWaveformPlot::VideoWaveformPlot (wxWindow* parent, FilmViewer* viewer) Bind (wxEVT_PAINT, boost::bind (&VideoWaveformPlot::paint, this)); Bind (wxEVT_SIZE, boost::bind (&VideoWaveformPlot::sized, this, _1)); + Bind (wxEVT_MOTION, boost::bind (&VideoWaveformPlot::mouse_moved, this, _1)); SetMinSize (wxSize (640, 512)); SetBackgroundColour (wxColour (0, 0, 0)); @@ -111,7 +115,7 @@ VideoWaveformPlot::paint () p.AddLineToPoint (_x_axis_width - 4, y); gc->StrokePath (p); int x = 4; - int const n = i * 4096 / label_gaps; + int const n = i * _pixel_values / label_gaps; if (n < 10) { x += extra[0]; } else if (n < 100) { @@ -153,7 +157,7 @@ VideoWaveformPlot::create_waveform () int* ip = _image->data (_component) + x; for (int y = 0; y < image_size.height; ++y) { - strip[*ip * waveform_height / 4096]++; + strip[*ip * waveform_height / _pixel_values]++; ip += image_size.width; } @@ -220,3 +224,34 @@ VideoWaveformPlot::set_contrast (int b) _dirty = true; Refresh (); } + +void +VideoWaveformPlot::mouse_moved (wxMouseEvent& ev) +{ + if (!_image) { + return; + } + + if (_dirty) { + create_waveform (); + _dirty = false; + } + + shared_ptr<const Film> film = _film.lock (); + if (!film) { + return; + } + + dcp::Size const full = film->frame_size (); + + double const xs = static_cast<double> (full.width) / _waveform->size().width; + int const x1 = max (0, min (full.width - 1, int (floor (ev.GetPosition().x - _x_axis_width - 0.5) * xs))); + int const x2 = max (0, min (full.width - 1, int (floor (ev.GetPosition().x - _x_axis_width + 0.5) * xs))); + + double const ys = static_cast<double> (_pixel_values) / _waveform->size().height; + int const fy = _waveform->size().height - (ev.GetPosition().y - _vertical_margin); + int const y1 = max (0, min (_pixel_values - 1, int (floor (fy - 0.5) * ys))); + int const y2 = max (0, min (_pixel_values - 1, int (floor (fy + 0.5) * ys))); + + MouseMoved (x1, x2, y1, y2); +} diff --git a/src/wx/video_waveform_plot.h b/src/wx/video_waveform_plot.h index 0f8bd33cd..7e9dbf709 100644 --- a/src/wx/video_waveform_plot.h +++ b/src/wx/video_waveform_plot.h @@ -29,23 +29,33 @@ namespace dcp { class PlayerVideo; class Image; +class Film; class FilmViewer; class VideoWaveformPlot : public wxPanel { public: - VideoWaveformPlot (wxWindow* parent, FilmViewer* viewer); + VideoWaveformPlot (wxWindow* parent, boost::weak_ptr<const Film> film, FilmViewer* viewer); void set_enabled (bool e); void set_component (int c); void set_contrast (int b); + /** Emitted when the mouse is moved over the waveform. The parameters + are: + - (int, int): image x range + - (int, int): component value range + */ + boost::signals2::signal<void (int, int, int, int)> MouseMoved; + private: void paint (); void sized (wxSizeEvent &); void create_waveform (); void set_image (boost::weak_ptr<PlayerVideo>); + void mouse_moved (wxMouseEvent &); + boost::weak_ptr<const Film> _film; boost::shared_ptr<dcp::OpenJPEGImage> _image; boost::shared_ptr<const Image> _waveform; bool _dirty; @@ -54,6 +64,7 @@ private: int _contrast; static int const _vertical_margin; + static int const _pixel_values; static int const _x_axis_width; boost::signals2::connection _viewer_connection; |
