Skip to content

Commit 3080ddc

Browse files
committed
Various UI changes
1 parent ca4a5cb commit 3080ddc

File tree

10 files changed

+80
-54
lines changed

10 files changed

+80
-54
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
- Always show the icon to indicate the type of current testcase and make it clickable to toggle testcase interactivity
1212
- Also show the dropdown button (that does nothing) for compiling status to keep the toolbars consistent
1313
- Shorten the compiling error to just "CE" in stress tester for consistency
14+
- Allow dropdown when compiling
15+
- Allow showing details even in faded with same effect
16+
- Don't clear previous data from stress testers when compiling
1417

1518
### Fixed
1619

src/extension/providers/StressViewProvider.ts

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as vscode from "vscode";
22
import * as v from "valibot";
33
import * as crypto from "crypto";
44

5-
import { StatusSchema, type Status } from "../../shared/enums";
5+
import type { Status } from "../../shared/enums";
66
import BaseViewProvider from "./BaseViewProvider";
77
import {
88
compile,
@@ -29,21 +29,11 @@ import {
2929
OpenMessageSchema,
3030
ProviderMessageSchema,
3131
SaveMessageSchema,
32-
StateIdValue,
3332
ToggleVisibilityMessageSchema,
3433
ViewMessageSchema,
35-
type StateId,
3634
type WebviewMessage,
3735
} from "../../shared/stress-messages";
38-
39-
const StressDataSchema = v.object({
40-
stdin: v.fallback(v.string(), ""),
41-
stdout: v.fallback(v.string(), ""),
42-
stderr: v.fallback(v.string(), ""),
43-
status: v.fallback(StatusSchema, "NA"),
44-
state: v.picklist(StateIdValue),
45-
shown: v.fallback(v.boolean(), true),
46-
});
36+
import { StressDataSchema, type StateId } from "../../shared/schemas";
4737

4838
const FileDataSchema = v.object({
4939
interactiveMode: v.fallback(v.boolean(), false),
@@ -277,7 +267,6 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
277267
if (!ctx) return;
278268

279269
super._postMessage({ type: "INIT", interactiveMode: ctx.interactiveMode });
280-
super._postMessage({ type: "CLEAR" });
281270

282271
const resendTruncatedData = (handler: TextHandler) => {
283272
const data = handler.data;
@@ -286,6 +275,7 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
286275
};
287276

288277
for (const state of ctx.state) {
278+
super._postMessage({ type: "CLEAR", id: state.state });
289279
super._postMessage({
290280
type: "STATUS",
291281
id: state.state,
@@ -414,12 +404,13 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
414404
},
415405
file
416406
);
417-
state.stdout.reset();
418-
state.stderr.reset();
419407
return compilePromise
420408
.then((res) => {
421409
if (res.code !== 0) {
422410
state.status = "CE";
411+
super._postMessage({ type: "CLEAR", id: state.state }, file);
412+
state.stdout.reset();
413+
state.stderr.reset();
423414
state.stdout.write(res.stdout, "final");
424415
state.stderr.write(res.stderr, "final");
425416
super._postMessage({ type: "STATUS", id: state.state, status: "CE" }, file);
@@ -435,12 +426,6 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
435426
});
436427
};
437428

438-
super._postMessage(
439-
{
440-
type: "CLEAR",
441-
},
442-
file
443-
);
444429
const results = await Promise.all([
445430
addCompileTask(generatorState, solutionSettings.generatorFile!),
446431
addCompileTask(solutionState, file),
@@ -491,8 +476,8 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
491476

492477
const start = Date.now();
493478
while (!ctx.stopFlag && (timeLimit === 0 || Date.now() - start <= timeLimit)) {
494-
super._postMessage({ type: "CLEAR" }, file);
495479
for (const state of ctx.state) {
480+
super._postMessage({ type: "CLEAR", id: state.state }, file);
496481
state.stdin.reset();
497482
state.stdout.reset();
498483
state.stderr.reset();
@@ -585,13 +570,12 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
585570

586571
if (ctx.clearFlag) {
587572
for (const state of ctx.state) {
573+
super._postMessage({ type: "CLEAR", id: state.state }, file);
588574
state.stdin.reset();
589575
state.stdout.reset();
590576
state.stderr.reset();
591577
state.status = "NA";
592578
}
593-
594-
super._postMessage({ type: "CLEAR" }, file);
595579
}
596580
ctx.clearFlag = false;
597581

@@ -750,6 +734,7 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
750734
this.stop();
751735
} else {
752736
for (const state of ctx.state) {
737+
super._postMessage({ type: "CLEAR", id: state.state });
753738
state.stdin.reset();
754739
state.stdout.reset();
755740
state.stderr.reset();
@@ -761,7 +746,6 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
761746
status: "NA",
762747
});
763748
}
764-
super._postMessage({ type: "CLEAR" });
765749

766750
if (this._currentFile) {
767751
void this._saveState(this._currentFile);

src/shared/schemas.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { StatusSchema } from "./enums";
44
export const MODES = ["standard", "interactive"] as const;
55
export type Mode = (typeof MODES)[number];
66

7+
export const StateIdValue = ["Generator", "Solution", "Judge"] as const;
8+
export type StateId = (typeof StateIdValue)[number];
9+
710
export const LanguageSettingsSchema = v.object({
811
compileCommand: v.optional(v.array(v.string())),
912
runCommand: v.optional(v.array(v.string())),
@@ -61,6 +64,15 @@ export const TestcaseSchema = v.object({
6164
interactorSecret: v.fallback(v.string(), ""),
6265
});
6366

67+
export const StressDataSchema = v.object({
68+
stdin: v.fallback(v.string(), ""),
69+
stdout: v.fallback(v.string(), ""),
70+
stderr: v.fallback(v.string(), ""),
71+
status: v.fallback(StatusSchema, "NA"),
72+
state: v.picklist(StateIdValue),
73+
shown: v.fallback(v.boolean(), true),
74+
});
75+
6476
export type Testcase = v.InferOutput<typeof TestcaseSchema>;
6577
export type TestcaseProperty = Exclude<keyof Testcase, "uuid">;
6678

src/shared/stress-messages.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as v from "valibot";
22
import { StatusSchema, StdioValues } from "./enums";
3+
import { StateIdValue } from "./schemas";
34

45
export const WebviewMessageTypeValues = [
56
"INIT",
@@ -11,12 +12,8 @@ export const WebviewMessageTypeValues = [
1112
"SETTINGS_TOGGLE",
1213
] as const;
1314

14-
export const StateIdValue = ["Generator", "Solution", "Judge"] as const;
15-
1615
export type WebviewMessageTypeValue = (typeof WebviewMessageTypeValues)[number];
1716

18-
export type StateId = (typeof StateIdValue)[number];
19-
2017
export const WebviewMessageTypeSchema = v.picklist(WebviewMessageTypeValues);
2118

2219
export const InitMessageSchema = v.object({
@@ -39,6 +36,7 @@ export const StdioMessageSchema = v.object({
3936

4037
export const ClearMessageSchema = v.object({
4138
type: v.literal("CLEAR"),
39+
id: v.picklist(StateIdValue),
4240
});
4341

4442
export const ShowMessageSchema = v.object({

src/webview/judge/App.svelte

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,13 @@
232232
{#each testcases as testcase, index (testcase.uuid)}
233233
<div class="testcase-item">
234234
<TestcaseToolbar {testcase} onprerun={() => handlePrerun(testcase.uuid)} />
235-
<Testcase bind:testcase={testcases[index]} bind:this={testcaseRefs[testcase.uuid]} />
235+
{#if testcase.status === "COMPILING" || testcase.skipped}
236+
<div class="half-opacity">
237+
<Testcase bind:testcase={testcases[index]} bind:this={testcaseRefs[testcase.uuid]} />
238+
</div>
239+
{:else}
240+
<Testcase bind:testcase={testcases[index]} bind:this={testcaseRefs[testcase.uuid]} />
241+
{/if}
236242
</div>
237243
{/each}
238244
<div class="new-button-wrapper">
@@ -442,4 +448,9 @@
442448
margin-top: 4px;
443449
margin-bottom: 24px;
444450
}
451+
452+
.half-opacity {
453+
opacity: 0.5;
454+
pointer-events: none;
455+
}
445456
</style>

src/webview/judge/Testcase.svelte

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,8 @@
4848
4949
const status = $derived(testcase.status);
5050
const visible = $derived(testcase.shown);
51-
const skipped = $derived(testcase.skipped);
5251
const toggled = $derived(testcase.toggled);
53-
const showDetails = $derived(!skipped && visible && !(status === "AC" && !toggled));
52+
const showDetails = $derived(visible && !(status === "AC" && !toggled));
5453
5554
export function reset() {
5655
newStdin = "";
@@ -65,7 +64,7 @@
6564
</script>
6665

6766
{#if showDetails}
68-
{#if status === "NA" || status === "AC" || status === "WA" || status === "RE" || status === "TL" || status === "ML" || status === "CE"}
67+
{#if status === "NA" || status === "AC" || status === "WA" || status === "RE" || status === "TL" || status === "ML" || status === "CE" || status === "COMPILING"}
6968
{#if status !== "CE"}
7069
{#if testcase.mode === "interactive"}
7170
<AutoresizeTextarea

src/webview/judge/TestcaseToolbar.svelte

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@
7272
data-tooltip={showDetails ? "Hide Details" : "Show Details"}
7373
aria-label={showDetails ? "Hide" : "Show"}
7474
onclick={handleToggleVisibility}
75-
disabled={skipped}
7675
>
7776
<div
7877
class="codicon codicon-bolded {showDetails
@@ -200,7 +199,7 @@
200199
class="toolbar-icon toolbar-icon-exclude-highlight"
201200
data-tooltip={visible ? "Hide Details" : "Show Details"}
202201
aria-label={visible ? "Hide" : "Show"}
203-
disabled
202+
onclick={handleToggleVisibility}
204203
>
205204
<div
206205
class="codicon codicon-bolded {visible

src/webview/stress/App.svelte

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
import type * as v from "valibot";
44
55
import type { Status, Stdio } from "../../shared/enums";
6+
import { type StateId, StateIdValue } from "../../shared/schemas";
67
import {
7-
StateIdValue,
8+
type ClearMessageSchema,
89
type ShowMessageSchema,
910
type StatusMessageSchema,
1011
type StdioMessageSchema,
1112
type WebviewMessage,
12-
type StateId,
1313
InitMessageSchema,
1414
} from "../../shared/stress-messages";
1515
import { postProviderMessage } from "./message";
@@ -99,11 +99,13 @@
9999
}
100100
}
101101
102-
function handleClear() {
102+
function handleClear({ id }: v.InferOutput<typeof ClearMessageSchema>) {
103103
for (const state of states) {
104-
state.stdin = "";
105-
state.stdout = "";
106-
state.stderr = "";
104+
if (state.id === id) {
105+
state.stdin = "";
106+
state.stdout = "";
107+
state.stderr = "";
108+
}
107109
}
108110
}
109111
@@ -153,7 +155,7 @@
153155
handleStdio(event.data);
154156
break;
155157
case "CLEAR":
156-
handleClear();
158+
handleClear(event.data);
157159
break;
158160
case "SHOW":
159161
handleShow(event.data);
@@ -213,14 +215,27 @@
213215
onToggleVisibility={handleToggleVisibility}
214216
onToggleInteractive={handleToggleInteractive}
215217
/>
216-
<State
217-
id={item.id}
218-
state={item}
219-
placeholder={item.placeholder}
220-
{interactiveMode}
221-
shown={item.shown}
222-
onView={handleView}
223-
/>
218+
{#if item.status === "COMPILING"}
219+
<div class="half-opacity">
220+
<State
221+
id={item.id}
222+
state={item}
223+
placeholder={item.placeholder}
224+
{interactiveMode}
225+
shown={item.shown}
226+
onView={handleView}
227+
/>
228+
</div>
229+
{:else}
230+
<State
231+
id={item.id}
232+
state={item}
233+
placeholder={item.placeholder}
234+
{interactiveMode}
235+
shown={item.shown}
236+
onView={handleView}
237+
/>
238+
{/if}
224239
</div>
225240
{/each}
226241
{/if}
@@ -343,4 +358,9 @@
343358
.text-button :global(.codicon) {
344359
margin-right: 4px;
345360
}
361+
362+
.half-opacity {
363+
opacity: 0.5;
364+
pointer-events: none;
365+
}
346366
</style>

src/webview/stress/State.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
22
import type { Status, Stdio } from "../../shared/enums";
3-
import type { StateId } from "../../shared/stress-messages";
3+
import type { StateId } from "../../shared/schemas";
44
import AutoresizeTextarea from "../AutoresizeTextarea.svelte";
55
66
interface IState {
@@ -56,7 +56,7 @@
5656
variant="stderr"
5757
/>
5858
<AutoresizeTextarea value={state.stdout} readonly hiddenOnEmpty onexpand={handleViewStdout} />
59-
{:else if status !== "COMPILING"}
59+
{:else}
6060
<AutoresizeTextarea value={state.stdin} readonly hiddenOnEmpty onexpand={handleViewStdin} />
6161
<AutoresizeTextarea
6262
value={state.stderr}

src/webview/stress/StateToolbar.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
22
import type { Status } from "../../shared/enums";
3-
import type { StateId } from "../../shared/stress-messages";
3+
import type { StateId } from "../../shared/schemas";
44
import Tooltip from "../Tooltip.svelte";
55
66
interface Props {
@@ -56,7 +56,7 @@
5656
class="state-toolbar-icon state-toolbar-icon-exclude-highlight"
5757
data-tooltip={showDetails ? "Hide Details" : "Show Details"}
5858
aria-label={showDetails ? "Hide" : "Show"}
59-
disabled
59+
onclick={handleToggleVisibility}
6060
>
6161
<div
6262
class="codicon codicon-bolded {showDetails

0 commit comments

Comments
 (0)