mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-18 12:46:32 +01:00
Small cleanups to dragging code. Fix assertion failure on dragging a regions' parent entry from the region list to the canvas (which may be #2811). Fixes to drags of regions onto and then back off canvas; should fix #3109.
git-svn-id: svn://localhost/ardour2/branches/3.0@7068 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
b092cfc216
commit
8c423ea228
8 changed files with 35 additions and 23 deletions
|
|
@ -438,6 +438,7 @@ Editor::track_canvas_map_handler (GdkEventAny* /*ev*/)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** This is called when something is dropped onto the track canvas */
|
||||||
void
|
void
|
||||||
Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context,
|
Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context,
|
||||||
int x, int y,
|
int x, int y,
|
||||||
|
|
|
||||||
|
|
@ -996,6 +996,10 @@ Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/,
|
||||||
|
|
||||||
boost::shared_ptr<Region> region = _regions->get_dragged_region ();
|
boost::shared_ptr<Region> region = _regions->get_dragged_region ();
|
||||||
|
|
||||||
|
if (!region) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
|
boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
|
||||||
|
|
||||||
if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
|
if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
|
||||||
|
|
|
||||||
|
|
@ -67,24 +67,14 @@ DragManager::~DragManager ()
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Call abort for each active drag */
|
||||||
void
|
void
|
||||||
DragManager::abort ()
|
DragManager::abort ()
|
||||||
{
|
|
||||||
for (list<Drag*>::const_iterator i = _drags.begin(); i != _drags.end(); ++i) {
|
|
||||||
(*i)->end_grab (0);
|
|
||||||
delete *i;
|
|
||||||
}
|
|
||||||
|
|
||||||
_drags.clear ();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
DragManager::break_drag ()
|
|
||||||
{
|
{
|
||||||
_ending = true;
|
_ending = true;
|
||||||
|
|
||||||
for (list<Drag*>::const_iterator i = _drags.begin(); i != _drags.end(); ++i) {
|
for (list<Drag*>::const_iterator i = _drags.begin(); i != _drags.end(); ++i) {
|
||||||
(*i)->break_drag ();
|
(*i)->abort ();
|
||||||
delete *i;
|
delete *i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -119,6 +109,9 @@ DragManager::start_grab (GdkEvent* e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Call end_grab for each active drag.
|
||||||
|
* @return true if any drag reported movement having occurred.
|
||||||
|
*/
|
||||||
bool
|
bool
|
||||||
DragManager::end_grab (GdkEvent* e)
|
DragManager::end_grab (GdkEvent* e)
|
||||||
{
|
{
|
||||||
|
|
@ -243,7 +236,10 @@ Drag::start_grab (GdkEvent* event, Gdk::Cursor *cursor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param event GDK event, or 0.
|
/** Call to end a drag `successfully'. Ungrabs item and calls
|
||||||
|
* subclass' finished() method.
|
||||||
|
*
|
||||||
|
* @param event GDK event, or 0.
|
||||||
* @return true if some movement occurred, otherwise false.
|
* @return true if some movement occurred, otherwise false.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
|
|
@ -323,8 +319,9 @@ Drag::motion_handler (GdkEvent* event, bool from_autoscroll)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Call to abort a drag. Ungrabs item and calls subclass's aborted () */
|
||||||
void
|
void
|
||||||
Drag::break_drag ()
|
Drag::abort ()
|
||||||
{
|
{
|
||||||
if (_item) {
|
if (_item) {
|
||||||
_item->ungrab (0);
|
_item->ungrab (0);
|
||||||
|
|
@ -1450,7 +1447,9 @@ RegionInsertDrag::finished (GdkEvent* /*event*/, bool /*movement_occurred*/)
|
||||||
void
|
void
|
||||||
RegionInsertDrag::aborted ()
|
RegionInsertDrag::aborted ()
|
||||||
{
|
{
|
||||||
/* XXX: TODO */
|
delete _primary;
|
||||||
|
_primary = 0;
|
||||||
|
_views.clear ();
|
||||||
}
|
}
|
||||||
|
|
||||||
RegionSpliceDrag::RegionSpliceDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v)
|
RegionSpliceDrag::RegionSpliceDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v)
|
||||||
|
|
|
||||||
|
|
@ -50,14 +50,13 @@ public:
|
||||||
bool motion_handler (GdkEvent *, bool);
|
bool motion_handler (GdkEvent *, bool);
|
||||||
|
|
||||||
void abort ();
|
void abort ();
|
||||||
void break_drag ();
|
|
||||||
void add (Drag *);
|
void add (Drag *);
|
||||||
void set (Drag *, GdkEvent *, Gdk::Cursor* c = 0);
|
void set (Drag *, GdkEvent *, Gdk::Cursor* c = 0);
|
||||||
void start_grab (GdkEvent *);
|
void start_grab (GdkEvent *);
|
||||||
bool end_grab (GdkEvent *);
|
bool end_grab (GdkEvent *);
|
||||||
bool have_item (ArdourCanvas::Item *) const;
|
bool have_item (ArdourCanvas::Item *) const;
|
||||||
|
|
||||||
/** @return true if an end drag or break_drag is in progress */
|
/** @return true if an end drag or abort is in progress */
|
||||||
bool ending () const {
|
bool ending () const {
|
||||||
return _ending;
|
return _ending;
|
||||||
}
|
}
|
||||||
|
|
@ -84,7 +83,7 @@ public:
|
||||||
private:
|
private:
|
||||||
Editor* _editor;
|
Editor* _editor;
|
||||||
std::list<Drag*> _drags;
|
std::list<Drag*> _drags;
|
||||||
bool _ending; ///< true if end_grab or break_drag is in progress, otherwise false
|
bool _ending; ///< true if end_grab or abort is in progress, otherwise false
|
||||||
double _current_pointer_x; ///< trackview x of the current pointer
|
double _current_pointer_x; ///< trackview x of the current pointer
|
||||||
double _current_pointer_y; ///< trackview y of the current pointer
|
double _current_pointer_y; ///< trackview y of the current pointer
|
||||||
nframes64_t _current_pointer_frame; ///< frame that the pointer is now at
|
nframes64_t _current_pointer_frame; ///< frame that the pointer is now at
|
||||||
|
|
@ -108,7 +107,7 @@ public:
|
||||||
|
|
||||||
void swap_grab (ArdourCanvas::Item *, Gdk::Cursor *, uint32_t);
|
void swap_grab (ArdourCanvas::Item *, Gdk::Cursor *, uint32_t);
|
||||||
bool motion_handler (GdkEvent*, bool);
|
bool motion_handler (GdkEvent*, bool);
|
||||||
void break_drag ();
|
void abort ();
|
||||||
|
|
||||||
nframes64_t adjusted_frame (nframes64_t, GdkEvent const *, bool snap = true) const;
|
nframes64_t adjusted_frame (nframes64_t, GdkEvent const *, bool snap = true) const;
|
||||||
nframes64_t adjusted_current_frame (GdkEvent const *, bool snap = true) const;
|
nframes64_t adjusted_current_frame (GdkEvent const *, bool snap = true) const;
|
||||||
|
|
|
||||||
|
|
@ -1119,7 +1119,7 @@ Editor::new_transport_marker_menu_popdown ()
|
||||||
// hide rects
|
// hide rects
|
||||||
transport_bar_drag_rect->hide();
|
transport_bar_drag_rect->hide();
|
||||||
|
|
||||||
_drags->break_drag ();
|
_drags->abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -2551,7 +2551,7 @@ void
|
||||||
Editor::escape ()
|
Editor::escape ()
|
||||||
{
|
{
|
||||||
if (_drags->active ()) {
|
if (_drags->active ()) {
|
||||||
_drags->break_drag ();
|
_drags->abort ();
|
||||||
} else {
|
} else {
|
||||||
selection->clear ();
|
selection->clear ();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3760,7 +3760,7 @@ Editor::cut_copy (CutCopyOp op)
|
||||||
Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::really_remove_marker), loc));
|
Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::really_remove_marker), loc));
|
||||||
}
|
}
|
||||||
|
|
||||||
_drags->break_drag ();
|
_drags->abort ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3841,7 +3841,7 @@ Editor::cut_copy (CutCopyOp op)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op == Cut || op == Clear) {
|
if (op == Cut || op == Clear) {
|
||||||
_drags->break_drag ();
|
_drags->abort ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@
|
||||||
#include "region_view.h"
|
#include "region_view.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "editor_regions.h"
|
#include "editor_regions.h"
|
||||||
|
#include "editor_drag.h"
|
||||||
|
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
|
|
@ -1097,6 +1098,8 @@ EditorRegions::drag_data_received (const RefPtr<Gdk::DragContext>& context,
|
||||||
vector<ustring> paths;
|
vector<ustring> paths;
|
||||||
|
|
||||||
if (data.get_target() == "GTK_TREE_MODEL_ROW") {
|
if (data.get_target() == "GTK_TREE_MODEL_ROW") {
|
||||||
|
/* something is being dragged over the region list */
|
||||||
|
_editor->_drags->abort ();
|
||||||
_display.on_drag_data_received (context, x, y, data, info, time);
|
_display.on_drag_data_received (context, x, y, data, info, time);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -1155,12 +1158,18 @@ EditorRegions::name_edit (const Glib::ustring& path, const Glib::ustring& new_te
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return Region that has been dragged out of the list, or 0 */
|
||||||
boost::shared_ptr<Region>
|
boost::shared_ptr<Region>
|
||||||
EditorRegions::get_dragged_region ()
|
EditorRegions::get_dragged_region ()
|
||||||
{
|
{
|
||||||
list<boost::shared_ptr<Region> > regions;
|
list<boost::shared_ptr<Region> > regions;
|
||||||
TreeView* source;
|
TreeView* source;
|
||||||
_display.get_object_drag_data (regions, &source);
|
_display.get_object_drag_data (regions, &source);
|
||||||
|
|
||||||
|
if (regions.empty()) {
|
||||||
|
return boost::shared_ptr<Region> ();
|
||||||
|
}
|
||||||
|
|
||||||
assert (regions.size() == 1);
|
assert (regions.size() == 1);
|
||||||
return regions.front ();
|
return regions.front ();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue