11import * as vscode from 'vscode' ;
22import * 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+ }
346
4- const bar = vscode . window . createStatusBarItem ( vscode . StatusBarAlignment . Left ) ;
547
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+ ` ;
1065}
1166
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+ }
24131 }
25132}
26133
134+ export const manager = new Manager ( ) ;
135+
136+
137+
27138export 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 ) ;
29152 context . subscriptions . push ( disposable ) ;
30- showStatus ( ) ;
31153}
0 commit comments