TriggerBox: implement basic TriggerSlot DnD
This commit is contained in:
parent
96137739a7
commit
8b90ea39a2
@ -726,6 +726,7 @@ TriggerEntry::follow_button_event (GdkEvent* ev)
|
|||||||
TriggerBoxUI::TriggerBoxUI (ArdourCanvas::Item* parent, TriggerBox& tb)
|
TriggerBoxUI::TriggerBoxUI (ArdourCanvas::Item* parent, TriggerBox& tb)
|
||||||
: Rectangle (parent)
|
: Rectangle (parent)
|
||||||
, _triggerbox (tb)
|
, _triggerbox (tb)
|
||||||
|
, _drag_active (false)
|
||||||
{
|
{
|
||||||
set_layout_sensitive (true); // why???
|
set_layout_sensitive (true); // why???
|
||||||
|
|
||||||
@ -750,6 +751,15 @@ TriggerBoxUI::TriggerBoxUI (ArdourCanvas::Item* parent, TriggerBox& tb)
|
|||||||
gtkcanvas->signal_drag_motion ().connect (sigc::mem_fun (*this, &TriggerBoxUI::drag_motion));
|
gtkcanvas->signal_drag_motion ().connect (sigc::mem_fun (*this, &TriggerBoxUI::drag_motion));
|
||||||
gtkcanvas->signal_drag_leave ().connect (sigc::mem_fun (*this, &TriggerBoxUI::drag_leave));
|
gtkcanvas->signal_drag_leave ().connect (sigc::mem_fun (*this, &TriggerBoxUI::drag_leave));
|
||||||
gtkcanvas->signal_drag_data_received ().connect (sigc::mem_fun (*this, &TriggerBoxUI::drag_data_received));
|
gtkcanvas->signal_drag_data_received ().connect (sigc::mem_fun (*this, &TriggerBoxUI::drag_data_received));
|
||||||
|
|
||||||
|
/* DnD Source */
|
||||||
|
std::vector<Gtk::TargetEntry> source_table;
|
||||||
|
source_table.push_back (Gtk::TargetEntry ("x-ardour/region.pbdid", Gtk::TARGET_SAME_APP));
|
||||||
|
_dnd_src = Gtk::TargetList::create (source_table);
|
||||||
|
|
||||||
|
gtkcanvas->signal_drag_begin ().connect (sigc::mem_fun (*this, &TriggerBoxUI::drag_begin));
|
||||||
|
gtkcanvas->signal_drag_end ().connect (sigc::mem_fun (*this, &TriggerBoxUI::drag_end));
|
||||||
|
gtkcanvas->signal_drag_data_get ().connect (sigc::mem_fun (*this, &TriggerBoxUI::drag_data_get));
|
||||||
}
|
}
|
||||||
|
|
||||||
TriggerBoxUI::~TriggerBoxUI ()
|
TriggerBoxUI::~TriggerBoxUI ()
|
||||||
@ -788,9 +798,7 @@ TriggerBoxUI::build ()
|
|||||||
|
|
||||||
_slots.push_back (te);
|
_slots.push_back (te);
|
||||||
|
|
||||||
#if 0
|
|
||||||
te->Event.connect (sigc::bind (sigc::mem_fun (*this, &TriggerBoxUI::event), n));
|
te->Event.connect (sigc::bind (sigc::mem_fun (*this, &TriggerBoxUI::event), n));
|
||||||
#endif
|
|
||||||
|
|
||||||
++n;
|
++n;
|
||||||
}
|
}
|
||||||
@ -910,6 +918,101 @@ TriggerBoxUI::drag_data_received (Glib::RefPtr<Gdk::DragContext> const& context,
|
|||||||
context->drag_finish (true, false, time);
|
context->drag_finish (true, false, time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
TriggerBoxUI::event (GdkEvent* ev, uint64_t n)
|
||||||
|
{
|
||||||
|
assert (n < _slots.size ());
|
||||||
|
if (!_slots[n]->trigger()->region ()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ev->type) {
|
||||||
|
case GDK_2BUTTON_PRESS:
|
||||||
|
gdk_pointer_ungrab (GDK_CURRENT_TIME);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_BUTTON_RELEASE:
|
||||||
|
gdk_pointer_ungrab (GDK_CURRENT_TIME);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_BUTTON_PRESS:
|
||||||
|
if (!_drag_active) {
|
||||||
|
GdkEventButton* bev = (GdkEventButton*)ev;
|
||||||
|
if (bev->button == 1) {
|
||||||
|
_drag_start_x = bev->x;
|
||||||
|
_drag_start_y = bev->y;
|
||||||
|
gdk_pointer_grab (bev->window, false, GdkEventMask (Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK |Gdk::BUTTON_RELEASE_MASK), NULL, NULL, bev->time);
|
||||||
|
} else {
|
||||||
|
_drag_start_x = -1;
|
||||||
|
_drag_start_y = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_MOTION_NOTIFY:
|
||||||
|
if (!_drag_active) {
|
||||||
|
int x, y;
|
||||||
|
Gdk::ModifierType mask;
|
||||||
|
|
||||||
|
GtkCanvas* gtkcanvas = static_cast<GtkCanvas*> (canvas ());
|
||||||
|
gtkcanvas->get_window()->get_pointer (x, y, mask);
|
||||||
|
|
||||||
|
if (mask & GDK_BUTTON1_MASK) {
|
||||||
|
if (gtkcanvas->drag_check_threshold (_drag_start_x, _drag_start_y, x, y)) {
|
||||||
|
_drag_active = true;
|
||||||
|
gtkcanvas->drag_begin (_dnd_src, Gdk::ACTION_COPY, 1, ev);
|
||||||
|
// -> save a reference to the dragged slot, for use in ::drag_begin ::drag_data_get()
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TriggerBoxUI::drag_begin (Glib::RefPtr<Gdk::DragContext> const& context)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
int width = 130;
|
||||||
|
int height = 20;
|
||||||
|
GtkCanvas* gtkcanvas = static_cast<GtkCanvas*> (canvas ());
|
||||||
|
Glib::RefPtr<Gdk::Pixmap> pixmap = Gdk::Pixmap::create (gtkcanvas->get_root_window(), width, height);
|
||||||
|
cairo_t *cr = gdk_cairo_create (Glib::unwrap (pixmap));
|
||||||
|
cairo_set_source_rgb (cr, 1, 0, 0);
|
||||||
|
cairo_rectangle (cr, 0, 0, width, height);
|
||||||
|
cairo_fill (cr);
|
||||||
|
cairo_destroy (cr);
|
||||||
|
context->set_icon (pixmap->get_colormap(), pixmap, Glib::RefPtr<Gdk::Bitmap>(NULL), width / 2, height / 2);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TriggerBoxUI::drag_end (Glib::RefPtr<Gdk::DragContext> const&)
|
||||||
|
{
|
||||||
|
_drag_active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TriggerBoxUI::drag_data_get (Glib::RefPtr<Gdk::DragContext> const&, Gtk::SelectionData& data, guint, guint)
|
||||||
|
{
|
||||||
|
if (data.get_target () != "x-ardour/region.pbdid") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::shared_ptr<Region> region;
|
||||||
|
/* use selection, for now */
|
||||||
|
TriggerSelection ts = PublicEditor::instance ().get_selection ().triggers;
|
||||||
|
for (auto& te : ts) {
|
||||||
|
region = te->trigger()->region ();
|
||||||
|
}
|
||||||
|
if (region) {
|
||||||
|
data.set (data.get_target (), region->id ().to_s ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TriggerBoxUI::start_updating ()
|
TriggerBoxUI::start_updating ()
|
||||||
{
|
{
|
||||||
|
@ -102,6 +102,12 @@ private:
|
|||||||
ARDOUR::TriggerBox& _triggerbox;
|
ARDOUR::TriggerBox& _triggerbox;
|
||||||
Slots _slots;
|
Slots _slots;
|
||||||
|
|
||||||
|
int _drag_start_x;
|
||||||
|
int _drag_start_y;
|
||||||
|
bool _drag_active;
|
||||||
|
|
||||||
|
Glib::RefPtr<Gtk::TargetList> _dnd_src;
|
||||||
|
|
||||||
void build ();
|
void build ();
|
||||||
void rapid_update ();
|
void rapid_update ();
|
||||||
|
|
||||||
@ -111,6 +117,11 @@ private:
|
|||||||
void drag_leave (Glib::RefPtr<Gdk::DragContext> const&, guint);
|
void drag_leave (Glib::RefPtr<Gdk::DragContext> const&, guint);
|
||||||
void drag_data_received (Glib::RefPtr<Gdk::DragContext> const&, int, int, Gtk::SelectionData const&, guint, guint);
|
void drag_data_received (Glib::RefPtr<Gdk::DragContext> const&, int, int, Gtk::SelectionData const&, guint, guint);
|
||||||
|
|
||||||
|
bool event (GdkEvent*, uint64_t n);
|
||||||
|
void drag_begin (Glib::RefPtr<Gdk::DragContext> const&);
|
||||||
|
void drag_end (Glib::RefPtr<Gdk::DragContext> const&);
|
||||||
|
void drag_data_get (Glib::RefPtr<Gdk::DragContext> const&, Gtk::SelectionData&, guint, guint);
|
||||||
|
|
||||||
bool triggerbox_event (GdkEvent*);
|
bool triggerbox_event (GdkEvent*);
|
||||||
|
|
||||||
uint64_t slot_at_y (int) const;
|
uint64_t slot_at_y (int) const;
|
||||||
|
Loading…
Reference in New Issue
Block a user