import UIKit final class RDEPUBReaderBottomToolView: RDEPUBReaderToolView { var onShowTableOfContents: (() -> Void)? var onShowBookmarks: (() -> Void)? var onShowHighlights: (() -> Void)? var onAddHighlight: (() -> Void)? var onShowSettings: (() -> Void)? private let stackView: UIStackView = { let view = UIStackView() view.axis = .horizontal view.distribution = .fillEqually view.alignment = .fill view.spacing = 16 return view }() private let chapterButton = RDEPUBReaderTintButton(type: .system) private let bookmarksButton = RDEPUBReaderTintButton(type: .system) private let highlightsButton = RDEPUBReaderTintButton(type: .system) private let addHighlightButton = RDEPUBReaderTintButton(type: .system) private let settingsButton = RDEPUBReaderTintButton(type: .system) override init(frame: CGRect) { super.init(frame: frame) accessibilityIdentifier = "epub.reader.bottomToolbar" addSubview(stackView) stackView.translatesAutoresizingMaskIntoConstraints = false stackView.addArrangedSubview(chapterButton) stackView.addArrangedSubview(bookmarksButton) stackView.addArrangedSubview(highlightsButton) stackView.addArrangedSubview(addHighlightButton) stackView.addArrangedSubview(settingsButton) NSLayoutConstraint.activate([ stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16), stackView.topAnchor.constraint(equalTo: topAnchor), stackView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor) ]) configureButton(chapterButton, systemName: "list.bullet", fallbackTitle: "目录") configureButton(bookmarksButton, systemName: "bookmark", fallbackTitle: "书签") configureButton(highlightsButton, systemName: "note.text", fallbackTitle: "批注") configureButton(addHighlightButton, systemName: "highlighter", fallbackTitle: "标注") configureButton(settingsButton, systemName: "textformat.size", fallbackTitle: "设置") chapterButton.accessibilityIdentifier = "epub.reader.toc" bookmarksButton.accessibilityIdentifier = "epub.reader.bookmarks" highlightsButton.accessibilityIdentifier = "epub.reader.highlights" addHighlightButton.accessibilityIdentifier = "epub.reader.add-highlight" settingsButton.accessibilityIdentifier = "epub.reader.settings" [chapterButton, bookmarksButton, highlightsButton, addHighlightButton, settingsButton].forEach { button in button.heightAnchor.constraint(greaterThanOrEqualToConstant: 44).isActive = true } chapterButton.addTarget(self, action: #selector(chapterAction), for: .touchUpInside) bookmarksButton.addTarget(self, action: #selector(bookmarksAction), for: .touchUpInside) highlightsButton.addTarget(self, action: #selector(highlightsAction), for: .touchUpInside) addHighlightButton.addTarget(self, action: #selector(highlightAction), for: .touchUpInside) settingsButton.addTarget(self, action: #selector(settingsAction), for: .touchUpInside) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func lineFrame(in bounds: CGRect) -> CGRect { CGRect(x: 0, y: 0, width: bounds.width, height: 0.5) } override func apply(theme: RDEPUBReaderTheme) { super.apply(theme: theme) [chapterButton, bookmarksButton, highlightsButton, addHighlightButton, settingsButton].forEach { button in button.tintColor = .black button.setTitleColor(.black, for: .normal) } } func setAddHighlightEnabled(_ isEnabled: Bool) { addHighlightButton.isEnabled = isEnabled addHighlightButton.alpha = isEnabled ? 1 : 0.45 } func setHighlightsEnabled(_ isEnabled: Bool) { highlightsButton.isEnabled = isEnabled highlightsButton.alpha = isEnabled ? 1 : 0.45 } func setBookmarksEnabled(_ isEnabled: Bool) { bookmarksButton.isEnabled = isEnabled bookmarksButton.alpha = isEnabled ? 1 : 0.45 } func updateVisibility( showsTableOfContents: Bool, allowsHighlights: Bool, showsSettingsPanel: Bool ) { chapterButton.isHidden = !showsTableOfContents bookmarksButton.isHidden = false highlightsButton.isHidden = !allowsHighlights addHighlightButton.isHidden = !allowsHighlights settingsButton.isHidden = !showsSettingsPanel } private func configureButton(_ button: UIButton, systemName: String, fallbackTitle: String) { button.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .medium) if #available(iOS 13.0, *), let image = UIImage(systemName: systemName) { button.setImage(image.withRenderingMode(.alwaysTemplate), for: .normal) } else { button.setTitle(fallbackTitle, for: .normal) } } @objc private func chapterAction() { onShowTableOfContents?() } @objc private func bookmarksAction() { onShowBookmarks?() } @objc private func highlightsAction() { onShowHighlights?() } @objc private func highlightAction() { onAddHighlight?() } @objc private func settingsAction() { onShowSettings?() } }