Group/ungroup feature

This commit is contained in:
space-nuko
2023-04-29 15:21:33 -07:00
parent 2f53758045
commit 95133df3d9
3 changed files with 174 additions and 32 deletions

View File

@@ -47,6 +47,34 @@
console.warn($layoutState)
}
function groupWidgets() {
const items = layoutState.getCurrentSelection()
$layoutState.currentSelection = []
layoutState.groupItems(items)
}
let canUngroup = false;
let isDeleteGroup = false;
$: canUngroup = $layoutState.currentSelection.length === 1
&& layoutState.getCurrentSelection()[0].type === "container"
$: if (canUngroup) {
const dragItem = layoutState.getCurrentSelection()[0];
const entry = $layoutState.allItems[dragItem.id];
isDeleteGroup = entry.children.length === 0
}
else {
isDeleteGroup = false
}
function ungroup() {
const item = layoutState.getCurrentSelection()[0]
if (item.type !== "container")
return;
$layoutState.currentSelection = []
layoutState.ungroup(item as ContainerLayout)
}
let menuPos = { x: 0, y: 0 };
let showMenu = false;
@@ -78,20 +106,13 @@
{#if showMenu}
<Menu {...menuPos} on:click={closeMenu} on:clickoutside={closeMenu}>
<MenuOption
on:click={console.log}
text="Do nothing" />
isDisabled={$layoutState.currentSelection.length === 0}
on:click={groupWidgets}
text="Group" />
<MenuOption
on:click={console.log}
text="Do nothing, but twice" />
<MenuDivider />
<MenuOption
isDisabled={true}
on:click={console.log}
text="Whoops, disabled!" />
<MenuOption on:click={console.log}>
<Icon />
<span>Look! An icon!</span>
</MenuOption>
isDisabled={!canUngroup}
on:click={ungroup}
text={isDeleteGroup ? "Delete Group" : "Ungroup"} />
</Menu>
{/if}

View File

@@ -26,7 +26,14 @@
const flipDurationMs = 100;
$: if (dragItem) {
if (dragItem.type === "container") {
if (!$layoutState.allItems[dragItem.id]) {
dragItem = null;
widget = null;
widgetState = null;
children = null;
container = null;
}
else if (dragItem.type === "container") {
container = dragItem as ContainerLayout;
children = $layoutState.allItems[dragItem.id].children;
widget = null;
@@ -54,11 +61,16 @@
};
const startDrag = (evt: MouseEvent) => {
if (evt.button === 2)
return;
const dragItemId: string = evt.target.dataset["dragItemId"];
if (evt.button !== 0) {
if ($layoutState.currentSelection.length <= 1 && !$layoutState.isMenuOpen)
$layoutState.currentSelection = [dragItemId]
return;
}
const item = $layoutState.allItems[dragItemId].dragItem
if (evt.ctrlKey) {
const index = $layoutState.currentSelection.indexOf(item.id)
if (index === -1)
@@ -103,7 +115,6 @@
<div class="v-pane"
class:empty={children.length === 0}
class:edit={$uiState.uiEditMode === "widgets" && zIndex > 1}
class:is-executing={$queueState.runningNodeId && $queueState.runningNodeId === container.attrs.associatedNode}
use:dndzone="{{
items: children,
flipDurationMs,
@@ -137,6 +148,10 @@
class:selected={$uiState.uiEditMode !== "disabled" && $layoutState.currentSelection.includes(widget.id)}
class:is-executing={$queueState.runningNodeId && $queueState.runningNodeId == widget.attrs.associatedNode}
>
{#if widget.attrs.associatedNode}
{@const node = $nodeState[widget.attrs.associatedNode].node}
<span class="node-type">({node.type})</span>
{/if}
<svelte:component this={getComponentForWidgetState(widgetState)} item={widgetState} />
</div>
{#if showHandles}
@@ -261,12 +276,12 @@
}
.edit-title-label {
z-index: 10000;
position: relative;
z-index: var(--layer-1);
}
.edit-title {
z-index: var(--layer-1);
z-index: 10000;
display: block;
position: relative;
outline: none !important;