split out the logic behind step editing from MidiTimeAxisView as much as possible
[ardour.git] / gtk2_ardour / step_editor.h
1 #ifndef __pbd__step_editor_h__
2 #define __pbd__step_editor_h__
3
4 #include <string>
5
6 #include <gdk/gdk.h>
7 #include <sigc++/trackable.h>
8
9 #include "pbd/signals.h"
10 #include "evoral/types.hpp"
11
12 namespace ARDOUR {
13         class MidiTrack;
14         class MidiRegion;
15 }
16
17 class MidiRegionView;
18 class MidiTimeAxisView;
19 class PublicEditor;
20 class StepEntry;
21
22 class StepEditor : public PBD::ScopedConnectionList, public sigc::trackable
23 {
24   public:
25         StepEditor (PublicEditor&, boost::shared_ptr<ARDOUR::MidiTrack>, MidiTimeAxisView&);
26         virtual ~StepEditor ();
27
28         void check_step_edit ();
29         void step_edit_rest (Evoral::MusicalTime beats);
30         void step_edit_beat_sync ();
31         void step_edit_bar_sync ();
32         int  step_add_bank_change (uint8_t channel, uint8_t bank);
33         int  step_add_program_change (uint8_t channel, uint8_t program);
34         int  step_add_note (uint8_t channel, uint8_t pitch, uint8_t velocity, 
35                             Evoral::MusicalTime beat_duration);
36         void step_edit_sustain (Evoral::MusicalTime beats);
37         bool step_edit_within_triplet () const;
38         void step_edit_toggle_triplet ();
39         bool step_edit_within_chord () const;
40         void step_edit_toggle_chord ();
41         void reset_step_edit_beat_pos ();
42         void resync_step_edit_to_edit_point ();
43         void move_step_edit_beat_pos (Evoral::MusicalTime beats);
44         void set_step_edit_cursor_width (Evoral::MusicalTime beats);
45
46         std::string name() const;
47
48         void start_step_editing ();
49         void stop_step_editing ();
50
51   private:
52         ARDOUR::framepos_t                    step_edit_insert_position;
53         Evoral::MusicalTime                   step_edit_beat_pos;
54         boost::shared_ptr<ARDOUR::MidiRegion> step_edit_region;
55         MidiRegionView*                       step_edit_region_view;
56         uint8_t                              _step_edit_triplet_countdown;
57         bool                                 _step_edit_within_chord;
58         Evoral::MusicalTime                  _step_edit_chord_duration;
59         PBD::ScopedConnection                 step_edit_region_connection;
60         PublicEditor&                        _editor;
61         boost::shared_ptr<ARDOUR::MidiTrack> _track;
62         StepEntry*                            step_editor;
63         MidiTimeAxisView&                    _mtv;
64
65         void region_removed (boost::weak_ptr<ARDOUR::Region>);
66         void playlist_changed ();
67         bool step_editor_hidden (GdkEventAny*);
68         void step_editor_hide ();
69         void resync_step_edit_position ();
70         void prepare_step_edit_region ();
71 };
72
73 #endif /* __pbd__step_editor_h__ */