Skip to content

Commit 64dc107

Browse files
committed
Add buttons for adding template file
1 parent eca5262 commit 64dc107

5 files changed

Lines changed: 75 additions & 25 deletions

File tree

client/src/commands.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as vscode from "vscode";
77
import * as protocol from "./protocol";
88
import { LanguageClient } from "vscode-languageclient/node";
99
import { generateCalc } from './lm';
10+
import { ScgNode, ScgTreeItemType } from './scgTreeProvider';
1011

1112
export function registerCommandDetectCycles(context: vscode.ExtensionContext, client: LanguageClient) {
1213
vscode.commands.registerCommand("septic.detectCycles", async () => {
@@ -129,17 +130,44 @@ export function registerCommandOpcTagList(context: vscode.ExtensionContext, clie
129130
});
130131
}
131132

133+
export function registerCommandAddTemplate() {
134+
vscode.commands.registerCommand('septic.scgtree.addTemplate', async (node: ScgNode) => {
135+
if (!node) {
136+
return;
137+
}
138+
const template = await vscode.window.showInputBox({
139+
placeHolder: "Enter template name"
140+
});
141+
const sources = (await node.config.getSources()).map(s => ({ label: s.id, value: s.id }));
142+
const source = await vscode.window.showQuickPick([{ label: 'No source', value: undefined }, ...sources]);
143+
if (!template || !source) {
144+
return;
145+
}
146+
const elementToInsertAfter = node.type === ScgTreeItemType.Template ? node.label : undefined;
147+
node.config.addTemplate(template, source.value, elementToInsertAfter);
148+
await node.config.save()
149+
const wsedit = new vscode.WorkspaceEdit();
150+
const filePath = vscode.Uri.file(node.config.templatepath + "/" + template);
151+
wsedit.createFile(filePath);
152+
await vscode.workspace.applyEdit(wsedit);
153+
await vscode.window.showTextDocument(filePath, {
154+
preserveFocus: false,
155+
});
156+
});
157+
}
158+
132159
export function registerCommandGenerateCalc(context: vscode.ExtensionContext, client: LanguageClient) {
133160
vscode.commands.registerCommand("septic.generateCalc", async (description: string, start: vscode.Position, end: vscode.Position) => {
134161
generateCalc(client, description, start, end);
135162
});
136163
}
137164

138-
export function registerAllCommands(context: vscode.ExtensionContext, client: LanguageClient) {
165+
export function registerCommands(context: vscode.ExtensionContext, client: LanguageClient) {
139166
registerCommandDetectCycles(context, client);
140167
registerCommandCompareCnfg(context, client);
141168
registerCommandOpcTagList(context, client);
142169
registerCommandGenerateCalc(context, client);
170+
registerCommandAddTemplate();
143171
}
144172

145173

client/src/extension.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
ServerOptions,
1212
TransportKind,
1313
} from "vscode-languageclient/node";
14-
import { registerAllCommands } from './commands';
14+
import { registerCommands } from './commands';
1515
import { registerRequestHandlers } from "./requests";
1616
import { registerChatTools } from './tools';
1717
import { registerSepticChatParticipant } from './chatParticipant';
@@ -64,9 +64,8 @@ export function activate(context: vscode.ExtensionContext) {
6464
}
6565
scgProjectProvider.refresh();
6666
})
67-
vscode.commands.registerCommand('septic.refreshEntry', () => scgProjectProvider.refresh());
6867
registerChatTools(context, client)
69-
registerAllCommands(context, client);
68+
registerCommands(context, client);
7069
registerRequestHandlers(client);
7170
registerSepticChatParticipant(context, client)
7271
client.start();

client/src/scg.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,28 @@ export class ScgConfig {
6868
return sources;
6969
}
7070

71+
public addTemplate(name: string, source: string | undefined, elementToInsertAfter: string | undefined = undefined): void {
72+
if (elementToInsertAfter) {
73+
const index = this.config.layout.findIndex(item => item.name === elementToInsertAfter);
74+
if (index !== -1) {
75+
this.config.layout.splice(index + 1, 0, {
76+
name,
77+
source: source,
78+
});
79+
} else {
80+
this.config.layout.push({
81+
name,
82+
source: source,
83+
});
84+
}
85+
} else {
86+
this.config.layout.push({
87+
name,
88+
source: source,
89+
});
90+
}
91+
}
92+
7193
get name(): string {
7294
return path.basename(this.path);
7395
}

client/src/scgTreeProvider.ts

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ export class ScgTreeProvider implements vscode.TreeDataProvider<ScgNode> {
2424
return Promise.resolve(this.getScgConfigs());
2525
}
2626
if (element.type === ScgTreeItemType.Config && element.config) {
27-
const layout = new ScgNode("Layout", ScgTreeItemType.Layout, vscode.TreeItemCollapsibleState.Expanded, element.config, element.file);
28-
const sources = new ScgNode("Sources", ScgTreeItemType.Sources, vscode.TreeItemCollapsibleState.Collapsed, element.config, element.file);
27+
const layout = new ScgNode("Layout", ScgTreeItemType.Layout, vscode.TreeItemCollapsibleState.Expanded, element.config);
28+
const sources = new ScgNode("Sources", ScgTreeItemType.Sources, vscode.TreeItemCollapsibleState.Collapsed, element.config);
2929
return Promise.resolve([layout, sources]);
3030
} else if (element.type === ScgTreeItemType.Layout) {
3131
const items: ScgNode[] = [];
3232
for (const layout of element.config.layout) {
33-
items.push(new ScgNode(layout.name, ScgTreeItemType.Template, vscode.TreeItemCollapsibleState.None, undefined, undefined, {
33+
items.push(new ScgNode(layout.name, ScgTreeItemType.Template, vscode.TreeItemCollapsibleState.None, element.config, {
3434
command: 'vscode.open',
3535
title: 'Open Template',
3636
arguments: [vscode.Uri.file(element.config.templatepath + "/" + layout.name || '')]
@@ -41,7 +41,7 @@ export class ScgTreeProvider implements vscode.TreeDataProvider<ScgNode> {
4141
const items: ScgNode[] = [];
4242
const sources = await element.config.getSources();
4343
for (const source of sources) {
44-
items.push(new ScgNode(source.id, ScgTreeItemType.Source, vscode.TreeItemCollapsibleState.Collapsed, element.config, element.file, {
44+
items.push(new ScgNode(source.id, ScgTreeItemType.Source, vscode.TreeItemCollapsibleState.Collapsed, element.config, {
4545
command: 'vscode.open',
4646
title: 'Open Source',
4747
arguments: [vscode.Uri.file(source.filename)]
@@ -71,29 +71,17 @@ export class ScgTreeProvider implements vscode.TreeDataProvider<ScgNode> {
7171
const treeItems: ScgNode[] = [];
7272
scgConfigs.sort((a, b) => a.name.localeCompare(b.name));
7373
for (const config of scgConfigs) {
74-
treeItems.push(new ScgNode(config.name, ScgTreeItemType.Config, vscode.TreeItemCollapsibleState.Expanded, config, config.path, {
74+
treeItems.push(new ScgNode(config.name, ScgTreeItemType.Config, vscode.TreeItemCollapsibleState.Expanded, config, {
7575
command: 'vscode.open',
7676
title: 'Open Config',
7777
arguments: [vscode.Uri.file(config.path)]
7878
}));
7979
}
8080
return treeItems;
8181
}
82-
83-
private async getScgSourceColumns(file: string, delimiter: string): Promise<string[]> {
84-
try {
85-
const content = await vscode.workspace.fs.readFile(vscode.Uri.file(file));
86-
const lines = content.toString().split('\n');
87-
const headers = lines[0].split(delimiter);
88-
return headers.map(header => header.trim());
89-
} catch (error) {
90-
console.error('Error reading source columns:', error);
91-
return [];
92-
}
93-
}
9482
}
9583

96-
enum ScgTreeItemType {
84+
export enum ScgTreeItemType {
9785
Config = "Config",
9886
Template = "Template",
9987
Layout = "Layout",
@@ -108,16 +96,15 @@ export class ScgNode extends vscode.TreeItem {
10896
public readonly label: string,
10997
public readonly type: ScgTreeItemType,
11098
public readonly collapsibleState: vscode.TreeItemCollapsibleState,
111-
public readonly config?: ScgConfig,
112-
public readonly file?: string,
99+
public readonly config: ScgConfig,
113100
public readonly command?: vscode.Command
114101
) {
115102
super(label, collapsibleState);
116103

117104
this.tooltip = `${this.label}`;
118105
this.description = this.type;
119106
this.contextValue = this.type;
120-
if (type === ScgTreeItemType.Config && file) {
107+
if (type === ScgTreeItemType.Config) {
121108
this.iconPath = new vscode.ThemeIcon("settings-view-bar-icon");
122109
} else if (type === ScgTreeItemType.Layout) {
123110
this.iconPath = new vscode.ThemeIcon("folder");

package.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@
4242
{
4343
"command": "septic.generateCalc",
4444
"title": "Septic: Generate Calc"
45+
},
46+
{
47+
"command": "septic.scgtree.addTemplate",
48+
"title": "Septic: Insert template below",
49+
"icon": "$(add)"
4550
}
4651
],
4752
"configuration": {
@@ -201,6 +206,15 @@
201206
}
202207
]
203208
},
209+
"menus": {
210+
"view/item/context": [
211+
{
212+
"command": "septic.scgtree.addTemplate",
213+
"when": "view == septic-scg && (viewItem == Template || viewItem == Layout)",
214+
"group": "inline"
215+
}
216+
]
217+
},
204218
"chatParticipants": [
205219
{
206220
"id": "septic.chat",

0 commit comments

Comments
 (0)