Skip to content

Commit 27a7ac5

Browse files
committed
Grow settings panel when Claude dir picker expands
1 parent 8a9dfac commit 27a7ac5

3 files changed

Lines changed: 45 additions & 3 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// ClaudeDirSelector.swift
3+
// ClaudeIsland
4+
//
5+
// Manages the expand/collapse state of the Claude directory picker row,
6+
// so NotchViewModel can grow the settings panel when the picker is open
7+
// (matching SoundSelector / ScreenSelector behavior).
8+
//
9+
10+
import Combine
11+
import Foundation
12+
13+
@MainActor
14+
class ClaudeDirSelector: ObservableObject {
15+
static let shared = ClaudeDirSelector()
16+
17+
@Published var isPickerExpanded: Bool = false
18+
19+
/// Height of a single option row (matches SoundOptionRowInline style).
20+
private let rowHeight: CGFloat = 32
21+
22+
/// Number of option rows the picker shows (Auto-detect + Choose folder…).
23+
private let optionCount: Int = 2
24+
25+
private init() {}
26+
27+
/// Extra height needed when the picker is expanded.
28+
var expandedPickerHeight: CGFloat {
29+
guard isPickerExpanded else { return 0 }
30+
return CGFloat(optionCount) * rowHeight + 8 // +8 for padding
31+
}
32+
}

ClaudeIsland/Core/NotchViewModel.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class NotchViewModel: ObservableObject {
5050

5151
private let screenSelector = ScreenSelector.shared
5252
private let soundSelector = SoundSelector.shared
53+
private let claudeDirSelector = ClaudeDirSelector.shared
5354

5455
// MARK: - Geometry
5556

@@ -76,7 +77,10 @@ class NotchViewModel: ObservableObject {
7677
// Picker expansion deltas added on top when expanded.
7778
return CGSize(
7879
width: min(screenRect.width * 0.4, 480),
79-
height: 540 + screenSelector.expandedPickerHeight + soundSelector.expandedPickerHeight
80+
height: 540
81+
+ screenSelector.expandedPickerHeight
82+
+ soundSelector.expandedPickerHeight
83+
+ claudeDirSelector.expandedPickerHeight
8084
)
8185
case .instances:
8286
return CGSize(
@@ -119,6 +123,10 @@ class NotchViewModel: ObservableObject {
119123
soundSelector.$isPickerExpanded
120124
.sink { [weak self] _ in self?.objectWillChange.send() }
121125
.store(in: &cancellables)
126+
127+
claudeDirSelector.$isPickerExpanded
128+
.sink { [weak self] _ in self?.objectWillChange.send() }
129+
.store(in: &cancellables)
122130
}
123131

124132
// MARK: - Event Handling

ClaudeIsland/UI/Components/ClaudeDirPickerRow.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,18 @@ import AppKit
1212
import SwiftUI
1313

1414
struct ClaudeDirPickerRow: View {
15+
@ObservedObject private var selector = ClaudeDirSelector.shared
1516
@State private var currentValue: String = AppSettings.claudeDirectoryName
16-
@State private var isExpanded: Bool = false
1717
@State private var isHovered: Bool = false
1818

19+
private var isExpanded: Bool { selector.isPickerExpanded }
20+
1921
var body: some View {
2022
VStack(spacing: 0) {
2123
// Main row - shows current selection
2224
Button {
2325
withAnimation(.easeInOut(duration: 0.2)) {
24-
isExpanded.toggle()
26+
selector.isPickerExpanded.toggle()
2527
}
2628
} label: {
2729
HStack(spacing: 10) {

0 commit comments

Comments
 (0)