Drag a whole selection and join existing groups in the hierarchy (#241)
Three follow-ups to the hierarchy groups. Dragging a row that belonged to a multi-selection moved only that one row. The group dialog could only create a new group. The group row drew its folder in front of the label, unlike every other row in the hierarchy. - Dragging a selected row moves every selected object. This holds for reordering, dropping into a group or between its members, dragging out of a group and dropping onto an object as new parent. - The moved objects land side by side in hierarchy order, whichever row was grabbed. The whole move is one undo step. - A selected child of a selected object travels with its parent, not on its own. Dropping the selection onto its own rows does nothing. - Dragging a row that is not selected still moves only that row. - hierarchyDrop.moveObjects replaces the single-object rule. One object is the case with one element, so the old drop tests hold unchanged. - The group dialog has a "Group" dropdown: New group or an existing group. Picking a group greys out the name and turns the button into "Add". A group that holds all chosen objects already is not offered. - Rename keeps using the dialog without the dropdown. - ListRow draws an end icon at the very right and the hint left of it. Only the hierarchy uses iconAtEnd, so other lists do not change. - New test hook __gm.hierarchyHint() gives the centre of a row's hint. Not clicked in the browser: dragging a selection in the container tab and onto an object as parent. Only the unit tests cover these. Tests: - ./check.sh: 178 files, 2564 tests, CHECK EXIT 0 - e2e 1 + 52: ALL PASSED, 27 checks - 7 new unit tests in hierarchy-drop.test.ts, 4 new e2e checks in 52i and 52j with real clicks and a real drag - 4 counter-probes bite: drop rule ignores the selection (5 unit tests fail), icon column not kept free, dialog ignores the picked group, panel ignores the selection (only o2 lands in the group) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
893b81f798
commit
2eeabf7c23
10 files changed
+327
-64
No files matched your search
@@ -45,12 +45,28 @@ export function groupMenuItems(
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Asks for the name of a new group – or, from a dropdown, for an existing group to put the objects
|
||||
* into. A group all of them are in already is not offered.
|
||||
*/
|
||||
export function groupObjects(state: EditorState, source: ObjectHolder, ids: readonly string[]): void {
|
||||
const title = ids.length > 1 ? `Group ${ids.length} objects` : 'Group the object';
|
||||
const groups = (source.groups ?? []).filter((g) => {
|
||||
const members = groupMemberIds(source, g.id);
|
||||
return members.length > 0 && !ids.every((id) => members.includes(id));
|
||||
});
|
||||
GroupNameDialog.open(
|
||||
new GroupNameDialog(title, nextGroupName(source), 'Group', (name) => {
|
||||
state.execute(new GroupObjectsCommand(source.id, ids, name));
|
||||
}),
|
||||
new GroupNameDialog(
|
||||
title,
|
||||
nextGroupName(source),
|
||||
'Group',
|
||||
(name) => state.execute(new GroupObjectsCommand(source.id, ids, name)),
|
||||
{
|
||||
groups,
|
||||
confirm: 'Add',
|
||||
onJoin: (groupId) => state.execute(new SetObjectGroupCommand(source.id, ids, groupId)),
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user