substantive change to try to provide some rationality for region gain line visibility...
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 29 May 2012 18:30:10 +0000 (18:30 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 29 May 2012 18:30:10 +0000 (18:30 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@12478 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/audio_region_view.cc
gtk2_ardour/audio_region_view.h
gtk2_ardour/automation_line.cc
gtk2_ardour/automation_line.h
gtk2_ardour/automation_region_view.cc
gtk2_ardour/automation_time_axis.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_actions.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/editor_ops.cc

index 8feb1ac52ecb36f758c06fd308d823f89932d854..ec0a230f49eee5c3879db6209feb36c60bc7aff6 100644 (file)
@@ -199,13 +199,8 @@ AudioRegionView::init (Gdk::Color const & basic_color, bool wfd)
        if (!Profile->get_sae()) {
                gain_line.reset (new AudioRegionGainLine (line_name, *this, *group, audio_region()->envelope()));
        }
-
-       if (Config->get_show_region_gain()) {
-               gain_line->show ();
-       } else {
-               gain_line->hide ();
-       }
-
+       
+       gain_line->set_visibility (automation_line_visibility());
        gain_line->reset ();
 
        set_height (trackview.current_height());
@@ -499,9 +494,7 @@ AudioRegionView::set_height (gdouble height)
                if ((height/wcnt) < NAME_HIGHLIGHT_THRESH) {
                        gain_line->hide ();
                } else {
-                       if (Config->get_show_region_gain ()) {
-                               gain_line->show ();
-                       }
+                       gain_line->set_visibility (automation_line_visibility());
                }
 
                gain_line->set_height ((uint32_t) rint (height - NAME_HIGHLIGHT_SIZE) - 2);
@@ -858,19 +851,15 @@ void
 AudioRegionView::unhide_envelope ()
 {
        if (gain_line) {
-               gain_line->show ();
+               gain_line->set_visibility (automation_line_visibility());
        }
 }
 
 void
-AudioRegionView::set_envelope_visible (bool yn)
+AudioRegionView::update_envelope_visible ()
 {
        if (gain_line) {
-               if (yn) {
-                       gain_line->show ();
-               } else {
-                       gain_line->hide ();
-               }
+               gain_line->set_visibility (automation_line_visibility());
        }
 }
 
@@ -1035,7 +1024,7 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev)
 
        /* don't create points that can't be seen */
 
-       set_envelope_visible (true);
+       gain_line->set_visibility (automation_line_visibility());
 
        x = ev->button.x;
        y = ev->button.y;
@@ -1222,9 +1211,9 @@ AudioRegionView::entered (bool internal_editing)
 {
        trackview.editor().set_current_trimmable (_region);
        trackview.editor().set_current_movable (_region);
-
-       if (gain_line && Config->get_show_region_gain ()) {
-               gain_line->show_all_control_points ();
+       
+       if (gain_line && trackview.editor().current_mouse_mode() == Editing::MouseGain) {
+               gain_line->add_visibility (AutomationLine::ControlPoints);
        }
 
        if (fade_in_handle && !internal_editing) {
@@ -1239,8 +1228,8 @@ AudioRegionView::exited ()
        trackview.editor().set_current_trimmable (boost::shared_ptr<Trimmable>());
        trackview.editor().set_current_movable (boost::shared_ptr<Movable>());
 
-       if (gain_line) {
-               gain_line->hide_all_but_selected_control_points ();
+       if (gain_line && trackview.editor().current_mouse_mode() == Editing::MouseGain) {
+               gain_line->remove_visibility (AutomationLine::ControlPoints);
        }
 
        if (fade_in_handle) {
@@ -1812,3 +1801,12 @@ AudioRegionView::drag_end ()
        /* fades will be redrawn if they changed */
 }
 
+AutomationLine::VisibleAspects
+AudioRegionView::automation_line_visibility () const
+{
+       if (Config->get_show_region_gain() || trackview.editor().current_mouse_mode() == Editing::MouseGain) {
+               return AutomationLine::Line;
+       } else {
+               return AutomationLine::VisibleAspects (0);
+       }
+}
index 5e41c382bb780316b0bf63db96f20886289bf4a6..8a3a8d2394c13edc80e2d6d7008d1b3eced4c409 100644 (file)
@@ -79,7 +79,7 @@ class AudioRegionView : public RegionView
        void temporarily_hide_envelope (); ///< Dangerous!
        void unhide_envelope ();           ///< Dangerous!
 
-       void set_envelope_visible (bool);
+       void update_envelope_visible ();
        void set_waveform_visible (bool yn);
        void set_waveform_shape (ARDOUR::WaveformShape);
        void set_waveform_scale (ARDOUR::WaveformScale);
@@ -198,6 +198,8 @@ class AudioRegionView : public RegionView
 
        void transients_changed();
 
+       AutomationLine::VisibleAspects automation_line_visibility () const;
+
 private:
        void setup_fade_handle_positions ();
 
index 72bc1a69e3b250f8555a1e524231584e16ee0f15..54755d36c5d4c5cfbe8889f8fdc40e06f3695e82 100644 (file)
@@ -76,11 +76,11 @@ AutomationLine::AutomationLine (const string& name, TimeAxisView& tv, ArdourCanv
                _our_time_converter = true;
        }
        
-       points_visible = false;
+       _visible = Line;
+
        update_pending = false;
        _uses_gain_mapping = false;
        no_draw = false;
-       _visible = true;
        _is_boolean = false;
        terminal_points_can_slide = true;
        _height = 0;
@@ -135,27 +135,36 @@ AutomationLine::queue_reset ()
 void
 AutomationLine::show ()
 {
-       if (alist->interpolation() != AutomationList::Discrete) {
-               line->show();
+       if (_visible & Line) {
+               if (alist->interpolation() != AutomationList::Discrete) {
+                       line->show();
+               } else {
+                       line->hide ();
+               }
+       } else {
+               line->hide();
        }
 
-       if (points_visible) {
+       if (_visible & ControlPoints) {
                for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
+                       (*i)->set_visible (true);
                        (*i)->show ();
                }
+       } else if (_visible & SelectedControlPoints) {
+               for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
+                       (*i)->set_visible ((*i)->get_selected());
+               }
+       } else {
+               for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
+                       (*i)->set_visible (false);
+               }
        }
-
-       _visible = true;
 }
 
 void
 AutomationLine::hide ()
 {
-       line->hide();
-       for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
-               (*i)->hide();
-       }
-       _visible = false;
+       set_visibility (VisibleAspects (0));
 }
 
 double
@@ -895,44 +904,31 @@ AutomationLine::set_list (boost::shared_ptr<ARDOUR::AutomationList> list)
 }
 
 void
-AutomationLine::show_all_control_points ()
+AutomationLine::add_visibility (VisibleAspects va)
 {
-       if (_is_boolean) {
-               // show the line but don't allow any control points
-               return;
-       }
-
-       points_visible = true;
-
-       for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
-               if (!(*i)->visible()) {
-                       (*i)->show ();
-                       (*i)->set_visible (true);
-               }
-       }
+       _visible = VisibleAspects (_visible | va);
+       show ();
 }
 
 void
-AutomationLine::hide_all_but_selected_control_points ()
+AutomationLine::set_visibility (VisibleAspects va)
 {
-       if (alist->interpolation() == AutomationList::Discrete) {
-               return;
-       }
-
-       points_visible = false;
+       _visible = va;
+       show ();
+}
 
-       for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
-               if (!(*i)->get_selected()) {
-                       (*i)->set_visible (false);
-               }
-       }
+void
+AutomationLine::remove_visibility (VisibleAspects va)
+{
+       _visible = VisibleAspects (_visible & ~va);
+       show ();
 }
 
 void
 AutomationLine::track_entered()
 {
        if (alist->interpolation() != AutomationList::Discrete) {
-               show_all_control_points();
+               add_visibility (ControlPoints);
        }
 }
 
@@ -940,7 +936,7 @@ void
 AutomationLine::track_exited()
 {
        if (alist->interpolation() != AutomationList::Discrete) {
-               hide_all_but_selected_control_points();
+               remove_visibility (ControlPoints);
        }
 }
 
@@ -1011,11 +1007,10 @@ void
 AutomationLine::interpolation_changed (AutomationList::InterpolationStyle style)
 {
        if (style == AutomationList::Discrete) {
-               show_all_control_points();
+               set_visibility (ControlPoints);
                line->hide();
        } else {
-               hide_all_but_selected_control_points();
-               line->show();
+               set_visibility (Line);
        }
 }
 
@@ -1059,13 +1054,11 @@ AutomationLine::add_visible_control_point (uint32_t view_index, uint32_t pi, dou
 
        /* finally, control visibility */
 
-       if (_visible && points_visible) {
+       if (_visible & ControlPoints) {
                control_points[view_index]->show ();
                control_points[view_index]->set_visible (true);
        } else {
-               if (!points_visible) {
-                       control_points[view_index]->set_visible (false);
-               }
+               control_points[view_index]->set_visible (false);
        }
 }
 
index bee78c4ef51524061c7facf4e415784aefcea1b7..43bfd04d1ddf8b8d23eb09ee7116d6e742159e13 100644 (file)
@@ -57,6 +57,12 @@ namespace Gnome {
 class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
 {
   public:
+       enum VisibleAspects {
+               Line = 0x1,
+               ControlPoints = 0x2,
+               SelectedControlPoints = 0x4
+       };
+       
        AutomationLine (const std::string& name, TimeAxisView&, ArdourCanvas::Group&,
                        boost::shared_ptr<ARDOUR::AutomationList>,
                        Evoral::TimeConverter<double, ARDOUR::framepos_t>* converter = 0);
@@ -85,17 +91,20 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
        uint32_t npoints() const { return control_points.size(); }
 
        std::string  name()    const { return _name; }
-       bool    visible() const { return _visible; }
+       bool    visible() const { return _visible != VisibleAspects(0); }
        guint32 height()  const { return _height; }
 
        void     set_line_color (uint32_t);
        uint32_t get_line_color() const { return _line_color; }
 
-       void    show ();
-       void    hide ();
-       void    set_height (guint32);
-       void    set_uses_gain_mapping (bool yn);
-       bool    get_uses_gain_mapping () const { return _uses_gain_mapping; }
+       void set_visibility (VisibleAspects);
+       void add_visibility (VisibleAspects);
+       void remove_visibility (VisibleAspects);
+
+       void hide ();
+       void set_height (guint32);
+       void set_uses_gain_mapping (bool yn);
+       bool get_uses_gain_mapping () const { return _uses_gain_mapping; }
 
        TimeAxisView& trackview;
 
@@ -113,9 +122,6 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
        void set_list(boost::shared_ptr<ARDOUR::AutomationList> list);
        boost::shared_ptr<ARDOUR::AutomationList> the_list() const { return alist; }
 
-       void show_all_control_points ();
-       void hide_all_but_selected_control_points ();
-
        void track_entered();
        void track_exited();
 
@@ -157,13 +163,13 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
        /** true if _time_converter belongs to us (ie we should delete it on destruction) */
        bool _our_time_converter;
 
-       bool    _visible                  : 1;
+       VisibleAspects _visible;
+
        bool    _uses_gain_mapping        : 1;
        bool    terminal_points_can_slide : 1;
        bool    update_pending            : 1;
        bool    no_draw                   : 1;
        bool    _is_boolean               : 1;
-       bool    points_visible            : 1;
        bool    did_push;
 
        ArdourCanvas::Group&        _parent_group;
@@ -195,6 +201,7 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
         */
        ARDOUR::framecnt_t _offset;
 
+       void show ();
        void reset_line_coords (ControlPoint&);
        void add_visible_control_point (uint32_t, uint32_t, double, double, ARDOUR::AutomationList::iterator, uint32_t);
        double control_point_box_size ();
index 0fb22b05bc421d175a0367ba6d987fc4854384ae..5c9fc767dfa04354713d853602e495295ce01e7b 100644 (file)
@@ -89,8 +89,7 @@ AutomationRegionView::create_line (boost::shared_ptr<ARDOUR::AutomationList> lis
                                &_source_relative_time_converter));
        _line->set_colors();
        _line->set_height ((uint32_t)rint(trackview.current_height() - NAME_HIGHLIGHT_SIZE));
-       _line->show();
-       _line->show_all_control_points();
+       _line->set_visibility (AutomationLine::VisibleAspects (AutomationLine::Line|AutomationLine::ControlPoints));
        _line->set_maximum_time (_region->length());
        _line->set_offset (_region->start ());
 }
index e0d53e170770c473065987527a5e610e7de778c6..7c9f38aa0f2a5fe5826eaaae143b20bf9075f942 100644 (file)
@@ -730,7 +730,7 @@ AutomationTimeAxisView::add_line (boost::shared_ptr<AutomationLine> line)
        /* pick up the current state */
        automation_state_changed ();
 
-       line->show();
+       line->add_visibility (AutomationLine::Line);
 }
 
 void
index 2e203e9c75120493126d1f660da190731f953005..1953bb27ea57a61ad207cbaecb4d308eab003d19 100644 (file)
@@ -1951,8 +1951,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        gint left_automation_track ();
 
        void reset_canvas_action_sensitivity (bool);
-       void set_gain_envelope_visibility (bool);
-       void set_region_gain_visibility (RegionView*, bool);
+       void set_gain_envelope_visibility ();
+       void set_region_gain_visibility (RegionView*);
        void toggle_gain_envelope_active ();
        void reset_region_gain_envelopes ();
 
index 074d51428e10fea75d396f5b4caa7b2288a3f86f..00ea296e61cce8544c882821c0269a3934739109 100644 (file)
@@ -1483,7 +1483,7 @@ Editor::parameter_changed (std::string p)
                        }
                }
        } else if (p == "show-region-gain") {
-               set_gain_envelope_visibility (Config->get_show_region_gain ());
+               set_gain_envelope_visibility ();
        }
 }
 
index b5c7635265090fc8f0805f282e643608475ce0d0..5b718f49f06e53a78bf9deecf78fb8163eabb311 100644 (file)
@@ -473,6 +473,8 @@ Editor::mouse_mode_toggled (MouseMode m)
        }
 
        set_canvas_cursor ();
+       cerr << "mouse-driven sgev\n";
+       set_gain_envelope_visibility ();
 
        MouseModeChanged (); /* EMIT SIGNAL */
 }
index de24266374c77296d5c7ba0bef7e8bda1792f37c..bd1ee9d1c936f392c9505be419bfec6bc110d1bc 100644 (file)
@@ -4851,16 +4851,16 @@ Editor::reset_region_gain_envelopes ()
 }
 
 void
-Editor::set_region_gain_visibility (RegionView* rv, bool yn)
+Editor::set_region_gain_visibility (RegionView* rv)
 {
        AudioRegionView* arv = dynamic_cast<AudioRegionView*> (rv);
        if (arv) {
-               arv->set_envelope_visible (yn);
+               arv->update_envelope_visible ();
        }
 }
 
 void
-Editor::set_gain_envelope_visibility (bool yn)
+Editor::set_gain_envelope_visibility ()
 {
        if (!_session) {
                return;
@@ -4869,7 +4869,7 @@ Editor::set_gain_envelope_visibility (bool yn)
        for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
                AudioTimeAxisView* v = dynamic_cast<AudioTimeAxisView*>(*i);
                if (v) {
-                       v->audio_view()->foreach_regionview (sigc::bind (sigc::mem_fun (this, &Editor::set_region_gain_visibility), yn));
+                       v->audio_view()->foreach_regionview (sigc::mem_fun (this, &Editor::set_region_gain_visibility));
                }
        }
 }