Skip to content

Commit 127acf3

Browse files
Added preview of collapsed group while node gets dragged
1 parent e890c47 commit 127acf3

9 files changed

+85
-35
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Canvas } from "src/@types/Canvas"
2+
import { CanvasEvent } from "src/events/events"
3+
import AdvancedCanvasPlugin from "src/main"
4+
import SettingsManager, { AdvancedCanvasPluginSettings } from "src/settings"
5+
6+
const EXPOSED_SETTINGS: (keyof AdvancedCanvasPluginSettings)[] = [
7+
'collapsibleGroupsFeatureEnabled',
8+
'collapsedGroupPreviewOnDrag'
9+
]
10+
11+
export default class CanvasWrapperDataTaggerCanvasExtension {
12+
plugin: AdvancedCanvasPlugin
13+
14+
constructor(plugin: AdvancedCanvasPlugin) {
15+
this.plugin = plugin
16+
17+
this.plugin.registerEvent(this.plugin.app.workspace.on(
18+
SettingsManager.SETTINGS_CHANGED_EVENT,
19+
() => this.updateExposedSettings(this.plugin.getCurrentCanvas())
20+
))
21+
22+
this.plugin.registerEvent(this.plugin.app.workspace.on(
23+
CanvasEvent.CanvasChanged,
24+
(canvas: Canvas) => this.updateExposedSettings(canvas)
25+
))
26+
27+
this.plugin.registerEvent(this.plugin.app.workspace.on(
28+
CanvasEvent.DraggingStateChanged,
29+
(canvas: Canvas, dragging: boolean) => {
30+
if (dragging) canvas.wrapperEl.dataset.isDragging = 'true'
31+
else delete canvas.wrapperEl.dataset.isDragging
32+
}
33+
))
34+
}
35+
36+
private updateExposedSettings(canvas: Canvas | null) {
37+
if (!canvas) return
38+
39+
for (const setting of EXPOSED_SETTINGS) {
40+
canvas.wrapperEl.dataset[setting] = this.plugin.settings.getSetting(setting).toString()
41+
}
42+
}
43+
}

src/canvas-extensions/collapsible-groups-canvas-extension.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@ export default class CollapsibleGroupsCanvasExtension {
1414

1515
if (!this.plugin.settings.getSetting('collapsibleGroupsFeatureEnabled')) return
1616

17-
this.plugin.registerEvent(this.plugin.app.workspace.on(
18-
CanvasEvent.CanvasChanged,
19-
(canvas: Canvas) => canvas.wrapperEl.dataset.collapsibleGroupsEnabled = 'true'
20-
))
21-
2217
this.plugin.registerEvent(this.plugin.app.workspace.on(
2318
CanvasEvent.NodeChanged,
2419
(canvas: Canvas, node: CanvasNode) => this.onNodeChanged(canvas, node)

src/canvas-extensions/color-palette-canvas-extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ export default class ColorPaletteCanvasExtension {
1414
this.plugin = plugin
1515

1616
this.plugin.registerEvent(this.plugin.app.workspace.on(
17-
'advanced-canvas:window-open',
18-
() => this.updateCustomColorModStyleClasses()
17+
'window-open',
18+
(_win: WorkspaceWindow, _window: Window) => this.updateCustomColorModStyleClasses()
1919
))
2020

2121
this.plugin.registerEvent(this.plugin.app.workspace.on(

src/canvas-extensions/edge-data-tagger-canvas-extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Canvas, CanvasEdge, CanvasEdgeData } from "src/@types/Canvas"
22
import { CanvasEvent } from "src/events/events"
33
import AdvancedCanvasPlugin from "src/main"
4-
import AdvancedCanvasSettingsManager from "src/settings"
4+
import SettingsManager from "src/settings"
55

6-
export function getExposedEdgeData(settings: AdvancedCanvasSettingsManager): (keyof CanvasEdgeData)[] {
6+
export function getExposedEdgeData(settings: SettingsManager): (keyof CanvasEdgeData)[] {
77
const exposedData: (keyof CanvasEdgeData)[] = []
88

99
if (settings.getSetting('edgesStylingFeatureEnabled')) exposedData.push('edgeStyle')

src/canvas-extensions/node-data-tagger-canvas-extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Canvas, CanvasNode, CanvasNodeData } from "src/@types/Canvas"
22
import { CanvasEvent } from "src/events/events"
33
import AdvancedCanvasPlugin from "src/main"
4-
import AdvancedCanvasSettingsManager from "src/settings"
4+
import SettingsManager from "src/settings"
55

6-
export function getExposedNodeData(settings: AdvancedCanvasSettingsManager): (keyof CanvasNodeData)[] {
6+
export function getExposedNodeData(settings: SettingsManager): (keyof CanvasNodeData)[] {
77
const exposedData: (keyof CanvasNodeData)[] = []
88

99
if (settings.getSetting('stickersFeatureEnabled')) exposedData.push('isSticker')

src/main.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ItemView, Plugin, WorkspaceWindow } from 'obsidian'
1+
import { ItemView, Plugin } from 'obsidian'
22
import SettingsManager from './settings'
33
import ShapesCanvasExtension from './canvas-extensions/shapes-canvas-extension'
44
import { Canvas, CanvasView } from './@types/Canvas'
@@ -20,8 +20,10 @@ import DefaultNodeSizeCanvasExtension from './canvas-extensions/default-node-siz
2020
import ColorPaletteCanvasExtension from './canvas-extensions/color-palette-canvas-extension'
2121
import CollapsibleGroupsCanvasExtension from './canvas-extensions/collapsible-groups-canvas-extension'
2222
import WindowsManager from './windows-manager'
23+
import CanvasWrapperDataTaggerCanvasExtension from './canvas-extensions/canvas-wrapper-data-tagger-canvas-extension'
2324

2425
const CANVAS_EXTENSIONS: any[] = [
26+
CanvasWrapperDataTaggerCanvasExtension,
2527
NodeDataTaggerCanvasExtension,
2628
EdgeDataTaggerCanvasExtension,
2729
InteractionTaggerCanvasExtension,

src/settings.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export interface AdvancedCanvasPluginSettings {
2525
disablePan: boolean
2626

2727
collapsibleGroupsFeatureEnabled: boolean
28+
collapsedGroupPreviewOnDrag: boolean
2829

2930
stickersFeatureEnabled: boolean
3031

@@ -61,6 +62,7 @@ export const DEFAULT_SETTINGS: Partial<AdvancedCanvasPluginSettings> = {
6162
disablePan: false,
6263

6364
collapsibleGroupsFeatureEnabled: true,
65+
collapsedGroupPreviewOnDrag: true,
6466

6567
stickersFeatureEnabled: true,
6668

@@ -78,7 +80,9 @@ export const DEFAULT_SETTINGS: Partial<AdvancedCanvasPluginSettings> = {
7880
showEdgesIntoDisabledPortals: true
7981
}
8082

81-
export default class AdvancedCanvasSettingsManager {
83+
export default class SettingsManager {
84+
static SETTINGS_CHANGED_EVENT = 'advanced-canvas:settings-changed'
85+
8286
private plugin: AdvancedCanvasPlugin
8387
private settings: AdvancedCanvasPluginSettings
8488
private settingsTab: AdvancedCanvasPluginSettingTab
@@ -89,6 +93,7 @@ export default class AdvancedCanvasSettingsManager {
8993

9094
async loadSettings() {
9195
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.plugin.loadData())
96+
this.plugin.app.workspace.trigger(SettingsManager.SETTINGS_CHANGED_EVENT)
9297
}
9398

9499
async saveSettings() {
@@ -102,6 +107,7 @@ export default class AdvancedCanvasSettingsManager {
102107
async setSetting(data: Partial<AdvancedCanvasPluginSettings>) {
103108
this.settings = Object.assign(this.settings, data)
104109
await this.saveSettings()
110+
this.plugin.app.workspace.trigger(SettingsManager.SETTINGS_CHANGED_EVENT)
105111
}
106112

107113
addSettingsTab() {
@@ -111,9 +117,9 @@ export default class AdvancedCanvasSettingsManager {
111117
}
112118

113119
export class AdvancedCanvasPluginSettingTab extends PluginSettingTab {
114-
settingsManager: AdvancedCanvasSettingsManager
120+
settingsManager: SettingsManager
115121

116-
constructor(plugin: AdvancedCanvasPlugin, settingsManager: AdvancedCanvasSettingsManager) {
122+
constructor(plugin: AdvancedCanvasPlugin, settingsManager: SettingsManager) {
117123
super(plugin.app, plugin)
118124
this.settingsManager = settingsManager
119125
}
@@ -248,6 +254,15 @@ export class AdvancedCanvasPluginSettingTab extends PluginSettingTab {
248254
'collapsibleGroupsFeatureEnabled'
249255
)
250256

257+
new Setting(containerEl)
258+
.setName("Collapsed group preview on drag")
259+
.setDesc("When enabled, a group that is collapsed show its border while dragging a node.")
260+
.addToggle((toggle) =>
261+
toggle
262+
.setValue(this.settingsManager.getSetting('collapsedGroupPreviewOnDrag'))
263+
.onChange(async (value) => await this.settingsManager.setSetting({ collapsedGroupPreviewOnDrag: value }))
264+
)
265+
251266
this.createFeatureHeading(
252267
containerEl,
253268
"Stickers",

src/styles/collapsible-groups.scss

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
transition: transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
2222
}
2323

24-
[data-collapsible-groups-enabled] .canvas-node .canvas-group-label {
24+
.canvas-wrapper[data-collapsible-groups-feature-enabled="true"] .canvas-node .canvas-group-label {
2525
left: calc(40px * var(--zoom-multiplier));
2626
}
2727

@@ -35,6 +35,17 @@
3535
}
3636
}
3737

38+
.canvas-wrapper[data-collapsed-group-preview-on-drag="true"][data-is-dragging] .canvas-node[data-is-collapsed] .canvas-node-container {
39+
display: block;
40+
opacity: 0.5;
41+
42+
border-style: dashed;
43+
44+
.canvas-node-content {
45+
background-color: transparent;
46+
}
47+
}
48+
3849
.canvas-node-interaction-layer[data-target-is-collapsed] {
3950
.canvas-node-resizer {
4051
pointer-events: none;

src/windows-manager.ts

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,17 @@ import AdvancedCanvasPlugin from "./main"
33

44
export default class WindowsManager {
55
plugin: AdvancedCanvasPlugin
6-
windows: Window[] = []
6+
windows: Window[] = [window]
77

88
constructor(plugin: AdvancedCanvasPlugin) {
99
this.plugin = plugin
1010

11-
this.addWindow(window)
12-
1311
this.plugin.registerEvent(this.plugin.app.workspace.on('window-open',
14-
(_win: WorkspaceWindow, window: Window) => this.addWindow(window)
12+
(_win: WorkspaceWindow, window: Window) => this.windows.push(window)
1513
))
1614

1715
this.plugin.registerEvent(this.plugin.app.workspace.on('window-close',
18-
(_win: WorkspaceWindow, window: Window) => this.removeWindow(window)
16+
(_win: WorkspaceWindow, window: Window) => this.windows = this.windows.filter((w) => w !== window)
1917
))
2018
}
21-
22-
private addWindow(window: Window) {
23-
this.windows.push(window)
24-
this.plugin.app.workspace.trigger('advanced-canvas:window-open')
25-
26-
console.log('WindowsManager: window opened', window)
27-
}
28-
29-
private removeWindow(window: Window) {
30-
this.windows = this.windows.filter((w) => w !== window)
31-
this.plugin.app.workspace.trigger('advanced-canvas:window-close')
32-
33-
console.log('WindowsManager: window closed', window)
34-
}
3519
}

0 commit comments

Comments
 (0)