diff --git a/modules/behavior/select.js b/modules/behavior/select.js index 1f5a46f72..9b51e93d9 100644 --- a/modules/behavior/select.js +++ b/modules/behavior/select.js @@ -259,7 +259,7 @@ export function behaviorSelect(context) { // always enter modeSelect even if the entity is already // selected since listeners may expect `context.enter` events, // e.g. in the walkthrough - newMode = mode.id === 'select' ? mode.selectedIDs([datum.id]) : modeSelect(context, [datum.id]); + newMode = mode.id === 'select' ? mode.selectedIDs([datum.id]) : modeSelect(context, [datum.id]).selectBehavior(behavior); context.enter(newMode); } @@ -269,7 +269,7 @@ export function behaviorSelect(context) { if (!showMenu) { // deselect clicked entity, then reenter select mode or return to browse mode.. selectedIDs = selectedIDs.filter(function(id) { return id !== datum.id; }); - newMode = selectedIDs.length ? mode.selectedIDs(selectedIDs) : modeBrowse(context); + newMode = selectedIDs.length ? mode.selectedIDs(selectedIDs) : modeBrowse(context).selectBehavior(behavior); context.enter(newMode); } } else { diff --git a/modules/modes/browse.js b/modules/modes/browse.js index 0f0af5100..b268b76c6 100644 --- a/modules/modes/browse.js +++ b/modules/modes/browse.js @@ -16,20 +16,33 @@ export function modeBrowse(context) { id: 'browse', title: t('modes.browse.title'), description: t('modes.browse.description') - }, sidebar; + }; + var sidebar; - var behaviors = [ - behaviorPaste(context), - behaviorHover(context).on('hover', context.ui().sidebar.hover), - behaviorSelect(context), - behaviorLasso(context), - modeDragNode(context).behavior, - modeDragNote(context).behavior - ]; + var _selectBehavior; + var _behaviors = []; + + + mode.selectBehavior = function(val) { + if (!arguments.length) return _selectBehavior; + _selectBehavior = val; + return mode; + }; mode.enter = function() { - behaviors.forEach(context.install); + if (!_behaviors.length) { + if (!_selectBehavior) _selectBehavior = behaviorSelect(context); + _behaviors = [ + behaviorPaste(context), + behaviorHover(context).on('hover', context.ui().sidebar.hover), + _selectBehavior, + behaviorLasso(context), + modeDragNode(context).behavior, + modeDragNote(context).behavior + ]; + } + _behaviors.forEach(context.install); // Get focus on the body. if (document.activeElement && document.activeElement.blur) { @@ -46,7 +59,7 @@ export function modeBrowse(context) { mode.exit = function() { context.ui().sidebar.hover.cancel(); - behaviors.forEach(context.uninstall); + _behaviors.forEach(context.uninstall); if (sidebar) { context.ui().sidebar.hide(); diff --git a/modules/modes/select.js b/modules/modes/select.js index 96af0e7a0..e8d8a9046 100644 --- a/modules/modes/select.js +++ b/modules/modes/select.js @@ -40,15 +40,8 @@ export function modeSelect(context, selectedIDs) { var _breatheBehavior = behaviorBreathe(context); var _modeDragNode = modeDragNode(context); - var _behaviors = [ - behaviorPaste(context), - _breatheBehavior, - behaviorHover(context).on('hover', context.ui().sidebar.hoverModeSelect), - behaviorSelect(context), - behaviorLasso(context), - _modeDragNode.behavior, - modeDragNote(context).behavior - ]; + var _selectBehavior; + var _behaviors = []; var _operations = []; var _newFeature = false; @@ -160,6 +153,13 @@ export function modeSelect(context, selectedIDs) { }; + mode.selectBehavior = function(val) { + if (!arguments.length) return _selectBehavior; + _selectBehavior = val; + return mode; + }; + + mode.follow = function(val) { if (!arguments.length) return _follow; _follow = val; @@ -208,6 +208,19 @@ export function modeSelect(context, selectedIDs) { loadOperations(); + if (!_behaviors.length) { + if (!_selectBehavior) _selectBehavior = behaviorSelect(context); + + _behaviors = [ + behaviorPaste(context), + _breatheBehavior, + behaviorHover(context).on('hover', context.ui().sidebar.hoverModeSelect), + _selectBehavior, + behaviorLasso(context), + _modeDragNode.behavior, + modeDragNote(context).behavior + ]; + } _behaviors.forEach(context.install); keybinding