X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fnote_base.h;h=d55f87c552e92591e8cfef9e83b199af2749e45c;hb=dde13d288e22ba5dd8e23802c47fac288b089c57;hp=9680091c75456e0234df81d02f554eba83da784e;hpb=8eef4b1904bcc611f5f4230927ca9eda2352d36b;p=ardour.git diff --git a/gtk2_ardour/note_base.h b/gtk2_ardour/note_base.h index 9680091c75..d55f87c552 100644 --- a/gtk2_ardour/note_base.h +++ b/gtk2_ardour/note_base.h @@ -21,11 +21,10 @@ #define __gtk_ardour_note_base_h__ #include + #include "canvas/types.h" -#include "ardour/midi_model.h" #include "rgb_macros.h" -#include "ardour_ui.h" #include "ui_config.h" class Editor; @@ -33,6 +32,7 @@ class MidiRegionView; namespace Evoral { template class Note; + class Beats; } namespace ArdourCanvas { @@ -40,33 +40,26 @@ namespace ArdourCanvas { class Text; } -/** This manages all the event handling for any MIDI event on the canvas. +/** Base class for canvas notes (sustained note rectangles and hit diamonds). * - * This is not actually a canvas item itself to avoid the dreaded diamond, - * since various types of canvas items (Note (rect), Hit (diamond), etc) - * need to share this functionality but can't share an ancestor. + * This is not actually a canvas item itself to avoid the dreaded diamond + * inheritance pattern, since various types of canvas items (Note (rect), Hit + * (diamond), etc) need to share this functionality but can't share an + * ancestor. * * Note: Because of this, derived classes need to manually bounce events to * on_event, it won't happen automatically. - * - * A newer, better canvas should remove the need for all the ugly here. */ class NoteBase : public sigc::trackable { -public: - typedef Evoral::Note NoteType; - - NoteBase ( - MidiRegionView& region, - bool, - const boost::shared_ptr note = boost::shared_ptr() - ); + public: + typedef Evoral::Note NoteType; + NoteBase (MidiRegionView& region, bool, const boost::shared_ptr note = boost::shared_ptr()); virtual ~NoteBase (); void set_item (ArdourCanvas::Item *); - - static PBD::Signal1 NoteBaseDeleted; + ArdourCanvas::Item* item() const { return _item; } virtual void show() = 0; virtual void hide() = 0; @@ -91,61 +84,52 @@ public: /** Channel selection changed */ void on_channel_selection_change(uint16_t selection); - void show_channel_selector(); - void hide_channel_selector(); - virtual void set_outline_color(uint32_t c) = 0; virtual void set_fill_color(uint32_t c) = 0; + virtual void set_ignore_events(bool ignore) = 0; + virtual ArdourCanvas::Coord x0 () const = 0; virtual ArdourCanvas::Coord y0 () const = 0; virtual ArdourCanvas::Coord x1 () const = 0; virtual ArdourCanvas::Coord y1 () const = 0; - float mouse_x_fraction() const { return _mouse_x_fraction; } - float mouse_y_fraction() const { return _mouse_y_fraction; } + float mouse_x_fraction() const { return _mouse_x_fraction; } + float mouse_y_fraction() const { return _mouse_y_fraction; } const boost::shared_ptr note() const { return _note; } MidiRegionView& region_view() const { return _region; } inline static uint32_t meter_style_fill_color(uint8_t vel, bool selected) { - if (selected) { - if (vel < 64) { - return UINT_INTERPOLATE( - ARDOUR_UI::config()->canvasvar_SelectedMidiNoteColorBase.get(), - ARDOUR_UI::config()->canvasvar_SelectedMidiNoteColorMid.get(), - (vel / (double)63.0)); - } else { - return UINT_INTERPOLATE( - ARDOUR_UI::config()->canvasvar_SelectedMidiNoteColorMid.get(), - ARDOUR_UI::config()->canvasvar_SelectedMidiNoteColorTop.get(), - ((vel-64) / (double)63.0)); - } - } else { - if (vel < 64) { - return UINT_INTERPOLATE( - ARDOUR_UI::config()->canvasvar_MidiNoteColorBase.get(), - ARDOUR_UI::config()->canvasvar_MidiNoteColorMid.get(), - (vel / (double)63.0)); - } else { - return UINT_INTERPOLATE( - ARDOUR_UI::config()->canvasvar_MidiNoteColorMid.get(), - ARDOUR_UI::config()->canvasvar_MidiNoteColorTop.get(), - ((vel-64) / (double)63.0)); - } - } + if (selected) { + return UIConfiguration::instance().color_mod ("midi note selected", "midi note"); + } else if (vel < 64) { + return UINT_INTERPOLATE( + UIConfiguration::instance().color_mod ("midi note min", "midi note"), + UIConfiguration::instance().color_mod ("midi note mid", "midi note"), + (vel / (double)63.0)); + } else { + return UINT_INTERPOLATE( + UIConfiguration::instance().color_mod ("midi note mid", "midi note"), + UIConfiguration::instance().color_mod ("midi note max", "midi note"), + ((vel-64) / (double)63.0)); + } } /// calculate outline colors from fill colors of notes - inline static uint32_t calculate_outline(uint32_t color) { - return UINT_INTERPOLATE(color, 0x000000ff, 0.5); + inline static uint32_t calculate_outline(uint32_t color, bool selected=false) { + if (selected) { + return UIConfiguration::instance().color ("midi note selected outline"); + } else { + return UINT_INTERPOLATE(color, 0x000000ff, 0.5); + } } /// hue circle divided into 16 equal-looking parts, courtesy Thorsten Wilms static const uint32_t midi_channel_colors[16]; - bool mouse_near_ends () const; - bool big_enough_to_trim () const; + bool mouse_near_ends () const; + virtual bool big_enough_to_trim () const; protected: enum State { None, Pressed, Dragging }; @@ -153,17 +137,16 @@ protected: MidiRegionView& _region; ArdourCanvas::Item* _item; ArdourCanvas::Text* _text; -// Widget* _channel_selector_widget; State _state; const boost::shared_ptr _note; bool _with_events; bool _own_note; bool _selected; bool _valid; - float _mouse_x_fraction; - float _mouse_y_fraction; - - void set_mouse_fractions (GdkEvent*); + float _mouse_x_fraction; + float _mouse_y_fraction; + + void set_mouse_fractions (GdkEvent*); private: bool event_handler (GdkEvent *);