Skip to content

Commit

Permalink
add: settings view
Browse files Browse the repository at this point in the history
  • Loading branch information
Kentakoong committed Oct 3, 2023
1 parent f195497 commit ec9d32f
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 29 deletions.
12 changes: 12 additions & 0 deletions MusicBar.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
1DA6BC1C29250E9500A19BD0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1DA6BC1A29250E9500A19BD0 /* Main.storyboard */; };
1DA6BC242925164100A19BD0 /* MediaRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA6BC232925164100A19BD0 /* MediaRemote.swift */; };
1DA6BC2A29252A3300A19BD0 /* StatusBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA6BC2929252A3300A19BD0 /* StatusBar.swift */; };
1DA778CB2ACBD4A50068C528 /* ToolbarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA778CA2ACBD4A50068C528 /* ToolbarButton.swift */; };
1DB481922A28EF0D00354C9A /* NSImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DB481912A28EF0D00354C9A /* NSImage+Extension.swift */; };
1DB481942A2904F100354C9A /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DB481932A2904F100354C9A /* String+Extension.swift */; };
1DD391682A2F8B7A00CF5486 /* PrivateMediaRemote in Frameworks */ = {isa = PBXBuildFile; productRef = 1DD391672A2F8B7A00CF5486 /* PrivateMediaRemote */; };
Expand Down Expand Up @@ -63,6 +64,7 @@
1DA6BC1D29250E9500A19BD0 /* MusicBar.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MusicBar.entitlements; sourceTree = "<group>"; };
1DA6BC232925164100A19BD0 /* MediaRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaRemote.swift; sourceTree = "<group>"; };
1DA6BC2929252A3300A19BD0 /* StatusBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBar.swift; sourceTree = "<group>"; };
1DA778CA2ACBD4A50068C528 /* ToolbarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarButton.swift; sourceTree = "<group>"; };
1DB481912A28EF0D00354C9A /* NSImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSImage+Extension.swift"; sourceTree = "<group>"; };
1DB481932A2904F100354C9A /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = "<group>"; };
1DBA0D1929DD7C2F00A7B946 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
Expand Down Expand Up @@ -230,6 +232,14 @@
path = MusicBar;
sourceTree = "<group>";
};
1DA778C92ACBD48B0068C528 /* Toolbar */ = {
isa = PBXGroup;
children = (
1DA778CA2ACBD4A50068C528 /* ToolbarButton.swift */,
);
path = Toolbar;
sourceTree = "<group>";
};
1DBD626B2A2F86F3007758A6 /* MediaRemoteUtilities */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -281,6 +291,7 @@
1DDE87322ACB0DEF005937BE /* SettingsView */ = {
isa = PBXGroup;
children = (
1DA778C92ACBD48B0068C528 /* Toolbar */,
1DDE87332ACB0DFB005937BE /* SettingsViewController.swift */,
1DDE87352ACB10BA005937BE /* SettingsView.swift */,
);
Expand Down Expand Up @@ -457,6 +468,7 @@
1D8ECB3D2A32CD5300EDC3DA /* MediaControlButton.swift in Sources */,
1DF215E82A1C9A9C00136BA2 /* Thread.swift in Sources */,
1D2DD6A32A31827E00D62084 /* SongDurationView.swift in Sources */,
1DA778CB2ACBD4A50068C528 /* ToolbarButton.swift in Sources */,
1D2DD69C2A317E7500D62084 /* SongTitleView.swift in Sources */,
1DA6BC1529250E9300A19BD0 /* AppDelegate.swift in Sources */,
1DDE87362ACB10BA005937BE /* SettingsView.swift in Sources */,
Expand Down
36 changes: 30 additions & 6 deletions MusicBar/Views/SettingsView/SettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,37 @@

import SwiftUI

@available(macOS 12.0, *)
struct SettingsView: View {
@State var selectedMenu: SelectedSettingsMenu = .general
@State var isFocused = false

var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
.frame(minWidth: 480, minHeight: 300)
VStack {
switch selectedMenu {
case .general:
Text("General Tab")
case .statusBar:
Text("Status Bar Tab")
}
}.toolbar {
ToolbarItemGroup(placement: .principal) {
ToolbarButton(title: SelectedSettingsMenu.general, systemName: "gearshape", isFocused: isFocused, selectedMenu: $selectedMenu)
ToolbarButton(title: SelectedSettingsMenu.statusBar, systemName: "rectangle.2.swap", isFocused: isFocused, selectedMenu: $selectedMenu)
}
}.frame(minWidth: 480, minHeight: 300)
.fixedSize()
.onReceive(NotificationCenter.default.publisher(for: NSWindow.didBecomeKeyNotification), perform: { _ in
isFocused = true
})
.onReceive(NotificationCenter.default.publisher(for: NSWindow.didResignKeyNotification), perform: { _ in
isFocused = false
})
.onReceive(NotificationCenter.default.publisher(for: NSWindow.didBecomeMainNotification), perform: { _ in
isFocused = true
})
.onReceive(NotificationCenter.default.publisher(for: NSWindow.didResignMainNotification), perform: { _ in
isFocused = false
})
}
}

#Preview {
SettingsView()
}
66 changes: 43 additions & 23 deletions MusicBar/Views/SettingsView/SettingsViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,47 +9,67 @@
import Cocoa
import SwiftUI

enum SelectedSettingsMenu: String {
case general = "General",
statusBar = "Status Bar"
}

class SettingsViewController: NSObject, NSWindowDelegate {

let hostingController = NSHostingController(rootView: SettingsView())

var window: NSWindow?

var isAlreadySetup = false

override init() {
super.init()
NotificationCenter.default.addObserver(self, selector: #selector(handleExitSettings), name: Notification.Name("HandleExitSettings"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(setTitle), name: Notification.Name("ChangeSettingsTitle"), object: nil)
}

func setup() {

window = NSWindow(contentViewController: hostingController)

let closeButton = window?.standardWindowButton(.closeButton)

closeButton?.action = #selector(NSWindow.handleCustomClose(_:))


window?.setContentSize(NSSize(width: 380, height: 400))

let controller = NSWindowController(window: window)
controller.showWindow(nil)

NSApp.activate(ignoringOtherApps: true)

window?.styleMask.formUnion(.fullSizeContentView)

NSApp.windows[0].makeKeyAndOrderFront(self)

window?.delegate = self

isAlreadySetup = true
if #available(macOS 12.0, *) {

let hostingController = NSHostingController(rootView: SettingsView())

window = NSWindow(contentViewController: hostingController)

let closeButton = window?.standardWindowButton(.closeButton)

closeButton?.action = #selector(NSWindow.handleCustomClose(_:))

window?.toolbarStyle = .preference

window?.title = SelectedSettingsMenu.general.rawValue

window?.setContentSize(NSSize(width: 380, height: 400))

let controller = NSWindowController(window: window)
controller.showWindow(nil)

NSApp.activate(ignoringOtherApps: true)

window?.styleMask.formUnion(.fullSizeContentView)

window?.makeKeyAndOrderFront(self)

NSApp.windows[0].makeKeyAndOrderFront(self)

window?.delegate = self

isAlreadySetup = true
}
}

@objc func handleExitSettings() {
isAlreadySetup = false
}

@objc func setTitle(_ notification: Notification) {
if let title = notification.userInfo?["title"] as? String {
window?.title = title
}
}
}

extension NSWindow {
Expand Down
46 changes: 46 additions & 0 deletions MusicBar/Views/SettingsView/Toolbar/ToolbarButton.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// ToolbarIconItem.swift
// MusicBar
//
// Created by Wongkraiwich Chuenchomphu on 3/10/23.
//

import SwiftUI

@available(macOS 12.0, *)
struct ToolbarButton: View {
var title: SelectedSettingsMenu
var systemName: String
var isFocused: Bool

@Binding var selectedMenu: SelectedSettingsMenu

@State private var isHovered = false

var body: some View {
Button(action: {
if selectedMenu != title {
selectedMenu = title
NotificationCenter.default.post(name: Notification.Name("ChangeSettingsTitle"),
object: nil,
userInfo:["title": title.rawValue])
}
}) {
VStack(spacing: 0) {
Image(systemName: systemName)
.font(.system(size: 20))
Text(title.rawValue)
.font(.system(size: 11))
}.foregroundColor(selectedMenu == title || isHovered ? isFocused == true ? .accentColor : .init(white: 0.65) : isFocused == true ? .gray : .init(white: 0.4))
.padding(.horizontal, 8)
.padding(.vertical, 3)
.background(selectedMenu == title || isHovered ? Color.init(white: 0.45, opacity: 0.3) : nil)
.roundedCorners(radius: 4, corners: .allCorners)
}.buttonStyle(.plain)
.onHover { over in
withAnimation(.easeInOut(duration: 0.2)) {
isHovered = over
}
}
}
}

0 comments on commit ec9d32f

Please sign in to comment.