Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
443a4bda3a |
40
src/drawApp/graphics/CustomDialogInteraction.ts
Normal file
40
src/drawApp/graphics/CustomDialogInteraction.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import * as pb_1 from 'google-protobuf';
|
||||||
|
import {
|
||||||
|
CustomDialog,
|
||||||
|
ICustomDialog,
|
||||||
|
} from 'src/graphics/customDialog/customDialog';
|
||||||
|
import { graphicData } from 'src/protos/stationLayoutGraphics';
|
||||||
|
import { GraphicDataBase } from './GraphicDataBase';
|
||||||
|
|
||||||
|
export class CustomDialogData extends GraphicDataBase implements ICustomDialog {
|
||||||
|
constructor(data?: graphicData.CustomDialog) {
|
||||||
|
let gatedBox;
|
||||||
|
if (!data) {
|
||||||
|
gatedBox = new graphicData.CustomDialog({
|
||||||
|
common: GraphicDataBase.defaultCommonInfo(CustomDialog.Type),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
gatedBox = data;
|
||||||
|
}
|
||||||
|
super(gatedBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get data(): graphicData.CustomDialog {
|
||||||
|
return this.getData<graphicData.CustomDialog>();
|
||||||
|
}
|
||||||
|
get code(): string {
|
||||||
|
return this.data.code;
|
||||||
|
}
|
||||||
|
set code(v: string) {
|
||||||
|
this.data.code = v;
|
||||||
|
}
|
||||||
|
clone(): CustomDialogData {
|
||||||
|
return new CustomDialogData(this.data.cloneMessage());
|
||||||
|
}
|
||||||
|
copyFrom(data: CustomDialogData): void {
|
||||||
|
pb_1.Message.copyInto(data.data, this.data);
|
||||||
|
}
|
||||||
|
eq(other: CustomDialogData): boolean {
|
||||||
|
return pb_1.Message.equals(this.data, other.data);
|
||||||
|
}
|
||||||
|
}
|
@ -1,75 +0,0 @@
|
|||||||
import * as pb_1 from 'google-protobuf';
|
|
||||||
import { IPointData } from 'pixi.js';
|
|
||||||
import { IRectData, Rect } from 'src/graphics/rect/Rect';
|
|
||||||
import { graphicData } from 'src/protos/stationLayoutGraphics';
|
|
||||||
import { GraphicDataBase } from './GraphicDataBase';
|
|
||||||
|
|
||||||
export class RectData extends GraphicDataBase implements IRectData {
|
|
||||||
constructor(data?: graphicData.Rect) {
|
|
||||||
let rect;
|
|
||||||
if (!data) {
|
|
||||||
rect = new graphicData.Rect({
|
|
||||||
common: GraphicDataBase.defaultCommonInfo(Rect.Type),
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
rect = data;
|
|
||||||
}
|
|
||||||
super(rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
public get data(): graphicData.Rect {
|
|
||||||
return this.getData<graphicData.Rect>();
|
|
||||||
}
|
|
||||||
|
|
||||||
get code(): string {
|
|
||||||
return this.data.code;
|
|
||||||
}
|
|
||||||
set code(v: string) {
|
|
||||||
this.data.code = v;
|
|
||||||
}
|
|
||||||
get lineWidth(): number {
|
|
||||||
return this.data.lineWidth;
|
|
||||||
}
|
|
||||||
set lineWidth(v: number) {
|
|
||||||
this.data.lineWidth = v;
|
|
||||||
}
|
|
||||||
get lineColor(): string {
|
|
||||||
return this.data.lineColor;
|
|
||||||
}
|
|
||||||
set lineColor(v: string) {
|
|
||||||
this.data.lineColor = v;
|
|
||||||
}
|
|
||||||
get point(): IPointData {
|
|
||||||
return this.data.point;
|
|
||||||
}
|
|
||||||
set point(point: IPointData) {
|
|
||||||
this.data.point = new graphicData.Point({ x: point.x, y: point.y });
|
|
||||||
}
|
|
||||||
get width(): number {
|
|
||||||
return this.data.width;
|
|
||||||
}
|
|
||||||
set width(v: number) {
|
|
||||||
this.data.width = v;
|
|
||||||
}
|
|
||||||
get height(): number {
|
|
||||||
return this.data.height;
|
|
||||||
}
|
|
||||||
set height(v: number) {
|
|
||||||
this.data.height = v;
|
|
||||||
}
|
|
||||||
get radius(): number {
|
|
||||||
return this.data.radius;
|
|
||||||
}
|
|
||||||
set radius(v: number) {
|
|
||||||
this.data.radius = v;
|
|
||||||
}
|
|
||||||
clone(): RectData {
|
|
||||||
return new RectData(this.data.cloneMessage());
|
|
||||||
}
|
|
||||||
copyFrom(data: RectData): void {
|
|
||||||
pb_1.Message.copyInto(data.data, this.data);
|
|
||||||
}
|
|
||||||
eq(other: RectData): boolean {
|
|
||||||
return pb_1.Message.equals(this.data, other.data);
|
|
||||||
}
|
|
||||||
}
|
|
@ -146,6 +146,12 @@ import {
|
|||||||
TrackLogicSectionTemplate,
|
TrackLogicSectionTemplate,
|
||||||
} from 'src/graphics/trackLogicSection/TrackLogicSection';
|
} from 'src/graphics/trackLogicSection/TrackLogicSection';
|
||||||
import { TrackLogicSectionData } from './graphics/TrackLogicSectionInteraction';
|
import { TrackLogicSectionData } from './graphics/TrackLogicSectionInteraction';
|
||||||
|
import {
|
||||||
|
CustomDialog,
|
||||||
|
CustomDialogTemplate,
|
||||||
|
} from 'src/graphics/customDialog/customDialog';
|
||||||
|
import { CustomDialogDraw } from 'src/graphics/customDialog/customDialogDrawAssistant';
|
||||||
|
import { CustomDialogData } from './graphics/CustomDialogInteraction';
|
||||||
|
|
||||||
// export function fromStoragePoint(p: graphicData.Point): Point {
|
// export function fromStoragePoint(p: graphicData.Point): Point {
|
||||||
// return new Point(p.x, p.y);
|
// return new Point(p.x, p.y);
|
||||||
@ -276,6 +282,7 @@ export function initDrawApp(dom: HTMLElement): JlDrawApp {
|
|||||||
| CurvatureDraw
|
| CurvatureDraw
|
||||||
| TrackSectionDraw
|
| TrackSectionDraw
|
||||||
| TrackLogicSectionDraw
|
| TrackLogicSectionDraw
|
||||||
|
| CustomDialogDraw
|
||||||
)[] = [];
|
)[] = [];
|
||||||
if (draftType === 'Line') {
|
if (draftType === 'Line') {
|
||||||
drawAssistants = [
|
drawAssistants = [
|
||||||
@ -340,6 +347,10 @@ export function initDrawApp(dom: HTMLElement): JlDrawApp {
|
|||||||
app,
|
app,
|
||||||
new TrackLogicSectionTemplate(new TrackLogicSectionData())
|
new TrackLogicSectionTemplate(new TrackLogicSectionData())
|
||||||
),
|
),
|
||||||
|
new CustomDialogDraw(
|
||||||
|
app,
|
||||||
|
new CustomDialogTemplate(new CustomDialogData())
|
||||||
|
),
|
||||||
];
|
];
|
||||||
DrawSignalInteraction.init(app);
|
DrawSignalInteraction.init(app);
|
||||||
DrawStopPositionInteraction.init(app);
|
DrawStopPositionInteraction.init(app);
|
||||||
|
61
src/graphics/customDialog/closeButton.ts
Normal file
61
src/graphics/customDialog/closeButton.ts
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import { Container, Graphics } from 'pixi.js';
|
||||||
|
|
||||||
|
const closeButtonConsts = {
|
||||||
|
bodyColor: '0XFF0000',
|
||||||
|
lineColor: '0XFFFFFF',
|
||||||
|
lineWidth: 2,
|
||||||
|
bodyRectWidth: 22,
|
||||||
|
bodyRectHeight: 22,
|
||||||
|
rectRadius: 3,
|
||||||
|
lineHalfLength: 6,
|
||||||
|
};
|
||||||
|
|
||||||
|
export class CloseButton extends Container {
|
||||||
|
static Type = 'closeButton';
|
||||||
|
rectBody: Graphics = new Graphics();
|
||||||
|
lineBody: Graphics = new Graphics();
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.addChild(this.rectBody);
|
||||||
|
this.addChild(this.lineBody);
|
||||||
|
}
|
||||||
|
|
||||||
|
doRepaint() {
|
||||||
|
this.rectBody.clear();
|
||||||
|
this.rectBody.beginFill(closeButtonConsts.bodyColor, 1);
|
||||||
|
this.rectBody.lineStyle(
|
||||||
|
closeButtonConsts.lineWidth,
|
||||||
|
closeButtonConsts.lineColor
|
||||||
|
);
|
||||||
|
this.rectBody.drawRoundedRect(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
closeButtonConsts.bodyRectWidth,
|
||||||
|
closeButtonConsts.bodyRectHeight,
|
||||||
|
closeButtonConsts.rectRadius
|
||||||
|
);
|
||||||
|
this.rectBody.endFill();
|
||||||
|
this.lineBody.clear();
|
||||||
|
this.lineBody.lineStyle(
|
||||||
|
closeButtonConsts.lineWidth,
|
||||||
|
closeButtonConsts.lineColor
|
||||||
|
);
|
||||||
|
this.lineBody.moveTo(
|
||||||
|
closeButtonConsts.bodyRectWidth / 2 - closeButtonConsts.lineHalfLength,
|
||||||
|
closeButtonConsts.bodyRectHeight / 2 - closeButtonConsts.lineHalfLength
|
||||||
|
);
|
||||||
|
this.lineBody.lineTo(
|
||||||
|
closeButtonConsts.bodyRectWidth / 2 + closeButtonConsts.lineHalfLength,
|
||||||
|
closeButtonConsts.bodyRectHeight / 2 + closeButtonConsts.lineHalfLength
|
||||||
|
);
|
||||||
|
this.lineBody.moveTo(
|
||||||
|
closeButtonConsts.bodyRectWidth / 2 - closeButtonConsts.lineHalfLength,
|
||||||
|
closeButtonConsts.bodyRectHeight / 2 + closeButtonConsts.lineHalfLength
|
||||||
|
);
|
||||||
|
this.lineBody.lineTo(
|
||||||
|
closeButtonConsts.bodyRectWidth / 2 + closeButtonConsts.lineHalfLength,
|
||||||
|
closeButtonConsts.bodyRectHeight / 2 - closeButtonConsts.lineHalfLength
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
87
src/graphics/customDialog/customDialog.ts
Normal file
87
src/graphics/customDialog/customDialog.ts
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
import { Graphics } from 'pixi.js';
|
||||||
|
import {
|
||||||
|
GraphicData,
|
||||||
|
JlGraphic,
|
||||||
|
JlGraphicTemplate,
|
||||||
|
VectorText,
|
||||||
|
} from 'src/jl-graphic';
|
||||||
|
import { CloseButton } from './closeButton';
|
||||||
|
|
||||||
|
export interface ICustomDialog extends GraphicData {
|
||||||
|
get code(): string;
|
||||||
|
set code(v: string);
|
||||||
|
clone(): ICustomDialog;
|
||||||
|
copyFrom(data: ICustomDialog): void;
|
||||||
|
eq(other: ICustomDialog): boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const customDialogConsts = {
|
||||||
|
dialogHeight: 850,
|
||||||
|
dialogWidth: 600,
|
||||||
|
innerHeight: 808,
|
||||||
|
innerWidth: 588,
|
||||||
|
externalColor: '0X0055E8',
|
||||||
|
innerFillColor: '0XECE9D8',
|
||||||
|
innerStrokeColor: '0XB2B1AA',
|
||||||
|
innerLineWidth: 2,
|
||||||
|
externalRadius: 5,
|
||||||
|
};
|
||||||
|
export class CustomDialog extends JlGraphic {
|
||||||
|
static Type = 'customDialog';
|
||||||
|
titleGraph: VectorText = new VectorText('');
|
||||||
|
externalRect: Graphics = new Graphics();
|
||||||
|
innerRect: Graphics = new Graphics();
|
||||||
|
closeButton: CloseButton = new CloseButton();
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super(CustomDialog.Type);
|
||||||
|
this.addChild(this.titleGraph);
|
||||||
|
this.addChild(this.externalRect);
|
||||||
|
this.addChild(this.innerRect);
|
||||||
|
this.addChild(this.closeButton);
|
||||||
|
}
|
||||||
|
get datas(): ICustomDialog {
|
||||||
|
return this.getDatas<ICustomDialog>();
|
||||||
|
}
|
||||||
|
|
||||||
|
doRepaint(): void {
|
||||||
|
const titleGraph = this.titleGraph;
|
||||||
|
titleGraph.text = this.datas.code;
|
||||||
|
this.externalRect.clear();
|
||||||
|
this.externalRect.beginFill(customDialogConsts.externalColor, 1);
|
||||||
|
this.externalRect.drawRoundedRect(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
customDialogConsts.dialogWidth,
|
||||||
|
customDialogConsts.dialogHeight,
|
||||||
|
customDialogConsts.externalRadius
|
||||||
|
);
|
||||||
|
this.externalRect.endFill();
|
||||||
|
this.innerRect.clear();
|
||||||
|
this.innerRect.beginFill(customDialogConsts.innerFillColor, 1);
|
||||||
|
this.innerRect.lineStyle(
|
||||||
|
customDialogConsts.innerLineWidth,
|
||||||
|
customDialogConsts.innerStrokeColor
|
||||||
|
);
|
||||||
|
this.innerRect.drawRect(
|
||||||
|
6,
|
||||||
|
35,
|
||||||
|
customDialogConsts.innerWidth,
|
||||||
|
customDialogConsts.innerHeight
|
||||||
|
);
|
||||||
|
this.innerRect.endFill();
|
||||||
|
this.closeButton.doRepaint();
|
||||||
|
this.closeButton.position.set(customDialogConsts.dialogWidth - 28, 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class CustomDialogTemplate extends JlGraphicTemplate<CustomDialog> {
|
||||||
|
constructor(dataTemplate: ICustomDialog) {
|
||||||
|
super(CustomDialog.Type, { dataTemplate });
|
||||||
|
}
|
||||||
|
new(): CustomDialog {
|
||||||
|
const customDialog = new CustomDialog();
|
||||||
|
customDialog.loadData(this.datas);
|
||||||
|
return customDialog;
|
||||||
|
}
|
||||||
|
}
|
76
src/graphics/customDialog/customDialogDrawAssistant.ts
Normal file
76
src/graphics/customDialog/customDialogDrawAssistant.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import { FederatedMouseEvent, Point } from 'pixi.js';
|
||||||
|
import {
|
||||||
|
GraphicDrawAssistant,
|
||||||
|
GraphicInteractionPlugin,
|
||||||
|
JlDrawApp,
|
||||||
|
JlGraphic,
|
||||||
|
} from 'src/jl-graphic';
|
||||||
|
import {
|
||||||
|
CustomDialog,
|
||||||
|
ICustomDialog,
|
||||||
|
CustomDialogTemplate,
|
||||||
|
} from './customDialog';
|
||||||
|
|
||||||
|
export interface ICustomDialogDrawOptions {
|
||||||
|
newData: () => ICustomDialog;
|
||||||
|
}
|
||||||
|
export class CustomDialogDraw extends GraphicDrawAssistant<
|
||||||
|
CustomDialogTemplate,
|
||||||
|
ICustomDialog
|
||||||
|
> {
|
||||||
|
_customDialog: CustomDialog | null = null;
|
||||||
|
constructor(app: JlDrawApp, template: CustomDialogTemplate) {
|
||||||
|
super(app, template, 'svguse:../../drawIcon.svg#icon-gated-box', '弹窗');
|
||||||
|
CustomDialogInteraction.init(app);
|
||||||
|
}
|
||||||
|
public get customDialog(): CustomDialog {
|
||||||
|
if (!this._customDialog) {
|
||||||
|
this._customDialog = this.graphicTemplate.new();
|
||||||
|
this._customDialog.loadData(this.graphicTemplate.datas);
|
||||||
|
this.container.addChild(this._customDialog);
|
||||||
|
}
|
||||||
|
return this._customDialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
onLeftUp(e: FederatedMouseEvent): void {
|
||||||
|
this.container.position.copyFrom(this.toCanvasCoordinates(e.global));
|
||||||
|
this.createAndStore(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
redraw(p: Point): void {
|
||||||
|
this.customDialog.repaint();
|
||||||
|
this.container.position.set(p.x, p.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
prepareData(data: ICustomDialog): boolean {
|
||||||
|
data.transform = this.container.saveTransform();
|
||||||
|
data.code = 'P';
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class CustomDialogInteraction extends GraphicInteractionPlugin<CustomDialog> {
|
||||||
|
static Name = 'gated_box_transform';
|
||||||
|
constructor(app: JlDrawApp) {
|
||||||
|
super(CustomDialogInteraction.Name, app);
|
||||||
|
}
|
||||||
|
static init(app: JlDrawApp) {
|
||||||
|
return new CustomDialogInteraction(app);
|
||||||
|
}
|
||||||
|
filter(...grahpics: JlGraphic[]): CustomDialog[] | undefined {
|
||||||
|
return grahpics
|
||||||
|
.filter((g) => g.type === CustomDialog.Type)
|
||||||
|
.map((g) => g as CustomDialog);
|
||||||
|
}
|
||||||
|
bind(g: CustomDialog): void {
|
||||||
|
g.eventMode = 'static';
|
||||||
|
g.cursor = 'pointer';
|
||||||
|
g.scalable = true;
|
||||||
|
g.rotatable = true;
|
||||||
|
}
|
||||||
|
unbind(g: CustomDialog): void {
|
||||||
|
g.eventMode = 'none';
|
||||||
|
g.scalable = false;
|
||||||
|
g.rotatable = false;
|
||||||
|
}
|
||||||
|
}
|
@ -5977,4 +5977,97 @@ export namespace graphicData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
export class CustomDialog extends pb_1.Message {
|
||||||
|
#one_of_decls: number[][] = [];
|
||||||
|
constructor(data?: any[] | {
|
||||||
|
common?: CommonInfo;
|
||||||
|
code?: string;
|
||||||
|
}) {
|
||||||
|
super();
|
||||||
|
pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls);
|
||||||
|
if (!Array.isArray(data) && typeof data == "object") {
|
||||||
|
if ("common" in data && data.common != undefined) {
|
||||||
|
this.common = data.common;
|
||||||
|
}
|
||||||
|
if ("code" in data && data.code != undefined) {
|
||||||
|
this.code = data.code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
get common() {
|
||||||
|
return pb_1.Message.getWrapperField(this, CommonInfo, 1) as CommonInfo;
|
||||||
|
}
|
||||||
|
set common(value: CommonInfo) {
|
||||||
|
pb_1.Message.setWrapperField(this, 1, value);
|
||||||
|
}
|
||||||
|
get has_common() {
|
||||||
|
return pb_1.Message.getField(this, 1) != null;
|
||||||
|
}
|
||||||
|
get code() {
|
||||||
|
return pb_1.Message.getFieldWithDefault(this, 2, "") as string;
|
||||||
|
}
|
||||||
|
set code(value: string) {
|
||||||
|
pb_1.Message.setField(this, 2, value);
|
||||||
|
}
|
||||||
|
static fromObject(data: {
|
||||||
|
common?: ReturnType<typeof CommonInfo.prototype.toObject>;
|
||||||
|
code?: string;
|
||||||
|
}): CustomDialog {
|
||||||
|
const message = new CustomDialog({});
|
||||||
|
if (data.common != null) {
|
||||||
|
message.common = CommonInfo.fromObject(data.common);
|
||||||
|
}
|
||||||
|
if (data.code != null) {
|
||||||
|
message.code = data.code;
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
toObject() {
|
||||||
|
const data: {
|
||||||
|
common?: ReturnType<typeof CommonInfo.prototype.toObject>;
|
||||||
|
code?: string;
|
||||||
|
} = {};
|
||||||
|
if (this.common != null) {
|
||||||
|
data.common = this.common.toObject();
|
||||||
|
}
|
||||||
|
if (this.code != null) {
|
||||||
|
data.code = this.code;
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
serialize(): Uint8Array;
|
||||||
|
serialize(w: pb_1.BinaryWriter): void;
|
||||||
|
serialize(w?: pb_1.BinaryWriter): Uint8Array | void {
|
||||||
|
const writer = w || new pb_1.BinaryWriter();
|
||||||
|
if (this.has_common)
|
||||||
|
writer.writeMessage(1, this.common, () => this.common.serialize(writer));
|
||||||
|
if (this.code.length)
|
||||||
|
writer.writeString(2, this.code);
|
||||||
|
if (!w)
|
||||||
|
return writer.getResultBuffer();
|
||||||
|
}
|
||||||
|
static deserialize(bytes: Uint8Array | pb_1.BinaryReader): CustomDialog {
|
||||||
|
const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new CustomDialog();
|
||||||
|
while (reader.nextField()) {
|
||||||
|
if (reader.isEndGroup())
|
||||||
|
break;
|
||||||
|
switch (reader.getFieldNumber()) {
|
||||||
|
case 1:
|
||||||
|
reader.readMessage(message.common, () => message.common = CommonInfo.deserialize(reader));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
message.code = reader.readString();
|
||||||
|
break;
|
||||||
|
default: reader.skipField();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
serializeBinary(): Uint8Array {
|
||||||
|
return this.serialize();
|
||||||
|
}
|
||||||
|
static deserializeBinary(bytes: Uint8Array): CustomDialog {
|
||||||
|
return CustomDialog.deserialize(bytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user