X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcanvas-note-event.h;h=24e7c78834d96ee45274c1abb1967b8f8fa4e763;hb=ad942b104a80c74c689e0c1b5c016d1870850830;hp=748c50efd4d875874824aa24a59806b6fcf4cdd6;hpb=e2147fbc5bf0546fcafa32fe1d87f6e6d1b652c4;p=ardour.git diff --git a/gtk2_ardour/canvas-note-event.h b/gtk2_ardour/canvas-note-event.h index 748c50efd4..24e7c78834 100644 --- a/gtk2_ardour/canvas-note-event.h +++ b/gtk2_ardour/canvas-note-event.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2007 Paul Davis + Copyright (C) 2007 Paul Davis Author: Dave Robillard This program is free software; you can redistribute it and/or modify @@ -24,15 +24,17 @@ #include #include +#include "ardour/midi_model.h" + #include "rgb_macros.h" #include "ardour_ui.h" +#include "canvas-noevent-text.h" #include "ui_config.h" -#include "interactive-item.h" class Editor; class MidiRegionView; -namespace Evoral { class Note; } +namespace Evoral { template class Note; } namespace Gnome { namespace Canvas { @@ -49,81 +51,116 @@ namespace Canvas { * * A newer, better canvas should remove the need for all the ugly here. */ -class CanvasNoteEvent : public sigc::trackable, public InteractiveItem { -public: +class CanvasNoteEvent : virtual public sigc::trackable +{ + public: + typedef Evoral::Note NoteType; + CanvasNoteEvent( - MidiRegionView& region, - Item* item, - const boost::shared_ptr note = boost::shared_ptr()); + MidiRegionView& region, + Item* item, + const boost::shared_ptr note = boost::shared_ptr()); virtual ~CanvasNoteEvent(); - bool on_event(GdkEvent* ev); + static PBD::Signal1 CanvasNoteEventDeleted; + + virtual void show() = 0; + virtual void hide() = 0; + virtual bool on_event(GdkEvent* ev); + + bool valid() const { return _valid; } + void invalidate (); + void validate (); bool selected() const { return _selected; } - void selected(bool yn); + void set_selected(bool yn); + + virtual void move_event(double dx, double dy) = 0; - void move_event(double dx, double dy); - uint32_t base_color(); - + void show_velocity(); void hide_velocity(); - - /** - * This slot is called, when a new channel is selected for the single event - * */ + + /** Channel changed for this specific event */ void on_channel_change(uint8_t channel); + + /** 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 double x1() = 0; - virtual double y1() = 0; - virtual double x2() = 0; - virtual double y2() = 0; - - const boost::shared_ptr note() const { return _note; } - - inline static uint32_t meter_style_fill_color(uint8_t vel) - { - if (vel < 64) { - return UINT_INTERPOLATE( - ARDOUR_UI::config()->canvasvar_MeterColorBase.get(), - ARDOUR_UI::config()->canvasvar_MeterColorMid.get(), + + virtual double x1() const = 0; + virtual double y1() const = 0; + virtual double x2() const = 0; + virtual double y2() const = 0; + + 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_MeterColorMid.get(), - ARDOUR_UI::config()->canvasvar_MeterColorTop.get(), + } 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)); + } + } } - + /// calculate outline colors from fill colors of notes - inline static uint32_t calculate_outline(uint32_t color) - { + inline static uint32_t calculate_outline(uint32_t color) { return UINT_INTERPOLATE(color, 0x000000ff, 0.5); } - - /// dividing the hue circle in 16 parts, hand adjusted for equal look, courtesy Thorsten Wilms + + /// 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; + bool big_enough_to_trim () const; + + protected: enum State { None, Pressed, Dragging }; - MidiRegionView& _region; - Item* const _item; - InteractiveText* _text; - Widget* _channel_selector_widget; - State _state; - const boost::shared_ptr _note; - bool _own_note; - bool _selected; + MidiRegionView& _region; + Item* const _item; + NoEventText* _text; + Widget* _channel_selector_widget; + State _state; + const boost::shared_ptr _note; + bool _own_note; + bool _selected; + bool _valid; + float _mouse_x_fraction; + float _mouse_y_fraction; + + void set_mouse_fractions (GdkEvent*); }; } // namespace Gnome