Skip to content

Commit a5d8fa7

Browse files
Fix Find Navigator resizing delay, use line height from user settings (#2018)
* Fix resizing animaition, use line height from pref * Update sizing
1 parent bcec2a5 commit a5d8fa7

File tree

1 file changed

+58
-15
lines changed

1 file changed

+58
-15
lines changed

CodeEdit/Features/NavigatorArea/FindNavigator/FindNavigatorResultList/FindNavigatorListViewController.swift

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -209,26 +209,69 @@ extension FindNavigatorListViewController: NSOutlineViewDelegate {
209209
}
210210

211211
func outlineView(_ outlineView: NSOutlineView, heightOfRowByItem item: Any) -> CGFloat {
212-
if let item = item as? SearchResultMatchModel {
213-
let tempView = NSTextField(wrappingLabelWithString: item.attributedLabel().string)
214-
tempView.allowsDefaultTighteningForTruncation = false
215-
tempView.cell?.truncatesLastVisibleLine = true
212+
if let matchItem = item as? SearchResultMatchModel {
213+
guard let column = outlineView.tableColumns.first else {
214+
return rowHeight
215+
}
216+
let columnWidth = column.width
217+
let indentationLevel = outlineView.level(forItem: item)
218+
let indentationSpace = CGFloat(indentationLevel) * outlineView.indentationPerLevel
219+
let horizontalPaddingAndFixedElements: CGFloat = 24.0
220+
221+
let availableWidth = columnWidth - indentationSpace - horizontalPaddingAndFixedElements
222+
223+
guard availableWidth > 0 else {
224+
// Not enough space to display anything, return minimum height
225+
return max(rowHeight, Settings.shared.preferences.general.projectNavigatorSize.rowHeight)
226+
}
227+
228+
let attributedString = matchItem.attributedLabel()
229+
230+
let tempView = NSTextField()
231+
tempView.allowsEditingTextAttributes = true
232+
tempView.attributedStringValue = attributedString
233+
234+
tempView.isEditable = false
235+
tempView.isBordered = false
236+
tempView.drawsBackground = false
237+
tempView.alignment = .natural
238+
216239
tempView.cell?.wraps = true
217-
tempView.maximumNumberOfLines = 3
218-
tempView.attributedStringValue = item.attributedLabel()
219-
tempView.layout()
220-
let width = outlineView.frame.width - outlineView.indentationPerLevel*2 - 24
221-
return tempView.sizeThatFits(
222-
NSSize(width: width, height: CGFloat.greatestFiniteMagnitude)
223-
).height + 8
224-
} else {
225-
return rowHeight
240+
tempView.cell?.usesSingleLineMode = false
241+
tempView.lineBreakMode = .byWordWrapping
242+
tempView.maximumNumberOfLines = Settings.shared.preferences.general.findNavigatorDetail.rawValue
243+
tempView.preferredMaxLayoutWidth = availableWidth
244+
245+
var calculatedHeight = tempView.sizeThatFits(
246+
NSSize(width: availableWidth, height: .greatestFiniteMagnitude)
247+
).height
248+
249+
// Total vertical padding (top + bottom) within the cell around the text
250+
let verticalPaddingInCell: CGFloat = 8.0
251+
calculatedHeight += verticalPaddingInCell
252+
return max(calculatedHeight, self.rowHeight)
226253
}
254+
// For parent items
255+
return prefs.general.projectNavigatorSize.rowHeight
227256
}
228257

229258
func outlineViewColumnDidResize(_ notification: Notification) {
230-
let indexes = IndexSet(integersIn: 0..<searchItems.count)
231-
outlineView.noteHeightOfRows(withIndexesChanged: indexes)
259+
// Disable animations temporarily
260+
NSAnimationContext.beginGrouping()
261+
NSAnimationContext.current.duration = 0
262+
263+
var rowsToUpdate = IndexSet()
264+
for row in 0..<outlineView.numberOfRows {
265+
if let item = outlineView.item(atRow: row), item is SearchResultMatchModel {
266+
rowsToUpdate.insert(row)
267+
}
268+
}
269+
if !rowsToUpdate.isEmpty {
270+
outlineView.noteHeightOfRows(withIndexesChanged: rowsToUpdate)
271+
}
272+
273+
NSAnimationContext.endGrouping()
274+
outlineView.layoutSubtreeIfNeeded()
232275
}
233276
}
234277

0 commit comments

Comments
 (0)