Skip to content

Commit

Permalink
refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
michalrentka committed Jul 15, 2024
1 parent cd4a95e commit a2b9e72
Show file tree
Hide file tree
Showing 8 changed files with 242 additions and 262 deletions.
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@
url = https://github.com/zotero/translators.git
[submodule "reader"]
path = reader
url = https://github.com/zotero/reader.git
url = https://github.com/zotero/reader
19 changes: 19 additions & 0 deletions Zotero.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -4289,6 +4289,7 @@
B3CF8840266E0FE6009CFC20 /* Run Script */,
B3593F142668D37900FA4BB2 /* Run Script */,
B34A85AC243CB1E4003D5638 /* ShellScript */,
B3052A912C412E12008C8596 /* ShellScript */,
B337A5AD244F229400AFD13D /* SwiftGen */,
B30D59512206F60400884C4A /* Sources */,
B30D59522206F60400884C4A /* Frameworks */,
Expand Down Expand Up @@ -4623,6 +4624,24 @@
shellPath = /bin/sh;
shellScript = "swiftlint\n";
};
B3052A912C412E12008C8596 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"$(SRCROOT)/scripts/bundle_reader.sh",
);
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "sh \"$SCRIPT_INPUT_FILE_0\"\n";
};
B3087B87245190F500FF05ED /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,31 +190,31 @@ class HtmlEpubDocumentViewController: UIViewController {
private func process(handler: String, message: Any) {
switch handler {
case JSHandlers.log.rawValue:
DDLogInfo("HtmlEpubReaderViewController: JSLOG \(message)")
DDLogInfo("HtmlEpubDocumentViewController: JSLOG \(message)")

case JSHandlers.text.rawValue:
guard let data = message as? [String: Any], let event = data["event"] as? String else {
DDLogWarn("HtmlEpubReaderViewController: unknown message - \(message)")
DDLogWarn("HtmlEpubDocumentViewController: unknown message - \(message)")
return
}

DDLogInfo("HtmlEpubReaderViewController: \(event)")
DDLogInfo("HtmlEpubDocumentViewController: \(event)")

switch event {
case "onInitialized":
viewModel.process(action: .loadDocument)

case "onSaveAnnotations":
guard let params = data["params"] as? [String: Any] else {
DDLogWarn("HtmlEpubReaderViewController: event \(event) missing params - \(message)")
DDLogWarn("HtmlEpubDocumentViewController: event \(event) missing params - \(message)")
return
}
DDLogInfo("HtmlEpubReaderViewController: \(params)")
DDLogInfo("HtmlEpubDocumentViewController: \(params)")
viewModel.process(action: .saveAnnotations(params))

case "onSetAnnotationPopup":
guard let params = data["params"] as? [String: Any] else {
DDLogWarn("HtmlEpubReaderViewController: event \(event) missing params - \(message)")
DDLogWarn("HtmlEpubDocumentViewController: event \(event) missing params - \(message)")
return
}

Expand All @@ -224,7 +224,7 @@ class HtmlEpubDocumentViewController: UIViewController {
}

guard let rectArray = params["rect"] as? [CGFloat], let key = (params["annotation"] as? [String: Any])?["id"] as? String else {
DDLogError("HtmlEpubReaderViewController: incorrect params for document selection - \(params)")
DDLogError("HtmlEpubDocumentViewController: incorrect params for document selection - \(params)")
return
}

Expand All @@ -234,7 +234,7 @@ class HtmlEpubDocumentViewController: UIViewController {

case "onChangeViewState":
guard let params = data["params"] as? [String: Any] else {
DDLogWarn("HtmlEpubReaderViewController: event \(event) missing params - \(message)")
DDLogWarn("HtmlEpubDocumentViewController: event \(event) missing params - \(message)")
return
}
viewModel.process(action: .setViewState(params))
Expand Down
161 changes: 41 additions & 120 deletions Zotero/Scenes/Detail/HTML:EPUB/Views/HtmlEpubReaderViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,24 @@ protocol HtmlEpubReaderContainerDelegate: AnyObject {
var isSidebarVisible: Bool { get }
}

class HtmlEpubReaderViewController: UIViewController {
class HtmlEpubReaderViewController: UIViewController, ParentWithSidebarController {
typealias DocumentController = HtmlEpubDocumentViewController
typealias SidebarController = HtmlEpubSidebarViewController

private enum NavigationBarButton: Int {
case sidebar = 7
}

private let viewModel: ViewModel<HtmlEpubReaderActionHandler>
private let disposeBag: DisposeBag

private weak var documentController: HtmlEpubDocumentViewController?
private weak var documentTop: NSLayoutConstraint!
private weak var documentLeft: NSLayoutConstraint!
private weak var annotationToolbarController: AnnotationToolbarViewController!
private var annotationToolbarHandler: AnnotationToolbarHandler!
private weak var sidebarController: HtmlEpubSidebarViewController!
private weak var sidebarLeft: NSLayoutConstraint!
let disposeBag: DisposeBag

weak var documentController: HtmlEpubDocumentViewController?
private weak var documentControllerTop: NSLayoutConstraint!
weak var documentControllerLeft: NSLayoutConstraint?
weak var annotationToolbarController: AnnotationToolbarViewController?
var annotationToolbarHandler: AnnotationToolbarHandler?
weak var sidebarController: HtmlEpubSidebarViewController?
weak var sidebarControllerLeft: NSLayoutConstraint?
var navigationBarHeight: CGFloat {
return self.navigationController?.navigationBar.frame.height ?? 0.0
}
Expand All @@ -51,29 +54,10 @@ class HtmlEpubReaderViewController: UIViewController {
(self.navigationController as? NavigationViewController)?.statusBarVisible = self.statusBarVisible
}
}
var isSidebarVisible: Bool { return self.sidebarLeft?.constant == 0 }
private lazy var toolbarButton: UIBarButtonItem = {
var configuration = UIButton.Configuration.plain()
let image = UIImage(systemName: "pencil.and.outline")?.applyingSymbolConfiguration(.init(scale: .large))
let checkbox = CheckboxButton(image: image!, contentInsets: NSDirectionalEdgeInsets(top: 11, leading: 6, bottom: 9, trailing: 6))
checkbox.scalesLargeContentImage = true
checkbox.deselectedBackgroundColor = .clear
checkbox.deselectedTintColor = Asset.Colors.zoteroBlueWithDarkMode.color
checkbox.selectedBackgroundColor = Asset.Colors.zoteroBlue.color
checkbox.selectedTintColor = .white
checkbox.isSelected = toolbarState.visible
checkbox.rx.controlEvent(.touchUpInside)
.subscribe(onNext: { [weak self, weak checkbox] _ in
guard let self, let checkbox else { return }
checkbox.isSelected = !checkbox.isSelected
annotationToolbarHandler.set(hidden: !checkbox.isSelected, animated: true)
})
.disposed(by: disposeBag)
let barButton = UIBarButtonItem(customView: checkbox)
barButton.accessibilityLabel = L10n.Accessibility.Pdf.toggleAnnotationToolbar
barButton.title = L10n.Accessibility.Pdf.toggleAnnotationToolbar
barButton.largeContentSizeImage = UIImage(systemName: "pencil.and.outline", withConfiguration: UIImage.SymbolConfiguration(scale: .large))
return barButton
var isSidebarVisible: Bool { return self.sidebarControllerLeft?.constant == 0 }
var isDocumentLocked: Bool { return false }
lazy var toolbarButton: UIBarButtonItem = {
return createToolbarButton()
}()
private lazy var settingsButton: UIBarButtonItem = {
let settings = UIBarButtonItem(image: UIImage(systemName: "gearshape"), style: .plain, target: nil, action: nil)
Expand Down Expand Up @@ -224,11 +208,11 @@ class HtmlEpubReaderViewController: UIViewController {
self.documentController = documentController
self.sidebarController = sidebarController
annotationToolbarController = annotationToolbar
documentTop = documentTopConstraint
documentLeft = documentLeftConstraint
sidebarLeft = sidebarLeftConstraint
documentControllerTop = documentTopConstraint
documentControllerLeft = documentLeftConstraint
sidebarControllerLeft = sidebarLeftConstraint
annotationToolbarHandler = AnnotationToolbarHandler(controller: annotationToolbar, delegate: self)
annotationToolbarHandler.performInitialLayout()
annotationToolbarHandler!.performInitialLayout()

func add(controller: UIViewController) {
controller.willMove(toParent: self)
Expand All @@ -240,7 +224,7 @@ class HtmlEpubReaderViewController: UIViewController {

override func viewIsAppearing(_ animated: Bool) {
super.viewIsAppearing(animated)
annotationToolbarHandler.viewIsAppearing(editingEnabled: viewModel.state.library.metadataEditable)
annotationToolbarHandler?.viewIsAppearing(editingEnabled: viewModel.state.library.metadataEditable)
}

deinit {
Expand All @@ -250,7 +234,9 @@ class HtmlEpubReaderViewController: UIViewController {
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()

if (documentController?.view.frame.width ?? 0) < AnnotationToolbarHandler.minToolbarWidth && toolbarState.visible && toolbarState.position == .top {
guard let documentController else { return }

if documentController.view.frame.width < AnnotationToolbarHandler.minToolbarWidth && toolbarState.visible && toolbarState.position == .top {
closeAnnotationToolbar()
}
}
Expand All @@ -265,7 +251,7 @@ class HtmlEpubReaderViewController: UIViewController {
coordinator.animate(alongsideTransition: { [weak self] _ in
guard let self else { return }
statusBarHeight = view.safeAreaInsets.top - (navigationController?.isNavigationBarHidden == true ? 0 : navigationBarHeight)
annotationToolbarHandler.viewWillTransitionToNewSize()
annotationToolbarHandler?.viewWillTransitionToNewSize()
}, completion: nil)
}

Expand All @@ -277,7 +263,7 @@ class HtmlEpubReaderViewController: UIViewController {
}

if state.changes.contains(.toolColor), let color = state.activeTool.flatMap({ state.toolColors[$0] }) {
annotationToolbarController.set(activeColor: color)
annotationToolbarController?.set(activeColor: color)
}

if state.changes.contains(.activeTool) {
Expand All @@ -292,12 +278,12 @@ class HtmlEpubReaderViewController: UIViewController {

func select(activeTool tool: AnnotationTool?) {
if let tool = activeAnnotationTool {
annotationToolbarController.set(selected: false, to: tool, color: nil)
annotationToolbarController?.set(selected: false, to: tool, color: nil)
}

if let tool {
let color = viewModel.state.toolColors[tool]
annotationToolbarController.set(selected: true, to: tool, color: color)
annotationToolbarController?.set(selected: true, to: tool, color: color)
}
}

Expand Down Expand Up @@ -356,6 +342,10 @@ class HtmlEpubReaderViewController: UIViewController {

// MARK: - Actions

private func toggleSidebar(animated: Bool) {
toggleSidebar(animated: animated, sidebarButtonTag: NavigationBarButton.sidebar.rawValue)
}

private func showSettings(sender: UIBarButtonItem) {
guard let viewModel = coordinatorDelegate?.showSettings(with: viewModel.state.settings, sender: sender) else { return }
viewModel.stateObservable
Expand All @@ -371,92 +361,22 @@ class HtmlEpubReaderViewController: UIViewController {
viewModel.process(action: .changeIdleTimerDisabled(false))
navigationController?.presentingViewController?.dismiss(animated: true)
}

private func toggleSidebar(animated: Bool) {
let shouldShow = !isSidebarVisible

// If the layout is compact, show annotation sidebar above pdf document.
if !isCompactWidth {
documentLeft.constant = shouldShow ? PDFReaderLayout.sidebarWidth : 0
} else if shouldShow && toolbarState.visible {
closeAnnotationToolbar()
}
sidebarLeft.constant = shouldShow ? 0 : -PDFReaderLayout.sidebarWidth
if toolbarState.visible {
annotationToolbarHandler.recalculateConstraints()
}

if let button = navigationItem.leftBarButtonItems?.first(where: { $0.tag == NavigationBarButton.sidebar.rawValue }) {
setupAccessibility(forSidebarButton: button)
}

if !animated {
sidebarController.view.isHidden = !shouldShow
annotationToolbarController.prepareForSizeChange()
view.layoutIfNeeded()
annotationToolbarController.sizeDidChange()

if !shouldShow {
view.endEditing(true)
}
return
}

if shouldShow {
sidebarController.view.isHidden = false
} else {
view.endEditing(true)
}

UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 5, options: [.curveEaseOut], animations: { [weak self] in
guard let self else { return }
annotationToolbarController.prepareForSizeChange()
view.layoutIfNeeded()
annotationToolbarController.sizeDidChange()
}, completion: { [weak self] finished in
guard let self, finished else { return }
if !shouldShow {
sidebarController.view.isHidden = true
}
})
}

private func setupAccessibility(forSidebarButton button: UIBarButtonItem) {
button.accessibilityLabel = isSidebarVisible ? L10n.Accessibility.Pdf.sidebarClose : L10n.Accessibility.Pdf.sidebarOpen
button.title = isSidebarVisible ? L10n.Accessibility.Pdf.sidebarClose : L10n.Accessibility.Pdf.sidebarOpen
}
}

extension HtmlEpubReaderViewController: AnnotationToolbarHandlerDelegate {
var additionalToolbarInsets: NSDirectionalEdgeInsets {
let leading = isSidebarVisible ? documentLeft.constant : 0
return NSDirectionalEdgeInsets(top: documentTop.constant, leading: leading, bottom: 0, trailing: 0)
let leading = isSidebarVisible ? (documentControllerLeft?.constant ?? 0) : 0
return NSDirectionalEdgeInsets(top: documentControllerTop.constant, leading: leading, bottom: 0, trailing: 0)
}

var isNavigationBarHidden: Bool {
navigationController?.navigationBar.isHidden ?? false
}

var isSidebarHidden: Bool {
return !isSidebarVisible
}

var containerView: UIView {
return view
}

var documentView: UIView {
return view
}

var toolbarLeadingAnchor: NSLayoutXAxisAnchor {
return sidebarController.view.trailingAnchor
}

var toolbarLeadingSafeAreaAnchor: NSLayoutXAxisAnchor {
return view.safeAreaLayoutGuide.leadingAnchor
}

func layoutIfNeeded() {
view.layoutIfNeeded()
}
Expand All @@ -482,22 +402,23 @@ extension HtmlEpubReaderViewController: AnnotationToolbarHandlerDelegate {
}

func topDidChange(forToolbarState state: AnnotationToolbarHandler.State) {
guard let annotationToolbarHandler, let annotationToolbarController else { return }
let (statusBarOffset, _, totalOffset) = annotationToolbarHandler.topOffsets(statusBarVisible: statusBarVisible)

if !state.visible {
documentTop.constant = totalOffset
documentControllerTop.constant = totalOffset
return
}

switch state.position {
case .pinned:
documentTop.constant = statusBarOffset + annotationToolbarController.size
documentControllerTop.constant = statusBarOffset + annotationToolbarController.size

case .top:
documentTop.constant = totalOffset + annotationToolbarController.size
documentControllerTop.constant = totalOffset + annotationToolbarController.size

case .trailing, .leading:
documentTop.constant = totalOffset
documentControllerTop.constant = totalOffset
}
}

Expand Down Expand Up @@ -549,7 +470,7 @@ extension HtmlEpubReaderViewController: AnnotationToolbarDelegate {

func closeAnnotationToolbar() {
(toolbarButton.customView as? CheckboxButton)?.isSelected = false
annotationToolbarHandler.set(hidden: true, animated: true)
annotationToolbarHandler?.set(hidden: true, animated: true)
}

func performUndo() {
Expand Down
Loading

0 comments on commit a2b9e72

Please sign in to comment.