13
0

Simplify management of waveform visibility / shape / scale;

fixes #4727, I think.


git-svn-id: svn://localhost/ardour2/branches/3.0@12743 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2012-06-17 11:48:51 +00:00
parent 00f51c6abf
commit 0c714fe3de
4 changed files with 47 additions and 180 deletions

View File

@ -83,9 +83,9 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView
, end_xfade_out (0)
, end_xfade_rect (0)
, _amplitude_above_axis(1.0)
, _flags(0)
, fade_color(0)
{
Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context());
}
AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, boost::shared_ptr<AudioRegion> r, double spu,
@ -104,9 +104,9 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView
, end_xfade_out (0)
, end_xfade_rect (0)
, _amplitude_above_axis(1.0)
, _flags(0)
, fade_color(0)
{
Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context());
}
AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_ptr<AudioRegion> other_region)
@ -123,7 +123,6 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt
, end_xfade_out (0)
, end_xfade_rect (0)
, _amplitude_above_axis (other._amplitude_above_axis)
, _flags (other._flags)
, fade_color(0)
{
Gdk::Color c;
@ -133,6 +132,8 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt
c.set_rgb_p (r/255.0, g/255.0, b/255.0);
init (c, true);
Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context());
}
void
@ -143,17 +144,7 @@ AudioRegionView::init (Gdk::Color const & basic_color, bool wfd)
RegionView::init (basic_color, wfd);
XMLNode *node;
_amplitude_above_axis = 1.0;
_flags = 0;
if ((node = _region->extra_xml ("GUI")) != 0) {
set_flags (node);
} else {
_flags = WaveformVisible;
store_flags ();
}
compute_colors (basic_color);
@ -230,6 +221,10 @@ AudioRegionView::init (Gdk::Color const & basic_color, bool wfd)
set_colors ();
setup_waveform_visibility ();
setup_waveform_shape ();
setup_waveform_scale ();
/* XXX sync mark drag? */
}
@ -765,8 +760,8 @@ AudioRegionView::set_samples_per_unit (gdouble spu)
{
RegionView::set_samples_per_unit (spu);
if (_flags & WaveformVisible) {
for (uint32_t n=0; n < waves.size(); ++n) {
if (Config->get_show_waveforms ()) {
for (uint32_t n = 0; n < waves.size(); ++n) {
waves[n]->property_samples_per_unit() = spu;
}
}
@ -818,25 +813,20 @@ AudioRegionView::set_colors ()
}
void
AudioRegionView::set_waveform_visible (bool yn)
AudioRegionView::setup_waveform_visibility ()
{
if (((_flags & WaveformVisible) != yn)) {
if (yn) {
for (uint32_t n=0; n < waves.size(); ++n) {
/* make sure the zoom level is correct, since we don't update
this when waveforms are hidden.
*/
waves[n]->property_samples_per_unit() = samples_per_unit;
waves[n]->show();
}
_flags |= WaveformVisible;
} else {
for (uint32_t n=0; n < waves.size(); ++n) {
waves[n]->hide();
}
_flags &= ~WaveformVisible;
if (Config->get_show_waveforms ()) {
for (uint32_t n = 0; n < waves.size(); ++n) {
/* make sure the zoom level is correct, since we don't update
this when waveforms are hidden.
*/
waves[n]->property_samples_per_unit() = samples_per_unit;
waves[n]->show();
}
} else {
for (uint32_t n = 0; n < waves.size(); ++n) {
waves[n]->hide();
}
store_flags ();
}
}
@ -971,10 +961,10 @@ AudioRegionView::create_one_wave (uint32_t which, bool /*direct*/)
wave->property_zero_color() = ARDOUR_UI::config()->canvasvar_ZeroLine.get();
wave->property_zero_line() = true;
wave->property_region_start() = _region->start();
wave->property_rectified() = (bool) (_flags & WaveformRectified);
wave->property_logscaled() = (bool) (_flags & WaveformLogScaled);
wave->property_rectified() = Config->get_waveform_shape() == Rectified;
wave->property_logscaled() = Config->get_waveform_scale() == Logarithmic;
if (!(_flags & WaveformVisible)) {
if (!Config->get_show_waveforms ()) {
wave->hide();
}
@ -1079,90 +1069,18 @@ AudioRegionView::remove_gain_point_event (ArdourCanvas::Item *item, GdkEvent */*
}
void
AudioRegionView::store_flags()
AudioRegionView::setup_waveform_shape ()
{
XMLNode *node = new XMLNode ("GUI");
node->add_property ("waveform-visible", (_flags & WaveformVisible) ? "yes" : "no");
node->add_property ("waveform-rectified", (_flags & WaveformRectified) ? "yes" : "no");
node->add_property ("waveform-logscaled", (_flags & WaveformLogScaled) ? "yes" : "no");
_region->add_extra_xml (*node);
}
void
AudioRegionView::set_flags (XMLNode* node)
{
XMLProperty *prop;
if ((prop = node->property ("waveform-visible")) != 0) {
if (string_is_affirmative (prop->value())) {
_flags |= WaveformVisible;
}
}
if ((prop = node->property ("waveform-rectified")) != 0) {
if (string_is_affirmative (prop->value())) {
_flags |= WaveformRectified;
}
}
if ((prop = node->property ("waveform-logscaled")) != 0) {
if (string_is_affirmative (prop->value())) {
_flags |= WaveformLogScaled;
}
for (vector<WaveView *>::iterator wave = waves.begin(); wave != waves.end() ; ++wave) {
(*wave)->property_rectified() = Config->get_waveform_shape() == Rectified;
}
}
void
AudioRegionView::set_waveform_shape (WaveformShape shape)
AudioRegionView::setup_waveform_scale ()
{
bool yn;
/* this slightly odd approach is to leave the door open to
other "shapes" such as spectral displays, etc.
*/
switch (shape) {
case Rectified:
yn = true;
break;
default:
yn = false;
break;
}
if (yn != (bool) (_flags & WaveformRectified)) {
for (vector<WaveView *>::iterator wave = waves.begin(); wave != waves.end() ; ++wave) {
(*wave)->property_rectified() = yn;
}
if (yn) {
_flags |= WaveformRectified;
} else {
_flags &= ~WaveformRectified;
}
store_flags ();
}
}
void
AudioRegionView::set_waveform_scale (WaveformScale scale)
{
bool yn = (scale == Logarithmic);
if (yn != (bool) (_flags & WaveformLogScaled)) {
for (vector<WaveView *>::iterator wave = waves.begin(); wave != waves.end() ; ++wave) {
(*wave)->property_logscaled() = yn;
}
if (yn) {
_flags |= WaveformLogScaled;
} else {
_flags &= ~WaveformLogScaled;
}
store_flags ();
for (vector<WaveView *>::iterator wave = waves.begin(); wave != waves.end() ; ++wave) {
(*wave)->property_logscaled() = Config->get_waveform_scale() == Logarithmic;
}
}
@ -1811,3 +1729,14 @@ AudioRegionView::drag_end ()
_hidden_xfades.clear ();
}
void
AudioRegionView::parameter_changed (string const & p)
{
if (p == "show-waveforms") {
setup_waveform_visibility ();
} else if (p == "waveform-scale") {
setup_waveform_scale ();
} else if (p == "waveform-shape") {
setup_waveform_shape ();
}
}

View File

@ -80,13 +80,6 @@ class AudioRegionView : public RegionView
void unhide_envelope (); ///< Dangerous!
void update_envelope_visibility ();
void set_waveform_visible (bool yn);
void set_waveform_shape (ARDOUR::WaveformShape);
void set_waveform_scale (ARDOUR::WaveformScale);
bool waveform_rectified() const { return _flags & WaveformRectified; }
bool waveform_logscaled() const { return _flags & WaveformLogScaled; }
bool waveform_visible() const { return _flags & WaveformVisible; }
void add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *event);
void remove_gain_point_event (ArdourCanvas::Item *item, GdkEvent *event);
@ -165,7 +158,6 @@ class AudioRegionView : public RegionView
double _amplitude_above_axis;
uint32_t _flags;
uint32_t fade_color;
void reset_fade_shapes ();
@ -183,8 +175,6 @@ class AudioRegionView : public RegionView
void create_one_wave (uint32_t, bool);
void peaks_ready_handler (uint32_t);
void set_flags (XMLNode *);
void store_flags ();
void set_colors ();
void compute_colors (Gdk::Color const &);
@ -203,6 +193,11 @@ class AudioRegionView : public RegionView
private:
void setup_fade_handle_positions ();
void parameter_changed (std::string const &);
void setup_waveform_visibility ();
void setup_waveform_shape ();
void setup_waveform_scale ();
/** A ScopedConnection for each PeaksReady callback (one per channel). Each member
* may be 0 if no connection exists.
*/

View File

@ -60,8 +60,6 @@ AudioStreamView::AudioStreamView (AudioTimeAxisView& tv)
{
color_handler ();
_amplitude_above_axis = 1.0;
Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioStreamView::parameter_changed, this, _1), gui_context());
}
int
@ -132,10 +130,6 @@ AudioStreamView::create_region_view (boost::shared_ptr<Region> r, bool wait_for_
region_view->set_sensitive (false);
}
region_view->set_waveform_scale (Config->get_waveform_scale ());
region_view->set_waveform_shape (Config->get_waveform_shape ());
region_view->set_waveform_visible (Config->get_show_waveforms ());
return region_view;
}
@ -208,38 +202,6 @@ AudioStreamView::redisplay_track ()
layer_regions();
}
void
AudioStreamView::set_show_waveforms (bool yn)
{
for (list<RegionView *>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv) {
arv->set_waveform_visible (yn);
}
}
}
void
AudioStreamView::set_waveform_shape (WaveformShape shape)
{
for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv)
arv->set_waveform_shape (shape);
}
}
void
AudioStreamView::set_waveform_scale (WaveformScale scale)
{
for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv) {
arv->set_waveform_scale (scale);
}
}
}
void
AudioStreamView::setup_rec_box ()
{
@ -572,16 +534,3 @@ AudioStreamView::color_handler ()
}
}
}
void
AudioStreamView::parameter_changed (string const & p)
{
if (p == "show-waveforms") {
set_show_waveforms (Config->get_show_waveforms ());
} else if (p == "waveform-scale") {
set_waveform_scale (Config->get_waveform_scale ());
} else if (p == "waveform-shape") {
set_waveform_shape (Config->get_waveform_shape ());
}
}

View File

@ -56,8 +56,6 @@ class AudioStreamView : public StreamView
int set_amplitude_above_axis (gdouble app);
gdouble get_amplitude_above_axis () { return _amplitude_above_axis; }
void set_show_waveforms (bool yn);
void show_all_fades ();
void hide_all_fades ();
@ -77,10 +75,6 @@ class AudioStreamView : public StreamView
void color_handler ();
void parameter_changed (std::string const &);
void set_waveform_shape (ARDOUR::WaveformShape);
void set_waveform_scale (ARDOUR::WaveformScale);
double _amplitude_above_axis;
std::map<boost::shared_ptr<ARDOUR::Source>, bool> rec_data_ready_map;