const assert = require("assert");
const Helpers = require("../helpers");
Feature("Image zoom position").tag("@regress").config({ waitForAction: 50 });
const IMAGE =
"https://htx-pub.s3.us-east-1.amazonaws.com/examples/images/nick-owuor-astro-nic-visuals-wDifg5xc9Z4-unsplash.jpg";
const config = `
`;
async function getStrokeColor() {
const circle = window.Konva.stages[0].findOne("Circle");
return circle.attrs.stroke;
}
const relativeCoordsFF = new DataTable(["enabled"]);
relativeCoordsFF.add([true]);
relativeCoordsFF.add([false]);
Data(relativeCoordsFF).Scenario(
"Zoomed image should keep center image in center of canvas on resizes",
async ({ I, LabelStudio, AtImageView, AtOutliner, AtDetails, AtPanels, current }) => {
const AtDetailsPanel = AtPanels.usePanel(AtPanels.PANEL.DETAILS);
const AtOutlinerPanel = AtPanels.usePanel(AtPanels.PANEL.OUTLINER);
const FF3793 = current;
const params = {
config,
data: { image: IMAGE },
annotations: [
{
id: "1000",
result: [
{
original_width: 2242,
original_height: 2802,
image_rotation: 0,
value: {
x: 88.5670731707317,
y: 88.3130081300813,
width: 10.645325203252034,
height: 11.016260162601629,
rotation: 0,
},
id: "Nrzdt6xVq1",
from_name: "rect",
to_name: "img",
type: "rectangle",
origin: "manual",
},
{
original_width: 2242,
original_height: 2802,
image_rotation: 0,
value: {
x: 68.75,
y: 68.78556910569105,
width: 6.250000000000001,
height: 6.25,
rotation: 0,
},
id: "S_q7c7DTU4",
from_name: "rect",
to_name: "img",
type: "rectangle",
origin: "manual",
},
],
},
],
};
LabelStudio.setFeatureFlags({
fflag_fix_front_dev_3377_image_regions_shift_on_resize_280922_short: true,
fflag_fix_front_dev_3793_relative_coords_short: FF3793.enabled,
});
I.amOnPage("/");
LabelStudio.init(params);
LabelStudio.waitForObjectsReady();
AtOutliner.seeRegions(2);
await AtImageView.lookForStage();
AtImageView.selectPanTool();
I.say("Zoom into the first region");
for (let k = 0; k < 3; k++) {
I.click("[aria-label='zoom-in']");
AtImageView.drawByDrag(
AtImageView.percToX(95),
AtImageView.percToY(95),
-AtImageView.percToX(90),
-AtImageView.percToY(90),
);
}
AtImageView.selectMoveTool();
I.say("Check that there is a region at the center of visible area");
AtImageView.clickAt(AtImageView.percToX(50), AtImageView.percToY(50));
AtOutliner.seeSelectedRegion();
// these values depend on screen size, interface elements size, etc.
// so if they were changed slightly, just replace them with actual data.
AtDetails.seeFieldWithValue("X", FF3793.enabled ? "88.567" : "430.15");
I.pressKey("U");
I.say("Collapse the details panel");
AtDetailsPanel.collapsePanel();
await AtImageView.lookForStage();
I.say("Check that there is a region at the center of visible area");
AtImageView.clickAt(AtImageView.percToX(50), AtImageView.percToY(50));
AtOutliner.seeSelectedRegion();
I.pressKey("U");
I.say("Collapse the outliner panel");
AtOutlinerPanel.collapsePanel();
await AtImageView.lookForStage();
I.say("The region should be at the right side of visible area");
{
AtImageView.clickAt(AtImageView.percToX(25), AtImageView.percToY(50));
const thereIsTransformer = await AtImageView.isTransformerExist();
assert.strictEqual(thereIsTransformer, false);
}
{
AtImageView.clickAt(AtImageView.percToX(75), AtImageView.percToY(50));
const thereIsTransformer = await AtImageView.isTransformerExist();
assert.strictEqual(thereIsTransformer, true);
I.pressKey("U");
}
I.say("Reset changes");
AtDetailsPanel.expandPanel();
AtOutlinerPanel.expandPanel();
await AtImageView.lookForStage();
I.pressKey(["Shift", "1"]);
//
AtImageView.selectPanTool();
I.say("Zoom into the second region");
for (let k = 0; k < 3; k++) {
I.click("[aria-label='zoom-in']");
AtImageView.drawByDrag(
AtImageView.percToX(75),
AtImageView.percToY(75),
-AtImageView.percToX(25),
-AtImageView.percToY(25),
);
}
AtImageView.selectMoveTool();
I.say("Check that there is a region at the center of visible area");
AtImageView.clickAt(AtImageView.percToX(50), AtImageView.percToY(50));
AtOutliner.seeSelectedRegion();
AtDetails.seeFieldWithValue("X", FF3793.enabled ? "68.75" : "333.90");
I.pressKey("U");
I.say("Collapse the details panel");
AtDetailsPanel.collapsePanel();
await AtImageView.lookForStage();
I.say("Check that the region is still at the center of visible area");
AtImageView.clickAt(AtImageView.percToX(50), AtImageView.percToY(50));
AtOutliner.seeSelectedRegion();
I.pressKey("U");
I.say("Resize panels");
AtDetailsPanel.expandPanel();
for (const [shiftX, steps] of [
[100, 10],
[-100, 10],
[100, 10],
[-100, 10],
[100, 1],
[-100, 1],
[100, 1],
[-100, 1],
[100, 3],
[-100, 3],
]) {
await AtDetailsPanel.dragResizerBy(shiftX, 0, AtDetailsPanel.resizeLeft, steps);
}
for (const [shiftX, steps] of [
[-200, 25],
[200, 25],
[-200, 1],
[200, 1],
]) {
await AtOutlinerPanel.dragResizerBy(shiftX, 0, AtOutlinerPanel.resizeRight, steps);
}
I.waitTicks(3);
await AtImageView.lookForStage();
I.say("Check that the region is still at the center of visible area");
AtImageView.clickAt(AtImageView.percToX(50), AtImageView.percToY(50));
AtOutliner.seeSelectedRegion();
I.pressKey("U");
},
);
Scenario(
"Keeping the zoom center for different image sizes and scaling algorithms",
async ({ I, LabelStudio, AtImageView, AtPanels }) => {
const AtDetailsPanel = AtPanels.usePanel(AtPanels.PANEL.DETAILS);
const AtOutlinerPanel = AtPanels.usePanel(AtPanels.PANEL.OUTLINER);
const strokecolor = "rgb(0,111,222)";
const keyPointBeSelected = async () => {
const currentStokeColor = await I.executeScript(getStrokeColor);
const colorIsChanged = currentStokeColor !== strokecolor;
assert.strictEqual(colorIsChanged, true, "Stroke color must be changed if we are able to select keypoint");
};
const params = {
config: `
`,
annotations: [
{
id: "1000",
result: [],
},
],
};
LabelStudio.setFeatureFlags({
fflag_fix_front_dev_3377_image_regions_shift_on_resize_280922_short: true,
});
for (const [width, height] of [
[2242, 2802],
[768, 576],
]) {
I.amOnPage("/");
const imageUrl = await I.executeScript(Helpers.generateImageUrl, { width, height });
LabelStudio.init({
...params,
data: { image: imageUrl },
});
LabelStudio.waitForObjectsReady();
AtImageView.selectPanTool();
I.click("[aria-label='zoom-in']");
await AtImageView.lookForStage();
AtImageView.drawByDrag(
AtImageView.percToX(75),
AtImageView.percToY(25),
-AtImageView.percToX(25),
AtImageView.percToY(25),
);
I.say("Draw a point at the center of visible area");
I.pressKey("K");
AtImageView.drawByClick(AtImageView.percToX(50), AtImageView.percToY(50));
I.say("Collapse the details panel");
AtDetailsPanel.collapsePanel();
await AtImageView.lookForStage();
I.say("Check that the region is still at the center of visible area");
AtImageView.clickAt(AtImageView.percToX(50), AtImageView.percToY(50));
await keyPointBeSelected();
I.pressKey("U");
I.say("Collapse the outliner panel");
AtOutlinerPanel.collapsePanel();
await AtImageView.lookForStage();
I.say("Check that the region is still at the center of visible area");
AtImageView.clickAt(AtImageView.percToX(50), AtImageView.percToY(50));
await keyPointBeSelected();
I.pressKey("U");
AtDetailsPanel.expandPanel();
AtOutlinerPanel.expandPanel();
}
},
);