mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-01-19 05:48:17 +00:00
Merge branch 'feat/canvas-size' into 'release/1.0.0'
支持切换画布宽高及显示类型的API的方案 Aone需求:<https://aone.alibaba-inc.com/req/29913392> 技术方案: <https://yuque.antfin-inc.com/docs/share/38d36583-057a-40e0-a07e-8e94e5d538e2> See merge request !952655
This commit is contained in:
commit
252310ef8e
@ -60,7 +60,7 @@ class Canvas extends Component<{ host: BuiltinSimulatorHost }> {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={className}>
|
<div className={className}>
|
||||||
<div ref={elmt => sim.mountViewport(elmt)} className="lc-simulator-canvas-viewport">
|
<div ref={(elmt) => sim.mountViewport(elmt)} className="lc-simulator-canvas-viewport">
|
||||||
<BemTools host={sim} />
|
<BemTools host={sim} />
|
||||||
<Content host={sim} />
|
<Content host={sim} />
|
||||||
</div>
|
</div>
|
||||||
@ -74,18 +74,19 @@ class Content extends Component<{ host: BuiltinSimulatorHost }> {
|
|||||||
render() {
|
render() {
|
||||||
const sim = this.props.host;
|
const sim = this.props.host;
|
||||||
const viewport = sim.viewport;
|
const viewport = sim.viewport;
|
||||||
let frameStyle = {};
|
const frameStyle = {
|
||||||
if (viewport.scale < 1) {
|
|
||||||
frameStyle = {
|
|
||||||
transform: `scale(${viewport.scale})`,
|
transform: `scale(${viewport.scale})`,
|
||||||
height: viewport.contentHeight,
|
height: viewport.contentHeight,
|
||||||
width: viewport.contentWidth,
|
width: viewport.contentWidth,
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="lc-simulator-content">
|
<div className="lc-simulator-content">
|
||||||
<iframe className="lc-simulator-content-frame" style={frameStyle} ref={frame => sim.mountContentFrame(frame)} />
|
<iframe
|
||||||
|
className="lc-simulator-content-frame"
|
||||||
|
style={frameStyle}
|
||||||
|
ref={(frame) => sim.mountContentFrame(frame)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,8 +22,8 @@ export default class Viewport implements IViewport {
|
|||||||
return new DOMRect(0, 0, bounds.width / scale, bounds.height / scale);
|
return new DOMRect(0, 0, bounds.width / scale, bounds.height / scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
private viewportElement?: Element;
|
private viewportElement?: HTMLElement;
|
||||||
mount(viewportElement: Element | null) {
|
mount(viewportElement: HTMLElement | null) {
|
||||||
if (!viewportElement || this.viewportElement === viewportElement) {
|
if (!viewportElement || this.viewportElement === viewportElement) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -43,6 +43,15 @@ export default class Viewport implements IViewport {
|
|||||||
}
|
}
|
||||||
return this.rect.height;
|
return this.rect.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set height(newHeight: number) {
|
||||||
|
this._contentHeight = newHeight / this.scale;
|
||||||
|
if (this.viewportElement) {
|
||||||
|
this.viewportElement.style.height = `${newHeight}px`;
|
||||||
|
this.touch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@computed get width(): number {
|
@computed get width(): number {
|
||||||
if (!this.rect) {
|
if (!this.rect) {
|
||||||
return 1000;
|
return 1000;
|
||||||
@ -50,29 +59,45 @@ export default class Viewport implements IViewport {
|
|||||||
return this.rect.width;
|
return this.rect.width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set width(newWidth: number) {
|
||||||
|
this._contentWidth = newWidth / this.scale;
|
||||||
|
if (this.viewportElement) {
|
||||||
|
this.viewportElement.style.width = `${newWidth}px`;
|
||||||
|
this.touch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@obx.ref private _scale: number = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 缩放比例
|
* 缩放比例
|
||||||
*/
|
*/
|
||||||
@computed get scale(): number {
|
@computed get scale(): number {
|
||||||
if (!this.rect || this.contentWidth === AutoFit) {
|
return this._scale;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
return this.width / this.contentWidth;
|
|
||||||
|
set scale(newScale: number) {
|
||||||
|
if (isNaN(newScale) || newScale <= 0) {
|
||||||
|
throw new Error(`invalid new scale "${newScale}"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._scale = newScale;
|
||||||
|
this._contentWidth = this.width / this.scale;
|
||||||
|
this._contentHeight = this.height / this.scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
@obx.ref private _contentWidth: number | AutoFit = AutoFit;
|
@obx.ref private _contentWidth: number | AutoFit = AutoFit;
|
||||||
|
@obx.ref private _contentHeight: number | AutoFit = AutoFit;
|
||||||
|
|
||||||
@computed get contentHeight(): number | AutoFit {
|
@computed get contentHeight(): number | AutoFit {
|
||||||
if (!this.rect || this.scale === 1) {
|
return this._contentHeight;
|
||||||
return AutoFit;
|
|
||||||
}
|
}
|
||||||
return this.height / this.scale;
|
|
||||||
|
set contentHeight(newContentHeight: number | AutoFit) {
|
||||||
|
this._contentHeight = newContentHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
@computed get contentWidth(): number | AutoFit {
|
@computed get contentWidth(): number | AutoFit {
|
||||||
if (!this.rect || (this._contentWidth !== AutoFit && this._contentWidth <= this.width)) {
|
|
||||||
return AutoFit;
|
|
||||||
}
|
|
||||||
return this._contentWidth;
|
return this._contentWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -106,6 +106,7 @@ class Renderer extends Component<{ renderer: SimulatorRenderer }> {
|
|||||||
schema={renderer.schema}
|
schema={renderer.schema}
|
||||||
components={renderer.components}
|
components={renderer.components}
|
||||||
context={renderer.context}
|
context={renderer.context}
|
||||||
|
device={device}
|
||||||
designMode={renderer.designMode}
|
designMode={renderer.designMode}
|
||||||
suspended={renderer.suspended}
|
suspended={renderer.suspended}
|
||||||
self={renderer.scope}
|
self={renderer.scope}
|
||||||
|
|||||||
@ -100,6 +100,7 @@ class Renderer extends Component<{ renderer: SimulatorRenderer }> {
|
|||||||
appHelper={renderer.context}
|
appHelper={renderer.context}
|
||||||
// context={renderer.context}
|
// context={renderer.context}
|
||||||
designMode={designMode}
|
designMode={designMode}
|
||||||
|
device={device}
|
||||||
suspended={renderer.suspended}
|
suspended={renderer.suspended}
|
||||||
self={renderer.scope}
|
self={renderer.scope}
|
||||||
customCreateElement={(Component: any, props: any, children: any) => {
|
customCreateElement={(Component: any, props: any, children: any) => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user