Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Shared/Sources/Canvas/CanvasPresenter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ public class CanvasPresenter: DocumentPresenter {
return
}

// TODO: Delete control from document.elements
// TODO: Register Delete Undo on child
ui.delete(control: control)
remove(control: model)
publishControlChanges()
Expand Down
15 changes: 10 additions & 5 deletions Shared/Sources/Canvas/DocumentPresenter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,15 @@ open class DocumentPresenter {
}

func remove(control: any AccessibilityView) {
guard let index = document.controls.firstIndex(where: { controlInArray in
controlInArray === control
}) else { return }

document.controls.remove(at: index)

switch control.cast {

case .element(let description):
document.delete(description)
case .container(let container):
document.delete(container)
}


}
}
16 changes: 13 additions & 3 deletions Shared/Sources/Document/Documents/VODesignDocument+Controls.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
public extension VODesignDocumentProtocol {
func container(for description: A11yDescription) -> A11yContainer? {
controls.extractContainers().first(where: {
$0.contains(description)
})
controls.container(for: description)
}
}


public extension VODesignDocumentProtocol {
mutating func delete(_ description: A11yDescription) {
controls.delete(description)
}

#warning("Should it delete children or ungroup before deleting?")
mutating func delete(_ container: A11yContainer) {
controls.delete(container)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,39 @@ extension Array where Element == A11yDescription {
return index
}
}

public extension Array where Element == any AccessibilityView {
func container(for description: A11yDescription) -> A11yContainer? {
extractContainers().first(where: {
$0.contains(description)
})
}
}


public extension Array where Element == any AccessibilityView {
mutating func delete(_ description: A11yDescription) {
guard let indexToDelete = firstIndex(where: {
$0 === description
}) else {
//Try to remove from containing container
guard let container = container(for: description) else { return }
let _ = container.elements.remove(description)
if container.elements.isEmpty {
delete(container)
}
return
}

remove(at: indexToDelete)
}

#warning("Should it delete children or ungroup before deleting?")
mutating func delete(_ container: A11yContainer) {
guard let indexToDelete = firstIndex(where: {
$0 === container
}) else { return }

remove(at: indexToDelete)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//
// File.swift
//
//
// Created by Andrey Plotnikov on 30.12.2022.
//

import Foundation
@testable import Document

extension A11yContainer {
public static func testMake(
elements: [A11yDescription] = [],
frame: CGRect = .zero,
label: String = ""
) -> A11yContainer {
A11yContainer(
elements: elements,
frame: frame,
label: label
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import XCTest
import Document

final class AccessibilityViewArrayDeletionTests: XCTestCase {

var item1: A11yDescription!
var item2: A11yDescription!
var item3: A11yDescription!
var container1: A11yContainer!

var array: [any AccessibilityView]!

override func setUp() {
super.setUp()

item1 = A11yDescription.testMake()
item2 = A11yDescription.testMake()
item3 = A11yDescription.testMake()
}

func test_simple_element_deletion() throws {
array = [item1, item2, item3]

XCTAssertEqual(array.count, 3)
array.delete(item1)
XCTAssertEqual(array.count, 2)
}


func test_deletion_inside_container() throws {
container1 = .testMake(elements: [item1, item2])
array = [container1, item3]

XCTAssertEqual(array.count, 2)
array.delete(item1)
XCTAssertEqual(container1.elements.count, 1)
XCTAssertEqual(array.count, 2)
}

func test_container_deletion() throws {
container1 = .testMake(elements: [item1, item2, item3])
array = [container1]

XCTAssertEqual(container1.elements.count, 3)
XCTAssertEqual(array.count, 1)
array.delete(container1)
XCTAssertTrue(array.isEmpty)
}

func test_uncontained_deletion_not_change_array() throws {
container1 = .testMake(elements: [item1, item2])
array = [container1]

XCTAssertEqual(container1.elements.count, 2)
XCTAssertEqual(array.count, 1)
array.delete(item3)
XCTAssertEqual(array.count, 1)
}

func test_last_deleted_element_in_container_should_delete_container() throws {
container1 = .testMake(elements: [item1, item2, item3])
array = [container1]

XCTAssertEqual(container1.elements.count, 3)
XCTAssertEqual(array.count, 1)
array.delete(item1)
XCTAssertEqual(container1.elements.count, 2)
array.delete(item2)
XCTAssertEqual(container1.elements.count, 1)
array.delete(item3)
XCTAssertTrue(container1.elements.isEmpty)
XCTAssertTrue(array.isEmpty)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ public class ContainerSettingsPresenter {

public var container: A11yContainer
public weak var delegate: SettingsDelegate?


func delete() {
delegate?.delete(model: container)
}
}

extension ContainerSettingsPresenter: LabelDelegate {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="bU7-R8-ocO">
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="bU7-R8-ocO">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
<capability name="NSView safe area layout guides" minToolsVersion="12.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
Expand Down Expand Up @@ -183,6 +182,17 @@
<constraint firstAttribute="trailing" secondItem="63H-i2-nLD" secondAttribute="trailing" id="vMI-tM-wWb"/>
</constraints>
</customView>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sG5-EB-ch5">
<rect key="frame" x="14" y="39" width="74" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Delete" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="BqM-Tf-SQo">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="deleteWithSender:" target="bU7-R8-ocO" id="OxY-MN-DlE"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="qVM-Kv-LEu" firstAttribute="centerX" secondItem="Uu9-Gp-AZ7" secondAttribute="centerX" id="51I-kR-FVZ"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ class ContainerSettingsViewController: NSViewController {
@IBAction func isEnumerateDidChanged(sender: Any) {
presenter.container.isEnumerated = view().isEnumerated
}

@IBAction func delete(sender: Any) {
presenter.delete()
}
}

extension ContainerSettingsViewController: LabelDelegate {
Expand Down