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(); } }, );