File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change @@ -12,16 +12,18 @@ import AppKit
1212import SwiftUI
1313
1414struct 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 ) {
You can’t perform that action at this time.
0 commit comments