From 329de46d6fb600c1958678ec5d09ef21532130d5 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 11 Nov 2013 16:09:31 +0000 Subject: [PATCH] Add a couple of audio properties to the multi-select list. --- src/wx/audio_panel.cc | 69 +++++++++++++++++++---------------------- src/wx/audio_panel.h | 7 ++--- src/wx/content_widget.h | 43 ++++++++++++------------- src/wx/film_editor.cc | 3 +- 4 files changed, 59 insertions(+), 63 deletions(-) diff --git a/src/wx/audio_panel.cc b/src/wx/audio_panel.cc index 9effc4cb5..b9aa9d6df 100644 --- a/src/wx/audio_panel.cc +++ b/src/wx/audio_panel.cc @@ -50,16 +50,28 @@ AudioPanel::AudioPanel (FilmEditor* e) ++r; add_label_to_grid_bag_sizer (grid, this, _("Audio Gain"), true, wxGBPosition (r, 0)); - _gain = new wxSpinCtrl (this); - grid->Add (_gain, wxGBPosition (r, 1)); + _gain = new ContentWidget ( + this, + new wxSpinCtrl (this), + AudioContentProperty::AUDIO_GAIN, + boost::mem_fn (&AudioContent::audio_gain), + boost::mem_fn (&AudioContent::set_audio_gain) + ); + _gain->add (grid, wxGBPosition (r, 1)); add_label_to_grid_bag_sizer (grid, this, _("dB"), false, wxGBPosition (r, 2)); _gain_calculate_button = new wxButton (this, wxID_ANY, _("Calculate...")); grid->Add (_gain_calculate_button, wxGBPosition (r, 3)); ++r; add_label_to_grid_bag_sizer (grid, this, _("Audio Delay"), false, wxGBPosition (r, 0)); - _delay = new wxSpinCtrl (this); - grid->Add (_delay, wxGBPosition (r, 1)); + _delay = new ContentWidget ( + this, + new wxSpinCtrl (this), + AudioContentProperty::AUDIO_DELAY, + boost::mem_fn (&AudioContent::audio_delay), + boost::mem_fn (&AudioContent::set_audio_delay) + ); + _delay->add (grid, wxGBPosition (r,1 )); /// TRANSLATORS: this is an abbreviation for milliseconds, the unit of time add_label_to_grid_bag_sizer (grid, this, _("ms"), false, wxGBPosition (r, 2)); ++r; @@ -76,13 +88,11 @@ AudioPanel::AudioPanel (FilmEditor* e) _mapping = new AudioMappingView (this); _sizer->Add (_mapping, 1, wxEXPAND | wxALL, 6); - _gain->SetRange (-60, 60); - _delay->SetRange (-1000, 1000); + _gain->wrapped()->SetRange (-60, 60); + _delay->wrapped()->SetRange (-1000, 1000); - _delay->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&AudioPanel::delay_changed, this)); _stream->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&AudioPanel::stream_changed, this)); _show->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&AudioPanel::show_clicked, this)); - _gain->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&AudioPanel::gain_changed, this)); _gain_calculate_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&AudioPanel::gain_calculate_button_clicked, this)); _mapping->Changed.connect (boost::bind (&AudioPanel::mapping_changed, this, _1)); @@ -117,11 +127,7 @@ AudioPanel::film_content_changed (int property) _audio_dialog->set_content (acs); } - if (property == AudioContentProperty::AUDIO_GAIN) { - checked_set (_gain, acs ? acs->audio_gain() : 0); - } else if (property == AudioContentProperty::AUDIO_DELAY) { - checked_set (_delay, acs ? acs->audio_delay() : 0); - } else if (property == AudioContentProperty::AUDIO_MAPPING) { + if (property == AudioContentProperty::AUDIO_MAPPING) { _mapping->set (acs ? acs->audio_mapping () : AudioMapping ()); _sizer->Layout (); } else if (property == FFmpegContentProperty::AUDIO_STREAM) { @@ -143,28 +149,6 @@ AudioPanel::film_content_changed (int property) } } -void -AudioPanel::gain_changed () -{ - AudioContentList ac = _editor->selected_audio_content (); - if (ac.size() != 1) { - return; - } - - ac.front()->set_audio_gain (_gain->GetValue ()); -} - -void -AudioPanel::delay_changed () -{ - AudioContentList ac = _editor->selected_audio_content (); - if (ac.size() != 1) { - return; - } - - ac.front()->set_audio_delay (_delay->GetValue ()); -} - void AudioPanel::gain_calculate_button_clicked () { @@ -176,7 +160,7 @@ AudioPanel::gain_calculate_button_clicked () return; } - _gain->SetValue ( + _gain->wrapped()->SetValue ( Config::instance()->sound_processor()->db_for_fader_change ( d->wanted_fader (), d->actual_fader () @@ -186,7 +170,7 @@ AudioPanel::gain_calculate_button_clicked () /* This appears to be necessary, as the change is not signalled, I think. */ - gain_changed (); + _gain->update_from_model (); d->Destroy (); } @@ -273,5 +257,16 @@ AudioPanel::mapping_changed (AudioMapping m) void AudioPanel::content_selection_changed () { + AudioContentList sel = _editor->selected_audio_content (); + + _gain->set_content (sel); + _delay->set_content (sel); + + _show->Enable (sel.size() == 1); + _stream->Enable (sel.size() == 1); + _mapping->Enable (sel.size() == 1); + film_content_changed (AudioContentProperty::AUDIO_MAPPING); + film_content_changed (FFmpegContentProperty::AUDIO_STREAM); + film_content_changed (FFmpegContentProperty::AUDIO_STREAMS); } diff --git a/src/wx/audio_panel.h b/src/wx/audio_panel.h index 8cb94f0fa..110dc4efa 100644 --- a/src/wx/audio_panel.h +++ b/src/wx/audio_panel.h @@ -19,6 +19,7 @@ #include "lib/audio_mapping.h" #include "film_editor_panel.h" +#include "content_widget.h" class wxSpinCtrl; class wxButton; @@ -37,18 +38,16 @@ public: void content_selection_changed (); private: - void gain_changed (); void gain_calculate_button_clicked (); void show_clicked (); - void delay_changed (); void stream_changed (); void mapping_changed (AudioMapping); void setup_stream_description (); - wxSpinCtrl* _gain; + ContentWidget* _gain; wxButton* _gain_calculate_button; wxButton* _show; - wxSpinCtrl* _delay; + ContentWidget* _delay; wxChoice* _stream; wxStaticText* _description; AudioMappingView* _mapping; diff --git a/src/wx/content_widget.h b/src/wx/content_widget.h index 32fabda97..eb264eae9 100644 --- a/src/wx/content_widget.h +++ b/src/wx/content_widget.h @@ -87,6 +87,28 @@ public: _sizer->Add (_wrapped, _position); } + + void update_from_model () + { + if (_content.empty ()) { + set_single (); + return; + } + + typename List::iterator i = _content.begin (); + int const v = boost::bind (_getter, _content.front().get())(); + while (i != _content.end() && boost::bind (_getter, i->get())() == v) { + ++i; + } + + if (i == _content.end ()) { + set_single (); + checked_set (_wrapped, v); + } else { + set_multiple (); + } + } + private: void set_single () @@ -132,27 +154,6 @@ private: } } - void update_from_model () - { - if (_content.empty ()) { - set_single (); - return; - } - - typename List::iterator i = _content.begin (); - int const v = boost::bind (_getter, _content.front().get())(); - while (i != _content.end() && boost::bind (_getter, i->get())() == v) { - ++i; - } - - if (i == _content.end ()) { - set_single (); - checked_set (_wrapped, v); - } else { - set_multiple (); - } - } - void model_changed (int property) { if (property == _property && !_ignore_model_changes) { diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index fd1dd2b33..9cf840614 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -797,6 +797,7 @@ FilmEditor::setup_content_sensitivity () ContentList selection = selected_content (); VideoContentList video_selection = selected_video_content (); + AudioContentList audio_selection = selected_audio_content (); _content_remove->Enable (selection.size() == 1 && _generally_sensitive); _content_earlier->Enable (selection.size() == 1 && _generally_sensitive); @@ -804,7 +805,7 @@ FilmEditor::setup_content_sensitivity () _content_timeline->Enable (_generally_sensitive); _video_panel->Enable (video_selection.size() > 0 && _generally_sensitive); - _audio_panel->Enable (selection.size() == 1 && dynamic_pointer_cast (selection.front()) && _generally_sensitive); + _audio_panel->Enable (audio_selection.size() > 0 && _generally_sensitive); _subtitle_panel->Enable (selection.size() == 1 && dynamic_pointer_cast (selection.front()) && _generally_sensitive); _timing_panel->Enable (selection.size() == 1 && _generally_sensitive); } -- 2.30.2