diff --git a/src/mol-plugin/behavior/dynamic/representation.ts b/src/mol-plugin/behavior/dynamic/representation.ts index c3df52b8061d498f9df819a096add9e8b765293e..c9126e2d0b440e8764ec6442b6cb878098301bc3 100644 --- a/src/mol-plugin/behavior/dynamic/representation.ts +++ b/src/mol-plugin/behavior/dynamic/representation.ts @@ -73,7 +73,13 @@ export const SelectLoci = PluginBehavior.create({ this.subscribeObservable(this.ctx.events.canvas3d.click, ({ current, buttons, modifiers }) => { if (!this.ctx.canvas3d) return; - if (StructureElement.isLoci(current.loci)) { + if (current.loci.kind === 'empty-loci') { + if (modifiers.control && buttons === ButtonsType.Flag.Secondary) { + // clear the selection on Ctrl + Right-Click on empty + const sels = sel.clear(); + for (const s of sels) this.ctx.canvas3d.mark({ loci: s }, MarkerAction.Deselect); + } + } else if (StructureElement.isLoci(current.loci)) { if (modifiers.control && buttons === ButtonsType.Flag.Secondary) { // select only the current element on Ctrl + Right-Click const old = sel.get(current.loci.structure); diff --git a/src/mol-plugin/util/structure-element-selection.ts b/src/mol-plugin/util/structure-element-selection.ts index a070ec298ee2a5b349ffccad5872a90f8abf5c26..f990cfa79e2d0399801cb8a157619d22cbb911d5 100644 --- a/src/mol-plugin/util/structure-element-selection.ts +++ b/src/mol-plugin/util/structure-element-selection.ts @@ -50,6 +50,19 @@ class StructureElementSelectionManager { return entry.selection.elements.length === 0 ? EmptyLoci : entry.selection; } + clear() { + const keys = this.entries.keys(); + const selections: StructureElement.Loci[] = []; + while (true) { + const k = keys.next(); + if (k.done) break; + const s = this.entries.get(k.value)!; + if (s.selection.elements.length > 0) selections.push(s.selection); + s.selection = StructureElement.Loci(s.selection.structure, []); + } + return selections; + } + get(structure: Structure) { const entry = this.getEntry(structure); if (!entry) return EmptyLoci;