From eeb7e4605ff27e1a087cb7b039a1bff27fec2b86 Mon Sep 17 00:00:00 2001 From: Rajdeep Kwatra Date: Fri, 10 Jan 2025 13:06:53 +1100 Subject: [PATCH] Revised logic to constraint column width based on both min and max --- .../Swift/Grid/Core/GridConfiguration.swift | 25 ++++++++++--- .../GridViewAttachmentSnapshotTests.swift | 34 ++++++++++++++++++ ...wAttachmentWithWidthBetweenMinAndMax.1.png | Bin 0 -> 33173 bytes 3 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 Proton/Tests/Grid/__Snapshots__/GridViewAttachmentSnapshotTests/testRendersGridViewAttachmentWithWidthBetweenMinAndMax.1.png diff --git a/Proton/Sources/Swift/Grid/Core/GridConfiguration.swift b/Proton/Sources/Swift/Grid/Core/GridConfiguration.swift index 0e89f31f..c0bdb62f 100644 --- a/Proton/Sources/Swift/Grid/Core/GridConfiguration.swift +++ b/Proton/Sources/Swift/Grid/Core/GridConfiguration.swift @@ -94,23 +94,38 @@ public enum GridColumnWidth { viewportWidth: CGFloat, minVal: (() -> ConstrainedWidth)?, maxVal: (() -> ConstrainedWidth)?) -> CGFloat { + + var minCalculated: CGFloat? + var maxCalculated: CGFloat? + if let minVal = minVal?() { switch minVal { case .absolute(let value): - return max(value, originalValue) + minCalculated = max(value, originalValue) case .viewport(let padding): - return max(viewportWidth - padding, originalValue) + minCalculated = max(viewportWidth - padding, originalValue) } } + if let maxVal = maxVal?() { switch maxVal { case .absolute(let value): - return min(value, originalValue) + maxCalculated = min(value, originalValue) case .viewport(let padding): - return min(viewportWidth - padding, originalValue) + maxCalculated = min(viewportWidth - padding, originalValue) } + } + + switch (minCalculated, maxCalculated) { + case let (min?, max?): + return originalValue.isBetween(min, max) ? originalValue : (originalValue < min ? min : max) + case let (min?, nil): + return originalValue < min ? min : originalValue + case let (nil, max?): + return originalValue > max ? max : originalValue + case (nil, nil): + return originalValue } - return originalValue } } diff --git a/Proton/Tests/Grid/GridViewAttachmentSnapshotTests.swift b/Proton/Tests/Grid/GridViewAttachmentSnapshotTests.swift index 1b6f9989..3be95bc9 100644 --- a/Proton/Tests/Grid/GridViewAttachmentSnapshotTests.swift +++ b/Proton/Tests/Grid/GridViewAttachmentSnapshotTests.swift @@ -334,6 +334,40 @@ class GridViewAttachmentSnapshotTests: SnapshotTestCase { XCTAssertEqual((cell02?.frame.width ?? 0) - cellOverlapPixels, 75) } + func testRendersGridViewAttachmentWithWidthBetweenMinAndMax() { + let viewController = EditorTestViewController() + let editor = viewController.editor + let config = GridConfiguration( + columnsConfiguration: [ + GridColumnConfiguration(width: .fractional(0.10, min: { .absolute(50)}, max: { .absolute(80) })), + GridColumnConfiguration(width: .fractional(0.40, min: { .absolute(50)}, max: { .absolute(80) })), + GridColumnConfiguration(width: .fixed(40, min: { .absolute(50)} , max: { .absolute(80)})), + GridColumnConfiguration(width: .fixed(90, min: { .absolute(50)} , max: { .absolute(80)})), + ], + rowsConfiguration: [ + GridRowConfiguration(initialHeight: 40), + GridRowConfiguration(initialHeight: 40), + ]) + let attachment = GridViewAttachment(config: config) + + editor.replaceCharacters(in: .zero, with: "Some text in editor") + editor.insertAttachment(in: editor.textEndRange, attachment: attachment) + editor.replaceCharacters(in: editor.textEndRange, with: "Text after grid") + + viewController.render(size: CGSize(width: 300, height: 200)) + assertSnapshot(of: viewController.view, as: .image, record: recordMode) + + let cell00 = attachment.view.cellAt(rowIndex: 0, columnIndex: 0) + let cell01 = attachment.view.cellAt(rowIndex: 0, columnIndex: 1) + let cell02 = attachment.view.cellAt(rowIndex: 0, columnIndex: 2) + let cell03 = attachment.view.cellAt(rowIndex: 0, columnIndex: 3) + + let cellOverlapPixels: CGFloat = 1 + XCTAssertEqual((cell00?.frame.width ?? 0) - cellOverlapPixels, 50) + XCTAssertEqual((cell01?.frame.width ?? 0) - cellOverlapPixels, 80) + XCTAssertEqual((cell02?.frame.width ?? 0) - cellOverlapPixels, 50) + XCTAssertEqual((cell03?.frame.width ?? 0) - cellOverlapPixels, 80) + } func testUpdatesCellSizeBasedOnContent() { let viewController = EditorTestViewController() diff --git a/Proton/Tests/Grid/__Snapshots__/GridViewAttachmentSnapshotTests/testRendersGridViewAttachmentWithWidthBetweenMinAndMax.1.png b/Proton/Tests/Grid/__Snapshots__/GridViewAttachmentSnapshotTests/testRendersGridViewAttachmentWithWidthBetweenMinAndMax.1.png new file mode 100644 index 0000000000000000000000000000000000000000..5d3fc1f47189dfb52f10348fe26e1c82e048eb06 GIT binary patch literal 33173 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%0D*5-G9hy?=pwCf#{DYuD-XfkB)6} zqLJAXYZdO<#3Xmu4;EIJ#DM=&7eNlGr)Mwf7>=Y}m5&3=ocZr(CBC64wQn+)TA1Sr&bx>UZJH=nQ`AJ+-u&o?(_J0)HUnzYeyf(_bvzQ+o}|e z#__G82f|;{v_LLJwN7Jb!iLx9Y9kXVxKfI7=FP53j=9ziA1vg14R)T@`OPIRevraR zrhrcGy$Mc2i)kD9`~*<{2Skw8(O4HZ0i#<-srUKO#VHGb&9^uNv>dp8>USG{Ctla< z<4a$gh{?$sWcB?-kvRLM3X&$DZ;Q82n)NQ6{BRc22+CMayBO6C4dD6`Utv-7*bsf8 zJ;sy2%%$Oka1mrTW?Me*f7@2G&##EO0mtCKPO+&NwFj4 zsD6@O{y9i6j2i&3XkO4WT%k6zmo`bXk!yPFS#BIDoBvkM3auo1k6-jFJb~aAIy%rA z&VtsvitPql$Ys{9*6?W?Tu+7yv&BK*y=gc>qFmT5hg8LY^`d-JKs_1XYlRLF1SN6x zE^ruv;Us00p76bGQKrKnrTmP%PUP$7`l(KJ3d+GDP(W%sv~hB+VdIOMIB*+=q&5O> zJFqOz2`siCmtQG5o9^Mmkk#g1O~XdO0Gi$(?c~8mYD}NliYgj!udrcy>*u07ToZDt zVn2W;IIR=^J{}wr@#6^QH00AG`OE@G?QS<7|4#reySNBe**XQ58C(nrjIxkI7(uKR z6WR*Yb0=G0{5)ElTz>F_Z^E1}6NIO({T@4HJTlXr%A(>Th7c$Wh|bRXO|JBBlp zD{J>XPY;8_Ta#NS4cg&nLH@=(&(Ei1vXdJJ?AV6d?(3(8QRRyMLi-J9y4tuJRUso> z#rH@C!>f7P%0BErk)&MsVptooJH6JnYP*~>Xh&JN3vLhxSuXn8i>bX$r&hM~d9$=WO>$^6(Zo-=6L4Qbp;Zc4H=hO5!Z!o1P~AiUdKpJMW|1Hq7qJ_UEdl zWg(s~Falgdk!;{2=oRN=85FQ|geG^28rMy$!W3kKC4{S}h&I&p;ov zKD~;@d{HLx$SWM6@|gVAYVtRQupQ8JK~>E=B>Rzq8$TJDJ4h?PXXX+ND^<#DXgV)~ z4$xcaCt&2n-QxD3-HN5*ONV$ZZlcSX{_vwz`Nbpum<{b&>3CR%B%vW0C(#F*?rl(t zuT+gBIPkSN0ss19p!U)s%*50Az~D(z(THbF67M-l&7HAyi0>l)B8~t5B7X83>B7d~ zEjRsWIxH!eLq%~TT4ILW>3e>xe~xO_Khxh9cO{Ut{YwV`cuVze za{RwMU$lN1&nM;YrUx+Oq0;5xwE0=2f*y#kGZ?)Ai+_!?R6I7b0{${1) zJ0a`lleBb8Po=`d5Rl{TGR)Yxj<51RWc|NC|6TYJ)%-5}@0zdl-RvlRF;m~o&Uc&t l-Qh|-?EjI&9TqKXRH@HeReEX@c<=Xz1N%^WOZS|-_#Zlx$@KsL literal 0 HcmV?d00001