#include "pbd/stacktrace.h"
-#include "ardour/audioplaylist.h"
-#include "ardour/audioregion.h"
-#include "ardour/region_factory.h"
#include "ardour/midi_region.h"
+#include "ardour/region_factory.h"
#include "editor.h"
#include "keyboard.h"
#include "audio_region_view.h"
#include "audio_streamview.h"
#include "canvas-noevent-text.h"
-#include "crossfade_view.h"
#include "audio_time_axis.h"
#include "region_gain_line.h"
#include "automation_line.h"
#include "editor_drag.h"
#include "midi_time_axis.h"
#include "editor_regions.h"
+#include "verbose_cursor.h"
#include "i18n.h"
bool
Editor::track_canvas_motion (GdkEvent *ev)
{
- if (verbose_cursor_visible) {
- verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (ev->motion.x + 10);
- verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 10);
+ if (_verbose_cursor->visible ()) {
+ _verbose_cursor->set_position (ev->motion.x + 10, ev->motion.y + 10);
}
return false;
ret = leave_handler (item, event, type);
break;
+ case GDK_KEY_PRESS:
+ ret = key_press_handler (item, event, type);
+ break;
+
+ case GDK_KEY_RELEASE:
+ ret = key_release_handler (item, event, type);
+ break;
+
default:
break;
}
case GDK_LEAVE_NOTIFY:
set_entered_track (0);
break;
-
+
default:
break;
}
return ret;
}
+bool
+Editor::canvas_start_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
+{
+ if (!rv->sensitive()) {
+ return false;
+ }
+
+ switch (event->type) {
+ case GDK_BUTTON_PRESS:
+ clicked_regionview = rv;
+ clicked_control_point = 0;
+ clicked_axisview = &rv->get_time_axis_view();
+ clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
+ if (event->button.button == 3) {
+ return button_press_handler (item, event, StartCrossFadeItem);
+ }
+ break;
+
+ case GDK_BUTTON_RELEASE:
+ if (event->button.button == 3) {
+ return button_release_handler (item, event, StartCrossFadeItem);
+ }
+ break;
+
+ default:
+ break;
+
+ }
+
+ return typed_event (item, event, StartCrossFadeItem);
+}
+
+bool
+Editor::canvas_end_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
+{
+ if (!rv->sensitive()) {
+ return false;
+ }
+
+ switch (event->type) {
+ case GDK_BUTTON_PRESS:
+ clicked_regionview = rv;
+ clicked_control_point = 0;
+ clicked_axisview = &rv->get_time_axis_view();
+ clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
+ if (event->button.button == 3) {
+ return button_press_handler (item, event, EndCrossFadeItem);
+ }
+ break;
+
+ case GDK_BUTTON_RELEASE:
+ if (event->button.button == 3) {
+ return button_release_handler (item, event, EndCrossFadeItem);
+ }
+ break;
+
+ default:
+ break;
+
+ }
+
+ return typed_event (item, event, EndCrossFadeItem);
+}
+
bool
Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
{
}
};
-bool
-Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv)
-{
- /* we handle only button 3 press/release events */
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- clicked_crossfadeview = xfv;
- clicked_axisview = &clicked_crossfadeview->get_time_axis_view();
- clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
- if (event->button.button == 3) {
- return button_press_handler (item, event, CrossfadeViewItem);
- }
- break;
-
- case GDK_BUTTON_RELEASE:
- if (event->button.button == 3) {
- bool ret = button_release_handler (item, event, CrossfadeViewItem);
- return ret;
- }
- break;
-
- default:
- break;
-
- }
-
- /* XXX do not forward double clicks */
-
- if (event->type == GDK_2BUTTON_PRESS) {
- return false;
- }
-
- /* proxy for an underlying regionview */
-
- /* XXX really need to check if we are in the name highlight,
- and proxy to that when required.
- */
-
- TimeAxisView& tv (xfv->get_time_axis_view());
- AudioTimeAxisView* atv;
-
- if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
-
- if (atv->is_audio_track()) {
-
- boost::shared_ptr<AudioPlaylist> pl;
- if ((pl = boost::dynamic_pointer_cast<AudioPlaylist> (atv->track()->playlist())) != 0) {
-
- Playlist::RegionList* rl = pl->regions_at (event_frame (event));
- if (!rl->empty()) {
-
- if (atv->layer_display() == Overlaid) {
-
- /* we're in overlaid mode; proxy to the uppermost region view */
-
- DescendingRegionLayerSorter cmp;
- rl->sort (cmp);
-
- RegionView* rv = atv->view()->find_view (rl->front());
-
- delete rl;
-
- /* proxy */
- return canvas_region_view_event (event, rv->get_canvas_group(), rv);
-
- } else {
-
- /* we're in stacked mode; proxy to the region view under the mouse */
-
- /* XXX: FIXME: this is an evil hack; it assumes that any event for which
- this proxy is being used has its GdkEvent laid out such that the y
- member is in the same place as that for a GdkEventButton */
-
- /* position of the event within the track */
- double cx = event->button.x;
- double cy = event->button.y;
- atv->view()->canvas_item()->w2i (cx, cy);
-
- /* hence layer that we're over */
- double const c = atv->view()->child_height ();
- layer_t const l = pl->top_layer () + 1 - (cy / c);
-
- /* hence region */
- Playlist::RegionList::iterator i = rl->begin();
- while (i != rl->end() && (*i)->layer() != l) {
- ++i;
- }
-
- if (i != rl->end()) {
- RegionView* rv = atv->view()->find_view (*i);
- delete rl;
-
- /* proxy */
- return canvas_region_view_event (event, rv->get_canvas_group(), rv);
- }
- }
- }
-
- delete rl;
- }
- }
- }
-
- return TRUE;
-}
-
bool
Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
{
return true;
}
- boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
+ boost::shared_ptr<Region> region_copy = RegionFactory::create (region, true);
if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
return true;
}
- if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) == 0 &&
- dynamic_cast<MidiTimeAxisView*> (tv.first) != 0) {
+ if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) != 0 &&
+ dynamic_cast<MidiTimeAxisView*> (tv.first) == 0) {
/* MIDI -> non-MIDI */
return true;
return true;
}
+
+bool
+Editor::key_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType)
+{
+ return false;
+}
+
+bool
+Editor::key_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType type)
+{
+
+ bool handled = false;
+
+ switch (type) {
+ case TempoMarkerItem:
+ switch (event->key.keyval) {
+ case GDK_Delete:
+ remove_tempo_marker (item);
+ handled = true;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case MeterMarkerItem:
+ switch (event->key.keyval) {
+ case GDK_Delete:
+ remove_meter_marker (item);
+ handled = true;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return handled;
+}