Persist down pointer multiselection between browse/select mode transitions

This commit is contained in:
Quincy Morgan
2020-05-27 12:33:53 -04:00
parent 4646c11ff1
commit cb5365f743
3 changed files with 48 additions and 22 deletions
+2 -2
View File
@@ -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 {
+24 -11
View File
@@ -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();
+22 -9
View File
@@ -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