X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcanvas-note-event.h;h=bf98e2b7cb9e408da2aec284f61aaa74f3219caa;hb=90ea64d1fc9e64347aca9df8c64ff0aeb674410d;hp=75747bc288d32e7577c664597b7a1b157e87093e;hpb=5b71b9333ae335644efd9754f6aae76b5bd5685b;p=ardour.git diff --git a/gtk2_ardour/canvas-note-event.h b/gtk2_ardour/canvas-note-event.h index 75747bc288..bf98e2b7cb 100644 --- a/gtk2_ardour/canvas-note-event.h +++ b/gtk2_ardour/canvas-note-event.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2007 Paul Davis - Author: Dave Robillard + Copyright (C) 2007 Paul Davis + Author: David Robillard This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,10 +24,12 @@ #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; @@ -49,9 +51,11 @@ namespace Canvas { * * A newer, better canvas should remove the need for all the ugly here. */ -class CanvasNoteEvent : public sigc::trackable, public InteractiveItem { -public: - typedef Evoral::Note NoteType; +class CanvasNoteEvent : virtual public sigc::trackable +{ + public: + typedef Evoral::Note NoteType; + CanvasNoteEvent( MidiRegionView& region, Item* item, @@ -59,72 +63,100 @@ public: virtual ~CanvasNoteEvent(); + 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(); - + /** 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; + + 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; } - - inline static uint32_t meter_style_fill_color(uint8_t vel) { - if (vel < 64) { - return UINT_INTERPOLATE( - ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorBase.get(), - ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorMid.get(), + 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_MidiNoteMeterColorMid.get(), - ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorTop.get(), + } 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) { 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]; -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; + NoEventText* _text; State _state; const boost::shared_ptr _note; - bool _own_note; bool _selected; + bool _valid; + float _mouse_x_fraction; + float _mouse_y_fraction; + uint16_t _channel_selection; + + void set_mouse_fractions (GdkEvent*); }; } // namespace Gnome