1
1
import * as vscode from 'vscode' ;
2
2
import * as conf from '../utils/configuration' ;
3
+ import { CommandInterface , utils } from 'emulators' ;
4
+
5
+ class JsdosTerminal implements vscode . Pseudoterminal {
6
+ onDidWrite : vscode . Event < string > ;
7
+ writeEmitter : vscode . EventEmitter < string > ;
8
+ stdout = "" ;
9
+ shell : utils . Shell ;
10
+ constructor ( private ci : CommandInterface ) {
11
+ this . shell = new utils . Shell ( ci ) ;
12
+ this . writeEmitter = new vscode . EventEmitter < string > ( ) ;
13
+ this . onDidWrite = this . writeEmitter . event ;
14
+ let stdout = "" ;
15
+ ci . events ( ) . onStdout (
16
+ data => {
17
+ stdout += data ;
18
+ this . stdout += data ;
19
+ if ( [ "\n" , ">" , "-" ] . some ( p => data . includes ( p ) ) ) {
20
+ this . writeEmitter . fire ( stdout ) ;
21
+ stdout = "" ;
22
+ }
23
+ }
24
+ ) ;
25
+ }
26
+ onDidOverrideDimensions ?: vscode . Event < vscode . TerminalDimensions | undefined > | undefined ;
27
+ onDidClose ?: vscode . Event < number | void > | undefined ;
28
+ onDidChangeName ?: vscode . Event < string > | undefined ;
29
+ open ( initialDimensions : vscode . TerminalDimensions | undefined ) : void {
30
+ this . writeEmitter . fire ( '\x1b[31mJSDos\x1b[0m\r\nhello' ) ;
31
+ }
32
+ close ( ) : void {
33
+ this . ci . exit ( ) ;
34
+ }
35
+ input = "" ;
36
+ handleInput ?( data : string ) : void {
37
+ if ( data === "\r" ) {
38
+ this . shell . exec ( this . input )
39
+ this . input = "" ;
40
+ } else {
41
+ this . writeEmitter . fire ( "\x1b[31m" + data + "\x1b[0m" ) ;
42
+ this . input += data ;
43
+ }
44
+ }
45
+ }
3
46
4
- const bar = vscode . window . createStatusBarItem ( vscode . StatusBarAlignment . Left ) ;
5
47
6
- function showStatus ( ) {
7
- bar . command = 'masmtasm.updateEmuASM' ;
8
- bar . text = `${ conf . extConf . emulator } ${ conf . extConf . asmType } ` ;
9
- bar . show ( ) ;
48
+ function getWebviewContent ( webview : vscode . Webview , extensionUri : vscode . Uri ) {
49
+ const scriptUri = webview . asWebviewUri ( vscode . Uri . joinPath ( extensionUri , 'resources' , 'webview' , 'script.js' ) ) ;
50
+ return `
51
+ <!DOCTYPE html>
52
+ <html lang="en">
53
+ <head>
54
+ <meta charset="UTF-8">
55
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
56
+ <title>时间延迟计算器</title>
57
+ </head>
58
+ <body>
59
+ <div id="result"></div>
60
+ <div><canvas id="layout"></canvas></div>
61
+ <script src="${ scriptUri } "></script>
62
+ </body>
63
+ </html>
64
+ ` ;
10
65
}
11
66
12
- async function statusBarCommand ( ) {
13
- const _conf = vscode . workspace . getConfiguration ( 'masmtasm.ASM' ) ;
14
- const items = [ "show jsdos view" , "show terminal" ]
15
-
16
- const placeHolder = 'manipulate emulator' ;
17
- const Selected = await vscode . window . showQuickPick ( items , { placeHolder } ) ;
18
- if ( Selected ) {
19
- const [ emu1 , asm1 ] = Selected ?. split ( '\t' ) ;
20
- const target = vscode . ConfigurationTarget . Global ;
21
- await _conf . update ( 'emulator' , emu1 , target ) ;
22
- await _conf . update ( 'assembler' , asm1 , target ) ;
23
- showStatus ( ) ;
67
+
68
+ class Manager {
69
+ ci : CommandInterface | undefined = undefined ;
70
+ terminal :vscode . Terminal | undefined = undefined ;
71
+ updateci ( ci : CommandInterface ) {
72
+ const bar = vscode . window . createStatusBarItem ( vscode . StatusBarAlignment . Left ) ;
73
+ bar . command = 'masmtasm.emulatorStatus' ;
74
+ bar . text = `jsdos` ;
75
+ bar . show ( ) ;
76
+
77
+ this . ci = ci ;
78
+ const pty = new JsdosTerminal ( this . ci ) ;
79
+ this . terminal = vscode . window . createTerminal ( { name : "jsdos" , pty, } ) ;
80
+ }
81
+ webview ( context :vscode . ExtensionContext ) {
82
+ if ( this . ci ) {
83
+ const panel = vscode . window . createWebviewPanel (
84
+ "jsdos" ,
85
+ "jsdos panel" ,
86
+ { viewColumn : vscode . ViewColumn . Beside } ,
87
+ {
88
+ enableScripts : true
89
+ }
90
+ )
91
+ const currentTime = new Date ( ) . getTime ( ) ;
92
+
93
+ panel . webview . html = getWebviewContent ( panel . webview , context . extensionUri ) ;
94
+ panel . webview . postMessage ( { command : 'setTime' , time : currentTime } ) ;
95
+
96
+ panel . webview . postMessage ( {
97
+ command : "ci" ,
98
+ width : this . ci ?. width ( ) ,
99
+ height : this . ci ?. height ( )
100
+ } ) ;
101
+ this . ci ?. events ( ) . onFrame ( ( rgb , rgba ) => {
102
+ panel . webview . postMessage ( {
103
+ command : 'rgb' ,
104
+ time : new Date ( ) . getTime ( ) ,
105
+ data : rgb
106
+ } ) ;
107
+ } ) ;
108
+ panel . webview . onDidReceiveMessage (
109
+ message => {
110
+ console . log ( message ) ;
111
+ switch ( message . command ) {
112
+ case 'alert' :
113
+ vscode . window . showInformationMessage ( message . text ) ;
114
+ return ;
115
+ case 'keyup' :
116
+ const up = utils . htmlKey2jsdos ( message . code ) ;
117
+ if ( up && this . ci )
118
+ this . ci . sendKeyEvent ( up , false ) ;
119
+ return ;
120
+ case 'keydown' :
121
+ const down = utils . htmlKey2jsdos ( message . code ) ;
122
+ if ( down && this . ci )
123
+ this . ci . sendKeyEvent ( down , true ) ;
124
+ return ;
125
+ }
126
+ } ,
127
+ undefined ,
128
+ context . subscriptions
129
+ ) ;
130
+ }
24
131
}
25
132
}
26
133
134
+ export const manager = new Manager ( ) ;
135
+
136
+
137
+
27
138
export function activate ( context : vscode . ExtensionContext ) : void {
28
- const disposable = vscode . commands . registerCommand ( 'masmtasm.updateEmuASM' , statusBarCommand ) ;
139
+ async function statusBarCommand ( ) {
140
+ const items = [ "show jsdos view" , "show terminal" ] ;
141
+
142
+ const placeHolder = 'manipulate emulator' ;
143
+ const seleted = await vscode . window . showQuickPick ( items , { placeHolder } ) ;
144
+ if ( seleted === items [ 0 ] ) {
145
+ manager . webview ( context ) ;
146
+ }
147
+ if ( seleted === items [ 1 ] ) {
148
+ manager . terminal ?. show ( ) ;
149
+ }
150
+ }
151
+ const disposable = vscode . commands . registerCommand ( 'masmtasm.emulatorStatus' , statusBarCommand ) ;
29
152
context . subscriptions . push ( disposable ) ;
30
- showStatus ( ) ;
31
153
}
0 commit comments