|
@@ -12,7 +12,6 @@ import { BOUND_TEXT_PADDING, TEXT_ALIGN, VERTICAL_ALIGN } from "../constants";
|
|
|
import { MaybeTransformHandleType } from "./transformHandles";
|
|
|
import Scene from "../scene/Scene";
|
|
|
import { isTextElement } from ".";
|
|
|
-import { getMaxContainerHeight, getMaxContainerWidth } from "./newElement";
|
|
|
import {
|
|
|
isBoundToContainer,
|
|
|
isImageElement,
|
|
@@ -244,31 +243,25 @@ const computeBoundTextPosition = (
|
|
|
const containerCoords = getContainerCoords(container);
|
|
|
const maxContainerHeight = getMaxContainerHeight(container);
|
|
|
const maxContainerWidth = getMaxContainerWidth(container);
|
|
|
- const padding = container.type === "ellipse" ? 0 : BOUND_TEXT_PADDING;
|
|
|
|
|
|
let x;
|
|
|
let y;
|
|
|
if (boundTextElement.verticalAlign === VERTICAL_ALIGN.TOP) {
|
|
|
- y = containerCoords.y + padding;
|
|
|
+ y = containerCoords.y;
|
|
|
} else if (boundTextElement.verticalAlign === VERTICAL_ALIGN.BOTTOM) {
|
|
|
- y =
|
|
|
- containerCoords.y +
|
|
|
- (maxContainerHeight - boundTextElement.height + padding);
|
|
|
+ y = containerCoords.y + (maxContainerHeight - boundTextElement.height);
|
|
|
} else {
|
|
|
y =
|
|
|
containerCoords.y +
|
|
|
- (maxContainerHeight / 2 - boundTextElement.height / 2 + padding);
|
|
|
+ (maxContainerHeight / 2 - boundTextElement.height / 2);
|
|
|
}
|
|
|
if (boundTextElement.textAlign === TEXT_ALIGN.LEFT) {
|
|
|
- x = containerCoords.x + padding;
|
|
|
+ x = containerCoords.x;
|
|
|
} else if (boundTextElement.textAlign === TEXT_ALIGN.RIGHT) {
|
|
|
- x =
|
|
|
- containerCoords.x +
|
|
|
- (maxContainerWidth - boundTextElement.width + padding);
|
|
|
+ x = containerCoords.x + (maxContainerWidth - boundTextElement.width);
|
|
|
} else {
|
|
|
x =
|
|
|
- containerCoords.x +
|
|
|
- (maxContainerWidth / 2 - boundTextElement.width / 2 + padding);
|
|
|
+ containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);
|
|
|
}
|
|
|
return { x, y };
|
|
|
};
|
|
@@ -636,20 +629,22 @@ export const getContainerCenter = (
|
|
|
};
|
|
|
|
|
|
export const getContainerCoords = (container: NonDeletedExcalidrawElement) => {
|
|
|
+ let offsetX = BOUND_TEXT_PADDING;
|
|
|
+ let offsetY = BOUND_TEXT_PADDING;
|
|
|
+
|
|
|
if (container.type === "ellipse") {
|
|
|
// The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172
|
|
|
- const offsetX =
|
|
|
- (container.width / 2) * (1 - Math.sqrt(2) / 2) + BOUND_TEXT_PADDING;
|
|
|
- const offsetY =
|
|
|
- (container.height / 2) * (1 - Math.sqrt(2) / 2) + BOUND_TEXT_PADDING;
|
|
|
- return {
|
|
|
- x: container.x + offsetX,
|
|
|
- y: container.y + offsetY,
|
|
|
- };
|
|
|
+ offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);
|
|
|
+ offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);
|
|
|
+ }
|
|
|
+ // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265
|
|
|
+ if (container.type === "diamond") {
|
|
|
+ offsetX += container.width / 4;
|
|
|
+ offsetY += container.height / 4;
|
|
|
}
|
|
|
return {
|
|
|
- x: container.x,
|
|
|
- y: container.y,
|
|
|
+ x: container.x + offsetX,
|
|
|
+ y: container.y + offsetY,
|
|
|
};
|
|
|
};
|
|
|
|
|
@@ -767,5 +762,63 @@ export const computeContainerHeightForBoundText = (
|
|
|
if (isArrowElement(container)) {
|
|
|
return boundTextElementHeight + BOUND_TEXT_PADDING * 8 * 2;
|
|
|
}
|
|
|
+ if (container.type === "diamond") {
|
|
|
+ return 2 * boundTextElementHeight;
|
|
|
+ }
|
|
|
return boundTextElementHeight + BOUND_TEXT_PADDING * 2;
|
|
|
};
|
|
|
+
|
|
|
+export const getMaxContainerWidth = (container: ExcalidrawElement) => {
|
|
|
+ const width = getContainerDims(container).width;
|
|
|
+ if (isArrowElement(container)) {
|
|
|
+ const containerWidth = width - BOUND_TEXT_PADDING * 8 * 2;
|
|
|
+ if (containerWidth <= 0) {
|
|
|
+ const boundText = getBoundTextElement(container);
|
|
|
+ if (boundText) {
|
|
|
+ return boundText.width;
|
|
|
+ }
|
|
|
+ return BOUND_TEXT_PADDING * 8 * 2;
|
|
|
+ }
|
|
|
+ return containerWidth;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (container.type === "ellipse") {
|
|
|
+ // The width of the largest rectangle inscribed inside an ellipse is
|
|
|
+ // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from
|
|
|
+ // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172
|
|
|
+ return Math.round((width / 2) * Math.sqrt(2)) - BOUND_TEXT_PADDING * 2;
|
|
|
+ }
|
|
|
+ if (container.type === "diamond") {
|
|
|
+ // The width of the largest rectangle inscribed inside a rhombus is
|
|
|
+ // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265
|
|
|
+ return Math.round(width / 2) - BOUND_TEXT_PADDING * 2;
|
|
|
+ }
|
|
|
+ return width - BOUND_TEXT_PADDING * 2;
|
|
|
+};
|
|
|
+
|
|
|
+export const getMaxContainerHeight = (container: ExcalidrawElement) => {
|
|
|
+ const height = getContainerDims(container).height;
|
|
|
+ if (isArrowElement(container)) {
|
|
|
+ const containerHeight = height - BOUND_TEXT_PADDING * 8 * 2;
|
|
|
+ if (containerHeight <= 0) {
|
|
|
+ const boundText = getBoundTextElement(container);
|
|
|
+ if (boundText) {
|
|
|
+ return boundText.height;
|
|
|
+ }
|
|
|
+ return BOUND_TEXT_PADDING * 8 * 2;
|
|
|
+ }
|
|
|
+ return height;
|
|
|
+ }
|
|
|
+ if (container.type === "ellipse") {
|
|
|
+ // The height of the largest rectangle inscribed inside an ellipse is
|
|
|
+ // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from
|
|
|
+ // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172
|
|
|
+ return Math.round((height / 2) * Math.sqrt(2)) - BOUND_TEXT_PADDING * 2;
|
|
|
+ }
|
|
|
+ if (container.type === "diamond") {
|
|
|
+ // The height of the largest rectangle inscribed inside a rhombus is
|
|
|
+ // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265
|
|
|
+ return Math.round(height / 2) - BOUND_TEXT_PADDING * 2;
|
|
|
+ }
|
|
|
+ return height - BOUND_TEXT_PADDING * 2;
|
|
|
+};
|