| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- // LoopFollow
- // MoreMenuViewController.swift
- import Combine
- import SwiftUI
- import UIKit
- class MoreMenuViewController: UIViewController {
- private var tableView: UITableView!
- private var cancellables = Set<AnyCancellable>()
- struct MenuItem {
- let title: String
- let icon: String
- let action: () -> Void
- }
- private var menuItems: [MenuItem] = []
- override func viewDidLoad() {
- super.viewDidLoad()
- title = "More"
- view.backgroundColor = .systemBackground
- // Apply appearance mode
- overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle
- // Listen for appearance setting changes
- Storage.shared.appearanceMode.$value
- .receive(on: DispatchQueue.main)
- .sink { [weak self] mode in
- self?.overrideUserInterfaceStyle = mode.userInterfaceStyle
- }
- .store(in: &cancellables)
- // Listen for system appearance changes (when in System mode)
- NotificationCenter.default.publisher(for: .appearanceDidChange)
- .receive(on: DispatchQueue.main)
- .sink { [weak self] _ in
- self?.overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle
- }
- .store(in: &cancellables)
- setupTableView()
- updateMenuItems()
- }
- override func viewWillAppear(_ animated: Bool) {
- super.viewWillAppear(animated)
- updateMenuItems()
- tableView.reloadData()
- Observable.shared.settingsPath.set(NavigationPath())
- }
- override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
- super.traitCollectionDidChange(previousTraitCollection)
- if Storage.shared.appearanceMode.value == .system,
- previousTraitCollection?.userInterfaceStyle != traitCollection.userInterfaceStyle
- {
- overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle
- }
- }
- private func setupTableView() {
- tableView = UITableView(frame: view.bounds, style: .insetGrouped)
- tableView.translatesAutoresizingMaskIntoConstraints = false
- tableView.delegate = self
- tableView.dataSource = self
- tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
- view.addSubview(tableView)
- NSLayoutConstraint.activate([
- tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
- tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
- tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
- tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
- ])
- }
- private func updateMenuItems() {
- menuItems = []
- // Always add Settings
- menuItems.append(MenuItem(
- title: "Settings",
- icon: "gear",
- action: { [weak self] in
- self?.openSettings()
- }
- ))
- // Add items based on their positions
- if Storage.shared.alarmsPosition.value == .more {
- menuItems.append(MenuItem(
- title: "Alarms",
- icon: "alarm",
- action: { [weak self] in
- self?.openAlarms()
- }
- ))
- }
- if Storage.shared.remotePosition.value == .more {
- menuItems.append(MenuItem(
- title: "Remote",
- icon: "antenna.radiowaves.left.and.right",
- action: { [weak self] in
- self?.openRemote()
- }
- ))
- }
- if Storage.shared.nightscoutPosition.value == .more {
- menuItems.append(MenuItem(
- title: "Nightscout",
- icon: "safari",
- action: { [weak self] in
- self?.openNightscout()
- }
- ))
- }
- }
- private func openSettings() {
- let settingsVC = UIHostingController(rootView: SettingsMenuView())
- let navController = UINavigationController(rootViewController: settingsVC)
- // Apply appearance mode
- let style = Storage.shared.appearanceMode.value.userInterfaceStyle
- settingsVC.overrideUserInterfaceStyle = style
- navController.overrideUserInterfaceStyle = style
- // Add a close button
- settingsVC.navigationItem.rightBarButtonItem = UIBarButtonItem(
- barButtonSystemItem: .done,
- target: self,
- action: #selector(dismissModal)
- )
- navController.modalPresentationStyle = .fullScreen
- present(navController, animated: true)
- }
- private func openAlarms() {
- let storyboard = UIStoryboard(name: "Main", bundle: nil)
- let alarmsVC = storyboard.instantiateViewController(withIdentifier: "AlarmViewController")
- let navController = UINavigationController(rootViewController: alarmsVC)
- // Apply appearance mode
- let style = Storage.shared.appearanceMode.value.userInterfaceStyle
- alarmsVC.overrideUserInterfaceStyle = style
- navController.overrideUserInterfaceStyle = style
- // Add a close button
- alarmsVC.navigationItem.rightBarButtonItem = UIBarButtonItem(
- barButtonSystemItem: .done,
- target: self,
- action: #selector(dismissModal)
- )
- navController.modalPresentationStyle = .fullScreen
- present(navController, animated: true)
- }
- private func openRemote() {
- let storyboard = UIStoryboard(name: "Main", bundle: nil)
- let remoteVC = storyboard.instantiateViewController(withIdentifier: "RemoteViewController")
- let navController = UINavigationController(rootViewController: remoteVC)
- // Apply appearance mode
- let style = Storage.shared.appearanceMode.value.userInterfaceStyle
- remoteVC.overrideUserInterfaceStyle = style
- navController.overrideUserInterfaceStyle = style
- // Add a close button
- remoteVC.navigationItem.rightBarButtonItem = UIBarButtonItem(
- barButtonSystemItem: .done,
- target: self,
- action: #selector(dismissModal)
- )
- navController.modalPresentationStyle = .fullScreen
- present(navController, animated: true)
- }
- private func openNightscout() {
- let storyboard = UIStoryboard(name: "Main", bundle: nil)
- let nightscoutVC = storyboard.instantiateViewController(withIdentifier: "NightscoutViewController")
- let navController = UINavigationController(rootViewController: nightscoutVC)
- // Apply appearance mode
- let style = Storage.shared.appearanceMode.value.userInterfaceStyle
- nightscoutVC.overrideUserInterfaceStyle = style
- navController.overrideUserInterfaceStyle = style
- // Add a close button
- nightscoutVC.navigationItem.rightBarButtonItem = UIBarButtonItem(
- barButtonSystemItem: .done,
- target: self,
- action: #selector(dismissModal)
- )
- navController.modalPresentationStyle = .fullScreen
- present(navController, animated: true)
- }
- @objc private func dismissModal() {
- dismiss(animated: true)
- }
- }
- extension MoreMenuViewController: UITableViewDataSource, UITableViewDelegate {
- func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int {
- return menuItems.count
- }
- func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
- let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
- let item = menuItems[indexPath.row]
- var config = cell.defaultContentConfiguration()
- config.text = item.title
- config.image = UIImage(systemName: item.icon)
- cell.contentConfiguration = config
- cell.accessoryType = .disclosureIndicator
- return cell
- }
- func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
- tableView.deselectRow(at: indexPath, animated: true)
- menuItems[indexPath.row].action()
- }
- }
|