X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcanvas-note-event.h;h=541cacf6a976af8d145a6d4d0414ccee3ea9b479;hb=c78528dcea03a61685ad0586eaa6302847af6fe9;hp=776d89160d5e794fdbf25154dc3ef25f582b3849;hpb=cb94baf6f4033b79fcb61da2de90b4d9c478d152;p=ardour.git diff --git a/gtk2_ardour/canvas-note-event.h b/gtk2_ardour/canvas-note-event.h index 776d89160d..541cacf6a9 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 @@ -20,15 +20,22 @@ #ifndef __gtk_ardour_canvas_midi_event_h__ #define __gtk_ardour_canvas_midi_event_h__ -#include "simplerect.h" -#include "midi_channel_selector.h" +#include #include #include -#include + +#include "ardour/midi_model.h" + +#include "rgb_macros.h" +#include "ardour_ui.h" +#include "canvas-noevent-text.h" +#include "ui_config.h" class Editor; class MidiRegionView; +namespace Evoral { template class Note; } + namespace Gnome { namespace Canvas { @@ -44,56 +51,116 @@ namespace Canvas { * * A newer, better canvas should remove the need for all the ugly here. */ -class CanvasNoteEvent : public sigc::trackable { -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; + + uint32_t base_color(); - void move_event(double dx, double dy); - 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; } -protected: + 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_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) { + 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; + + protected: enum State { None, Pressed, Dragging }; - MidiRegionView& _region; - Item* const _item; - Text* _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