(1) remove almost-never used block/unlock_property_changes() methods from PBD::Statef...
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 21 Sep 2010 15:15:06 +0000 (15:15 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 21 Sep 2010 15:15:06 +0000 (15:15 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7823 d708f5d6-7413-0410-9779-e7cbd77b26cf

14 files changed:
gtk2_ardour/audio_streamview.cc
gtk2_ardour/canvas-note-event.cc
gtk2_ardour/canvas-note-event.h
gtk2_ardour/editor.h
gtk2_ardour/editor_canvas.cc
gtk2_ardour/editor_drag.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/editor_regions.cc
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h
gtk2_ardour/midi_streamview.cc
libs/ardour/region.cc
libs/pbd/pbd/stateful.h
libs/pbd/stateful.cc

index accc5b7ea4da2e4740939bc85ae90bfc7d795fbf..3a7f985e303a99b3d9b1ea0042258e6e68947ce4 100644 (file)
@@ -488,7 +488,7 @@ AudioStreamView::setup_rec_box ()
                                        boost::dynamic_pointer_cast<AudioRegion>(RegionFactory::create (sources, plist, false)));
 
                                assert(region);
-                               region->block_property_changes ();
+                               region->suspend_property_changes ();
                                region->set_position (_trackview.session()->transport_frame(), this);
                                rec_regions.push_back (make_pair(region, (RegionView*) 0));
                        }
index 739019b31e3bf88535f2e5aa1904e1915529ec0b..b1bfa49ab43b22f1719facbc67e98d7ccb8c6c65 100644 (file)
@@ -53,6 +53,8 @@ CanvasNoteEvent::CanvasNoteEvent(MidiRegionView& region, Item* item, const boost
        , _note(note)
        , _selected(false)
        , _valid (true)
+        , _mouse_x_fraction (-1.0)
+        , _mouse_y_fraction (-1.0)
 {
 }
 
@@ -223,6 +225,60 @@ CanvasNoteEvent::base_color()
        return 0;
 }
 
+void
+CanvasNoteEvent::set_mouse_fractions (GdkEvent* ev)
+{
+        double ix, iy;
+        double bx1, bx2, by1, by2;
+
+       switch (ev->type) {
+        case GDK_MOTION_NOTIFY:
+                ix = ev->motion.x;
+                iy = ev->motion.y;
+                break;
+        case GDK_ENTER_NOTIFY:
+                ix = ev->crossing.x;
+                iy = ev->crossing.y;
+                break;
+        case GDK_BUTTON_PRESS:
+        case GDK_BUTTON_RELEASE:
+                ix = ev->button.x;
+                iy = ev->button.y;
+                break;
+        default:
+                _mouse_x_fraction = -1.0;
+                _mouse_y_fraction = -1.0;
+                return;
+        }
+
+        _item->get_bounds (bx1, by1, bx2, by2);
+        _item->w2i (ix, iy);
+        /* hmm, something wrong here. w2i should give item-local coordinates
+           but it doesn't. for now, finesse this.
+        */
+        ix = ix - bx1;
+        iy = iy - by1;
+
+        /* fraction of width/height */
+        double xf;
+        double yf;
+        bool notify = false;
+
+        xf = ix / (bx2 - bx1);
+        yf = iy / (by2 - by1);
+
+        if (xf != _mouse_x_fraction || yf != _mouse_y_fraction) {
+                notify = true;
+        }
+
+        _mouse_x_fraction = xf;
+        _mouse_y_fraction = yf;
+
+        if (notify) {
+                _region.note_mouse_position (_mouse_x_fraction, _mouse_y_fraction);
+        }
+}
+
 bool
 CanvasNoteEvent::on_event(GdkEvent* ev)
 {
@@ -232,22 +288,21 @@ CanvasNoteEvent::on_event(GdkEvent* ev)
 
        switch (ev->type) {
        case GDK_ENTER_NOTIFY:
-               _region.note_entered(this);
+                set_mouse_fractions (ev);
+               _region.note_entered (this);
                break;
 
        case GDK_LEAVE_NOTIFY:
+                set_mouse_fractions (ev);
                _region.note_left (this);
                break;
 
         case GDK_MOTION_NOTIFY:
-                double ix, iy;
-                ix = ev->motion.x;
-                iy = ev->motion.y;
-                _item->w2i (ix, iy);
-                cerr << "note motion at " << ix << ',' << iy << endl;
+                set_mouse_fractions (ev);
                 break;
 
        case GDK_BUTTON_PRESS:
+                set_mouse_fractions (ev);
                if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state)) {
                         show_channel_selector();
                        return true;
@@ -255,6 +310,7 @@ CanvasNoteEvent::on_event(GdkEvent* ev)
                break;
 
        case GDK_BUTTON_RELEASE:
+                set_mouse_fractions (ev);
                if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state)) {
                        return true;
                }
@@ -267,6 +323,13 @@ CanvasNoteEvent::on_event(GdkEvent* ev)
        return false;
 }
 
+bool
+CanvasNoteEvent::mouse_near_ends () const
+{
+        return (_mouse_x_fraction >= 0.0 && _mouse_x_fraction < 0.25) ||
+                (_mouse_x_fraction >= 0.75 && _mouse_x_fraction < 1.0);
+}
+
 } // namespace Canvas
 } // namespace Gnome
 
index c1795c330e4a766870153030bf3eb48e5e20ea43..526739848822ae300fc7035e19ef026d5d74b291 100644 (file)
@@ -139,7 +139,9 @@ class CanvasNoteEvent : virtual public sigc::trackable
        /// hue circle divided into 16 equal-looking parts, courtesy Thorsten Wilms
        static const uint32_t midi_channel_colors[16];
 
-protected:
+        bool mouse_near_ends () const;
+  
+  protected:
        enum State { None, Pressed, Dragging };
 
        MidiRegionView&                   _region;
@@ -151,6 +153,10 @@ protected:
        bool                              _own_note;
        bool                              _selected;
        bool                              _valid;
+        float                             _mouse_x_fraction;
+        float                             _mouse_y_fraction;
+        
+        void set_mouse_fractions (GdkEvent*);
 };
 
 } // namespace Gnome
index 01bc7a09e7238548bf8ff4faf0a969e2c171b53f..56abdee4317a3f045b9ae8175d5a01cb00756849 100644 (file)
@@ -476,6 +476,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        static Gdk::Cursor* timebar_cursor;
        static Gdk::Cursor* transparent_cursor;
 
+        Gdk::Cursor* get_canvas_cursor () const { return current_canvas_cursor; }
+        void set_canvas_cursor (Gdk::Cursor*);
+
   protected:
        void map_transport_state ();
        void map_position_change (framepos_t);
@@ -686,8 +689,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Gtk::VBox           vpacker;
 
        Gdk::Cursor*          current_canvas_cursor;
-       void set_canvas_cursor ();
        Gdk::Cursor* which_grabber_cursor ();
+       void set_canvas_cursor ();
 
        ArdourCanvas::Canvas* track_canvas;
 
index 705e7efa3bcd08f7352c6a79d9139af4911cf5c5..faf2c7e19e81f8640aff7e0ea2592789d294366c 100644 (file)
@@ -917,6 +917,14 @@ Editor::horizontal_position () const
 {
        return frame_to_unit (leftmost_frame);
 }
+void
+Editor::set_canvas_cursor (Gdk::Cursor* cursor)
+{
+       if (is_drawable()) {
+               track_canvas->get_window()->set_cursor(*cursor);
+       }
+
+}
 
 bool
 Editor::track_canvas_key_press (GdkEventKey* event)
index 61d137cb98ca62825c54fcce81535967df00cf6b..f79df6bb4288ea9ea87b190bd9e3a12d1d2a89d3 100644 (file)
@@ -3769,7 +3769,7 @@ NoteDrag::finished (GdkEvent* ev, bool moved)
                        }
                }
        } else {
-               _region->note_dropped (_primary, total_dx(), total_dy());
+               _region->note_dropped (_primary, total_dx(), total_dy());
        }
 }
 
index d33db07e88aad5f3a6e05c23aeb885aded92c7a1..8adefaaa62ab55c105bcb44d528eabb47b615f24 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "ardour_ui.h"
 #include "actions.h"
+#include "canvas-note.h"
 #include "editor.h"
 #include "time_axis_view.h"
 #include "audio_time_axis.h"
@@ -677,14 +678,16 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                 case NoteItem:
                         if (internal_editing()) {
                                 /* trim notes if we're in internal edit mode and near the ends of the note */
-                                _drags->set (new NoteResizeDrag (this, item), event);
+                                ArdourCanvas::CanvasNote* cn = dynamic_cast<ArdourCanvas::CanvasNote*> (item);
+                                if (cn->mouse_near_ends()) {
+                                        _drags->set (new NoteResizeDrag (this, item), event);
+                                } else {
+                                        _drags->set (new NoteDrag (this, item), event);
+                                }
                         }
                        return true;
 
                 case StreamItem:
-                        cerr << "press on stream item, internal? " << internal_editing() << " MIDI ? "
-                             << dynamic_cast<MidiTimeAxisView*>(clicked_axisview)
-                             << endl;
                         if (internal_editing()) {
                                if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
                                        _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
@@ -718,7 +721,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                switch (item_type) {
                case NoteItem:
                        if (internal_editing()) {
-                               _drags->set (new NoteDrag (this, item), event);
+                                ArdourCanvas::CanvasNote* cn = dynamic_cast<ArdourCanvas::CanvasNote*> (item);
+                                if (cn->mouse_near_ends()) {
+                                        _drags->set (new NoteResizeDrag (this, item), event);
+                                } else {
+                                        _drags->set (new NoteDrag (this, item), event);
+                                }
                                return true;
                        }
                        break;
index 0cc8926371fb8f8c3e60e93fd5f6a053772c22a9..075d048d73c1b647a081d458cef2d0acf40c62a1 100644 (file)
@@ -89,8 +89,8 @@ EditorRegions::EditorRegions (Editor* e)
        _display.append_column (_("G"), _columns.glued);
        _display.append_column (_("M"), _columns.muted);
        _display.append_column (_("O"), _columns.opaque);
-       _display.append_column (_("Used"), _columns.used);
-       _display.append_column (_("Path"), _columns.path);
+       // _display.append_column (_("Used"), _columns.used);
+       // _display.append_column (_("Path"), _columns.path);
        _display.set_headers_visible (true);
        //_display.set_grid_lines (TREE_VIEW_GRID_LINES_BOTH);
 
@@ -461,10 +461,6 @@ EditorRegions::selection_changed ()
                                 // they could have clicked on a row that is just a placeholder, like "Hidden"
                                if (region) {
                                         
-                                        cerr << "Selected region has use count "
-                                             << _session->playlists->region_use_count (region) 
-                                             << endl;
-
                                        if (region->automatic()) {
 
                                                _display.get_selection()->unselect(*i);
index 20b93b71e51d5ca67a765ea0c873d6a0a93f84b6..94083bf73d27e071f102739483f8ec2b7bc93a1d 100644 (file)
@@ -49,6 +49,7 @@
 #include "canvas-hit.h"
 #include "canvas-note.h"
 #include "canvas-program-change.h"
+#include "editor.h"
 #include "ghostregion.h"
 #include "gui_thread.h"
 #include "keyboard.h"
@@ -2646,6 +2647,10 @@ MidiRegionView::change_channel(uint8_t channel)
 void
 MidiRegionView::note_entered(ArdourCanvas::CanvasNoteEvent* ev)
 {
+       Editor* editor = dynamic_cast<Editor*>(&trackview.editor());
+        
+        pre_enter_cursor = editor->get_canvas_cursor ();
+
        if (_mouse_state == SelectTouchDragging) {
                note_selected (ev, true);
        }
@@ -2656,17 +2661,28 @@ MidiRegionView::note_entered(ArdourCanvas::CanvasNoteEvent* ev)
 void
 MidiRegionView::note_left (ArdourCanvas::CanvasNoteEvent* note)
 {
+       Editor* editor = dynamic_cast<Editor*>(&trackview.editor());
+
        for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
                (*i)->hide_velocity ();
        }
 
-       trackview.editor().hide_verbose_canvas_cursor ();
+       editor->hide_verbose_canvas_cursor ();
+        editor->set_canvas_cursor (pre_enter_cursor);
 }
 
 void
-MidiRegionView::note_motion (float fraction)
+MidiRegionView::note_mouse_position (float x_fraction, float y_fraction)
 {
-        cerr << "Now at " << fraction << " within note\n";
+       Editor* editor = dynamic_cast<Editor*>(&trackview.editor());
+
+        if (x_fraction > 0.0 && x_fraction < 0.25) {
+                editor->set_canvas_cursor (editor->left_side_trim_cursor);
+        } else if (x_fraction >= 0.75 && x_fraction < 1.0) {
+                editor->set_canvas_cursor (editor->right_side_trim_cursor);
+        } else {
+                editor->set_canvas_cursor (pre_enter_cursor);
+        }
 }
 
 void
index c66c6dc220dc5eac7fc0fc9e5cf309b97663d36f..b2b54c5f3c9aa17947489ca10aa6465db9d3f53d 100644 (file)
@@ -190,9 +190,11 @@ class MidiRegionView : public RegionView
        void apply_diff_as_subcommand();
        void abort_command();
 
+        Gdk::Cursor* pre_enter_cursor;
+
        void   note_entered(ArdourCanvas::CanvasNoteEvent* ev);
        void   note_left(ArdourCanvas::CanvasNoteEvent* ev);
-       void   note_motion (float fraction);
+       void   note_mouse_position (float xfraction, float yfraction);
        void   unique_select(ArdourCanvas::CanvasNoteEvent* ev);
        void   note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add, bool extend=false);
        void   note_deselected(ArdourCanvas::CanvasNoteEvent* ev);
@@ -432,7 +434,6 @@ class MidiRegionView : public RegionView
         void get_events (Events& e, Evoral::Sequence<Evoral::MusicalTime>::NoteOperator op, uint8_t val, int chan_mask = 0);
 
        void display_program_changes_on_channel (uint8_t);
-
 };
 
 
index 0b47e1bb207b25877bb83746a0fcd2cbbaa08fdc..fe1f778414579d60939093c9b1105d9411e8db5b 100644 (file)
@@ -459,7 +459,7 @@ MidiStreamView::setup_rec_box ()
                                                                      (RegionFactory::create (sources, plist, false)));
 
                                assert(region);
-                               region->block_property_changes ();
+                               region->suspend_property_changes ();
                                region->set_position (_trackview.session()->transport_frame(), this);
                                rec_regions.push_back (make_pair(region, (RegionView*)0));
 
index 98f48ab80a5b8144b4121b236ec37d103e5396de..7e78475eb3cccdc5bd753d8fd84a1c488ce69930 100644 (file)
@@ -1310,7 +1310,7 @@ Region::send_change (const PropertyChange& what_changed)
 
         Stateful::send_change (what_changed);
 
-       if (!_no_property_changes) {
+       if (!Stateful::frozen()) {
                
                /* Try and send a shared_pointer unless this is part of the constructor.
                   If so, do nothing.
index 735ffbdc4a68ab8f4d97bb340ee1be9549adfebb..1f0f73b3effe804da782e0ccdef460f1c9b98ccb 100644 (file)
@@ -86,10 +86,9 @@ class Stateful {
 
        virtual void suspend_property_changes ();
        virtual void resume_property_changes ();
+        
+        virtual bool frozen() const { return _frozen; }
 
-       void unlock_property_changes () { _no_property_changes = false; }
-       void block_property_changes () { _no_property_changes = true; }
-       
   protected:
 
        void add_instant_xml (XMLNode&, const sys::path& directory_path);
@@ -108,7 +107,6 @@ class Stateful {
        XMLNode *_instant_xml;
        PBD::ID  _id;
         int32_t  _frozen;
-        bool     _no_property_changes;
        PBD::PropertyChange     _pending_changed;
         Glib::Mutex _lock;
 
index e13a499e414b385eb2165214c53035251050b954..c33418ce39fdcf82b3551aa3669e9a349e8e61d4 100644 (file)
@@ -40,7 +40,6 @@ int Stateful::loading_state_version = 0;
 
 Stateful::Stateful ()
         : _frozen (0)
-        , _no_property_changes (false)
         , _properties (new OwnedPropertyList)
 {
        _extra_xml = 0;