sim.mountViewport(elmt)} className="lc-simulator-canvas-viewport">
+
sim.mountViewport(elmt)} className="lc-simulator-canvas-viewport">
@@ -74,18 +74,19 @@ class Content extends Component<{ host: BuiltinSimulatorHost }> {
render() {
const sim = this.props.host;
const viewport = sim.viewport;
- let frameStyle = {};
- if (viewport.scale < 1) {
- frameStyle = {
- transform: `scale(${viewport.scale})`,
- height: viewport.contentHeight,
- width: viewport.contentWidth,
- };
- }
+ const frameStyle = {
+ transform: `scale(${viewport.scale})`,
+ height: viewport.contentHeight,
+ width: viewport.contentWidth,
+ };
return (
-
);
}
diff --git a/packages/designer/src/builtin-simulator/viewport.ts b/packages/designer/src/builtin-simulator/viewport.ts
index bbc6c043d..900620377 100644
--- a/packages/designer/src/builtin-simulator/viewport.ts
+++ b/packages/designer/src/builtin-simulator/viewport.ts
@@ -22,8 +22,8 @@ export default class Viewport implements IViewport {
return new DOMRect(0, 0, bounds.width / scale, bounds.height / scale);
}
- private viewportElement?: Element;
- mount(viewportElement: Element | null) {
+ private viewportElement?: HTMLElement;
+ mount(viewportElement: HTMLElement | null) {
if (!viewportElement || this.viewportElement === viewportElement) {
return;
}
@@ -43,6 +43,15 @@ export default class Viewport implements IViewport {
}
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 {
if (!this.rect) {
return 1000;
@@ -50,29 +59,45 @@ export default class Viewport implements IViewport {
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 {
- if (!this.rect || this.contentWidth === AutoFit) {
- return 1;
+ return this._scale;
+ }
+
+ set scale(newScale: number) {
+ if (isNaN(newScale) || newScale <= 0) {
+ throw new Error(`invalid new scale "${newScale}"`);
}
- return this.width / this.contentWidth;
+
+ 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 _contentHeight: number | AutoFit = AutoFit;
@computed get contentHeight(): number | AutoFit {
- if (!this.rect || this.scale === 1) {
- return AutoFit;
- }
- return this.height / this.scale;
+ return this._contentHeight;
+ }
+
+ set contentHeight(newContentHeight: number | AutoFit) {
+ this._contentHeight = newContentHeight;
}
@computed get contentWidth(): number | AutoFit {
- if (!this.rect || (this._contentWidth !== AutoFit && this._contentWidth <= this.width)) {
- return AutoFit;
- }
return this._contentWidth;
}
diff --git a/packages/rax-simulator-renderer/src/renderer-view.tsx b/packages/rax-simulator-renderer/src/renderer-view.tsx
index 1612f265b..37658532e 100644
--- a/packages/rax-simulator-renderer/src/renderer-view.tsx
+++ b/packages/rax-simulator-renderer/src/renderer-view.tsx
@@ -106,6 +106,7 @@ class Renderer extends Component<{ renderer: SimulatorRenderer }> {
schema={renderer.schema}
components={renderer.components}
context={renderer.context}
+ device={device}
designMode={renderer.designMode}
suspended={renderer.suspended}
self={renderer.scope}
diff --git a/packages/react-simulator-renderer/src/renderer-view.tsx b/packages/react-simulator-renderer/src/renderer-view.tsx
index 5d7b443cd..f3b75c030 100644
--- a/packages/react-simulator-renderer/src/renderer-view.tsx
+++ b/packages/react-simulator-renderer/src/renderer-view.tsx
@@ -100,6 +100,7 @@ class Renderer extends Component<{ renderer: SimulatorRenderer }> {
appHelper={renderer.context}
// context={renderer.context}
designMode={designMode}
+ device={device}
suspended={renderer.suspended}
self={renderer.scope}
customCreateElement={(Component: any, props: any, children: any) => {