Skip to content
Draft
Changes from 1 commit
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
Prev Previous commit
Next Next commit
wip
  • Loading branch information
rcarver committed Sep 28, 2025
commit 1cc94e819977778fd33b7a37ceb53dccaa9dfd5c
63 changes: 46 additions & 17 deletions Examples/AppKitDemo/SidebarViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,12 @@ final class SidebarViewController: NSViewController {
$rows = FetchAll(
RemindersList.all
.group(by: \.id)
.order(by: \.title)
.join(Reminder.all) { $0.id.eq($1.remindersListID) }
.select {
Row.Columns(
remindersList: $0,
reminders: $1.jsonGroupArray()
reminders: $1.jsonGroupArray() // FIXME: order reminders
)
}
)
Expand Down Expand Up @@ -77,13 +78,6 @@ final class SidebarViewController: NSViewController {
private enum OutlineItem {
case reminder(Reminder)
case remindersList(RemindersList, [Reminder])

var title: String {
switch self {
case .reminder(let reminder): reminder.title
case .remindersList(let remindersList, _): remindersList.title
}
}
}

extension SidebarViewController: NSOutlineViewDelegate {
Expand All @@ -96,17 +90,52 @@ extension SidebarViewController: NSOutlineViewDelegate {

let cellView = NSTableCellView()

let textField = NSTextField(labelWithString: item.title)
textField.translatesAutoresizingMaskIntoConstraints = false
switch item {
case .reminder(let reminder):
let textField = NSTextField(labelWithString: reminder.title)
textField.translatesAutoresizingMaskIntoConstraints = false
cellView.textField = textField

if reminder.isCompleted {
let checkmark = NSImageView(
image: NSImage(
systemSymbolName: "checkmark",
accessibilityDescription: "Completed"
)!
)

let stack = NSStackView(views: [checkmark, textField])
cellView.addSubview(stack)

NSLayoutConstraint.activate([
stack.leadingAnchor.constraint(equalTo: cellView.leadingAnchor),
stack.trailingAnchor.constraint(equalTo: cellView.trailingAnchor),
stack.centerYAnchor.constraint(equalTo: cellView.centerYAnchor),
])
} else {
cellView.addSubview(textField)

NSLayoutConstraint.activate([
textField.leadingAnchor.constraint(equalTo: cellView.leadingAnchor),
textField.trailingAnchor.constraint(equalTo: cellView.trailingAnchor),
textField.centerYAnchor.constraint(equalTo: cellView.centerYAnchor),
])
}

case .remindersList(let remindersList, _):

let textField = NSTextField(labelWithString: remindersList.title)
textField.translatesAutoresizingMaskIntoConstraints = false
cellView.textField = textField

cellView.addSubview(textField)
cellView.textField = textField
cellView.addSubview(textField)

NSLayoutConstraint.activate([
textField.leadingAnchor.constraint(equalTo: cellView.leadingAnchor, constant: 5),
textField.trailingAnchor.constraint(equalTo: cellView.trailingAnchor),
textField.centerYAnchor.constraint(equalTo: cellView.centerYAnchor),
])
NSLayoutConstraint.activate([
textField.leadingAnchor.constraint(equalTo: cellView.leadingAnchor, constant: 3),
textField.trailingAnchor.constraint(equalTo: cellView.trailingAnchor),
textField.centerYAnchor.constraint(equalTo: cellView.centerYAnchor),
])
}

return cellView
}
Expand Down