@@ -19,26 +19,14 @@ extension TableViewCoordinator {
1919 let columnIndex = column - 1
2020 guard !changeManager. isRowDeleted ( row) else { return }
2121
22- // Dropdown columns open on single click
22+ // Structure view dropdown columns (no chevron button — use full-cell click)
2323 if let dropdownCols = dropdownColumns, dropdownCols. contains ( columnIndex) {
2424 showDropdownMenu ( tableView: sender, row: row, column: column, columnIndex: columnIndex)
2525 return
2626 }
2727
28- // ENUM/SET columns open on single click
29- if columnIndex < rowProvider. columnTypes. count,
30- columnIndex < rowProvider. columns. count {
31- let ct = rowProvider. columnTypes [ columnIndex]
32- let columnName = rowProvider. columns [ columnIndex]
33- if ct. isEnumType, let values = rowProvider. columnEnumValues [ columnName] , !values. isEmpty {
34- showEnumPopover ( tableView: sender, row: row, column: column, columnIndex: columnIndex)
35- return
36- }
37- if ct. isSetType, let values = rowProvider. columnEnumValues [ columnName] , !values. isEmpty {
38- showSetPopover ( tableView: sender, row: row, column: column, columnIndex: columnIndex)
39- return
40- }
41- }
28+ // All other special editor columns are handled by their chevron button action.
29+ // Single click on cell text area does nothing.
4230 }
4331
4432 @objc func handleDoubleClick( _ sender: NSTableView ) {
@@ -58,30 +46,7 @@ extension TableViewCoordinator {
5846 return
5947 }
6048
61- // Dropdown columns already handled by single click
62- if let dropdownCols = dropdownColumns, dropdownCols. contains ( columnIndex) {
63- return
64- }
65-
66- // Type picker columns use database-specific type popover
67- if let typePickerCols = typePickerColumns, typePickerCols. contains ( columnIndex) {
68- showTypePickerPopover ( tableView: sender, row: row, column: column, columnIndex: columnIndex)
69- return
70- }
71-
72- // ENUM/SET columns already handled by single click
73- if columnIndex < rowProvider. columnTypes. count,
74- columnIndex < rowProvider. columns. count {
75- let ct = rowProvider. columnTypes [ columnIndex]
76- if ct. isEnumType || ct. isSetType {
77- let columnName = rowProvider. columns [ columnIndex]
78- if let values = rowProvider. columnEnumValues [ columnName] , !values. isEmpty {
79- return
80- }
81- }
82- }
83-
84- // FK columns use searchable dropdown popover
49+ // FK columns use searchable dropdown popover on double click
8550 if columnIndex < rowProvider. columns. count {
8651 let columnName = rowProvider. columns [ columnIndex]
8752 if let fkInfo = rowProvider. columnForeignKeys [ columnName] {
@@ -90,42 +55,83 @@ extension TableViewCoordinator {
9055 }
9156 }
9257
93- // Date columns use date picker popover
94- if columnIndex < rowProvider. columnTypes . count ,
95- rowProvider . columnTypes [ columnIndex ] . isDateType {
96- showDatePickerPopover ( tableView: sender, row: row, column: column, columnIndex: columnIndex)
58+ // Multiline values use the overlay editor instead of inline field editor
59+ if let value = rowProvider. value ( atRow : row , column : columnIndex ) ,
60+ value . containsLineBreak {
61+ showOverlayEditor ( tableView: sender, row: row, column: column, columnIndex: columnIndex, value : value )
9762 return
9863 }
9964
100- // JSON columns (or text columns containing JSON) use JSON editor popover
101- if columnIndex < rowProvider. columnTypes. count,
102- rowProvider. columnTypes [ columnIndex] . isJsonType {
103- showJSONEditorPopover ( tableView: sender, row: row, column: column, columnIndex: columnIndex)
104- return
65+ // JSON-like text values in non-JSON/non-chevron columns
66+ if columnIndex < rowProvider. columnTypes. count {
67+ let ct = rowProvider. columnTypes [ columnIndex]
68+ if ct. isBooleanType || ct. isDateType || ct. isBlobType || ct. isEnumType || ct. isSetType {
69+ return
70+ }
10571 }
106-
10772 if let cellValue = rowProvider. value ( atRow: row, column: columnIndex) ,
10873 cellValue. looksLikeJson {
10974 showJSONEditorPopover ( tableView: sender, row: row, column: column, columnIndex: columnIndex)
11075 return
11176 }
11277
113- // BLOB columns use hex editor popover
114- if columnIndex < rowProvider. columnTypes. count,
115- rowProvider. columnTypes [ columnIndex] . isBlobType {
116- showBlobEditorPopover ( tableView: sender, row: row, column: column, columnIndex: columnIndex)
117- return
78+ // Regular columns — start inline editing
79+ sender. editColumn ( column, row: row, with: nil , select: true )
80+ }
81+
82+ // MARK: - Chevron Click
83+
84+ @objc func handleChevronClick( _ sender: NSButton ) {
85+ guard let button = sender as? CellChevronButton ,
86+ isEditable else { return }
87+
88+ let row = button. cellRow
89+ let columnIndex = button. cellColumnIndex
90+ guard row >= 0 , columnIndex >= 0 else { return }
91+ guard !changeManager. isRowDeleted ( row) else { return }
92+
93+ // Walk up the view hierarchy to find the NSTableView
94+ var current : NSView ? = button. superview
95+ var tableView : NSTableView ?
96+ while let view = current {
97+ if let tv = view as? NSTableView {
98+ tableView = tv
99+ break
100+ }
101+ current = view. superview
118102 }
103+ guard let tableView else { return }
104+ let column = columnIndex + 1
119105
120- // Multiline values use the overlay editor instead of inline field editor
121- if let value = rowProvider. value ( atRow: row, column: columnIndex) ,
122- value. containsLineBreak {
123- showOverlayEditor ( tableView: sender, row: row, column: column, columnIndex: columnIndex, value: value)
106+ // Structure view: dropdown and type picker columns take priority
107+ if let dropdownCols = dropdownColumns, dropdownCols. contains ( columnIndex) {
108+ showDropdownMenu ( tableView: tableView, row: row, column: column, columnIndex: columnIndex)
109+ return
110+ }
111+ if let typePickerCols = typePickerColumns, typePickerCols. contains ( columnIndex) {
112+ showTypePickerPopover ( tableView: tableView, row: row, column: column, columnIndex: columnIndex)
124113 return
125114 }
126115
127- // Regular columns — start inline editing
128- sender. editColumn ( column, row: row, with: nil , select: true )
116+ guard columnIndex < rowProvider. columnTypes. count,
117+ columnIndex < rowProvider. columns. count else { return }
118+
119+ let ct = rowProvider. columnTypes [ columnIndex]
120+ let columnName = rowProvider. columns [ columnIndex]
121+
122+ if ct. isBooleanType {
123+ showDropdownMenu ( tableView: tableView, row: row, column: column, columnIndex: columnIndex)
124+ } else if ct. isEnumType, let values = rowProvider. columnEnumValues [ columnName] , !values. isEmpty {
125+ showEnumPopover ( tableView: tableView, row: row, column: column, columnIndex: columnIndex)
126+ } else if ct. isSetType, let values = rowProvider. columnEnumValues [ columnName] , !values. isEmpty {
127+ showSetPopover ( tableView: tableView, row: row, column: column, columnIndex: columnIndex)
128+ } else if ct. isDateType {
129+ showDatePickerPopover ( tableView: tableView, row: row, column: column, columnIndex: columnIndex)
130+ } else if ct. isJsonType {
131+ showJSONEditorPopover ( tableView: tableView, row: row, column: column, columnIndex: columnIndex)
132+ } else if ct. isBlobType {
133+ showBlobEditorPopover ( tableView: tableView, row: row, column: column, columnIndex: columnIndex)
134+ }
129135 }
130136
131137 // MARK: - FK Navigation
0 commit comments