bonus chapters?

This commit is contained in:
2025-12-29 15:40:58 +01:00
parent ef6d3d32ed
commit 06c6539e26

View File

@@ -3,6 +3,9 @@
//TODO: Properly avoid swallowing of input from UICollectionView used for scrolling
//TODO: Convert between state for normal and scrolling page turn
//TODO: Support reading with scrolling and landscape mode
//TODO: Support Cover being zeroth page.
//TODO: Support double pages.
//TODO: Do file name parsing.
//FIXME: Update comicCollectionView when switching between landscape and portrait mode
import UIKit
@@ -81,7 +84,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
var mode = PageTurnMode.leftToRight
var metadata: Metadata!
var currentPage: Int! = nil
var currentChapter: Int! = nil
var currentChapterIndex: Int! = nil
var currentPath: URL!
var changedOrientation = false
@@ -220,7 +223,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
func saveGlobalState() {
do {
try JSONEncoder().encode(self.globalState).write(
try JSONEncoder().encode(globalState).write(
to: documentsURL.appendingPathComponent("state.json"))
} catch {
print("failed to save global state")
@@ -257,11 +260,11 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
scrollOffset.y *= (screenSize.height / screenSize.width)
}
let progress: ReadProgress =
switch self.mode {
switch mode {
case .leftToRight:
ReadProgress.leftToRight(chapter: currentChapter, page: currentPage)
ReadProgress.leftToRight(chapter: currentChapterIndex, page: currentPage)
case .rightToLeft:
ReadProgress.rightToLeft(chapter: currentChapter, page: currentPage)
ReadProgress.rightToLeft(chapter: currentChapterIndex, page: currentPage)
case .scroll: ReadProgress.scroll(scrollOffset)
}
queue.async {
@@ -287,11 +290,11 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
let local = try JSONDecoder().decode(LocalState.self, from: json)
switch local.progress {
case .leftToRight(let chapter, let page):
currentChapter = chapter
currentChapterIndex = chapter
currentPage = page
mode = .leftToRight
case .rightToLeft(let chapter, let page):
currentChapter = chapter
currentChapterIndex = chapter
currentPage = page
mode = .rightToLeft
case .scroll(let point):
@@ -304,12 +307,12 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
}
if let indexPath = scrollingCollectionView.indexPathForItem(at: scrollOffset) {
let (chapter, page) = chapterAndPages[indexPath.item]
currentChapter = chapter
currentChapterIndex = chapter
currentPage = page
}
}
self.mode = .scroll
mode = .scroll
}
readerView.backgroundColor = convertStringToColor(str: local.backgroundColor)
} catch {
@@ -337,7 +340,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
if let indexPath = scrollingCollectionView.indexPathForItem(at: centerPoint) {
let (chapter, page) = chapterAndPages[indexPath.item]
currentChapter = chapter
currentChapterIndex = chapter
currentPage = page
}
if scrollingCollectionView.isHidden == false {
@@ -750,8 +753,8 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
} else {
imageLoader.loadImage(
at: getImagePath(
chapter: currentChapter,
volume: Int(metadata.chapters[currentChapter - 1].volume),
chapter: metadata.chapters[currentChapterIndex].chapter,
volume: metadata.chapters[currentChapterIndex].volume,
page: currentPage,
path: currentPath),
scaling: .scaleAspectFit
@@ -885,12 +888,14 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
func changeImage(turn: PageTurn) {
let scaling = UIView.ContentMode.scaleAspectFit
var (chapter, page) = getChapterAndPageFromTurn(
chapter: currentChapter, page: currentPage, turn: turn)
if (chapter, page) == (currentChapter, currentPage) { return }
var vol = Int(metadata.chapters[chapter - 1].volume)
chapter: currentChapterIndex, page: currentPage, turn: turn)
if (chapter, page) == (currentChapterIndex, currentPage) { return }
var vol = metadata.chapters[chapter].volume
currentPage = page
currentChapter = chapter
if let path = getImagePath(chapter: chapter, volume: vol, page: page, path: currentPath) {
currentChapterIndex = chapter
if let path = getImagePath(
chapter: metadata.chapters[chapter].chapter, volume: vol, page: page, path: currentPath)
{
imageLoader.loadImage(at: path, scaling: scaling) { [weak self] image in
self?.imageView.image = image
self?.updateInfo()
@@ -902,9 +907,10 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
for _ in 0...preloadCount {
(chapter, page) = getChapterAndPageFromTurn(
chapter: chapter, page: page, turn: .next)
vol = Int(metadata.chapters[chapter - 1].volume)
vol = metadata.chapters[chapter].volume
if let path = getImagePath(
chapter: chapter, volume: vol, page: page, path: currentPath)
chapter: metadata.chapters[chapter].chapter, volume: vol, page: page,
path: currentPath)
{
imageLoader.preloadImage(at: path, scaling: scaling)
} else {
@@ -917,23 +923,29 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
func updateInfo() {
if metadata == nil { return }
if currentChapter == nil || currentPage == nil { return }
if currentChapterIndex == nil || currentPage == nil { return }
var text = "\(metadata.title)\n"
if let chapterTitle = metadata.chapters[currentChapter - 1].title {
if let chapterTitle = metadata.chapters[currentChapterIndex].title {
text +=
"\(chapterTitle)\n"
}
let chapterValue = metadata.chapters[currentChapterIndex].chapter
let chapterString =
chapterValue.truncatingRemainder(dividingBy: 1) == 0
? String(Int(chapterValue))
: String(chapterValue)
text +=
"""
Volume \(Int(metadata.chapters[currentChapter - 1].volume)) of \(Int(metadata.last_volume))
Chapter \(currentChapter!) of \(Int(metadata.last_chapter))
Page \(currentPage!) of \(metadata.chapters[currentChapter - 1].pages)
Volume \(Int(metadata.chapters[currentChapterIndex].volume)) of \(Int(metadata.last_volume))
Chapter \(chapterString) of \(Int(metadata.last_chapter))
Page \(currentPage!) of \(metadata.chapters[currentChapterIndex].pages)
"""
if let size = imageLoader.size[
getImagePath(
chapter: currentChapter, volume: Int(metadata.chapters[currentChapter - 1].volume),
chapter: metadata.chapters[currentChapterIndex].chapter,
volume: metadata.chapters[currentChapterIndex].volume,
page: currentPage,
path: currentPath
).path]
@@ -943,9 +955,24 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
info.text = text
}
func getImagePath(chapter: Int, volume: Int, page: Int, path: URL) -> URL! {
let modernPath = path.appendingPathComponent(String(format: "volume_%04d", volume))
.appendingPathComponent(String(format: "chapter_%04d_page_%04d.png", chapter, page))
func formatNumber(_ value: Float) -> String {
let integerPart = Int(value)
let fractionalPart = value - Float(integerPart)
if fractionalPart == 0 {
return String(format: "%04d", integerPart)
} else {
// Convert fractional part to string without leading "0"
let fractionalString = String(String(value).split(separator: ".")[1])
return String(format: "%04d.%@", integerPart, fractionalString)
}
}
func getImagePath(chapter: Float, volume: Float, page: Int, path: URL) -> URL! {
let modernPath = path.appendingPathComponent(String(format: "volume_%04d", Int(volume)))
.appendingPathComponent(
String(format: "chapter_\(formatNumber(chapter))_page_%04d.png", page))
print("trying to get path \(modernPath)")
// if fileManager.fileExists(atPath: modernPath.path) {
return modernPath
// }
@@ -956,20 +983,20 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
switch turn {
case .next:
if metadata.chapters.count >= chapter + 1 {
if page + 1 > metadata.chapters[chapter - 1].pages {
if page + 1 > metadata.chapters[chapter].pages {
return (chapter + 1, 1)
} else {
return (chapter, page + 1)
}
} else {
return (chapter, min(metadata.chapters[chapter - 1].pages, page + 1))
return (chapter, min(metadata.chapters[chapter].pages, page + 1))
}
case .previous:
if page < 2 {
if chapter > 1 {
if chapter > 0 {
return (
chapter - 1,
metadata.chapters[chapter - 2].pages
metadata.chapters[chapter - 1].pages
)
} else {
return (chapter, page)
@@ -1000,11 +1027,12 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
.scaleAspectFill
} else { .scaleAspectFit }
var directories: [URL] = []
if currentPage != nil && currentChapter != nil {
var vol = Int(metadata.chapters[currentChapter - 1].volume)
if currentPage != nil && currentChapterIndex != nil {
var vol = metadata.chapters[currentChapterIndex].volume
imageLoader.loadImage(
at: getImagePath(
chapter: currentChapter, volume: vol, page: currentPage, path: currentPath
chapter: metadata.chapters[currentChapterIndex].chapter, volume: vol,
page: currentPage, path: currentPath
),
scaling: scaling
) { [weak self] image in
@@ -1013,11 +1041,12 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
}
var (chapter, page) = getChapterAndPageFromTurn(
chapter: currentChapter, page: currentPage, turn: .next)
chapter: currentChapterIndex, page: currentPage, turn: .next)
for _ in 0...preloadCount {
vol = Int(metadata.chapters[chapter - 1].volume)
vol = metadata.chapters[chapter].volume
if let path = getImagePath(
chapter: chapter, volume: vol, page: page, path: currentPath)
chapter: metadata.chapters[chapter].chapter, volume: vol, page: page,
path: currentPath)
{
imageLoader.preloadImage(at: path, scaling: scaling)
} else {
@@ -1049,7 +1078,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
let path_meta = current.lastPathComponent.components(separatedBy: "_")
assert(path_meta[0] == "chapter")
currentChapter = Int(path_meta[1])!
currentChapterIndex = Int(path_meta[1])! - 1
if path_meta[2] == "page" {
currentPage = Int(path_meta[3].components(separatedBy: ".")[0])
if currentPage == nil {
@@ -1078,12 +1107,12 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
) {
super.viewWillTransition(to: size, with: coordinator)
if mode != .scroll {
self.imageLoader.loadImage(
at: self.getImagePath(
chapter: self.currentChapter,
volume: Int(self.metadata.chapters[self.currentChapter - 1].volume),
page: self.currentPage,
path: self.currentPath),
imageLoader.loadImage(
at: getImagePath(
chapter: metadata.chapters[currentChapterIndex].chapter,
volume: metadata.chapters[currentChapterIndex].volume,
page: currentPage,
path: currentPath),
scaling: .scaleAspectFit
) { image in
self.imageView.image = image
@@ -1154,21 +1183,21 @@ extension ViewController: UICollectionViewDataSource, UICollectionViewDelegateFl
if metadata == nil {
return cell
}
var (chapter, page) = chapterAndPages[indexPath.item]
var (chapterIndex, page) = chapterAndPages[indexPath.item]
if let url = getImagePath(
chapter: chapter,
volume: Int(metadata.chapters[chapter - 1].volume),
chapter: metadata.chapters[chapterIndex].chapter,
volume: metadata.chapters[chapterIndex].volume,
page: page, path: currentPath)
{
imageLoader.loadImage(at: url, scaling: scaling) { image in
cell.imageView.image = image
}
for _ in 0...preloadCount {
(chapter, page) = getChapterAndPageFromTurn(
chapter: chapter, page: page, turn: .next)
(chapterIndex, page) = getChapterAndPageFromTurn(
chapter: chapterIndex, page: page, turn: .next)
if let url = getImagePath(
chapter: chapter,
volume: Int(metadata.chapters[chapter - 1].volume),
chapter: metadata.chapters[chapterIndex].chapter,
volume: metadata.chapters[chapterIndex].volume,
page: page, path: currentPath)
{
imageLoader.preloadImage(at: url, scaling: scaling)
@@ -1212,8 +1241,8 @@ extension ViewController: UICollectionViewDataSource, UICollectionViewDelegateFl
}
let (chapter, page) = chapterAndPages[indexPath.item]
if let imagePath = getImagePath(
chapter: chapter,
volume: Int(metadata.chapters[chapter - 1].volume),
chapter: metadata.chapters[chapter].chapter,
volume: metadata.chapters[chapter].volume,
page: page, path: currentPath),
let imageSource = CGImageSourceCreateWithURL(imagePath as CFURL, nil),
let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil)