<< Mouse drag algorithm >>

Mouse drag algorithm
press
-----

if flags_clear:
    if near marker:
        flag.dragging_marker = true
    else if near selection:
        flag.dragging_selection = true
        selection.start_point = other side of selection
    else:
        flag.dragging_selection = true
        selection.start_point = this_point

else:
    clear_flags

motion
------

if flags.dragging_marker:
    set_marker()
    if not flags.cursor_set:
        set_cursor(<->)
        flags.cursor_set = true
else if flags.dragging_selection:
    set_selection(selection.start_point, this_point)
    flags.did_move = true
    if not flags.cursor_set:
        set_cursor(<->)
        flags.cursor_set = true
else if near marker:
    if not flags.cursor_set:
        set_cursor(<->)
        flags.cursor_set = true
else if near selection:
    if not flags.cursor_set:
        set_cursor(<->)
        flags.cursor_set = true
else if flags.cursor_set:
    restore_cursor()

release
-------

if flags.dragging_marker:
    set_marker()
if flags.dragging_selection:
    if flags.did_move:
        set_selection(selection.starting_point, this_point)
    else:
        set_marker()
if flags.cursor_set:
    restore_cursor
clear_flags(flags)

Mouse drag algorithm