From eac9f69977a16e8a7a7f5effd8315f9049af5d4d Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Wed, 13 Aug 2025 23:45:04 +0530 Subject: [PATCH] BugFix --- DynamicIsland/Localizable.xcstrings | 4 +- .../components/Clipboard/ClipboardPanel.swift | 39 ++++++++++++++++++- .../components/Settings/SettingsView.swift | 36 +++++++++++------ 3 files changed, 63 insertions(+), 16 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 44fd617..46713a8 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -327,7 +327,7 @@ "CPU Usage" : { }, - "Current custom timer: %@" : { + "Current custom timer:" : { }, "Current History" : { @@ -1219,7 +1219,7 @@ "unmuted" : { }, - "Update" : { + "Update Timer" : { }, "Upgrade to Pro" : { diff --git a/DynamicIsland/components/Clipboard/ClipboardPanel.swift b/DynamicIsland/components/Clipboard/ClipboardPanel.swift index 2576e0a..eb2318c 100644 --- a/DynamicIsland/components/Clipboard/ClipboardPanel.swift +++ b/DynamicIsland/components/Clipboard/ClipboardPanel.swift @@ -75,13 +75,48 @@ class ClipboardPanel: NSPanel { let screenFrame = screen.visibleFrame let panelFrame = frame - // Position at top center of screen (near where the notch would be) + // Check if we have a saved position + if let savedPosition = getSavedPosition() { + // Validate saved position is still on screen + let savedFrame = NSRect(origin: savedPosition, size: panelFrame.size) + if screenFrame.intersects(savedFrame) { + setFrameOrigin(savedPosition) + return + } + } + + // Default to center of screen (not top center) let xPosition = (screenFrame.width - panelFrame.width) / 2 + screenFrame.minX - let yPosition = screenFrame.maxY - panelFrame.height - 10 // 10px from top + let yPosition = (screenFrame.height - panelFrame.height) / 2 + screenFrame.minY setFrameOrigin(NSPoint(x: xPosition, y: yPosition)) } + private func getSavedPosition() -> NSPoint? { + let defaults = UserDefaults.standard + let x = defaults.double(forKey: "clipboardPanelPositionX") + let y = defaults.double(forKey: "clipboardPanelPositionY") + + // Check if we have valid saved coordinates (not default 0.0) + if x != 0.0 || y != 0.0 { + return NSPoint(x: x, y: y) + } + return nil + } + + private func saveCurrentPosition() { + let currentOrigin = frame.origin + let defaults = UserDefaults.standard + defaults.set(currentOrigin.x, forKey: "clipboardPanelPositionX") + defaults.set(currentOrigin.y, forKey: "clipboardPanelPositionY") + } + + override func setFrameOrigin(_ point: NSPoint) { + super.setFrameOrigin(point) + // Save position whenever it changes (user dragging) + saveCurrentPosition() + } + func positionNearMouse() { let mouseLocation = NSEvent.mouseLocation let panelFrame = frame diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 75084ff..0471beb 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -1324,8 +1324,8 @@ struct TimerSettings: View { Text("Custom Timer Duration") .font(.headline) - HStack(spacing: 16) { - VStack { + HStack(spacing: 20) { + VStack(alignment: .center, spacing: 8) { Text("Minutes") .font(.system(size: 14, weight: .medium)) .foregroundStyle(.secondary) @@ -1336,10 +1336,10 @@ struct TimerSettings: View { } } .pickerStyle(.menu) - .frame(width: 80, height: 40) + .frame(width: 100) } - VStack { + VStack(alignment: .center, spacing: 8) { Text("Seconds") .font(.system(size: 14, weight: .medium)) .foregroundStyle(.secondary) @@ -1350,20 +1350,32 @@ struct TimerSettings: View { } } .pickerStyle(.menu) - .frame(width: 80, height: 40) + .frame(width: 100) } } + .frame(maxWidth: .infinity) - HStack { - Text("Current custom timer: \(customTimerDisplayText)") - .foregroundStyle(.secondary) - Spacer() - Button("Update") { - customTimerDuration = Double(customMinutes * 60 + customSeconds) + VStack(alignment: .leading, spacing: 8) { + HStack { + Text("Current custom timer:") + .foregroundStyle(.secondary) + Text(customTimerDisplayText) + .foregroundStyle(.primary) + .fontWeight(.medium) + Spacer() + } + + HStack { + Spacer() + Button("Update Timer") { + customTimerDuration = Double(customMinutes * 60 + customSeconds) + } + .disabled(customMinutes == 0 && customSeconds == 0) + .buttonStyle(.borderedProminent) } - .disabled(customMinutes == 0 && customSeconds == 0) } } + .padding(.vertical, 8) } header: { Text("Custom Timer") } footer: {