Skip to content

Commit d1c6fda

Browse files
committed
updated
1 parent ab25b53 commit d1c6fda

File tree

15 files changed

+204
-175
lines changed

15 files changed

+204
-175
lines changed

Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Example/Example/MainViewController.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@ class MainViewController: NSViewController {
2121
let itemRegistration = ItemRegistration() { collectionViewItem, _, galleryItem in
2222
/// Configurate the item
2323
var configuration = NSItemContentConfiguration()
24-
URL(filePath: <#T##String#>)
2524
configuration.text = galleryItem.title
26-
configuration.textProperties.isSelectable = true
27-
configuration.textProperties.isEditable = true
2825
configuration.secondaryText = galleryItem.detail
2926
configuration.image = NSImage(named: galleryItem.title)
3027
configuration.contentProperties.shadow = .black(opacity: 0.5, radius: 5.0)

Example/Example/SidebarViewController.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ class SidebarViewController: NSViewController {
2121
/// `defaultContentConfiguration` returns a table cell content configuration with default styling based on the table view it's displayed at (in this case a sidebar table).
2222
var configuration = tableCell.defaultContentConfiguration()
2323
configuration.text = sidebarItem.title
24-
configuration.textProperties.isSelectable = true
25-
configuration.textProperties.isEditable = true
2624
configuration.image = NSImage(systemSymbolName: sidebarItem.symbolName)
2725
if sidebarItem.isFavorite {
2826
configuration.badge = .symbolImage("star.fill", color: .systemYellow, backgroundColor: nil)

Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentView.swift

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,6 @@ open class NSItemContentView: NSView, NSContentView, EditingContentView {
9494
}
9595
}
9696

97-
var isEditing: Bool = false {
98-
didSet {
99-
guard oldValue != isEditing else { return }
100-
if let collectionViewItem = collectionViewItem, collectionViewItem.view == self {
101-
collectionViewItem.setNeedsAutomaticUpdateConfiguration()
102-
} else if let tableCellView = tableCellView, tableCellView.contentView == self {
103-
tableCellView.setNeedsAutomaticUpdateConfiguration()
104-
} else if let tableRowView = tableRowView, tableRowView.contentView == self {
105-
tableRowView.setNeedsAutomaticUpdateConfiguration()
106-
}
107-
}
108-
}
109-
11097
var tableCellView: NSTableCellView? {
11198
firstSuperview(for: NSTableCellView.self)
11299
}

Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView.swift

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,22 +69,7 @@ open class NSListContentView: NSView, NSContentView, EditingContentView {
6969
lazy var imageTextStackView = NSStackView(views: [imageView, textStackView]).orientation(.horizontal).distribution(.fill)
7070
lazy var badgeStackView = NSStackView(views: [imageTextStackView]).orientation(.horizontal).distribution(.fill).alignment(.centerY)
7171
var stackViewConstraints: [NSLayoutConstraint] = []
72-
73-
var isEditing: Bool = false {
74-
didSet {
75-
guard oldValue != isEditing else { return }
76-
if let tableCellView = tableCellView, tableCellView.contentView == self {
77-
tableCellView.setNeedsAutomaticUpdateConfiguration()
78-
} else if let tableRowView = tableRowView, tableRowView.contentView == self {
79-
tableRowView.setNeedsAutomaticUpdateConfiguration()
80-
} else if let collectionViewItem = collectionViewItem {
81-
collectionViewItem.setNeedsAutomaticUpdateConfiguration()
82-
}
83-
// textField.preferredMaxLayoutWidth = isEditing ? bounds.width-34 : 0
84-
// secondaryTextField.preferredMaxLayoutWidth = isEditing ? bounds.width-34 : 0
85-
}
86-
}
87-
72+
8873
var tableCellView: NSTableCellView? {
8974
superview as? NSTableCellView
9075
}

Sources/AdvancedCollectionTableView/Configuration/Configurations/Shared/ListItemTextField.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ class ListItemTextField: NSTextField, NSTextFieldDelegate {
2626
static var textField = WidthTextField.wrapping().truncatesLastVisibleLine(true)
2727

2828
var editingContentView: EditingContentView? {
29-
firstSuperview(where: { $0 is EditingContentView }) as? EditingContentView
29+
firstSuperview(for: NSView.self)
30+
// firstSuperview(for: EditingContentView.self)
31+
return firstSuperview(where: { $0 is EditingContentView }) as? EditingContentView
3032
}
3133

3234
var tableCollectionView: NSView? {
33-
guard let editingContentView = editingContentView else { return nil }
34-
let isTable = editingContentView.superview is NSTableCellView
35-
return editingContentView.firstSuperview(for: isTable ? NSTableView.self : NSCollectionView.self)
35+
if editingContentView?.superview is NSCollectionView {
36+
return editingContentView?.superview
37+
}
38+
return firstSuperview(for: NSTableView.self)
3639
}
3740

3841
func updateText(_ text: String?, _ attributedString: AttributedString?, _ placeholder: String? = nil, _ attributedPlaceholder: AttributedString? = nil) {
@@ -105,7 +108,6 @@ class ListItemTextField: NSTextField, NSTextFieldDelegate {
105108
previousStringValue = isEditing ? stringValue : ""
106109
editingString = previousStringValue
107110
focusRingType = isEditing ? .none : .default
108-
editingContentView?.isEditing = isEditing
109111
}
110112
}
111113

Sources/AdvancedCollectionTableView/Configuration/Configurations/Shared/Protocols.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,4 @@ extension NSListContentConfiguration: AutomaticHeightSizable { }
1515
extension NSHostingConfiguration: AutomaticHeightSizable { }
1616

1717
/// Content configuration views with editable text fields.
18-
protocol EditingContentView: NSView {
19-
var isEditing: Bool { get set }
20-
}
18+
protocol EditingContentView: NSView { }

Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionView+.swift

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,22 @@ extension NSCollectionView {
4040
set { setAssociatedValue(newValue, key: "collectionViewObserverView") }
4141
}
4242

43+
var editingView: NSView? {
44+
observerView?.editingView
45+
}
46+
47+
var activeState: NSItemConfigurationState.ActiveState {
48+
isActive ? isFocused ? .focused : .active : .inactive
49+
}
50+
51+
var isFocused: Bool {
52+
observerView?.isFocused == true
53+
}
54+
55+
var isActive: Bool {
56+
window?.isKeyWindow == true
57+
}
58+
4359
/*
4460
/// A Boolean value that indicates whether the collection view reacts to mouse events.
4561
@objc open var isEnabled: Bool {
@@ -60,14 +76,14 @@ extension NSCollectionView {
6076
var isFocused = false {
6177
didSet {
6278
guard oldValue != isFocused else { return }
63-
Swift.print("CollectionView isFocused", isFocused)
64-
// collectionView?.visibleItems().forEach { $0.setNeedsAutomaticUpdateConfiguration() }
79+
collectionView?.visibleItems().forEach { $0.setNeedsAutomaticUpdateConfiguration() }
6580
}
6681
}
6782
weak var editingView: NSView? {
6883
didSet {
6984
guard oldValue != editingView else { return }
70-
Swift.print("CollectionView isEditing", editingView != nil)
85+
(oldValue?.firstSuperview(where: { $0.parentController is NSCollectionViewItem })?.parentController as? NSCollectionViewItem)?.setNeedsAutomaticUpdateConfiguration()
86+
(editingView?.firstSuperview(where: { $0.parentController is NSCollectionViewItem })?.parentController as? NSCollectionViewItem)?.setNeedsAutomaticUpdateConfiguration()
7187
}
7288
}
7389

Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionViewItem+.swift

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,10 @@ extension NSCollectionViewItem {
177177
To add your own custom state, see `NSConfigurationStateCustomKey`.
178178
*/
179179
@objc open var configurationState: NSItemConfigurationState {
180-
let state = NSItemConfigurationState(isSelected: isSelected, highlight: highlightState, isEditing: isEditing, isActive: isActive, isHovered: isHovered, isReordering: isReordering, isDropTarget: isDropTarget)
180+
let collectionView = _collectionView
181+
let activeState = collectionView?.activeState ?? .inactive
182+
let isEditing = collectionView?.editingView?.isDescendant(of: view) == true
183+
let state = NSItemConfigurationState(isSelected: isSelected, highlight: highlightState, isEditing: isEditing, activeState: activeState, isHovered: isHovered, isReordering: isReordering, isDropTarget: isDropTarget)
181184
return state
182185
}
183186

@@ -296,18 +299,14 @@ extension NSCollectionViewItem {
296299
var isEnabled: Bool {
297300
_collectionView?.isEnabled ?? true
298301
}
299-
302+
300303
/**
301304
A Boolean value that indicates whether the item is in an editing state.
302305

303306
The value of this property is `true` when the text of a list or item content configuration is being edited.
304307
*/
305308
@objc var isEditing: Bool {
306-
(view as? EditingContentView)?.isEditing ?? false
307-
}
308-
309-
@objc var _isEditing: Bool {
310-
if let editingView = view.window?.firstResponder as? EditiableView, editingView.isEditing, editingView.isDescendant(of: view) {
309+
if let editingView = view.window?.firstResponder as? EditiableView ?? (view.window?.firstResponder as? NSText)?.delegate as? EditiableView, editingView.isEditing, editingView.isDescendant(of: view) {
311310
return true
312311
}
313312
return false

Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ extension NSTableCellView {
101101
*/
102102
@objc open var configurationState: NSListConfigurationState {
103103
let rowView = rowView
104-
return NSListConfigurationState(isSelected: rowView?.isSelected ?? false, isEnabled: rowView?.isEnabled ?? true, isHovered: rowView?.isHovered ?? false, isEditing: isEditing, isActive: isActive, isReordering: rowView?.isReordering ?? false, isDropTarget: rowView?.isDropTarget ?? false, isNextSelected: rowView?.isNextRowSelected ?? false, isPreviousSelected: rowView?.isPreviousRowSelected ?? false)
104+
let tableView = tableView
105+
let activeState = tableView?.activeState ?? .inactive
106+
let isEditing = tableView?.editingView?.isDescendant(of: self) == true
107+
return NSListConfigurationState(isSelected: rowView?.isSelected ?? false, isEnabled: rowView?.isEnabled ?? true, isHovered: rowView?.isHovered ?? false, isEditing: isEditing, activeState: activeState, isReordering: rowView?.isReordering ?? false, isDropTarget: rowView?.isDropTarget ?? false, isNextSelected: rowView?.isNextRowSelected ?? false, isPreviousSelected: rowView?.isPreviousRowSelected ?? false)
105108
}
106109

107110
/**
@@ -249,7 +252,10 @@ extension NSTableCellView {
249252

250253
/// A Boolean value that indicates whether the cell is in an editable state. (the text of a content configuration is currently edited).
251254
@objc var isEditing: Bool {
252-
(contentView as? EditingContentView)?.isEditing ?? false
255+
if let editingView = window?.firstResponder as? EditiableView ?? (window?.firstResponder as? NSText)?.delegate as? EditiableView, editingView.isEditing, editingView.isDescendant(of: self) {
256+
return true
257+
}
258+
return false
253259
}
254260

255261
var isNextRowSelected: Bool {

Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,10 @@ extension NSTableRowView {
115115
To add your own custom state, see `NSConfigurationStateCustomKey`.
116116
*/
117117
@objc open var configurationState: NSListConfigurationState {
118-
let state = NSListConfigurationState(isSelected: isSelected, isEnabled: isEnabled, isHovered: isHovered, isEditing: isEditing, isActive: isActive, isNextSelected: isNextRowSelected, isPreviousSelected: isPreviousRowSelected)
118+
let tableView = tableView
119+
let activeState = tableView?.activeState ?? .inactive
120+
let isEditing = tableView?.editingView?.isDescendant(of: self) == true
121+
let state = NSListConfigurationState(isSelected: isSelected, isEnabled: isEnabled, isHovered: isHovered, isEditing: isEditing, activeState: activeState, isNextSelected: isNextRowSelected, isPreviousSelected: isPreviousRowSelected)
119122
return state
120123
}
121124

@@ -166,17 +169,29 @@ extension NSTableRowView {
166169
@objc var isEnabled: Bool {
167170
tableView?.isEnabled ?? true
168171
}
169-
172+
170173
/// A Boolean value that indicates whether the row view is in an editable state. (the text of a content configuration is currently edited).
171174
@objc var isEditing: Bool {
172-
(contentView as? EditingContentView)?.isEditing ?? false
175+
if let editingView = window?.firstResponder as? EditiableView ?? (window?.firstResponder as? NSText)?.delegate as? EditiableView, editingView.isEditing, editingView.isDescendant(of: self) {
176+
return true
177+
}
178+
return false
173179
}
174180

175181
/// A Boolean value that specifies whether the row view is active (it's window is focused).
176182
@objc var isActive: Bool {
177183
window?.isKeyWindow ?? false
178184
}
179185

186+
/// A Boolean value that indicates whether the collection view and it's items are focused.
187+
@objc var isTableViewFocused: Bool {
188+
tableView?.isDescendantFirstResponder == true
189+
}
190+
191+
var activeState: NSListConfigurationState.ActiveState {
192+
isActive ? isTableViewFocused ? .focused : .active : .inactive
193+
}
194+
180195
@objc var isReordering: Bool {
181196
get { getAssociatedValue("isReordering") ?? false }
182197
set {

Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@ extension NSTableView {
4242
set { setAssociatedValue(newValue, key: "tableViewObserverView") }
4343
}
4444

45+
var editingView: NSView? {
46+
observerView?.editingView
47+
}
48+
49+
var activeState: NSListConfigurationState.ActiveState {
50+
isActive ? isFocused ? .focused : .active : .inactive
51+
}
52+
53+
var isFocused: Bool {
54+
observerView?.isFocused == true
55+
}
56+
57+
var isActive: Bool {
58+
window?.isKeyWindow == true
59+
}
60+
4561
class ObserverView: NSView {
4662
var tokens: [NotificationToken] = []
4763
lazy var trackingArea = TrackingArea(for: self, options: [.mouseMoved, .mouseEnteredAndExited, .activeInKeyWindow])
@@ -51,14 +67,16 @@ extension NSTableView {
5167
var isFocused: Bool = false {
5268
didSet {
5369
guard oldValue != isFocused else { return }
54-
Swift.print("TableView isFocused", isFocused)
55-
// tableView?.visibleRows().forEach { $0.setNeedsAutomaticUpdateConfiguration() }
70+
Swift.print("focus updated", isFocused)
71+
tableView?.visibleRows().forEach { $0.setNeedsAutomaticUpdateConfiguration() }
5672
}
5773
}
5874
weak var editingView: NSView? {
5975
didSet {
6076
guard oldValue != editingView else { return }
61-
Swift.print("TableView isEditing", editingView ?? "nil")
77+
Swift.print("editingView updated")
78+
oldValue?.firstSuperview(for: NSTableRowView.self)?.setNeedsAutomaticUpdateConfiguration()
79+
editingView?.firstSuperview(for: NSTableRowView.self)?.setNeedsAutomaticUpdateConfiguration()
6280
}
6381
}
6482

@@ -76,6 +94,11 @@ extension NSTableView {
7694
}
7795
focusObservation = observeChanges(for: \.window?.firstResponder) { [weak self] oldValue, newValue in
7896
guard let self = self, let tableView = self.tableView else { return }
97+
if let newValue = newValue {
98+
Swift.print("firstResponder", type(of: newValue))
99+
} else {
100+
Swift.print("firstResponder nil")
101+
}
79102
if let view = (newValue as? NSView ?? (newValue as? NSText)?.delegate as? NSView), view.isDescendant(of: tableView) {
80103
self.isFocused = true
81104
self.editingView = (view as? EditiableView)?.isEditable == true ? view : nil

Sources/AdvancedCollectionTableView/Configuration/States/ConfigurationState.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ protocol ConfigurationState: NSConfigurationState {
1414
var isHovered: Bool { get }
1515
}
1616

17-
extension NSItemConfigurationState: ConfigurationState {}
18-
extension NSListConfigurationState: ConfigurationState {}
17+
extension NSItemConfigurationState: ConfigurationState { }
18+
extension NSListConfigurationState: ConfigurationState { }

0 commit comments

Comments
 (0)