This commit is contained in:
anlicheng 2026-03-25 11:54:07 +08:00
parent 2f2c5420e2
commit d6e6c961a2
4 changed files with 108 additions and 37 deletions

View File

@ -7,7 +7,7 @@
import SwiftUI import SwiftUI
struct LoginRootView: View { struct AppRootView: View {
@Environment(AppContext.self) var appContext: AppContext @Environment(AppContext.self) var appContext: AppContext
@State private var updateManager = AppUpdateManager.shared @State private var updateManager = AppUpdateManager.shared

View File

@ -0,0 +1,62 @@
//
// CustomWindowControls.swift
// punchnet
//
// Created by on 2026/3/25.
//
import SwiftUI
struct CustomWindowControls: View {
@State private var isHovering = false
var body: some View {
HStack(spacing: 8) {
// ()
CircleButton(color: .red, systemName: "xmark", isHovering: isHovering) {
//
if let window = NSApp.keyWindow {
window.close()
}
}
// // ()
// CircleButton(color: .yellow, systemName: "minus", isHovering: isHovering) {
// NSApp.keyWindow?.miniaturize(nil)
// }
//
// // / (绿)
// CircleButton(color: .green, systemName: "arrow.up.left.and.arrow.down.right", isHovering: isHovering) {
// NSApp.keyWindow?.toggleFullScreen(nil)
// }
}
.onHover { hovering in
withAnimation(.easeInOut(duration: 0.1)) {
isHovering = hovering
}
}
}
}
struct CircleButton: View {
let color: Color
let systemName: String
let isHovering: Bool
let action: () -> Void
var body: some View {
Button(action: action) {
ZStack {
Circle()
.fill(color.opacity(0.8))
.frame(width: 12, height: 12)
//
Image(systemName: systemName)
.font(.system(size: 8, weight: .bold))
.foregroundColor(.black.opacity(0.5))
.opacity(isHovering ? 1 : 0)
}
}
.buttonStyle(.plain)
}
}

View File

@ -35,13 +35,18 @@ struct SettingsView: View {
} }
var body: some View { var body: some View {
NavigationSplitView(columnVisibility: $columnVisibility) { NavigationSplitView(columnVisibility: $columnVisibility, sidebar: {
// MARK: - // MARK: -
VStack(alignment: .leading, spacing: 20) { VStack(alignment: .leading, spacing: 20) {
Text("设置") Text("设置")
.font(.system(size: 24, weight: .bold)) .font(.system(size: 24, weight: .bold))
.padding(.horizontal, 16) .padding(.horizontal, 16)
.padding(.top, 24) .padding(.top, 45)
.overlay(alignment: .topLeading) {
CustomWindowControls()
.padding(.top, 12)
.padding(.leading, 12)
}
VStack(spacing: 4) { VStack(spacing: 4) {
ForEach(MenuItem.allCases, id: \.self) { menu in ForEach(MenuItem.allCases, id: \.self) { menu in
@ -61,16 +66,14 @@ struct SettingsView: View {
} }
.padding(.horizontal, 12) .padding(.horizontal, 12)
} }
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
.background(VisualEffectView(material: .sidebar, blendingMode: .behindWindow)) .background(VisualEffectView(material: .sidebar, blendingMode: .behindWindow))
.toolbar(.hidden, for: .windowToolbar)
.navigationSplitViewColumnWidth(min: 180, ideal: 200, max: 250) .navigationSplitViewColumnWidth(min: 180, ideal: 200, max: 250)
.ignoresSafeArea(.all)
} detail: { }, detail: {
// MARK: - // MARK: -
ZStack(alignment: .topLeading) {
//
VisualEffectView(material: .hudWindow, blendingMode: .behindWindow)
.ignoresSafeArea()
VStack(alignment: .leading, spacing: 0) { VStack(alignment: .leading, spacing: 0) {
Group { Group {
// 使 ID SwiftUI transition // 使 ID SwiftUI transition
@ -97,9 +100,14 @@ struct SettingsView: View {
} }
.padding(32) // .padding(32) //
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
.toolbar(.hidden, for: .windowToolbar)
.ignoresSafeArea(edges: .top)
})
.navigationSplitViewStyle(.prominentDetail)
.background(VisualEffectView(material: .sidebar, blendingMode: .behindWindow))
.ignoresSafeArea(.all)
} }
}
}
} }
// MARK: - // MARK: -

View File

@ -45,7 +45,7 @@ struct punchnetApp: App {
var body: some Scene { var body: some Scene {
Window("Punchnet", id: "main") { Window("Punchnet", id: "main") {
LoginRootView() AppRootView()
.navigationTitle("") .navigationTitle("")
.environment(self.appContext) .environment(self.appContext)
.frame( .frame(
@ -70,10 +70,11 @@ struct punchnetApp: App {
Settings { Settings {
SettingsView() SettingsView()
.environment(self.appContext) .environment(self.appContext)
.frame(width: 750, height: 500) .frame(width: 750, height: 450)
} }
.windowResizability(.contentSize) .windowResizability(.contentSize)
.defaultPosition(.center) .defaultPosition(.center)
.windowStyle(.hiddenTitleBar)
MenuBarExtra("Punchnet", image: "logo_32") { MenuBarExtra("Punchnet", image: "logo_32") {
MainMenuBar() MainMenuBar()