use double-click-based timeout to queue Location::set_skipping() after a single-click on a (skip) marker.

This is a classic hack for a GUI design in which single click and double click on an object perform unrelated actions.
This commit is contained in:
Paul Davis 2014-11-02 08:52:36 -05:00
parent 6b332b9883
commit 06c99a5e10
2 changed files with 23 additions and 3 deletions

View file

@ -3132,6 +3132,7 @@ FadeOutDrag::aborted (bool)
} }
} }
sigc::connection MarkerDrag::timeout_connection;
MarkerDrag::MarkerDrag (Editor* e, ArdourCanvas::Item* i) MarkerDrag::MarkerDrag (Editor* e, ArdourCanvas::Item* i)
: Drag (e, i) : Drag (e, i)
@ -3384,23 +3385,38 @@ MarkerDrag::motion (GdkEvent*, bool)
} }
static bool
timeout_set_skipping (Location* loc, bool yn)
{
loc->set_skipping (yn);
return false;
}
void void
MarkerDrag::finished (GdkEvent* event, bool movement_occurred) MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
{ {
if (!movement_occurred) { if (!movement_occurred) {
if (was_double_click()) { if (was_double_click()) {
_editor->rename_marker (_marker); timeout_connection.disconnect ();
_editor->rename_marker (_marker);
return; return;
} }
/* just a single click */ /* just a single click */
Selection::Operation op = ArdourKeyboard::selection_type (event->button.state);
Location* loc = _marker->location (); Location* loc = _marker->location ();
if (loc) { if (loc) {
if (loc->is_skip()) { if (loc->is_skip()) {
/* skip range - click toggles active skip status */ /* skip range - click toggles active skip status */
loc->set_skipping (!loc->is_skipping());
Glib::RefPtr<Gtk::Settings> settings (Gtk::Settings::get_default());
timeout_connection = Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (timeout_set_skipping), loc, !loc->is_skipping()),
settings->property_gtk_double_click_time() + 10);
return; return;
} else if (loc->is_auto_loop()) { } else if (loc->is_auto_loop()) {
/* click on loop marker: locate */ /* click on loop marker: locate */
@ -3413,7 +3429,6 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
off the selection process off the selection process
*/ */
Selection::Operation op = ArdourKeyboard::selection_type (event->button.state);
switch (op) { switch (op) {
case Selection::Set: case Selection::Set:
@ -3475,6 +3490,7 @@ MarkerDrag::aborted (bool)
/* XXX: TODO */ /* XXX: TODO */
} }
ControlPointDrag::ControlPointDrag (Editor* e, ArdourCanvas::Item* i) ControlPointDrag::ControlPointDrag (Editor* e, ArdourCanvas::Item* i)
: Drag (e, i), : Drag (e, i),
_cumulative_x_drag (0), _cumulative_x_drag (0),

View file

@ -782,6 +782,10 @@ private:
typedef std::list<CopiedLocationMarkerInfo> CopiedLocationInfo; typedef std::list<CopiedLocationMarkerInfo> CopiedLocationInfo;
CopiedLocationInfo _copied_locations; CopiedLocationInfo _copied_locations;
static sigc::connection timeout_connection;
void single_click (GdkEvent*, bool);
}; };
/** Control point drag */ /** Control point drag */