!724 材质发布和购买

pull/724/MERGE
ZoeLeeFZ 5 years ago committed by ChenX
parent 27e1782e38
commit 2c7bfc4148

@ -0,0 +1,12 @@
import { Command } from "../Editor/CommandMachine";
import { app } from "../ApplicationServices/Application";
import { MetarialShop } from './../UI/MaterialEditor/MaterialShop';
import { ModalPosition } from "../UI/Components/Modal/ModalsManage";
export class BuyMaterial implements Command
{
exec()
{
app.Editor.ModalManage.RenderModal(MetarialShop, ModalPosition.Center, {});
}
}

@ -1,6 +1,5 @@
import { Command, CommandWrap } from "../Editor/CommandMachine";
import * as React from 'react';
import { Classes, Button } from "@blueprintjs/core";
import { TemplateUrls, CURRENT_HOST } from "../Common/HostUrl";
import { app } from "../ApplicationServices/Application";
import { ModalPosition } from "../UI/Components/Modal/ModalsManage";
@ -12,12 +11,11 @@ import { Vector3 } from "three";
import { MoveMatrix } from "../Geometry/GeUtils";
import { PromptStatus } from "../Editor/PromptResult";
import { DuplicateRecordCloning } from "../Common/Status";
import { observable } from "mobx";
import { observer } from "mobx-react";
import { TemplateRecord } from "../DatabaseServices/Template/TemplateRecord";
import { GetOnlineTemplate, EditorOnlineTemplate } from "../DatabaseServices/Template/TempateUtils";
import { userConfig } from "../Editor/UserConfig";
import { log } from "../Common/Utils";
import { CommonIframe } from './../UI/Components/Common/CommonIframe';
export class Command_TemplateSearch implements Command
{
@ -34,10 +32,7 @@ export class Command_TemplateSearch implements Command
}
}
@observer
export class TemplateSearchDialog extends React.Component<{ url: string; }, {}>{
@observable isMax = false;
OnMessage = async (e: MessageEvent) =>
{
if (e.origin !== CURRENT_HOST) return;
@ -91,55 +86,15 @@ export class TemplateSearchDialog extends React.Component<{ url: string; }, {}>{
return;
await EditorOnlineTemplate(template, module_id, true);
};
componentDidMount()
{
this.changeModalSize();
window.addEventListener("message", this.OnMessage);
}
componentWillUnmount()
{
window.removeEventListener("message", this.OnMessage);
}
render()
{
const url = this.props.url;
return (
<div className={Classes.DIALOG_CONTAINER}>
<div className={Classes.DIALOG + " board-config"}>
<div className={Classes.DIALOG_HEADER} data-id="dragArea">
<h4 className="bp3-heading">{url === TemplateUrls.search ? "模块购买" : "模块审核"}</h4>
<Button
minimal
icon={this.isMax ? "minimize" : "maximize"}
onClick={this.changeModalSize}
/>
<Button
aria-label="Close"
minimal
icon="cross"
className={Classes.DIALOG_CLOSE_BUTTON}
onClick={() => app.Editor.ModalManage.Clear()}
/>
</div>
<div className={Classes.DIALOG_BODY}>
<iframe
style={{
width: "100%",
height: "100%",
minWidth: 1000,
minHeight: 600
}}
src={this.props.url}
/>
</div>
</div>
</div>
<CommonIframe
title={url === TemplateUrls.search ? "模块购买" : "模块审核"}
url={url}
onMessage={this.OnMessage}
/>
);
}
private changeModalSize = () =>
{
this.isMax = !this.isMax;
app.Editor.ModalManage.ScaleModalSize();
};
}

@ -42,6 +42,8 @@ export const MaterialUrls = {
delete: CURRENT_HOST + "/CAD-materialDelete",
update: CURRENT_HOST + "/CAD-materialUpdate",
move: CURRENT_HOST + "/CAD-materialMove",
buy: CURRENT_HOST + "/Materials-openList",
publishDetail: CURRENT_HOST + "/CAD-materialPublicDetail",
};
export const ShopUrls = {
@ -100,3 +102,4 @@ export const ChangeZoneUrls = [
/**发布模块 */
export const PublishTemplateUrl = CURRENT_HOST + "/Goods-cadModuleDeploy?module_id=";
export const PublishMaterialUrl = CURRENT_HOST + "/Materials-setMaterials?material_id=";

@ -79,15 +79,17 @@ export function TemplateParamsIn(paramsData: Object[][])
}
/**反序列化材质并加入图纸*/
export function MaterialInAndAppendAppData(fileData: Object[])
export function MaterialInAndAppendAppData(fileData: Object[], name?: string): PhysicalMaterialRecord
{
let mtl = MaterialIn(fileData) as PhysicalMaterialRecord;
app.Database.WblockCloneObejcts(
if (name)
mtl.Name = name;
return app.Database.WblockCloneObejcts(
[mtl],
app.Database.MaterialTable,
new Map(),
DuplicateRecordCloning.Rename
);
)[0] as PhysicalMaterialRecord;
}
export function deflate(data: string)

@ -60,6 +60,7 @@ export class SymbolTable extends CADObject
if (this.Has(newName)) return false;
this.Symbols.delete(record.Name);
this.Symbols.set(newName, record);
return true;
}
//#region -------------------------File-------------------------

@ -16,7 +16,8 @@ export class SymbolTableRecord extends CADObject
if (this.Owner)
{
let symbolTable = this.Owner.Object as SymbolTable;
symbolTable.ChangeRecordName(this, name);
if (!symbolTable.ChangeRecordName(this, name))
return;
}
this.name = name;
}

@ -156,6 +156,7 @@ import { commandMachine } from './CommandMachine';
import { Text2Curve } from "../Add-on/Text2Curve";
import { DrawVisualSpaceBox } from "../Add-on/Template/DrawVisualSpaceBox";
import { Align } from './../Add-on/Align';
import { BuyMaterial } from './../Add-on/BuyMaterial';
export function registerCommand()
{
@ -430,6 +431,7 @@ export function registerCommand()
commandMachine.RegisterCommand("drawvsbox", new DrawVisualSpaceBox());
commandMachine.RegisterCommand("align", new Align());
commandMachine.RegisterCommand("buymaterial", new BuyMaterial());
RegistCustomCommand();
}

@ -0,0 +1,69 @@
import * as React from 'react';
import { app } from './../../../ApplicationServices/Application';
import { Classes, Button } from '@blueprintjs/core';
import { observer } from 'mobx-react';
import { observable } from 'mobx';
interface ICommonIframeProps
{
url: string;
title: string;
onMessage: (e: MessageEvent) => void;
}
@observer
export class CommonIframe extends React.Component<ICommonIframeProps, {}>{
@observable isMax = false;
componentDidMount()
{
this.changeModalSize();
window.addEventListener("message", this.props.onMessage);
}
componentWillUnmount()
{
window.removeEventListener("message", this.props.onMessage);
}
render()
{
const { url, title } = this.props;
return (
<div className={Classes.DIALOG_CONTAINER}>
<div className={Classes.DIALOG + " board-config"}>
<div className={Classes.DIALOG_HEADER} data-id="dragArea">
<h4 className="bp3-heading">{title}</h4>
<Button
minimal
icon={this.isMax ? "minimize" : "maximize"}
onClick={this.changeModalSize}
/>
<Button
aria-label="Close"
minimal
icon="cross"
className={Classes.DIALOG_CLOSE_BUTTON}
onClick={() => app.Editor.ModalManage.Clear()}
/>
</div>
<div className={Classes.DIALOG_BODY}>
<iframe
style={{
width: "100%",
height: "100%",
minWidth: 1000,
minHeight: 600
}}
src={url}
/>
</div>
</div>
</div>
);
}
private changeModalSize = () =>
{
this.isMax = !this.isMax;
app.Editor.ModalManage.ScaleModalSize();
};
}

@ -1,14 +1,16 @@
import { Button, Card, Checkbox, Classes, Intent, Popover, Position } from '@blueprintjs/core';
import { Button, Card, Checkbox, Classes, Intent, Popover, Position, ContextMenu, MenuItem } from '@blueprintjs/core';
import { observer } from 'mobx-react';
import * as React from 'react';
import { PostJson, RequestStatus } from '../../../Common/Request';
import { appUi } from '../../Layout/ApplicationLayout';
import { AppToaster } from '../Toaster';
import { inflate, MaterialIn, MaterialInAndAppendAppData } from '../../../Common/SerializeMaterial';
import { MaterialUrls, CURRENT_HOST } from '../../../Common/HostUrl';
import { MaterialUrls, CURRENT_HOST, PublishMaterialUrl } from '../../../Common/HostUrl';
import { observable } from 'mobx';
import { getFileSize } from '../../../Common/Utils';
import { safeEval } from '../../../Common/eval';
import { Menu } from '@blueprintjs/core';
import { MouseKey } from '../../../Common/KeyEnum';
export interface IImgListProps
{
@ -87,6 +89,7 @@ export class MaterialList extends React.Component<IImgListProps, {}> {
key={mtl.material_id}
data-id={mtl.material_id}
onDragStart={() => this.handleDragStart(mtl)}
onMouseDown={(e) => this.handleMounseDown(e, mtl)}
>
<div
className="look-mat hint editor-lint"
@ -148,4 +151,33 @@ export class MaterialList extends React.Component<IImgListProps, {}> {
</>
);
}
private handleMounseDown = (e: React.MouseEvent<HTMLElement>, mtl) =>
{
if (e.button === MouseKey.Right)
{
this.showContextMenu(e, mtl.material_id);
}
}
private showContextMenu = (e: React.MouseEvent<HTMLElement>, id: string) =>
{
ContextMenu.show(
<Menu>
<MenuItem
icon="folder-new"
text="发布"
onClick={() => this.publishTemplate(id)}
/>
</Menu>,
{ left: e.clientX, top: e.clientY },
() => this.setState({ isContextMenuOpen: false }),
);
this.setState({ isContextMenuOpen: true });
e.stopPropagation();
e.preventDefault();
};
private publishTemplate = (id: string) =>
{
window.open(PublishMaterialUrl + id);
};
}

@ -136,6 +136,7 @@ export class TopToolBar extends React.Component<{}, {}>
];
store.iconList.commodity = [
{ svg: IconEnum.CommodityManage, title: "共享模块", command: "TEMPLATESEARCH" },
{ svg: IconEnum.CommodityManage, title: "共享材质", command: "BUYMATERIAL" },
];
store.calcIconNumInTabs();

@ -0,0 +1,58 @@
import * as React from 'react';
import { CURRENT_HOST, MaterialUrls } from './../../Common/HostUrl';
import { CommandWrap } from "../../Editor/CommandMachine";
import { PostJson, RequestStatus } from "../../Common/Request";
import { inflate } from "../../Common/SerializeMaterial";
import { MaterialInAndAppendAppData } from './../../Common/SerializeMaterial';
import { AppToaster } from './../Components/Toaster';
import { CommonIframe } from './../Components/Common/CommonIframe';
import { Intent } from '@blueprintjs/core';
export class MetarialShop extends React.Component<{}, {}>{
private mtlIdSet = new Set();
OnMessage = async (e: MessageEvent) =>
{
if (e.origin !== CURRENT_HOST) return;
this.handleBuy(e.data.material_id);
};
private handleBuy = (material_id: string) =>
{
if (this.mtlIdSet.has(material_id))
{
AppToaster.show({
message: "材质重复购买",
timeout: 2000,
intent: Intent.WARNING
}, "bugMat");
return;
}
CommandWrap(async () =>
{
let data = await PostJson(MaterialUrls.publishDetail, { material_id });
if (data.err_code === RequestStatus.Ok && data.materials.file)
{
this.mtlIdSet.add(material_id);
let file = data.materials.file;
let json = inflate(file);
let mtl = MaterialInAndAppendAppData(JSON.parse(json), data.materials.name);
if (mtl)
{
AppToaster.show({
message: "材质已应用到图纸",
timeout: 2000
});
}
}
}, "购买材质");
};
render()
{
return <CommonIframe
url={MaterialUrls.buy}
title="材质购买"
onMessage={this.OnMessage}
/>
}
}
Loading…
Cancel
Save