Files
VoidLink/VoidLinkSwiftUI/WidgetPickerViewController.swift
T
2026-04-02 06:51:33 +08:00

77 lines
3.0 KiB
Swift

import SwiftUI
import UIKit
@available(iOS 13.0, *)
@objc public protocol WidgetPickerViewControllerDelegate: AnyObject {
func widgetPickerViewController(_ controller: WidgetPickerViewController, didCreateWidget payload: NSDictionary)
@objc optional func widgetPickerViewControllerDidCancel(_ controller: WidgetPickerViewController)
}
@available(iOS 13.0, *)
@objcMembers
public final class WidgetPickerViewController: UIViewController {
public weak var delegate: WidgetPickerViewControllerDelegate?
public var isEditMode: Bool = false
public var initialCmdString: String?
public var initialButtonLabel: String?
public var initialShape: String?
public var tabIdentifiers: [String] = []
public var initialTabIdentifier: String?
private var hostingViewController: UIHostingController<WidgetPickerView>?
public override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
let rootView = WidgetPickerView(
isEditMode: isEditMode,
initialCmdString: initialCmdString,
initialButtonLabel: initialButtonLabel,
initialShape: initialShape,
availableTabs: resolvedTabs(),
preferredInitialTab: resolvedInitialTab(),
onWidgetCreated: { [weak self] payload in
guard let self else { return }
self.delegate?.widgetPickerViewController(self, didCreateWidget: payload as NSDictionary)
self.dismiss(animated: true)
},
onCloseRequested: { [weak self] in
self?.dismiss(animated: true)
}
)
let hostingViewController = UIHostingController(rootView: rootView)
self.hostingViewController = hostingViewController
addChild(hostingViewController)
hostingViewController.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(hostingViewController.view)
hostingViewController.didMove(toParent: self)
NSLayoutConstraint.activate([
hostingViewController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
hostingViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
hostingViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
hostingViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
preferredContentSize = CGSize(width: 1120, height: 760)
}
public override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(true, animated: false)
}
private func resolvedTabs() -> [WidgetPickerTab] {
let tabs = tabIdentifiers.compactMap(WidgetPickerTab.init(identifier:))
return tabs.isEmpty ? WidgetPickerTab.allCases : tabs
}
private func resolvedInitialTab() -> WidgetPickerTab? {
guard let initialTabIdentifier else { return nil }
return WidgetPickerTab(identifier: initialTabIdentifier)
}
}