diff --git a/Resources/StatusBar/OpenLessStatusIcon.svg b/Resources/StatusBar/OpenLessStatusIcon.svg new file mode 100644 index 00000000..7ca877fb --- /dev/null +++ b/Resources/StatusBar/OpenLessStatusIcon.svg @@ -0,0 +1,10 @@ + + OpenLess Status Icon + + + + + + + + diff --git a/Sources/OpenLessApp/MenuBarController.swift b/Sources/OpenLessApp/MenuBarController.swift index 217e0239..00c906ac 100644 --- a/Sources/OpenLessApp/MenuBarController.swift +++ b/Sources/OpenLessApp/MenuBarController.swift @@ -10,15 +10,13 @@ final class MenuBarController { init(coordinator: DictationCoordinator) { self.coordinator = coordinator - statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) + statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) if let button = statusItem.button { - if let image = NSImage(systemSymbolName: "mic.circle", accessibilityDescription: "OpenLess") { - image.isTemplate = true - button.image = image - } else { - button.title = "OL" - } - button.toolTip = "OpenLess — 点击菜单选择模式 / 退出" + button.image = StatusBarIcon.image() + button.imageScaling = .scaleProportionallyDown + button.imagePosition = .imageOnly + button.toolTip = "OpenLess — 点击菜单选择模式 / 退出" + button.setAccessibilityLabel("OpenLess") } actions = MenuActions(coordinator: coordinator) statusItem.menu = buildMenu() diff --git a/Sources/OpenLessApp/StatusBarIcon.swift b/Sources/OpenLessApp/StatusBarIcon.swift new file mode 100644 index 00000000..536fa311 --- /dev/null +++ b/Sources/OpenLessApp/StatusBarIcon.swift @@ -0,0 +1,56 @@ +import AppKit + +enum StatusBarIcon { + static func image() -> NSImage { + if let url = Bundle.main.url(forResource: "OpenLessStatusIcon", withExtension: "svg"), + let image = NSImage(contentsOf: url) { + image.size = NSSize(width: 18, height: 18) + image.isTemplate = false + return image + } + return fallbackImage() + } + + private static func fallbackImage() -> NSImage { + let size = NSSize(width: 18, height: 18) + let image = NSImage(size: size) + image.lockFocus() + defer { image.unlockFocus() } + + NSColor.clear.setFill() + NSRect(origin: .zero, size: size).fill() + + let dark = NSColor(calibratedRed: 0.07, green: 0.09, blue: 0.12, alpha: 1) + let blue = NSColor(calibratedRed: 0.18, green: 0.50, blue: 1.0, alpha: 1) + let plate = NSBezierPath(roundedRect: NSRect(x: 1.7, y: 1.7, width: 14.6, height: 14.6), xRadius: 4.3, yRadius: 4.3) + NSColor.white.withAlphaComponent(0.92).setFill() + plate.fill() + dark.withAlphaComponent(0.10).setStroke() + plate.lineWidth = 0.45 + plate.stroke() + + let ring = NSBezierPath() + ring.lineWidth = 2.2 + ring.lineCapStyle = .round + ring.appendArc( + withCenter: NSPoint(x: 8.5, y: 9), + radius: 6.1, + startAngle: 42, + endAngle: 330, + clockwise: false + ) + dark.setStroke() + ring.stroke() + + let dash = NSBezierPath() + dash.lineWidth = 2.1 + dash.lineCapStyle = .round + dash.move(to: NSPoint(x: 12.4, y: 9)) + dash.line(to: NSPoint(x: 16.1, y: 9)) + blue.setStroke() + dash.stroke() + + image.isTemplate = false + return image + } +} diff --git a/scripts/build-app.sh b/scripts/build-app.sh index cb526dd5..9544981c 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -27,6 +27,7 @@ rm -rf "${APP_DIR}" mkdir -p "${BIN_DIR}" "${RES_DIR}" cp "${BIN_SRC}" "${BIN_DIR}/${APP_NAME}" cp "Resources/AppIcon.icns" "${RES_DIR}/AppIcon.icns" +cp "Resources/StatusBar/OpenLessStatusIcon.svg" "${RES_DIR}/OpenLessStatusIcon.svg" cat > "${APP_DIR}/Contents/Info.plist" <