Skip to content

Commit 8327f0b

Browse files
authored
Add offsetFirstPage preference for fixed-layout EPUBs (#697)
1 parent 80b581e commit 8327f0b

File tree

13 files changed

+291
-150
lines changed

13 files changed

+291
-150
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. Take a look
1010

1111
* Support for displaying Divina (image-based publications like CBZ) in the fixed-layout EPUB navigator.
1212
* Bitmap images in the EPUB reading order are now supported as a fixed layout resource.
13+
* Added `offsetFirstPage` preference for fixed-layout EPUBs to control whether the first page is displayed alone or alongside the second page when spreads are enabled.
1314

1415
#### Streamer
1516

Sources/Navigator/EPUB/EPUBFixedSpreadView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ final class EPUBFixedSpreadView: EPUBSpreadView {
4747
scrollView.backgroundColor = UIColor.clear
4848

4949
// Loads the wrapper page into the web view.
50-
let spreadFile = "fxl-spread-\(spread.spread ? "two" : "one")"
50+
let spreadFile = "fxl-spread-\(viewModel.spreadEnabled ? "two" : "one")"
5151
if
5252
let wrapperPageURL = Bundle.module.url(forResource: spreadFile, withExtension: "html", subdirectory: "Assets"),
5353
var wrapperPage = try? String(contentsOf: wrapperPageURL, encoding: .utf8)
@@ -107,7 +107,7 @@ final class EPUBFixedSpreadView: EPUBSpreadView {
107107
// to be executed before the spread is loaded.
108108
let spreadJSON = spread.jsonString(
109109
forBaseURL: viewModel.publicationBaseURL,
110-
readingOrder: viewModel.readingOrder
110+
readingProgression: viewModel.readingProgression
111111
)
112112
webView.evaluateJavaScript("spread.load(\(spreadJSON));")
113113
}

Sources/Navigator/EPUB/EPUBNavigatorViewController.swift

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ open class EPUBNavigatorViewController: InputObservableViewController,
399399

400400
if needsReloadSpreadsOnActive {
401401
needsReloadSpreadsOnActive = false
402-
reloadSpreads(force: true)
402+
reloadSpreads()
403403
}
404404
}
405405

@@ -420,7 +420,7 @@ open class EPUBNavigatorViewController: InputObservableViewController,
420420

421421
applySettings()
422422

423-
_reloadSpreads(force: true)
423+
_reloadSpreads()
424424

425425
onInitializedCallbacks.complete()
426426
}
@@ -556,7 +556,7 @@ open class EPUBNavigatorViewController: InputObservableViewController,
556556
}
557557

558558
paginationView.isScrollEnabled = isPaginationViewScrollingEnabled
559-
reloadSpreads(force: true)
559+
reloadSpreads()
560560
}
561561

562562
private var spreads: [EPUBSpread] = []
@@ -568,7 +568,7 @@ open class EPUBNavigatorViewController: InputObservableViewController,
568568

569569
private var needsReloadSpreadsOnActive = false
570570

571-
private func reloadSpreads(force: Bool) {
571+
private func reloadSpreads() {
572572
guard
573573
state != .initializing,
574574
isViewLoaded
@@ -585,16 +585,14 @@ open class EPUBNavigatorViewController: InputObservableViewController,
585585
return
586586
}
587587

588-
_reloadSpreads(force: force)
588+
_reloadSpreads()
589589
}
590590

591-
private func _reloadSpreads(force: Bool) {
591+
private func _reloadSpreads() {
592592
let locator = currentLocation
593593

594594
guard
595595
let paginationView = paginationView,
596-
// Already loaded with the expected amount of spreads?
597-
force || spreads.first?.spread != viewModel.spreadEnabled,
598596
on(.load(locator))
599597
else {
600598
return
@@ -604,7 +602,8 @@ open class EPUBNavigatorViewController: InputObservableViewController,
604602
for: publication,
605603
readingOrder: readingOrder,
606604
readingProgression: viewModel.readingProgression,
607-
spread: viewModel.spreadEnabled
605+
spread: viewModel.spreadEnabled,
606+
offsetFirstPage: viewModel.offsetFirstPage
608607
)
609608

610609
let initialIndex: ReadingOrder.Index = {
@@ -1256,7 +1255,7 @@ extension EPUBNavigatorViewController: EPUBSpreadViewDelegate {
12561255
}
12571256

12581257
func spreadViewDidTerminate() {
1259-
reloadSpreads(force: true)
1258+
reloadSpreads()
12601259
}
12611260
}
12621261

Sources/Navigator/EPUB/EPUBNavigatorViewModel.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ final class EPUBNavigatorViewModel: Loggable {
225225
|| oldSettings.scroll != newSettings.scroll
226226
|| oldSettings.spread != newSettings.spread
227227
|| oldSettings.fit != newSettings.fit
228+
|| oldSettings.offsetFirstPage != newSettings.offsetFirstPage
228229

229230
// We don't commit the CSS changes if we invalidate the pagination, as
230231
// the resources will be reloaded anyway.
@@ -248,6 +249,7 @@ final class EPUBNavigatorViewModel: Loggable {
248249
var scroll: Bool { settings.scroll }
249250
var verticalText: Bool { settings.verticalText }
250251
var spread: Spread { settings.spread }
252+
var offsetFirstPage: Bool? { settings.offsetFirstPage }
251253

252254
// MARK: Spread
253255

Sources/Navigator/EPUB/EPUBReflowableSpreadView.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ final class EPUBReflowableSpreadView: EPUBSpreadView {
8181
log(.error, "Only one document at a time can be displayed in a reflowable spread")
8282
return
8383
}
84-
let link = viewModel.readingOrder[spread.leading]
85-
let url = viewModel.url(to: link)
84+
let url = viewModel.url(to: spread.first.link)
8685
webView.load(URLRequest(url: url.url))
8786
}
8887

@@ -135,7 +134,7 @@ final class EPUBReflowableSpreadView: EPUBSpreadView {
135134

136135
override func progression(in index: ReadingOrder.Index) -> ClosedRange<Double> {
137136
guard
138-
spread.leading == index,
137+
spread.first.index == index,
139138
let progression = progression
140139
else {
141140
return 0 ... 0
@@ -144,10 +143,8 @@ final class EPUBReflowableSpreadView: EPUBSpreadView {
144143
}
145144

146145
override func spreadDidLoad() async {
147-
if
148-
let link = viewModel.readingOrder.getOrNil(spread.leading),
149-
let linkJSON = serializeJSONString(link.json)
150-
{
146+
let link = spread.first.link
147+
if let linkJSON = serializeJSONString(link.json) {
151148
await evaluateScript("readium.link = \(linkJSON);")
152149
}
153150

0 commit comments

Comments
 (0)