Skip to content

Commit 8343578

Browse files
committed
Allow re-ordering testcases by dragging
Fixes #138
1 parent bc5b4fa commit 8343578

File tree

5 files changed

+377
-15
lines changed

5 files changed

+377
-15
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- Support for opened files without active workspaces
66
- Icon to copy the text of the text boxes
7+
- Icon to drag testcase to new positions to be able to re-order them
78

89
### Changed
910

src/extension/providers/JudgeViewProvider.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
NewInteractorSecretMessageSchema,
3838
NextMessageSchema,
3939
ProviderMessageSchema,
40+
ReorderMessageSchema,
4041
RequestFullDataMessageSchema,
4142
RequestTrimmedDataMessageSchema,
4243
SaveMessageSchema,
@@ -705,6 +706,9 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
705706
case "NEW_INTERACTOR_SECRET":
706707
this._newInteractorSecret(msg);
707708
break;
709+
case "REORDER":
710+
this._reorder(msg);
711+
break;
708712
}
709713
}
710714

@@ -1100,6 +1104,27 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
11001104
return newState.uuid;
11011105
}
11021106

1107+
private _reorder({ sourceUuid, targetIndex }: v.InferOutput<typeof ReorderMessageSchema>) {
1108+
const sourceIndex = this._runtime.state.findIndex((testcase) => testcase.uuid === sourceUuid);
1109+
if (sourceIndex === -1) {
1110+
return;
1111+
}
1112+
1113+
const maxIndex = this._runtime.state.length - 1;
1114+
const clampedTargetIndex = Math.max(0, Math.min(Math.trunc(targetIndex), maxIndex));
1115+
if (sourceIndex === clampedTargetIndex) {
1116+
return;
1117+
}
1118+
1119+
const [moved] = this._runtime.state.splice(sourceIndex, 1);
1120+
if (!moved) {
1121+
return;
1122+
}
1123+
1124+
this._runtime.state.splice(clampedTargetIndex, 0, moved);
1125+
this.requestSave();
1126+
}
1127+
11031128
private _createTestcaseState(mode: Mode, testcase: Partial<Testcase> | undefined, file: string) {
11041129
const uuid = testcase?.uuid ?? crypto.randomUUID();
11051130

src/shared/judge-messages.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ export const ProviderMessageTypeValues = [
3131
"TL",
3232
"ML",
3333
"COPY",
34+
"REQUEST_TRIMMED_DATA",
35+
"REQUEST_FULL_DATA",
36+
"NEW_INTERACTOR_SECRET",
37+
"REORDER",
3438
] as const;
3539

3640
export type ProviderMessageTypeValue = (typeof ProviderMessageTypeValues)[number];
@@ -105,6 +109,12 @@ export const NewInteractorSecretMessageSchema = v.object({
105109
data: v.string(),
106110
});
107111

112+
export const ReorderMessageSchema = v.object({
113+
type: v.literal("REORDER"),
114+
sourceUuid: v.string(),
115+
targetIndex: v.number(),
116+
});
117+
108118
export const ProviderMessageSchema = v.union([
109119
LoadedMessageSchema,
110120
NextMessageSchema,
@@ -118,6 +128,7 @@ export const ProviderMessageSchema = v.union([
118128
RequestTrimmedDataMessageSchema,
119129
RequestFullDataMessageSchema,
120130
NewInteractorSecretMessageSchema,
131+
ReorderMessageSchema,
121132
]);
122133

123134
export type ProviderMessage = v.InferOutput<typeof ProviderMessageSchema>;

0 commit comments

Comments
 (0)