|
|
@@ -119,6 +119,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
private let savedJobsDocumentView = JobListingsDocumentView()
|
|
|
private let savedJobsStack = NSStackView()
|
|
|
private let settingsPageContainer = NSView()
|
|
|
+ private weak var appearanceModeSegment: NSSegmentedControl?
|
|
|
private let cvMakerPageContainer = NSView()
|
|
|
private lazy var cvMakerPageView: CVMakerPageView = {
|
|
|
CVMakerPageView()
|
|
|
@@ -1557,6 +1558,23 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
contentStack.alignment = .leading
|
|
|
contentStack.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
|
|
+ let appearanceTitle = NSTextField(labelWithString: "Appearance")
|
|
|
+ appearanceTitle.font = .systemFont(ofSize: 12, weight: .semibold)
|
|
|
+ appearanceTitle.textColor = Theme.secondaryText
|
|
|
+ appearanceTitle.alignment = .left
|
|
|
+
|
|
|
+ let themeSegment = makeAppearanceModeSegment()
|
|
|
+ appearanceModeSegment = themeSegment
|
|
|
+ let appearanceSection = makeSettingsSection(rows: [
|
|
|
+ makeSettingsRow(title: "Theme", systemImage: "circle.lefthalf.filled", accessory: themeSegment, tapAction: nil)
|
|
|
+ ])
|
|
|
+
|
|
|
+ let appearanceStack = NSStackView(views: [appearanceTitle, appearanceSection])
|
|
|
+ appearanceStack.orientation = .vertical
|
|
|
+ appearanceStack.spacing = 14
|
|
|
+ appearanceStack.alignment = .leading
|
|
|
+ appearanceStack.translatesAutoresizingMaskIntoConstraints = false
|
|
|
+
|
|
|
let settingsSection = makeSettingsSection(rows: [
|
|
|
makeSettingsRow(title: "Share App", systemImage: "square.and.arrow.up", accessory: nil, tapAction: #selector(didTapShareApp)),
|
|
|
makeSettingsRow(title: "More Apps", systemImage: "square.grid.2x2", accessory: nil, tapAction: #selector(didTapMoreApps))
|
|
|
@@ -1580,6 +1598,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
aboutStack.alignment = .leading
|
|
|
aboutStack.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
|
|
+ contentStack.addArrangedSubview(appearanceStack)
|
|
|
contentStack.addArrangedSubview(settingsSection)
|
|
|
contentStack.addArrangedSubview(aboutStack)
|
|
|
settingsPageContainer.addSubview(contentStack)
|
|
|
@@ -1588,6 +1607,8 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
contentStack.leadingAnchor.constraint(equalTo: settingsPageContainer.leadingAnchor, constant: 42),
|
|
|
contentStack.trailingAnchor.constraint(lessThanOrEqualTo: settingsPageContainer.trailingAnchor, constant: -42),
|
|
|
contentStack.topAnchor.constraint(equalTo: settingsPageContainer.topAnchor, constant: 48),
|
|
|
+ appearanceStack.widthAnchor.constraint(equalTo: contentStack.widthAnchor),
|
|
|
+ appearanceSection.widthAnchor.constraint(equalTo: appearanceStack.widthAnchor),
|
|
|
settingsSection.widthAnchor.constraint(equalTo: contentStack.widthAnchor),
|
|
|
aboutStack.widthAnchor.constraint(equalTo: contentStack.widthAnchor),
|
|
|
aboutSection.widthAnchor.constraint(equalTo: aboutStack.widthAnchor),
|
|
|
@@ -1595,6 +1616,26 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
])
|
|
|
}
|
|
|
|
|
|
+ private func makeAppearanceModeSegment() -> NSSegmentedControl {
|
|
|
+ let segment = NSSegmentedControl(
|
|
|
+ labels: ["System", "Light", "Dark"],
|
|
|
+ trackingMode: .selectOne,
|
|
|
+ target: self,
|
|
|
+ action: #selector(appearanceModeChanged(_:))
|
|
|
+ )
|
|
|
+ segment.translatesAutoresizingMaskIntoConstraints = false
|
|
|
+ segment.segmentStyle = .automatic
|
|
|
+ segment.selectedSegment = AppAppearanceManager.shared.mode.segmentIndex
|
|
|
+ segment.setContentHuggingPriority(.required, for: .horizontal)
|
|
|
+ segment.setContentCompressionResistancePriority(.required, for: .horizontal)
|
|
|
+ return segment
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc private func appearanceModeChanged(_ sender: NSSegmentedControl) {
|
|
|
+ guard let mode = AppAppearanceManager.Mode(segmentIndex: sender.selectedSegment) else { return }
|
|
|
+ AppAppearanceManager.shared.mode = mode
|
|
|
+ }
|
|
|
+
|
|
|
private func makeSettingsSection(rows: [NSView]) -> NSView {
|
|
|
let section = NSStackView()
|
|
|
section.orientation = .vertical
|