Skip to content

Commit

Permalink
Improvements in tree views (#1220)
Browse files Browse the repository at this point in the history
  • Loading branch information
riccardoferretti committed May 2, 2023
1 parent 1c294d8 commit 93c5d2f
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 120 deletions.
16 changes: 6 additions & 10 deletions packages/foam-vscode/src/features/panels/backlinks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { fromVsCodeUri } from '../../utils/vsc-utils';
import {
ResourceRangeTreeItem,
ResourceTreeItem,
createBacklinkItemsForResource,
groupRangesByResource,
} from '../../utils/tree-view-utils';

Expand Down Expand Up @@ -65,17 +66,12 @@ export class BacklinksTreeDataProvider
return Promise.resolve([]);
}

const connections = this.graph
.getConnections(uri)
.filter(c => c.target.asPlain().isEqual(uri));

const backlinkItems = connections.map(c =>
ResourceRangeTreeItem.createStandardItem(
this.workspace,
this.workspace.get(c.source),
c.link.range
)
const backlinkItems = createBacklinkItemsForResource(
this.workspace,
this.graph,
uri
);

return groupRangesByResource(
this.workspace,
backlinkItems,
Expand Down
50 changes: 33 additions & 17 deletions packages/foam-vscode/src/features/panels/orphans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import { getOrphansConfig } from '../../settings';
import { FoamFeature } from '../../types';
import { GroupedResourcesTreeDataProvider } from '../../utils/grouped-resources-tree-data-provider';
import { ResourceTreeItem, UriTreeItem } from '../../utils/tree-view-utils';
import { IMatcher } from '../../core/services/datastore';
import { FoamWorkspace } from '../../core/model/workspace';
import { FoamGraph } from '../../core/model/graph';

const EXCLUDE_TYPES = ['image', 'attachment'];
const feature: FoamFeature = {
Expand All @@ -17,24 +20,11 @@ const feature: FoamFeature = {
const { matcher } = await createMatcherAndDataStore(
getOrphansConfig().exclude
);
const provider = new GroupedResourcesTreeDataProvider(
'orphans',
'orphan',
const provider = new OrphanTreeView(
context.globalState,
matcher,
() =>
foam.graph
.getAllNodes()
.filter(
uri =>
!EXCLUDE_TYPES.includes(foam.workspace.find(uri)?.type) &&
foam.graph.getConnections(uri).length === 0
),
uri => {
return uri.isPlaceholder()
? new UriTreeItem(uri)
: new ResourceTreeItem(foam.workspace.find(uri), foam.workspace);
}
foam.workspace,
foam.graph,
matcher
);

const treeView = vscode.window.createTreeView('foam-vscode.orphans', {
Expand All @@ -56,4 +46,30 @@ const feature: FoamFeature = {
},
};

export class OrphanTreeView extends GroupedResourcesTreeDataProvider {
constructor(
state: vscode.Memento,
private workspace: FoamWorkspace,
private graph: FoamGraph,
matcher: IMatcher
) {
super('orphans', 'orphan', state, matcher);
}

createTreeItem = uri => {
return uri.isPlaceholder()
? new UriTreeItem(uri)
: new ResourceTreeItem(this.workspace.find(uri), this.workspace);
};

computeResources = () =>
this.graph
.getAllNodes()
.filter(
uri =>
!EXCLUDE_TYPES.includes(this.workspace.find(uri)?.type) &&
this.graph.getConnections(uri).length === 0
);
}

export default feature;
57 changes: 25 additions & 32 deletions packages/foam-vscode/src/features/panels/placeholders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ import { getPlaceholdersConfig } from '../../settings';
import { FoamFeature } from '../../types';
import { GroupedResourcesTreeDataProvider } from '../../utils/grouped-resources-tree-data-provider';
import {
ResourceRangeTreeItem,
UriTreeItem,
createBacklinkItemsForResource,
groupRangesByResource,
} from '../../utils/tree-view-utils';
import { IMatcher } from '../../core/services/datastore';
import { ContextMemento, fromVsCodeUri } from '../../utils/vsc-utils';
import { FoamGraph } from '../../core/model/graph';
import { URI } from '../../core/model/uri';
import { FoamWorkspace } from '../../core/model/workspace';

const feature: FoamFeature = {
activate: async (
Expand All @@ -25,7 +26,8 @@ const feature: FoamFeature = {
);
const provider = new PlaceholderTreeView(
context.globalState,
foam,
foam.workspace,
foam.graph,
matcher
);

Expand Down Expand Up @@ -56,42 +58,19 @@ const feature: FoamFeature = {
};

export class PlaceholderTreeView extends GroupedResourcesTreeDataProvider {
private graph: FoamGraph;
public show = new ContextMemento<'all' | 'for-current-file'>(
this.state,
`foam-vscode.views.${this.providerId}.show`,
'all'
);

public constructor(state: vscode.Memento, foam: Foam, matcher: IMatcher) {
super(
'placeholders',
'placeholder',
state,
matcher,
() => {
// we override computeResources below (as we can't use "this" here)
throw new Error('Not implemented');
},
uri => {
return new UriTreeItem(uri, {
icon: 'link',
getChildren: async () => {
return groupRangesByResource(
foam.workspace,
foam.graph.getBacklinks(uri).map(link => {
return ResourceRangeTreeItem.createStandardItem(
foam.workspace,
foam.workspace.get(link.source),
link.link.range
);
})
);
},
});
}
);
this.graph = foam.graph;
public constructor(
state: vscode.Memento,
private workspace: FoamWorkspace,
private graph: FoamGraph,
matcher: IMatcher
) {
super('placeholders', 'placeholder', state, matcher);
this.disposables.push(
vscode.commands.registerCommand(
`foam-vscode.views.${this.providerId}.show:all`,
Expand All @@ -110,6 +89,20 @@ export class PlaceholderTreeView extends GroupedResourcesTreeDataProvider {
);
}

createTreeItem = uri => {
const item = new UriTreeItem(uri, {
collapsibleState: vscode.TreeItemCollapsibleState.Collapsed,
});
item.getChildren = async () => {
return groupRangesByResource(
this.workspace,
createBacklinkItemsForResource(this.workspace, this.graph, uri)
);
};
item.iconPath = new vscode.ThemeIcon('link');
return item;
};

computeResources = (): URI[] => {
if (this.show.get() === 'for-current-file') {
const currentFile = vscode.window.activeTextEditor?.document.uri;
Expand Down
3 changes: 2 additions & 1 deletion packages/foam-vscode/src/features/panels/tags-explorer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ export class TagsProvider implements vscode.TreeDataProvider<TagTreeItem> {
ResourceRangeTreeItem.createStandardItem(
this.workspace,
note,
t.range
t.range,
'tag'
)
);
return [...acc, ...items];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,12 @@ export class GroupedResourcesTreeDataProvider
private resourceName: string,
protected state: vscode.Memento,
private matcher: IMatcher,
protected computeResources: () => Array<URI>,
private createTreeItem: (item: URI) => GroupedResourceTreeItem
protected computeResources: () => Array<URI> = () => {
throw new Error('Not implemented');
},
protected createTreeItem: (item: URI) => GroupedResourceTreeItem = () => {
throw new Error('Not implemented');
}
) {
this.disposables.push(
vscode.commands.registerCommand(
Expand Down Expand Up @@ -151,7 +155,7 @@ export class GroupedResourcesTreeDataProvider
resolveTreeItem(
item: GroupedResourceTreeItem
): Promise<GroupedResourceTreeItem> {
return item.resolveTreeItem();
return item.resolveTreeItem() as Promise<GroupedResourceTreeItem>;
}

private doComputeResources(): void {
Expand Down
Loading

0 comments on commit 93c5d2f

Please sign in to comment.