Skip to content

Commit f80151b

Browse files
committed
Bulk select (#395)
* add rect for select * collect selected elements * increase note stroke width * move elements and undo redo * add icon to toolbar to toggle multiselect mode * set bulk selected elements to none when panning
1 parent 731eed6 commit f80151b

File tree

8 files changed

+405
-110
lines changed

8 files changed

+405
-110
lines changed

src/components/EditorCanvas/Area.jsx

+17-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useRef, useState } from "react";
1+
import { useMemo, useRef, useState } from "react";
22
import { Button, Popover, Input, ColorPicker } from "@douyinfe/semi-ui";
33
import { IconEdit, IconDeleteStroked } from "@douyinfe/semi-icons";
44
import { Tab, Action, ObjectType, State } from "../../data/constants";
@@ -30,7 +30,8 @@ export default function Area({
3030
const { layout } = useLayout();
3131
const { settings } = useSettings();
3232
const { setSaveState } = useSaveState();
33-
const { selectedElement, setSelectedElement } = useSelect();
33+
const { selectedElement, setSelectedElement, bulkSelectedElements } =
34+
useSelect();
3435

3536
const handleResize = (e, dir) => {
3637
setResize({ id: data.id, dir: dir });
@@ -82,11 +83,21 @@ export default function Area({
8283
setSaveState(State.SAVING);
8384
};
8485

85-
const areaIsSelected = () =>
86+
const areaIsOpen = () =>
8687
selectedElement.element === ObjectType.AREA &&
8788
selectedElement.id === data.id &&
8889
selectedElement.open;
8990

91+
const isSelected = useMemo(() => {
92+
return (
93+
(selectedElement.id === data.id &&
94+
selectedElement.element === ObjectType.AREA) ||
95+
bulkSelectedElements.some(
96+
(e) => e.type === ObjectType.AREA && e.id === data.id,
97+
)
98+
);
99+
}, [selectedElement, data, bulkSelectedElements]);
100+
90101
return (
91102
<g ref={ref}>
92103
<foreignObject
@@ -101,8 +112,7 @@ export default function Area({
101112
className={`w-full h-full p-2 rounded cursor-move border-2 ${
102113
isHovered
103114
? "border-dashed border-blue-500"
104-
: selectedElement.element === ObjectType.AREA &&
105-
selectedElement.id === data.id
115+
: isSelected
106116
? "border-blue-500 opacity-100"
107117
: "border-slate-400 opacity-100"
108118
}`}
@@ -112,9 +122,9 @@ export default function Area({
112122
<div className="text-color select-none overflow-hidden text-ellipsis">
113123
{data.name}
114124
</div>
115-
{(isHovered || (areaIsSelected() && !layout.sidebar)) && (
125+
{(isHovered || (areaIsOpen() && !layout.sidebar)) && (
116126
<Popover
117-
visible={areaIsSelected() && !layout.sidebar}
127+
visible={areaIsOpen() && !layout.sidebar}
118128
onClickOutSide={onClickOutSide}
119129
stopPropagation
120130
content={<EditPopoverContent data={data} />}

0 commit comments

Comments
 (0)